summaryrefslogtreecommitdiffstats
path: root/languages
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit114a878c64ce6f8223cfd22d76a20eb16d177e5e (patch)
treeacaf47eb0fa12142d3896416a69e74cbf5a72242 /languages
downloadtdevelop-114a878c64ce6f8223cfd22d76a20eb16d177e5e.tar.gz
tdevelop-114a878c64ce6f8223cfd22d76a20eb16d177e5e.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdevelop@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'languages')
-rw-r--r--languages/Makefile.am74
-rw-r--r--languages/ada/AdaAST.hpp77
-rw-r--r--languages/ada/AdaLexer.cpp1507
-rw-r--r--languages/ada/AdaLexer.hpp86
-rw-r--r--languages/ada/AdaParser.cpp12283
-rw-r--r--languages/ada/AdaParser.hpp389
-rw-r--r--languages/ada/AdaStoreWalker.cpp9439
-rw-r--r--languages/ada/AdaStoreWalker.hpp350
-rw-r--r--languages/ada/AdaStoreWalkerTokenTypes.hpp307
-rw-r--r--languages/ada/AdaStoreWalkerTokenTypes.txt289
-rw-r--r--languages/ada/AdaTokenTypes.hpp306
-rw-r--r--languages/ada/AdaTokenTypes.txt288
-rw-r--r--languages/ada/AdaTreeParserSuper.cpp9050
-rw-r--r--languages/ada/AdaTreeParserSuper.hpp241
-rw-r--r--languages/ada/AdaTreeParserSuperTokenTypes.hpp307
-rw-r--r--languages/ada/AdaTreeParserSuperTokenTypes.txt289
-rw-r--r--languages/ada/Makefile.am41
-rw-r--r--languages/ada/README1
-rw-r--r--languages/ada/README.dox31
-rw-r--r--languages/ada/ada.g1982
-rw-r--r--languages/ada/ada.store.g610
-rw-r--r--languages/ada/ada.tree.g964
-rw-r--r--languages/ada/ada_utils.cpp69
-rw-r--r--languages/ada/ada_utils.hpp15
-rw-r--r--languages/ada/adasupport.cpp168
-rw-r--r--languages/ada/adasupport.hpp13
-rw-r--r--languages/ada/adasupportpart.cpp376
-rw-r--r--languages/ada/adasupportpart.h50
-rw-r--r--languages/ada/addclass.cpp351
-rw-r--r--languages/ada/addclass.h55
-rw-r--r--languages/ada/addclassdlg.ui434
-rw-r--r--languages/ada/app_templates/Makefile.am5
-rw-r--r--languages/ada/app_templates/ada.appwizard2
-rw-r--r--languages/ada/app_templates/adahello/.kdev_ignore0
-rw-r--r--languages/ada/app_templates/adahello/Makefile.am16
-rw-r--r--languages/ada/app_templates/adahello/ada-Makefile2
-rw-r--r--languages/ada/app_templates/adahello/ada-Makefile.am5
-rw-r--r--languages/ada/app_templates/adahello/ada-Makefile.cvs8
-rw-r--r--languages/ada/app_templates/adahello/adahello10
-rw-r--r--languages/ada/app_templates/adahello/adahello.kdevtemplate132
-rw-r--r--languages/ada/app_templates/adahello/adahello.pngbin0 -> 10118 bytes
-rw-r--r--languages/ada/app_templates/adahello/app.kdevelop84
-rw-r--r--languages/ada/app_templates/adahello/app.kdevelop.filelist1
-rw-r--r--languages/ada/app_templates/adahello/configure.in10
-rw-r--r--languages/ada/app_templates/adahello/main.adb8
-rw-r--r--languages/ada/app_templates/adahello/src-Makefile.am8
-rw-r--r--languages/ada/backgroundparser.cpp77
-rw-r--r--languages/ada/backgroundparser.h37
-rw-r--r--languages/ada/configproblemreporter.ui89
-rw-r--r--languages/ada/configproblemreporter.ui.h39
-rw-r--r--languages/ada/configure.in.in4
-rw-r--r--languages/ada/doc/Makefile.am6
-rw-r--r--languages/ada/doc/ada.toc130
-rw-r--r--languages/ada/doc/ada_bugs_gcc.toc7
-rw-r--r--languages/ada/file_templates/Makefile.am3
-rw-r--r--languages/ada/file_templates/adb12
-rw-r--r--languages/ada/file_templates/ads12
-rw-r--r--languages/ada/kdevadasupport.desktop87
-rw-r--r--languages/ada/kdevadasupport.rc11
-rw-r--r--languages/ada/preambles.h89
-rw-r--r--languages/ada/problemreporter.cpp282
-rw-r--r--languages/ada/problemreporter.h79
-rw-r--r--languages/bash/Makefile.am20
-rw-r--r--languages/bash/README.dox15
-rw-r--r--languages/bash/app_templates/Makefile.am3
-rw-r--r--languages/bash/app_templates/bash.appwizard2
-rw-r--r--languages/bash/app_templates/bashhello/.kdev_ignore0
-rw-r--r--languages/bash/app_templates/bashhello/Makefile.am16
-rw-r--r--languages/bash/app_templates/bashhello/app.kdevelop82
-rw-r--r--languages/bash/app_templates/bashhello/app.sh17
-rw-r--r--languages/bash/app_templates/bashhello/bashhello10
-rw-r--r--languages/bash/app_templates/bashhello/bashhello.kdevtemplate111
-rw-r--r--languages/bash/app_templates/bashhello/bashhello.pngbin0 -> 483 bytes
-rw-r--r--languages/bash/bashsupport_part.cpp442
-rw-r--r--languages/bash/bashsupport_part.h81
-rw-r--r--languages/bash/doc/Makefile.am6
-rw-r--r--languages/bash/doc/bash.toc80
-rw-r--r--languages/bash/doc/bash_bugs.toc7
-rw-r--r--languages/bash/kdevbashsupport.desktop85
-rw-r--r--languages/bash/kdevbashsupport.rc11
-rw-r--r--languages/cpp/KDevCppSupportIface.cpp24
-rw-r--r--languages/cpp/KDevCppSupportIface.h27
-rw-r--r--languages/cpp/Makefile.am59
-rw-r--r--languages/cpp/README.dox34
-rw-r--r--languages/cpp/addattributedialog.cpp265
-rw-r--r--languages/cpp/addattributedialog.h60
-rw-r--r--languages/cpp/addattributedialogbase.ui375
-rw-r--r--languages/cpp/addmethoddialog.cpp420
-rw-r--r--languages/cpp/addmethoddialog.h62
-rw-r--r--languages/cpp/addmethoddialogbase.ui459
-rw-r--r--languages/cpp/app_templates/Makefile.am10
-rw-r--r--languages/cpp/app_templates/automakeempty/Makefile.am17
-rw-r--r--languages/cpp/app_templates/automakeempty/app.kdevelop101
-rw-r--r--languages/cpp/app_templates/automakeempty/automakeempty-Makefile.am1
-rw-r--r--languages/cpp/app_templates/automakeempty/automakeempty-Makefile.cvs8
-rw-r--r--languages/cpp/app_templates/automakeempty/automakeempty.kdevtemplate99
-rw-r--r--languages/cpp/app_templates/automakeempty/automakeempty.pngbin0 -> 8621 bytes
-rw-r--r--languages/cpp/app_templates/automakeempty/configure.in10
-rw-r--r--languages/cpp/app_templates/c.appwizard2
-rw-r--r--languages/cpp/app_templates/chello/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/chello/Makefile.am18
-rw-r--r--languages/cpp/app_templates/chello/app.kdevelop107
-rw-r--r--languages/cpp/app_templates/chello/c-Makefile.am5
-rw-r--r--languages/cpp/app_templates/chello/c-Makefile.cvs8
-rw-r--r--languages/cpp/app_templates/chello/chello.kdevtemplate253
-rw-r--r--languages/cpp/app_templates/chello/chello.pngbin0 -> 10118 bytes
-rw-r--r--languages/cpp/app_templates/chello/configure.in10
-rw-r--r--languages/cpp/app_templates/chello/main.c15
-rw-r--r--languages/cpp/app_templates/chello/src-Makefile.am8
-rw-r--r--languages/cpp/app_templates/chello_gba/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/chello_gba/Makefile.am18
-rw-r--r--languages/cpp/app_templates/chello_gba/README.devel30
-rw-r--r--languages/cpp/app_templates/chello_gba/app.kdevelop100
-rw-r--r--languages/cpp/app_templates/chello_gba/c-Makefile.am5
-rw-r--r--languages/cpp/app_templates/chello_gba/c-Makefile.cvs8
-rw-r--r--languages/cpp/app_templates/chello_gba/chellogba.kdevtemplate173
-rw-r--r--languages/cpp/app_templates/chello_gba/chellogba.pngbin0 -> 5041 bytes
-rw-r--r--languages/cpp/app_templates/chello_gba/configure.in10
-rw-r--r--languages/cpp/app_templates/chello_gba/font.bmpbin0 -> 1026 bytes
-rw-r--r--languages/cpp/app_templates/chello_gba/font.raw.c123
-rw-r--r--languages/cpp/app_templates/chello_gba/gba.h204
-rw-r--r--languages/cpp/app_templates/chello_gba/main.c50
-rw-r--r--languages/cpp/app_templates/chello_gba/main.h12
-rw-r--r--languages/cpp/app_templates/chello_gba/master.pal.c35
-rw-r--r--languages/cpp/app_templates/chello_gba/src-Makefile.am13
-rw-r--r--languages/cpp/app_templates/clanlib/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/clanlib/Makefile.am17
-rw-r--r--languages/cpp/app_templates/clanlib/app-Makefile.am1
-rw-r--r--languages/cpp/app_templates/clanlib/app-autogen.sh2
-rw-r--r--languages/cpp/app_templates/clanlib/app-configure.in22
-rw-r--r--languages/cpp/app_templates/clanlib/app.kdevelop106
-rw-r--r--languages/cpp/app_templates/clanlib/clanlib.kdevtemplate138
-rw-r--r--languages/cpp/app_templates/clanlib/clanlib.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/clanlib/main.cpp29
-rw-r--r--languages/cpp/app_templates/clanlib/src-Makefile.am4
-rw-r--r--languages/cpp/app_templates/cmakelibc/CMakeLists.txt7
-rw-r--r--languages/cpp/app_templates/cmakelibc/CMakeLists.txt.src19
-rw-r--r--languages/cpp/app_templates/cmakelibc/Makefile.am16
-rw-r--r--languages/cpp/app_templates/cmakelibc/cmakelibc7
-rw-r--r--languages/cpp/app_templates/cmakelibc/cmakelibc.kdevtemplate139
-rw-r--r--languages/cpp/app_templates/cmakelibc/cmakelibc.pngbin0 -> 10060 bytes
-rw-r--r--languages/cpp/app_templates/cmakelibc/lib.c13
-rw-r--r--languages/cpp/app_templates/cmakelibc/lib.h7
-rw-r--r--languages/cpp/app_templates/cmakelibc/test.c8
-rw-r--r--languages/cpp/app_templates/cmakelibcpp/CMakeLists.txt8
-rw-r--r--languages/cpp/app_templates/cmakelibcpp/CMakeLists.txt.src19
-rw-r--r--languages/cpp/app_templates/cmakelibcpp/Makefile.am16
-rw-r--r--languages/cpp/app_templates/cmakelibcpp/cmakelibcpp7
-rw-r--r--languages/cpp/app_templates/cmakelibcpp/cmakelibcpp.kdevtemplate139
-rw-r--r--languages/cpp/app_templates/cmakelibcpp/cmakelibcpp.pngbin0 -> 10060 bytes
-rw-r--r--languages/cpp/app_templates/cmakelibcpp/lib.cpp17
-rw-r--r--languages/cpp/app_templates/cmakelibcpp/lib.h12
-rw-r--r--languages/cpp/app_templates/cmakelibcpp/test.cpp9
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/CMakeLists.txt14
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/CMakeLists.txt.src28
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/Makefile.am18
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/cmakeqt3app8
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.cpp283
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.h39
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.kdevtemplate126
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.pngbin0 -> 5034 bytes
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/fileopen.xpm22
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/fileprint.xpm24
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/filesave.xpm22
-rw-r--r--languages/cpp/app_templates/cmakeqt3app/main.cpp13
-rw-r--r--languages/cpp/app_templates/cmakesimple/CMakeLists.txt15
-rw-r--r--languages/cpp/app_templates/cmakesimple/Makefile.am16
-rw-r--r--languages/cpp/app_templates/cmakesimple/README30
-rw-r--r--languages/cpp/app_templates/cmakesimple/cmakesimple7
-rw-r--r--languages/cpp/app_templates/cmakesimple/cmakesimple.kdevtemplate112
-rw-r--r--languages/cpp/app_templates/cmakesimple/cmakesimple.pngbin0 -> 12197 bytes
-rw-r--r--languages/cpp/app_templates/cmakesimple/main.cpp14
-rw-r--r--languages/cpp/app_templates/cmakesimplec/CMakeLists.txt14
-rw-r--r--languages/cpp/app_templates/cmakesimplec/Makefile.am16
-rw-r--r--languages/cpp/app_templates/cmakesimplec/cmakesimplec7
-rw-r--r--languages/cpp/app_templates/cmakesimplec/cmakesimplec.kdevtemplate115
-rw-r--r--languages/cpp/app_templates/cmakesimplec/cmakesimplec.pngbin0 -> 10060 bytes
-rw-r--r--languages/cpp/app_templates/cmakesimplec/main.c14
-rw-r--r--languages/cpp/app_templates/cpp.appwizard2
-rw-r--r--languages/cpp/app_templates/cppcurseshello/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/cppcurseshello/Makefile.am17
-rw-r--r--languages/cpp/app_templates/cppcurseshello/app-configure.in21
-rw-r--r--languages/cpp/app_templates/cppcurseshello/app.kdevelop105
-rw-r--r--languages/cpp/app_templates/cppcurseshello/cpp-Makefile.am5
-rw-r--r--languages/cpp/app_templates/cppcurseshello/cpp-Makefile.cvs7
-rw-r--r--languages/cpp/app_templates/cppcurseshello/cppcurseshello10
-rw-r--r--languages/cpp/app_templates/cppcurseshello/cppcurseshello.kdevtemplate143
-rw-r--r--languages/cpp/app_templates/cppcurseshello/cppcurseshello.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/cppcurseshello/main.cpp49
-rw-r--r--languages/cpp/app_templates/cppcurseshello/src-Makefile.am8
-rw-r--r--languages/cpp/app_templates/cpphello/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/cpphello/Makefile.am17
-rw-r--r--languages/cpp/app_templates/cpphello/app.kdevelop105
-rw-r--r--languages/cpp/app_templates/cpphello/configure.in10
-rw-r--r--languages/cpp/app_templates/cpphello/cpp-Makefile.am5
-rw-r--r--languages/cpp/app_templates/cpphello/cpp-Makefile.cvs8
-rw-r--r--languages/cpp/app_templates/cpphello/cpphello.kdevtemplate145
-rw-r--r--languages/cpp/app_templates/cpphello/cpphello.pngbin0 -> 8621 bytes
-rw-r--r--languages/cpp/app_templates/cpphello/main.cpp17
-rw-r--r--languages/cpp/app_templates/cpphello/src-Makefile.am8
-rw-r--r--languages/cpp/app_templates/cppsdlhello/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/cppsdlhello/Makefile.am16
-rw-r--r--languages/cpp/app_templates/cppsdlhello/README11
-rw-r--r--languages/cpp/app_templates/cppsdlhello/acinclude.m4167
-rw-r--r--languages/cpp/app_templates/cppsdlhello/app.kdevelop103
-rw-r--r--languages/cpp/app_templates/cppsdlhello/configure.in90
-rw-r--r--languages/cpp/app_templates/cppsdlhello/cpp-Makefile.am5
-rw-r--r--languages/cpp/app_templates/cppsdlhello/cpp-Makefile.cvs8
-rw-r--r--languages/cpp/app_templates/cppsdlhello/cppsdlhello10
-rw-r--r--languages/cpp/app_templates/cppsdlhello/cppsdlhello.kdevtemplate150
-rw-r--r--languages/cpp/app_templates/cppsdlhello/cppsdlhello.pngbin0 -> 10118 bytes
-rw-r--r--languages/cpp/app_templates/cppsdlhello/main.cpp29
-rw-r--r--languages/cpp/app_templates/cppsdlhello/src-Makefile.am9
-rw-r--r--languages/cpp/app_templates/dcopservice/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/dcopservice/Makefile.am18
-rw-r--r--languages/cpp/app_templates/dcopservice/dcopservice10
-rw-r--r--languages/cpp/app_templates/dcopservice/dcopservice.cpp49
-rw-r--r--languages/cpp/app_templates/dcopservice/dcopservice.desktop43
-rw-r--r--languages/cpp/app_templates/dcopservice/dcopservice.h35
-rw-r--r--languages/cpp/app_templates/dcopservice/dcopservice.kdevelop109
-rw-r--r--languages/cpp/app_templates/dcopservice/dcopservice.kdevtemplate202
-rw-r--r--languages/cpp/app_templates/dcopservice/dcopservice.pngbin0 -> 23880 bytes
-rw-r--r--languages/cpp/app_templates/dcopservice/main.cpp47
-rw-r--r--languages/cpp/app_templates/dcopservice/src-Makefile.am17
-rw-r--r--languages/cpp/app_templates/dcopservice/subdirs3
-rw-r--r--languages/cpp/app_templates/generichello/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/generichello/Makefile.am19
-rw-r--r--languages/cpp/app_templates/generichello/app.kdevelop61
-rw-r--r--languages/cpp/app_templates/generichello/app.prj8
-rw-r--r--languages/cpp/app_templates/generichello/cpphello.pngbin0 -> 10118 bytes
-rw-r--r--languages/cpp/app_templates/generichello/generichello.kdevtemplate92
-rw-r--r--languages/cpp/app_templates/generichello/main.cpp17
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/Makefile.am21
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/acconfig.h23
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/app-Makefile.am4
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/app.kdevelop69
-rwxr-xr-xlanguages/cpp/app_templates/gnome2mmapp/autogen.sh40
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/config.h0
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/configure.in57
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/gnome2mm.cc22
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/gnome2mm.glade24
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/gnome2mm.gladep8
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/gnome2mmapp8
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/gnome2mmapp.kdevtemplate186
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/gnome2mmapp.pngbin0 -> 2750 bytes
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/main_window.cc16
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/main_window.hh19
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/main_window_glade.cc30
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/main_window_glade.hh49
-rw-r--r--languages/cpp/app_templates/gnome2mmapp/src-Makefile.am14
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/Makefile.am21
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/acconfig.h10
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/app-Makefile.am4
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/app.kdevelop113
-rwxr-xr-xlanguages/cpp/app_templates/gtk2mmapp/autogen.sh33
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/config.h0
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/configure.in19
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/gtk2mm.cc15
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/gtk2mm.glade30
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/gtk2mm.gladep10
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/gtk2mmapp.kdevtemplate174
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/gtk2mmapp.pngbin0 -> 2750 bytes
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/main_window.cc12
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/main_window.hh19
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/main_window_glade.cc40
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/main_window_glade.hh48
-rw-r--r--languages/cpp/app_templates/gtk2mmapp/src-Makefile.am14
-rw-r--r--languages/cpp/app_templates/kapp/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kapp/Makefile.am19
-rw-r--r--languages/cpp/app_templates/kapp/README81
-rw-r--r--languages/cpp/app_templates/kapp/app.cpp247
-rw-r--r--languages/cpp/app_templates/kapp/app.desktop44
-rw-r--r--languages/cpp/app_templates/kapp/app.h89
-rw-r--r--languages/cpp/app_templates/kapp/app.kdevelop168
-rw-r--r--languages/cpp/app_templates/kapp/app.kdevses13
-rw-r--r--languages/cpp/app_templates/kapp/app_client.cpp26
-rw-r--r--languages/cpp/app_templates/kapp/appiface.h17
-rw-r--r--languages/cpp/app_templates/kapp/appui.rc8
-rw-r--r--languages/cpp/app_templates/kapp/appview.cpp107
-rw-r--r--languages/cpp/app_templates/kapp/appview.h77
-rw-r--r--languages/cpp/app_templates/kapp/kapp.kdevtemplate253
-rw-r--r--languages/cpp/app_templates/kapp/kapp.pngbin0 -> 6320 bytes
-rw-r--r--languages/cpp/app_templates/kapp/main.cpp61
-rw-r--r--languages/cpp/app_templates/kapp/pref.cpp42
-rw-r--r--languages/cpp/app_templates/kapp/pref.h37
-rw-r--r--languages/cpp/app_templates/kapp/src-Makefile.am43
-rw-r--r--languages/cpp/app_templates/kapp/subdirs3
-rw-r--r--languages/cpp/app_templates/kateplugin/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kateplugin/Makefile.am19
-rw-r--r--languages/cpp/app_templates/kateplugin/hi16-action-plugin.pngbin0 -> 292 bytes
-rw-r--r--languages/cpp/app_templates/kateplugin/hi22-action-plugin.pngbin0 -> 1151 bytes
-rw-r--r--languages/cpp/app_templates/kateplugin/kateplugin.kdevtemplate213
-rw-r--r--languages/cpp/app_templates/kateplugin/kateplugin.pngbin0 -> 12901 bytes
-rw-r--r--languages/cpp/app_templates/kateplugin/plugin.desktop76
-rw-r--r--languages/cpp/app_templates/kateplugin/plugin.kdevelop113
-rw-r--r--languages/cpp/app_templates/kateplugin/plugin_app.cpp89
-rw-r--r--languages/cpp/app_templates/kateplugin/plugin_app.h49
-rw-r--r--languages/cpp/app_templates/kateplugin/plugin_app.rc11
-rw-r--r--languages/cpp/app_templates/kateplugin/src-Makefile.am20
-rw-r--r--languages/cpp/app_templates/kateplugin/subdirs3
-rw-r--r--languages/cpp/app_templates/kateplugin2/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kateplugin2/Makefile.am19
-rw-r--r--languages/cpp/app_templates/kateplugin2/hi16-action-plugin.pngbin0 -> 292 bytes
-rw-r--r--languages/cpp/app_templates/kateplugin2/hi22-action-plugin.pngbin0 -> 1151 bytes
-rw-r--r--languages/cpp/app_templates/kateplugin2/kateplugin2.kdevtemplate214
-rw-r--r--languages/cpp/app_templates/kateplugin2/kateplugin2.pngbin0 -> 12901 bytes
-rw-r--r--languages/cpp/app_templates/kateplugin2/plugin.desktop76
-rw-r--r--languages/cpp/app_templates/kateplugin2/plugin.kdevelop114
-rw-r--r--languages/cpp/app_templates/kateplugin2/plugin_app.cpp140
-rw-r--r--languages/cpp/app_templates/kateplugin2/plugin_app.h91
-rw-r--r--languages/cpp/app_templates/kateplugin2/plugin_app.rc11
-rw-r--r--languages/cpp/app_templates/kateplugin2/src-Makefile.am21
-rw-r--r--languages/cpp/app_templates/kateplugin2/subdirs3
-rw-r--r--languages/cpp/app_templates/kcmodule/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kcmodule/Makefile.am17
-rw-r--r--languages/cpp/app_templates/kcmodule/kcmodule.kdevtemplate197
-rw-r--r--languages/cpp/app_templates/kcmodule/kcmodule.pngbin0 -> 16691 bytes
-rw-r--r--languages/cpp/app_templates/kcmodule/module.cpp66
-rw-r--r--languages/cpp/app_templates/kcmodule/module.desktop81
-rw-r--r--languages/cpp/app_templates/kcmodule/module.h32
-rw-r--r--languages/cpp/app_templates/kcmodule/module.kdevelop113
-rw-r--r--languages/cpp/app_templates/kcmodule/src-Makefile.am17
-rw-r--r--languages/cpp/app_templates/kcmodule/subdirs3
-rw-r--r--languages/cpp/app_templates/kconfig35/Makefile.am19
-rw-r--r--languages/cpp/app_templates/kconfig35/README90
-rw-r--r--languages/cpp/app_templates/kconfig35/app.cpp105
-rw-r--r--languages/cpp/app_templates/kconfig35/app.desktop40
-rw-r--r--languages/cpp/app_templates/kconfig35/app.h60
-rw-r--r--languages/cpp/app_templates/kconfig35/app.kcfg21
-rw-r--r--languages/cpp/app_templates/kconfig35/app.kdevelop168
-rw-r--r--languages/cpp/app_templates/kconfig35/appui.rc8
-rw-r--r--languages/cpp/app_templates/kconfig35/appview.cpp41
-rw-r--r--languages/cpp/app_templates/kconfig35/appview.h52
-rw-r--r--languages/cpp/app_templates/kconfig35/appview_base.ui33
-rw-r--r--languages/cpp/app_templates/kconfig35/kconfig35.kdevtemplate245
-rw-r--r--languages/cpp/app_templates/kconfig35/kconfig35.pngbin0 -> 6975 bytes
-rw-r--r--languages/cpp/app_templates/kconfig35/kxt35.pngbin0 -> 6975 bytes
-rw-r--r--languages/cpp/app_templates/kconfig35/main.cpp57
-rw-r--r--languages/cpp/app_templates/kconfig35/prefs-base.ui127
-rw-r--r--languages/cpp/app_templates/kconfig35/prefs.cpp12
-rw-r--r--languages/cpp/app_templates/kconfig35/prefs.h11
-rw-r--r--languages/cpp/app_templates/kconfig35/settings.kcfgc6
-rw-r--r--languages/cpp/app_templates/kconfig35/src-Makefile.am41
-rw-r--r--languages/cpp/app_templates/kconfig35/src-configure.in.in7
-rw-r--r--languages/cpp/app_templates/kconfig35/subdirs3
-rw-r--r--languages/cpp/app_templates/kde4app/CMakeLists.txt31
-rw-r--r--languages/cpp/app_templates/kde4app/Makefile.am19
-rw-r--r--languages/cpp/app_templates/kde4app/README15
-rw-r--r--languages/cpp/app_templates/kde4app/kapp4.cpp90
-rw-r--r--languages/cpp/app_templates/kde4app/kapp4.desktop30
-rw-r--r--languages/cpp/app_templates/kde4app/kapp4.h53
-rw-r--r--languages/cpp/app_templates/kde4app/kapp4.kcfg21
-rw-r--r--languages/cpp/app_templates/kde4app/kapp4view.cpp42
-rw-r--r--languages/cpp/app_templates/kde4app/kapp4view.h55
-rw-r--r--languages/cpp/app_templates/kde4app/kapp4view_base.ui213
-rw-r--r--languages/cpp/app_templates/kde4app/kde4app.kdevelop205
-rw-r--r--languages/cpp/app_templates/kde4app/kde4app.kdevelop.filelist13
-rw-r--r--languages/cpp/app_templates/kde4app/kde4app.kdevtemplate155
-rw-r--r--languages/cpp/app_templates/kde4app/kde4app.pngbin0 -> 6320 bytes
-rw-r--r--languages/cpp/app_templates/kde4app/kde4appui.rc8
-rw-r--r--languages/cpp/app_templates/kde4app/main.cpp55
-rw-r--r--languages/cpp/app_templates/kde4app/prefs_base.ui155
-rw-r--r--languages/cpp/app_templates/kde4app/settings.kcfgc6
-rw-r--r--languages/cpp/app_templates/kdecpp.appwizard2
-rw-r--r--languages/cpp/app_templates/kdedcop/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kdedcop/Makefile.am18
-rw-r--r--languages/cpp/app_templates/kdedcop/app.cpp21
-rw-r--r--languages/cpp/app_templates/kdedcop/app.h36
-rw-r--r--languages/cpp/app_templates/kdedcop/app.kdevelop116
-rw-r--r--languages/cpp/app_templates/kdedcop/app_iface.h19
-rw-r--r--languages/cpp/app_templates/kdedcop/kdedcop.kdevtemplate227
-rw-r--r--languages/cpp/app_templates/kdedcop/kdedcop.pngbin0 -> 2127 bytes
-rw-r--r--languages/cpp/app_templates/kdedcop/main.cpp52
-rw-r--r--languages/cpp/app_templates/kdedcop/mainclass.cpp31
-rw-r--r--languages/cpp/app_templates/kdedcop/mainclass.h32
-rw-r--r--languages/cpp/app_templates/kdedcop/src-Makefile.am23
-rw-r--r--languages/cpp/app_templates/kdedcop/subdirs3
-rw-r--r--languages/cpp/app_templates/kdevlang/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kdevlang/Makefile.am17
-rw-r--r--languages/cpp/app_templates/kdevlang/README.dox55
-rw-r--r--languages/cpp/app_templates/kdevlang/app.kdevelop115
-rw-r--r--languages/cpp/app_templates/kdevlang/kdevlang-configure.in.in10
-rw-r--r--languages/cpp/app_templates/kdevlang/kdevlang.desktop14
-rw-r--r--languages/cpp/app_templates/kdevlang/kdevlang.kdevtemplate157
-rw-r--r--languages/cpp/app_templates/kdevlang/kdevlang.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/kdevlang/kdevlang.rc11
-rw-r--r--languages/cpp/app_templates/kdevlang/kdevlang_part.cpp154
-rw-r--r--languages/cpp/app_templates/kdevlang/kdevlang_part.h43
-rw-r--r--languages/cpp/app_templates/kdevlang/src-Makefile.am14
-rw-r--r--languages/cpp/app_templates/kdevpart/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kdevpart/Makefile.am19
-rw-r--r--languages/cpp/app_templates/kdevpart/README.dox55
-rw-r--r--languages/cpp/app_templates/kdevpart/app.kdevelop116
-rw-r--r--languages/cpp/app_templates/kdevpart/globalconfig.cpp15
-rw-r--r--languages/cpp/app_templates/kdevpart/globalconfig.h22
-rw-r--r--languages/cpp/app_templates/kdevpart/globalconfigbase.ui20
-rw-r--r--languages/cpp/app_templates/kdevpart/kdevpart.desktop83
-rw-r--r--languages/cpp/app_templates/kdevpart/kdevpart.kdevtemplate242
-rw-r--r--languages/cpp/app_templates/kdevpart/kdevpart.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/kdevpart/kdevpart_part.cpp183
-rw-r--r--languages/cpp/app_templates/kdevpart/kdevpart_part.h45
-rw-r--r--languages/cpp/app_templates/kdevpart/kdevpart_part.rc11
-rw-r--r--languages/cpp/app_templates/kdevpart/kdevpart_widget.cpp21
-rw-r--r--languages/cpp/app_templates/kdevpart/kdevpart_widget.h23
-rw-r--r--languages/cpp/app_templates/kdevpart/projectconfig.cpp15
-rw-r--r--languages/cpp/app_templates/kdevpart/projectconfig.h22
-rw-r--r--languages/cpp/app_templates/kdevpart/projectconfigbase.ui20
-rw-r--r--languages/cpp/app_templates/kdevpart/src-Makefile.am20
-rw-r--r--languages/cpp/app_templates/kdevpart2/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kdevpart2/Makefile.am21
-rw-r--r--languages/cpp/app_templates/kdevpart2/README.dox55
-rw-r--r--languages/cpp/app_templates/kdevpart2/app.kdevelop148
-rw-r--r--languages/cpp/app_templates/kdevpart2/globalconfig.cpp15
-rw-r--r--languages/cpp/app_templates/kdevpart2/globalconfig.h22
-rw-r--r--languages/cpp/app_templates/kdevpart2/globalconfigbase.ui20
-rw-r--r--languages/cpp/app_templates/kdevpart2/kdevpart-configure.in.in10
-rw-r--r--languages/cpp/app_templates/kdevpart2/kdevpart.desktop83
-rw-r--r--languages/cpp/app_templates/kdevpart2/kdevpart2.kdevtemplate276
-rw-r--r--languages/cpp/app_templates/kdevpart2/kdevpart2.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/kdevpart2/kdevpart_part.cpp183
-rw-r--r--languages/cpp/app_templates/kdevpart2/kdevpart_part.h45
-rw-r--r--languages/cpp/app_templates/kdevpart2/kdevpart_part.rc11
-rw-r--r--languages/cpp/app_templates/kdevpart2/kdevpart_widget.cpp21
-rw-r--r--languages/cpp/app_templates/kdevpart2/kdevpart_widget.h23
-rw-r--r--languages/cpp/app_templates/kdevpart2/projectconfig.cpp15
-rw-r--r--languages/cpp/app_templates/kdevpart2/projectconfig.h22
-rw-r--r--languages/cpp/app_templates/kdevpart2/projectconfigbase.ui20
-rw-r--r--languages/cpp/app_templates/kdevpart2/src-Makefile.am17
-rw-r--r--languages/cpp/app_templates/kdevpart2/subdirs3
-rw-r--r--languages/cpp/app_templates/kfileplugin/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kfileplugin/Makefile.am18
-rw-r--r--languages/cpp/app_templates/kfileplugin/README.devel9
-rw-r--r--languages/cpp/app_templates/kfileplugin/kfile_plugin.cpp55
-rw-r--r--languages/cpp/app_templates/kfileplugin/kfile_plugin.desktop39
-rw-r--r--languages/cpp/app_templates/kfileplugin/kfile_plugin.h24
-rw-r--r--languages/cpp/app_templates/kfileplugin/kfileplugin8
-rw-r--r--languages/cpp/app_templates/kfileplugin/kfileplugin.kdevtemplate166
-rw-r--r--languages/cpp/app_templates/kfileplugin/kfileplugin.pngbin0 -> 11953 bytes
-rw-r--r--languages/cpp/app_templates/kfileplugin/plugin.kdevelop114
-rw-r--r--languages/cpp/app_templates/kfileplugin/src-Makefile.am22
-rw-r--r--languages/cpp/app_templates/kfileplugin/subdirs3
-rw-r--r--languages/cpp/app_templates/khello/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/khello/Makefile.am18
-rw-r--r--languages/cpp/app_templates/khello/app.cpp23
-rw-r--r--languages/cpp/app_templates/khello/app.desktop40
-rw-r--r--languages/cpp/app_templates/khello/app.h32
-rw-r--r--languages/cpp/app_templates/khello/app.kdevelop115
-rw-r--r--languages/cpp/app_templates/khello/appui.rc8
-rw-r--r--languages/cpp/app_templates/khello/khello.kdevtemplate220
-rw-r--r--languages/cpp/app_templates/khello/khello.pngbin0 -> 3573 bytes
-rw-r--r--languages/cpp/app_templates/khello/main.cpp51
-rw-r--r--languages/cpp/app_templates/khello/src-Makefile.am35
-rw-r--r--languages/cpp/app_templates/khello/subdirs3
-rw-r--r--languages/cpp/app_templates/khello2/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/khello2/Makefile.am18
-rw-r--r--languages/cpp/app_templates/khello2/app.cpp19
-rw-r--r--languages/cpp/app_templates/khello2/app.desktop40
-rw-r--r--languages/cpp/app_templates/khello2/app.h32
-rw-r--r--languages/cpp/app_templates/khello2/app.kdevelop115
-rw-r--r--languages/cpp/app_templates/khello2/appui.rc8
-rw-r--r--languages/cpp/app_templates/khello2/khello2.kdevtemplate230
-rw-r--r--languages/cpp/app_templates/khello2/khello2.pngbin0 -> 3155 bytes
-rw-r--r--languages/cpp/app_templates/khello2/main.cpp51
-rw-r--r--languages/cpp/app_templates/khello2/src-Makefile.am35
-rw-r--r--languages/cpp/app_templates/khello2/subdirs3
-rw-r--r--languages/cpp/app_templates/khello2/widget.cpp30
-rw-r--r--languages/cpp/app_templates/khello2/widget.h30
-rw-r--r--languages/cpp/app_templates/khello2/widgetbase.ui52
-rw-r--r--languages/cpp/app_templates/kicker/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kicker/Makefile.am17
-rw-r--r--languages/cpp/app_templates/kicker/applet.cpp72
-rw-r--r--languages/cpp/app_templates/kicker/applet.desktop40
-rw-r--r--languages/cpp/app_templates/kicker/applet.h107
-rw-r--r--languages/cpp/app_templates/kicker/applet.kdevelop115
-rw-r--r--languages/cpp/app_templates/kicker/kicker.kdevtemplate194
-rw-r--r--languages/cpp/app_templates/kicker/kicker.pngbin0 -> 8356 bytes
-rw-r--r--languages/cpp/app_templates/kicker/src-Makefile.am15
-rw-r--r--languages/cpp/app_templates/kicker/subdirs3
-rw-r--r--languages/cpp/app_templates/kioslave/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kioslave/Makefile.am17
-rw-r--r--languages/cpp/app_templates/kioslave/kioslave.kdevtemplate183
-rw-r--r--languages/cpp/app_templates/kioslave/kioslave.pngbin0 -> 9524 bytes
-rw-r--r--languages/cpp/app_templates/kioslave/slave.cpp88
-rw-r--r--languages/cpp/app_templates/kioslave/slave.h23
-rw-r--r--languages/cpp/app_templates/kioslave/slave.kdevelop113
-rw-r--r--languages/cpp/app_templates/kioslave/slave.protocol39
-rw-r--r--languages/cpp/app_templates/kioslave/src-Makefile.am14
-rw-r--r--languages/cpp/app_templates/kioslave/subdirs3
-rw-r--r--languages/cpp/app_templates/kmake/Makefile.am16
-rw-r--r--languages/cpp/app_templates/kmake/app.cpp33
-rw-r--r--languages/cpp/app_templates/kmake/app.desktop44
-rw-r--r--languages/cpp/app_templates/kmake/app.kdevelop111
-rw-r--r--languages/cpp/app_templates/kmake/app.pro7
-rw-r--r--languages/cpp/app_templates/kmake/appui.rc3
-rw-r--r--languages/cpp/app_templates/kmake/kmake.kdevtemplate148
-rw-r--r--languages/cpp/app_templates/kmake/kmake.pngbin0 -> 5063 bytes
-rw-r--r--languages/cpp/app_templates/kmake/mainview.ui76
-rw-r--r--languages/cpp/app_templates/kmake/mainviewimp.cpp23
-rw-r--r--languages/cpp/app_templates/kmake/mainviewimp.h19
-rw-r--r--languages/cpp/app_templates/kmake/src.pro29
-rw-r--r--languages/cpp/app_templates/kmod/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kmod/Makefile.am17
-rw-r--r--languages/cpp/app_templates/kmod/kmod-driver.c22
-rw-r--r--languages/cpp/app_templates/kmod/kmod.kdevelop93
-rw-r--r--languages/cpp/app_templates/kmod/kmod.kdevtemplate89
-rw-r--r--languages/cpp/app_templates/kmod/kmod.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/kmod/src-Makefile30
-rw-r--r--languages/cpp/app_templates/kofficepart/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kofficepart/Makefile.am21
-rw-r--r--languages/cpp/app_templates/kofficepart/kde-configure.in.in42
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart.desktop9
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart.kdevelop113
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart.kdevtemplate231
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart.pngbin0 -> 10017 bytes
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart.rc10
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart_aboutdata.h24
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart_factory.cpp76
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart_factory.h33
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart_part.cpp69
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart_part.h30
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart_view.cpp52
-rw-r--r--languages/cpp/app_templates/kofficepart/kopart_view.h34
-rw-r--r--languages/cpp/app_templates/kofficepart/main.cpp33
-rw-r--r--languages/cpp/app_templates/kofficepart/src-Makefile.am41
-rw-r--r--languages/cpp/app_templates/kofficepart/subdirs3
-rw-r--r--languages/cpp/app_templates/kofficepart/x-kopart.desktop40
-rw-r--r--languages/cpp/app_templates/konqnavpanel/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/konqnavpanel/Makefile.am18
-rw-r--r--languages/cpp/app_templates/konqnavpanel/konqnavpanel.cpp34
-rw-r--r--languages/cpp/app_templates/konqnavpanel/konqnavpanel.desktop39
-rw-r--r--languages/cpp/app_templates/konqnavpanel/konqnavpanel.h43
-rw-r--r--languages/cpp/app_templates/konqnavpanel/konqnavpanel.kdevelop115
-rw-r--r--languages/cpp/app_templates/konqnavpanel/konqnavpanel.kdevtemplate192
-rw-r--r--languages/cpp/app_templates/konqnavpanel/konqnavpanel.pngbin0 -> 19783 bytes
-rw-r--r--languages/cpp/app_templates/konqnavpanel/src-Makefile.am11
-rw-r--r--languages/cpp/app_templates/konqnavpanel/subdirs3
-rw-r--r--languages/cpp/app_templates/kpartapp/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kpartapp/Makefile.am17
-rw-r--r--languages/cpp/app_templates/kpartapp/app.cpp209
-rw-r--r--languages/cpp/app_templates/kpartapp/app.desktop18
-rw-r--r--languages/cpp/app_templates/kpartapp/app.h76
-rw-r--r--languages/cpp/app_templates/kpartapp/app.kdevelop115
-rw-r--r--languages/cpp/app_templates/kpartapp/app_part.cpp201
-rw-r--r--languages/cpp/app_templates/kpartapp/app_part.h86
-rw-r--r--languages/cpp/app_templates/kpartapp/app_part.rc17
-rw-r--r--languages/cpp/app_templates/kpartapp/app_shell.rc28
-rw-r--r--languages/cpp/app_templates/kpartapp/kpartapp.kdevtemplate237
-rw-r--r--languages/cpp/app_templates/kpartapp/kpartapp.pngbin0 -> 5041 bytes
-rw-r--r--languages/cpp/app_templates/kpartapp/main.cpp57
-rw-r--r--languages/cpp/app_templates/kpartapp/src-Makefile.am53
-rw-r--r--languages/cpp/app_templates/kpartapp/subdirs3
-rw-r--r--languages/cpp/app_templates/kpartplugin/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kpartplugin/Makefile.am19
-rw-r--r--languages/cpp/app_templates/kpartplugin/hi16-action-plugin.pngbin0 -> 292 bytes
-rw-r--r--languages/cpp/app_templates/kpartplugin/hi22-action-plugin.pngbin0 -> 1151 bytes
-rw-r--r--languages/cpp/app_templates/kpartplugin/kpartplugin.kdevtemplate204
-rw-r--r--languages/cpp/app_templates/kpartplugin/kpartplugin.pngbin0 -> 16772 bytes
-rw-r--r--languages/cpp/app_templates/kpartplugin/plugin.kdevelop114
-rw-r--r--languages/cpp/app_templates/kpartplugin/plugin_app.cpp109
-rw-r--r--languages/cpp/app_templates/kpartplugin/plugin_app.h34
-rw-r--r--languages/cpp/app_templates/kpartplugin/plugin_app.rc11
-rw-r--r--languages/cpp/app_templates/kpartplugin/src-Makefile.am22
-rw-r--r--languages/cpp/app_templates/kpartplugin/subdirs3
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/INSTALL83
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/Makefile.am21
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/QUICKSTART164
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/README111
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/SConscript-doc92
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/SConscript-src60
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/SConstruct112
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/VERSION1
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/app.kcfg12
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/app.kdevelop169
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/app_part.cpp159
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/app_part.h74
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/app_part.rc17
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/app_shell.rc33
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/appkmdi.cpp394
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/appkmdi.h82
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/appkmdiView.cpp63
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/appkmdiView.h29
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/kmdikonsole.cpp76
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/kmdikonsole.h32
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/kscons_kmdi.kdevtemplate271
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/kscons_kmdi.pngbin0 -> 13151 bytes
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/main.cpp60
-rwxr-xr-xlanguages/cpp/app_templates/kscons_kmdi/messages.sh60
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/prefs.ui30
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/settings.kcfgc6
-rw-r--r--languages/cpp/app_templates/kscons_kmdi/tips6
-rw-r--r--languages/cpp/app_templates/kscons_kxt/INSTALL83
-rw-r--r--languages/cpp/app_templates/kscons_kxt/Makefile.am21
-rw-r--r--languages/cpp/app_templates/kscons_kxt/QUICKSTART164
-rw-r--r--languages/cpp/app_templates/kscons_kxt/README111
-rw-r--r--languages/cpp/app_templates/kscons_kxt/SConscript-doc92
-rw-r--r--languages/cpp/app_templates/kscons_kxt/SConscript-src72
-rw-r--r--languages/cpp/app_templates/kscons_kxt/SConstruct112
-rw-r--r--languages/cpp/app_templates/kscons_kxt/VERSION1
-rw-r--r--languages/cpp/app_templates/kscons_kxt/app.cpp177
-rw-r--r--languages/cpp/app_templates/kscons_kxt/app.h73
-rw-r--r--languages/cpp/app_templates/kscons_kxt/app.kcfg21
-rw-r--r--languages/cpp/app_templates/kscons_kxt/app.kdevelop169
-rw-r--r--languages/cpp/app_templates/kscons_kxt/appui.rc8
-rw-r--r--languages/cpp/app_templates/kscons_kxt/appview.cpp41
-rw-r--r--languages/cpp/app_templates/kscons_kxt/appview.h52
-rw-r--r--languages/cpp/app_templates/kscons_kxt/appview_base.ui35
-rw-r--r--languages/cpp/app_templates/kscons_kxt/kscons_kxt.kdevtemplate253
-rw-r--r--languages/cpp/app_templates/kscons_kxt/kscons_kxt.pngbin0 -> 13698 bytes
-rw-r--r--languages/cpp/app_templates/kscons_kxt/main.cpp57
-rwxr-xr-xlanguages/cpp/app_templates/kscons_kxt/messages.sh60
-rw-r--r--languages/cpp/app_templates/kscons_kxt/prefs-base.ui129
-rw-r--r--languages/cpp/app_templates/kscons_kxt/prefs.cpp12
-rw-r--r--languages/cpp/app_templates/kscons_kxt/prefs.h11
-rw-r--r--languages/cpp/app_templates/kscons_kxt/settings.kcfgc6
-rw-r--r--languages/cpp/app_templates/kscons_kxt/tips6
-rw-r--r--languages/cpp/app_templates/kscreensaver/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kscreensaver/Makefile.am19
-rw-r--r--languages/cpp/app_templates/kscreensaver/kscreensaver.cpp107
-rw-r--r--languages/cpp/app_templates/kscreensaver/kscreensaver.desktop124
-rw-r--r--languages/cpp/app_templates/kscreensaver/kscreensaver.h35
-rw-r--r--languages/cpp/app_templates/kscreensaver/kscreensaver.kdevelop113
-rw-r--r--languages/cpp/app_templates/kscreensaver/kscreensaver.kdevtemplate203
-rw-r--r--languages/cpp/app_templates/kscreensaver/kscreensaver.pngbin0 -> 12032 bytes
-rw-r--r--languages/cpp/app_templates/kscreensaver/kscreensaverui.ui79
-rw-r--r--languages/cpp/app_templates/kscreensaver/src-Makefile.am24
-rw-r--r--languages/cpp/app_templates/kscreensaver/subdirs3
-rw-r--r--languages/cpp/app_templates/kxt/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/kxt/Makefile.am19
-rw-r--r--languages/cpp/app_templates/kxt/README86
-rw-r--r--languages/cpp/app_templates/kxt/app.cpp154
-rw-r--r--languages/cpp/app_templates/kxt/app.desktop40
-rw-r--r--languages/cpp/app_templates/kxt/app.h66
-rw-r--r--languages/cpp/app_templates/kxt/app.kcfg21
-rw-r--r--languages/cpp/app_templates/kxt/app.kdevelop169
-rw-r--r--languages/cpp/app_templates/kxt/appui.rc8
-rw-r--r--languages/cpp/app_templates/kxt/appview.cpp41
-rw-r--r--languages/cpp/app_templates/kxt/appview.h52
-rw-r--r--languages/cpp/app_templates/kxt/appview_base.ui33
-rw-r--r--languages/cpp/app_templates/kxt/kxt.kdevtemplate269
-rw-r--r--languages/cpp/app_templates/kxt/kxt.pngbin0 -> 3947 bytes
-rw-r--r--languages/cpp/app_templates/kxt/main.cpp57
-rw-r--r--languages/cpp/app_templates/kxt/prefs-base.ui127
-rw-r--r--languages/cpp/app_templates/kxt/prefs.cpp12
-rw-r--r--languages/cpp/app_templates/kxt/prefs.h11
-rw-r--r--languages/cpp/app_templates/kxt/preview.pngbin0 -> 7712 bytes
-rw-r--r--languages/cpp/app_templates/kxt/settings.kcfgc6
-rw-r--r--languages/cpp/app_templates/kxt/src-Makefile.am41
-rw-r--r--languages/cpp/app_templates/kxt/src-configure.in.in7
-rw-r--r--languages/cpp/app_templates/kxt/subdirs3
-rw-r--r--languages/cpp/app_templates/makefileempty/Makefile.am17
-rw-r--r--languages/cpp/app_templates/makefileempty/app.kdevelop101
-rw-r--r--languages/cpp/app_templates/makefileempty/makefileempty-Makefile0
-rw-r--r--languages/cpp/app_templates/makefileempty/makefileempty.kdevtemplate85
-rw-r--r--languages/cpp/app_templates/makefileempty/makefileempty.pngbin0 -> 8621 bytes
-rw-r--r--languages/cpp/app_templates/noatunui/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/noatunui/Makefile.am17
-rw-r--r--languages/cpp/app_templates/noatunui/noatunui8
-rw-r--r--languages/cpp/app_templates/noatunui/noatunui.kdevtemplate195
-rw-r--r--languages/cpp/app_templates/noatunui/noatunui.pngbin0 -> 5433 bytes
-rw-r--r--languages/cpp/app_templates/noatunui/plugin.kdevelop111
-rw-r--r--languages/cpp/app_templates/noatunui/plugin.plugin8
-rw-r--r--languages/cpp/app_templates/noatunui/plugin_app.cpp15
-rw-r--r--languages/cpp/app_templates/noatunui/plugin_impl.cpp301
-rw-r--r--languages/cpp/app_templates/noatunui/plugin_impl.h78
-rw-r--r--languages/cpp/app_templates/noatunui/src-Makefile.am24
-rw-r--r--languages/cpp/app_templates/noatunui/subdirs3
-rw-r--r--languages/cpp/app_templates/noatunvisual/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/noatunvisual/Makefile.am18
-rw-r--r--languages/cpp/app_templates/noatunvisual/noatunvisual8
-rw-r--r--languages/cpp/app_templates/noatunvisual/noatunvisual-configure.in.in36
-rw-r--r--languages/cpp/app_templates/noatunvisual/noatunvisual.kdevtemplate205
-rw-r--r--languages/cpp/app_templates/noatunvisual/noatunvisual.pngbin0 -> 68585 bytes
-rw-r--r--languages/cpp/app_templates/noatunvisual/plugin.kdevelop118
-rw-r--r--languages/cpp/app_templates/noatunvisual/plugin.plugin8
-rw-r--r--languages/cpp/app_templates/noatunvisual/plugin_app.cpp58
-rw-r--r--languages/cpp/app_templates/noatunvisual/plugin_app.h36
-rw-r--r--languages/cpp/app_templates/noatunvisual/plugin_impl.cpp276
-rw-r--r--languages/cpp/app_templates/noatunvisual/plugin_impl.h77
-rw-r--r--languages/cpp/app_templates/noatunvisual/src-Makefile.am19
-rw-r--r--languages/cpp/app_templates/noatunvisual/subdirs3
-rw-r--r--languages/cpp/app_templates/opieapp/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/opieapp/Example.pngbin0 -> 1262 bytes
-rw-r--r--languages/cpp/app_templates/opieapp/Makefile.am18
-rw-r--r--languages/cpp/app_templates/opieapp/app.kdevelop143
-rw-r--r--languages/cpp/app_templates/opieapp/app.pro38
-rw-r--r--languages/cpp/app_templates/opieapp/example.cpp32
-rw-r--r--languages/cpp/app_templates/opieapp/example.desktop37
-rw-r--r--languages/cpp/app_templates/opieapp/example.h20
-rw-r--r--languages/cpp/app_templates/opieapp/examplebase.ui49
-rw-r--r--languages/cpp/app_templates/opieapp/opieapp.kdevtemplate149
-rw-r--r--languages/cpp/app_templates/opieapp/opieapp.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/opieapplet/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/opieapplet/Example.pngbin0 -> 1262 bytes
-rw-r--r--languages/cpp/app_templates/opieapplet/Makefile.am18
-rw-r--r--languages/cpp/app_templates/opieapplet/app.kdevelop158
-rw-r--r--languages/cpp/app_templates/opieapplet/app.pro38
-rw-r--r--languages/cpp/app_templates/opieapplet/opieapplet.kdevtemplate135
-rw-r--r--languages/cpp/app_templates/opieapplet/opieapplet.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/opieapplet/simpleimpl.cpp162
-rw-r--r--languages/cpp/app_templates/opieapplet/simpleimpl.h75
-rw-r--r--languages/cpp/app_templates/opieinput/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/opieinput/Example.pngbin0 -> 1262 bytes
-rw-r--r--languages/cpp/app_templates/opieinput/Makefile.am17
-rw-r--r--languages/cpp/app_templates/opieinput/app.kdevelop159
-rw-r--r--languages/cpp/app_templates/opieinput/app.pro38
-rw-r--r--languages/cpp/app_templates/opieinput/opieinput.kdevtemplate129
-rw-r--r--languages/cpp/app_templates/opieinput/opieinput.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/opieinput/simpleimpl.cpp157
-rw-r--r--languages/cpp/app_templates/opieinput/simpleimpl.h50
-rw-r--r--languages/cpp/app_templates/opiemenu/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/opiemenu/Example.pngbin0 -> 1262 bytes
-rw-r--r--languages/cpp/app_templates/opiemenu/Makefile.am18
-rw-r--r--languages/cpp/app_templates/opiemenu/app.kdevelop158
-rw-r--r--languages/cpp/app_templates/opiemenu/app.pro38
-rw-r--r--languages/cpp/app_templates/opiemenu/opiemenu.kdevtemplate132
-rw-r--r--languages/cpp/app_templates/opiemenu/opiemenu.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/opiemenu/simpleimpl.cpp78
-rw-r--r--languages/cpp/app_templates/opiemenu/simpleimpl.h32
-rw-r--r--languages/cpp/app_templates/opienet/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/opienet/Example.pngbin0 -> 1262 bytes
-rw-r--r--languages/cpp/app_templates/opienet/Makefile.am19
-rw-r--r--languages/cpp/app_templates/opienet/app.kdevelop143
-rw-r--r--languages/cpp/app_templates/opienet/app.pro39
-rw-r--r--languages/cpp/app_templates/opienet/opienet.kdevtemplate142
-rw-r--r--languages/cpp/app_templates/opienet/opienet.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/opienet/simmplemodule.h36
-rw-r--r--languages/cpp/app_templates/opienet/simpleiface.cpp43
-rw-r--r--languages/cpp/app_templates/opienet/simpleiface.h22
-rw-r--r--languages/cpp/app_templates/opienet/simplemodule.cpp71
-rw-r--r--languages/cpp/app_templates/opienet/simplemodule.h36
-rw-r--r--languages/cpp/app_templates/opietoday/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/opietoday/Example.pngbin0 -> 1262 bytes
-rw-r--r--languages/cpp/app_templates/opietoday/Makefile.am19
-rw-r--r--languages/cpp/app_templates/opietoday/app.kdevelop143
-rw-r--r--languages/cpp/app_templates/opietoday/app.pro38
-rw-r--r--languages/cpp/app_templates/opietoday/exampleplugin.cpp60
-rw-r--r--languages/cpp/app_templates/opietoday/exampleplugin.h34
-rw-r--r--languages/cpp/app_templates/opietoday/examplepluginimpl.cpp30
-rw-r--r--languages/cpp/app_templates/opietoday/examplepluginimpl.h23
-rw-r--r--languages/cpp/app_templates/opietoday/examplepluginwidget.cpp55
-rw-r--r--languages/cpp/app_templates/opietoday/examplepluginwidget.h28
-rw-r--r--languages/cpp/app_templates/opietoday/opietoday.kdevtemplate151
-rw-r--r--languages/cpp/app_templates/opietoday/opietoday.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/prc-tool/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/prc-tool/Makefile.am17
-rw-r--r--languages/cpp/app_templates/prc-tool/callback.h24
-rw-r--r--languages/cpp/app_templates/prc-tool/palmhello.c117
-rw-r--r--languages/cpp/app_templates/prc-tool/palmhello.pbitm32
-rw-r--r--languages/cpp/app_templates/prc-tool/palmhello.rcp11
-rw-r--r--languages/cpp/app_templates/prc-tool/palmhelloRsc.h1
-rw-r--r--languages/cpp/app_templates/prc-tool/prc-tool11
-rw-r--r--languages/cpp/app_templates/prc-tool/prc-tool.kdevelop51
-rw-r--r--languages/cpp/app_templates/prc-tool/prc-tool.kdevtemplate136
-rw-r--r--languages/cpp/app_templates/prc-tool/src-Makefile63
-rw-r--r--languages/cpp/app_templates/qmakeapp/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/qmakeapp/Makefile.am18
-rw-r--r--languages/cpp/app_templates/qmakeapp/fileopen.xpm22
-rw-r--r--languages/cpp/app_templates/qmakeapp/fileprint.xpm24
-rw-r--r--languages/cpp/app_templates/qmakeapp/filesave.xpm22
-rw-r--r--languages/cpp/app_templates/qmakeapp/main.cpp13
-rw-r--r--languages/cpp/app_templates/qmakeapp/qmakeapp11
-rw-r--r--languages/cpp/app_templates/qmakeapp/qmakeapp.cpp283
-rw-r--r--languages/cpp/app_templates/qmakeapp/qmakeapp.h39
-rw-r--r--languages/cpp/app_templates/qmakeapp/qmakeapp.kdevelop112
-rw-r--r--languages/cpp/app_templates/qmakeapp/qmakeapp.kdevtemplate182
-rw-r--r--languages/cpp/app_templates/qmakeapp/qmakeapp.pngbin0 -> 5034 bytes
-rw-r--r--languages/cpp/app_templates/qmakeapp/qmakeapp.pro6
-rw-r--r--languages/cpp/app_templates/qmakeapp/src.pro10
-rw-r--r--languages/cpp/app_templates/qmakeempty/Makefile.am18
-rw-r--r--languages/cpp/app_templates/qmakeempty/qmakeempty.kdevelop113
-rw-r--r--languages/cpp/app_templates/qmakeempty/qmakeempty.kdevtemplate131
-rw-r--r--languages/cpp/app_templates/qmakeempty/qmakeempty.pngbin0 -> 26767 bytes
-rw-r--r--languages/cpp/app_templates/qmakeempty/qmakeempty.pro0
-rw-r--r--languages/cpp/app_templates/qmakesimple/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/qmakesimple/Makefile.am16
-rw-r--r--languages/cpp/app_templates/qmakesimple/app.kdevelop100
-rw-r--r--languages/cpp/app_templates/qmakesimple/app.pro2
-rw-r--r--languages/cpp/app_templates/qmakesimple/main.cpp15
-rw-r--r--languages/cpp/app_templates/qmakesimple/qmakesimple11
-rw-r--r--languages/cpp/app_templates/qmakesimple/qmakesimple.kdevtemplate158
-rw-r--r--languages/cpp/app_templates/qmakesimple/qmakesimple.pngbin0 -> 12036 bytes
-rw-r--r--languages/cpp/app_templates/qmakesimple/src.pro4
-rw-r--r--languages/cpp/app_templates/qt4hello/Makefile.am18
-rw-r--r--languages/cpp/app_templates/qt4hello/ReadMe11
-rw-r--r--languages/cpp/app_templates/qt4hello/main.cpp11
-rw-r--r--languages/cpp/app_templates/qt4hello/qt4hello.kdevelop113
-rw-r--r--languages/cpp/app_templates/qt4hello/qt4hello.kdevtemplate160
-rw-r--r--languages/cpp/app_templates/qt4hello/qt4hello.pngbin0 -> 26767 bytes
-rw-r--r--languages/cpp/app_templates/qt4hello/qt4hello.pro5
-rw-r--r--languages/cpp/app_templates/qt4hello/src.pro8
-rw-r--r--languages/cpp/app_templates/qt4makeapp/Makefile.am19
-rw-r--r--languages/cpp/app_templates/qt4makeapp/ReadMe11
-rw-r--r--languages/cpp/app_templates/qt4makeapp/application.qrc10
-rw-r--r--languages/cpp/app_templates/qt4makeapp/editcopy.xpm193
-rw-r--r--languages/cpp/app_templates/qt4makeapp/editcut.xpm252
-rw-r--r--languages/cpp/app_templates/qt4makeapp/editpaste.xpm295
-rw-r--r--languages/cpp/app_templates/qt4makeapp/filenew.xpm216
-rw-r--r--languages/cpp/app_templates/qt4makeapp/fileopen.xpm295
-rw-r--r--languages/cpp/app_templates/qt4makeapp/filesave.xpm295
-rw-r--r--languages/cpp/app_templates/qt4makeapp/main.cpp14
-rw-r--r--languages/cpp/app_templates/qt4makeapp/qt4makeapp11
-rw-r--r--languages/cpp/app_templates/qt4makeapp/qt4makeapp.cpp285
-rw-r--r--languages/cpp/app_templates/qt4makeapp/qt4makeapp.h65
-rw-r--r--languages/cpp/app_templates/qt4makeapp/qt4makeapp.kdevelop113
-rw-r--r--languages/cpp/app_templates/qt4makeapp/qt4makeapp.kdevtemplate207
-rw-r--r--languages/cpp/app_templates/qt4makeapp/qt4makeapp.pngbin0 -> 16908 bytes
-rw-r--r--languages/cpp/app_templates/qt4makeapp/qt4makeapp.pro5
-rw-r--r--languages/cpp/app_templates/qt4makeapp/src.pro10
-rw-r--r--languages/cpp/app_templates/qtopia4app/Example.pngbin0 -> 1262 bytes
-rw-r--r--languages/cpp/app_templates/qtopia4app/Makefile.am19
-rw-r--r--languages/cpp/app_templates/qtopia4app/app.kdevelop163
-rw-r--r--languages/cpp/app_templates/qtopia4app/app.pro31
-rw-r--r--languages/cpp/app_templates/qtopia4app/example.cpp40
-rw-r--r--languages/cpp/app_templates/qtopia4app/example.desktop37
-rw-r--r--languages/cpp/app_templates/qtopia4app/example.h24
-rw-r--r--languages/cpp/app_templates/qtopia4app/example.html15
-rw-r--r--languages/cpp/app_templates/qtopia4app/examplebase.ui44
-rw-r--r--languages/cpp/app_templates/qtopia4app/main.cpp7
-rw-r--r--languages/cpp/app_templates/qtopia4app/qtopia4app.kdevtemplate193
-rw-r--r--languages/cpp/app_templates/qtopia4app/qtopia4app.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/qtopiaapp/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/qtopiaapp/Example.pngbin0 -> 1262 bytes
-rw-r--r--languages/cpp/app_templates/qtopiaapp/Makefile.am19
-rw-r--r--languages/cpp/app_templates/qtopiaapp/app.kdevelop131
-rw-r--r--languages/cpp/app_templates/qtopiaapp/app.pro10
-rw-r--r--languages/cpp/app_templates/qtopiaapp/example.control11
-rw-r--r--languages/cpp/app_templates/qtopiaapp/example.cpp29
-rw-r--r--languages/cpp/app_templates/qtopiaapp/example.desktop37
-rw-r--r--languages/cpp/app_templates/qtopiaapp/example.h18
-rw-r--r--languages/cpp/app_templates/qtopiaapp/example.html15
-rw-r--r--languages/cpp/app_templates/qtopiaapp/examplebase.ui49
-rw-r--r--languages/cpp/app_templates/qtopiaapp/main.cpp13
-rw-r--r--languages/cpp/app_templates/qtopiaapp/qtopiaapp11
-rw-r--r--languages/cpp/app_templates/qtopiaapp/qtopiaapp.kdevtemplate153
-rw-r--r--languages/cpp/app_templates/qtopiaapp/qtopiaapp.pngbin0 -> 483 bytes
-rw-r--r--languages/cpp/app_templates/win32gui/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/win32gui/Makefile.am18
-rw-r--r--languages/cpp/app_templates/win32gui/app.cpp12
-rw-r--r--languages/cpp/app_templates/win32gui/app.kdevelop192
-rw-r--r--languages/cpp/app_templates/win32gui/src-Makefile.am8
-rw-r--r--languages/cpp/app_templates/win32gui/win32gui-Makefile.am5
-rw-r--r--languages/cpp/app_templates/win32gui/win32gui-Makefile.cvs8
-rw-r--r--languages/cpp/app_templates/win32gui/win32gui-configure.in10
-rw-r--r--languages/cpp/app_templates/win32gui/win32gui.kdevtemplate137
-rw-r--r--languages/cpp/app_templates/win32gui/win32gui.pngbin0 -> 10082 bytes
-rw-r--r--languages/cpp/app_templates/win32hello/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/win32hello/Makefile.am18
-rw-r--r--languages/cpp/app_templates/win32hello/app.cpp16
-rw-r--r--languages/cpp/app_templates/win32hello/app.kdevelop164
-rw-r--r--languages/cpp/app_templates/win32hello/src-Makefile.am8
-rw-r--r--languages/cpp/app_templates/win32hello/win32-Makefile.am5
-rw-r--r--languages/cpp/app_templates/win32hello/win32-Makefile.cvs8
-rw-r--r--languages/cpp/app_templates/win32hello/win32-configure.in10
-rw-r--r--languages/cpp/app_templates/win32hello/win32hello.kdevtemplate136
-rw-r--r--languages/cpp/app_templates/win32hello/win32hello.pngbin0 -> 4991 bytes
-rw-r--r--languages/cpp/app_templates/wxhello/.kdev_ignore0
-rw-r--r--languages/cpp/app_templates/wxhello/Makefile.am18
-rw-r--r--languages/cpp/app_templates/wxhello/app.cpp52
-rw-r--r--languages/cpp/app_templates/wxhello/app.desktop39
-rw-r--r--languages/cpp/app_templates/wxhello/app.h36
-rw-r--r--languages/cpp/app_templates/wxhello/app.kdevelop114
-rw-r--r--languages/cpp/app_templates/wxhello/src-Makefile.am14
-rw-r--r--languages/cpp/app_templates/wxhello/subdirs1
-rw-r--r--languages/cpp/app_templates/wxhello/wxhello105
-rw-r--r--languages/cpp/app_templates/wxhello/wxhello.kdevtemplate192
-rw-r--r--languages/cpp/app_templates/wxhello/wxhello.pngbin0 -> 3894 bytes
-rw-r--r--languages/cpp/ast_utils.cpp190
-rw-r--r--languages/cpp/ast_utils.h34
-rw-r--r--languages/cpp/backgroundparser.cpp552
-rw-r--r--languages/cpp/backgroundparser.h122
-rw-r--r--languages/cpp/bithelpers.h37
-rw-r--r--languages/cpp/ccconfigwidget.cpp590
-rw-r--r--languages/cpp/ccconfigwidget.h74
-rw-r--r--languages/cpp/ccconfigwidgetbase.ui1798
-rw-r--r--languages/cpp/classgeneratorconfig.cpp236
-rw-r--r--languages/cpp/classgeneratorconfig.h81
-rw-r--r--languages/cpp/classgeneratorconfigbase.ui261
-rw-r--r--languages/cpp/codecompletionentry.h57
-rw-r--r--languages/cpp/codeinformationrepository.cpp339
-rw-r--r--languages/cpp/codeinformationrepository.h58
-rw-r--r--languages/cpp/compiler/Makefile.am6
-rw-r--r--languages/cpp/compiler/gccoptions/Makefile.am20
-rw-r--r--languages/cpp/compiler/gccoptions/gccoptionsplugin.cpp705
-rw-r--r--languages/cpp/compiler/gccoptions/gccoptionsplugin.h63
-rw-r--r--languages/cpp/compiler/gccoptions/kdevg77options.desktop56
-rw-r--r--languages/cpp/compiler/gccoptions/kdevgccoptions.desktop54
-rw-r--r--languages/cpp/compiler/gccoptions/kdevgppoptions.desktop56
-rw-r--r--languages/cpp/completiondebug.cpp56
-rw-r--r--languages/cpp/completiondebug.h221
-rw-r--r--languages/cpp/computerecoverypoints.h190
-rw-r--r--languages/cpp/configproblemreporter.ui189
-rw-r--r--languages/cpp/configproblemreporter.ui.h98
-rw-r--r--languages/cpp/configuration2
-rw-r--r--languages/cpp/cpp_tags.h432
-rw-r--r--languages/cpp/cppcodecompletion.cpp4492
-rw-r--r--languages/cpp/cppcodecompletion.h324
-rw-r--r--languages/cpp/cppcodecompletionconfig.cpp151
-rw-r--r--languages/cpp/cppcodecompletionconfig.h310
-rw-r--r--languages/cpp/cppevaluation.cpp483
-rw-r--r--languages/cpp/cppevaluation.h367
-rw-r--r--languages/cpp/cppimplementationwidget.cpp100
-rw-r--r--languages/cpp/cppimplementationwidget.h43
-rw-r--r--languages/cpp/cppnewclassdlg.cpp2242
-rw-r--r--languages/cpp/cppnewclassdlg.h292
-rw-r--r--languages/cpp/cppnewclassdlgbase.ui1290
-rw-r--r--languages/cpp/cppsplitheadersourceconfig.cpp82
-rw-r--r--languages/cpp/cppsplitheadersourceconfig.h74
-rw-r--r--languages/cpp/cppsupport_events.h75
-rw-r--r--languages/cpp/cppsupport_utils.cpp139
-rw-r--r--languages/cpp/cppsupport_utils.h28
-rw-r--r--languages/cpp/cppsupportfactory.cpp42
-rw-r--r--languages/cpp/cppsupportfactory.h33
-rw-r--r--languages/cpp/cppsupportpart.cpp3186
-rw-r--r--languages/cpp/cppsupportpart.h661
-rw-r--r--languages/cpp/cpptemplates22
-rw-r--r--languages/cpp/creategettersetter.ui232
-rw-r--r--languages/cpp/creategettersetterconfiguration.cpp62
-rw-r--r--languages/cpp/creategettersetterconfiguration.h117
-rw-r--r--languages/cpp/creategettersetterdialog.cpp122
-rw-r--r--languages/cpp/creategettersetterdialog.h41
-rw-r--r--languages/cpp/createpcsdialog.cpp358
-rw-r--r--languages/cpp/createpcsdialog.h59
-rw-r--r--languages/cpp/createpcsdialogbase.ui168
-rw-r--r--languages/cpp/debugger/DESIGN.txt113
-rw-r--r--languages/cpp/debugger/Makefile.am33
-rw-r--r--languages/cpp/debugger/TODO.txt218
-rw-r--r--languages/cpp/debugger/breakpoint.cpp719
-rw-r--r--languages/cpp/debugger/breakpoint.h313
-rw-r--r--languages/cpp/debugger/dbgcontroller.cpp40
-rw-r--r--languages/cpp/debugger/dbgcontroller.h128
-rw-r--r--languages/cpp/debugger/dbgpsdlg.cpp203
-rw-r--r--languages/cpp/debugger/dbgpsdlg.h59
-rw-r--r--languages/cpp/debugger/dbgtoolbar.cpp498
-rw-r--r--languages/cpp/debugger/dbgtoolbar.h85
-rw-r--r--languages/cpp/debugger/debuggerconfigwidget.cpp138
-rw-r--r--languages/cpp/debugger/debuggerconfigwidget.h43
-rw-r--r--languages/cpp/debugger/debuggerconfigwidgetbase.ui453
-rw-r--r--languages/cpp/debugger/debuggerdcopinterface.h29
-rw-r--r--languages/cpp/debugger/debuggerpart.cpp1272
-rw-r--r--languages/cpp/debugger/debuggerpart.h164
-rw-r--r--languages/cpp/debugger/debuggertracingdialog.cpp104
-rw-r--r--languages/cpp/debugger/debuggertracingdialog.h42
-rw-r--r--languages/cpp/debugger/debuggertracingdialogbase.ui141
-rw-r--r--languages/cpp/debugger/disassemblewidget.cpp173
-rw-r--r--languages/cpp/debugger/disassemblewidget.h69
-rw-r--r--languages/cpp/debugger/framestackwidget.cpp645
-rw-r--r--languages/cpp/debugger/framestackwidget.h183
-rw-r--r--languages/cpp/debugger/gdbbreakpointwidget.cpp1262
-rw-r--r--languages/cpp/debugger/gdbbreakpointwidget.h174
-rw-r--r--languages/cpp/debugger/gdbcommand.cpp142
-rw-r--r--languages/cpp/debugger/gdbcommand.h271
-rw-r--r--languages/cpp/debugger/gdbcontroller.cpp1860
-rw-r--r--languages/cpp/debugger/gdbcontroller.h358
-rw-r--r--languages/cpp/debugger/gdboutputwidget.cpp376
-rw-r--r--languages/cpp/debugger/gdboutputwidget.h137
-rw-r--r--languages/cpp/debugger/gdbparser.cpp432
-rw-r--r--languages/cpp/debugger/gdbparser.h59
-rw-r--r--languages/cpp/debugger/gdbtable.cpp55
-rw-r--r--languages/cpp/debugger/gdbtable.h39
-rw-r--r--languages/cpp/debugger/hi16-action-breakpoint_add.pngbin0 -> 225 bytes
-rw-r--r--languages/cpp/debugger/hi16-action-breakpoint_delete.pngbin0 -> 239 bytes
-rw-r--r--languages/cpp/debugger/hi16-action-breakpoint_delete_all.pngbin0 -> 239 bytes
-rw-r--r--languages/cpp/debugger/hi16-action-breakpoint_edit.pngbin0 -> 277 bytes
-rw-r--r--languages/cpp/debugger/kdevdebugger.desktop86
-rw-r--r--languages/cpp/debugger/kdevdebugger.rc93
-rw-r--r--languages/cpp/debugger/label_with_double_click.cpp14
-rw-r--r--languages/cpp/debugger/label_with_double_click.h20
-rw-r--r--languages/cpp/debugger/memviewdlg.cpp486
-rw-r--r--languages/cpp/debugger/memviewdlg.h118
-rw-r--r--languages/cpp/debugger/mi/Makefile.am12
-rw-r--r--languages/cpp/debugger/mi/gdbmi.cpp128
-rw-r--r--languages/cpp/debugger/mi/gdbmi.h221
-rw-r--r--languages/cpp/debugger/mi/milexer.cpp290
-rw-r--r--languages/cpp/debugger/mi/milexer.h147
-rw-r--r--languages/cpp/debugger/mi/miparser.cpp345
-rw-r--r--languages/cpp/debugger/mi/miparser.h82
-rw-r--r--languages/cpp/debugger/mi/tokens.h34
-rw-r--r--languages/cpp/debugger/stty.cpp386
-rw-r--r--languages/cpp/debugger/stty.h72
-rw-r--r--languages/cpp/debugger/tests/README.txt4
-rw-r--r--languages/cpp/debugger/tests/breakpoints/Makefile4
-rw-r--r--languages/cpp/debugger/tests/breakpoints/README.txt2
-rw-r--r--languages/cpp/debugger/tests/breakpoints/breakpoints.kdevelop163
-rw-r--r--languages/cpp/debugger/tests/breakpoints/foo.cpp10
-rw-r--r--languages/cpp/debugger/tests/breakpoints/main.cpp38
-rw-r--r--languages/cpp/debugger/tests/dll/Makefile8
-rw-r--r--languages/cpp/debugger/tests/dll/README.txt3
-rw-r--r--languages/cpp/debugger/tests/dll/dll.kdevelop158
-rw-r--r--languages/cpp/debugger/tests/dll/helper.cpp6
-rw-r--r--languages/cpp/debugger/tests/dll/main.cpp15
-rw-r--r--languages/cpp/debugger/tests/infinite_loop/Makefile4
-rw-r--r--languages/cpp/debugger/tests/infinite_loop/README.txt3
-rw-r--r--languages/cpp/debugger/tests/infinite_loop/infinite_loop.cpp17
-rw-r--r--languages/cpp/debugger/tests/infinite_loop/infinite_loop.kdevelop109
-rw-r--r--languages/cpp/debugger/tests/print_pointers/Makefile3
-rw-r--r--languages/cpp/debugger/tests/print_pointers/print_pointers.cpp95
-rw-r--r--languages/cpp/debugger/tests/print_pointers/print_pointers.kdevelop218
-rw-r--r--languages/cpp/debugger/tests/segfault/Makefile4
-rw-r--r--languages/cpp/debugger/tests/segfault/README.txt3
-rw-r--r--languages/cpp/debugger/tests/segfault/segfault.cpp7
-rw-r--r--languages/cpp/debugger/tests/segfault/segfault.kdevelop163
-rw-r--r--languages/cpp/debugger/tests/threads/Makefile4
-rw-r--r--languages/cpp/debugger/tests/threads/README.txt4
-rw-r--r--languages/cpp/debugger/tests/threads/threads.cpp26
-rw-r--r--languages/cpp/debugger/tests/threads/threads.kdevelop101
-rw-r--r--languages/cpp/debugger/tests/tracing/Makefile4
-rw-r--r--languages/cpp/debugger/tests/tracing/main.cpp15
-rw-r--r--languages/cpp/debugger/tests/tracing/tracing.kdevelop163
-rw-r--r--languages/cpp/debugger/tests/two_module/Makefile4
-rw-r--r--languages/cpp/debugger/tests/two_module/README.txt2
-rw-r--r--languages/cpp/debugger/tests/two_module/main.cpp8
-rw-r--r--languages/cpp/debugger/tests/two_module/src/foo.cpp12
-rw-r--r--languages/cpp/debugger/tests/two_module/two_module.kdevelop163
-rw-r--r--languages/cpp/debugger/variablewidget.cpp2002
-rw-r--r--languages/cpp/debugger/variablewidget.h466
-rw-r--r--languages/cpp/declarationinfo.h72
-rw-r--r--languages/cpp/doc/Makefile.am7
-rw-r--r--languages/cpp/doc/c++_bugs_gcc.toc7
-rw-r--r--languages/cpp/doc/clanlib.toc384
-rw-r--r--languages/cpp/doc/cppannotations.toc456
-rw-r--r--languages/cpp/doc/gnome1.toc424
-rw-r--r--languages/cpp/doc/gnustep.toc184
-rw-r--r--languages/cpp/doc/gtk_bugs.toc7
-rw-r--r--languages/cpp/doc/kde2book.toc2875
-rw-r--r--languages/cpp/doc/kdetemplates.toc9
-rw-r--r--languages/cpp/doc/libc.toc858
-rw-r--r--languages/cpp/doc/libstdc++.toc19
-rw-r--r--languages/cpp/doc/qt-kdev3.toc39
-rw-r--r--languages/cpp/doc/stl.toc487
-rw-r--r--languages/cpp/doc/wxwidgets_bugs.toc7
-rw-r--r--languages/cpp/doxydoc.cpp148
-rw-r--r--languages/cpp/doxydoc.h59
-rw-r--r--languages/cpp/expressioninfo.h99
-rw-r--r--languages/cpp/file_templates/Makefile.am3
-rw-r--r--languages/cpp/file_templates/c11
-rw-r--r--languages/cpp/file_templates/cpp11
-rw-r--r--languages/cpp/file_templates/h11
-rw-r--r--languages/cpp/file_templates/l35
-rw-r--r--languages/cpp/file_templates/ll42
-rw-r--r--languages/cpp/file_templates/y40
-rw-r--r--languages/cpp/file_templates/yy40
-rw-r--r--languages/cpp/includefiles.cpp2
-rw-r--r--languages/cpp/includefiles.h14
-rw-r--r--languages/cpp/includepathresolver.cpp577
-rw-r--r--languages/cpp/includepathresolver.h76
-rw-r--r--languages/cpp/kdevcppsupport.desktop86
-rw-r--r--languages/cpp/kdevcppsupport.rc30
-rw-r--r--languages/cpp/kdevcsupport.desktop85
-rw-r--r--languages/cpp/kdevdeepcopy.h14
-rw-r--r--languages/cpp/kdevdriver.cpp206
-rw-r--r--languages/cpp/kdevdriver.h58
-rw-r--r--languages/cpp/main.cpp283
-rw-r--r--languages/cpp/newclass_templates/Makefile.am4
-rw-r--r--languages/cpp/newclass_templates/cpp_header31
-rw-r--r--languages/cpp/newclass_templates/cpp_source9
-rw-r--r--languages/cpp/newclass_templates/gtk_header24
-rw-r--r--languages/cpp/newclass_templates/gtk_source35
-rw-r--r--languages/cpp/newclass_templates/objc_header11
-rw-r--r--languages/cpp/newclass_templates/objc_source4
-rw-r--r--languages/cpp/pcsimporter/Makefile.am3
-rw-r--r--languages/cpp/pcsimporter/customimporter/Makefile.am12
-rw-r--r--languages/cpp/pcsimporter/customimporter/kdevcustomimporter.cpp118
-rw-r--r--languages/cpp/pcsimporter/customimporter/kdevcustomimporter.h40
-rw-r--r--languages/cpp/pcsimporter/customimporter/kdevpcscustomimporter.desktop44
-rw-r--r--languages/cpp/pcsimporter/customimporter/settingsdialog.cpp107
-rw-r--r--languages/cpp/pcsimporter/customimporter/settingsdialog.h48
-rw-r--r--languages/cpp/pcsimporter/customimporter/settingsdialogbase.ui62
-rw-r--r--languages/cpp/pcsimporter/kdelibsimporter/Makefile.am11
-rw-r--r--languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.cpp119
-rw-r--r--languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.desktop49
-rw-r--r--languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.h40
-rw-r--r--languages/cpp/pcsimporter/kdelibsimporter/settingsdialog.cpp101
-rw-r--r--languages/cpp/pcsimporter/kdelibsimporter/settingsdialog.h44
-rw-r--r--languages/cpp/pcsimporter/kdelibsimporter/settingsdialogbase.ui131
-rw-r--r--languages/cpp/pcsimporter/qt4importer/Makefile.am11
-rw-r--r--languages/cpp/pcsimporter/qt4importer/kdevqt4importer.cpp107
-rw-r--r--languages/cpp/pcsimporter/qt4importer/kdevqt4importer.desktop34
-rw-r--r--languages/cpp/pcsimporter/qt4importer/kdevqt4importer.h39
-rw-r--r--languages/cpp/pcsimporter/qt4importer/settingsdialog.cpp115
-rw-r--r--languages/cpp/pcsimporter/qt4importer/settingsdialog.h46
-rw-r--r--languages/cpp/pcsimporter/qt4importer/settingsdialogbase.ui79
-rw-r--r--languages/cpp/pcsimporter/qtimporter/Makefile.am11
-rw-r--r--languages/cpp/pcsimporter/qtimporter/kdevqtimporter.cpp73
-rw-r--r--languages/cpp/pcsimporter/qtimporter/kdevqtimporter.desktop37
-rw-r--r--languages/cpp/pcsimporter/qtimporter/kdevqtimporter.h37
-rw-r--r--languages/cpp/pcsimporter/qtimporter/settingsdialog.cpp122
-rw-r--r--languages/cpp/pcsimporter/qtimporter/settingsdialog.h46
-rw-r--r--languages/cpp/pcsimporter/qtimporter/settingsdialogbase.ui139
-rw-r--r--languages/cpp/problemreporter.cpp441
-rw-r--r--languages/cpp/problemreporter.h156
-rw-r--r--languages/cpp/qtbuildconfig.cpp216
-rw-r--r--languages/cpp/qtbuildconfig.h90
-rw-r--r--languages/cpp/qtdesignercppintegration.cpp218
-rw-r--r--languages/cpp/qtdesignercppintegration.h40
-rw-r--r--languages/cpp/safetycounter.h59
-rw-r--r--languages/cpp/setuphelper.cpp91
-rw-r--r--languages/cpp/setuphelper.h42
-rw-r--r--languages/cpp/simplecontext.cpp68
-rw-r--r--languages/cpp/simplecontext.h171
-rw-r--r--languages/cpp/simpletype.cpp1051
-rw-r--r--languages/cpp/simpletype.h819
-rw-r--r--languages/cpp/simpletypecachebinder.h348
-rw-r--r--languages/cpp/simpletypecatalog.cpp375
-rw-r--r--languages/cpp/simpletypecatalog.h119
-rw-r--r--languages/cpp/simpletypefunction.cpp726
-rw-r--r--languages/cpp/simpletypefunction.h341
-rw-r--r--languages/cpp/simpletypenamespace.cpp438
-rw-r--r--languages/cpp/simpletypenamespace.h165
-rw-r--r--languages/cpp/store_walker.cpp1081
-rw-r--r--languages/cpp/store_walker.h141
-rw-r--r--languages/cpp/storeconverter.cpp149
-rw-r--r--languages/cpp/storeconverter.h48
-rw-r--r--languages/cpp/stringhelpers.cpp299
-rw-r--r--languages/cpp/stringhelpers.h118
-rw-r--r--languages/cpp/subclassing_template/.kdev_ignore0
-rw-r--r--languages/cpp/subclassing_template/Makefile.am5
-rw-r--r--languages/cpp/subclassing_template/subclass_qt4_template.cpp16
-rw-r--r--languages/cpp/subclassing_template/subclass_qt4_template.h28
-rw-r--r--languages/cpp/subclassing_template/subclass_template.cpp15
-rw-r--r--languages/cpp/subclassing_template/subclass_template.h27
-rw-r--r--languages/cpp/subclassingdlg.cpp536
-rw-r--r--languages/cpp/subclassingdlg.h85
-rw-r--r--languages/cpp/subclassingdlgbase.ui244
-rw-r--r--languages/cpp/tag_creator.cpp884
-rw-r--r--languages/cpp/tag_creator.h131
-rw-r--r--languages/cpp/templates/Makefile.am2
-rw-r--r--languages/cpp/templates/default.cpp12
-rw-r--r--languages/cpp/templates/default.h12
-rw-r--r--languages/cpp/typedecoration.h119
-rw-r--r--languages/cpp/typedesc.cpp788
-rw-r--r--languages/cpp/typedesc.h403
-rw-r--r--languages/csharp/Makefile.am25
-rw-r--r--languages/csharp/README.dox46
-rw-r--r--languages/csharp/app_templates/Makefile.am3
-rw-r--r--languages/csharp/app_templates/csharp.appwizard2
-rw-r--r--languages/csharp/csharpconfigwidget.cpp38
-rw-r--r--languages/csharp/csharpconfigwidget.h34
-rw-r--r--languages/csharp/csharpconfigwidgetbase.ui101
-rw-r--r--languages/csharp/csharpdoc.cpp133
-rw-r--r--languages/csharp/csharpdoc.h25
-rw-r--r--languages/csharp/csharpdoc.protocol9
-rw-r--r--languages/csharp/csharpsupportpart.cpp331
-rw-r--r--languages/csharp/csharpsupportpart.h59
-rw-r--r--languages/csharp/doc/Makefile.am6
-rw-r--r--languages/csharp/file_templates/Makefile.am4
-rw-r--r--languages/csharp/kdevcsharpsupport.desktop57
-rw-r--r--languages/csharp/kdevcsharpsupport.rc14
-rw-r--r--languages/fortran/Makefile.am20
-rw-r--r--languages/fortran/README.dox48
-rw-r--r--languages/fortran/app_templates/Makefile.am3
-rw-r--r--languages/fortran/app_templates/fortran.appwizard2
-rw-r--r--languages/fortran/app_templates/fortranhello/.kdev_ignore0
-rw-r--r--languages/fortran/app_templates/fortranhello/Makefile.am17
-rw-r--r--languages/fortran/app_templates/fortranhello/app.kdevelop113
-rw-r--r--languages/fortran/app_templates/fortranhello/configure.in10
-rw-r--r--languages/fortran/app_templates/fortranhello/fortran-Makefile.am5
-rw-r--r--languages/fortran/app_templates/fortranhello/fortran-Makefile.cvs8
-rw-r--r--languages/fortran/app_templates/fortranhello/fortranhello10
-rw-r--r--languages/fortran/app_templates/fortranhello/fortranhello.kdevtemplate140
-rw-r--r--languages/fortran/app_templates/fortranhello/fortranhello.pngbin0 -> 10118 bytes
-rw-r--r--languages/fortran/app_templates/fortranhello/main.f7
-rw-r--r--languages/fortran/app_templates/fortranhello/src-Makefile.am8
-rw-r--r--languages/fortran/compiler/Makefile.am6
-rw-r--r--languages/fortran/compiler/pgioptions/Makefile.am18
-rw-r--r--languages/fortran/compiler/pgioptions/kdevpgf77options.desktop53
-rw-r--r--languages/fortran/compiler/pgioptions/kdevpghpfoptions.desktop50
-rw-r--r--languages/fortran/compiler/pgioptions/pgioptionsfactory.cpp69
-rw-r--r--languages/fortran/compiler/pgioptions/pgioptionsfactory.h34
-rw-r--r--languages/fortran/compiler/pgioptions/pgioptionsplugin.cpp324
-rw-r--r--languages/fortran/compiler/pgioptions/pgioptionsplugin.h55
-rw-r--r--languages/fortran/doc/Makefile.am6
-rw-r--r--languages/fortran/doc/fortran_bugs_gcc.toc7
-rw-r--r--languages/fortran/file_templates/Makefile.am2
-rw-r--r--languages/fortran/file_templates/f11
-rw-r--r--languages/fortran/file_templates/f7711
-rw-r--r--languages/fortran/file_templates/f9011
-rw-r--r--languages/fortran/file_templates/f9511
-rw-r--r--languages/fortran/file_templates/for11
-rw-r--r--languages/fortran/file_templates/fpp11
-rw-r--r--languages/fortran/file_templates/ftn11
-rw-r--r--languages/fortran/fixedformparser.cpp94
-rw-r--r--languages/fortran/fixedformparser.h35
-rw-r--r--languages/fortran/fortransupportpart.cpp287
-rw-r--r--languages/fortran/fortransupportpart.h53
-rw-r--r--languages/fortran/ftnchekconfigwidget.cpp290
-rw-r--r--languages/fortran/ftnchekconfigwidget.h41
-rw-r--r--languages/fortran/ftnchekconfigwidgetbase.ui584
-rw-r--r--languages/fortran/kdevfortransupport.desktop80
-rw-r--r--languages/fortran/kdevfortransupport.rc9
-rw-r--r--languages/java/JavaAST.hpp77
-rw-r--r--languages/java/JavaLexer.cpp2183
-rw-r--r--languages/java/JavaLexer.hpp132
-rw-r--r--languages/java/JavaRecognizer.cpp6540
-rw-r--r--languages/java/JavaRecognizer.hpp423
-rw-r--r--languages/java/JavaStoreWalker.cpp3441
-rw-r--r--languages/java/JavaStoreWalker.hpp164
-rw-r--r--languages/java/JavaStoreWalkerTokenTypes.hpp169
-rw-r--r--languages/java/JavaStoreWalkerTokenTypes.txt151
-rw-r--r--languages/java/JavaTokenTypes.hpp168
-rw-r--r--languages/java/JavaTokenTypes.txt150
-rw-r--r--languages/java/KDevJavaSupportIface.cpp24
-rw-r--r--languages/java/KDevJavaSupportIface.h26
-rw-r--r--languages/java/Makefile.am37
-rw-r--r--languages/java/README.dox48
-rw-r--r--languages/java/app_templates/Makefile.am3
-rw-r--r--languages/java/app_templates/java.appwizard2
-rw-r--r--languages/java/app_templates/javahello/.kdev_ignore0
-rw-r--r--languages/java/app_templates/javahello/Main.java7
-rw-r--r--languages/java/app_templates/javahello/Makefile.am16
-rw-r--r--languages/java/app_templates/javahello/build.xml37
-rw-r--r--languages/java/app_templates/javahello/javahello11
-rw-r--r--languages/java/app_templates/javahello/javahello.filelist2
-rw-r--r--languages/java/app_templates/javahello/javahello.kdevelop69
-rw-r--r--languages/java/app_templates/javahello/javahello.kdevtemplate124
-rw-r--r--languages/java/app_templates/javahello/javahello.pngbin0 -> 483 bytes
-rw-r--r--languages/java/app_templates/kappjava/.kdev_ignore0
-rw-r--r--languages/java/app_templates/kappjava/Makefile.am17
-rw-r--r--languages/java/app_templates/kappjava/app.desktop41
-rw-r--r--languages/java/app_templates/kappjava/app.java281
-rw-r--r--languages/java/app_templates/kappjava/app.kdevelop88
-rw-r--r--languages/java/app_templates/kappjava/app_client.java28
-rw-r--r--languages/java/app_templates/kappjava/appui.rc8
-rw-r--r--languages/java/app_templates/kappjava/appview.java115
-rw-r--r--languages/java/app_templates/kappjava/kappjava10
-rw-r--r--languages/java/app_templates/kappjava/kappjava.kdevtemplate163
-rw-r--r--languages/java/app_templates/kappjava/kappjava.pngbin0 -> 5063 bytes
-rw-r--r--languages/java/app_templates/kappjava/pref.java52
-rw-r--r--languages/java/app_templates/kappjava/src-Makefile.am18
-rw-r--r--languages/java/app_templates/kappjava/subdirs3
-rw-r--r--languages/java/app_templates/superwaba/.kdev_ignore0
-rw-r--r--languages/java/app_templates/superwaba/Makefile.am16
-rw-r--r--languages/java/app_templates/superwaba/src-Makefile226
-rw-r--r--languages/java/app_templates/superwaba/superwaba54
-rw-r--r--languages/java/app_templates/superwaba/superwaba.kdevtemplate166
-rw-r--r--languages/java/app_templates/superwaba/superwaba.pngbin0 -> 1100 bytes
-rw-r--r--languages/java/app_templates/superwaba/sw.filelist1
-rw-r--r--languages/java/app_templates/superwaba/sw.java97
-rw-r--r--languages/java/app_templates/superwaba/sw.kdevelop94
-rw-r--r--languages/java/backgroundparser.cpp363
-rw-r--r--languages/java/backgroundparser.h86
-rw-r--r--languages/java/configproblemreporter.ui257
-rw-r--r--languages/java/configproblemreporter.ui.h74
-rw-r--r--languages/java/doc/Makefile.am6
-rw-r--r--languages/java/doc/java_bugs_gcc.toc7
-rw-r--r--languages/java/doc/java_bugs_sun.toc7
-rw-r--r--languages/java/doc/sw.toc146
-rw-r--r--languages/java/driver.cpp227
-rw-r--r--languages/java/driver.h139
-rw-r--r--languages/java/file_templates/Makefile.am4
-rw-r--r--languages/java/file_templates/java6
-rw-r--r--languages/java/java.g1318
-rw-r--r--languages/java/java.store.g521
-rw-r--r--languages/java/java.tree.g331
-rw-r--r--languages/java/javasupport_events.h60
-rw-r--r--languages/java/javasupport_utils.cpp52
-rw-r--r--languages/java/javasupport_utils.h21
-rw-r--r--languages/java/javasupportfactory.cpp39
-rw-r--r--languages/java/javasupportfactory.h31
-rw-r--r--languages/java/javasupportpart.cpp908
-rw-r--r--languages/java/javasupportpart.h165
-rw-r--r--languages/java/javatemplates3
-rw-r--r--languages/java/kdevdeepcopy.h12
-rw-r--r--languages/java/kdevdriver.cpp44
-rw-r--r--languages/java/kdevdriver.h30
-rw-r--r--languages/java/kdevjavasupport.desktop85
-rw-r--r--languages/java/kdevjavasupport.rc4
-rw-r--r--languages/java/newclass_templates/Makefile.am4
-rw-r--r--languages/java/newclass_templates/java_source9
-rw-r--r--languages/java/problemreporter.cpp299
-rw-r--r--languages/java/problemreporter.h74
-rw-r--r--languages/kjssupport/Makefile.am22
-rw-r--r--languages/kjssupport/jscodecompletion.cpp174
-rw-r--r--languages/kjssupport/jscodecompletion.h53
-rw-r--r--languages/kjssupport/kdevkjssupport.desktop54
-rw-r--r--languages/kjssupport/kdevkjssupport.rc11
-rw-r--r--languages/kjssupport/kjsproblems.cpp78
-rw-r--r--languages/kjssupport/kjsproblems.h43
-rw-r--r--languages/kjssupport/kjssupport_part.cpp448
-rw-r--r--languages/kjssupport/kjssupport_part.h85
-rw-r--r--languages/kjssupport/subclassing_template/Makefile.am3
-rw-r--r--languages/kjssupport/subclassing_template/subclass_template.js2
-rw-r--r--languages/kjssupport/subclassingdlg.cpp461
-rw-r--r--languages/kjssupport/subclassingdlg.h85
-rw-r--r--languages/kjssupport/subclassingdlgbase.ui253
-rw-r--r--languages/kjssupport/template/Makefile.am20
-rw-r--r--languages/kjssupport/template/app.js18
-rw-r--r--languages/kjssupport/template/app.kdevelop45
-rw-r--r--languages/kjssupport/template/jshello6
-rw-r--r--languages/kjssupport/template/script13
-rw-r--r--languages/kjssupport/x-javascript-source.desktop4
-rw-r--r--languages/lib/Makefile.am6
-rw-r--r--languages/lib/debugger/Mainpage.dox36
-rw-r--r--languages/lib/debugger/Makefile.am13
-rw-r--r--languages/lib/debugger/debugger.cpp209
-rw-r--r--languages/lib/debugger/debugger.h132
-rw-r--r--languages/lib/debugger/kdevdebugger.cpp182
-rw-r--r--languages/lib/debugger/kdevdebugger.h88
-rw-r--r--languages/lib/designer_integration/Mainpage.dox48
-rw-r--r--languages/lib/designer_integration/Makefile.am16
-rw-r--r--languages/lib/designer_integration/implementationwidget.cpp158
-rw-r--r--languages/lib/designer_integration/implementationwidget.h86
-rw-r--r--languages/lib/designer_integration/implementationwidgetbase.ui267
-rw-r--r--languages/lib/designer_integration/qtdesignerintegration.cpp195
-rw-r--r--languages/lib/designer_integration/qtdesignerintegration.h80
-rw-r--r--languages/lib/interfaces/Mainpage.dox10
-rw-r--r--languages/lib/interfaces/Makefile.am16
-rw-r--r--languages/lib/interfaces/kdeveloppcsimporter.desktop39
-rw-r--r--languages/lib/interfaces/kdevpcsimporter.cpp36
-rw-r--r--languages/lib/interfaces/kdevpcsimporter.h49
-rw-r--r--languages/pascal/Makefile.am33
-rw-r--r--languages/pascal/PascalAST.hpp51
-rw-r--r--languages/pascal/PascalLexer.cpp1309
-rw-r--r--languages/pascal/PascalLexer.hpp121
-rw-r--r--languages/pascal/PascalParser.cpp9744
-rw-r--r--languages/pascal/PascalParser.hpp422
-rw-r--r--languages/pascal/PascalStoreWalker.cpp3409
-rw-r--r--languages/pascal/PascalStoreWalker.hpp172
-rw-r--r--languages/pascal/PascalStoreWalkerTokenTypes.hpp206
-rw-r--r--languages/pascal/PascalStoreWalkerTokenTypes.txt188
-rw-r--r--languages/pascal/PascalTokenTypes.hpp206
-rw-r--r--languages/pascal/PascalTokenTypes.txt188
-rw-r--r--languages/pascal/README.dox26
-rw-r--r--languages/pascal/app_templates/Makefile.am3
-rw-r--r--languages/pascal/app_templates/fpcgtk/.kdev_ignore0
-rw-r--r--languages/pascal/app_templates/fpcgtk/Makefile.am16
-rw-r--r--languages/pascal/app_templates/fpcgtk/app.kdevelop86
-rw-r--r--languages/pascal/app_templates/fpcgtk/fpcgtk9
-rw-r--r--languages/pascal/app_templates/fpcgtk/fpcgtk.kdevtemplate114
-rw-r--r--languages/pascal/app_templates/fpcgtk/fpcgtk.pngbin0 -> 483 bytes
-rw-r--r--languages/pascal/app_templates/fpcgtk/main.pp84
-rw-r--r--languages/pascal/app_templates/fpchello/.kdev_ignore0
-rw-r--r--languages/pascal/app_templates/fpchello/Makefile.am16
-rw-r--r--languages/pascal/app_templates/fpchello/app.kdevelop86
-rw-r--r--languages/pascal/app_templates/fpchello/fpchello9
-rw-r--r--languages/pascal/app_templates/fpchello/fpchello.kdevtemplate115
-rw-r--r--languages/pascal/app_templates/fpchello/fpchello.pngbin0 -> 483 bytes
-rw-r--r--languages/pascal/app_templates/fpchello/main.pp5
-rw-r--r--languages/pascal/app_templates/fpcsharedlib/.kdev_ignore0
-rw-r--r--languages/pascal/app_templates/fpcsharedlib/Makefile.am16
-rw-r--r--languages/pascal/app_templates/fpcsharedlib/app.kdevelop86
-rw-r--r--languages/pascal/app_templates/fpcsharedlib/fpcsharedlib9
-rw-r--r--languages/pascal/app_templates/fpcsharedlib/fpcsharedlib.kdevtemplate115
-rw-r--r--languages/pascal/app_templates/fpcsharedlib/fpcsharedlib.pngbin0 -> 483 bytes
-rw-r--r--languages/pascal/app_templates/fpcsharedlib/main.pp11
-rw-r--r--languages/pascal/app_templates/pascal.appwizard2
-rw-r--r--languages/pascal/app_templates/pascalhello/.kdev_ignore0
-rw-r--r--languages/pascal/app_templates/pascalhello/Makefile.am16
-rw-r--r--languages/pascal/app_templates/pascalhello/app.kdevelop83
-rw-r--r--languages/pascal/app_templates/pascalhello/main.pp5
-rw-r--r--languages/pascal/app_templates/pascalhello/pascalhello10
-rw-r--r--languages/pascal/app_templates/pascalhello/pascalhello.kdevtemplate116
-rw-r--r--languages/pascal/app_templates/pascalhello/pascalhello.pngbin0 -> 10118 bytes
-rw-r--r--languages/pascal/backgroundparser.cpp95
-rw-r--r--languages/pascal/backgroundparser.h35
-rw-r--r--languages/pascal/compiler/Makefile.am6
-rw-r--r--languages/pascal/compiler/dccoptions/Makefile.am16
-rw-r--r--languages/pascal/compiler/dccoptions/dccoptionsplugin.cpp114
-rw-r--r--languages/pascal/compiler/dccoptions/dccoptionsplugin.h56
-rw-r--r--languages/pascal/compiler/dccoptions/kdevdccoptions.desktop54
-rw-r--r--languages/pascal/compiler/dccoptions/optiontabs.cpp399
-rw-r--r--languages/pascal/compiler/dccoptions/optiontabs.h116
-rw-r--r--languages/pascal/compiler/fpcoptions/Makefile.am20
-rw-r--r--languages/pascal/compiler/fpcoptions/fpcoptionsplugin.cpp126
-rw-r--r--languages/pascal/compiler/fpcoptions/fpcoptionsplugin.h63
-rw-r--r--languages/pascal/compiler/fpcoptions/kdevfpcoptions.desktop55
-rw-r--r--languages/pascal/compiler/fpcoptions/optiontabs.cpp657
-rw-r--r--languages/pascal/compiler/fpcoptions/optiontabs.h161
-rw-r--r--languages/pascal/configproblemreporter.ui88
-rw-r--r--languages/pascal/doc/Makefile.am6
-rw-r--r--languages/pascal/doc/pascal_bugs_fp.toc7
-rw-r--r--languages/pascal/file_templates/Makefile.am2
-rw-r--r--languages/pascal/file_templates/dpr12
-rw-r--r--languages/pascal/file_templates/pas-program12
-rw-r--r--languages/pascal/file_templates/pas-unit19
-rw-r--r--languages/pascal/file_templates/pp-program12
-rw-r--r--languages/pascal/file_templates/pp-unit19
-rw-r--r--languages/pascal/kdevpascalsupport.desktop84
-rw-r--r--languages/pascal/kdevpascalsupport.rc3
-rw-r--r--languages/pascal/pascal.g1212
-rw-r--r--languages/pascal/pascal.tree.g468
-rw-r--r--languages/pascal/pascalsupport_part.cpp323
-rw-r--r--languages/pascal/pascalsupport_part.h62
-rw-r--r--languages/pascal/pascaltemplates30
-rw-r--r--languages/pascal/problemreporter.cpp289
-rw-r--r--languages/pascal/problemreporter.h78
-rw-r--r--languages/perl/Makefile.am25
-rw-r--r--languages/perl/README.dox46
-rw-r--r--languages/perl/app_templates/Makefile.am3
-rw-r--r--languages/perl/app_templates/perl.appwizard2
-rw-r--r--languages/perl/app_templates/perlhello/.kdev_ignore0
-rw-r--r--languages/perl/app_templates/perlhello/Makefile.am16
-rw-r--r--languages/perl/app_templates/perlhello/app.kdevelop77
-rwxr-xr-xlanguages/perl/app_templates/perlhello/app.pl43
-rw-r--r--languages/perl/app_templates/perlhello/perlhello10
-rw-r--r--languages/perl/app_templates/perlhello/perlhello.kdevtemplate108
-rw-r--r--languages/perl/app_templates/perlhello/perlhello.pngbin0 -> 17622 bytes
-rw-r--r--languages/perl/doc/Makefile.am6
-rw-r--r--languages/perl/doc/perl.toc54
-rw-r--r--languages/perl/doc/perl_bugs.toc7
-rw-r--r--languages/perl/file_templates/Makefile.am4
-rw-r--r--languages/perl/file_templates/pl43
-rw-r--r--languages/perl/file_templates/pm68
-rw-r--r--languages/perl/kdevperlsupport.desktop85
-rw-r--r--languages/perl/kdevperlsupport.rc14
-rw-r--r--languages/perl/perlconfigwidget.cpp38
-rw-r--r--languages/perl/perlconfigwidget.h34
-rw-r--r--languages/perl/perlconfigwidgetbase.ui101
-rw-r--r--languages/perl/perldoc.cpp133
-rw-r--r--languages/perl/perldoc.h25
-rw-r--r--languages/perl/perldoc.protocol9
-rw-r--r--languages/perl/perlparser.cpp494
-rw-r--r--languages/perl/perlparser.h87
-rw-r--r--languages/perl/perlsupportpart.cpp330
-rw-r--r--languages/perl/perlsupportpart.h59
-rw-r--r--languages/php/Makefile.am24
-rw-r--r--languages/php/README.dox32
-rw-r--r--languages/php/app_templates/Makefile.am3
-rw-r--r--languages/php/app_templates/php.appwizard2
-rw-r--r--languages/php/app_templates/phphello/.kdev_ignore0
-rw-r--r--languages/php/app_templates/phphello/Makefile.am16
-rw-r--r--languages/php/app_templates/phphello/app.kdevelop87
-rw-r--r--languages/php/app_templates/phphello/app.php28
-rw-r--r--languages/php/app_templates/phphello/phphello25
-rw-r--r--languages/php/app_templates/phphello/phphello.kdevtemplate108
-rw-r--r--languages/php/app_templates/phphello/phphello.pngbin0 -> 483 bytes
-rw-r--r--languages/php/data/Makefile.am6
-rw-r--r--languages/php/data/phpfunctions1657
-rw-r--r--languages/php/doc/Makefile.am6
-rw-r--r--languages/php/doc/php.toc7069
-rw-r--r--languages/php/doc/php_bugs.toc7
-rw-r--r--languages/php/file_templates/Makefile.am4
-rw-r--r--languages/php/file_templates/php12
-rw-r--r--languages/php/kdevphpsupport.desktop86
-rw-r--r--languages/php/kdevphpsupport.rc18
-rw-r--r--languages/php/phpcodecompletion.cpp712
-rw-r--r--languages/php/phpcodecompletion.h103
-rw-r--r--languages/php/phpconfigdata.cpp88
-rw-r--r--languages/php/phpconfigdata.h155
-rw-r--r--languages/php/phpconfigwidget.cpp161
-rw-r--r--languages/php/phpconfigwidget.h32
-rw-r--r--languages/php/phpconfigwidgetbase.ui561
-rw-r--r--languages/php/phperrorview.cpp422
-rw-r--r--languages/php/phperrorview.h104
-rw-r--r--languages/php/phpfile.cpp639
-rw-r--r--languages/php/phpfile.h119
-rw-r--r--languages/php/phphtmlview.cpp39
-rw-r--r--languages/php/phphtmlview.h42
-rw-r--r--languages/php/phpinfodlg.ui87
-rw-r--r--languages/php/phpnewclassdlg.cpp123
-rw-r--r--languages/php/phpnewclassdlg.h42
-rw-r--r--languages/php/phpnewclassdlgbase.ui201
-rw-r--r--languages/php/phpparser.cpp160
-rw-r--r--languages/php/phpparser.h73
-rw-r--r--languages/php/phpsupport_event.h110
-rw-r--r--languages/php/phpsupportpart.cpp751
-rw-r--r--languages/php/phpsupportpart.h133
-rw-r--r--languages/php/phptemplates4
-rw-r--r--languages/python/Makefile.am31
-rw-r--r--languages/python/README.dox48
-rw-r--r--languages/python/app_templates/Makefile.am3
-rw-r--r--languages/python/app_templates/pyqt/.kdev_ignore0
-rw-r--r--languages/python/app_templates/pyqt/Makefile.am20
-rw-r--r--languages/python/app_templates/pyqt/app-Makefile.am14
-rw-r--r--languages/python/app_templates/pyqt/app-autogen.sh10
-rw-r--r--languages/python/app_templates/pyqt/app-configure.ac32
-rw-r--r--languages/python/app_templates/pyqt/app.kdevelop81
-rw-r--r--languages/python/app_templates/pyqt/app.py271
-rw-r--r--languages/python/app_templates/pyqt/documentdetails.ui80
-rw-r--r--languages/python/app_templates/pyqt/fileopen.pyxpm19
-rw-r--r--languages/python/app_templates/pyqt/fileprint.pyxpm21
-rw-r--r--languages/python/app_templates/pyqt/filesave.pyxpm19
-rw-r--r--languages/python/app_templates/pyqt/install-sh0
-rw-r--r--languages/python/app_templates/pyqt/missing0
-rw-r--r--languages/python/app_templates/pyqt/mkinstalldirs0
-rw-r--r--languages/python/app_templates/pyqt/pyqt10
-rw-r--r--languages/python/app_templates/pyqt/pyqt-am-preproc.py85
-rw-r--r--languages/python/app_templates/pyqt/pyqt.kdevtemplate168
-rw-r--r--languages/python/app_templates/pyqt/pyqt.pngbin0 -> 8800 bytes
-rw-r--r--languages/python/app_templates/pyqt/templates-ui-dialog20
-rw-r--r--languages/python/app_templates/pyqt/templates-ui-mainwin436
-rw-r--r--languages/python/app_templates/python.appwizard2
-rw-r--r--languages/python/app_templates/pythonhello/.kdev_ignore0
-rw-r--r--languages/python/app_templates/pythonhello/Makefile.am15
-rw-r--r--languages/python/app_templates/pythonhello/app.kdevelop84
-rw-r--r--languages/python/app_templates/pythonhello/app.py7
-rw-r--r--languages/python/app_templates/pythonhello/pythonhello12
-rw-r--r--languages/python/app_templates/pythonhello/pythonhello.kdevtemplate107
-rw-r--r--languages/python/app_templates/pythonhello/pythonhello.pngbin0 -> 12443 bytes
-rw-r--r--languages/python/app_templates/pytk/.kdev_ignore0
-rw-r--r--languages/python/app_templates/pytk/Makefile.am15
-rw-r--r--languages/python/app_templates/pytk/app.kdevelop82
-rw-r--r--languages/python/app_templates/pytk/app.py4
-rw-r--r--languages/python/app_templates/pytk/pytk12
-rw-r--r--languages/python/app_templates/pytk/pytk.kdevtemplate107
-rw-r--r--languages/python/app_templates/pytk/pytk.pngbin0 -> 2420 bytes
-rw-r--r--languages/python/doc/Makefile.am6
-rw-r--r--languages/python/doc/python.toc1571
-rw-r--r--languages/python/doc/python_bugs.toc7
-rw-r--r--languages/python/file_templates/Makefile.am4
-rw-r--r--languages/python/file_templates/py7
-rwxr-xr-xlanguages/python/kde_pydoc.py131
-rw-r--r--languages/python/kdevpythonsupport.desktop85
-rw-r--r--languages/python/kdevpythonsupport.rc16
-rw-r--r--languages/python/pydoc.cpp113
-rw-r--r--languages/python/pydoc.h30
-rw-r--r--languages/python/pydoc.protocol9
-rw-r--r--languages/python/pythonconfigwidget.cpp38
-rw-r--r--languages/python/pythonconfigwidget.h34
-rw-r--r--languages/python/pythonconfigwidgetbase.ui121
-rw-r--r--languages/python/pythonimplementationwidget.cpp77
-rw-r--r--languages/python/pythonimplementationwidget.h37
-rw-r--r--languages/python/pythonsupportpart.cpp410
-rw-r--r--languages/python/pythonsupportpart.h66
-rw-r--r--languages/python/qtdesignerpythonintegration.cpp97
-rw-r--r--languages/python/qtdesignerpythonintegration.h37
-rw-r--r--languages/ruby/Makefile.am31
-rw-r--r--languages/ruby/README3
-rw-r--r--languages/ruby/README.dox43
-rw-r--r--languages/ruby/app_templates/Makefile.am3
-rw-r--r--languages/ruby/app_templates/dcopservice/Makefile.am18
-rw-r--r--languages/ruby/app_templates/dcopservice/app-configure.in.in51
-rw-r--r--languages/ruby/app_templates/dcopservice/app.cpp30
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopservice.desktop43
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopservice.kdevelop91
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopservice.rb37
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopserviceruby.kdevtemplate199
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopserviceruby.pngbin0 -> 23880 bytes
-rw-r--r--languages/ruby/app_templates/dcopservice/main.rb30
-rw-r--r--languages/ruby/app_templates/dcopservice/src-Makefile.am15
-rw-r--r--languages/ruby/app_templates/dcopservice/subdirs3
-rw-r--r--languages/ruby/app_templates/kapp/Makefile.am19
-rw-r--r--languages/ruby/app_templates/kapp/README81
-rw-r--r--languages/ruby/app_templates/kapp/app-Makefile.am1
-rw-r--r--languages/ruby/app_templates/kapp/app-configure.in.in45
-rw-r--r--languages/ruby/app_templates/kapp/app.cpp30
-rw-r--r--languages/ruby/app_templates/kapp/app.desktop44
-rw-r--r--languages/ruby/app_templates/kapp/app.kdevelop90
-rw-r--r--languages/ruby/app_templates/kapp/app.rb216
-rw-r--r--languages/ruby/app_templates/kapp/app_client.rb18
-rw-r--r--languages/ruby/app_templates/kapp/appiface.rb14
-rw-r--r--languages/ruby/app_templates/kapp/appui.rc8
-rw-r--r--languages/ruby/app_templates/kapp/appview.rb103
-rw-r--r--languages/ruby/app_templates/kapp/kappruby.kdevtemplate238
-rw-r--r--languages/ruby/app_templates/kapp/kappruby.pngbin0 -> 5063 bytes
-rw-r--r--languages/ruby/app_templates/kapp/main.rb40
-rw-r--r--languages/ruby/app_templates/kapp/pref.rb38
-rw-r--r--languages/ruby/app_templates/kapp/src-Makefile.am43
-rw-r--r--languages/ruby/app_templates/kapp/subdirs3
-rw-r--r--languages/ruby/app_templates/kxt/Makefile.am20
-rw-r--r--languages/ruby/app_templates/kxt/README38
-rw-r--r--languages/ruby/app_templates/kxt/app-Makefile.am1
-rw-r--r--languages/ruby/app_templates/kxt/app-configure.in.in45
-rw-r--r--languages/ruby/app_templates/kxt/app.cpp30
-rw-r--r--languages/ruby/app_templates/kxt/app.desktop40
-rw-r--r--languages/ruby/app_templates/kxt/app.kcfg21
-rw-r--r--languages/ruby/app_templates/kxt/app.kdevelop90
-rw-r--r--languages/ruby/app_templates/kxt/app.rb94
-rw-r--r--languages/ruby/app_templates/kxt/appui.rc8
-rw-r--r--languages/ruby/app_templates/kxt/appview.rb55
-rw-r--r--languages/ruby/app_templates/kxt/appview_base.ui33
-rw-r--r--languages/ruby/app_templates/kxt/kxtruby.kdevtemplate251
-rw-r--r--languages/ruby/app_templates/kxt/kxtruby.pngbin0 -> 7841 bytes
-rw-r--r--languages/ruby/app_templates/kxt/main.rb41
-rw-r--r--languages/ruby/app_templates/kxt/prefs-base.ui127
-rw-r--r--languages/ruby/app_templates/kxt/prefs.rb7
-rw-r--r--languages/ruby/app_templates/kxt/previewruby.pngbin0 -> 7712 bytes
-rw-r--r--languages/ruby/app_templates/kxt/settings.kcfgc6
-rw-r--r--languages/ruby/app_templates/kxt/src-Makefile.am48
-rw-r--r--languages/ruby/app_templates/kxt/subdirs3
-rw-r--r--languages/ruby/app_templates/qtruby/.kdev_ignore0
-rw-r--r--languages/ruby/app_templates/qtruby/Makefile.am16
-rw-r--r--languages/ruby/app_templates/qtruby/README29
-rw-r--r--languages/ruby/app_templates/qtruby/app-Makefile7
-rw-r--r--languages/ruby/app_templates/qtruby/app.filelist2
-rw-r--r--languages/ruby/app_templates/qtruby/app.kdevelop85
-rwxr-xr-xlanguages/ruby/app_templates/qtruby/app.rb12
-rw-r--r--languages/ruby/app_templates/qtruby/qtruby.kdevtemplate114
-rw-r--r--languages/ruby/app_templates/qtruby/qtruby.pngbin0 -> 3435 bytes
-rw-r--r--languages/ruby/app_templates/qtruby4app/Makefile.am20
-rw-r--r--languages/ruby/app_templates/qtruby4app/ReadMe6
-rw-r--r--languages/ruby/app_templates/qtruby4app/app-Makefile18
-rw-r--r--languages/ruby/app_templates/qtruby4app/app.filelist3
-rw-r--r--languages/ruby/app_templates/qtruby4app/application.qrc10
-rw-r--r--languages/ruby/app_templates/qtruby4app/editcopy.xpm193
-rw-r--r--languages/ruby/app_templates/qtruby4app/editcut.xpm252
-rw-r--r--languages/ruby/app_templates/qtruby4app/editpaste.xpm295
-rw-r--r--languages/ruby/app_templates/qtruby4app/filenew.xpm216
-rw-r--r--languages/ruby/app_templates/qtruby4app/fileopen.xpm295
-rw-r--r--languages/ruby/app_templates/qtruby4app/filesave.xpm295
-rw-r--r--languages/ruby/app_templates/qtruby4app/main.rb10
-rw-r--r--languages/ruby/app_templates/qtruby4app/qrc_application.rb2281
-rw-r--r--languages/ruby/app_templates/qtruby4app/qtruby4app.kdevelop83
-rw-r--r--languages/ruby/app_templates/qtruby4app/qtruby4app.kdevtemplate166
-rw-r--r--languages/ruby/app_templates/qtruby4app/qtruby4app.pngbin0 -> 16908 bytes
-rw-r--r--languages/ruby/app_templates/qtruby4app/qtruby4app.rb263
-rw-r--r--languages/ruby/app_templates/qtrubyapp/Makefile.am18
-rw-r--r--languages/ruby/app_templates/qtrubyapp/README29
-rw-r--r--languages/ruby/app_templates/qtrubyapp/app-Makefile7
-rw-r--r--languages/ruby/app_templates/qtrubyapp/app.filelist3
-rw-r--r--languages/ruby/app_templates/qtrubyapp/fileopen.xpm22
-rw-r--r--languages/ruby/app_templates/qtrubyapp/fileprint.xpm24
-rw-r--r--languages/ruby/app_templates/qtrubyapp/filesave.xpm22
-rw-r--r--languages/ruby/app_templates/qtrubyapp/main.rb10
-rw-r--r--languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevelop83
-rw-r--r--languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevtemplate140
-rw-r--r--languages/ruby/app_templates/qtrubyapp/qtrubyapp.pngbin0 -> 5245 bytes
-rw-r--r--languages/ruby/app_templates/qtrubyapp/qtrubyapp.rb253
-rw-r--r--languages/ruby/app_templates/rails/CMakeLists.txt20
-rw-r--r--languages/ruby/app_templates/rails/Makefile.am16
-rw-r--r--languages/ruby/app_templates/rails/app.kdevelop107
-rw-r--r--languages/ruby/app_templates/rails/rails.kdevtemplate72
-rw-r--r--languages/ruby/app_templates/rails/rails.pngbin0 -> 12062 bytes
-rw-r--r--languages/ruby/app_templates/ruby.appwizard2
-rw-r--r--languages/ruby/app_templates/rubyhello/.kdev_ignore0
-rw-r--r--languages/ruby/app_templates/rubyhello/Makefile.am16
-rw-r--r--languages/ruby/app_templates/rubyhello/app.kdevelop91
-rw-r--r--languages/ruby/app_templates/rubyhello/app.rb3
-rw-r--r--languages/ruby/app_templates/rubyhello/rubyhello9
-rw-r--r--languages/ruby/app_templates/rubyhello/rubyhello.kdevtemplate105
-rw-r--r--languages/ruby/app_templates/rubyhello/rubyhello.pngbin0 -> 483 bytes
-rw-r--r--languages/ruby/debugger/Makefile.am25
-rw-r--r--languages/ruby/debugger/breakpoint.cpp343
-rw-r--r--languages/ruby/debugger/breakpoint.h214
-rw-r--r--languages/ruby/debugger/dbgcommand.cpp47
-rw-r--r--languages/ruby/debugger/dbgcommand.h64
-rw-r--r--languages/ruby/debugger/dbgcontroller.cpp46
-rw-r--r--languages/ruby/debugger/dbgcontroller.h161
-rw-r--r--languages/ruby/debugger/dbgpsdlg.cpp170
-rw-r--r--languages/ruby/debugger/dbgpsdlg.h60
-rw-r--r--languages/ruby/debugger/dbgtoolbar.cpp483
-rw-r--r--languages/ruby/debugger/dbgtoolbar.h90
-rw-r--r--languages/ruby/debugger/debuggee.rb1214
-rw-r--r--languages/ruby/debugger/debuggerpart.cpp785
-rw-r--r--languages/ruby/debugger/debuggerpart.h110
-rw-r--r--languages/ruby/debugger/framestackwidget.cpp272
-rw-r--r--languages/ruby/debugger/framestackwidget.h115
-rw-r--r--languages/ruby/debugger/hi16-action-breakpoint_add.pngbin0 -> 225 bytes
-rw-r--r--languages/ruby/debugger/hi16-action-breakpoint_delete.pngbin0 -> 239 bytes
-rw-r--r--languages/ruby/debugger/hi16-action-breakpoint_delete_all.pngbin0 -> 239 bytes
-rw-r--r--languages/ruby/debugger/hi16-action-breakpoint_edit.pngbin0 -> 277 bytes
-rw-r--r--languages/ruby/debugger/kdevrbdebugger.desktop73
-rw-r--r--languages/ruby/debugger/kdevrbdebugger.rc68
-rw-r--r--languages/ruby/debugger/rdbbreakpointwidget.cpp921
-rw-r--r--languages/ruby/debugger/rdbbreakpointwidget.h120
-rw-r--r--languages/ruby/debugger/rdbcommand.cpp81
-rw-r--r--languages/ruby/debugger/rdbcommand.h99
-rw-r--r--languages/ruby/debugger/rdbcontroller.cpp1414
-rw-r--r--languages/ruby/debugger/rdbcontroller.h192
-rw-r--r--languages/ruby/debugger/rdboutputwidget.cpp171
-rw-r--r--languages/ruby/debugger/rdboutputwidget.h69
-rw-r--r--languages/ruby/debugger/rdbparser.cpp350
-rw-r--r--languages/ruby/debugger/rdbparser.h41
-rw-r--r--languages/ruby/debugger/rdbtable.cpp62
-rw-r--r--languages/ruby/debugger/rdbtable.h45
-rw-r--r--languages/ruby/debugger/stty.cpp370
-rw-r--r--languages/ruby/debugger/stty.h71
-rw-r--r--languages/ruby/debugger/variablewidget.cpp1018
-rw-r--r--languages/ruby/debugger/variablewidget.h348
-rw-r--r--languages/ruby/doc/Makefile.am6
-rw-r--r--languages/ruby/doc/qtruby.toc9
-rw-r--r--languages/ruby/doc/rails.toc9
-rw-r--r--languages/ruby/doc/ruby.toc1399
-rw-r--r--languages/ruby/doc/ruby_bugs.toc7
-rw-r--r--languages/ruby/file_templates/Makefile.am5
-rw-r--r--languages/ruby/file_templates/css11
-rw-r--r--languages/ruby/file_templates/html.erb4
-rw-r--r--languages/ruby/file_templates/js11
-rw-r--r--languages/ruby/file_templates/js.rjs7
-rw-r--r--languages/ruby/file_templates/rb7
-rw-r--r--languages/ruby/file_templates/rhtml4
-rw-r--r--languages/ruby/file_templates/rjs7
-rw-r--r--languages/ruby/file_templates/rxml7
-rw-r--r--languages/ruby/file_templates/xml.builder7
-rw-r--r--languages/ruby/kdevrubysupport.desktop84
-rw-r--r--languages/ruby/kdevrubysupport.rc20
-rw-r--r--languages/ruby/play_run.psdbin0 -> 58270 bytes
-rw-r--r--languages/ruby/qtdesignerrubyintegration.cpp93
-rw-r--r--languages/ruby/qtdesignerrubyintegration.h35
-rw-r--r--languages/ruby/ruby_config.pngbin0 -> 12433 bytes
-rw-r--r--languages/ruby/ruby_config.psdbin0 -> 55515 bytes
-rw-r--r--languages/ruby/ruby_run.pngbin0 -> 6986 bytes
-rw-r--r--languages/ruby/rubyconfigwidget.cpp53
-rw-r--r--languages/ruby/rubyconfigwidget.h27
-rw-r--r--languages/ruby/rubyconfigwidgetbase.ui363
-rw-r--r--languages/ruby/rubyimplementationwidget.cpp70
-rw-r--r--languages/ruby/rubyimplementationwidget.h35
-rw-r--r--languages/ruby/rubysupport_part.cpp908
-rw-r--r--languages/ruby/rubysupport_part.h74
-rw-r--r--languages/ruby/rubytemplates101
-rw-r--r--languages/sql/Makefile.am20
-rw-r--r--languages/sql/README.dox40
-rw-r--r--languages/sql/app_templates/Makefile.am3
-rw-r--r--languages/sql/app_templates/sql.appwizard2
-rw-r--r--languages/sql/app_templates/sqlsimple/.kdev_ignore0
-rw-r--r--languages/sql/app_templates/sqlsimple/Makefile.am16
-rw-r--r--languages/sql/app_templates/sqlsimple/app.kdevelop84
-rw-r--r--languages/sql/app_templates/sqlsimple/app.sql1
-rw-r--r--languages/sql/app_templates/sqlsimple/sqlsimple7
-rw-r--r--languages/sql/app_templates/sqlsimple/sqlsimple.kdevtemplate106
-rw-r--r--languages/sql/app_templates/sqlsimple/sqlsimple.pngbin0 -> 483 bytes
-rw-r--r--languages/sql/doc/Makefile.am6
-rw-r--r--languages/sql/kdevsqlsupport.desktop85
-rw-r--r--languages/sql/kdevsqlsupport.rc14
-rw-r--r--languages/sql/sqlactions.cpp103
-rw-r--r--languages/sql/sqlactions.h41
-rw-r--r--languages/sql/sqlconfigwidget.ui189
-rw-r--r--languages/sql/sqlconfigwidget.ui.h244
-rw-r--r--languages/sql/sqloutputwidget.cpp127
-rw-r--r--languages/sql/sqloutputwidget.h43
-rw-r--r--languages/sql/sqlsupport_part.cpp284
-rw-r--r--languages/sql/sqlsupport_part.h55
1713 files changed, 237231 insertions, 0 deletions
diff --git a/languages/Makefile.am b/languages/Makefile.am
new file mode 100644
index 00000000..1172b71c
--- /dev/null
+++ b/languages/Makefile.am
@@ -0,0 +1,74 @@
+##
+## Do NOT remove the comments that start with "kdevelop:"
+## They are actually directives to the kdevelop plugin system
+##
+## The include_xxxx variables are controlled by configure.in.in
+##
+
+if include_ada
+ADA_LANGUAGE = ada
+endif
+
+if include_bash
+BASH_LANGUAGE = bash
+endif
+
+if include_cpp
+CPP_LANGUAGE = cpp
+endif
+
+if include_fortran
+FORTRAN_LANGUAGE = fortran
+endif
+
+if include_java
+JAVA_LANGUAGE = java
+endif
+
+if include_csharp
+CSHARP_LANGUAGE = csharp
+endif
+
+if include_pascal
+PASCAL_LANGUAGE = pascal
+endif
+
+if include_perl
+PERL_LANGUAGE = perl
+endif
+
+if include_php
+PHP_LANGUAGE = php
+endif
+
+if include_python
+PYTHON_LANGUAGE = python
+endif
+
+if include_ruby
+RUBY_LANGUAGE = ruby
+endif
+
+if include_sql
+SQL_LANGUAGE = sql
+endif
+
+#kdevelop: ADA_LANGUAGE = ada
+#kdevelop: BASH_LANGUAGE = bash
+#kdevelop: CPP_LANGUAGE = cpp
+#kdevelop: FORTRAN_LANGUAGE = fortran
+#kdevelop: JAVA_LANGUAGE = java
+#kdevelop: CSHARP_LANGUAGE = csharp
+#kdevelop: PASCAL_LANGUAGE = pascal
+#kdevelop: PERL_LANGUAGE = perl
+#kdevelop: PHP_LANGUAGE = php
+#kdevelop: PYTHON_LANGUAGE = python
+#kdevelop: RUBY_LANGUAGE = ruby
+#kdevelop: SQL_LANGUAGE = sql
+
+SUBDIRS = lib $(ADA_LANGUAGE) $(BASH_LANGUAGE) $(CPP_LANGUAGE) $(CSHARP_LANGUAGE) \
+ $(FORTRAN_LANGUAGE) $(JAVA_LANGUAGE) $(PASCAL_LANGUAGE) \
+ $(PERL_LANGUAGE) $(PHP_LANGUAGE) $(PYTHON_LANGUAGE) $(RUBY_LANGUAGE) $(SQL_LANGUAGE)
+
+DOXYGEN_EMPTY = YES
+include ../Doxyfile.am
diff --git a/languages/ada/AdaAST.hpp b/languages/ada/AdaAST.hpp
new file mode 100644
index 00000000..1bb2bd07
--- /dev/null
+++ b/languages/ada/AdaAST.hpp
@@ -0,0 +1,77 @@
+#ifndef ADAAST_HPP
+#define ADAAST_HPP
+
+#include <antlr/CommonAST.hpp>
+
+class AdaAST;
+typedef antlr::ASTRefCount<AdaAST> RefAdaAST;
+
+class AdaAST : public antlr::CommonAST {
+public:
+ AdaAST() : m_line (0), m_column (0) {}
+
+ ~AdaAST() {}
+
+ int getLine () const { return m_line; }
+ void setLine (int line) { m_line = line; }
+
+ int getColumn () const { return m_column; }
+ void setColumn (int column) { m_column = column; }
+
+ void initialize (antlr::RefToken t) {
+ antlr::CommonAST::initialize (t);
+ m_line = t->getLine () - 1;
+ m_column = t->getColumn () - 1;
+ }
+
+ void initialize (int t, const std::string& txt) {
+ setType (t);
+ setText (txt);
+ m_line = 0;
+ m_column = 0;
+ }
+
+ RefAdaAST duplicate (void) const {
+ AdaAST *ast = new AdaAST (*this);
+ return RefAdaAST (ast);
+ }
+
+ void set (int t, const std::string& txt) {
+ setType (t);
+ setText (txt);
+ }
+
+ void addChild (RefAdaAST c) {
+ antlr::RefAST n( c.get() );
+ antlr::BaseAST::addChild (n);
+ }
+
+ RefAdaAST down () const {
+ return RefAdaAST (antlr::BaseAST::getFirstChild ());
+ }
+
+ RefAdaAST right () const {
+ return RefAdaAST (antlr::BaseAST::getNextSibling ());
+ }
+
+ /* bool equals(RefAdaAST t) const {
+ return ((antlr::BaseAST*)this)->equals (t);
+ } */
+
+ static antlr::RefAST factory (void) {
+ RefAdaAST n( new AdaAST );
+ return n.get();
+ }
+
+ static const RefAdaAST nullAdaAST;
+
+private:
+ int m_line;
+ int m_column;
+};
+
+#define Set(n, t) (n)->set(t, #t)
+// for Java compatibility:
+#define boolean bool
+
+#endif
diff --git a/languages/ada/AdaLexer.cpp b/languages/ada/AdaLexer.cpp
new file mode 100644
index 00000000..2ac19416
--- /dev/null
+++ b/languages/ada/AdaLexer.cpp
@@ -0,0 +1,1507 @@
+/* $ANTLR 2.7.7 (20070609): "ada.g" -> "AdaLexer.cpp"$ */
+#include "AdaLexer.hpp"
+#include <antlr/CharBuffer.hpp>
+#include <antlr/TokenStreamException.hpp>
+#include <antlr/TokenStreamIOException.hpp>
+#include <antlr/TokenStreamRecognitionException.hpp>
+#include <antlr/CharStreamException.hpp>
+#include <antlr/CharStreamIOException.hpp>
+#include <antlr/NoViableAltForCharException.hpp>
+
+#line 1531 "ada.g"
+
+#include "preambles.h"
+
+#line 16 "AdaLexer.cpp"
+AdaLexer::AdaLexer(ANTLR_USE_NAMESPACE(std)istream& in)
+ : ANTLR_USE_NAMESPACE(antlr)CharScanner(new ANTLR_USE_NAMESPACE(antlr)CharBuffer(in),false)
+{
+ initLiterals();
+}
+
+AdaLexer::AdaLexer(ANTLR_USE_NAMESPACE(antlr)InputBuffer& ib)
+ : ANTLR_USE_NAMESPACE(antlr)CharScanner(ib,false)
+{
+ initLiterals();
+}
+
+AdaLexer::AdaLexer(const ANTLR_USE_NAMESPACE(antlr)LexerSharedInputState& state)
+ : ANTLR_USE_NAMESPACE(antlr)CharScanner(state,false)
+{
+ initLiterals();
+}
+
+void AdaLexer::initLiterals()
+{
+ literals["until"] = 78;
+ literals["xor"] = 86;
+ literals["abstract"] = 40;
+ literals["reverse"] = 71;
+ literals["use"] = 13;
+ literals["requeue"] = 84;
+ literals["with"] = 11;
+ literals["task"] = 42;
+ literals["at"] = 49;
+ literals["for"] = 47;
+ literals["else"] = 68;
+ literals["is"] = 23;
+ literals["of"] = 55;
+ literals["range"] = 16;
+ literals["and"] = 85;
+ literals["begin"] = 62;
+ literals["procedure"] = 24;
+ literals["separate"] = 39;
+ literals["private"] = 20;
+ literals["pragma"] = 4;
+ literals["delay"] = 77;
+ literals["abort"] = 80;
+ literals["function"] = 25;
+ literals["digits"] = 17;
+ literals["declare"] = 72;
+ literals["raise"] = 83;
+ literals["not"] = 87;
+ literals["record"] = 38;
+ literals["all"] = 30;
+ literals["in"] = 32;
+ literals["generic"] = 61;
+ literals["terminate"] = 82;
+ literals["subtype"] = 51;
+ literals["delta"] = 18;
+ literals["when"] = 58;
+ literals["null"] = 37;
+ literals["entry"] = 46;
+ literals["elsif"] = 67;
+ literals["case"] = 57;
+ literals["others"] = 27;
+ literals["do"] = 76;
+ literals["abs"] = 100;
+ literals["constant"] = 53;
+ literals["renames"] = 34;
+ literals["then"] = 66;
+ literals["exception"] = 52;
+ literals["protected"] = 43;
+ literals["accept"] = 75;
+ literals["or"] = 81;
+ literals["if"] = 65;
+ literals["aliased"] = 56;
+ literals["loop"] = 69;
+ literals["return"] = 41;
+ literals["limited"] = 60;
+ literals["new"] = 26;
+ literals["array"] = 54;
+ literals["rem"] = 99;
+ literals["end"] = 48;
+ literals["body"] = 22;
+ literals["mod"] = 50;
+ literals["goto"] = 74;
+ literals["tagged"] = 59;
+ literals["select"] = 79;
+ literals["while"] = 70;
+ literals["package"] = 21;
+ literals["type"] = 14;
+ literals["access"] = 19;
+ literals["out"] = 33;
+ literals["exit"] = 73;
+}
+
+ANTLR_USE_NAMESPACE(antlr)RefToken AdaLexer::nextToken()
+{
+ ANTLR_USE_NAMESPACE(antlr)RefToken theRetToken;
+ for (;;) {
+ ANTLR_USE_NAMESPACE(antlr)RefToken theRetToken;
+ int _ttype = ANTLR_USE_NAMESPACE(antlr)Token::INVALID_TYPE;
+ resetText();
+ try { // for lexical and char stream error handling
+ switch ( LA(1)) {
+ case 0x7c /* '|' */ :
+ {
+ mPIPE(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x26 /* '&' */ :
+ {
+ mCONCAT(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x2b /* '+' */ :
+ {
+ mPLUS(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x28 /* '(' */ :
+ {
+ mLPAREN(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x29 /* ')' */ :
+ {
+ mRPAREN(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x2c /* ',' */ :
+ {
+ mCOMMA(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x3b /* ';' */ :
+ {
+ mSEMI(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ case 0x67 /* 'g' */ :
+ case 0x68 /* 'h' */ :
+ case 0x69 /* 'i' */ :
+ case 0x6a /* 'j' */ :
+ case 0x6b /* 'k' */ :
+ case 0x6c /* 'l' */ :
+ case 0x6d /* 'm' */ :
+ case 0x6e /* 'n' */ :
+ case 0x6f /* 'o' */ :
+ case 0x70 /* 'p' */ :
+ case 0x71 /* 'q' */ :
+ case 0x72 /* 'r' */ :
+ case 0x73 /* 's' */ :
+ case 0x74 /* 't' */ :
+ case 0x75 /* 'u' */ :
+ case 0x76 /* 'v' */ :
+ case 0x77 /* 'w' */ :
+ case 0x78 /* 'x' */ :
+ case 0x79 /* 'y' */ :
+ case 0x7a /* 'z' */ :
+ {
+ mIDENTIFIER(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x27 /* '\'' */ :
+ {
+ mTIC_OR_CHARACTER_LITERAL(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x22 /* '\"' */ :
+ {
+ mCHAR_STRING(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ mNUMERIC_LIT(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x9 /* '\t' */ :
+ case 0xa /* '\n' */ :
+ case 0xc /* '\14' */ :
+ case 0xd /* '\r' */ :
+ case 0x20 /* ' ' */ :
+ {
+ mWS_(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ default:
+ if ((LA(1) == 0x2d /* '-' */ ) && (LA(2) == 0x2d /* '-' */ ) && ((LA(3) >= 0x3 /* '\3' */ && LA(3) <= 0xff))) {
+ mCOMMENT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2d /* '-' */ ) && (LA(2) == 0x2d /* '-' */ ) && (true)) {
+ mCOMMENT_INTRO(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2e /* '.' */ ) && (LA(2) == 0x2e /* '.' */ )) {
+ mDOT_DOT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3c /* '<' */ )) {
+ mLT_LT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3e /* '>' */ )) {
+ mOX(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3e /* '>' */ )) {
+ mGT_GT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3a /* ':' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3d /* '=' */ ) && (LA(2) == 0x3e /* '>' */ )) {
+ mRIGHT_SHAFT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2f /* '/' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mNE(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mLE(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mGE(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2a /* '*' */ ) && (LA(2) == 0x2a /* '*' */ )) {
+ mEXPON(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2e /* '.' */ ) && (true)) {
+ mDOT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3d /* '=' */ ) && (true)) {
+ mEQ(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (true)) {
+ mLT_(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (true)) {
+ mGT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2d /* '-' */ ) && (true)) {
+ mMINUS(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2a /* '*' */ ) && (true)) {
+ mSTAR(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2f /* '/' */ ) && (true)) {
+ mDIV(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3a /* ':' */ ) && (true)) {
+ mCOLON(true);
+ theRetToken=_returnToken;
+ }
+ else {
+ if (LA(1)==EOF_CHAR)
+ {
+ uponEOF();
+ _returnToken = makeToken(ANTLR_USE_NAMESPACE(antlr)Token::EOF_TYPE);
+ }
+ else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+ }
+ if ( !_returnToken )
+ goto tryAgain; // found SKIP token
+
+ _ttype = _returnToken->getType();
+ _returnToken->setType(_ttype);
+ return _returnToken;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& e) {
+ throw ANTLR_USE_NAMESPACE(antlr)TokenStreamRecognitionException(e);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)CharStreamIOException& csie) {
+ throw ANTLR_USE_NAMESPACE(antlr)TokenStreamIOException(csie.io);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)CharStreamException& cse) {
+ throw ANTLR_USE_NAMESPACE(antlr)TokenStreamException(cse.getMessage());
+ }
+tryAgain:;
+ }
+}
+
+void AdaLexer::mCOMMENT_INTRO(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COMMENT_INTRO;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("--");
+#line 1888 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 345 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mDOT_DOT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = DOT_DOT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("..");
+#line 1889 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 362 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mLT_LT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LT_LT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("<<");
+#line 1890 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 379 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mOX(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = OX;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("<>");
+#line 1891 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 396 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mGT_GT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = GT_GT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(">>");
+#line 1892 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 413 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(":=");
+#line 1893 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 430 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mRIGHT_SHAFT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = RIGHT_SHAFT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("=>");
+#line 1894 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 447 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mNE(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = NE;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("/=");
+#line 1895 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 464 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mLE(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LE;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("<=");
+#line 1896 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 481 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mGE(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = GE;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(">=");
+#line 1897 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 498 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mEXPON(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = EXPON;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("**");
+#line 1898 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 515 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mPIPE(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = PIPE;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('|' /* charlit */ );
+#line 1899 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 532 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mCONCAT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = CONCAT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('&' /* charlit */ );
+#line 1900 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 549 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mDOT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = DOT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('.' /* charlit */ );
+#line 1901 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 566 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mEQ(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = EQ;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('=' /* charlit */ );
+#line 1902 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 583 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mLT_(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LT_;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('<' /* charlit */ );
+#line 1903 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 600 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mGT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = GT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('>' /* charlit */ );
+#line 1904 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 617 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mPLUS(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = PLUS;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('+' /* charlit */ );
+#line 1905 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 634 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mMINUS(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = MINUS;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('-' /* charlit */ );
+#line 1906 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 651 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mSTAR(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = STAR;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('*' /* charlit */ );
+#line 1907 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 668 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mDIV(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = DIV;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('/' /* charlit */ );
+#line 1908 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 685 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mLPAREN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LPAREN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('(' /* charlit */ );
+#line 1909 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 702 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mRPAREN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = RPAREN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(')' /* charlit */ );
+#line 1910 "ada.g"
+ lastTokenWasTicCompatible=true;
+#line 719 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mCOLON(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COLON;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(':' /* charlit */ );
+#line 1911 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 736 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mCOMMA(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COMMA;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(',' /* charlit */ );
+#line 1912 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 753 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mSEMI(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SEMI;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(';' /* charlit */ );
+#line 1913 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 770 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mIDENTIFIER(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = IDENTIFIER;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ matchRange('a','z');
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_0.member(LA(1)))) {
+ {
+ switch ( LA(1)) {
+ case 0x5f /* '_' */ :
+ {
+ match('_' /* charlit */ );
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ case 0x67 /* 'g' */ :
+ case 0x68 /* 'h' */ :
+ case 0x69 /* 'i' */ :
+ case 0x6a /* 'j' */ :
+ case 0x6b /* 'k' */ :
+ case 0x6c /* 'l' */ :
+ case 0x6d /* 'm' */ :
+ case 0x6e /* 'n' */ :
+ case 0x6f /* 'o' */ :
+ case 0x70 /* 'p' */ :
+ case 0x71 /* 'q' */ :
+ case 0x72 /* 'r' */ :
+ case 0x73 /* 's' */ :
+ case 0x74 /* 't' */ :
+ case 0x75 /* 'u' */ :
+ case 0x76 /* 'v' */ :
+ case 0x77 /* 'w' */ :
+ case 0x78 /* 'x' */ :
+ case 0x79 /* 'y' */ :
+ case 0x7a /* 'z' */ :
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ case 0x67 /* 'g' */ :
+ case 0x68 /* 'h' */ :
+ case 0x69 /* 'i' */ :
+ case 0x6a /* 'j' */ :
+ case 0x6b /* 'k' */ :
+ case 0x6c /* 'l' */ :
+ case 0x6d /* 'm' */ :
+ case 0x6e /* 'n' */ :
+ case 0x6f /* 'o' */ :
+ case 0x70 /* 'p' */ :
+ case 0x71 /* 'q' */ :
+ case 0x72 /* 'r' */ :
+ case 0x73 /* 's' */ :
+ case 0x74 /* 't' */ :
+ case 0x75 /* 'u' */ :
+ case 0x76 /* 'v' */ :
+ case 0x77 /* 'w' */ :
+ case 0x78 /* 'x' */ :
+ case 0x79 /* 'y' */ :
+ case 0x7a /* 'z' */ :
+ {
+ matchRange('a','z');
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ matchRange('0','9');
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ }
+ else {
+ goto _loop512;
+ }
+
+ }
+ _loop512:;
+ } // ( ... )*
+ _ttype = testLiteralsTable(_ttype);
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mTIC_OR_CHARACTER_LITERAL(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = TIC_OR_CHARACTER_LITERAL;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ _saveIndex = text.length();
+ match("\'");
+ text.erase(_saveIndex);
+#line 1927 "ada.g"
+ _ttype = TIC;
+#line 921 "AdaLexer.cpp"
+ {
+ if ((((LA(1) >= 0x3 /* '\3' */ && LA(1) <= 0xff)))&&( ! lastTokenWasTicCompatible )) {
+ matchNot(EOF/*_CHAR*/);
+ _saveIndex = text.length();
+ match("\'");
+ text.erase(_saveIndex);
+#line 1929 "ada.g"
+ _ttype = CHARACTER_LITERAL;
+#line 930 "AdaLexer.cpp"
+ }
+ else {
+ }
+
+ }
+#line 1931 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 938 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mCHAR_STRING(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = CHAR_STRING;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ _saveIndex = text.length();
+ match('\"' /* charlit */ );
+ text.erase(_saveIndex);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == 0x22 /* '\"' */ ) && (LA(2) == 0x22 /* '\"' */ )) {
+ match("\"\"");
+ }
+ else if ((_tokenSet_1.member(LA(1)))) {
+ {
+ match(_tokenSet_1);
+ }
+ }
+ else {
+ goto _loop518;
+ }
+
+ }
+ _loop518:;
+ } // ( ... )*
+ _saveIndex = text.length();
+ match('\"' /* charlit */ );
+ text.erase(_saveIndex);
+#line 1934 "ada.g"
+ lastTokenWasTicCompatible=true;
+#line 977 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mNUMERIC_LIT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = NUMERIC_LIT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ { // ( ... )+
+ int _cnt521=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ mDIGIT(false);
+ }
+ else {
+ if ( _cnt521>=1 ) { goto _loop521; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt521++;
+ }
+ _loop521:;
+ } // ( ... )+
+ {
+ switch ( LA(1)) {
+ case 0x23 /* '#' */ :
+ {
+ match('#' /* charlit */ );
+ mBASED_INTEGER(false);
+ {
+ switch ( LA(1)) {
+ case 0x2e /* '.' */ :
+ {
+ match('.' /* charlit */ );
+ mBASED_INTEGER(false);
+ break;
+ }
+ case 0x23 /* '#' */ :
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ match('#' /* charlit */ );
+ break;
+ }
+ case 0x5f /* '_' */ :
+ {
+ { // ( ... )+
+ int _cnt527=0;
+ for (;;) {
+ if ((LA(1) == 0x5f /* '_' */ )) {
+ match('_' /* charlit */ );
+ { // ( ... )+
+ int _cnt526=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ mDIGIT(false);
+ }
+ else {
+ if ( _cnt526>=1 ) { goto _loop526; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt526++;
+ }
+ _loop526:;
+ } // ( ... )+
+ }
+ else {
+ if ( _cnt527>=1 ) { goto _loop527; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt527++;
+ }
+ _loop527:;
+ } // ( ... )+
+ break;
+ }
+ default:
+ {
+ }
+ }
+ }
+ {
+ if (((LA(1) == 0x2e /* '.' */ || LA(1) == 0x65 /* 'e' */ ))&&( LA(2)!='.' )) {
+ {
+ switch ( LA(1)) {
+ case 0x2e /* '.' */ :
+ {
+ match('.' /* charlit */ );
+ { // ( ... )+
+ int _cnt531=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ mDIGIT(false);
+ }
+ else {
+ if ( _cnt531>=1 ) { goto _loop531; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt531++;
+ }
+ _loop531:;
+ } // ( ... )+
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == 0x5f /* '_' */ )) {
+ match('_' /* charlit */ );
+ { // ( ... )+
+ int _cnt534=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ mDIGIT(false);
+ }
+ else {
+ if ( _cnt534>=1 ) { goto _loop534; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt534++;
+ }
+ _loop534:;
+ } // ( ... )+
+ }
+ else {
+ goto _loop535;
+ }
+
+ }
+ _loop535:;
+ } // ( ... )*
+ {
+ if ((LA(1) == 0x65 /* 'e' */ )) {
+ mEXPONENT(false);
+ }
+ else {
+ }
+
+ }
+ break;
+ }
+ case 0x65 /* 'e' */ :
+ {
+ mEXPONENT(false);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ }
+ else {
+ }
+
+ }
+#line 1945 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 1144 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mDIGIT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = DIGIT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ matchRange('0','9');
+ }
+#line 1950 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 1163 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mBASED_INTEGER(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BASED_INTEGER;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ mEXTENDED_DIGIT(false);
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_2.member(LA(1)))) {
+ {
+ switch ( LA(1)) {
+ case 0x5f /* '_' */ :
+ {
+ match('_' /* charlit */ );
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ mEXTENDED_DIGIT(false);
+ }
+ else {
+ goto _loop550;
+ }
+
+ }
+ _loop550:;
+ } // ( ... )*
+#line 1959 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 1226 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mEXPONENT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = EXPONENT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ match('e' /* charlit */ );
+ }
+ {
+ switch ( LA(1)) {
+ case 0x2b /* '+' */ :
+ {
+ match('+' /* charlit */ );
+ break;
+ }
+ case 0x2d /* '-' */ :
+ {
+ match('-' /* charlit */ );
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ { // ( ... )+
+ int _cnt543=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ mDIGIT(false);
+ }
+ else {
+ if ( _cnt543>=1 ) { goto _loop543; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt543++;
+ }
+ _loop543:;
+ } // ( ... )+
+#line 1953 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 1290 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mEXTENDED_DIGIT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = EXTENDED_DIGIT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ switch ( LA(1)) {
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ mDIGIT(false);
+ break;
+ }
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ {
+ matchRange('a','f');
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+#line 1956 "ada.g"
+ lastTokenWasTicCompatible=false;
+#line 1338 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mWS_(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = WS_;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ switch ( LA(1)) {
+ case 0x20 /* ' ' */ :
+ {
+ match(' ' /* charlit */ );
+ break;
+ }
+ case 0x9 /* '\t' */ :
+ {
+ match('\t' /* charlit */ );
+ break;
+ }
+ case 0xc /* '\14' */ :
+ {
+ match('\14' /* charlit */ );
+ break;
+ }
+ case 0xa /* '\n' */ :
+ case 0xd /* '\r' */ :
+ {
+ {
+ if ((LA(1) == 0xd /* '\r' */ ) && (LA(2) == 0xa /* '\n' */ )) {
+ match("\r\n");
+ }
+ else if ((LA(1) == 0xd /* '\r' */ ) && (true)) {
+ match('\r' /* charlit */ );
+ }
+ else if ((LA(1) == 0xa /* '\n' */ )) {
+ match('\n' /* charlit */ );
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+
+ }
+#line 1971 "ada.g"
+ newline();
+#line 1389 "AdaLexer.cpp"
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+#line 1973 "ada.g"
+ _ttype = antlr::Token::SKIP;
+#line 1400 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void AdaLexer::mCOMMENT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COMMENT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ mCOMMENT_INTRO(false);
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_3.member(LA(1)))) {
+ {
+ match(_tokenSet_3);
+ }
+ }
+ else {
+ goto _loop557;
+ }
+
+ }
+ _loop557:;
+ } // ( ... )*
+ {
+ switch ( LA(1)) {
+ case 0xa /* '\n' */ :
+ {
+ match('\n' /* charlit */ );
+ break;
+ }
+ case 0xd /* '\r' */ :
+ {
+ match('\r' /* charlit */ );
+ {
+ if ((LA(1) == 0xa /* '\n' */ )) {
+ match('\n' /* charlit */ );
+ }
+ else {
+ }
+
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+#line 1978 "ada.g"
+ _ttype = antlr::Token::SKIP;
+ newline();
+ lastTokenWasTicCompatible=false;
+#line 1459 "AdaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+
+const unsigned long AdaLexer::_tokenSet_0_data_[] = { 0UL, 67043328UL, 2147483648UL, 134217726UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0 1 2 3 4 5 6 7 8 9 _ a b c d e f g h i j k l m n o p q r s t u v w
+// x y z
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaLexer::_tokenSet_0(_tokenSet_0_data_,10);
+const unsigned long AdaLexer::_tokenSet_1_data_[] = { 4294967288UL, 4294967291UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 0x11 0x12 0x13
+// 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f ! # $
+// % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F
+// G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a b c d e f g
+// h i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81 0x82 0x83
+// 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90 0x91
+// 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c 0x9d 0x9e 0x9f
+// 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab 0xac 0xad
+// 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9 0xba 0xbb
+// 0xbc 0xbd 0xbe 0xbf 0xc0 0xc1 0xc2 0xc3 0xc4 0xc5 0xc6 0xc7 0xc8 0xc9
+// 0xca 0xcb 0xcc 0xcd 0xce 0xcf 0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7
+// 0xd8 0xd9 0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 0xe1 0xe2 0xe3 0xe4 0xe5
+// 0xe6 0xe7 0xe8 0xe9 0xea 0xeb 0xec 0xed 0xee 0xef 0xf0 0xf1 0xf2 0xf3
+// 0xf4 0xf5 0xf6 0xf7 0xf8 0xf9 0xfa 0xfb 0xfc 0xfd 0xfe 0xff
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaLexer::_tokenSet_1(_tokenSet_1_data_,16);
+const unsigned long AdaLexer::_tokenSet_2_data_[] = { 0UL, 67043328UL, 2147483648UL, 126UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0 1 2 3 4 5 6 7 8 9 _ a b c d e f
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaLexer::_tokenSet_2(_tokenSet_2_data_,10);
+const unsigned long AdaLexer::_tokenSet_3_data_[] = { 4294958072UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12 0x13 0x14
+// 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f ! \" # $ %
+// & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G
+// H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a b c d e f g h
+// i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81 0x82 0x83
+// 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90 0x91
+// 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c 0x9d 0x9e 0x9f
+// 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab 0xac 0xad
+// 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9 0xba 0xbb
+// 0xbc 0xbd 0xbe 0xbf 0xc0 0xc1 0xc2 0xc3 0xc4 0xc5 0xc6 0xc7 0xc8 0xc9
+// 0xca 0xcb 0xcc 0xcd 0xce 0xcf 0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7
+// 0xd8 0xd9 0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 0xe1 0xe2 0xe3 0xe4 0xe5
+// 0xe6 0xe7 0xe8 0xe9 0xea 0xeb 0xec 0xed 0xee 0xef 0xf0 0xf1 0xf2 0xf3
+// 0xf4 0xf5 0xf6 0xf7 0xf8 0xf9 0xfa 0xfb 0xfc 0xfd 0xfe 0xff
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaLexer::_tokenSet_3(_tokenSet_3_data_,16);
+
diff --git a/languages/ada/AdaLexer.hpp b/languages/ada/AdaLexer.hpp
new file mode 100644
index 00000000..795c7bba
--- /dev/null
+++ b/languages/ada/AdaLexer.hpp
@@ -0,0 +1,86 @@
+#ifndef INC_AdaLexer_hpp_
+#define INC_AdaLexer_hpp_
+
+#line 29 "ada.g"
+
+#include <antlr/SemanticException.hpp> // antlr wants this
+#include "AdaAST.hpp"
+#include "preambles.h"
+
+#line 11 "AdaLexer.hpp"
+#include <antlr/config.hpp>
+/* $ANTLR 2.7.7 (20070609): "ada.g" -> "AdaLexer.hpp"$ */
+#include <antlr/CommonToken.hpp>
+#include <antlr/InputBuffer.hpp>
+#include <antlr/BitSet.hpp>
+#include "AdaTokenTypes.hpp"
+#include <antlr/CharScanner.hpp>
+class CUSTOM_API AdaLexer : public ANTLR_USE_NAMESPACE(antlr)CharScanner, public AdaTokenTypes
+{
+#line 1879 "ada.g"
+
+ ANTLR_LEXER_PREAMBLE
+ private:
+ bool lastTokenWasTicCompatible;
+#line 22 "AdaLexer.hpp"
+private:
+ void initLiterals();
+public:
+ bool getCaseSensitiveLiterals() const
+ {
+ return false;
+ }
+public:
+ AdaLexer(ANTLR_USE_NAMESPACE(std)istream& in);
+ AdaLexer(ANTLR_USE_NAMESPACE(antlr)InputBuffer& ib);
+ AdaLexer(const ANTLR_USE_NAMESPACE(antlr)LexerSharedInputState& state);
+ ANTLR_USE_NAMESPACE(antlr)RefToken nextToken();
+ public: void mCOMMENT_INTRO(bool _createToken);
+ public: void mDOT_DOT(bool _createToken);
+ public: void mLT_LT(bool _createToken);
+ public: void mOX(bool _createToken);
+ public: void mGT_GT(bool _createToken);
+ public: void mASSIGN(bool _createToken);
+ public: void mRIGHT_SHAFT(bool _createToken);
+ public: void mNE(bool _createToken);
+ public: void mLE(bool _createToken);
+ public: void mGE(bool _createToken);
+ public: void mEXPON(bool _createToken);
+ public: void mPIPE(bool _createToken);
+ public: void mCONCAT(bool _createToken);
+ public: void mDOT(bool _createToken);
+ public: void mEQ(bool _createToken);
+ public: void mLT_(bool _createToken);
+ public: void mGT(bool _createToken);
+ public: void mPLUS(bool _createToken);
+ public: void mMINUS(bool _createToken);
+ public: void mSTAR(bool _createToken);
+ public: void mDIV(bool _createToken);
+ public: void mLPAREN(bool _createToken);
+ public: void mRPAREN(bool _createToken);
+ public: void mCOLON(bool _createToken);
+ public: void mCOMMA(bool _createToken);
+ public: void mSEMI(bool _createToken);
+ public: void mIDENTIFIER(bool _createToken);
+ public: void mTIC_OR_CHARACTER_LITERAL(bool _createToken);
+ public: void mCHAR_STRING(bool _createToken);
+ public: void mNUMERIC_LIT(bool _createToken);
+ protected: void mDIGIT(bool _createToken);
+ protected: void mBASED_INTEGER(bool _createToken);
+ protected: void mEXPONENT(bool _createToken);
+ protected: void mEXTENDED_DIGIT(bool _createToken);
+ public: void mWS_(bool _createToken);
+ public: void mCOMMENT(bool _createToken);
+private:
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+ static const unsigned long _tokenSet_2_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2;
+ static const unsigned long _tokenSet_3_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3;
+};
+
+#endif /*INC_AdaLexer_hpp_*/
diff --git a/languages/ada/AdaParser.cpp b/languages/ada/AdaParser.cpp
new file mode 100644
index 00000000..e783595e
--- /dev/null
+++ b/languages/ada/AdaParser.cpp
@@ -0,0 +1,12283 @@
+/* $ANTLR 2.7.7 (20070609): "ada.g" -> "AdaParser.cpp"$ */
+#include "AdaParser.hpp"
+#include <antlr/NoViableAltException.hpp>
+#include <antlr/SemanticException.hpp>
+#include <antlr/ASTFactory.hpp>
+#line 1 "ada.g"
+#line 8 "AdaParser.cpp"
+AdaParser::AdaParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf, int k)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(tokenBuf,k)
+{
+}
+
+AdaParser::AdaParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(tokenBuf,2)
+{
+}
+
+AdaParser::AdaParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer, int k)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(lexer,k)
+{
+}
+
+AdaParser::AdaParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(lexer,2)
+{
+}
+
+AdaParser::AdaParser(const ANTLR_USE_NAMESPACE(antlr)ParserSharedInputState& state)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(state,2)
+{
+}
+
+void AdaParser::compilation_unit() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST compilation_unit_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ context_items_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case PRIVATE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case GENERIC:
+ {
+ library_item();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEPARATE:
+ {
+ subunit();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == PRAGMA)) {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop4;
+ }
+
+ }
+ _loop4:;
+ } // ( ... )*
+ compilation_unit_AST = RefAdaAST(currentAST.root);
+ returnAST = compilation_unit_AST;
+}
+
+void AdaParser::context_items_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST context_items_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case WITH:
+ {
+ with_clause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case USE:
+ {
+ use_clause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop14;
+ }
+ }
+ }
+ _loop14:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ context_items_opt_AST = RefAdaAST(currentAST.root);
+#line 86 "ada.g"
+ context_items_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(CONTEXT_CLAUSE,"CONTEXT_CLAUSE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(context_items_opt_AST))));
+#line 135 "AdaParser.cpp"
+ currentAST.root = context_items_opt_AST;
+ if ( context_items_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ context_items_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = context_items_opt_AST->getFirstChild();
+ else
+ currentAST.child = context_items_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ context_items_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = context_items_opt_AST;
+}
+
+void AdaParser::library_item() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST library_item_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ private_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case PACKAGE:
+ {
+ lib_pkg_spec_or_body();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ subprog_decl_or_rename_or_inst_or_body(true);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case GENERIC:
+ {
+ generic_decl(true);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ library_item_AST = RefAdaAST(currentAST.root);
+#line 133 "ada.g"
+ library_item_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(LIBRARY_ITEM,"LIBRARY_ITEM")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(library_item_AST))));
+#line 194 "AdaParser.cpp"
+ currentAST.root = library_item_AST;
+ if ( library_item_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ library_item_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = library_item_AST->getFirstChild();
+ else
+ currentAST.child = library_item_AST;
+ currentAST.advanceChildToEnd();
+ }
+ library_item_AST = RefAdaAST(currentAST.root);
+ returnAST = library_item_AST;
+}
+
+void AdaParser::subunit() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST subunit_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken sep = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST sep_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ sep = LT(1);
+ if ( inputState->guessing == 0 ) {
+ sep_AST = astFactory->create(sep);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(sep_AST));
+ }
+ match(SEPARATE);
+ match(LPAREN);
+ compound_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 1497 "ada.g"
+ Set(sep_AST, SUBUNIT);
+#line 229 "AdaParser.cpp"
+ }
+ {
+ switch ( LA(1)) {
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ subprogram_body();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PACKAGE:
+ {
+ package_body();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case TASK:
+ {
+ task_body();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PROTECTED:
+ {
+ protected_body();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ subunit_AST = RefAdaAST(currentAST.root);
+ returnAST = subunit_AST;
+}
+
+void AdaParser::pragma() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST pragma_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ RefAdaAST tmp3_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp3_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp3_AST));
+ }
+ match(PRAGMA);
+ RefAdaAST tmp4_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp4_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp4_AST));
+ }
+ match(IDENTIFIER);
+ pragma_args_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ pragma_AST = RefAdaAST(currentAST.root);
+ returnAST = pragma_AST;
+}
+
+void AdaParser::pragma_args_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST pragma_args_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ pragma_arg();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ pragma_arg();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop9;
+ }
+
+ }
+ _loop9:;
+ } // ( ... )*
+ match(RPAREN);
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ pragma_args_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = pragma_args_opt_AST;
+}
+
+void AdaParser::pragma_arg() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST pragma_arg_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ if ((LA(1) == IDENTIFIER) && (LA(2) == RIGHT_SHAFT)) {
+ RefAdaAST tmp9_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp9_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp9_AST));
+ }
+ match(IDENTIFIER);
+ RefAdaAST tmp10_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp10_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp10_AST));
+ }
+ match(RIGHT_SHAFT);
+ }
+ else if ((_tokenSet_0.member(LA(1))) && (_tokenSet_1.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ pragma_arg_AST = RefAdaAST(currentAST.root);
+ returnAST = pragma_arg_AST;
+}
+
+void AdaParser::expression() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST expression_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken a = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST a_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken o = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST o_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ relation();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case AND:
+ {
+ a = LT(1);
+ if ( inputState->guessing == 0 ) {
+ a_AST = astFactory->create(a);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(a_AST));
+ }
+ match(AND);
+ {
+ switch ( LA(1)) {
+ case THEN:
+ {
+ match(THEN);
+ if ( inputState->guessing==0 ) {
+#line 1417 "ada.g"
+ Set (a_AST, AND_THEN);
+#line 416 "AdaParser.cpp"
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case ABS:
+ case NUMERIC_LIT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ relation();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case OR:
+ {
+ o = LT(1);
+ if ( inputState->guessing == 0 ) {
+ o_AST = astFactory->create(o);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(o_AST));
+ }
+ match(OR);
+ {
+ switch ( LA(1)) {
+ case ELSE:
+ {
+ match(ELSE);
+ if ( inputState->guessing==0 ) {
+#line 1418 "ada.g"
+ Set (o_AST, OR_ELSE);
+#line 462 "AdaParser.cpp"
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case ABS:
+ case NUMERIC_LIT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ relation();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case XOR:
+ {
+ RefAdaAST tmp13_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp13_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp13_AST));
+ }
+ match(XOR);
+ relation();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop450;
+ }
+ }
+ }
+ _loop450:;
+ } // ( ... )*
+ expression_AST = RefAdaAST(currentAST.root);
+ returnAST = expression_AST;
+}
+
+void AdaParser::with_clause() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST with_clause_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken w = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST w_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ w = LT(1);
+ if ( inputState->guessing == 0 ) {
+ w_AST = astFactory->create(w);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(w_AST));
+ }
+ match(WITH);
+ c_name_list();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 94 "ada.g"
+ Set(w_AST, WITH_CLAUSE);
+#line 539 "AdaParser.cpp"
+ }
+ with_clause_AST = RefAdaAST(currentAST.root);
+ returnAST = with_clause_AST;
+}
+
+void AdaParser::use_clause() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST use_clause_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken u = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST u_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ u = LT(1);
+ if ( inputState->guessing == 0 ) {
+ u_AST = astFactory->create(u);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(u_AST));
+ }
+ match(USE);
+ {
+ switch ( LA(1)) {
+ case TYPE:
+ {
+ match(TYPE);
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop25;
+ }
+
+ }
+ _loop25:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+#line 108 "ada.g"
+ Set(u_AST, USE_TYPE_CLAUSE);
+#line 586 "AdaParser.cpp"
+ }
+ break;
+ }
+ case IDENTIFIER:
+ {
+ c_name_list();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 109 "ada.g"
+ Set(u_AST, USE_CLAUSE);
+#line 599 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ use_clause_AST = RefAdaAST(currentAST.root);
+ returnAST = use_clause_AST;
+}
+
+void AdaParser::c_name_list() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST c_name_list_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ compound_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ compound_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop18;
+ }
+
+ }
+ _loop18:;
+ } // ( ... )*
+ c_name_list_AST = RefAdaAST(currentAST.root);
+ returnAST = c_name_list_AST;
+}
+
+void AdaParser::compound_name() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST compound_name_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ RefAdaAST tmp19_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp19_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp19_AST));
+ }
+ match(IDENTIFIER);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == DOT)) {
+ RefAdaAST tmp20_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp20_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp20_AST));
+ }
+ match(DOT);
+ RefAdaAST tmp21_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp21_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp21_AST));
+ }
+ match(IDENTIFIER);
+ }
+ else {
+ goto _loop21;
+ }
+
+ }
+ _loop21:;
+ } // ( ... )*
+ compound_name_AST = RefAdaAST(currentAST.root);
+ returnAST = compound_name_AST;
+}
+
+void AdaParser::subtype_mark() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST subtype_mark_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ compound_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case TIC:
+ {
+ RefAdaAST tmp22_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp22_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp22_AST));
+ }
+ match(TIC);
+ attribute_id();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case LPAREN:
+ case COMMA:
+ case RPAREN:
+ case RIGHT_SHAFT:
+ case WITH:
+ case USE:
+ case RANGE:
+ case DIGITS:
+ case DELTA:
+ case IS:
+ case PIPE:
+ case DOT_DOT:
+ case RENAMES:
+ case ASSIGN:
+ case AT:
+ case THEN:
+ case LOOP:
+ case OR:
+ case AND:
+ case XOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ subtype_mark_AST = RefAdaAST(currentAST.root);
+ returnAST = subtype_mark_AST;
+}
+
+void AdaParser::attribute_id() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST attribute_id_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case RANGE:
+ {
+ RefAdaAST tmp23_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp23_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp23_AST));
+ }
+ match(RANGE);
+ attribute_id_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case DIGITS:
+ {
+ RefAdaAST tmp24_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp24_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp24_AST));
+ }
+ match(DIGITS);
+ attribute_id_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case DELTA:
+ {
+ RefAdaAST tmp25_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp25_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp25_AST));
+ }
+ match(DELTA);
+ attribute_id_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case ACCESS:
+ {
+ RefAdaAST tmp26_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp26_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp26_AST));
+ }
+ match(ACCESS);
+ attribute_id_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp27_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp27_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp27_AST));
+ }
+ match(IDENTIFIER);
+ attribute_id_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = attribute_id_AST;
+}
+
+void AdaParser::private_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST private_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case PRIVATE:
+ {
+ RefAdaAST tmp28_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp28_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp28_AST));
+ }
+ match(PRIVATE);
+ break;
+ }
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case GENERIC:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ private_opt_AST = RefAdaAST(currentAST.root);
+#line 137 "ada.g"
+ private_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(private_opt_AST))));
+#line 843 "AdaParser.cpp"
+ currentAST.root = private_opt_AST;
+ if ( private_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ private_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = private_opt_AST->getFirstChild();
+ else
+ currentAST.child = private_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ private_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = private_opt_AST;
+}
+
+void AdaParser::lib_pkg_spec_or_body() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST lib_pkg_spec_or_body_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken pkg = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST pkg_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ pkg = LT(1);
+ if ( inputState->guessing == 0 ) {
+ pkg_AST = astFactory->create(pkg);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(pkg_AST));
+ }
+ match(PACKAGE);
+ {
+ switch ( LA(1)) {
+ case BODY:
+ {
+ match(BODY);
+ def_id(true);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IS);
+ pkg_body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 143 "ada.g"
+ Set(pkg_AST, PACKAGE_BODY);
+#line 887 "AdaParser.cpp"
+ }
+ break;
+ }
+ case IDENTIFIER:
+ {
+ def_id(true);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ spec_decl_part(pkg_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ lib_pkg_spec_or_body_AST = RefAdaAST(currentAST.root);
+ returnAST = lib_pkg_spec_or_body_AST;
+}
+
+void AdaParser::subprog_decl_or_rename_or_inst_or_body(
+ boolean lib_level
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST subprog_decl_or_rename_or_inst_or_body_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken f = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST f_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+#line 944 "ada.g"
+ RefAdaAST t;
+#line 925 "AdaParser.cpp"
+
+ switch ( LA(1)) {
+ case PROCEDURE:
+ {
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(PROCEDURE);
+ def_id(lib_level);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ if ((LA(1) == IS) && (LA(2) == NEW)) {
+ generic_subp_inst();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 948 "ada.g"
+ Set(p_AST, GENERIC_PROCEDURE_INSTANTIATION);
+#line 949 "AdaParser.cpp"
+ }
+ }
+ else if ((_tokenSet_2.member(LA(1))) && (_tokenSet_3.member(LA(2)))) {
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case RENAMES:
+ {
+ renames();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 950 "ada.g"
+ Set(p_AST, PROCEDURE_RENAMING_DECLARATION);
+#line 968 "AdaParser.cpp"
+ }
+ break;
+ }
+ case IS:
+ {
+ match(IS);
+ {
+ switch ( LA(1)) {
+ case SEPARATE:
+ case ABSTRACT:
+ {
+ separate_or_abstract(p_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PRAGMA:
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case TASK:
+ case PROTECTED:
+ case FOR:
+ case SUBTYPE:
+ case GENERIC:
+ case BEGIN:
+ {
+ body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 952 "ada.g"
+ Set(p_AST, PROCEDURE_BODY);
+#line 1007 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 954 "ada.g"
+ pop_def_id();
+ Set(p_AST, PROCEDURE_DECLARATION);
+#line 1025 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ subprog_decl_or_rename_or_inst_or_body_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case FUNCTION:
+ {
+ f = LT(1);
+ if ( inputState->guessing == 0 ) {
+ f_AST = astFactory->create(f);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(f_AST));
+ }
+ match(FUNCTION);
+ def_designator(lib_level);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case IS:
+ {
+ generic_subp_inst();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 961 "ada.g"
+ Set(f_AST, GENERIC_FUNCTION_INSTANTIATION);
+#line 1068 "AdaParser.cpp"
+ }
+ break;
+ }
+ case LPAREN:
+ case RETURN:
+ {
+ function_tail();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case RENAMES:
+ {
+ renames();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 963 "ada.g"
+ Set(f_AST, FUNCTION_RENAMING_DECLARATION);
+#line 1090 "AdaParser.cpp"
+ }
+ break;
+ }
+ case IS:
+ {
+ match(IS);
+ {
+ switch ( LA(1)) {
+ case SEPARATE:
+ case ABSTRACT:
+ {
+ separate_or_abstract(f_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PRAGMA:
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case TASK:
+ case PROTECTED:
+ case FOR:
+ case SUBTYPE:
+ case GENERIC:
+ case BEGIN:
+ {
+ body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 965 "ada.g"
+ Set(f_AST, FUNCTION_BODY);
+#line 1129 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 967 "ada.g"
+ pop_def_id();
+ Set(f_AST, FUNCTION_DECLARATION);
+#line 1147 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ subprog_decl_or_rename_or_inst_or_body_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = subprog_decl_or_rename_or_inst_or_body_AST;
+}
+
+void AdaParser::generic_decl(
+ boolean lib_level
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST generic_decl_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken g = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST g_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ g = LT(1);
+ if ( inputState->guessing == 0 ) {
+ g_AST = astFactory->create(g);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(g_AST));
+ }
+ match(GENERIC);
+ generic_formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case PACKAGE:
+ {
+ match(PACKAGE);
+ def_id(lib_level);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case RENAMES:
+ {
+ renames();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 865 "ada.g"
+ Set(g_AST, GENERIC_PACKAGE_RENAMING);
+#line 1216 "AdaParser.cpp"
+ }
+ break;
+ }
+ case IS:
+ {
+ match(IS);
+ pkg_spec_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 866 "ada.g"
+ Set(g_AST, GENERIC_PACKAGE_DECLARATION);
+#line 1230 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case PROCEDURE:
+ {
+ match(PROCEDURE);
+ def_id(lib_level);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case RENAMES:
+ {
+ renames();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 869 "ada.g"
+ Set(g_AST, GENERIC_PROCEDURE_RENAMING);
+#line 1264 "AdaParser.cpp"
+ }
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 872 "ada.g"
+ Set(g_AST, GENERIC_PROCEDURE_DECLARATION); pop_def_id();
+#line 1273 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case FUNCTION:
+ {
+ match(FUNCTION);
+ def_designator(lib_level);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ function_tail();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case RENAMES:
+ {
+ renames();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 875 "ada.g"
+ Set(g_AST, GENERIC_FUNCTION_RENAMING);
+#line 1307 "AdaParser.cpp"
+ }
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 878 "ada.g"
+ Set(g_AST, GENERIC_FUNCTION_DECLARATION); pop_def_id();
+#line 1316 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ generic_decl_AST = RefAdaAST(currentAST.root);
+ returnAST = generic_decl_AST;
+}
+
+void AdaParser::def_id(
+ boolean lib_level
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST def_id_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefAdaAST cn_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken n = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST n_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ if (((LA(1) == IDENTIFIER) && (_tokenSet_4.member(LA(2))))&&( lib_level )) {
+ compound_name();
+ if (inputState->guessing==0) {
+ cn_AST = returnAST;
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 171 "ada.g"
+ push_def_id(cn_AST);
+#line 1358 "AdaParser.cpp"
+ }
+ def_id_AST = RefAdaAST(currentAST.root);
+ }
+ else if (((LA(1) == IDENTIFIER) && (_tokenSet_5.member(LA(2))))&&( !lib_level )) {
+ n = LT(1);
+ if ( inputState->guessing == 0 ) {
+ n_AST = astFactory->create(n);
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(n_AST));
+ }
+ match(IDENTIFIER);
+ if ( inputState->guessing==0 ) {
+#line 172 "ada.g"
+ push_def_id(n_AST);
+#line 1372 "AdaParser.cpp"
+ }
+ def_id_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ returnAST = def_id_AST;
+}
+
+void AdaParser::pkg_body_part() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST pkg_body_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ declarative_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ block_body_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ end_id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ pkg_body_part_AST = RefAdaAST(currentAST.root);
+ returnAST = pkg_body_part_AST;
+}
+
+void AdaParser::spec_decl_part(
+ RefAdaAST pkg
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST spec_decl_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case IS:
+ {
+ match(IS);
+ {
+ switch ( LA(1)) {
+ case NEW:
+ {
+ generic_inst();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 364 "ada.g"
+ Set(pkg, GENERIC_PACKAGE_INSTANTIATION);
+#line 1427 "AdaParser.cpp"
+ }
+ break;
+ }
+ case PRAGMA:
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case PRIVATE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case TASK:
+ case PROTECTED:
+ case FOR:
+ case END:
+ case SUBTYPE:
+ case GENERIC:
+ {
+ pkg_spec_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 365 "ada.g"
+ Set(pkg, PACKAGE_SPECIFICATION);
+#line 1453 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case RENAMES:
+ {
+ renames();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 367 "ada.g"
+ Set(pkg, PACKAGE_RENAMING_DECLARATION);
+#line 1474 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ spec_decl_part_AST = RefAdaAST(currentAST.root);
+ returnAST = spec_decl_part_AST;
+}
+
+void AdaParser::subprog_decl(
+ boolean lib_level
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST subprog_decl_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken f = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST f_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+#line 148 "ada.g"
+ RefAdaAST t;
+#line 1501 "AdaParser.cpp"
+
+ switch ( LA(1)) {
+ case PROCEDURE:
+ {
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(PROCEDURE);
+ def_id(lib_level);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ if ((LA(1) == IS) && (LA(2) == NEW)) {
+ generic_subp_inst();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 152 "ada.g"
+ Set(p_AST, GENERIC_PROCEDURE_INSTANTIATION);
+#line 1525 "AdaParser.cpp"
+ }
+ }
+ else if ((_tokenSet_2.member(LA(1))) && (_tokenSet_6.member(LA(2)))) {
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case RENAMES:
+ {
+ renames();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 154 "ada.g"
+ Set(p_AST, PROCEDURE_RENAMING_DECLARATION);
+#line 1544 "AdaParser.cpp"
+ }
+ break;
+ }
+ case SEMI:
+ case IS:
+ {
+ is_separate_or_abstract_or_decl(p_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ subprog_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case FUNCTION:
+ {
+ f = LT(1);
+ if ( inputState->guessing == 0 ) {
+ f_AST = astFactory->create(f);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(f_AST));
+ }
+ match(FUNCTION);
+ def_designator(lib_level);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case IS:
+ {
+ generic_subp_inst();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 161 "ada.g"
+ Set(f_AST, GENERIC_FUNCTION_INSTANTIATION);
+#line 1596 "AdaParser.cpp"
+ }
+ break;
+ }
+ case LPAREN:
+ case RETURN:
+ {
+ function_tail();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case RENAMES:
+ {
+ renames();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 163 "ada.g"
+ Set(f_AST, FUNCTION_RENAMING_DECLARATION);
+#line 1618 "AdaParser.cpp"
+ }
+ break;
+ }
+ case SEMI:
+ case IS:
+ {
+ is_separate_or_abstract_or_decl(f_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ subprog_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = subprog_decl_AST;
+}
+
+void AdaParser::generic_subp_inst() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST generic_subp_inst_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(IS);
+ generic_inst();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ generic_subp_inst_AST = RefAdaAST(currentAST.root);
+ returnAST = generic_subp_inst_AST;
+}
+
+void AdaParser::formal_part_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST formal_part_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ parameter_specification();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ parameter_specification();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop70;
+ }
+
+ }
+ _loop70:;
+ } // ( ... )*
+ match(RPAREN);
+ break;
+ }
+ case SEMI:
+ case IS:
+ case RENAMES:
+ case WHEN:
+ case DO:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ formal_part_opt_AST = RefAdaAST(currentAST.root);
+#line 235 "ada.g"
+ formal_part_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(FORMAL_PART_OPT,"FORMAL_PART_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(formal_part_opt_AST))));
+#line 1723 "AdaParser.cpp"
+ currentAST.root = formal_part_opt_AST;
+ if ( formal_part_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ formal_part_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = formal_part_opt_AST->getFirstChild();
+ else
+ currentAST.child = formal_part_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ formal_part_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = formal_part_opt_AST;
+}
+
+void AdaParser::renames() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST renames_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+#line 258 "ada.g"
+ RefAdaAST dummy;
+#line 1742 "AdaParser.cpp"
+
+ match(RENAMES);
+ {
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ {
+ name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case CHAR_STRING:
+ {
+ dummy=definable_operator_symbol();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+#line 262 "ada.g"
+ pop_def_id();
+#line 1772 "AdaParser.cpp"
+ }
+ renames_AST = RefAdaAST(currentAST.root);
+ returnAST = renames_AST;
+}
+
+void AdaParser::is_separate_or_abstract_or_decl(
+ RefAdaAST t
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST is_separate_or_abstract_or_decl_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case IS:
+ {
+ match(IS);
+ separate_or_abstract(t);
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 305 "ada.g"
+ pop_def_id();
+ if (t->getType() == AdaTokenTypes::PROCEDURE)
+ Set(t, PROCEDURE_DECLARATION);
+ else
+ Set(t, FUNCTION_DECLARATION);
+
+#line 1802 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = is_separate_or_abstract_or_decl_AST;
+}
+
+void AdaParser::def_designator(
+ boolean lib_level
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST def_designator_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefAdaAST n_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+#line 330 "ada.g"
+ RefAdaAST d;
+#line 1823 "AdaParser.cpp"
+
+ if (((LA(1) == IDENTIFIER) && (_tokenSet_7.member(LA(2))))&&( lib_level )) {
+ compound_name();
+ if (inputState->guessing==0) {
+ n_AST = returnAST;
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 332 "ada.g"
+ push_def_id(n_AST);
+#line 1834 "AdaParser.cpp"
+ }
+ def_designator_AST = RefAdaAST(currentAST.root);
+ }
+ else if (((LA(1) == IDENTIFIER || LA(1) == CHAR_STRING) && (LA(2) == LPAREN || LA(2) == IS || LA(2) == RETURN))&&( !lib_level )) {
+ d=designator();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 333 "ada.g"
+ push_def_id(d);
+#line 1846 "AdaParser.cpp"
+ }
+ def_designator_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ returnAST = def_designator_AST;
+}
+
+void AdaParser::function_tail() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST function_tail_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ func_formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RETURN);
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ function_tail_AST = RefAdaAST(currentAST.root);
+ returnAST = function_tail_AST;
+}
+
+void AdaParser::generic_inst() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST generic_inst_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(NEW);
+ compound_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ value_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+#line 179 "ada.g"
+ pop_def_id();
+#line 1910 "AdaParser.cpp"
+ }
+ generic_inst_AST = RefAdaAST(currentAST.root);
+ returnAST = generic_inst_AST;
+}
+
+void AdaParser::value_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST value_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ value();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ value();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop445;
+ }
+
+ }
+ _loop445:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ value_s_AST = RefAdaAST(currentAST.root);
+#line 1405 "ada.g"
+ value_s_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(VALUES,"VALUES")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(value_s_AST))));
+#line 1945 "AdaParser.cpp"
+ currentAST.root = value_s_AST;
+ if ( value_s_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ value_s_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = value_s_AST->getFirstChild();
+ else
+ currentAST.child = value_s_AST;
+ currentAST.advanceChildToEnd();
+ }
+ value_s_AST = RefAdaAST(currentAST.root);
+ returnAST = value_s_AST;
+}
+
+void AdaParser::parenth_values() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST parenth_values_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(LPAREN);
+ value();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ value();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop46;
+ }
+
+ }
+ _loop46:;
+ } // ( ... )*
+ match(RPAREN);
+ parenth_values_AST = RefAdaAST(currentAST.root);
+ returnAST = parenth_values_AST;
+}
+
+void AdaParser::value() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST value_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case OTHERS:
+ {
+ RefAdaAST tmp60_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp60_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp60_AST));
+ }
+ match(OTHERS);
+ match(RIGHT_SHAFT);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case ABS:
+ case NUMERIC_LIT:
+ {
+ ranged_expr_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case RIGHT_SHAFT:
+ {
+ RefAdaAST tmp62_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp62_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp62_AST));
+ }
+ match(RIGHT_SHAFT);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case COMMA:
+ case RPAREN:
+ case WITH:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ value_AST = RefAdaAST(currentAST.root);
+ returnAST = value_AST;
+}
+
+void AdaParser::ranged_expr_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST ranged_expr_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ ranged_expr();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == PIPE)) {
+ RefAdaAST tmp63_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp63_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp63_AST));
+ }
+ match(PIPE);
+ ranged_expr();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop52;
+ }
+
+ }
+ _loop52:;
+ } // ( ... )*
+ ranged_expr_s_AST = RefAdaAST(currentAST.root);
+ returnAST = ranged_expr_s_AST;
+}
+
+void AdaParser::ranged_expr() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST ranged_expr_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case DOT_DOT:
+ {
+ RefAdaAST tmp64_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp64_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp64_AST));
+ }
+ match(DOT_DOT);
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RANGE:
+ {
+ RefAdaAST tmp65_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp65_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp65_AST));
+ }
+ match(RANGE);
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case COMMA:
+ case RPAREN:
+ case RIGHT_SHAFT:
+ case WITH:
+ case PIPE:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ ranged_expr_AST = RefAdaAST(currentAST.root);
+ returnAST = ranged_expr_AST;
+}
+
+void AdaParser::simple_expression() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST simple_expression_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ signed_term();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case PLUS:
+ {
+ RefAdaAST tmp66_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp66_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp66_AST));
+ }
+ match(PLUS);
+ signed_term();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case MINUS:
+ {
+ RefAdaAST tmp67_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp67_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp67_AST));
+ }
+ match(MINUS);
+ signed_term();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case CONCAT:
+ {
+ RefAdaAST tmp68_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp68_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp68_AST));
+ }
+ match(CONCAT);
+ signed_term();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop458;
+ }
+ }
+ }
+ _loop458:;
+ } // ( ... )*
+ simple_expression_AST = RefAdaAST(currentAST.root);
+ returnAST = simple_expression_AST;
+}
+
+void AdaParser::range() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST range_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ bool synPredMatched59 = false;
+ if (((_tokenSet_0.member(LA(1))) && (_tokenSet_8.member(LA(2))))) {
+ int _m59 = mark();
+ synPredMatched59 = true;
+ inputState->guessing++;
+ try {
+ {
+ range_dots();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched59 = false;
+ }
+ rewind(_m59);
+ inputState->guessing--;
+ }
+ if ( synPredMatched59 ) {
+ range_dots();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((LA(1) == IDENTIFIER) && (LA(2) == LPAREN || LA(2) == DOT || LA(2) == TIC)) {
+ range_attrib_ref();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ range_AST = RefAdaAST(currentAST.root);
+ returnAST = range_AST;
+}
+
+void AdaParser::range_constraint() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST range_constraint_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken r = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST r_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ r = LT(1);
+ if ( inputState->guessing == 0 ) {
+ r_AST = astFactory->create(r);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(r_AST));
+ }
+ match(RANGE);
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 203 "ada.g"
+ Set(r_AST, RANGE_CONSTRAINT);
+#line 2287 "AdaParser.cpp"
+ }
+ range_constraint_AST = RefAdaAST(currentAST.root);
+ returnAST = range_constraint_AST;
+}
+
+void AdaParser::range_dots() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST range_dots_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ RefAdaAST tmp69_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp69_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp69_AST));
+ }
+ match(DOT_DOT);
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ range_dots_AST = RefAdaAST(currentAST.root);
+ returnAST = range_dots_AST;
+}
+
+void AdaParser::range_attrib_ref() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST range_attrib_ref_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken r = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST r_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ prefix();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(TIC);
+ r = LT(1);
+ if ( inputState->guessing == 0 ) {
+ r_AST = astFactory->create(r);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(r_AST));
+ }
+ match(RANGE);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ break;
+ }
+ case SEMI:
+ case COMMA:
+ case RPAREN:
+ case RIGHT_SHAFT:
+ case WITH:
+ case RANGE:
+ case DIGITS:
+ case IS:
+ case PIPE:
+ case DOT_DOT:
+ case ASSIGN:
+ case THEN:
+ case LOOP:
+ case OR:
+ case AND:
+ case XOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+#line 219 "ada.g"
+ Set(r_AST, RANGE_ATTRIBUTE_REFERENCE);
+#line 2374 "AdaParser.cpp"
+ }
+ range_attrib_ref_AST = RefAdaAST(currentAST.root);
+ returnAST = range_attrib_ref_AST;
+}
+
+void AdaParser::prefix() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST prefix_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ RefAdaAST tmp73_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp73_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp73_AST));
+ }
+ match(IDENTIFIER);
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case DOT:
+ {
+ RefAdaAST tmp74_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp74_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp74_AST));
+ }
+ match(DOT);
+ {
+ switch ( LA(1)) {
+ case ALL:
+ {
+ RefAdaAST tmp75_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp75_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp75_AST));
+ }
+ match(ALL);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp76_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp76_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp76_AST));
+ }
+ match(IDENTIFIER);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case LPAREN:
+ {
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(LPAREN);
+ value_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 228 "ada.g"
+ Set(p_AST, INDEXED_COMPONENT);
+#line 2450 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop66;
+ }
+ }
+ }
+ _loop66:;
+ } // ( ... )*
+ prefix_AST = RefAdaAST(currentAST.root);
+ returnAST = prefix_AST;
+}
+
+void AdaParser::parameter_specification() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST parameter_specification_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ def_ids_colon();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ mode_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ init_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ parameter_specification_AST = RefAdaAST(currentAST.root);
+#line 240 "ada.g"
+ parameter_specification_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PARAMETER_SPECIFICATION,"PARAMETER_SPECIFICATION")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(parameter_specification_AST))));
+#line 2492 "AdaParser.cpp"
+ currentAST.root = parameter_specification_AST;
+ if ( parameter_specification_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ parameter_specification_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = parameter_specification_AST->getFirstChild();
+ else
+ currentAST.child = parameter_specification_AST;
+ currentAST.advanceChildToEnd();
+ }
+ parameter_specification_AST = RefAdaAST(currentAST.root);
+ returnAST = parameter_specification_AST;
+}
+
+void AdaParser::def_ids_colon() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST def_ids_colon_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ defining_identifier_list();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ def_ids_colon_AST = RefAdaAST(currentAST.root);
+ returnAST = def_ids_colon_AST;
+}
+
+void AdaParser::mode_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST mode_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case IN:
+ {
+ RefAdaAST tmp79_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp79_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp79_AST));
+ }
+ match(IN);
+ {
+ switch ( LA(1)) {
+ case OUT:
+ {
+ RefAdaAST tmp80_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp80_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp80_AST));
+ }
+ match(OUT);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case OUT:
+ {
+ RefAdaAST tmp81_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp81_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp81_AST));
+ }
+ match(OUT);
+ break;
+ }
+ case ACCESS:
+ {
+ RefAdaAST tmp82_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp82_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp82_AST));
+ }
+ match(ACCESS);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ mode_opt_AST = RefAdaAST(currentAST.root);
+#line 255 "ada.g"
+ mode_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(mode_opt_AST))));
+#line 2592 "AdaParser.cpp"
+ currentAST.root = mode_opt_AST;
+ if ( mode_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ mode_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = mode_opt_AST->getFirstChild();
+ else
+ currentAST.child = mode_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ mode_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = mode_opt_AST;
+}
+
+void AdaParser::init_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST init_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case ASSIGN:
+ {
+ match(ASSIGN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case RPAREN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ init_opt_AST = RefAdaAST(currentAST.root);
+#line 468 "ada.g"
+ init_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(INIT_OPT,"INIT_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(init_opt_AST))));
+#line 2636 "AdaParser.cpp"
+ currentAST.root = init_opt_AST;
+ if ( init_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ init_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = init_opt_AST->getFirstChild();
+ else
+ currentAST.child = init_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ init_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = init_opt_AST;
+}
+
+void AdaParser::defining_identifier_list() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST defining_identifier_list_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ RefAdaAST tmp84_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp84_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp84_AST));
+ }
+ match(IDENTIFIER);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ RefAdaAST tmp86_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp86_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp86_AST));
+ }
+ match(IDENTIFIER);
+ }
+ else {
+ goto _loop75;
+ }
+
+ }
+ _loop75:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ defining_identifier_list_AST = RefAdaAST(currentAST.root);
+#line 249 "ada.g"
+ defining_identifier_list_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DEFINING_IDENTIFIER_LIST,"DEFINING_IDENTIFIER_LIST")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(defining_identifier_list_AST))));
+#line 2683 "AdaParser.cpp"
+ currentAST.root = defining_identifier_list_AST;
+ if ( defining_identifier_list_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ defining_identifier_list_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = defining_identifier_list_AST->getFirstChild();
+ else
+ currentAST.child = defining_identifier_list_AST;
+ currentAST.advanceChildToEnd();
+ }
+ defining_identifier_list_AST = RefAdaAST(currentAST.root);
+ returnAST = defining_identifier_list_AST;
+}
+
+void AdaParser::name() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST name_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+#line 265 "ada.g"
+ RefAdaAST dummy;
+#line 2704 "AdaParser.cpp"
+
+ RefAdaAST tmp87_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp87_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp87_AST));
+ }
+ match(IDENTIFIER);
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case DOT:
+ {
+ RefAdaAST tmp88_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp88_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp88_AST));
+ }
+ match(DOT);
+ {
+ switch ( LA(1)) {
+ case ALL:
+ {
+ RefAdaAST tmp89_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp89_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp89_AST));
+ }
+ match(ALL);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp90_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp90_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp90_AST));
+ }
+ match(IDENTIFIER);
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ RefAdaAST tmp91_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp91_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp91_AST));
+ }
+ match(CHARACTER_LITERAL);
+ break;
+ }
+ case CHAR_STRING:
+ {
+ dummy=is_operator();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case LPAREN:
+ {
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(LPAREN);
+ value_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 273 "ada.g"
+ Set(p_AST, INDEXED_COMPONENT);
+#line 2787 "AdaParser.cpp"
+ }
+ break;
+ }
+ case TIC:
+ {
+ RefAdaAST tmp93_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp93_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp93_AST));
+ }
+ match(TIC);
+ attribute_id();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop84;
+ }
+ }
+ }
+ _loop84:;
+ } // ( ... )*
+ name_AST = RefAdaAST(currentAST.root);
+ returnAST = name_AST;
+}
+
+RefAdaAST AdaParser::definable_operator_symbol() {
+#line 285 "ada.g"
+ RefAdaAST d;
+#line 2820 "AdaParser.cpp"
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST definable_operator_symbol_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken op = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST op_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ if (!( definable_operator(LT(1)->getText().c_str()) ))
+ throw ANTLR_USE_NAMESPACE(antlr)SemanticException(" definable_operator(LT(1)->getText().c_str()) ");
+ op = LT(1);
+ if ( inputState->guessing == 0 ) {
+ op_AST = astFactory->create(op);
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(op_AST));
+ }
+ match(CHAR_STRING);
+ if ( inputState->guessing==0 ) {
+#line 287 "ada.g"
+ op_AST->setType(OPERATOR_SYMBOL); d=op_AST;
+#line 2838 "AdaParser.cpp"
+ }
+ definable_operator_symbol_AST = RefAdaAST(currentAST.root);
+ returnAST = definable_operator_symbol_AST;
+ return d;
+}
+
+RefAdaAST AdaParser::is_operator() {
+#line 280 "ada.g"
+ RefAdaAST d;
+#line 2848 "AdaParser.cpp"
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST is_operator_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken op = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST op_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ if (!( is_operator_symbol(LT(1)->getText().c_str()) ))
+ throw ANTLR_USE_NAMESPACE(antlr)SemanticException(" is_operator_symbol(LT(1)->getText().c_str()) ");
+ op = LT(1);
+ if ( inputState->guessing == 0 ) {
+ op_AST = astFactory->create(op);
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(op_AST));
+ }
+ match(CHAR_STRING);
+ if ( inputState->guessing==0 ) {
+#line 282 "ada.g"
+ op_AST->setType(OPERATOR_SYMBOL); d=op_AST;
+#line 2866 "AdaParser.cpp"
+ }
+ is_operator_AST = RefAdaAST(currentAST.root);
+ returnAST = is_operator_AST;
+ return d;
+}
+
+void AdaParser::parenthesized_primary() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST parenthesized_primary_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken pp = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST pp_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ pp = LT(1);
+ if ( inputState->guessing == 0 ) {
+ pp_AST = astFactory->create(pp);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(pp_AST));
+ }
+ match(LPAREN);
+ {
+ if ((LA(1) == NuLL) && (LA(2) == RECORD)) {
+ RefAdaAST tmp94_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp94_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp94_AST));
+ }
+ match(NuLL);
+ match(RECORD);
+ }
+ else if ((_tokenSet_9.member(LA(1))) && (_tokenSet_10.member(LA(2)))) {
+ value_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ extension_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 295 "ada.g"
+ Set(pp_AST, PARENTHESIZED_PRIMARY);
+#line 2915 "AdaParser.cpp"
+ }
+ parenthesized_primary_AST = RefAdaAST(currentAST.root);
+ returnAST = parenthesized_primary_AST;
+}
+
+void AdaParser::extension_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST extension_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case WITH:
+ {
+ match(WITH);
+ {
+ if ((LA(1) == NuLL) && (LA(2) == RECORD)) {
+ RefAdaAST tmp98_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp98_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp98_AST));
+ }
+ match(NuLL);
+ match(RECORD);
+ }
+ else if ((_tokenSet_9.member(LA(1))) && (_tokenSet_11.member(LA(2)))) {
+ value_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ break;
+ }
+ case RPAREN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ extension_opt_AST = RefAdaAST(currentAST.root);
+#line 299 "ada.g"
+ extension_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(EXTENSION_OPT,"EXTENSION_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(extension_opt_AST))));
+#line 2969 "AdaParser.cpp"
+ currentAST.root = extension_opt_AST;
+ if ( extension_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ extension_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = extension_opt_AST->getFirstChild();
+ else
+ currentAST.child = extension_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ extension_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = extension_opt_AST;
+}
+
+void AdaParser::separate_or_abstract(
+ RefAdaAST t
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST separate_or_abstract_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case SEPARATE:
+ {
+ match(SEPARATE);
+ if ( inputState->guessing==0 ) {
+#line 315 "ada.g"
+ pop_def_id();
+ if (t->getType() == AdaTokenTypes::PROCEDURE)
+ Set(t, PROCEDURE_BODY_STUB);
+ else
+ Set(t, FUNCTION_BODY_STUB);
+
+#line 3001 "AdaParser.cpp"
+ }
+ break;
+ }
+ case ABSTRACT:
+ {
+ match(ABSTRACT);
+ if ( inputState->guessing==0 ) {
+#line 322 "ada.g"
+ pop_def_id();
+ if (t->getType() == AdaTokenTypes::PROCEDURE)
+ Set(t, ABSTRACT_PROCEDURE_DECLARATION);
+ else
+ Set(t, ABSTRACT_FUNCTION_DECLARATION);
+
+#line 3016 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = separate_or_abstract_AST;
+}
+
+RefAdaAST AdaParser::designator() {
+#line 336 "ada.g"
+ RefAdaAST d;
+#line 3031 "AdaParser.cpp"
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST designator_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken n = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST n_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+#line 336 "ada.g"
+ RefAdaAST op;
+#line 3039 "AdaParser.cpp"
+
+ switch ( LA(1)) {
+ case CHAR_STRING:
+ {
+ op=definable_operator_symbol();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 338 "ada.g"
+ d = op;
+#line 3051 "AdaParser.cpp"
+ }
+ designator_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ n = LT(1);
+ if ( inputState->guessing == 0 ) {
+ n_AST = astFactory->create(n);
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(n_AST));
+ }
+ match(IDENTIFIER);
+ if ( inputState->guessing==0 ) {
+#line 339 "ada.g"
+ d = n_AST;
+#line 3067 "AdaParser.cpp"
+ }
+ designator_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = designator_AST;
+ return d;
+}
+
+void AdaParser::func_formal_part_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST func_formal_part_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ func_param();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ func_param();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop100;
+ }
+
+ }
+ _loop100:;
+ } // ( ... )*
+ match(RPAREN);
+ break;
+ }
+ case RETURN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ func_formal_part_opt_AST = RefAdaAST(currentAST.root);
+#line 348 "ada.g"
+ func_formal_part_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(FORMAL_PART_OPT,"FORMAL_PART_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(func_formal_part_opt_AST))));
+#line 3129 "AdaParser.cpp"
+ currentAST.root = func_formal_part_opt_AST;
+ if ( func_formal_part_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ func_formal_part_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = func_formal_part_opt_AST->getFirstChild();
+ else
+ currentAST.child = func_formal_part_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ func_formal_part_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = func_formal_part_opt_AST;
+}
+
+void AdaParser::func_param() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST func_param_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ def_ids_colon();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ in_access_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ init_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ func_param_AST = RefAdaAST(currentAST.root);
+#line 354 "ada.g"
+ func_param_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PARAMETER_SPECIFICATION,"PARAMETER_SPECIFICATION")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(func_param_AST))));
+#line 3168 "AdaParser.cpp"
+ currentAST.root = func_param_AST;
+ if ( func_param_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ func_param_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = func_param_AST->getFirstChild();
+ else
+ currentAST.child = func_param_AST;
+ currentAST.advanceChildToEnd();
+ }
+ func_param_AST = RefAdaAST(currentAST.root);
+ returnAST = func_param_AST;
+}
+
+void AdaParser::in_access_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST in_access_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case IN:
+ {
+ RefAdaAST tmp105_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp105_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp105_AST));
+ }
+ match(IN);
+ break;
+ }
+ case ACCESS:
+ {
+ RefAdaAST tmp106_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp106_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp106_AST));
+ }
+ match(ACCESS);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ in_access_opt_AST = RefAdaAST(currentAST.root);
+#line 360 "ada.g"
+ in_access_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(in_access_opt_AST))));
+#line 3222 "AdaParser.cpp"
+ currentAST.root = in_access_opt_AST;
+ if ( in_access_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ in_access_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = in_access_opt_AST->getFirstChild();
+ else
+ currentAST.child = in_access_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ in_access_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = in_access_opt_AST;
+}
+
+void AdaParser::pkg_spec_part() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST pkg_spec_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ basic_declarative_items_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ private_declarative_items_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ end_id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ pkg_spec_part_AST = RefAdaAST(currentAST.root);
+ returnAST = pkg_spec_part_AST;
+}
+
+void AdaParser::basic_declarative_items_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST basic_declarative_items_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case TASK:
+ case PROTECTED:
+ case FOR:
+ case SUBTYPE:
+ case GENERIC:
+ {
+ basic_decl_item();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop114;
+ }
+ }
+ }
+ _loop114:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ basic_declarative_items_opt_AST = RefAdaAST(currentAST.root);
+#line 385 "ada.g"
+ basic_declarative_items_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(BASIC_DECLARATIVE_ITEMS_OPT,"BASIC_DECLARATIVE_ITEMS_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(basic_declarative_items_opt_AST))));
+#line 3303 "AdaParser.cpp"
+ currentAST.root = basic_declarative_items_opt_AST;
+ if ( basic_declarative_items_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ basic_declarative_items_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = basic_declarative_items_opt_AST->getFirstChild();
+ else
+ currentAST.child = basic_declarative_items_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ basic_declarative_items_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = basic_declarative_items_opt_AST;
+}
+
+void AdaParser::private_declarative_items_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST private_declarative_items_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case PRIVATE:
+ {
+ match(PRIVATE);
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case TASK:
+ case PROTECTED:
+ case FOR:
+ case SUBTYPE:
+ case GENERIC:
+ {
+ basic_decl_item();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop111;
+ }
+ }
+ }
+ _loop111:;
+ } // ( ... )*
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ private_declarative_items_opt_AST = RefAdaAST(currentAST.root);
+#line 378 "ada.g"
+ private_declarative_items_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PRIVATE_DECLARATIVE_ITEMS_OPT,"PRIVATE_DECLARATIVE_ITEMS_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(private_declarative_items_opt_AST))));
+#line 3380 "AdaParser.cpp"
+ currentAST.root = private_declarative_items_opt_AST;
+ if ( private_declarative_items_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ private_declarative_items_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = private_declarative_items_opt_AST->getFirstChild();
+ else
+ currentAST.child = private_declarative_items_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ private_declarative_items_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = private_declarative_items_opt_AST;
+}
+
+void AdaParser::end_id_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST end_id_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken e = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST e_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ e = LT(1);
+ if ( inputState->guessing == 0 ) {
+ e_AST = astFactory->create(e);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(e_AST));
+ }
+ match(END);
+ id_opt_aux();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1176 "ada.g"
+ Set(e_AST, END_ID_OPT);
+#line 3413 "AdaParser.cpp"
+ }
+ end_id_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = end_id_opt_AST;
+}
+
+void AdaParser::basic_decl_item() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST basic_decl_item_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken pkg = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST pkg_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken tsk = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST tsk_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken pro = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST pro_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case PACKAGE:
+ {
+ pkg = LT(1);
+ if ( inputState->guessing == 0 ) {
+ pkg_AST = astFactory->create(pkg);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(pkg_AST));
+ }
+ match(PACKAGE);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ spec_decl_part(pkg_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ basic_decl_item_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case TASK:
+ {
+ tsk = LT(1);
+ if ( inputState->guessing == 0 ) {
+ tsk_AST = astFactory->create(tsk);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tsk_AST));
+ }
+ match(TASK);
+ task_type_or_single_decl(tsk_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ basic_decl_item_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case PROTECTED:
+ {
+ pro = LT(1);
+ if ( inputState->guessing == 0 ) {
+ pro_AST = astFactory->create(pro);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(pro_AST));
+ }
+ match(PROTECTED);
+ prot_type_or_single_decl(pro_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ basic_decl_item_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ subprog_decl(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ basic_decl_item_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case FOR:
+ case SUBTYPE:
+ case GENERIC:
+ {
+ decl_common();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ basic_decl_item_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = basic_decl_item_AST;
+}
+
+void AdaParser::basic_declarative_items() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST basic_declarative_items_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )+
+ int _cnt117=0;
+ for (;;) {
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case TASK:
+ case PROTECTED:
+ case FOR:
+ case SUBTYPE:
+ case GENERIC:
+ {
+ basic_decl_item();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ if ( _cnt117>=1 ) { goto _loop117; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+ }
+ _cnt117++;
+ }
+ _loop117:;
+ } // ( ... )+
+ if ( inputState->guessing==0 ) {
+ basic_declarative_items_AST = RefAdaAST(currentAST.root);
+#line 392 "ada.g"
+ basic_declarative_items_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(BASIC_DECLARATIVE_ITEMS_OPT,"BASIC_DECLARATIVE_ITEMS_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(basic_declarative_items_AST))));
+#line 3562 "AdaParser.cpp"
+ currentAST.root = basic_declarative_items_AST;
+ if ( basic_declarative_items_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ basic_declarative_items_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = basic_declarative_items_AST->getFirstChild();
+ else
+ currentAST.child = basic_declarative_items_AST;
+ currentAST.advanceChildToEnd();
+ }
+ basic_declarative_items_AST = RefAdaAST(currentAST.root);
+ returnAST = basic_declarative_items_AST;
+}
+
+void AdaParser::task_type_or_single_decl(
+ RefAdaAST tsk
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST task_type_or_single_decl_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case TYPE:
+ {
+ match(TYPE);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ discrim_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ task_definition_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 408 "ada.g"
+ Set(tsk, TASK_TYPE_DECLARATION);
+#line 3601 "AdaParser.cpp"
+ }
+ task_type_or_single_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ task_definition_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 410 "ada.g"
+ Set(tsk, SINGLE_TASK_DECLARATION);
+#line 3619 "AdaParser.cpp"
+ }
+ task_type_or_single_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = task_type_or_single_decl_AST;
+}
+
+void AdaParser::prot_type_or_single_decl(
+ RefAdaAST pro
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST prot_type_or_single_decl_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case TYPE:
+ {
+ match(TYPE);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ discrim_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ protected_definition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 539 "ada.g"
+ Set(pro, PROTECTED_TYPE_DECLARATION);
+#line 3658 "AdaParser.cpp"
+ }
+ prot_type_or_single_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ protected_definition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 541 "ada.g"
+ Set(pro, SINGLE_PROTECTED_DECLARATION);
+#line 3676 "AdaParser.cpp"
+ }
+ prot_type_or_single_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = prot_type_or_single_decl_AST;
+}
+
+void AdaParser::decl_common() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST decl_common_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken t = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST t_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken r = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST r_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken erd = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST erd_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken ord = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST ord_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken od = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST od_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case TYPE:
+ {
+ t = LT(1);
+ if ( inputState->guessing == 0 ) {
+ t_AST = astFactory->create(t);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(t_AST));
+ }
+ match(TYPE);
+ RefAdaAST tmp111_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp111_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp111_AST));
+ }
+ match(IDENTIFIER);
+ {
+ switch ( LA(1)) {
+ case IS:
+ {
+ match(IS);
+ type_def(t_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case LPAREN:
+ {
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ discrim_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case IS:
+ {
+ match(IS);
+ derived_or_private_or_record(t_AST, true);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 587 "ada.g"
+ Set(t_AST, INCOMPLETE_TYPE_DECLARATION);
+#line 3759 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case SEMI:
+ {
+ empty_discrim_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 590 "ada.g"
+ Set(t_AST, INCOMPLETE_TYPE_DECLARATION);
+#line 3780 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ decl_common_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case SUBTYPE:
+ {
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(SUBTYPE);
+ RefAdaAST tmp115_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp115_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp115_AST));
+ }
+ match(IDENTIFIER);
+ match(IS);
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 604 "ada.g"
+ Set(s_AST, SUBTYPE_DECLARATION);
+#line 3825 "AdaParser.cpp"
+ }
+ decl_common_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case GENERIC:
+ {
+ generic_decl(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ decl_common_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case USE:
+ {
+ use_clause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ decl_common_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case FOR:
+ {
+ r = LT(1);
+ if ( inputState->guessing == 0 ) {
+ r_AST = astFactory->create(r);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(r_AST));
+ }
+ match(FOR);
+ {
+ bool synPredMatched184 = false;
+ if (((LA(1) == IDENTIFIER) && (LA(2) == USE))) {
+ int _m184 = mark();
+ synPredMatched184 = true;
+ inputState->guessing++;
+ try {
+ {
+ local_enum_name();
+ match(USE);
+ match(LPAREN);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched184 = false;
+ }
+ rewind(_m184);
+ inputState->guessing--;
+ }
+ if ( synPredMatched184 ) {
+ local_enum_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(USE);
+ enumeration_aggregate();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 609 "ada.g"
+ Set(r_AST, ENUMERATION_REPESENTATION_CLAUSE);
+#line 3888 "AdaParser.cpp"
+ }
+ }
+ else if ((LA(1) == IDENTIFIER) && (LA(2) == DOT || LA(2) == USE || LA(2) == TIC)) {
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(USE);
+ rep_spec_part(r_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ match(SEMI);
+ decl_common_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ bool synPredMatched186 = false;
+ if (((LA(1) == IDENTIFIER) && (LA(2) == COLON))) {
+ int _m186 = mark();
+ synPredMatched186 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(IDENTIFIER);
+ match(COLON);
+ match(EXCEPTION);
+ match(RENAMES);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched186 = false;
+ }
+ rewind(_m186);
+ inputState->guessing--;
+ }
+ if ( synPredMatched186 ) {
+ RefAdaAST tmp121_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp121_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp121_AST));
+ }
+ match(IDENTIFIER);
+ erd = LT(1);
+ if ( inputState->guessing == 0 ) {
+ erd_AST = astFactory->create(erd);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(erd_AST));
+ }
+ match(COLON);
+ match(EXCEPTION);
+ match(RENAMES);
+ compound_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 615 "ada.g"
+ Set(erd_AST, EXCEPTION_RENAMING_DECLARATION);
+#line 3954 "AdaParser.cpp"
+ }
+ decl_common_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ bool synPredMatched188 = false;
+ if (((LA(1) == IDENTIFIER) && (LA(2) == COLON))) {
+ int _m188 = mark();
+ synPredMatched188 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(IDENTIFIER);
+ match(COLON);
+ subtype_mark();
+ match(RENAMES);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched188 = false;
+ }
+ rewind(_m188);
+ inputState->guessing--;
+ }
+ if ( synPredMatched188 ) {
+ RefAdaAST tmp125_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp125_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp125_AST));
+ }
+ match(IDENTIFIER);
+ ord = LT(1);
+ if ( inputState->guessing == 0 ) {
+ ord_AST = astFactory->create(ord);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(ord_AST));
+ }
+ match(COLON);
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RENAMES);
+ name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 618 "ada.g"
+ Set(ord_AST, OBJECT_RENAMING_DECLARATION);
+#line 4004 "AdaParser.cpp"
+ }
+ decl_common_AST = RefAdaAST(currentAST.root);
+ }
+ else if ((LA(1) == IDENTIFIER) && (LA(2) == COMMA || LA(2) == COLON)) {
+ defining_identifier_list();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ od = LT(1);
+ if ( inputState->guessing == 0 ) {
+ od_AST = astFactory->create(od);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(od_AST));
+ }
+ match(COLON);
+ {
+ if ((LA(1) == EXCEPTION)) {
+ match(EXCEPTION);
+ if ( inputState->guessing==0 ) {
+#line 621 "ada.g"
+ Set(od_AST, EXCEPTION_DECLARATION);
+#line 4025 "AdaParser.cpp"
+ }
+ }
+ else {
+ bool synPredMatched191 = false;
+ if (((LA(1) == CONSTANT) && (LA(2) == ASSIGN))) {
+ int _m191 = mark();
+ synPredMatched191 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(CONSTANT);
+ match(ASSIGN);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched191 = false;
+ }
+ rewind(_m191);
+ inputState->guessing--;
+ }
+ if ( synPredMatched191 ) {
+ match(CONSTANT);
+ match(ASSIGN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 623 "ada.g"
+ Set(od_AST, NUMBER_DECLARATION);
+#line 4056 "AdaParser.cpp"
+ }
+ }
+ else if ((_tokenSet_12.member(LA(1))) && (_tokenSet_13.member(LA(2)))) {
+ aliased_constant_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case ARRAY:
+ {
+ array_type_definition(od_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ init_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 626 "ada.g"
+ Set(od_AST, ARRAY_OBJECT_DECLARATION);
+#line 4079 "AdaParser.cpp"
+ }
+ break;
+ }
+ case IDENTIFIER:
+ {
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ init_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 630 "ada.g"
+ Set(od_AST, OBJECT_DECLARATION);
+#line 4096 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ decl_common_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }}
+ returnAST = decl_common_AST;
+}
+
+void AdaParser::discrim_part_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discrim_part_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ discrim_part_text();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case IS:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ discrim_part_opt_AST = RefAdaAST(currentAST.root);
+#line 420 "ada.g"
+ discrim_part_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DISCRIM_PART_OPT,"DISCRIM_PART_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(discrim_part_opt_AST))));
+#line 4153 "AdaParser.cpp"
+ currentAST.root = discrim_part_opt_AST;
+ if ( discrim_part_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ discrim_part_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = discrim_part_opt_AST->getFirstChild();
+ else
+ currentAST.child = discrim_part_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ discrim_part_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = discrim_part_opt_AST;
+}
+
+void AdaParser::task_definition_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST task_definition_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case IS:
+ {
+ match(IS);
+ task_items_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ private_task_items_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ end_id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ task_definition_opt_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case SEMI:
+ {
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 415 "ada.g"
+ pop_def_id();
+#line 4197 "AdaParser.cpp"
+ }
+ task_definition_opt_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = task_definition_opt_AST;
+}
+
+void AdaParser::task_items_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST task_items_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == PRAGMA)) {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop138;
+ }
+
+ }
+ _loop138:;
+ } // ( ... )*
+ entrydecls_repspecs_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ task_items_opt_AST = RefAdaAST(currentAST.root);
+#line 473 "ada.g"
+ task_items_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(TASK_ITEMS_OPT,"TASK_ITEMS_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(task_items_opt_AST))));
+#line 4239 "AdaParser.cpp"
+ currentAST.root = task_items_opt_AST;
+ if ( task_items_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ task_items_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = task_items_opt_AST->getFirstChild();
+ else
+ currentAST.child = task_items_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ task_items_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = task_items_opt_AST;
+}
+
+void AdaParser::private_task_items_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST private_task_items_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case PRIVATE:
+ {
+ match(PRIVATE);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == PRAGMA)) {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop163;
+ }
+
+ }
+ _loop163:;
+ } // ( ... )*
+ entrydecls_repspecs_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ private_task_items_opt_AST = RefAdaAST(currentAST.root);
+#line 530 "ada.g"
+ private_task_items_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PRIVATE_TASK_ITEMS_OPT,"PRIVATE_TASK_ITEMS_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(private_task_items_opt_AST))));
+#line 4298 "AdaParser.cpp"
+ currentAST.root = private_task_items_opt_AST;
+ if ( private_task_items_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ private_task_items_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = private_task_items_opt_AST->getFirstChild();
+ else
+ currentAST.child = private_task_items_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ private_task_items_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = private_task_items_opt_AST;
+}
+
+void AdaParser::discrim_part_text() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discrim_part_text_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(LPAREN);
+ {
+ switch ( LA(1)) {
+ case BOX:
+ {
+ RefAdaAST tmp137_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp137_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp137_AST));
+ }
+ match(BOX);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ discriminant_specifications();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(RPAREN);
+ discrim_part_text_AST = RefAdaAST(currentAST.root);
+ returnAST = discrim_part_text_AST;
+}
+
+void AdaParser::discriminant_specifications() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discriminant_specifications_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ discriminant_specification();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ discriminant_specification();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop130;
+ }
+
+ }
+ _loop130:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ discriminant_specifications_AST = RefAdaAST(currentAST.root);
+#line 450 "ada.g"
+ discriminant_specifications_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DISCRIMINANT_SPECIFICATIONS,"DISCRIMINANT_SPECIFICATIONS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(discriminant_specifications_AST))));
+#line 4378 "AdaParser.cpp"
+ currentAST.root = discriminant_specifications_AST;
+ if ( discriminant_specifications_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ discriminant_specifications_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = discriminant_specifications_AST->getFirstChild();
+ else
+ currentAST.child = discriminant_specifications_AST;
+ currentAST.advanceChildToEnd();
+ }
+ discriminant_specifications_AST = RefAdaAST(currentAST.root);
+ returnAST = discriminant_specifications_AST;
+}
+
+void AdaParser::known_discrim_part() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST known_discrim_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(LPAREN);
+ discriminant_specifications();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+ known_discrim_part_AST = RefAdaAST(currentAST.root);
+#line 430 "ada.g"
+ known_discrim_part_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DISCRIM_PART_OPT,"DISCRIM_PART_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(known_discrim_part_AST))));
+#line 4407 "AdaParser.cpp"
+ currentAST.root = known_discrim_part_AST;
+ if ( known_discrim_part_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ known_discrim_part_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = known_discrim_part_AST->getFirstChild();
+ else
+ currentAST.child = known_discrim_part_AST;
+ currentAST.advanceChildToEnd();
+ }
+ known_discrim_part_AST = RefAdaAST(currentAST.root);
+ returnAST = known_discrim_part_AST;
+}
+
+void AdaParser::empty_discrim_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST empty_discrim_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ if ( inputState->guessing==0 ) {
+ empty_discrim_opt_AST = RefAdaAST(currentAST.root);
+#line 436 "ada.g"
+ empty_discrim_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DISCRIM_PART_OPT,"DISCRIM_PART_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(empty_discrim_opt_AST))));
+#line 4430 "AdaParser.cpp"
+ currentAST.root = empty_discrim_opt_AST;
+ if ( empty_discrim_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ empty_discrim_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = empty_discrim_opt_AST->getFirstChild();
+ else
+ currentAST.child = empty_discrim_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ empty_discrim_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = empty_discrim_opt_AST;
+}
+
+void AdaParser::discrim_part() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discrim_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ discrim_part_text();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ discrim_part_AST = RefAdaAST(currentAST.root);
+#line 443 "ada.g"
+ discrim_part_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DISCRIM_PART_OPT,"DISCRIM_PART_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(discrim_part_AST))));
+#line 4457 "AdaParser.cpp"
+ currentAST.root = discrim_part_AST;
+ if ( discrim_part_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ discrim_part_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = discrim_part_AST->getFirstChild();
+ else
+ currentAST.child = discrim_part_AST;
+ currentAST.advanceChildToEnd();
+ }
+ discrim_part_AST = RefAdaAST(currentAST.root);
+ returnAST = discrim_part_AST;
+}
+
+void AdaParser::discriminant_specification() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discriminant_specification_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ def_ids_colon();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ access_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ init_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ discriminant_specification_AST = RefAdaAST(currentAST.root);
+#line 457 "ada.g"
+ discriminant_specification_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DISCRIMINANT_SPECIFICATION,"DISCRIMINANT_SPECIFICATION")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(discriminant_specification_AST))));
+#line 4496 "AdaParser.cpp"
+ currentAST.root = discriminant_specification_AST;
+ if ( discriminant_specification_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ discriminant_specification_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = discriminant_specification_AST->getFirstChild();
+ else
+ currentAST.child = discriminant_specification_AST;
+ currentAST.advanceChildToEnd();
+ }
+ discriminant_specification_AST = RefAdaAST(currentAST.root);
+ returnAST = discriminant_specification_AST;
+}
+
+void AdaParser::access_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST access_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case ACCESS:
+ {
+ RefAdaAST tmp142_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp142_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp142_AST));
+ }
+ match(ACCESS);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ access_opt_AST = RefAdaAST(currentAST.root);
+#line 464 "ada.g"
+ access_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(access_opt_AST))));
+#line 4540 "AdaParser.cpp"
+ currentAST.root = access_opt_AST;
+ if ( access_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ access_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = access_opt_AST->getFirstChild();
+ else
+ currentAST.child = access_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ access_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = access_opt_AST;
+}
+
+void AdaParser::entrydecls_repspecs_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST entrydecls_repspecs_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == ENTRY)) {
+ entry_declaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case FOR:
+ {
+ rep_spec();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop142;
+ }
+ }
+ }
+ _loop142:;
+ } // ( ... )*
+ }
+ else {
+ goto _loop143;
+ }
+
+ }
+ _loop143:;
+ } // ( ... )*
+ entrydecls_repspecs_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = entrydecls_repspecs_opt_AST;
+}
+
+void AdaParser::entry_declaration() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST entry_declaration_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken e = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST e_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ e = LT(1);
+ if ( inputState->guessing == 0 ) {
+ e_AST = astFactory->create(e);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(e_AST));
+ }
+ match(ENTRY);
+ RefAdaAST tmp143_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp143_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp143_AST));
+ }
+ match(IDENTIFIER);
+ discrete_subtype_def_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 482 "ada.g"
+ Set (e_AST, ENTRY_DECLARATION);
+#line 4635 "AdaParser.cpp"
+ }
+ entry_declaration_AST = RefAdaAST(currentAST.root);
+ returnAST = entry_declaration_AST;
+}
+
+void AdaParser::rep_spec() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST rep_spec_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken r = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST r_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ r = LT(1);
+ if ( inputState->guessing == 0 ) {
+ r_AST = astFactory->create(r);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(r_AST));
+ }
+ match(FOR);
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(USE);
+ rep_spec_part(r_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ rep_spec_AST = RefAdaAST(currentAST.root);
+ returnAST = rep_spec_AST;
+}
+
+void AdaParser::discrete_subtype_def_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discrete_subtype_def_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ bool synPredMatched148 = false;
+ if (((LA(1) == LPAREN) && (_tokenSet_0.member(LA(2))))) {
+ int _m148 = mark();
+ synPredMatched148 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(LPAREN);
+ discrete_subtype_definition();
+ match(RPAREN);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched148 = false;
+ }
+ rewind(_m148);
+ inputState->guessing--;
+ }
+ if ( synPredMatched148 ) {
+ match(LPAREN);
+ discrete_subtype_definition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ }
+ else if ((LA(1) == SEMI || LA(1) == LPAREN) && (_tokenSet_14.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ if ( inputState->guessing==0 ) {
+ discrete_subtype_def_opt_AST = RefAdaAST(currentAST.root);
+#line 489 "ada.g"
+ discrete_subtype_def_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DISCRETE_SUBTYPE_DEF_OPT,"DISCRETE_SUBTYPE_DEF_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(discrete_subtype_def_opt_AST))));
+#line 4712 "AdaParser.cpp"
+ currentAST.root = discrete_subtype_def_opt_AST;
+ if ( discrete_subtype_def_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ discrete_subtype_def_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = discrete_subtype_def_opt_AST->getFirstChild();
+ else
+ currentAST.child = discrete_subtype_def_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ discrete_subtype_def_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = discrete_subtype_def_opt_AST;
+}
+
+void AdaParser::discrete_subtype_definition() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discrete_subtype_definition_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ bool synPredMatched152 = false;
+ if (((_tokenSet_0.member(LA(1))) && (_tokenSet_8.member(LA(2))))) {
+ int _m152 = mark();
+ synPredMatched152 = true;
+ inputState->guessing++;
+ try {
+ {
+ range();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched152 = false;
+ }
+ rewind(_m152);
+ inputState->guessing--;
+ }
+ if ( synPredMatched152 ) {
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((LA(1) == IDENTIFIER) && (_tokenSet_15.member(LA(2)))) {
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ discrete_subtype_definition_AST = RefAdaAST(currentAST.root);
+ returnAST = discrete_subtype_definition_AST;
+}
+
+void AdaParser::subtype_ind() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST subtype_ind_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ constraint_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ subtype_ind_AST = RefAdaAST(currentAST.root);
+#line 693 "ada.g"
+ subtype_ind_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(SUBTYPE_INDICATION,"SUBTYPE_INDICATION")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(subtype_ind_AST))));
+#line 4785 "AdaParser.cpp"
+ currentAST.root = subtype_ind_AST;
+ if ( subtype_ind_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ subtype_ind_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = subtype_ind_AST->getFirstChild();
+ else
+ currentAST.child = subtype_ind_AST;
+ currentAST.advanceChildToEnd();
+ }
+ subtype_ind_AST = RefAdaAST(currentAST.root);
+ returnAST = subtype_ind_AST;
+}
+
+void AdaParser::rep_spec_part(
+ RefAdaAST t
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST rep_spec_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case RECORD:
+ {
+ match(RECORD);
+ align_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ comp_loc_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(END);
+ match(RECORD);
+ if ( inputState->guessing==0 ) {
+#line 512 "ada.g"
+ Set(t, RECORD_REPRESENTATION_CLAUSE);
+#line 4822 "AdaParser.cpp"
+ }
+ rep_spec_part_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case AT:
+ {
+ match(AT);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 514 "ada.g"
+ Set(t, AT_CLAUSE);
+#line 4837 "AdaParser.cpp"
+ }
+ rep_spec_part_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case ABS:
+ case NUMERIC_LIT:
+ {
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 517 "ada.g"
+ Set(t, ATTRIBUTE_DEFINITION_CLAUSE);
+#line 4861 "AdaParser.cpp"
+ }
+ rep_spec_part_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = rep_spec_part_AST;
+}
+
+void AdaParser::align_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST align_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case AT:
+ {
+ match(AT);
+ match(MOD);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ break;
+ }
+ case PRAGMA:
+ case IDENTIFIER:
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ align_opt_AST = RefAdaAST(currentAST.root);
+#line 521 "ada.g"
+ align_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MOD_CLAUSE_OPT,"MOD_CLAUSE_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(align_opt_AST))));
+#line 4908 "AdaParser.cpp"
+ currentAST.root = align_opt_AST;
+ if ( align_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ align_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = align_opt_AST->getFirstChild();
+ else
+ currentAST.child = align_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ align_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = align_opt_AST;
+}
+
+void AdaParser::comp_loc_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST comp_loc_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ {
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(AT);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RANGE);
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ break;
+ }
+ default:
+ {
+ goto _loop159;
+ }
+ }
+ }
+ _loop159:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ comp_loc_s_AST = RefAdaAST(currentAST.root);
+#line 525 "ada.g"
+ comp_loc_s_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(COMPONENT_CLAUSES_OPT,"COMPONENT_CLAUSES_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(comp_loc_s_AST))));
+#line 4968 "AdaParser.cpp"
+ currentAST.root = comp_loc_s_AST;
+ if ( comp_loc_s_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ comp_loc_s_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = comp_loc_s_AST->getFirstChild();
+ else
+ currentAST.child = comp_loc_s_AST;
+ currentAST.advanceChildToEnd();
+ }
+ comp_loc_s_AST = RefAdaAST(currentAST.root);
+ returnAST = comp_loc_s_AST;
+}
+
+void AdaParser::protected_definition() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST protected_definition_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(IS);
+ prot_op_decl_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ prot_private_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ end_id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ protected_definition_AST = RefAdaAST(currentAST.root);
+ returnAST = protected_definition_AST;
+}
+
+void AdaParser::prot_private_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST prot_private_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case PRIVATE:
+ {
+ match(PRIVATE);
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case PRAGMA:
+ case PROCEDURE:
+ case FUNCTION:
+ case ENTRY:
+ case FOR:
+ {
+ prot_op_decl();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ {
+ comp_decl();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop168;
+ }
+ }
+ }
+ _loop168:;
+ } // ( ... )*
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ prot_private_opt_AST = RefAdaAST(currentAST.root);
+#line 545 "ada.g"
+ prot_private_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PROT_PRIVATE_OPT,"PROT_PRIVATE_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(prot_private_opt_AST))));
+#line 5061 "AdaParser.cpp"
+ currentAST.root = prot_private_opt_AST;
+ if ( prot_private_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ prot_private_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = prot_private_opt_AST->getFirstChild();
+ else
+ currentAST.child = prot_private_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ prot_private_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = prot_private_opt_AST;
+}
+
+void AdaParser::prot_op_decl() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST prot_op_decl_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken f = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST f_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case ENTRY:
+ {
+ entry_declaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ prot_op_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case PROCEDURE:
+ {
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(PROCEDURE);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 561 "ada.g"
+ pop_def_id(); Set(p_AST, PROCEDURE_DECLARATION);
+#line 5113 "AdaParser.cpp"
+ }
+ prot_op_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case FUNCTION:
+ {
+ f = LT(1);
+ if ( inputState->guessing == 0 ) {
+ f_AST = astFactory->create(f);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(f_AST));
+ }
+ match(FUNCTION);
+ def_designator(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ function_tail();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 563 "ada.g"
+ pop_def_id(); Set(f_AST, FUNCTION_DECLARATION);
+#line 5138 "AdaParser.cpp"
+ }
+ prot_op_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case FOR:
+ {
+ rep_spec();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ prot_op_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ prot_op_decl_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = prot_op_decl_AST;
+}
+
+void AdaParser::comp_decl() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST comp_decl_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ def_ids_colon();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ component_subtype_def();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ init_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+ comp_decl_AST = RefAdaAST(currentAST.root);
+#line 575 "ada.g"
+ comp_decl_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(COMPONENT_DECLARATION,"COMPONENT_DECLARATION")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(comp_decl_AST))));
+#line 5192 "AdaParser.cpp"
+ currentAST.root = comp_decl_AST;
+ if ( comp_decl_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ comp_decl_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = comp_decl_AST->getFirstChild();
+ else
+ currentAST.child = comp_decl_AST;
+ currentAST.advanceChildToEnd();
+ }
+ comp_decl_AST = RefAdaAST(currentAST.root);
+ returnAST = comp_decl_AST;
+}
+
+void AdaParser::prot_op_decl_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST prot_op_decl_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_16.member(LA(1)))) {
+ prot_op_decl();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop172;
+ }
+
+ }
+ _loop172:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ prot_op_decl_s_AST = RefAdaAST(currentAST.root);
+#line 555 "ada.g"
+ prot_op_decl_s_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PROT_OP_DECLARATIONS,"PROT_OP_DECLARATIONS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(prot_op_decl_s_AST))));
+#line 5229 "AdaParser.cpp"
+ currentAST.root = prot_op_decl_s_AST;
+ if ( prot_op_decl_s_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ prot_op_decl_s_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = prot_op_decl_s_AST->getFirstChild();
+ else
+ currentAST.child = prot_op_decl_s_AST;
+ currentAST.advanceChildToEnd();
+ }
+ prot_op_decl_s_AST = RefAdaAST(currentAST.root);
+ returnAST = prot_op_decl_s_AST;
+}
+
+void AdaParser::prot_member_decl_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST prot_member_decl_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case PRAGMA:
+ case PROCEDURE:
+ case FUNCTION:
+ case ENTRY:
+ case FOR:
+ {
+ prot_op_decl();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ {
+ comp_decl();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop176;
+ }
+ }
+ }
+ _loop176:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ prot_member_decl_s_AST = RefAdaAST(currentAST.root);
+#line 569 "ada.g"
+ prot_member_decl_s_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PROT_MEMBER_DECLARATIONS,"PROT_MEMBER_DECLARATIONS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(prot_member_decl_s_AST))));
+#line 5283 "AdaParser.cpp"
+ currentAST.root = prot_member_decl_s_AST;
+ if ( prot_member_decl_s_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ prot_member_decl_s_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = prot_member_decl_s_AST->getFirstChild();
+ else
+ currentAST.child = prot_member_decl_s_AST;
+ currentAST.advanceChildToEnd();
+ }
+ prot_member_decl_s_AST = RefAdaAST(currentAST.root);
+ returnAST = prot_member_decl_s_AST;
+}
+
+void AdaParser::component_subtype_def() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST component_subtype_def_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ aliased_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ component_subtype_def_AST = RefAdaAST(currentAST.root);
+ returnAST = component_subtype_def_AST;
+}
+
+void AdaParser::type_def(
+ RefAdaAST t
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST type_def_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ enum_id_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 638 "ada.g"
+ Set(t, ENUMERATION_TYPE_DECLARATION);
+#line 5332 "AdaParser.cpp"
+ }
+ type_def_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case RANGE:
+ {
+ match(RANGE);
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 640 "ada.g"
+ Set(t, SIGNED_INTEGER_TYPE_DECLARATION);
+#line 5347 "AdaParser.cpp"
+ }
+ type_def_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case MOD:
+ {
+ match(MOD);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 642 "ada.g"
+ Set(t, MODULAR_TYPE_DECLARATION);
+#line 5362 "AdaParser.cpp"
+ }
+ type_def_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case DIGITS:
+ {
+ match(DIGITS);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ range_constraint_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 644 "ada.g"
+ Set(t, FLOATING_POINT_DECLARATION);
+#line 5381 "AdaParser.cpp"
+ }
+ type_def_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case DELTA:
+ {
+ match(DELTA);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case RANGE:
+ {
+ match(RANGE);
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 647 "ada.g"
+ Set(t, ORDINARY_FIXED_POINT_DECLARATION);
+#line 5405 "AdaParser.cpp"
+ }
+ break;
+ }
+ case DIGITS:
+ {
+ match(DIGITS);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ range_constraint_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 649 "ada.g"
+ Set(t, DECIMAL_FIXED_POINT_DECLARATION);
+#line 5423 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ type_def_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case ARRAY:
+ {
+ array_type_definition(t);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_def_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case ACCESS:
+ {
+ access_type_definition(t);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_def_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case PRIVATE:
+ case NEW:
+ case NuLL:
+ case RECORD:
+ case ABSTRACT:
+ case TAGGED:
+ case LIMITED:
+ {
+ empty_discrim_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ derived_or_private_or_record(t, false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_def_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = type_def_AST;
+}
+
+void AdaParser::derived_or_private_or_record(
+ RefAdaAST t, boolean has_discrim
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST derived_or_private_or_record_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ bool synPredMatched246 = false;
+ if (((LA(1) == NEW || LA(1) == ABSTRACT) && (LA(2) == IDENTIFIER || LA(2) == NEW))) {
+ int _m246 = mark();
+ synPredMatched246 = true;
+ inputState->guessing++;
+ try {
+ {
+ {
+ switch ( LA(1)) {
+ case ABSTRACT:
+ {
+ match(ABSTRACT);
+ break;
+ }
+ case NEW:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(NEW);
+ subtype_ind();
+ match(WITH);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched246 = false;
+ }
+ rewind(_m246);
+ inputState->guessing--;
+ }
+ if ( synPredMatched246 ) {
+ abstract_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(NEW);
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(WITH);
+ {
+ switch ( LA(1)) {
+ case PRIVATE:
+ {
+ match(PRIVATE);
+ if ( inputState->guessing==0 ) {
+#line 772 "ada.g"
+ Set(t, PRIVATE_EXTENSION_DECLARATION);
+#line 5542 "AdaParser.cpp"
+ }
+ break;
+ }
+ case NuLL:
+ case RECORD:
+ {
+ record_definition(has_discrim);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 774 "ada.g"
+ Set(t, DERIVED_RECORD_EXTENSION);
+#line 5556 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ derived_or_private_or_record_AST = RefAdaAST(currentAST.root);
+ }
+ else if ((LA(1) == NEW) && (LA(2) == IDENTIFIER)) {
+ match(NEW);
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 776 "ada.g"
+ Set(t, ORDINARY_DERIVED_TYPE_DECLARATION);
+#line 5577 "AdaParser.cpp"
+ }
+ derived_or_private_or_record_AST = RefAdaAST(currentAST.root);
+ }
+ else if ((_tokenSet_17.member(LA(1))) && (_tokenSet_18.member(LA(2)))) {
+ abstract_tagged_limited_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case PRIVATE:
+ {
+ match(PRIVATE);
+ if ( inputState->guessing==0 ) {
+#line 778 "ada.g"
+ Set(t, PRIVATE_TYPE_DECLARATION);
+#line 5594 "AdaParser.cpp"
+ }
+ break;
+ }
+ case NuLL:
+ case RECORD:
+ {
+ record_definition(has_discrim);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 780 "ada.g"
+ Set(t, RECORD_TYPE_DECLARATION);
+#line 5608 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ derived_or_private_or_record_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ returnAST = derived_or_private_or_record_AST;
+}
+
+void AdaParser::local_enum_name() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST local_enum_name_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ RefAdaAST tmp177_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp177_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp177_AST));
+ }
+ match(IDENTIFIER);
+ local_enum_name_AST = RefAdaAST(currentAST.root);
+ returnAST = local_enum_name_AST;
+}
+
+void AdaParser::enumeration_aggregate() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST enumeration_aggregate_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ parenth_values();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ enumeration_aggregate_AST = RefAdaAST(currentAST.root);
+ returnAST = enumeration_aggregate_AST;
+}
+
+void AdaParser::aliased_constant_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST aliased_constant_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case ALIASED:
+ {
+ RefAdaAST tmp178_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp178_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp178_AST));
+ }
+ match(ALIASED);
+ break;
+ }
+ case IDENTIFIER:
+ case CONSTANT:
+ case ARRAY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case CONSTANT:
+ {
+ RefAdaAST tmp179_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp179_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp179_AST));
+ }
+ match(CONSTANT);
+ break;
+ }
+ case IDENTIFIER:
+ case ARRAY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ aliased_constant_opt_AST = RefAdaAST(currentAST.root);
+#line 858 "ada.g"
+ aliased_constant_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(aliased_constant_opt_AST))));
+#line 5712 "AdaParser.cpp"
+ currentAST.root = aliased_constant_opt_AST;
+ if ( aliased_constant_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ aliased_constant_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = aliased_constant_opt_AST->getFirstChild();
+ else
+ currentAST.child = aliased_constant_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ aliased_constant_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = aliased_constant_opt_AST;
+}
+
+void AdaParser::array_type_definition(
+ RefAdaAST t
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST array_type_definition_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(ARRAY);
+ match(LPAREN);
+ index_or_discrete_range_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ match(OF);
+ component_subtype_def();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 669 "ada.g"
+ Set(t, ARRAY_TYPE_DECLARATION);
+#line 5747 "AdaParser.cpp"
+ }
+ array_type_definition_AST = RefAdaAST(currentAST.root);
+ returnAST = array_type_definition_AST;
+}
+
+void AdaParser::enum_id_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST enum_id_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ enumeration_literal_specification();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ enumeration_literal_specification();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop197;
+ }
+
+ }
+ _loop197:;
+ } // ( ... )*
+ enum_id_s_AST = RefAdaAST(currentAST.root);
+ returnAST = enum_id_s_AST;
+}
+
+void AdaParser::range_constraint_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST range_constraint_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case RANGE:
+ {
+ range_constraint();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case COMMA:
+ case RPAREN:
+ case WITH:
+ case ASSIGN:
+ case LOOP:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ range_constraint_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = range_constraint_opt_AST;
+}
+
+void AdaParser::access_type_definition(
+ RefAdaAST t
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST access_type_definition_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(ACCESS);
+ {
+ switch ( LA(1)) {
+ case PROCEDURE:
+ case FUNCTION:
+ case PROTECTED:
+ {
+ protected_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case PROCEDURE:
+ {
+ match(PROCEDURE);
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 751 "ada.g"
+ Set(t, ACCESS_TO_PROCEDURE_DECLARATION);
+#line 5846 "AdaParser.cpp"
+ }
+ break;
+ }
+ case FUNCTION:
+ {
+ match(FUNCTION);
+ func_formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RETURN);
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 753 "ada.g"
+ Set(t, ACCESS_TO_FUNCTION_DECLARATION);
+#line 5865 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case ALL:
+ case CONSTANT:
+ {
+ constant_all_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 756 "ada.g"
+ Set(t, ACCESS_TO_OBJECT_DECLARATION);
+#line 5892 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ access_type_definition_AST = RefAdaAST(currentAST.root);
+ returnAST = access_type_definition_AST;
+}
+
+void AdaParser::enumeration_literal_specification() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST enumeration_literal_specification_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp189_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp189_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp189_AST));
+ }
+ match(IDENTIFIER);
+ enumeration_literal_specification_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ RefAdaAST tmp190_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp190_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp190_AST));
+ }
+ match(CHARACTER_LITERAL);
+ enumeration_literal_specification_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = enumeration_literal_specification_AST;
+}
+
+void AdaParser::index_or_discrete_range_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST index_or_discrete_range_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ index_or_discrete_range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ RefAdaAST tmp191_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp191_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp191_AST));
+ }
+ match(COMMA);
+ index_or_discrete_range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop204;
+ }
+
+ }
+ _loop204:;
+ } // ( ... )*
+ index_or_discrete_range_s_AST = RefAdaAST(currentAST.root);
+ returnAST = index_or_discrete_range_s_AST;
+}
+
+void AdaParser::index_or_discrete_range() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST index_or_discrete_range_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case DOT_DOT:
+ {
+ RefAdaAST tmp192_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp192_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp192_AST));
+ }
+ match(DOT_DOT);
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RANGE:
+ {
+ RefAdaAST tmp193_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp193_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp193_AST));
+ }
+ match(RANGE);
+ {
+ switch ( LA(1)) {
+ case BOX:
+ {
+ RefAdaAST tmp194_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp194_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp194_AST));
+ }
+ match(BOX);
+ break;
+ }
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case ABS:
+ case NUMERIC_LIT:
+ {
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case COMMA:
+ case RPAREN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ index_or_discrete_range_AST = RefAdaAST(currentAST.root);
+ returnAST = index_or_discrete_range_AST;
+}
+
+void AdaParser::aliased_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST aliased_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case ALIASED:
+ {
+ RefAdaAST tmp195_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp195_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp195_AST));
+ }
+ match(ALIASED);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ aliased_opt_AST = RefAdaAST(currentAST.root);
+#line 689 "ada.g"
+ aliased_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(aliased_opt_AST))));
+#line 6093 "AdaParser.cpp"
+ currentAST.root = aliased_opt_AST;
+ if ( aliased_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ aliased_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = aliased_opt_AST->getFirstChild();
+ else
+ currentAST.child = aliased_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ aliased_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = aliased_opt_AST;
+}
+
+void AdaParser::constraint_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST constraint_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case RANGE:
+ {
+ range_constraint();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case DIGITS:
+ {
+ digits_constraint();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case DELTA:
+ {
+ delta_constraint();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case COMMA:
+ case RPAREN:
+ case WITH:
+ case ASSIGN:
+ case LOOP:
+ {
+ break;
+ }
+ default:
+ bool synPredMatched215 = false;
+ if (((LA(1) == LPAREN) && (_tokenSet_0.member(LA(2))))) {
+ int _m215 = mark();
+ synPredMatched215 = true;
+ inputState->guessing++;
+ try {
+ {
+ index_constraint();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched215 = false;
+ }
+ rewind(_m215);
+ inputState->guessing--;
+ }
+ if ( synPredMatched215 ) {
+ index_constraint();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((LA(1) == LPAREN) && (_tokenSet_0.member(LA(2)))) {
+ discriminant_constraint();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ constraint_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = constraint_opt_AST;
+}
+
+void AdaParser::digits_constraint() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST digits_constraint_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken d = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST d_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ d = LT(1);
+ if ( inputState->guessing == 0 ) {
+ d_AST = astFactory->create(d);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(d_AST));
+ }
+ match(DIGITS);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ range_constraint_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 706 "ada.g"
+ Set(d_AST, DIGITS_CONSTRAINT);
+#line 6208 "AdaParser.cpp"
+ }
+ digits_constraint_AST = RefAdaAST(currentAST.root);
+ returnAST = digits_constraint_AST;
+}
+
+void AdaParser::delta_constraint() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST delta_constraint_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken d = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST d_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ d = LT(1);
+ if ( inputState->guessing == 0 ) {
+ d_AST = astFactory->create(d);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(d_AST));
+ }
+ match(DELTA);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ range_constraint_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 710 "ada.g"
+ Set(d_AST, DELTA_CONSTRAINT);
+#line 6238 "AdaParser.cpp"
+ }
+ delta_constraint_AST = RefAdaAST(currentAST.root);
+ returnAST = delta_constraint_AST;
+}
+
+void AdaParser::index_constraint() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST index_constraint_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(LPAREN);
+ discrete_range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ discrete_range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop220;
+ }
+
+ }
+ _loop220:;
+ } // ( ... )*
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 714 "ada.g"
+ Set(p_AST, INDEX_CONSTRAINT);
+#line 6281 "AdaParser.cpp"
+ }
+ index_constraint_AST = RefAdaAST(currentAST.root);
+ returnAST = index_constraint_AST;
+}
+
+void AdaParser::discriminant_constraint() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discriminant_constraint_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(LPAREN);
+ discriminant_association();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ discriminant_association();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop226;
+ }
+
+ }
+ _loop226:;
+ } // ( ... )*
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 724 "ada.g"
+ Set(p_AST, DISCRIMINANT_CONSTRAINT);
+#line 6324 "AdaParser.cpp"
+ }
+ discriminant_constraint_AST = RefAdaAST(currentAST.root);
+ returnAST = discriminant_constraint_AST;
+}
+
+void AdaParser::discrete_range() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discrete_range_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ bool synPredMatched223 = false;
+ if (((_tokenSet_0.member(LA(1))) && (_tokenSet_8.member(LA(2))))) {
+ int _m223 = mark();
+ synPredMatched223 = true;
+ inputState->guessing++;
+ try {
+ {
+ range();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched223 = false;
+ }
+ rewind(_m223);
+ inputState->guessing--;
+ }
+ if ( synPredMatched223 ) {
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ discrete_range_AST = RefAdaAST(currentAST.root);
+ }
+ else if ((LA(1) == IDENTIFIER) && (_tokenSet_19.member(LA(2)))) {
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ discrete_range_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ returnAST = discrete_range_AST;
+}
+
+void AdaParser::discriminant_association() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discriminant_association_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ selector_names_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ discriminant_association_AST = RefAdaAST(currentAST.root);
+#line 728 "ada.g"
+ discriminant_association_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DISCRIMINANT_ASSOCIATION,"DISCRIMINANT_ASSOCIATION")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(discriminant_association_AST))));
+#line 6390 "AdaParser.cpp"
+ currentAST.root = discriminant_association_AST;
+ if ( discriminant_association_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ discriminant_association_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = discriminant_association_AST->getFirstChild();
+ else
+ currentAST.child = discriminant_association_AST;
+ currentAST.advanceChildToEnd();
+ }
+ discriminant_association_AST = RefAdaAST(currentAST.root);
+ returnAST = discriminant_association_AST;
+}
+
+void AdaParser::selector_names_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST selector_names_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ bool synPredMatched231 = false;
+ if (((LA(1) == IDENTIFIER) && (LA(2) == RIGHT_SHAFT || LA(2) == PIPE))) {
+ int _m231 = mark();
+ synPredMatched231 = true;
+ inputState->guessing++;
+ try {
+ {
+ association_head();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched231 = false;
+ }
+ rewind(_m231);
+ inputState->guessing--;
+ }
+ if ( synPredMatched231 ) {
+ association_head();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((_tokenSet_0.member(LA(1))) && (_tokenSet_1.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ if ( inputState->guessing==0 ) {
+ selector_names_opt_AST = RefAdaAST(currentAST.root);
+#line 736 "ada.g"
+ selector_names_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(SELECTOR_NAMES_OPT,"SELECTOR_NAMES_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(selector_names_opt_AST))));
+#line 6443 "AdaParser.cpp"
+ currentAST.root = selector_names_opt_AST;
+ if ( selector_names_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ selector_names_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = selector_names_opt_AST->getFirstChild();
+ else
+ currentAST.child = selector_names_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ selector_names_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = selector_names_opt_AST;
+}
+
+void AdaParser::association_head() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST association_head_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ selector_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == PIPE)) {
+ match(PIPE);
+ selector_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop234;
+ }
+
+ }
+ _loop234:;
+ } // ( ... )*
+ match(RIGHT_SHAFT);
+ association_head_AST = RefAdaAST(currentAST.root);
+ returnAST = association_head_AST;
+}
+
+void AdaParser::selector_name() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST selector_name_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ RefAdaAST tmp202_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp202_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp202_AST));
+ }
+ match(IDENTIFIER);
+ selector_name_AST = RefAdaAST(currentAST.root);
+ returnAST = selector_name_AST;
+}
+
+void AdaParser::protected_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST protected_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case PROTECTED:
+ {
+ RefAdaAST tmp203_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp203_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp203_AST));
+ }
+ match(PROTECTED);
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ protected_opt_AST = RefAdaAST(currentAST.root);
+#line 761 "ada.g"
+ protected_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(protected_opt_AST))));
+#line 6533 "AdaParser.cpp"
+ currentAST.root = protected_opt_AST;
+ if ( protected_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ protected_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = protected_opt_AST->getFirstChild();
+ else
+ currentAST.child = protected_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ protected_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = protected_opt_AST;
+}
+
+void AdaParser::constant_all_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST constant_all_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case CONSTANT:
+ {
+ RefAdaAST tmp204_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp204_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp204_AST));
+ }
+ match(CONSTANT);
+ break;
+ }
+ case ALL:
+ {
+ RefAdaAST tmp205_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp205_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp205_AST));
+ }
+ match(ALL);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ constant_all_opt_AST = RefAdaAST(currentAST.root);
+#line 765 "ada.g"
+ constant_all_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(constant_all_opt_AST))));
+#line 6588 "AdaParser.cpp"
+ currentAST.root = constant_all_opt_AST;
+ if ( constant_all_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ constant_all_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = constant_all_opt_AST->getFirstChild();
+ else
+ currentAST.child = constant_all_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ constant_all_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = constant_all_opt_AST;
+}
+
+void AdaParser::abstract_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST abstract_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case ABSTRACT:
+ {
+ RefAdaAST tmp206_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp206_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp206_AST));
+ }
+ match(ABSTRACT);
+ break;
+ }
+ case NEW:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ abstract_opt_AST = RefAdaAST(currentAST.root);
+#line 785 "ada.g"
+ abstract_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(abstract_opt_AST))));
+#line 6632 "AdaParser.cpp"
+ currentAST.root = abstract_opt_AST;
+ if ( abstract_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ abstract_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = abstract_opt_AST->getFirstChild();
+ else
+ currentAST.child = abstract_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ abstract_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = abstract_opt_AST;
+}
+
+void AdaParser::record_definition(
+ boolean has_discrim
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST record_definition_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case RECORD:
+ {
+ match(RECORD);
+ component_list(has_discrim);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(END);
+ match(RECORD);
+ record_definition_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case NuLL:
+ {
+ match(NuLL);
+ match(RECORD);
+ record_definition_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = record_definition_AST;
+}
+
+void AdaParser::abstract_tagged_limited_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST abstract_tagged_limited_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case ABSTRACT:
+ {
+ RefAdaAST tmp212_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp212_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp212_AST));
+ }
+ match(ABSTRACT);
+ match(TAGGED);
+ break;
+ }
+ case TAGGED:
+ {
+ RefAdaAST tmp214_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp214_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp214_AST));
+ }
+ match(TAGGED);
+ break;
+ }
+ case PRIVATE:
+ case NuLL:
+ case RECORD:
+ case LIMITED:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case LIMITED:
+ {
+ RefAdaAST tmp215_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp215_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp215_AST));
+ }
+ match(LIMITED);
+ break;
+ }
+ case PRIVATE:
+ case NuLL:
+ case RECORD:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ abstract_tagged_limited_opt_AST = RefAdaAST(currentAST.root);
+#line 847 "ada.g"
+ abstract_tagged_limited_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(abstract_tagged_limited_opt_AST))));
+#line 6750 "AdaParser.cpp"
+ currentAST.root = abstract_tagged_limited_opt_AST;
+ if ( abstract_tagged_limited_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ abstract_tagged_limited_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = abstract_tagged_limited_opt_AST->getFirstChild();
+ else
+ currentAST.child = abstract_tagged_limited_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ abstract_tagged_limited_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = abstract_tagged_limited_opt_AST;
+}
+
+void AdaParser::component_list(
+ boolean has_discrim
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST component_list_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case NuLL:
+ {
+ match(NuLL);
+ match(SEMI);
+ component_list_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case PRAGMA:
+ case IDENTIFIER:
+ {
+ component_items();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case CASE:
+ {
+ variant_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if (!( has_discrim ))
+ throw ANTLR_USE_NAMESPACE(antlr)SemanticException(" has_discrim ");
+ break;
+ }
+ case END:
+ case WHEN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ component_list_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case CASE:
+ {
+ empty_component_items();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ variant_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if (!( has_discrim ))
+ throw ANTLR_USE_NAMESPACE(antlr)SemanticException(" has_discrim ");
+ component_list_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = component_list_AST;
+}
+
+void AdaParser::component_items() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST component_items_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )+
+ int _cnt256=0;
+ for (;;) {
+ switch ( LA(1)) {
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ {
+ comp_decl();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ if ( _cnt256>=1 ) { goto _loop256; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+ }
+ _cnt256++;
+ }
+ _loop256:;
+ } // ( ... )+
+ if ( inputState->guessing==0 ) {
+ component_items_AST = RefAdaAST(currentAST.root);
+#line 800 "ada.g"
+ component_items_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(COMPONENT_ITEMS,"COMPONENT_ITEMS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(component_items_AST))));
+#line 6873 "AdaParser.cpp"
+ currentAST.root = component_items_AST;
+ if ( component_items_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ component_items_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = component_items_AST->getFirstChild();
+ else
+ currentAST.child = component_items_AST;
+ currentAST.advanceChildToEnd();
+ }
+ component_items_AST = RefAdaAST(currentAST.root);
+ returnAST = component_items_AST;
+}
+
+void AdaParser::variant_part() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST variant_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken c = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST c_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ c = LT(1);
+ if ( inputState->guessing == 0 ) {
+ c_AST = astFactory->create(c);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(c_AST));
+ }
+ match(CASE);
+ discriminant_direct_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IS);
+ variant_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(END);
+ match(CASE);
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 812 "ada.g"
+ Set (c_AST, VARIANT_PART);
+#line 6914 "AdaParser.cpp"
+ }
+ variant_part_AST = RefAdaAST(currentAST.root);
+ returnAST = variant_part_AST;
+}
+
+void AdaParser::empty_component_items() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST empty_component_items_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ if ( inputState->guessing==0 ) {
+ empty_component_items_AST = RefAdaAST(currentAST.root);
+#line 806 "ada.g"
+ empty_component_items_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(COMPONENT_ITEMS,"COMPONENT_ITEMS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(empty_component_items_AST))));
+#line 6930 "AdaParser.cpp"
+ currentAST.root = empty_component_items_AST;
+ if ( empty_component_items_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ empty_component_items_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = empty_component_items_AST->getFirstChild();
+ else
+ currentAST.child = empty_component_items_AST;
+ currentAST.advanceChildToEnd();
+ }
+ empty_component_items_AST = RefAdaAST(currentAST.root);
+ returnAST = empty_component_items_AST;
+}
+
+void AdaParser::discriminant_direct_name() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discriminant_direct_name_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ RefAdaAST tmp222_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp222_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp222_AST));
+ }
+ match(IDENTIFIER);
+ discriminant_direct_name_AST = RefAdaAST(currentAST.root);
+ returnAST = discriminant_direct_name_AST;
+}
+
+void AdaParser::variant_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST variant_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )+
+ int _cnt262=0;
+ for (;;) {
+ if ((LA(1) == WHEN)) {
+ variant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ if ( _cnt262>=1 ) { goto _loop262; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt262++;
+ }
+ _loop262:;
+ } // ( ... )+
+ if ( inputState->guessing==0 ) {
+ variant_s_AST = RefAdaAST(currentAST.root);
+#line 819 "ada.g"
+ variant_s_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(VARIANTS,"VARIANTS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(variant_s_AST))));
+#line 6984 "AdaParser.cpp"
+ currentAST.root = variant_s_AST;
+ if ( variant_s_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ variant_s_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = variant_s_AST->getFirstChild();
+ else
+ currentAST.child = variant_s_AST;
+ currentAST.advanceChildToEnd();
+ }
+ variant_s_AST = RefAdaAST(currentAST.root);
+ returnAST = variant_s_AST;
+}
+
+void AdaParser::variant() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST variant_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken w = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST w_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ w = LT(1);
+ if ( inputState->guessing == 0 ) {
+ w_AST = astFactory->create(w);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(w_AST));
+ }
+ match(WHEN);
+ choice_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RIGHT_SHAFT);
+ component_list(true);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 823 "ada.g"
+ Set (w_AST, VARIANT);
+#line 7022 "AdaParser.cpp"
+ }
+ variant_AST = RefAdaAST(currentAST.root);
+ returnAST = variant_AST;
+}
+
+void AdaParser::choice_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST choice_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ choice();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == PIPE)) {
+ RefAdaAST tmp224_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp224_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp224_AST));
+ }
+ match(PIPE);
+ choice();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop266;
+ }
+
+ }
+ _loop266:;
+ } // ( ... )*
+ choice_s_AST = RefAdaAST(currentAST.root);
+ returnAST = choice_s_AST;
+}
+
+void AdaParser::choice() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST choice_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ if ((LA(1) == OTHERS)) {
+ RefAdaAST tmp225_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp225_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp225_AST));
+ }
+ match(OTHERS);
+ choice_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ bool synPredMatched269 = false;
+ if (((_tokenSet_0.member(LA(1))) && (_tokenSet_20.member(LA(2))))) {
+ int _m269 = mark();
+ synPredMatched269 = true;
+ inputState->guessing++;
+ try {
+ {
+ discrete_with_range();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched269 = false;
+ }
+ rewind(_m269);
+ inputState->guessing--;
+ }
+ if ( synPredMatched269 ) {
+ discrete_with_range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ choice_AST = RefAdaAST(currentAST.root);
+ }
+ else if ((_tokenSet_0.member(LA(1))) && (_tokenSet_21.member(LA(2)))) {
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ choice_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = choice_AST;
+}
+
+void AdaParser::discrete_with_range() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discrete_with_range_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ bool synPredMatched272 = false;
+ if (((LA(1) == IDENTIFIER) && (LA(2) == DOT || LA(2) == TIC || LA(2) == RANGE))) {
+ int _m272 = mark();
+ synPredMatched272 = true;
+ inputState->guessing++;
+ try {
+ {
+ mark_with_constraint();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched272 = false;
+ }
+ rewind(_m272);
+ inputState->guessing--;
+ }
+ if ( synPredMatched272 ) {
+ mark_with_constraint();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ discrete_with_range_AST = RefAdaAST(currentAST.root);
+ }
+ else if ((_tokenSet_0.member(LA(1))) && (_tokenSet_8.member(LA(2)))) {
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ discrete_with_range_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ returnAST = discrete_with_range_AST;
+}
+
+void AdaParser::mark_with_constraint() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST mark_with_constraint_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ range_constraint();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ mark_with_constraint_AST = RefAdaAST(currentAST.root);
+#line 839 "ada.g"
+ mark_with_constraint_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MARK_WITH_CONSTRAINT,"MARK_WITH_CONSTRAINT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(mark_with_constraint_AST))));
+#line 7174 "AdaParser.cpp"
+ currentAST.root = mark_with_constraint_AST;
+ if ( mark_with_constraint_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ mark_with_constraint_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = mark_with_constraint_AST->getFirstChild();
+ else
+ currentAST.child = mark_with_constraint_AST;
+ currentAST.advanceChildToEnd();
+ }
+ mark_with_constraint_AST = RefAdaAST(currentAST.root);
+ returnAST = mark_with_constraint_AST;
+}
+
+void AdaParser::generic_formal_part_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST generic_formal_part_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case USE:
+ {
+ use_clause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case WITH:
+ case TYPE:
+ {
+ generic_formal_parameter();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop289;
+ }
+ }
+ }
+ _loop289:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ generic_formal_part_opt_AST = RefAdaAST(currentAST.root);
+#line 885 "ada.g"
+ generic_formal_part_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(GENERIC_FORMAL_PART,"GENERIC_FORMAL_PART")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(generic_formal_part_opt_AST))));
+#line 7234 "AdaParser.cpp"
+ currentAST.root = generic_formal_part_opt_AST;
+ if ( generic_formal_part_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ generic_formal_part_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = generic_formal_part_opt_AST->getFirstChild();
+ else
+ currentAST.child = generic_formal_part_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ generic_formal_part_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = generic_formal_part_opt_AST;
+}
+
+void AdaParser::generic_formal_parameter() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST generic_formal_parameter_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken t = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST t_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken w = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST w_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case TYPE:
+ {
+ t = LT(1);
+ if ( inputState->guessing == 0 ) {
+ t_AST = astFactory->create(t);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(t_AST));
+ }
+ match(TYPE);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case IS:
+ {
+ match(IS);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ match(BOX);
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 895 "ada.g"
+ Set (t_AST, FORMAL_DISCRETE_TYPE_DECLARATION);
+#line 7285 "AdaParser.cpp"
+ }
+ break;
+ }
+ case RANGE:
+ {
+ match(RANGE);
+ match(BOX);
+ if ( inputState->guessing==0 ) {
+#line 897 "ada.g"
+ Set (t_AST, FORMAL_SIGNED_INTEGER_TYPE_DECLARATION);
+#line 7296 "AdaParser.cpp"
+ }
+ break;
+ }
+ case MOD:
+ {
+ match(MOD);
+ match(BOX);
+ if ( inputState->guessing==0 ) {
+#line 899 "ada.g"
+ Set (t_AST, FORMAL_MODULAR_TYPE_DECLARATION);
+#line 7307 "AdaParser.cpp"
+ }
+ break;
+ }
+ case DELTA:
+ {
+ match(DELTA);
+ match(BOX);
+ {
+ switch ( LA(1)) {
+ case DIGITS:
+ {
+ match(DIGITS);
+ match(BOX);
+ if ( inputState->guessing==0 ) {
+#line 902 "ada.g"
+ Set (t_AST, FORMAL_DECIMAL_FIXED_POINT_DECLARATION);
+#line 7324 "AdaParser.cpp"
+ }
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 903 "ada.g"
+ Set (t_AST, FORMAL_ORDINARY_FIXED_POINT_DECLARATION);
+#line 7333 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case DIGITS:
+ {
+ match(DIGITS);
+ match(BOX);
+ if ( inputState->guessing==0 ) {
+#line 906 "ada.g"
+ Set (t_AST, FORMAL_FLOATING_POINT_DECLARATION);
+#line 7352 "AdaParser.cpp"
+ }
+ break;
+ }
+ case ARRAY:
+ {
+ array_type_definition(t_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case ACCESS:
+ {
+ access_type_definition(t_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PRIVATE:
+ case NEW:
+ case ABSTRACT:
+ case TAGGED:
+ case LIMITED:
+ {
+ empty_discrim_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ discriminable_type_definition(t_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case LPAREN:
+ {
+ discrim_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IS);
+ discriminable_type_definition(t_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+#line 913 "ada.g"
+ pop_def_id();
+#line 7418 "AdaParser.cpp"
+ }
+ break;
+ }
+ case WITH:
+ {
+ w = LT(1);
+ if ( inputState->guessing == 0 ) {
+ w_AST = astFactory->create(w);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(w_AST));
+ }
+ match(WITH);
+ {
+ switch ( LA(1)) {
+ case PROCEDURE:
+ {
+ match(PROCEDURE);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subprogram_default_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 915 "ada.g"
+ Set(w_AST, FORMAL_PROCEDURE_DECLARATION);
+#line 7450 "AdaParser.cpp"
+ }
+ break;
+ }
+ case FUNCTION:
+ {
+ match(FUNCTION);
+ def_designator(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ function_tail();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subprogram_default_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 917 "ada.g"
+ Set(w_AST, FORMAL_FUNCTION_DECLARATION);
+#line 7472 "AdaParser.cpp"
+ }
+ break;
+ }
+ case PACKAGE:
+ {
+ match(PACKAGE);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IS);
+ match(NEW);
+ compound_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formal_package_actual_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 919 "ada.g"
+ Set(w_AST, FORMAL_PACKAGE_DECLARATION);
+#line 7496 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+#line 921 "ada.g"
+ pop_def_id();
+#line 7509 "AdaParser.cpp"
+ }
+ break;
+ }
+ case IDENTIFIER:
+ {
+ parameter_specification();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ generic_formal_parameter_AST = RefAdaAST(currentAST.root);
+ returnAST = generic_formal_parameter_AST;
+}
+
+void AdaParser::discriminable_type_definition(
+ RefAdaAST t
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST discriminable_type_definition_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ bool synPredMatched299 = false;
+ if (((LA(1) == NEW || LA(1) == ABSTRACT) && (LA(2) == IDENTIFIER || LA(2) == NEW))) {
+ int _m299 = mark();
+ synPredMatched299 = true;
+ inputState->guessing++;
+ try {
+ {
+ {
+ switch ( LA(1)) {
+ case ABSTRACT:
+ {
+ match(ABSTRACT);
+ break;
+ }
+ case NEW:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(NEW);
+ subtype_ind();
+ match(WITH);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched299 = false;
+ }
+ rewind(_m299);
+ inputState->guessing--;
+ }
+ if ( synPredMatched299 ) {
+ abstract_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(NEW);
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(WITH);
+ match(PRIVATE);
+ if ( inputState->guessing==0 ) {
+#line 930 "ada.g"
+ Set (t, FORMAL_PRIVATE_EXTENSION_DECLARATION);
+#line 7589 "AdaParser.cpp"
+ }
+ discriminable_type_definition_AST = RefAdaAST(currentAST.root);
+ }
+ else if ((LA(1) == NEW) && (LA(2) == IDENTIFIER)) {
+ match(NEW);
+ subtype_ind();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 932 "ada.g"
+ Set (t, FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION);
+#line 7602 "AdaParser.cpp"
+ }
+ discriminable_type_definition_AST = RefAdaAST(currentAST.root);
+ }
+ else if ((_tokenSet_22.member(LA(1))) && (_tokenSet_23.member(LA(2)))) {
+ abstract_tagged_limited_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(PRIVATE);
+ if ( inputState->guessing==0 ) {
+#line 934 "ada.g"
+ Set (t, FORMAL_PRIVATE_TYPE_DECLARATION);
+#line 7615 "AdaParser.cpp"
+ }
+ discriminable_type_definition_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ returnAST = discriminable_type_definition_AST;
+}
+
+void AdaParser::subprogram_default_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST subprogram_default_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case IS:
+ {
+ match(IS);
+ {
+ switch ( LA(1)) {
+ case BOX:
+ {
+ RefAdaAST tmp253_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp253_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp253_AST));
+ }
+ match(BOX);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ subprogram_default_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = subprogram_default_opt_AST;
+}
+
+void AdaParser::formal_package_actual_part_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST formal_package_actual_part_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ {
+ switch ( LA(1)) {
+ case BOX:
+ {
+ RefAdaAST tmp255_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp255_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp255_AST));
+ }
+ match(BOX);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ defining_identifier_list();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(RPAREN);
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ formal_package_actual_part_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = formal_package_actual_part_opt_AST;
+}
+
+void AdaParser::body_part() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST body_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ declarative_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ block_body();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ end_id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ body_part_AST = RefAdaAST(currentAST.root);
+ returnAST = body_part_AST;
+}
+
+void AdaParser::declarative_part() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST declarative_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case TASK:
+ case PROTECTED:
+ case FOR:
+ case SUBTYPE:
+ case GENERIC:
+ {
+ declarative_item();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop316;
+ }
+ }
+ }
+ _loop316:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ declarative_part_AST = RefAdaAST(currentAST.root);
+#line 978 "ada.g"
+ declarative_part_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DECLARATIVE_PART,"DECLARATIVE_PART")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(declarative_part_AST))));
+#line 7799 "AdaParser.cpp"
+ currentAST.root = declarative_part_AST;
+ if ( declarative_part_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ declarative_part_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = declarative_part_AST->getFirstChild();
+ else
+ currentAST.child = declarative_part_AST;
+ currentAST.advanceChildToEnd();
+ }
+ declarative_part_AST = RefAdaAST(currentAST.root);
+ returnAST = declarative_part_AST;
+}
+
+void AdaParser::block_body() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST block_body_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken b = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST b_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ b = LT(1);
+ if ( inputState->guessing == 0 ) {
+ b_AST = astFactory->create(b);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(b_AST));
+ }
+ match(BEGIN);
+ handled_stmt_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1058 "ada.g"
+ Set(b_AST, BLOCK_BODY);
+#line 7832 "AdaParser.cpp"
+ }
+ block_body_AST = RefAdaAST(currentAST.root);
+ returnAST = block_body_AST;
+}
+
+void AdaParser::declarative_item() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST declarative_item_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken pkg = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST pkg_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken tsk = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST tsk_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken pro = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST pro_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case PACKAGE:
+ {
+ pkg = LT(1);
+ if ( inputState->guessing == 0 ) {
+ pkg_AST = astFactory->create(pkg);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(pkg_AST));
+ }
+ match(PACKAGE);
+ {
+ switch ( LA(1)) {
+ case BODY:
+ {
+ body_is();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case SEPARATE:
+ {
+ separate();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 986 "ada.g"
+ Set(pkg_AST, PACKAGE_BODY_STUB);
+#line 7878 "AdaParser.cpp"
+ }
+ break;
+ }
+ case PRAGMA:
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case TASK:
+ case PROTECTED:
+ case FOR:
+ case END:
+ case SUBTYPE:
+ case GENERIC:
+ case BEGIN:
+ {
+ pkg_body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 988 "ada.g"
+ Set(pkg_AST, PACKAGE_BODY);
+#line 7904 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ spec_decl_part(pkg_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case TASK:
+ {
+ tsk = LT(1);
+ if ( inputState->guessing == 0 ) {
+ tsk_AST = astFactory->create(tsk);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tsk_AST));
+ }
+ match(TASK);
+ {
+ switch ( LA(1)) {
+ case BODY:
+ {
+ body_is();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case SEPARATE:
+ {
+ separate();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 994 "ada.g"
+ Set(tsk_AST, TASK_BODY_STUB);
+#line 7964 "AdaParser.cpp"
+ }
+ break;
+ }
+ case PRAGMA:
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case PACKAGE:
+ case PROCEDURE:
+ case FUNCTION:
+ case TASK:
+ case PROTECTED:
+ case FOR:
+ case SUBTYPE:
+ case GENERIC:
+ case BEGIN:
+ {
+ body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 995 "ada.g"
+ Set(tsk_AST, TASK_BODY);
+#line 7989 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ break;
+ }
+ case IDENTIFIER:
+ case TYPE:
+ {
+ task_type_or_single_decl(tsk_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case PROTECTED:
+ {
+ pro = LT(1);
+ if ( inputState->guessing == 0 ) {
+ pro_AST = astFactory->create(pro);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(pro_AST));
+ }
+ match(PROTECTED);
+ {
+ switch ( LA(1)) {
+ case BODY:
+ {
+ body_is();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case SEPARATE:
+ {
+ separate();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1002 "ada.g"
+ Set(pro_AST, PROTECTED_BODY_STUB);
+#line 8046 "AdaParser.cpp"
+ }
+ break;
+ }
+ case PRAGMA:
+ case PROCEDURE:
+ case FUNCTION:
+ case ENTRY:
+ case END:
+ {
+ prot_op_bodies_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ end_id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1004 "ada.g"
+ Set(pro_AST, PROTECTED_BODY);
+#line 8067 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case TYPE:
+ {
+ prot_type_or_single_decl(pro_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ subprog_decl_or_rename_or_inst_or_body(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case USE:
+ case TYPE:
+ case FOR:
+ case SUBTYPE:
+ case GENERIC:
+ {
+ decl_common();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ declarative_item_AST = RefAdaAST(currentAST.root);
+ returnAST = declarative_item_AST;
+}
+
+void AdaParser::body_is() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST body_is_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(BODY);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IS);
+ body_is_AST = RefAdaAST(currentAST.root);
+ returnAST = body_is_AST;
+}
+
+void AdaParser::separate() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST separate_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(SEPARATE);
+ if ( inputState->guessing==0 ) {
+#line 1023 "ada.g"
+ pop_def_id();
+#line 8153 "AdaParser.cpp"
+ }
+ separate_AST = RefAdaAST(currentAST.root);
+ returnAST = separate_AST;
+}
+
+void AdaParser::prot_op_bodies_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST prot_op_bodies_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case ENTRY:
+ {
+ entry_body();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ subprog_decl_or_body();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop332;
+ }
+ }
+ }
+ _loop332:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ prot_op_bodies_opt_AST = RefAdaAST(currentAST.root);
+#line 1039 "ada.g"
+ prot_op_bodies_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PROT_OP_BODIES_OPT,"PROT_OP_BODIES_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(prot_op_bodies_opt_AST))));
+#line 8205 "AdaParser.cpp"
+ currentAST.root = prot_op_bodies_opt_AST;
+ if ( prot_op_bodies_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ prot_op_bodies_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = prot_op_bodies_opt_AST->getFirstChild();
+ else
+ currentAST.child = prot_op_bodies_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ prot_op_bodies_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = prot_op_bodies_opt_AST;
+}
+
+void AdaParser::block_body_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST block_body_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case BEGIN:
+ {
+ match(BEGIN);
+ handled_stmt_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ block_body_opt_AST = RefAdaAST(currentAST.root);
+#line 1030 "ada.g"
+ block_body_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(BLOCK_BODY_OPT,"BLOCK_BODY_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(block_body_opt_AST))));
+#line 8249 "AdaParser.cpp"
+ currentAST.root = block_body_opt_AST;
+ if ( block_body_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ block_body_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = block_body_opt_AST->getFirstChild();
+ else
+ currentAST.child = block_body_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ block_body_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = block_body_opt_AST;
+}
+
+void AdaParser::handled_stmt_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST handled_stmt_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ except_handler_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ handled_stmt_s_AST = RefAdaAST(currentAST.root);
+#line 1062 "ada.g"
+ handled_stmt_s_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(HANDLED_SEQUENCE_OF_STATEMENTS,"HANDLED_SEQUENCE_OF_STATEMENTS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(handled_stmt_s_AST))));
+#line 8280 "AdaParser.cpp"
+ currentAST.root = handled_stmt_s_AST;
+ if ( handled_stmt_s_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ handled_stmt_s_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = handled_stmt_s_AST->getFirstChild();
+ else
+ currentAST.child = handled_stmt_s_AST;
+ currentAST.advanceChildToEnd();
+ }
+ handled_stmt_s_AST = RefAdaAST(currentAST.root);
+ returnAST = handled_stmt_s_AST;
+}
+
+void AdaParser::entry_body() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST entry_body_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken e = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST e_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ e = LT(1);
+ if ( inputState->guessing == 0 ) {
+ e_AST = astFactory->create(e);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(e_AST));
+ }
+ match(ENTRY);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ entry_body_formal_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ entry_barrier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IS);
+ body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1236 "ada.g"
+ Set (e_AST, ENTRY_BODY);
+#line 8327 "AdaParser.cpp"
+ }
+ entry_body_AST = RefAdaAST(currentAST.root);
+ returnAST = entry_body_AST;
+}
+
+void AdaParser::subprog_decl_or_body() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST subprog_decl_or_body_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken f = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST f_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case PROCEDURE:
+ {
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(PROCEDURE);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case IS:
+ {
+ match(IS);
+ body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1046 "ada.g"
+ Set(p_AST, PROCEDURE_BODY);
+#line 8371 "AdaParser.cpp"
+ }
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 1047 "ada.g"
+ pop_def_id(); Set(p_AST, PROCEDURE_DECLARATION);
+#line 8380 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ subprog_decl_or_body_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case FUNCTION:
+ {
+ f = LT(1);
+ if ( inputState->guessing == 0 ) {
+ f_AST = astFactory->create(f);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(f_AST));
+ }
+ match(FUNCTION);
+ def_designator(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ function_tail();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case IS:
+ {
+ match(IS);
+ body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1051 "ada.g"
+ Set(f_AST, FUNCTION_BODY);
+#line 8422 "AdaParser.cpp"
+ }
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 1052 "ada.g"
+ pop_def_id(); Set(f_AST, FUNCTION_DECLARATION);
+#line 8431 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ subprog_decl_or_body_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = subprog_decl_or_body_AST;
+}
+
+void AdaParser::statements() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST statements_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )+
+ int _cnt342=0;
+ for (;;) {
+ switch ( LA(1)) {
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case NuLL:
+ case RETURN:
+ case FOR:
+ case CASE:
+ case BEGIN:
+ case LT_LT:
+ case IF:
+ case LOOP:
+ case WHILE:
+ case DECLARE:
+ case EXIT:
+ case GOTO:
+ case ACCEPT:
+ case DELAY:
+ case SELECT:
+ case ABORT:
+ case RAISE:
+ case REQUEUE:
+ {
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ if ( _cnt342>=1 ) { goto _loop342; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+ }
+ _cnt342++;
+ }
+ _loop342:;
+ } // ( ... )+
+ if ( inputState->guessing==0 ) {
+ statements_AST = RefAdaAST(currentAST.root);
+#line 1074 "ada.g"
+ statements_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(SEQUENCE_OF_STATEMENTS,"SEQUENCE_OF_STATEMENTS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(statements_AST))));
+#line 8509 "AdaParser.cpp"
+ currentAST.root = statements_AST;
+ if ( statements_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ statements_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = statements_AST->getFirstChild();
+ else
+ currentAST.child = statements_AST;
+ currentAST.advanceChildToEnd();
+ }
+ statements_AST = RefAdaAST(currentAST.root);
+ returnAST = statements_AST;
+}
+
+void AdaParser::except_handler_part_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST except_handler_part_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case EXCEPTION:
+ {
+ match(EXCEPTION);
+ { // ( ... )+
+ int _cnt429=0;
+ for (;;) {
+ if ((LA(1) == WHEN)) {
+ exception_handler();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ if ( _cnt429>=1 ) { goto _loop429; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt429++;
+ }
+ _loop429:;
+ } // ( ... )+
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ except_handler_part_opt_AST = RefAdaAST(currentAST.root);
+#line 1365 "ada.g"
+ except_handler_part_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(EXCEPT_HANDLER_PART_OPT,"EXCEPT_HANDLER_PART_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(except_handler_part_opt_AST))));
+#line 8566 "AdaParser.cpp"
+ currentAST.root = except_handler_part_opt_AST;
+ if ( except_handler_part_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ except_handler_part_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = except_handler_part_opt_AST->getFirstChild();
+ else
+ currentAST.child = except_handler_part_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ except_handler_part_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = except_handler_part_opt_AST;
+}
+
+void AdaParser::handled_stmts_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST handled_stmts_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case PRAGMA:
+ case IDENTIFIER:
+ case NuLL:
+ case RETURN:
+ case FOR:
+ case CASE:
+ case BEGIN:
+ case LT_LT:
+ case IF:
+ case LOOP:
+ case WHILE:
+ case DECLARE:
+ case EXIT:
+ case GOTO:
+ case ACCEPT:
+ case DELAY:
+ case SELECT:
+ case ABORT:
+ case RAISE:
+ case REQUEUE:
+ {
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ except_handler_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ handled_stmts_opt_AST = RefAdaAST(currentAST.root);
+#line 1068 "ada.g"
+ handled_stmts_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(HANDLED_STMTS_OPT,"HANDLED_STMTS_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(handled_stmts_opt_AST))));
+#line 8632 "AdaParser.cpp"
+ currentAST.root = handled_stmts_opt_AST;
+ if ( handled_stmts_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ handled_stmts_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = handled_stmts_opt_AST->getFirstChild();
+ else
+ currentAST.child = handled_stmts_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ handled_stmts_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = handled_stmts_opt_AST;
+}
+
+void AdaParser::statement() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST statement_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ def_label_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case NuLL:
+ {
+ null_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case EXIT:
+ {
+ exit_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RETURN:
+ {
+ return_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case GOTO:
+ {
+ goto_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case DELAY:
+ {
+ delay_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case ABORT:
+ {
+ abort_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RAISE:
+ {
+ raise_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case REQUEUE:
+ {
+ requeue_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case ACCEPT:
+ {
+ accept_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SELECT:
+ {
+ select_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IF:
+ {
+ if_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case CASE:
+ {
+ case_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case FOR:
+ case LOOP:
+ case WHILE:
+ {
+ loop_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ break;
+ }
+ case BEGIN:
+ case DECLARE:
+ {
+ block();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(END);
+ match(SEMI);
+ break;
+ }
+ default:
+ if ((LA(1) == IDENTIFIER) && (LA(2) == COLON)) {
+ statement_identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case FOR:
+ case LOOP:
+ case WHILE:
+ {
+ loop_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ break;
+ }
+ case BEGIN:
+ case DECLARE:
+ {
+ block();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ end_id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else if ((LA(1) == IDENTIFIER) && (_tokenSet_24.member(LA(2)))) {
+ call_or_assignment();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ statement_AST = RefAdaAST(currentAST.root);
+#line 1100 "ada.g"
+ statement_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(STATEMENT,"STATEMENT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(statement_AST))));
+#line 8833 "AdaParser.cpp"
+ currentAST.root = statement_AST;
+ if ( statement_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ statement_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = statement_AST->getFirstChild();
+ else
+ currentAST.child = statement_AST;
+ currentAST.advanceChildToEnd();
+ }
+ statement_AST = RefAdaAST(currentAST.root);
+ returnAST = statement_AST;
+}
+
+void AdaParser::def_label_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST def_label_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case LT_LT:
+ {
+ match(LT_LT);
+ RefAdaAST tmp277_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp277_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp277_AST));
+ }
+ match(IDENTIFIER);
+ match(GT_GT);
+ break;
+ }
+ case IDENTIFIER:
+ case NuLL:
+ case RETURN:
+ case FOR:
+ case CASE:
+ case BEGIN:
+ case IF:
+ case LOOP:
+ case WHILE:
+ case DECLARE:
+ case EXIT:
+ case GOTO:
+ case ACCEPT:
+ case DELAY:
+ case SELECT:
+ case ABORT:
+ case RAISE:
+ case REQUEUE:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ def_label_opt_AST = RefAdaAST(currentAST.root);
+#line 1104 "ada.g"
+ def_label_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(LABEL_OPT,"LABEL_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(def_label_opt_AST))));
+#line 8896 "AdaParser.cpp"
+ currentAST.root = def_label_opt_AST;
+ if ( def_label_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ def_label_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = def_label_opt_AST->getFirstChild();
+ else
+ currentAST.child = def_label_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ def_label_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = def_label_opt_AST;
+}
+
+void AdaParser::null_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST null_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(NuLL);
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1108 "ada.g"
+ Set(s_AST, NULL_STATEMENT);
+#line 8926 "AdaParser.cpp"
+ }
+ null_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = null_stmt_AST;
+}
+
+void AdaParser::exit_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST exit_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(EXIT);
+ {
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ {
+ label_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case WHEN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case WHEN:
+ {
+ RefAdaAST tmp280_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp280_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp280_AST));
+ }
+ match(WHEN);
+ condition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1206 "ada.g"
+ Set(s_AST, EXIT_STATEMENT);
+#line 8996 "AdaParser.cpp"
+ }
+ exit_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = exit_stmt_AST;
+}
+
+void AdaParser::return_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST return_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(RETURN);
+ {
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case ABS:
+ case NUMERIC_LIT:
+ {
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1213 "ada.g"
+ Set(s_AST, RETURN_STATEMENT);
+#line 9049 "AdaParser.cpp"
+ }
+ return_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = return_stmt_AST;
+}
+
+void AdaParser::goto_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST goto_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(GOTO);
+ label_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1217 "ada.g"
+ Set(s_AST, GOTO_STATEMENT);
+#line 9076 "AdaParser.cpp"
+ }
+ goto_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = goto_stmt_AST;
+}
+
+void AdaParser::delay_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST delay_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken d = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST d_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ d = LT(1);
+ if ( inputState->guessing == 0 ) {
+ d_AST = astFactory->create(d);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(d_AST));
+ }
+ match(DELAY);
+ until_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1282 "ada.g"
+ Set (d_AST, DELAY_STATEMENT);
+#line 9107 "AdaParser.cpp"
+ }
+ delay_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = delay_stmt_AST;
+}
+
+void AdaParser::abort_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST abort_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken a = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST a_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ a = LT(1);
+ if ( inputState->guessing == 0 ) {
+ a_AST = astFactory->create(a);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(a_AST));
+ }
+ match(ABORT);
+ name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop425;
+ }
+
+ }
+ _loop425:;
+ } // ( ... )*
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1361 "ada.g"
+ Set (a_AST, ABORT_STATEMENT);
+#line 9150 "AdaParser.cpp"
+ }
+ abort_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = abort_stmt_AST;
+}
+
+void AdaParser::raise_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST raise_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken r = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST r_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ r = LT(1);
+ if ( inputState->guessing == 0 ) {
+ r_AST = astFactory->create(r);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(r_AST));
+ }
+ match(RAISE);
+ {
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ {
+ compound_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1389 "ada.g"
+ Set (r_AST, RAISE_STATEMENT);
+#line 9193 "AdaParser.cpp"
+ }
+ raise_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = raise_stmt_AST;
+}
+
+void AdaParser::requeue_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST requeue_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken r = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST r_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ r = LT(1);
+ if ( inputState->guessing == 0 ) {
+ r_AST = astFactory->create(r);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(r_AST));
+ }
+ match(REQUEUE);
+ name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case WITH:
+ {
+ match(WITH);
+ RefAdaAST tmp289_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp289_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp289_AST));
+ }
+ match(ABORT);
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1393 "ada.g"
+ Set (r_AST, REQUEUE_STATEMENT);
+#line 9243 "AdaParser.cpp"
+ }
+ requeue_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = requeue_stmt_AST;
+}
+
+void AdaParser::accept_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST accept_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken a = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST a_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ a = LT(1);
+ if ( inputState->guessing == 0 ) {
+ a_AST = astFactory->create(a);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(a_AST));
+ }
+ match(ACCEPT);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ entry_index_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case DO:
+ {
+ match(DO);
+ handled_stmts_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ end_id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ break;
+ }
+ case SEMI:
+ {
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1264 "ada.g"
+ pop_def_id();
+#line 9296 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+#line 1266 "ada.g"
+ Set (a_AST, ACCEPT_STATEMENT);
+#line 9309 "AdaParser.cpp"
+ }
+ accept_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = accept_stmt_AST;
+}
+
+void AdaParser::select_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST select_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(SELECT);
+ {
+ bool synPredMatched403 = false;
+ if (((LA(1) == IDENTIFIER || LA(1) == DELAY) && (_tokenSet_25.member(LA(2))))) {
+ int _m403 = mark();
+ synPredMatched403 = true;
+ inputState->guessing++;
+ try {
+ {
+ triggering_alternative();
+ match(THEN);
+ match(ABORT);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched403 = false;
+ }
+ rewind(_m403);
+ inputState->guessing--;
+ }
+ if ( synPredMatched403 ) {
+ triggering_alternative();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(THEN);
+ match(ABORT);
+ abortable_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1297 "ada.g"
+ Set (s_AST, ASYNCHRONOUS_SELECT);
+#line 9361 "AdaParser.cpp"
+ }
+ }
+ else if ((_tokenSet_26.member(LA(1))) && (_tokenSet_27.member(LA(2)))) {
+ selective_accept();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1299 "ada.g"
+ Set (s_AST, SELECTIVE_ACCEPT);
+#line 9372 "AdaParser.cpp"
+ }
+ }
+ else if ((LA(1) == IDENTIFIER) && (_tokenSet_28.member(LA(2)))) {
+ entry_call_alternative();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case OR:
+ {
+ match(OR);
+ delay_alternative();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1301 "ada.g"
+ Set (s_AST, TIMED_ENTRY_CALL);
+#line 9392 "AdaParser.cpp"
+ }
+ break;
+ }
+ case ELSE:
+ {
+ match(ELSE);
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1302 "ada.g"
+ Set (s_AST, CONDITIONAL_ENTRY_CALL);
+#line 9406 "AdaParser.cpp"
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ match(END);
+ match(SELECT);
+ match(SEMI);
+ select_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = select_stmt_AST;
+}
+
+void AdaParser::if_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST if_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(IF);
+ cond_clause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ elsifs_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ else_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(END);
+ match(IF);
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1114 "ada.g"
+ Set(s_AST, IF_STATEMENT);
+#line 9460 "AdaParser.cpp"
+ }
+ if_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = if_stmt_AST;
+}
+
+void AdaParser::case_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST case_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(CASE);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IS);
+ alternative_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(END);
+ match(CASE);
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1134 "ada.g"
+ Set(s_AST, CASE_STATEMENT);
+#line 9494 "AdaParser.cpp"
+ }
+ case_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = case_stmt_AST;
+}
+
+void AdaParser::loop_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST loop_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken l = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST l_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ iteration_scheme_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ l = LT(1);
+ if ( inputState->guessing == 0 ) {
+ l_AST = astFactory->create(l);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(l_AST));
+ }
+ match(LOOP);
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(END);
+ match(LOOP);
+ if ( inputState->guessing==0 ) {
+#line 1146 "ada.g"
+ Set(l_AST, LOOP_STATEMENT);
+#line 9526 "AdaParser.cpp"
+ }
+ loop_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = loop_stmt_AST;
+}
+
+void AdaParser::block() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST block_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ declare_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ block_body();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ block_AST = RefAdaAST(currentAST.root);
+#line 1198 "ada.g"
+ block_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(BLOCK_STATEMENT,"BLOCK_STATEMENT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(block_AST))));
+#line 9549 "AdaParser.cpp"
+ currentAST.root = block_AST;
+ if ( block_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ block_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = block_AST->getFirstChild();
+ else
+ currentAST.child = block_AST;
+ currentAST.advanceChildToEnd();
+ }
+ block_AST = RefAdaAST(currentAST.root);
+ returnAST = block_AST;
+}
+
+void AdaParser::statement_identifier() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST statement_identifier_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken n = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST n_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ n = LT(1);
+ if ( inputState->guessing == 0 ) {
+ n_AST = astFactory->create(n);
+ }
+ match(IDENTIFIER);
+ match(COLON);
+ if ( inputState->guessing==0 ) {
+#line 1186 "ada.g"
+ push_def_id(n_AST);
+#line 9578 "AdaParser.cpp"
+ }
+ returnAST = statement_identifier_AST;
+}
+
+void AdaParser::id_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST id_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ id_opt_aux();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ id_opt_AST = RefAdaAST(currentAST.root);
+#line 1172 "ada.g"
+ id_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ID_OPT,"ID_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(id_opt_AST))));
+#line 9596 "AdaParser.cpp"
+ currentAST.root = id_opt_AST;
+ if ( id_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ id_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = id_opt_AST->getFirstChild();
+ else
+ currentAST.child = id_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ id_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = id_opt_AST;
+}
+
+void AdaParser::call_or_assignment() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST call_or_assignment_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case ASSIGN:
+ {
+ match(ASSIGN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ call_or_assignment_AST = RefAdaAST(currentAST.root);
+#line 1222 "ada.g"
+ call_or_assignment_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ASSIGNMENT_STATEMENT,"ASSIGNMENT_STATEMENT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(call_or_assignment_AST))));
+#line 9632 "AdaParser.cpp"
+ currentAST.root = call_or_assignment_AST;
+ if ( call_or_assignment_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ call_or_assignment_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = call_or_assignment_AST->getFirstChild();
+ else
+ currentAST.child = call_or_assignment_AST;
+ currentAST.advanceChildToEnd();
+ }
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+ call_or_assignment_AST = RefAdaAST(currentAST.root);
+#line 1225 "ada.g"
+ call_or_assignment_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(CALL_STATEMENT,"CALL_STATEMENT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(call_or_assignment_AST))));
+#line 9650 "AdaParser.cpp"
+ currentAST.root = call_or_assignment_AST;
+ if ( call_or_assignment_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ call_or_assignment_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = call_or_assignment_AST->getFirstChild();
+ else
+ currentAST.child = call_or_assignment_AST;
+ currentAST.advanceChildToEnd();
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ call_or_assignment_AST = RefAdaAST(currentAST.root);
+ returnAST = call_or_assignment_AST;
+}
+
+void AdaParser::cond_clause() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST cond_clause_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken c = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST c_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ condition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ c = LT(1);
+ if ( inputState->guessing == 0 ) {
+ c_AST = astFactory->create(c);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(c_AST));
+ }
+ match(THEN);
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1118 "ada.g"
+ Set(c_AST, COND_CLAUSE);
+#line 9696 "AdaParser.cpp"
+ }
+ cond_clause_AST = RefAdaAST(currentAST.root);
+ returnAST = cond_clause_AST;
+}
+
+void AdaParser::elsifs_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST elsifs_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == ELSIF)) {
+ match(ELSIF);
+ cond_clause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop354;
+ }
+
+ }
+ _loop354:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ elsifs_opt_AST = RefAdaAST(currentAST.root);
+#line 1126 "ada.g"
+ elsifs_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ELSIFS_OPT,"ELSIFS_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(elsifs_opt_AST))));
+#line 9727 "AdaParser.cpp"
+ currentAST.root = elsifs_opt_AST;
+ if ( elsifs_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ elsifs_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = elsifs_opt_AST->getFirstChild();
+ else
+ currentAST.child = elsifs_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ elsifs_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = elsifs_opt_AST;
+}
+
+void AdaParser::else_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST else_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case ELSE:
+ {
+ match(ELSE);
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ else_opt_AST = RefAdaAST(currentAST.root);
+#line 1130 "ada.g"
+ else_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ELSE_OPT,"ELSE_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(else_opt_AST))));
+#line 9770 "AdaParser.cpp"
+ currentAST.root = else_opt_AST;
+ if ( else_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ else_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = else_opt_AST->getFirstChild();
+ else
+ currentAST.child = else_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ else_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = else_opt_AST;
+}
+
+void AdaParser::condition() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST condition_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ condition_AST = RefAdaAST(currentAST.root);
+ returnAST = condition_AST;
+}
+
+void AdaParser::alternative_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST alternative_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )+
+ int _cnt360=0;
+ for (;;) {
+ if ((LA(1) == WHEN)) {
+ case_statement_alternative();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ if ( _cnt360>=1 ) { goto _loop360; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt360++;
+ }
+ _loop360:;
+ } // ( ... )+
+ alternative_s_AST = RefAdaAST(currentAST.root);
+ returnAST = alternative_s_AST;
+}
+
+void AdaParser::case_statement_alternative() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST case_statement_alternative_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(WHEN);
+ choice_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RIGHT_SHAFT);
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1141 "ada.g"
+ Set(s_AST, CASE_STATEMENT_ALTERNATIVE);
+#line 9847 "AdaParser.cpp"
+ }
+ case_statement_alternative_AST = RefAdaAST(currentAST.root);
+ returnAST = case_statement_alternative_AST;
+}
+
+void AdaParser::iteration_scheme_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST iteration_scheme_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case WHILE:
+ {
+ RefAdaAST tmp316_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp316_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp316_AST));
+ }
+ match(WHILE);
+ condition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case FOR:
+ {
+ RefAdaAST tmp317_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp317_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp317_AST));
+ }
+ match(FOR);
+ RefAdaAST tmp318_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp318_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp318_AST));
+ }
+ match(IDENTIFIER);
+ match(IN);
+ reverse_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ discrete_subtype_definition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case LOOP:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ iteration_scheme_opt_AST = RefAdaAST(currentAST.root);
+#line 1152 "ada.g"
+ iteration_scheme_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ITERATION_SCHEME_OPT,"ITERATION_SCHEME_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(iteration_scheme_opt_AST))));
+#line 9914 "AdaParser.cpp"
+ currentAST.root = iteration_scheme_opt_AST;
+ if ( iteration_scheme_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ iteration_scheme_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = iteration_scheme_opt_AST->getFirstChild();
+ else
+ currentAST.child = iteration_scheme_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ iteration_scheme_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = iteration_scheme_opt_AST;
+}
+
+void AdaParser::reverse_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST reverse_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case REVERSE:
+ {
+ RefAdaAST tmp320_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp320_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp320_AST));
+ }
+ match(REVERSE);
+ break;
+ }
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case ABS:
+ case NUMERIC_LIT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ reverse_opt_AST = RefAdaAST(currentAST.root);
+#line 1158 "ada.g"
+ reverse_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(reverse_opt_AST))));
+#line 9968 "AdaParser.cpp"
+ currentAST.root = reverse_opt_AST;
+ if ( reverse_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ reverse_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = reverse_opt_AST->getFirstChild();
+ else
+ currentAST.child = reverse_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ reverse_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = reverse_opt_AST;
+}
+
+void AdaParser::id_opt_aux() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST id_opt_aux_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefAdaAST n_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+#line 1161 "ada.g"
+ RefAdaAST endid;
+#line 9988 "AdaParser.cpp"
+
+ switch ( LA(1)) {
+ case CHAR_STRING:
+ {
+ endid=definable_operator_symbol();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if (!( end_id_matches_def_id (endid) ))
+ throw ANTLR_USE_NAMESPACE(antlr)SemanticException(" end_id_matches_def_id (endid) ");
+ id_opt_aux_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ compound_name();
+ if (inputState->guessing==0) {
+ n_AST = returnAST;
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if (!( end_id_matches_def_id (n_AST) ))
+ throw ANTLR_USE_NAMESPACE(antlr)SemanticException(" end_id_matches_def_id (n_AST) ");
+ id_opt_aux_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case SEMI:
+ {
+ if ( inputState->guessing==0 ) {
+#line 1168 "ada.g"
+ pop_def_id();
+#line 10019 "AdaParser.cpp"
+ }
+ id_opt_aux_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = id_opt_aux_AST;
+}
+
+void AdaParser::declare_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST declare_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case DECLARE:
+ {
+ match(DECLARE);
+ declarative_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case BEGIN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ declare_opt_AST = RefAdaAST(currentAST.root);
+#line 1202 "ada.g"
+ declare_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DECLARE_OPT,"DECLARE_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(declare_opt_AST))));
+#line 10062 "AdaParser.cpp"
+ currentAST.root = declare_opt_AST;
+ if ( declare_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ declare_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = declare_opt_AST->getFirstChild();
+ else
+ currentAST.child = declare_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ declare_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = declare_opt_AST;
+}
+
+void AdaParser::label_name() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST label_name_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ RefAdaAST tmp322_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp322_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp322_AST));
+ }
+ match(IDENTIFIER);
+ label_name_AST = RefAdaAST(currentAST.root);
+ returnAST = label_name_AST;
+}
+
+void AdaParser::entry_body_formal_part() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST entry_body_formal_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ entry_index_spec_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ entry_body_formal_part_AST = RefAdaAST(currentAST.root);
+ returnAST = entry_body_formal_part_AST;
+}
+
+void AdaParser::entry_barrier() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST entry_barrier_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(WHEN);
+ condition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ entry_barrier_AST = RefAdaAST(currentAST.root);
+ returnAST = entry_barrier_AST;
+}
+
+void AdaParser::entry_index_spec_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST entry_index_spec_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ bool synPredMatched388 = false;
+ if (((LA(1) == LPAREN) && (LA(2) == FOR))) {
+ int _m388 = mark();
+ synPredMatched388 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(LPAREN);
+ match(FOR);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched388 = false;
+ }
+ rewind(_m388);
+ inputState->guessing--;
+ }
+ if ( synPredMatched388 ) {
+ match(LPAREN);
+ match(FOR);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IN);
+ discrete_subtype_definition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ }
+ else if ((LA(1) == LPAREN || LA(1) == WHEN) && (_tokenSet_0.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ if ( inputState->guessing==0 ) {
+ entry_index_spec_opt_AST = RefAdaAST(currentAST.root);
+#line 1247 "ada.g"
+ entry_index_spec_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ENTRY_INDEX_SPECIFICATION,"ENTRY_INDEX_SPECIFICATION")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(entry_index_spec_opt_AST))));
+#line 10170 "AdaParser.cpp"
+ currentAST.root = entry_index_spec_opt_AST;
+ if ( entry_index_spec_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ entry_index_spec_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = entry_index_spec_opt_AST->getFirstChild();
+ else
+ currentAST.child = entry_index_spec_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ entry_index_spec_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = entry_index_spec_opt_AST;
+}
+
+void AdaParser::entry_call_stmt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST entry_call_stmt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+ entry_call_stmt_AST = RefAdaAST(currentAST.root);
+#line 1257 "ada.g"
+ entry_call_stmt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ENTRY_CALL_STATEMENT,"ENTRY_CALL_STATEMENT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(entry_call_stmt_AST))));
+#line 10198 "AdaParser.cpp"
+ currentAST.root = entry_call_stmt_AST;
+ if ( entry_call_stmt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ entry_call_stmt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = entry_call_stmt_AST->getFirstChild();
+ else
+ currentAST.child = entry_call_stmt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ entry_call_stmt_AST = RefAdaAST(currentAST.root);
+ returnAST = entry_call_stmt_AST;
+}
+
+void AdaParser::entry_index_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST entry_index_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ bool synPredMatched396 = false;
+ if (((LA(1) == LPAREN) && (_tokenSet_0.member(LA(2))))) {
+ int _m396 = mark();
+ synPredMatched396 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(LPAREN);
+ expression();
+ match(RPAREN);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched396 = false;
+ }
+ rewind(_m396);
+ inputState->guessing--;
+ }
+ if ( synPredMatched396 ) {
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ }
+ else if ((LA(1) == SEMI || LA(1) == LPAREN || LA(1) == DO) && (_tokenSet_29.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ if ( inputState->guessing==0 ) {
+ entry_index_opt_AST = RefAdaAST(currentAST.root);
+#line 1276 "ada.g"
+ entry_index_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ENTRY_INDEX_OPT,"ENTRY_INDEX_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(entry_index_opt_AST))));
+#line 10255 "AdaParser.cpp"
+ currentAST.root = entry_index_opt_AST;
+ if ( entry_index_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ entry_index_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = entry_index_opt_AST->getFirstChild();
+ else
+ currentAST.child = entry_index_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ entry_index_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = entry_index_opt_AST;
+}
+
+void AdaParser::until_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST until_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case UNTIL:
+ {
+ RefAdaAST tmp331_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp331_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp331_AST));
+ }
+ match(UNTIL);
+ break;
+ }
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case ABS:
+ case NUMERIC_LIT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ until_opt_AST = RefAdaAST(currentAST.root);
+#line 1286 "ada.g"
+ until_opt_AST = RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(until_opt_AST))));
+#line 10309 "AdaParser.cpp"
+ currentAST.root = until_opt_AST;
+ if ( until_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ until_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = until_opt_AST->getFirstChild();
+ else
+ currentAST.child = until_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ until_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = until_opt_AST;
+}
+
+void AdaParser::triggering_alternative() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST triggering_alternative_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case DELAY:
+ {
+ delay_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ {
+ entry_call_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ stmts_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ triggering_alternative_AST = RefAdaAST(currentAST.root);
+#line 1310 "ada.g"
+ triggering_alternative_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(TRIGGERING_ALTERNATIVE,"TRIGGERING_ALTERNATIVE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(triggering_alternative_AST))));
+#line 10360 "AdaParser.cpp"
+ currentAST.root = triggering_alternative_AST;
+ if ( triggering_alternative_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ triggering_alternative_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = triggering_alternative_AST->getFirstChild();
+ else
+ currentAST.child = triggering_alternative_AST;
+ currentAST.advanceChildToEnd();
+ }
+ triggering_alternative_AST = RefAdaAST(currentAST.root);
+ returnAST = triggering_alternative_AST;
+}
+
+void AdaParser::abortable_part() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST abortable_part_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ stmts_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ abortable_part_AST = RefAdaAST(currentAST.root);
+#line 1316 "ada.g"
+ abortable_part_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ABORTABLE_PART,"ABORTABLE_PART")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(abortable_part_AST))));
+#line 10387 "AdaParser.cpp"
+ currentAST.root = abortable_part_AST;
+ if ( abortable_part_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ abortable_part_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = abortable_part_AST->getFirstChild();
+ else
+ currentAST.child = abortable_part_AST;
+ currentAST.advanceChildToEnd();
+ }
+ abortable_part_AST = RefAdaAST(currentAST.root);
+ returnAST = abortable_part_AST;
+}
+
+void AdaParser::selective_accept() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST selective_accept_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ guard_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ select_alternative();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ or_select_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ else_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ selective_accept_AST = RefAdaAST(currentAST.root);
+ returnAST = selective_accept_AST;
+}
+
+void AdaParser::entry_call_alternative() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST entry_call_alternative_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ entry_call_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ stmts_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ entry_call_alternative_AST = RefAdaAST(currentAST.root);
+#line 1322 "ada.g"
+ entry_call_alternative_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ENTRY_CALL_ALTERNATIVE,"ENTRY_CALL_ALTERNATIVE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(entry_call_alternative_AST))));
+#line 10443 "AdaParser.cpp"
+ currentAST.root = entry_call_alternative_AST;
+ if ( entry_call_alternative_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ entry_call_alternative_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = entry_call_alternative_AST->getFirstChild();
+ else
+ currentAST.child = entry_call_alternative_AST;
+ currentAST.advanceChildToEnd();
+ }
+ entry_call_alternative_AST = RefAdaAST(currentAST.root);
+ returnAST = entry_call_alternative_AST;
+}
+
+void AdaParser::delay_alternative() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST delay_alternative_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ delay_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ stmts_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ delay_alternative_AST = RefAdaAST(currentAST.root);
+#line 1347 "ada.g"
+ delay_alternative_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(DELAY_ALTERNATIVE,"DELAY_ALTERNATIVE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(delay_alternative_AST))));
+#line 10474 "AdaParser.cpp"
+ currentAST.root = delay_alternative_AST;
+ if ( delay_alternative_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ delay_alternative_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = delay_alternative_AST->getFirstChild();
+ else
+ currentAST.child = delay_alternative_AST;
+ currentAST.advanceChildToEnd();
+ }
+ delay_alternative_AST = RefAdaAST(currentAST.root);
+ returnAST = delay_alternative_AST;
+}
+
+void AdaParser::stmts_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST stmts_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case PRAGMA:
+ {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case NuLL:
+ case RETURN:
+ case FOR:
+ case CASE:
+ case BEGIN:
+ case LT_LT:
+ case IF:
+ case LOOP:
+ case WHILE:
+ case DECLARE:
+ case EXIT:
+ case GOTO:
+ case ACCEPT:
+ case DELAY:
+ case SELECT:
+ case ABORT:
+ case RAISE:
+ case REQUEUE:
+ {
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop419;
+ }
+ }
+ }
+ _loop419:;
+ } // ( ... )*
+ stmts_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = stmts_opt_AST;
+}
+
+void AdaParser::guard_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST guard_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken w = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST w_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case WHEN:
+ {
+ w = LT(1);
+ if ( inputState->guessing == 0 ) {
+ w_AST = astFactory->create(w);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(w_AST));
+ }
+ match(WHEN);
+ condition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RIGHT_SHAFT);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == PRAGMA)) {
+ pragma();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop413;
+ }
+
+ }
+ _loop413:;
+ } // ( ... )*
+ break;
+ }
+ case ACCEPT:
+ case DELAY:
+ case TERMINATE:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+#line 1331 "ada.g"
+ Set(w_AST, GUARD_OPT);
+#line 10595 "AdaParser.cpp"
+ }
+ guard_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = guard_opt_AST;
+}
+
+void AdaParser::select_alternative() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST select_alternative_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken t = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST t_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case ACCEPT:
+ {
+ accept_alternative();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ select_alternative_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case DELAY:
+ {
+ delay_alternative();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ select_alternative_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case TERMINATE:
+ {
+ t = LT(1);
+ if ( inputState->guessing == 0 ) {
+ t_AST = astFactory->create(t);
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(t_AST));
+ }
+ match(TERMINATE);
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1337 "ada.g"
+ Set(t_AST, TERMINATE_ALTERNATIVE);
+#line 10639 "AdaParser.cpp"
+ }
+ select_alternative_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = select_alternative_AST;
+}
+
+void AdaParser::or_select_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST or_select_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == OR)) {
+ match(OR);
+ guard_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ select_alternative();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop422;
+ }
+
+ }
+ _loop422:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ or_select_opt_AST = RefAdaAST(currentAST.root);
+#line 1356 "ada.g"
+ or_select_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(OR_SELECT_OPT,"OR_SELECT_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(or_select_opt_AST))));
+#line 10682 "AdaParser.cpp"
+ currentAST.root = or_select_opt_AST;
+ if ( or_select_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ or_select_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = or_select_opt_AST->getFirstChild();
+ else
+ currentAST.child = or_select_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ or_select_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = or_select_opt_AST;
+}
+
+void AdaParser::accept_alternative() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST accept_alternative_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ accept_stmt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ stmts_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ accept_alternative_AST = RefAdaAST(currentAST.root);
+#line 1341 "ada.g"
+ accept_alternative_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ACCEPT_ALTERNATIVE,"ACCEPT_ALTERNATIVE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(accept_alternative_AST))));
+#line 10713 "AdaParser.cpp"
+ currentAST.root = accept_alternative_AST;
+ if ( accept_alternative_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ accept_alternative_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = accept_alternative_AST->getFirstChild();
+ else
+ currentAST.child = accept_alternative_AST;
+ currentAST.advanceChildToEnd();
+ }
+ accept_alternative_AST = RefAdaAST(currentAST.root);
+ returnAST = accept_alternative_AST;
+}
+
+void AdaParser::exception_handler() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST exception_handler_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken w = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST w_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ w = LT(1);
+ if ( inputState->guessing == 0 ) {
+ w_AST = astFactory->create(w);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(w_AST));
+ }
+ match(WHEN);
+ identifier_colon_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ except_choice_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RIGHT_SHAFT);
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1372 "ada.g"
+ Set (w_AST, EXCEPTION_HANDLER);
+#line 10755 "AdaParser.cpp"
+ }
+ exception_handler_AST = RefAdaAST(currentAST.root);
+ returnAST = exception_handler_AST;
+}
+
+void AdaParser::identifier_colon_opt() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST identifier_colon_opt_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ if ((LA(1) == IDENTIFIER) && (LA(2) == COLON)) {
+ RefAdaAST tmp336_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp336_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp336_AST));
+ }
+ match(IDENTIFIER);
+ match(COLON);
+ }
+ else if ((LA(1) == IDENTIFIER || LA(1) == OTHERS) && (LA(2) == RIGHT_SHAFT || LA(2) == DOT || LA(2) == PIPE)) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ if ( inputState->guessing==0 ) {
+ identifier_colon_opt_AST = RefAdaAST(currentAST.root);
+#line 1376 "ada.g"
+ identifier_colon_opt_AST =
+ RefAdaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(IDENTIFIER_COLON_OPT,"IDENTIFIER_COLON_OPT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(identifier_colon_opt_AST))));
+#line 10788 "AdaParser.cpp"
+ currentAST.root = identifier_colon_opt_AST;
+ if ( identifier_colon_opt_AST!=RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ identifier_colon_opt_AST->getFirstChild() != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = identifier_colon_opt_AST->getFirstChild();
+ else
+ currentAST.child = identifier_colon_opt_AST;
+ currentAST.advanceChildToEnd();
+ }
+ identifier_colon_opt_AST = RefAdaAST(currentAST.root);
+ returnAST = identifier_colon_opt_AST;
+}
+
+void AdaParser::except_choice_s() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST except_choice_s_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ exception_choice();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == PIPE)) {
+ RefAdaAST tmp338_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp338_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp338_AST));
+ }
+ match(PIPE);
+ exception_choice();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop435;
+ }
+
+ }
+ _loop435:;
+ } // ( ... )*
+ except_choice_s_AST = RefAdaAST(currentAST.root);
+ returnAST = except_choice_s_AST;
+}
+
+void AdaParser::exception_choice() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST exception_choice_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ {
+ compound_name();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ exception_choice_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case OTHERS:
+ {
+ RefAdaAST tmp339_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp339_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp339_AST));
+ }
+ match(OTHERS);
+ exception_choice_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = exception_choice_AST;
+}
+
+void AdaParser::operator_call() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST operator_call_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken cs = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST cs_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ cs = LT(1);
+ if ( inputState->guessing == 0 ) {
+ cs_AST = astFactory->create(cs);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(cs_AST));
+ }
+ match(CHAR_STRING);
+ operator_call_tail(cs_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ operator_call_AST = RefAdaAST(currentAST.root);
+ returnAST = operator_call_AST;
+}
+
+void AdaParser::operator_call_tail(
+ RefAdaAST opstr
+) {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST operator_call_tail_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ match(LPAREN);
+ if (!( is_operator_symbol(opstr->getText().c_str()) ))
+ throw ANTLR_USE_NAMESPACE(antlr)SemanticException(" is_operator_symbol(opstr->getText().c_str()) ");
+ value_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 1401 "ada.g"
+ opstr->setType(OPERATOR_SYMBOL);
+#line 10908 "AdaParser.cpp"
+ }
+ operator_call_tail_AST = RefAdaAST(currentAST.root);
+ returnAST = operator_call_tail_AST;
+}
+
+void AdaParser::relation() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST relation_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken n = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST n_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case IN:
+ {
+ RefAdaAST tmp342_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp342_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp342_AST));
+ }
+ match(IN);
+ range_or_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case NOT:
+ {
+ n = LT(1);
+ if ( inputState->guessing == 0 ) {
+ n_AST = astFactory->create(n);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(n_AST));
+ }
+ match(NOT);
+ match(IN);
+ range_or_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1425 "ada.g"
+ Set (n_AST, NOT_IN);
+#line 10957 "AdaParser.cpp"
+ }
+ break;
+ }
+ case EQ:
+ {
+ RefAdaAST tmp344_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp344_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp344_AST));
+ }
+ match(EQ);
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case NE:
+ {
+ RefAdaAST tmp345_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp345_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp345_AST));
+ }
+ match(NE);
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case LT_:
+ {
+ RefAdaAST tmp346_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp346_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp346_AST));
+ }
+ match(LT_);
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case LE:
+ {
+ RefAdaAST tmp347_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp347_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp347_AST));
+ }
+ match(LE);
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case GT:
+ {
+ RefAdaAST tmp348_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp348_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp348_AST));
+ }
+ match(GT);
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case GE:
+ {
+ RefAdaAST tmp349_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp349_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp349_AST));
+ }
+ match(GE);
+ simple_expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case COMMA:
+ case RPAREN:
+ case RIGHT_SHAFT:
+ case WITH:
+ case RANGE:
+ case DIGITS:
+ case IS:
+ case PIPE:
+ case DOT_DOT:
+ case ASSIGN:
+ case THEN:
+ case LOOP:
+ case OR:
+ case AND:
+ case XOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ relation_AST = RefAdaAST(currentAST.root);
+ returnAST = relation_AST;
+}
+
+void AdaParser::range_or_mark() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST range_or_mark_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ bool synPredMatched455 = false;
+ if (((_tokenSet_0.member(LA(1))) && (_tokenSet_8.member(LA(2))))) {
+ int _m455 = mark();
+ synPredMatched455 = true;
+ inputState->guessing++;
+ try {
+ {
+ range();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched455 = false;
+ }
+ rewind(_m455);
+ inputState->guessing--;
+ }
+ if ( synPredMatched455 ) {
+ range();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ range_or_mark_AST = RefAdaAST(currentAST.root);
+ }
+ else if ((LA(1) == IDENTIFIER) && (_tokenSet_30.member(LA(2)))) {
+ subtype_mark();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ range_or_mark_AST = RefAdaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ returnAST = range_or_mark_AST;
+}
+
+void AdaParser::signed_term() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST signed_term_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken m = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST m_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case PLUS:
+ {
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(PLUS);
+ term();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1447 "ada.g"
+ Set(p_AST, UNARY_PLUS);
+#line 11141 "AdaParser.cpp"
+ }
+ signed_term_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case MINUS:
+ {
+ m = LT(1);
+ if ( inputState->guessing == 0 ) {
+ m_AST = astFactory->create(m);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(m_AST));
+ }
+ match(MINUS);
+ term();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1448 "ada.g"
+ Set(m_AST, UNARY_MINUS);
+#line 11161 "AdaParser.cpp"
+ }
+ signed_term_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case ABS:
+ case NUMERIC_LIT:
+ {
+ term();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ signed_term_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = signed_term_AST;
+}
+
+void AdaParser::term() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST term_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ factor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case STAR:
+ {
+ RefAdaAST tmp350_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp350_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp350_AST));
+ }
+ match(STAR);
+ factor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case DIV:
+ {
+ RefAdaAST tmp351_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp351_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp351_AST));
+ }
+ match(DIV);
+ factor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case MOD:
+ {
+ RefAdaAST tmp352_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp352_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp352_AST));
+ }
+ match(MOD);
+ factor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case REM:
+ {
+ RefAdaAST tmp353_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp353_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp353_AST));
+ }
+ match(REM);
+ factor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop462;
+ }
+ }
+ }
+ _loop462:;
+ } // ( ... )*
+ term_AST = RefAdaAST(currentAST.root);
+ returnAST = term_AST;
+}
+
+void AdaParser::factor() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST factor_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case NOT:
+ {
+ RefAdaAST tmp354_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp354_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp354_AST));
+ }
+ match(NOT);
+ primary();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case ABS:
+ {
+ RefAdaAST tmp355_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp355_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp355_AST));
+ }
+ match(ABS);
+ primary();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case LPAREN:
+ case NEW:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NUMERIC_LIT:
+ {
+ primary();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case EXPON:
+ {
+ RefAdaAST tmp356_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp356_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp356_AST));
+ }
+ match(EXPON);
+ primary();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case COMMA:
+ case RPAREN:
+ case RIGHT_SHAFT:
+ case WITH:
+ case RANGE:
+ case DIGITS:
+ case IS:
+ case PIPE:
+ case DOT_DOT:
+ case IN:
+ case ASSIGN:
+ case MOD:
+ case THEN:
+ case LOOP:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ factor_AST = RefAdaAST(currentAST.root);
+ returnAST = factor_AST;
+}
+
+void AdaParser::primary() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST primary_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken cs = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST cs_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ {
+ switch ( LA(1)) {
+ case IDENTIFIER:
+ {
+ name_or_qualified();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case LPAREN:
+ {
+ parenthesized_primary();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case NEW:
+ {
+ allocator();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case NuLL:
+ {
+ RefAdaAST tmp357_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp357_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp357_AST));
+ }
+ match(NuLL);
+ break;
+ }
+ case NUMERIC_LIT:
+ {
+ RefAdaAST tmp358_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp358_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp358_AST));
+ }
+ match(NUMERIC_LIT);
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ RefAdaAST tmp359_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp359_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp359_AST));
+ }
+ match(CHARACTER_LITERAL);
+ break;
+ }
+ case CHAR_STRING:
+ {
+ cs = LT(1);
+ if ( inputState->guessing == 0 ) {
+ cs_AST = astFactory->create(cs);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(cs_AST));
+ }
+ match(CHAR_STRING);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ operator_call_tail(cs_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case COMMA:
+ case RPAREN:
+ case RIGHT_SHAFT:
+ case WITH:
+ case RANGE:
+ case DIGITS:
+ case IS:
+ case PIPE:
+ case DOT_DOT:
+ case IN:
+ case ASSIGN:
+ case MOD:
+ case THEN:
+ case LOOP:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case EXPON:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ primary_AST = RefAdaAST(currentAST.root);
+ returnAST = primary_AST;
+}
+
+void AdaParser::name_or_qualified() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST name_or_qualified_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+#line 1479 "ada.g"
+ RefAdaAST dummy;
+#line 11528 "AdaParser.cpp"
+
+ RefAdaAST tmp360_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp360_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp360_AST));
+ }
+ match(IDENTIFIER);
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case DOT:
+ {
+ RefAdaAST tmp361_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp361_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp361_AST));
+ }
+ match(DOT);
+ {
+ switch ( LA(1)) {
+ case ALL:
+ {
+ RefAdaAST tmp362_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp362_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp362_AST));
+ }
+ match(ALL);
+ break;
+ }
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp363_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp363_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp363_AST));
+ }
+ match(IDENTIFIER);
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ RefAdaAST tmp364_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp364_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp364_AST));
+ }
+ match(CHARACTER_LITERAL);
+ break;
+ }
+ case CHAR_STRING:
+ {
+ dummy=is_operator();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case LPAREN:
+ {
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(LPAREN);
+ value_s();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 1487 "ada.g"
+ Set(p_AST, INDEXED_COMPONENT);
+#line 11611 "AdaParser.cpp"
+ }
+ break;
+ }
+ case TIC:
+ {
+ RefAdaAST tmp366_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp366_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp366_AST));
+ }
+ match(TIC);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ parenthesized_primary();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENTIFIER:
+ case RANGE:
+ case DIGITS:
+ case DELTA:
+ case ACCESS:
+ {
+ attribute_id();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop473;
+ }
+ }
+ }
+ _loop473:;
+ } // ( ... )*
+ name_or_qualified_AST = RefAdaAST(currentAST.root);
+ returnAST = name_or_qualified_AST;
+}
+
+void AdaParser::allocator() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST allocator_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken n = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST n_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ n = LT(1);
+ if ( inputState->guessing == 0 ) {
+ n_AST = astFactory->create(n);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(n_AST));
+ }
+ match(NEW);
+ name_or_qualified();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+#line 1493 "ada.g"
+ Set(n_AST, ALLOCATOR);
+#line 11685 "AdaParser.cpp"
+ }
+ allocator_AST = RefAdaAST(currentAST.root);
+ returnAST = allocator_AST;
+}
+
+void AdaParser::subprogram_body() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST subprogram_body_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken f = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST f_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ switch ( LA(1)) {
+ case PROCEDURE:
+ {
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(PROCEDURE);
+ def_id(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formal_part_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IS);
+ body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1507 "ada.g"
+ pop_def_id(); Set(p_AST, PROCEDURE_BODY);
+#line 11726 "AdaParser.cpp"
+ }
+ subprogram_body_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ case FUNCTION:
+ {
+ f = LT(1);
+ if ( inputState->guessing == 0 ) {
+ f_AST = astFactory->create(f);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(f_AST));
+ }
+ match(FUNCTION);
+ def_designator(false);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ function_tail();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(IS);
+ body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1509 "ada.g"
+ pop_def_id(); Set(f_AST, FUNCTION_BODY);
+#line 11756 "AdaParser.cpp"
+ }
+ subprogram_body_AST = RefAdaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ returnAST = subprogram_body_AST;
+}
+
+void AdaParser::package_body() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST package_body_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(PACKAGE);
+ body_is();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ pkg_body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1513 "ada.g"
+ Set(p_AST, PACKAGE_BODY);
+#line 11794 "AdaParser.cpp"
+ }
+ package_body_AST = RefAdaAST(currentAST.root);
+ returnAST = package_body_AST;
+}
+
+void AdaParser::task_body() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST task_body_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken t = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST t_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ t = LT(1);
+ if ( inputState->guessing == 0 ) {
+ t_AST = astFactory->create(t);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(t_AST));
+ }
+ match(TASK);
+ body_is();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ body_part();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1517 "ada.g"
+ Set(t_AST, TASK_BODY);
+#line 11825 "AdaParser.cpp"
+ }
+ task_body_AST = RefAdaAST(currentAST.root);
+ returnAST = task_body_AST;
+}
+
+void AdaParser::protected_body() {
+ returnAST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefAdaAST protected_body_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefAdaAST p_AST = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(PROTECTED);
+ body_is();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ prot_op_bodies_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ end_id_opt();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 1521 "ada.g"
+ Set(p_AST, PROTECTED_BODY);
+#line 11860 "AdaParser.cpp"
+ }
+ protected_body_AST = RefAdaAST(currentAST.root);
+ returnAST = protected_body_AST;
+}
+
+void AdaParser::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory )
+{
+ factory.setMaxNodeType(289);
+}
+const char* AdaParser::tokenNames[] = {
+ "<0>",
+ "EOF",
+ "<2>",
+ "NULL_TREE_LOOKAHEAD",
+ "\"pragma\"",
+ "IDENTIFIER",
+ "SEMI",
+ "LPAREN",
+ "COMMA",
+ "RPAREN",
+ "RIGHT_SHAFT",
+ "\"with\"",
+ "DOT",
+ "\"use\"",
+ "\"type\"",
+ "TIC",
+ "\"range\"",
+ "\"digits\"",
+ "\"delta\"",
+ "\"access\"",
+ "\"private\"",
+ "\"package\"",
+ "\"body\"",
+ "\"is\"",
+ "\"procedure\"",
+ "\"function\"",
+ "\"new\"",
+ "\"others\"",
+ "PIPE",
+ "DOT_DOT",
+ "\"all\"",
+ "COLON",
+ "\"in\"",
+ "\"out\"",
+ "\"renames\"",
+ "CHARACTER_LITERAL",
+ "CHAR_STRING",
+ "\"null\"",
+ "\"record\"",
+ "\"separate\"",
+ "\"abstract\"",
+ "\"return\"",
+ "\"task\"",
+ "\"protected\"",
+ "BOX",
+ "ASSIGN",
+ "\"entry\"",
+ "\"for\"",
+ "\"end\"",
+ "\"at\"",
+ "\"mod\"",
+ "\"subtype\"",
+ "\"exception\"",
+ "\"constant\"",
+ "\"array\"",
+ "\"of\"",
+ "\"aliased\"",
+ "\"case\"",
+ "\"when\"",
+ "\"tagged\"",
+ "\"limited\"",
+ "\"generic\"",
+ "\"begin\"",
+ "LT_LT",
+ "GT_GT",
+ "\"if\"",
+ "\"then\"",
+ "\"elsif\"",
+ "\"else\"",
+ "\"loop\"",
+ "\"while\"",
+ "\"reverse\"",
+ "\"declare\"",
+ "\"exit\"",
+ "\"goto\"",
+ "\"accept\"",
+ "\"do\"",
+ "\"delay\"",
+ "\"until\"",
+ "\"select\"",
+ "\"abort\"",
+ "\"or\"",
+ "\"terminate\"",
+ "\"raise\"",
+ "\"requeue\"",
+ "\"and\"",
+ "\"xor\"",
+ "\"not\"",
+ "EQ",
+ "NE",
+ "LT_",
+ "LE",
+ "GT",
+ "GE",
+ "PLUS",
+ "MINUS",
+ "CONCAT",
+ "STAR",
+ "DIV",
+ "\"rem\"",
+ "\"abs\"",
+ "EXPON",
+ "NUMERIC_LIT",
+ "ABORTABLE_PART",
+ "ABORT_STATEMENT",
+ "ACCEPT_ALTERNATIVE",
+ "ACCEPT_STATEMENT",
+ "ALLOCATOR",
+ "ASSIGNMENT_STATEMENT",
+ "ASYNCHRONOUS_SELECT",
+ "ATTRIBUTE_DEFINITION_CLAUSE",
+ "AT_CLAUSE",
+ "BLOCK_STATEMENT",
+ "CASE_STATEMENT",
+ "CASE_STATEMENT_ALTERNATIVE",
+ "CODE_STATEMENT",
+ "COMPONENT_DECLARATION",
+ "CONDITIONAL_ENTRY_CALL",
+ "CONTEXT_CLAUSE",
+ "DECLARATIVE_PART",
+ "DEFINING_IDENTIFIER_LIST",
+ "DELAY_ALTERNATIVE",
+ "DELAY_STATEMENT",
+ "DELTA_CONSTRAINT",
+ "DIGITS_CONSTRAINT",
+ "DISCRIMINANT_ASSOCIATION",
+ "DISCRIMINANT_CONSTRAINT",
+ "DISCRIMINANT_SPECIFICATION",
+ "ENTRY_BODY",
+ "ENTRY_CALL_ALTERNATIVE",
+ "ENTRY_CALL_STATEMENT",
+ "ENTRY_DECLARATION",
+ "ENTRY_INDEX_SPECIFICATION",
+ "ENUMERATION_REPESENTATION_CLAUSE",
+ "EXCEPTION_DECLARATION",
+ "EXCEPTION_HANDLER",
+ "EXCEPTION_RENAMING_DECLARATION",
+ "EXIT_STATEMENT",
+ "FORMAL_PACKAGE_DECLARATION",
+ "GENERIC_FORMAL_PART",
+ "GENERIC_PACKAGE_DECLARATION",
+ "GOTO_STATEMENT",
+ "HANDLED_SEQUENCE_OF_STATEMENTS",
+ "HANDLED_STMTS_OPT",
+ "IF_STATEMENT",
+ "INCOMPLETE_TYPE_DECLARATION",
+ "INDEXED_COMPONENT",
+ "INDEX_CONSTRAINT",
+ "LIBRARY_ITEM",
+ "LOOP_STATEMENT",
+ "NAME",
+ "NULL_STATEMENT",
+ "NUMBER_DECLARATION",
+ "OBJECT_DECLARATION",
+ "OBJECT_RENAMING_DECLARATION",
+ "OPERATOR_SYMBOL",
+ "PACKAGE_BODY",
+ "PACKAGE_BODY_STUB",
+ "PACKAGE_RENAMING_DECLARATION",
+ "PACKAGE_SPECIFICATION",
+ "PARAMETER_SPECIFICATION",
+ "PRIVATE_EXTENSION_DECLARATION",
+ "PRIVATE_TYPE_DECLARATION",
+ "PROTECTED_BODY",
+ "PROTECTED_BODY_STUB",
+ "PROTECTED_TYPE_DECLARATION",
+ "RAISE_STATEMENT",
+ "RANGE_ATTRIBUTE_REFERENCE",
+ "RECORD_REPRESENTATION_CLAUSE",
+ "REQUEUE_STATEMENT",
+ "RETURN_STATEMENT",
+ "SELECTIVE_ACCEPT",
+ "SEQUENCE_OF_STATEMENTS",
+ "SINGLE_PROTECTED_DECLARATION",
+ "SINGLE_TASK_DECLARATION",
+ "STATEMENT",
+ "SUBTYPE_DECLARATION",
+ "SUBTYPE_INDICATION",
+ "SUBTYPE_MARK",
+ "SUBUNIT",
+ "TASK_BODY",
+ "TASK_BODY_STUB",
+ "TASK_TYPE_DECLARATION",
+ "TERMINATE_ALTERNATIVE",
+ "TIMED_ENTRY_CALL",
+ "TRIGGERING_ALTERNATIVE",
+ "USE_CLAUSE",
+ "USE_TYPE_CLAUSE",
+ "VARIANT",
+ "VARIANT_PART",
+ "WITH_CLAUSE",
+ "ABSTRACT_FUNCTION_DECLARATION",
+ "ABSTRACT_PROCEDURE_DECLARATION",
+ "ACCESS_TO_FUNCTION_DECLARATION",
+ "ACCESS_TO_OBJECT_DECLARATION",
+ "ACCESS_TO_PROCEDURE_DECLARATION",
+ "ARRAY_OBJECT_DECLARATION",
+ "ARRAY_TYPE_DECLARATION",
+ "AND_THEN",
+ "BASIC_DECLARATIVE_ITEMS_OPT",
+ "BLOCK_BODY",
+ "BLOCK_BODY_OPT",
+ "CALL_STATEMENT",
+ "COMPONENT_CLAUSES_OPT",
+ "COMPONENT_ITEMS",
+ "COND_CLAUSE",
+ "DECIMAL_FIXED_POINT_DECLARATION",
+ "DECLARE_OPT",
+ "DERIVED_RECORD_EXTENSION",
+ "DISCRETE_SUBTYPE_DEF_OPT",
+ "DISCRIMINANT_SPECIFICATIONS",
+ "DISCRIM_PART_OPT",
+ "ELSE_OPT",
+ "ELSIFS_OPT",
+ "END_ID_OPT",
+ "ENTRY_INDEX_OPT",
+ "ENUMERATION_TYPE_DECLARATION",
+ "EXCEPT_HANDLER_PART_OPT",
+ "EXTENSION_OPT",
+ "FLOATING_POINT_DECLARATION",
+ "FORMAL_DECIMAL_FIXED_POINT_DECLARATION",
+ "FORMAL_DISCRETE_TYPE_DECLARATION",
+ "FORMAL_FLOATING_POINT_DECLARATION",
+ "FORMAL_FUNCTION_DECLARATION",
+ "FORMAL_MODULAR_TYPE_DECLARATION",
+ "FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION",
+ "FORMAL_ORDINARY_FIXED_POINT_DECLARATION",
+ "FORMAL_PART_OPT",
+ "FORMAL_PRIVATE_EXTENSION_DECLARATION",
+ "FORMAL_PRIVATE_TYPE_DECLARATION",
+ "FORMAL_PROCEDURE_DECLARATION",
+ "FORMAL_SIGNED_INTEGER_TYPE_DECLARATION",
+ "FUNCTION_BODY",
+ "FUNCTION_BODY_STUB",
+ "FUNCTION_DECLARATION",
+ "FUNCTION_RENAMING_DECLARATION",
+ "GENERIC_FUNCTION_DECLARATION",
+ "GENERIC_FUNCTION_INSTANTIATION",
+ "GENERIC_FUNCTION_RENAMING",
+ "GENERIC_PACKAGE_INSTANTIATION",
+ "GENERIC_PACKAGE_RENAMING",
+ "GENERIC_PROCEDURE_DECLARATION",
+ "GENERIC_PROCEDURE_INSTANTIATION",
+ "GENERIC_PROCEDURE_RENAMING",
+ "GUARD_OPT",
+ "IDENTIFIER_COLON_OPT",
+ "ID_OPT",
+ "INIT_OPT",
+ "ITERATION_SCHEME_OPT",
+ "LABEL_OPT",
+ "MARK_WITH_CONSTRAINT",
+ "MODIFIERS",
+ "MODULAR_TYPE_DECLARATION",
+ "MOD_CLAUSE_OPT",
+ "NOT_IN",
+ "ORDINARY_DERIVED_TYPE_DECLARATION",
+ "ORDINARY_FIXED_POINT_DECLARATION",
+ "OR_ELSE",
+ "OR_SELECT_OPT",
+ "PARENTHESIZED_PRIMARY",
+ "PRIVATE_DECLARATIVE_ITEMS_OPT",
+ "PRIVATE_TASK_ITEMS_OPT",
+ "PROCEDURE_BODY",
+ "PROCEDURE_BODY_STUB",
+ "PROCEDURE_DECLARATION",
+ "PROCEDURE_RENAMING_DECLARATION",
+ "PROT_MEMBER_DECLARATIONS",
+ "PROT_OP_BODIES_OPT",
+ "PROT_OP_DECLARATIONS",
+ "PROT_PRIVATE_OPT",
+ "RANGED_EXPRS",
+ "RANGE_CONSTRAINT",
+ "RECORD_TYPE_DECLARATION",
+ "SELECTOR_NAMES_OPT",
+ "SIGNED_INTEGER_TYPE_DECLARATION",
+ "TASK_ITEMS_OPT",
+ "UNARY_MINUS",
+ "UNARY_PLUS",
+ "VALUE",
+ "VALUES",
+ "VARIANTS",
+ "COMMENT_INTRO",
+ "OX",
+ "TIC_OR_CHARACTER_LITERAL",
+ "DIGIT",
+ "EXPONENT",
+ "EXTENDED_DIGIT",
+ "BASED_INTEGER",
+ "WS_",
+ "COMMENT",
+ 0
+};
+
+const unsigned long AdaParser::_tokenSet_0_data_[] = { 67109024UL, 56UL, 3229614080UL, 80UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER LPAREN "new" CHARACTER_LITERAL CHAR_STRING "null" "not" PLUS
+// MINUS "abs" NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_0(_tokenSet_0_data_,10);
+const unsigned long AdaParser::_tokenSet_1_data_[] = { 201364384UL, 262201UL, 4293001216UL, 127UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER LPAREN COMMA RPAREN DOT TIC "new" "others" "in" CHARACTER_LITERAL
+// CHAR_STRING "null" "mod" "or" "and" "xor" "not" EQ NE LT_ LE GT GE PLUS
+// MINUS CONCAT STAR DIV "rem" "abs" EXPON NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_1(_tokenSet_1_data_,10);
+const unsigned long AdaParser::_tokenSet_2_data_[] = { 8388800UL, 4UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LPAREN "is" "renames"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_2(_tokenSet_2_data_,10);
+const unsigned long AdaParser::_tokenSet_3_data_[] = { 52453426UL, 1611238800UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF "pragma" IDENTIFIER "use" "type" "package" "procedure" "function"
+// CHAR_STRING "separate" "abstract" "task" "protected" "for" "end" "subtype"
+// "generic" "begin"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_3(_tokenSet_3_data_,10);
+const unsigned long AdaParser::_tokenSet_4_data_[] = { 8392896UL, 67108869UL, 4096UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LPAREN DOT "is" "in" "renames" "when" "do"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_4(_tokenSet_4_data_,10);
+const unsigned long AdaParser::_tokenSet_5_data_[] = { 8388800UL, 67108869UL, 4096UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LPAREN "is" "in" "renames" "when" "do"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_5(_tokenSet_5_data_,10);
+const unsigned long AdaParser::_tokenSet_6_data_[] = { 53502002UL, 537496976UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF "pragma" IDENTIFIER "use" "type" "private" "package" "procedure"
+// "function" CHAR_STRING "separate" "abstract" "task" "protected" "for"
+// "end" "subtype" "generic"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_6(_tokenSet_6_data_,10);
+const unsigned long AdaParser::_tokenSet_7_data_[] = { 8392832UL, 512UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LPAREN DOT "is" "return"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_7(_tokenSet_7_data_,10);
+const unsigned long AdaParser::_tokenSet_8_data_[] = { 738234528UL, 262200UL, 3229614080UL, 127UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER LPAREN DOT TIC "new" "others" DOT_DOT CHARACTER_LITERAL CHAR_STRING
+// "null" "mod" "not" PLUS MINUS CONCAT STAR DIV "rem" "abs" EXPON NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_8(_tokenSet_8_data_,10);
+const unsigned long AdaParser::_tokenSet_9_data_[] = { 201326752UL, 56UL, 3229614080UL, 80UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER LPAREN "new" "others" CHARACTER_LITERAL CHAR_STRING "null"
+// "not" PLUS MINUS "abs" NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_9(_tokenSet_9_data_,10);
+const unsigned long AdaParser::_tokenSet_10_data_[] = { 1006739360UL, 262201UL, 4293001216UL, 127UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER LPAREN COMMA RPAREN RIGHT_SHAFT "with" DOT TIC "range" "new"
+// "others" PIPE DOT_DOT "in" CHARACTER_LITERAL CHAR_STRING "null" "mod"
+// "or" "and" "xor" "not" EQ NE LT_ LE GT GE PLUS MINUS CONCAT STAR DIV
+// "rem" "abs" EXPON NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_10(_tokenSet_10_data_,10);
+const unsigned long AdaParser::_tokenSet_11_data_[] = { 1006737312UL, 262201UL, 4293001216UL, 127UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER LPAREN COMMA RPAREN RIGHT_SHAFT DOT TIC "range" "new" "others"
+// PIPE DOT_DOT "in" CHARACTER_LITERAL CHAR_STRING "null" "mod" "or" "and"
+// "xor" "not" EQ NE LT_ LE GT GE PLUS MINUS CONCAT STAR DIV "rem" "abs"
+// EXPON NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_11(_tokenSet_11_data_,10);
+const unsigned long AdaParser::_tokenSet_12_data_[] = { 32UL, 23068672UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER "constant" "array" "aliased"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_12(_tokenSet_12_data_,10);
+const unsigned long AdaParser::_tokenSet_13_data_[] = { 495840UL, 6299648UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER SEMI LPAREN DOT TIC "range" "digits" "delta" ASSIGN "constant"
+// "array"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_13(_tokenSet_13_data_,10);
+const unsigned long AdaParser::_tokenSet_14_data_[] = { 51380274UL, 114688UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF "pragma" IDENTIFIER "private" "procedure" "function" "entry" "for"
+// "end"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_14(_tokenSet_14_data_,10);
+const unsigned long AdaParser::_tokenSet_15_data_[] = { 496256UL, 0UL, 32UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LPAREN RPAREN DOT TIC "range" "digits" "delta" "loop"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_15(_tokenSet_15_data_,10);
+const unsigned long AdaParser::_tokenSet_16_data_[] = { 50331664UL, 49152UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "pragma" "procedure" "function" "entry" "for"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_16(_tokenSet_16_data_,10);
+const unsigned long AdaParser::_tokenSet_17_data_[] = { 1048576UL, 402653536UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "private" "null" "record" "abstract" "tagged" "limited"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_17(_tokenSet_17_data_,10);
+const unsigned long AdaParser::_tokenSet_18_data_[] = { 1048688UL, 436207712UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "pragma" IDENTIFIER SEMI "private" "null" "record" "case" "tagged" "limited"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_18(_tokenSet_18_data_,10);
+const unsigned long AdaParser::_tokenSet_19_data_[] = { 496512UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LPAREN COMMA RPAREN DOT TIC "range" "digits" "delta"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_19(_tokenSet_19_data_,10);
+const unsigned long AdaParser::_tokenSet_20_data_[] = { 738300064UL, 262200UL, 3229614080UL, 127UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER LPAREN DOT TIC "range" "new" "others" DOT_DOT CHARACTER_LITERAL
+// CHAR_STRING "null" "mod" "not" PLUS MINUS CONCAT STAR DIV "rem" "abs"
+// EXPON NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_20(_tokenSet_20_data_,10);
+const unsigned long AdaParser::_tokenSet_21_data_[] = { 469800096UL, 262201UL, 4293001216UL, 127UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER LPAREN RIGHT_SHAFT DOT TIC "new" "others" PIPE "in" CHARACTER_LITERAL
+// CHAR_STRING "null" "mod" "or" "and" "xor" "not" EQ NE LT_ LE GT GE PLUS
+// MINUS CONCAT STAR DIV "rem" "abs" EXPON NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_21(_tokenSet_21_data_,10);
+const unsigned long AdaParser::_tokenSet_22_data_[] = { 1048576UL, 402653440UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "private" "abstract" "tagged" "limited"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_22(_tokenSet_22_data_,10);
+const unsigned long AdaParser::_tokenSet_23_data_[] = { 1048640UL, 402653184UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "private" "tagged" "limited"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_23(_tokenSet_23_data_,10);
+const unsigned long AdaParser::_tokenSet_24_data_[] = { 37056UL, 8192UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LPAREN DOT TIC ASSIGN
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_24(_tokenSet_24_data_,10);
+const unsigned long AdaParser::_tokenSet_25_data_[] = { 67145952UL, 56UL, 3229630464UL, 80UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER SEMI LPAREN DOT TIC "new" CHARACTER_LITERAL CHAR_STRING "null"
+// "until" "not" PLUS MINUS "abs" NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_25(_tokenSet_25_data_,10);
+const unsigned long AdaParser::_tokenSet_26_data_[] = { 0UL, 67108864UL, 272384UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "when" "accept" "delay" "terminate"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_26(_tokenSet_26_data_,10);
+const unsigned long AdaParser::_tokenSet_27_data_[] = { 67109088UL, 56UL, 3229630464UL, 80UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER SEMI LPAREN "new" CHARACTER_LITERAL CHAR_STRING "null" "until"
+// "not" PLUS MINUS "abs" NUMERIC_LIT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_27(_tokenSet_27_data_,10);
+const unsigned long AdaParser::_tokenSet_28_data_[] = { 37056UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LPAREN DOT TIC
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_28(_tokenSet_28_data_,10);
+const unsigned long AdaParser::_tokenSet_29_data_[] = { 48UL, 3323036192UL, 1814398UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "pragma" IDENTIFIER "null" "return" "for" "end" "exception" "case" "when"
+// "begin" LT_LT "if" "then" "elsif" "else" "loop" "while" "declare" "exit"
+// "goto" "accept" "delay" "select" "abort" "or" "raise" "requeue"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_29(_tokenSet_29_data_,10);
+const unsigned long AdaParser::_tokenSet_30_data_[] = { 813932352UL, 8192UL, 6422564UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI COMMA RPAREN RIGHT_SHAFT "with" DOT TIC "range" "digits" "is" PIPE
+// DOT_DOT ASSIGN "then" "loop" "or" "and" "xor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaParser::_tokenSet_30(_tokenSet_30_data_,10);
+
+
diff --git a/languages/ada/AdaParser.hpp b/languages/ada/AdaParser.hpp
new file mode 100644
index 00000000..0074c820
--- /dev/null
+++ b/languages/ada/AdaParser.hpp
@@ -0,0 +1,389 @@
+#ifndef INC_AdaParser_hpp_
+#define INC_AdaParser_hpp_
+
+#line 29 "ada.g"
+
+#include <antlr/SemanticException.hpp> // antlr wants this
+#include "AdaAST.hpp"
+#include "preambles.h"
+
+#line 11 "AdaParser.hpp"
+#include <antlr/config.hpp>
+/* $ANTLR 2.7.7 (20070609): "ada.g" -> "AdaParser.hpp"$ */
+#include <antlr/TokenStream.hpp>
+#include <antlr/TokenBuffer.hpp>
+#include "AdaTokenTypes.hpp"
+#include <antlr/LLkParser.hpp>
+
+class CUSTOM_API AdaParser : public ANTLR_USE_NAMESPACE(antlr)LLkParser, public AdaTokenTypes
+{
+#line 53 "ada.g"
+
+ ANTLR_PARSER_PREAMBLE
+
+public:
+ // Ada support stuff
+ void push_def_id (const RefAdaAST& defid);
+ const RefAdaAST& pop_def_id ();
+ bool end_id_matches_def_id (const RefAdaAST& endid);
+ bool definable_operator (const char *string); // operator_symbol sans "/="
+ bool is_operator_symbol (const char *string);
+#line 22 "AdaParser.hpp"
+public:
+ void initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory );
+protected:
+ AdaParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf, int k);
+public:
+ AdaParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf);
+protected:
+ AdaParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer, int k);
+public:
+ AdaParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer);
+ AdaParser(const ANTLR_USE_NAMESPACE(antlr)ParserSharedInputState& state);
+ int getNumTokens() const
+ {
+ return AdaParser::NUM_TOKENS;
+ }
+ const char* getTokenName( int type ) const
+ {
+ if( type > getNumTokens() ) return 0;
+ return AdaParser::tokenNames[type];
+ }
+ const char* const* getTokenNames() const
+ {
+ return AdaParser::tokenNames;
+ }
+ public: void compilation_unit();
+ public: void context_items_opt();
+ public: void library_item();
+ public: void subunit();
+ public: void pragma();
+ public: void pragma_args_opt();
+ public: void pragma_arg();
+ public: void expression();
+ public: void with_clause();
+ public: void use_clause();
+ public: void c_name_list();
+ public: void compound_name();
+ public: void subtype_mark();
+ public: void attribute_id();
+ public: void private_opt();
+ public: void lib_pkg_spec_or_body();
+ public: void subprog_decl_or_rename_or_inst_or_body(
+ boolean lib_level
+ );
+ public: void generic_decl(
+ boolean lib_level
+ );
+ public: void def_id(
+ boolean lib_level
+ );
+ public: void pkg_body_part();
+ public: void spec_decl_part(
+ RefAdaAST pkg
+ );
+ public: void subprog_decl(
+ boolean lib_level
+ );
+ public: void generic_subp_inst();
+ public: void formal_part_opt();
+ public: void renames();
+ public: void is_separate_or_abstract_or_decl(
+ RefAdaAST t
+ );
+ public: void def_designator(
+ boolean lib_level
+ );
+ public: void function_tail();
+ public: void generic_inst();
+ public: void value_s();
+ public: void parenth_values();
+ public: void value();
+ public: void ranged_expr_s();
+ public: void ranged_expr();
+ public: void simple_expression();
+ public: void range();
+ public: void range_constraint();
+ public: void range_dots();
+ public: void range_attrib_ref();
+ public: void prefix();
+ public: void parameter_specification();
+ public: void def_ids_colon();
+ public: void mode_opt();
+ public: void init_opt();
+ public: void defining_identifier_list();
+ public: void name();
+ public: RefAdaAST definable_operator_symbol();
+ public: RefAdaAST is_operator();
+ public: void parenthesized_primary();
+ public: void extension_opt();
+ public: void separate_or_abstract(
+ RefAdaAST t
+ );
+ public: RefAdaAST designator();
+ public: void func_formal_part_opt();
+ public: void func_param();
+ public: void in_access_opt();
+ public: void pkg_spec_part();
+ public: void basic_declarative_items_opt();
+ public: void private_declarative_items_opt();
+ public: void end_id_opt();
+ public: void basic_decl_item();
+ public: void basic_declarative_items();
+ public: void task_type_or_single_decl(
+ RefAdaAST tsk
+ );
+ public: void prot_type_or_single_decl(
+ RefAdaAST pro
+ );
+ public: void decl_common();
+ public: void discrim_part_opt();
+ public: void task_definition_opt();
+ public: void task_items_opt();
+ public: void private_task_items_opt();
+ public: void discrim_part_text();
+ public: void discriminant_specifications();
+ public: void known_discrim_part();
+ public: void empty_discrim_opt();
+ public: void discrim_part();
+ public: void discriminant_specification();
+ public: void access_opt();
+ public: void entrydecls_repspecs_opt();
+ public: void entry_declaration();
+ public: void rep_spec();
+ public: void discrete_subtype_def_opt();
+ public: void discrete_subtype_definition();
+ public: void subtype_ind();
+ public: void rep_spec_part(
+ RefAdaAST t
+ );
+ public: void align_opt();
+ public: void comp_loc_s();
+ public: void protected_definition();
+ public: void prot_private_opt();
+ public: void prot_op_decl();
+ public: void comp_decl();
+ public: void prot_op_decl_s();
+ public: void prot_member_decl_s();
+ public: void component_subtype_def();
+ public: void type_def(
+ RefAdaAST t
+ );
+ public: void derived_or_private_or_record(
+ RefAdaAST t, boolean has_discrim
+ );
+ public: void local_enum_name();
+ public: void enumeration_aggregate();
+ public: void aliased_constant_opt();
+ public: void array_type_definition(
+ RefAdaAST t
+ );
+ public: void enum_id_s();
+ public: void range_constraint_opt();
+ public: void access_type_definition(
+ RefAdaAST t
+ );
+ public: void enumeration_literal_specification();
+ public: void index_or_discrete_range_s();
+ public: void index_or_discrete_range();
+ public: void aliased_opt();
+ public: void constraint_opt();
+ public: void digits_constraint();
+ public: void delta_constraint();
+ public: void index_constraint();
+ public: void discriminant_constraint();
+ public: void discrete_range();
+ public: void discriminant_association();
+ public: void selector_names_opt();
+ public: void association_head();
+ public: void selector_name();
+ public: void protected_opt();
+ public: void constant_all_opt();
+ public: void abstract_opt();
+ public: void record_definition(
+ boolean has_discrim
+ );
+ public: void abstract_tagged_limited_opt();
+ public: void component_list(
+ boolean has_discrim
+ );
+ public: void component_items();
+ public: void variant_part();
+ public: void empty_component_items();
+ public: void discriminant_direct_name();
+ public: void variant_s();
+ public: void variant();
+ public: void choice_s();
+ public: void choice();
+ public: void discrete_with_range();
+ public: void mark_with_constraint();
+ public: void generic_formal_part_opt();
+ public: void generic_formal_parameter();
+ public: void discriminable_type_definition(
+ RefAdaAST t
+ );
+ public: void subprogram_default_opt();
+ public: void formal_package_actual_part_opt();
+ public: void body_part();
+ public: void declarative_part();
+ public: void block_body();
+ public: void declarative_item();
+ public: void body_is();
+ public: void separate();
+ public: void prot_op_bodies_opt();
+ public: void block_body_opt();
+ public: void handled_stmt_s();
+ public: void entry_body();
+ public: void subprog_decl_or_body();
+ public: void statements();
+ public: void except_handler_part_opt();
+ public: void handled_stmts_opt();
+ public: void statement();
+ public: void def_label_opt();
+ public: void null_stmt();
+ public: void exit_stmt();
+ public: void return_stmt();
+ public: void goto_stmt();
+ public: void delay_stmt();
+ public: void abort_stmt();
+ public: void raise_stmt();
+ public: void requeue_stmt();
+ public: void accept_stmt();
+ public: void select_stmt();
+ public: void if_stmt();
+ public: void case_stmt();
+ public: void loop_stmt();
+ public: void block();
+ public: void statement_identifier();
+ public: void id_opt();
+ public: void call_or_assignment();
+ public: void cond_clause();
+ public: void elsifs_opt();
+ public: void else_opt();
+ public: void condition();
+ public: void alternative_s();
+ public: void case_statement_alternative();
+ public: void iteration_scheme_opt();
+ public: void reverse_opt();
+ public: void id_opt_aux();
+ public: void declare_opt();
+ public: void label_name();
+ public: void entry_body_formal_part();
+ public: void entry_barrier();
+ public: void entry_index_spec_opt();
+ public: void entry_call_stmt();
+ public: void entry_index_opt();
+ public: void until_opt();
+ public: void triggering_alternative();
+ public: void abortable_part();
+ public: void selective_accept();
+ public: void entry_call_alternative();
+ public: void delay_alternative();
+ public: void stmts_opt();
+ public: void guard_opt();
+ public: void select_alternative();
+ public: void or_select_opt();
+ public: void accept_alternative();
+ public: void exception_handler();
+ public: void identifier_colon_opt();
+ public: void except_choice_s();
+ public: void exception_choice();
+ public: void operator_call();
+ public: void operator_call_tail(
+ RefAdaAST opstr
+ );
+ public: void relation();
+ public: void range_or_mark();
+ public: void signed_term();
+ public: void term();
+ public: void factor();
+ public: void primary();
+ public: void name_or_qualified();
+ public: void allocator();
+ public: void subprogram_body();
+ public: void package_body();
+ public: void task_body();
+ public: void protected_body();
+public:
+ ANTLR_USE_NAMESPACE(antlr)RefAST getAST()
+ {
+ return ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST);
+ }
+
+protected:
+ RefAdaAST returnAST;
+private:
+ static const char* tokenNames[];
+#ifndef NO_STATIC_CONSTS
+ static const int NUM_TOKENS = 290;
+#else
+ enum {
+ NUM_TOKENS = 290
+ };
+#endif
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+ static const unsigned long _tokenSet_2_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2;
+ static const unsigned long _tokenSet_3_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3;
+ static const unsigned long _tokenSet_4_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_4;
+ static const unsigned long _tokenSet_5_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_5;
+ static const unsigned long _tokenSet_6_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_6;
+ static const unsigned long _tokenSet_7_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_7;
+ static const unsigned long _tokenSet_8_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_8;
+ static const unsigned long _tokenSet_9_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_9;
+ static const unsigned long _tokenSet_10_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_10;
+ static const unsigned long _tokenSet_11_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_11;
+ static const unsigned long _tokenSet_12_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_12;
+ static const unsigned long _tokenSet_13_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_13;
+ static const unsigned long _tokenSet_14_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_14;
+ static const unsigned long _tokenSet_15_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_15;
+ static const unsigned long _tokenSet_16_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_16;
+ static const unsigned long _tokenSet_17_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_17;
+ static const unsigned long _tokenSet_18_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_18;
+ static const unsigned long _tokenSet_19_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_19;
+ static const unsigned long _tokenSet_20_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_20;
+ static const unsigned long _tokenSet_21_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_21;
+ static const unsigned long _tokenSet_22_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_22;
+ static const unsigned long _tokenSet_23_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_23;
+ static const unsigned long _tokenSet_24_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_24;
+ static const unsigned long _tokenSet_25_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_25;
+ static const unsigned long _tokenSet_26_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_26;
+ static const unsigned long _tokenSet_27_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_27;
+ static const unsigned long _tokenSet_28_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_28;
+ static const unsigned long _tokenSet_29_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_29;
+ static const unsigned long _tokenSet_30_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_30;
+};
+
+#endif /*INC_AdaParser_hpp_*/
diff --git a/languages/ada/AdaStoreWalker.cpp b/languages/ada/AdaStoreWalker.cpp
new file mode 100644
index 00000000..167d671c
--- /dev/null
+++ b/languages/ada/AdaStoreWalker.cpp
@@ -0,0 +1,9439 @@
+/* $ANTLR 2.7.7 (20070609): "expandedada.store.g" -> "AdaStoreWalker.cpp"$ */
+#include "AdaStoreWalker.hpp"
+#include <antlr/Token.hpp>
+#include <antlr/AST.hpp>
+#include <antlr/NoViableAltException.hpp>
+#include <antlr/MismatchedTokenException.hpp>
+#include <antlr/SemanticException.hpp>
+#include <antlr/BitSet.hpp>
+#line 1 "expandedada.store.g"
+#line 11 "AdaStoreWalker.cpp"
+AdaStoreWalker::AdaStoreWalker()
+ : ANTLR_USE_NAMESPACE(antlr)TreeParser() {
+}
+
+void AdaStoreWalker::compilation_unit(RefAdaAST _t) {
+ RefAdaAST compilation_unit_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+#line 116 "expandedada.store.g"
+ init();
+#line 22 "AdaStoreWalker.cpp"
+ context_items_opt(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LIBRARY_ITEM:
+ {
+ library_item(_t);
+ _t = _retTree;
+ break;
+ }
+ case SUBUNIT:
+ {
+ subunit(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == PRAGMA)) {
+ pragma(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop4;
+ }
+
+ }
+ _loop4:;
+ } // ( ... )*
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::context_items_opt(RefAdaAST _t) {
+ RefAdaAST context_items_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t70 = _t;
+ RefAdaAST tmp1_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CONTEXT_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case WITH_CLAUSE:
+ {
+ with_clause(_t);
+ _t = _retTree;
+ break;
+ }
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ {
+ use_clause(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop72;
+ }
+ }
+ }
+ _loop72:;
+ } // ( ... )*
+ _t = __t70;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::library_item(RefAdaAST _t) {
+ RefAdaAST library_item_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ RefAdaAST pb = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefAdaAST gpi = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefAdaAST ps = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefAdaAST prd = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefAdaAST __t17 = _t;
+ RefAdaAST tmp2_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LIBRARY_ITEM);
+ _t = _t->getFirstChild();
+ RefAdaAST __t18 = _t;
+ RefAdaAST tmp3_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MODIFIERS);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRIVATE:
+ {
+ RefAdaAST tmp4_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PRIVATE);
+ _t = _t->getNextSibling();
+#line 132 "expandedada.store.g"
+ m_currentAccess = CodeModelItem::Protected;
+#line 149 "AdaStoreWalker.cpp"
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t18;
+ _t = _t->getNextSibling();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case FUNCTION_BODY:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case PROCEDURE_BODY:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ lib_subprog_decl_or_rename_or_inst_or_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case PACKAGE_BODY:
+ {
+ RefAdaAST __t21 = _t;
+ RefAdaAST tmp5_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKAGE_BODY);
+ _t = _t->getFirstChild();
+ pb = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ def_id(_t);
+ _t = _retTree;
+ pkg_body_part(_t);
+ _t = _retTree;
+ _t = __t21;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PACKAGE_INSTANTIATION:
+ {
+ RefAdaAST __t22 = _t;
+ RefAdaAST tmp6_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_PACKAGE_INSTANTIATION);
+ _t = _t->getFirstChild();
+ gpi = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ def_id(_t);
+ _t = _retTree;
+#line 136 "expandedada.store.g"
+
+ defineScope( gpi );
+
+#line 213 "AdaStoreWalker.cpp"
+ generic_inst(_t);
+ _t = _retTree;
+ _t = __t22;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_SPECIFICATION:
+ {
+ RefAdaAST __t23 = _t;
+ RefAdaAST tmp7_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKAGE_SPECIFICATION);
+ _t = _t->getFirstChild();
+ ps = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ def_id(_t);
+ _t = _retTree;
+#line 142 "expandedada.store.g"
+
+ NamespaceDom psc = defineScope( ps );
+ m_currentContainer = psc;
+ m_scopeStack.append( psc );
+ m_addToStore = true;
+
+#line 236 "AdaStoreWalker.cpp"
+ pkg_spec_part(_t);
+ _t = _retTree;
+#line 149 "expandedada.store.g"
+
+ m_scopeStack.remove(m_scopeStack.last());
+ if (m_scopeStack.count() == 0) {
+ kdDebug() << "adastore: m_scopeStack is empty!" << endl;
+ m_scopeStack.append( m_model->globalNamespace() );
+ }
+ m_currentContainer = m_scopeStack.last();
+ // m_currentContainer->setEndPosition (endLine, 0);
+ m_addToStore = false;
+
+#line 250 "AdaStoreWalker.cpp"
+ _t = __t23;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_RENAMING_DECLARATION:
+ {
+ RefAdaAST __t24 = _t;
+ RefAdaAST tmp8_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKAGE_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ prd = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ def_id(_t);
+ _t = _retTree;
+#line 161 "expandedada.store.g"
+
+ defineScope( prd );
+
+#line 268 "AdaStoreWalker.cpp"
+ renames(_t);
+ _t = _retTree;
+ _t = __t24;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PACKAGE_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ {
+ generic_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t17;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::subunit(RefAdaAST _t) {
+ RefAdaAST subunit_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t521 = _t;
+ RefAdaAST tmp9_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SUBUNIT);
+ _t = _t->getFirstChild();
+ compound_name(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case FUNCTION_BODY:
+ case PROCEDURE_BODY:
+ {
+ subprogram_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case PACKAGE_BODY:
+ {
+ package_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case TASK_BODY:
+ {
+ task_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROTECTED_BODY:
+ {
+ protected_body(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t521;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::pragma(RefAdaAST _t) {
+ RefAdaAST pragma_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t64 = _t;
+ RefAdaAST tmp10_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PRAGMA);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp11_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_0.member(_t->getType()))) {
+ pragma_arg(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop66;
+ }
+
+ }
+ _loop66:;
+ } // ( ... )*
+ _t = __t64;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::with_clause(RefAdaAST _t) {
+ RefAdaAST with_clause_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t6 = _t;
+ RefAdaAST tmp12_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),WITH_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt8=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER || _t->getType() == DOT)) {
+ compound_name(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt8>=1 ) { goto _loop8; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt8++;
+ }
+ _loop8:;
+ } // ( ... )+
+ _t = __t6;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::compound_name(RefAdaAST _t) {
+ RefAdaAST compound_name_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp13_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ RefAdaAST __t74 = _t;
+ RefAdaAST tmp14_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT);
+ _t = _t->getFirstChild();
+ compound_name(_t);
+ _t = _retTree;
+ RefAdaAST tmp15_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ _t = __t74;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::use_clause(RefAdaAST _t) {
+ RefAdaAST use_clause_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ RefAdaAST c = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case USE_TYPE_CLAUSE:
+ {
+ RefAdaAST __t10 = _t;
+ RefAdaAST tmp16_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),USE_TYPE_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt12=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER || _t->getType() == DOT || _t->getType() == TIC)) {
+ subtype_mark(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt12>=1 ) { goto _loop12; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt12++;
+ }
+ _loop12:;
+ } // ( ... )+
+ _t = __t10;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case USE_CLAUSE:
+ {
+ RefAdaAST __t13 = _t;
+ RefAdaAST tmp17_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),USE_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt15=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER || _t->getType() == DOT)) {
+ c = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ compound_name(_t);
+ _t = _retTree;
+#line 127 "expandedada.store.g"
+ m_imports.back ().push_back (qtext (c));
+#line 527 "AdaStoreWalker.cpp"
+ }
+ else {
+ if ( _cnt15>=1 ) { goto _loop15; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt15++;
+ }
+ _loop15:;
+ } // ( ... )+
+ _t = __t13;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::subtype_mark(RefAdaAST _t) {
+ RefAdaAST subtype_mark_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ compound_name(_t);
+ _t = _retTree;
+ break;
+ }
+ case TIC:
+ {
+ RefAdaAST __t76 = _t;
+ RefAdaAST tmp18_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TIC);
+ _t = _t->getFirstChild();
+ compound_name(_t);
+ _t = _retTree;
+ attribute_id(_t);
+ _t = _retTree;
+ _t = __t76;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::lib_subprog_decl_or_rename_or_inst_or_body(RefAdaAST _t) {
+ RefAdaAST lib_subprog_decl_or_rename_or_inst_or_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+#line 310 "expandedada.store.g"
+ m_addToStore = true;
+#line 603 "AdaStoreWalker.cpp"
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ subprog_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROCEDURE_BODY:
+ {
+ procedure_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION_BODY:
+ {
+ function_body(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+#line 315 "expandedada.store.g"
+ m_addToStore = false;
+#line 643 "AdaStoreWalker.cpp"
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::def_id(RefAdaAST _t) {
+ RefAdaAST def_id_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ RefAdaAST cn = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ cn = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ compound_name(_t);
+ _t = _retTree;
+#line 189 "expandedada.store.g"
+
+ // kdDebug() << "cn:compound_name started " << endl;
+ if (m_addToStore) {
+ // kdDebug() << "cn:compound_name m_addToStore " << endl;
+ if (m_isSubprogram) {
+ // kdDebug() << "cn:compound_name m_isSubprogram " << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName (qtext (cn));
+ method->setFileName(m_fileName);
+ // kdDebug() << "cn:compound_name method->setStartPosition(" << endl;
+ method->setStartPosition(cn->getLine(), cn->getColumn());
+
+ if (m_currentContainer == m_model->globalNamespace())
+ m_file->addFunction(method);
+ else
+ m_currentContainer->addFunction(method);
+ //FIXME: adymo: is this valid for CodeModel
+ /* ParsedMethod *old = m_currentContainer->getMethod (method);
+ if (old) {
+ delete (method);
+ method = old;
+ } else {
+ m_currentContainer->addMethod (method);
+ }*/
+ } else {
+ // TBC: what about other declarations?
+ }
+ }
+
+#line 691 "AdaStoreWalker.cpp"
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::pkg_body_part(RefAdaAST _t) {
+ RefAdaAST pkg_body_part_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ declarative_part(_t);
+ _t = _retTree;
+ block_body_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::generic_inst(RefAdaAST _t) {
+ RefAdaAST generic_inst_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ compound_name(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case VALUES:
+ {
+ value_s(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::pkg_spec_part(RefAdaAST _t) {
+ RefAdaAST pkg_spec_part_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ basic_declarative_items_opt(_t);
+ _t = _retTree;
+ private_declarative_items_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::renames(RefAdaAST _t) {
+ RefAdaAST renames_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case CHARACTER_STRING:
+ {
+ RefAdaAST tmp19_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHARACTER_STRING);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ RefAdaAST tmp20_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OPERATOR_SYMBOL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case INDEXED_COMPONENT:
+ {
+ name(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::generic_decl(RefAdaAST _t) {
+ RefAdaAST generic_decl_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ RefAdaAST gpd = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case GENERIC_PACKAGE_RENAMING:
+ {
+ RefAdaAST __t49 = _t;
+ RefAdaAST tmp21_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_PACKAGE_RENAMING);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ def_id(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t49;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PACKAGE_DECLARATION:
+ {
+ RefAdaAST __t50 = _t;
+ RefAdaAST tmp22_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_PACKAGE_DECLARATION);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ gpd = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ def_id(_t);
+ _t = _retTree;
+#line 284 "expandedada.store.g"
+
+ NamespaceDom psc = defineScope( gpd );
+ m_currentContainer = psc;
+ m_scopeStack.append( psc );
+ m_addToStore = true;
+
+#line 860 "AdaStoreWalker.cpp"
+ pkg_spec_part(_t);
+ _t = _retTree;
+#line 291 "expandedada.store.g"
+
+ m_scopeStack.remove(m_scopeStack.last());
+ if (m_scopeStack.count() == 0)
+ m_scopeStack.append( m_model->globalNamespace() );
+ m_currentContainer = m_scopeStack.last();
+ // m_currentContainer->setDeclarationEndsOnLine (endLine);
+ m_addToStore = false;
+
+#line 872 "AdaStoreWalker.cpp"
+ _t = __t50;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PROCEDURE_RENAMING:
+ {
+ RefAdaAST __t51 = _t;
+ RefAdaAST tmp23_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_PROCEDURE_RENAMING);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t51;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PROCEDURE_DECLARATION:
+ {
+ RefAdaAST __t52 = _t;
+ RefAdaAST tmp24_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ subprog_def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t52;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_FUNCTION_RENAMING:
+ {
+ RefAdaAST __t53 = _t;
+ RefAdaAST tmp25_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_FUNCTION_RENAMING);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t53;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_FUNCTION_DECLARATION:
+ {
+ RefAdaAST __t54 = _t;
+ RefAdaAST tmp26_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ subprog_def_id(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t54;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::subprog_def_id(RefAdaAST _t) {
+ RefAdaAST subprog_def_id_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+#line 171 "expandedada.store.g"
+ m_isSubprogram = true;
+#line 965 "AdaStoreWalker.cpp"
+ def_id(_t);
+ _t = _retTree;
+#line 173 "expandedada.store.g"
+ m_isSubprogram = false;
+#line 970 "AdaStoreWalker.cpp"
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::subprog_decl(RefAdaAST _t) {
+ RefAdaAST subprog_decl_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ {
+ RefAdaAST __t27 = _t;
+ RefAdaAST tmp27_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_PROCEDURE_INSTANTIATION);
+ _t = _t->getFirstChild();
+ subprog_def_id(_t);
+ _t = _retTree;
+ generic_inst(_t);
+ _t = _retTree;
+ _t = __t27;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ RefAdaAST __t28 = _t;
+ RefAdaAST tmp28_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROCEDURE_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ subprog_def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t28;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROCEDURE_DECLARATION:
+ {
+ RefAdaAST __t29 = _t;
+ RefAdaAST tmp29_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ subprog_def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t29;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROCEDURE_BODY_STUB:
+ {
+ RefAdaAST __t30 = _t;
+ RefAdaAST tmp30_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROCEDURE_BODY_STUB);
+ _t = _t->getFirstChild();
+ subprog_def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t30;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ {
+ RefAdaAST __t31 = _t;
+ RefAdaAST tmp31_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ABSTRACT_PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ subprog_def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t31;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_FUNCTION_INSTANTIATION:
+ {
+ RefAdaAST __t32 = _t;
+ RefAdaAST tmp32_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_FUNCTION_INSTANTIATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ generic_inst(_t);
+ _t = _retTree;
+ _t = __t32;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_RENAMING_DECLARATION:
+ {
+ RefAdaAST __t33 = _t;
+ RefAdaAST tmp33_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNCTION_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t33;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_DECLARATION:
+ {
+ RefAdaAST __t34 = _t;
+ RefAdaAST tmp34_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t34;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_BODY_STUB:
+ {
+ RefAdaAST __t35 = _t;
+ RefAdaAST tmp35_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNCTION_BODY_STUB);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t35;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ABSTRACT_FUNCTION_DECLARATION:
+ {
+ RefAdaAST __t36 = _t;
+ RefAdaAST tmp36_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ABSTRACT_FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ subprog_def_id(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t36;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::formal_part_opt(RefAdaAST _t) {
+ RefAdaAST formal_part_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t112 = _t;
+ RefAdaAST tmp37_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_PART_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == PARAMETER_SPECIFICATION)) {
+ parameter_specification(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop114;
+ }
+
+ }
+ _loop114:;
+ } // ( ... )*
+ _t = __t112;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::def_designator(RefAdaAST _t) {
+ RefAdaAST def_designator_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ RefAdaAST cn = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ cn = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ compound_name(_t);
+ _t = _retTree;
+#line 221 "expandedada.store.g"
+
+ // kdDebug() << "def_designator cn:compound_name started" << endl;
+ if (m_addToStore) {
+ // kdDebug() << "def_designator cn:compound_name m_addToStore" << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName (qtext (cn));
+ method->setFileName(m_fileName);
+ // kdDebug() << "def_designator cn:compound_name method->setStartPosition(" << endl;
+ method->setStartPosition(cn->getLine(), cn->getColumn());
+
+ if (m_currentContainer == m_model->globalNamespace())
+ m_file->addFunction(method);
+ else
+ m_currentContainer->addFunction(method);
+ //FIXME: adymo: is this valid for CodeModel
+ /* ParsedMethod *old = m_currentContainer->getMethod (method);
+ if (old) {
+ delete method;
+ method = old;
+ } else {
+ m_currentContainer->addMethod (method);
+ }*/
+ }
+
+#line 1218 "AdaStoreWalker.cpp"
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ definable_operator_symbol(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::function_tail(RefAdaAST _t) {
+ RefAdaAST function_tail_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ formal_part_opt(_t);
+ _t = _retTree;
+ subtype_mark(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::definable_operator_symbol(RefAdaAST _t) {
+ RefAdaAST definable_operator_symbol_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST tmp38_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OPERATOR_SYMBOL);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::spec_decl_part(RefAdaAST _t) {
+ RefAdaAST spec_decl_part_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ RefAdaAST ps = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case GENERIC_PACKAGE_INSTANTIATION:
+ {
+ RefAdaAST __t40 = _t;
+ RefAdaAST tmp39_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_PACKAGE_INSTANTIATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ generic_inst(_t);
+ _t = _retTree;
+ _t = __t40;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_SPECIFICATION:
+ {
+ RefAdaAST __t41 = _t;
+ RefAdaAST tmp40_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKAGE_SPECIFICATION);
+ _t = _t->getFirstChild();
+ ps = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ def_id(_t);
+ _t = _retTree;
+#line 250 "expandedada.store.g"
+
+ NamespaceDom psc = defineScope( ps );
+ m_currentContainer = psc;
+ m_scopeStack.append( psc );
+ m_addToStore = true;
+
+#line 1312 "AdaStoreWalker.cpp"
+ pkg_spec_part(_t);
+ _t = _retTree;
+#line 257 "expandedada.store.g"
+
+ m_scopeStack.remove(m_scopeStack.last());
+ if (m_scopeStack.count() == 0) {
+ kdDebug() << "adastore: m_scopeStack is empty!" << endl;
+ m_scopeStack.append( m_model->globalNamespace() );
+ }
+ m_currentContainer = m_scopeStack.last();
+ // m_currentContainer->setDeclarationEndsOnLine (endLine);
+ m_addToStore = false;
+
+#line 1326 "AdaStoreWalker.cpp"
+ _t = __t41;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_RENAMING_DECLARATION:
+ {
+ RefAdaAST __t42 = _t;
+ RefAdaAST tmp41_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKAGE_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t42;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::basic_declarative_items_opt(RefAdaAST _t) {
+ RefAdaAST basic_declarative_items_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t136 = _t;
+ RefAdaAST tmp42_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BASIC_DECLARATIVE_ITEMS_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_1.member(_t->getType()))) {
+ basic_decl_item(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop138;
+ }
+
+ }
+ _loop138:;
+ } // ( ... )*
+ _t = __t136;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::private_declarative_items_opt(RefAdaAST _t) {
+ RefAdaAST private_declarative_items_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case EXCEPTION_DECLARATION:
+ case EXCEPTION_RENAMING_DECLARATION:
+ case GENERIC_PACKAGE_DECLARATION:
+ case INCOMPLETE_TYPE_DECLARATION:
+ case NUMBER_DECLARATION:
+ case OBJECT_DECLARATION:
+ case OBJECT_RENAMING_DECLARATION:
+ case PACKAGE_RENAMING_DECLARATION:
+ case PACKAGE_SPECIFICATION:
+ case PRIVATE_EXTENSION_DECLARATION:
+ case PRIVATE_TYPE_DECLARATION:
+ case PROTECTED_TYPE_DECLARATION:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case SINGLE_PROTECTED_DECLARATION:
+ case SINGLE_TASK_DECLARATION:
+ case SUBTYPE_DECLARATION:
+ case TASK_TYPE_DECLARATION:
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_OBJECT_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ case DERIVED_RECORD_EXTENSION:
+ case ENUMERATION_TYPE_DECLARATION:
+ case FLOATING_POINT_DECLARATION:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_INSTANTIATION:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ case MODULAR_TYPE_DECLARATION:
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ case RECORD_TYPE_DECLARATION:
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+#line 276 "expandedada.store.g"
+ m_currentAccess = CodeModelItem::Protected;
+#line 1457 "AdaStoreWalker.cpp"
+ { // ( ... )+
+ int _cnt47=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case EXCEPTION_DECLARATION:
+ case EXCEPTION_RENAMING_DECLARATION:
+ case GENERIC_PACKAGE_DECLARATION:
+ case INCOMPLETE_TYPE_DECLARATION:
+ case NUMBER_DECLARATION:
+ case OBJECT_DECLARATION:
+ case OBJECT_RENAMING_DECLARATION:
+ case PACKAGE_RENAMING_DECLARATION:
+ case PACKAGE_SPECIFICATION:
+ case PRIVATE_EXTENSION_DECLARATION:
+ case PRIVATE_TYPE_DECLARATION:
+ case PROTECTED_TYPE_DECLARATION:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case SINGLE_PROTECTED_DECLARATION:
+ case SINGLE_TASK_DECLARATION:
+ case SUBTYPE_DECLARATION:
+ case TASK_TYPE_DECLARATION:
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_OBJECT_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ case DERIVED_RECORD_EXTENSION:
+ case ENUMERATION_TYPE_DECLARATION:
+ case FLOATING_POINT_DECLARATION:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_INSTANTIATION:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ case MODULAR_TYPE_DECLARATION:
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ case RECORD_TYPE_DECLARATION:
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ basic_decl_item(_t);
+ _t = _retTree;
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ if ( _cnt47>=1 ) { goto _loop47; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+ }
+ _cnt47++;
+ }
+ _loop47:;
+ } // ( ... )+
+#line 278 "expandedada.store.g"
+ m_currentAccess = CodeModelItem::Public;
+#line 1538 "AdaStoreWalker.cpp"
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::end_id_opt(RefAdaAST _t) {
+ RefAdaAST end_id_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t86 = _t;
+ RefAdaAST tmp43_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),END);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case OPERATOR_SYMBOL:
+ {
+ def_designator(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t86;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::basic_decl_item(RefAdaAST _t) {
+ RefAdaAST basic_decl_item_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PACKAGE_RENAMING_DECLARATION:
+ case PACKAGE_SPECIFICATION:
+ case GENERIC_PACKAGE_INSTANTIATION:
+ {
+ spec_decl_part(_t);
+ _t = _retTree;
+ break;
+ }
+ case SINGLE_TASK_DECLARATION:
+ case TASK_TYPE_DECLARATION:
+ {
+ task_type_or_single_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROTECTED_TYPE_DECLARATION:
+ case SINGLE_PROTECTED_DECLARATION:
+ {
+ prot_type_or_single_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ subprog_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case EXCEPTION_DECLARATION:
+ case EXCEPTION_RENAMING_DECLARATION:
+ case GENERIC_PACKAGE_DECLARATION:
+ case INCOMPLETE_TYPE_DECLARATION:
+ case NUMBER_DECLARATION:
+ case OBJECT_DECLARATION:
+ case OBJECT_RENAMING_DECLARATION:
+ case PRIVATE_EXTENSION_DECLARATION:
+ case PRIVATE_TYPE_DECLARATION:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case SUBTYPE_DECLARATION:
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_OBJECT_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ case DERIVED_RECORD_EXTENSION:
+ case ENUMERATION_TYPE_DECLARATION:
+ case FLOATING_POINT_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ case MODULAR_TYPE_DECLARATION:
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ case RECORD_TYPE_DECLARATION:
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ decl_common(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::generic_formal_part_opt(RefAdaAST _t) {
+ RefAdaAST generic_formal_part_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t295 = _t;
+ RefAdaAST tmp44_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GENERIC_FORMAL_PART);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ {
+ use_clause(_t);
+ _t = _retTree;
+ break;
+ }
+ case FORMAL_PACKAGE_DECLARATION:
+ case PARAMETER_SPECIFICATION:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case FORMAL_DECIMAL_FIXED_POINT_DECLARATION:
+ case FORMAL_DISCRETE_TYPE_DECLARATION:
+ case FORMAL_FLOATING_POINT_DECLARATION:
+ case FORMAL_FUNCTION_DECLARATION:
+ case FORMAL_MODULAR_TYPE_DECLARATION:
+ case FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION:
+ case FORMAL_ORDINARY_FIXED_POINT_DECLARATION:
+ case FORMAL_PRIVATE_EXTENSION_DECLARATION:
+ case FORMAL_PRIVATE_TYPE_DECLARATION:
+ case FORMAL_PROCEDURE_DECLARATION:
+ case FORMAL_SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ generic_formal_parameter(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop297;
+ }
+ }
+ }
+ _loop297:;
+ } // ( ... )*
+ _t = __t295;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::procedure_body(RefAdaAST _t) {
+ RefAdaAST procedure_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t319 = _t;
+ RefAdaAST tmp45_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROCEDURE_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ _t = __t319;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::function_body(RefAdaAST _t) {
+ RefAdaAST function_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t321 = _t;
+ RefAdaAST tmp46_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNCTION_BODY);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ _t = __t321;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::subprog_decl_or_rename_or_inst_or_body(RefAdaAST _t) {
+ RefAdaAST subprog_decl_or_rename_or_inst_or_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ subprog_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROCEDURE_BODY:
+ {
+ procedure_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION_BODY:
+ {
+ function_body(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::subprog_decl_or_body(RefAdaAST _t) {
+ RefAdaAST subprog_decl_or_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROCEDURE_BODY:
+ {
+ procedure_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROCEDURE_DECLARATION:
+ {
+ RefAdaAST __t59 = _t;
+ RefAdaAST tmp47_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ subprog_def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t59;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_BODY:
+ {
+ function_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION_DECLARATION:
+ {
+ RefAdaAST __t60 = _t;
+ RefAdaAST tmp48_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t60;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::package_body(RefAdaAST _t) {
+ RefAdaAST package_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ RefAdaAST id = RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefAdaAST __t62 = _t;
+ RefAdaAST tmp49_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKAGE_BODY);
+ _t = _t->getFirstChild();
+ id = (_t == ASTNULL) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ def_id(_t);
+ _t = _retTree;
+ pkg_body_part(_t);
+ _t = _retTree;
+ _t = __t62;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::pragma_arg(RefAdaAST _t) {
+ RefAdaAST pragma_arg_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RIGHT_SHAFT:
+ {
+ RefAdaAST __t68 = _t;
+ RefAdaAST tmp50_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RIGHT_SHAFT);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp51_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ _t = __t68;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::expression(RefAdaAST _t) {
+ RefAdaAST expression_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case AND:
+ {
+ RefAdaAST __t479 = _t;
+ RefAdaAST tmp52_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),AND);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t479;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case AND_THEN:
+ {
+ RefAdaAST __t480 = _t;
+ RefAdaAST tmp53_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),AND_THEN);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t480;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OR:
+ {
+ RefAdaAST __t481 = _t;
+ RefAdaAST tmp54_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OR);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t481;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OR_ELSE:
+ {
+ RefAdaAST __t482 = _t;
+ RefAdaAST tmp55_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OR_ELSE);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t482;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case XOR:
+ {
+ RefAdaAST __t483 = _t;
+ RefAdaAST tmp56_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),XOR);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t483;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case NOT_IN:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ relation(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::attribute_id(RefAdaAST _t) {
+ RefAdaAST attribute_id_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RANGE:
+ {
+ RefAdaAST tmp57_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RANGE);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DIGITS:
+ {
+ RefAdaAST tmp58_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DIGITS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DELTA:
+ {
+ RefAdaAST tmp59_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DELTA);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ACCESS:
+ {
+ RefAdaAST tmp60_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ACCESS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp61_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::modifiers(RefAdaAST _t) {
+ RefAdaAST modifiers_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t79 = _t;
+ RefAdaAST tmp62_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MODIFIERS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ABSTRACT:
+ {
+ RefAdaAST tmp63_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ABSTRACT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ACCESS:
+ {
+ RefAdaAST tmp64_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ACCESS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ALIASED:
+ {
+ RefAdaAST tmp65_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ALIASED);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ALL:
+ {
+ RefAdaAST tmp66_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ALL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CONSTANT:
+ {
+ RefAdaAST tmp67_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CONSTANT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IN:
+ {
+ RefAdaAST tmp68_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IN);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LIMITED:
+ {
+ RefAdaAST tmp69_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LIMITED);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OUT:
+ {
+ RefAdaAST tmp70_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OUT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PRIVATE:
+ {
+ RefAdaAST tmp71_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PRIVATE);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROTECTED:
+ {
+ RefAdaAST tmp72_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROTECTED);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case REVERSE:
+ {
+ RefAdaAST tmp73_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),REVERSE);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TAGGED:
+ {
+ RefAdaAST tmp74_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TAGGED);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ goto _loop81;
+ }
+ }
+ }
+ _loop81:;
+ } // ( ... )*
+ _t = __t79;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::id_opt(RefAdaAST _t) {
+ RefAdaAST id_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t83 = _t;
+ RefAdaAST tmp75_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ID_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case OPERATOR_SYMBOL:
+ {
+ def_designator(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t83;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::value_s(RefAdaAST _t) {
+ RefAdaAST value_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t475 = _t;
+ RefAdaAST tmp76_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VALUES);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt477=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_2.member(_t->getType()))) {
+ value(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt477>=1 ) { goto _loop477; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt477++;
+ }
+ _loop477:;
+ } // ( ... )+
+ _t = __t475;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::value(RefAdaAST _t) {
+ RefAdaAST value_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case OTHERS:
+ {
+ RefAdaAST __t91 = _t;
+ RefAdaAST tmp77_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OTHERS);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ _t = __t91;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case RIGHT_SHAFT:
+ {
+ RefAdaAST __t92 = _t;
+ RefAdaAST tmp78_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RIGHT_SHAFT);
+ _t = _t->getFirstChild();
+ ranged_expr_s(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t92;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case RANGE:
+ case PIPE:
+ case DOT_DOT:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ ranged_expr_s(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::ranged_expr_s(RefAdaAST _t) {
+ RefAdaAST ranged_expr_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PIPE:
+ {
+ RefAdaAST __t94 = _t;
+ RefAdaAST tmp79_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PIPE);
+ _t = _t->getFirstChild();
+ ranged_expr_s(_t);
+ _t = _retTree;
+ ranged_expr(_t);
+ _t = _retTree;
+ _t = __t94;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case RANGE:
+ case DOT_DOT:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ ranged_expr(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::ranged_expr(RefAdaAST _t) {
+ RefAdaAST ranged_expr_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ {
+ RefAdaAST __t96 = _t;
+ RefAdaAST tmp80_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT_DOT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t96;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case RANGE:
+ {
+ RefAdaAST __t97 = _t;
+ RefAdaAST tmp81_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RANGE);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ range(_t);
+ _t = _retTree;
+ _t = __t97;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::simple_expression(RefAdaAST _t) {
+ RefAdaAST simple_expression_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PLUS:
+ {
+ RefAdaAST __t495 = _t;
+ RefAdaAST tmp82_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PLUS);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ signed_term(_t);
+ _t = _retTree;
+ _t = __t495;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MINUS:
+ {
+ RefAdaAST __t496 = _t;
+ RefAdaAST tmp83_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MINUS);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ signed_term(_t);
+ _t = _retTree;
+ _t = __t496;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CONCAT:
+ {
+ RefAdaAST __t497 = _t;
+ RefAdaAST tmp84_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CONCAT);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ signed_term(_t);
+ _t = _retTree;
+ _t = __t497;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ signed_term(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::range(RefAdaAST _t) {
+ RefAdaAST range_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ {
+ range_dots(_t);
+ _t = _retTree;
+ break;
+ }
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range_attrib_ref(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::range_constraint(RefAdaAST _t) {
+ RefAdaAST range_constraint_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t99 = _t;
+ RefAdaAST tmp85_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RANGE_CONSTRAINT);
+ _t = _t->getFirstChild();
+ range(_t);
+ _t = _retTree;
+ _t = __t99;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::range_dots(RefAdaAST _t) {
+ RefAdaAST range_dots_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t103 = _t;
+ RefAdaAST tmp86_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT_DOT);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t103;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::range_attrib_ref(RefAdaAST _t) {
+ RefAdaAST range_attrib_ref_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t105 = _t;
+ RefAdaAST tmp87_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RANGE_ATTRIBUTE_REFERENCE);
+ _t = _t->getFirstChild();
+ prefix(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t105;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::prefix(RefAdaAST _t) {
+ RefAdaAST prefix_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp88_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ RefAdaAST __t108 = _t;
+ RefAdaAST tmp89_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT);
+ _t = _t->getFirstChild();
+ prefix(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ALL:
+ {
+ RefAdaAST tmp90_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ALL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp91_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t108;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INDEXED_COMPONENT:
+ {
+ RefAdaAST __t110 = _t;
+ RefAdaAST tmp92_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INDEXED_COMPONENT);
+ _t = _t->getFirstChild();
+ prefix(_t);
+ _t = _retTree;
+ value_s(_t);
+ _t = _retTree;
+ _t = __t110;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::parameter_specification(RefAdaAST _t) {
+ RefAdaAST parameter_specification_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t116 = _t;
+ RefAdaAST tmp93_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PARAMETER_SPECIFICATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_mark(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t116;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::defining_identifier_list(RefAdaAST _t) {
+ RefAdaAST defining_identifier_list_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t118 = _t;
+ RefAdaAST tmp94_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DEFINING_IDENTIFIER_LIST);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt120=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER)) {
+ RefAdaAST tmp95_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ else {
+ if ( _cnt120>=1 ) { goto _loop120; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt120++;
+ }
+ _loop120:;
+ } // ( ... )+
+ _t = __t118;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::init_opt(RefAdaAST _t) {
+ RefAdaAST init_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t154 = _t;
+ RefAdaAST tmp96_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INIT_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t154;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::name(RefAdaAST _t) {
+ RefAdaAST name_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp97_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ RefAdaAST __t123 = _t;
+ RefAdaAST tmp98_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ALL:
+ {
+ RefAdaAST tmp99_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ALL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp100_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ RefAdaAST tmp101_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHARACTER_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ RefAdaAST tmp102_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OPERATOR_SYMBOL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t123;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INDEXED_COMPONENT:
+ {
+ RefAdaAST __t125 = _t;
+ RefAdaAST tmp103_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INDEXED_COMPONENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ value_s(_t);
+ _t = _retTree;
+ _t = __t125;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TIC:
+ {
+ RefAdaAST __t126 = _t;
+ RefAdaAST tmp104_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TIC);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ attribute_id(_t);
+ _t = _retTree;
+ _t = __t126;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::parenthesized_primary(RefAdaAST _t) {
+ RefAdaAST parenthesized_primary_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t129 = _t;
+ RefAdaAST tmp105_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PARENTHESIZED_PRIMARY);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NuLL:
+ {
+ RefAdaAST tmp106_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NuLL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case VALUES:
+ {
+ value_s(_t);
+ _t = _retTree;
+ extension_opt(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t129;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::extension_opt(RefAdaAST _t) {
+ RefAdaAST extension_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t132 = _t;
+ RefAdaAST tmp107_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EXTENSION_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NuLL:
+ {
+ RefAdaAST tmp108_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NuLL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case VALUES:
+ {
+ value_s(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t132;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::task_type_or_single_decl(RefAdaAST _t) {
+ RefAdaAST task_type_or_single_decl_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case TASK_TYPE_DECLARATION:
+ {
+ RefAdaAST __t141 = _t;
+ RefAdaAST tmp109_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TASK_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ discrim_part_opt(_t);
+ _t = _retTree;
+ task_definition_opt(_t);
+ _t = _retTree;
+ _t = __t141;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SINGLE_TASK_DECLARATION:
+ {
+ RefAdaAST __t142 = _t;
+ RefAdaAST tmp110_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SINGLE_TASK_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ task_definition_opt(_t);
+ _t = _retTree;
+ _t = __t142;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::prot_type_or_single_decl(RefAdaAST _t) {
+ RefAdaAST prot_type_or_single_decl_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROTECTED_TYPE_DECLARATION:
+ {
+ RefAdaAST __t182 = _t;
+ RefAdaAST tmp111_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROTECTED_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ discrim_part_opt(_t);
+ _t = _retTree;
+ protected_definition(_t);
+ _t = _retTree;
+ _t = __t182;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SINGLE_PROTECTED_DECLARATION:
+ {
+ RefAdaAST __t183 = _t;
+ RefAdaAST tmp112_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SINGLE_PROTECTED_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ protected_definition(_t);
+ _t = _retTree;
+ _t = __t183;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::decl_common(RefAdaAST _t) {
+ RefAdaAST decl_common_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ENUMERATION_TYPE_DECLARATION:
+ {
+ RefAdaAST __t202 = _t;
+ RefAdaAST tmp113_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ENUMERATION_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp114_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ enum_id_s(_t);
+ _t = _retTree;
+ _t = __t202;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ RefAdaAST __t203 = _t;
+ RefAdaAST tmp115_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SIGNED_INTEGER_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp116_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ range(_t);
+ _t = _retTree;
+ _t = __t203;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MODULAR_TYPE_DECLARATION:
+ {
+ RefAdaAST __t204 = _t;
+ RefAdaAST tmp117_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MODULAR_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp118_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ _t = __t204;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FLOATING_POINT_DECLARATION:
+ {
+ RefAdaAST __t205 = _t;
+ RefAdaAST tmp119_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FLOATING_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp120_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ range_constraint_opt(_t);
+ _t = _retTree;
+ _t = __t205;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ {
+ RefAdaAST __t206 = _t;
+ RefAdaAST tmp121_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ORDINARY_FIXED_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp122_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ range(_t);
+ _t = _retTree;
+ _t = __t206;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ {
+ RefAdaAST __t207 = _t;
+ RefAdaAST tmp123_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DECIMAL_FIXED_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp124_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ range_constraint_opt(_t);
+ _t = _retTree;
+ _t = __t207;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ARRAY_TYPE_DECLARATION:
+ {
+ array_type_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ {
+ access_type_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case INCOMPLETE_TYPE_DECLARATION:
+ {
+ RefAdaAST __t208 = _t;
+ RefAdaAST tmp125_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INCOMPLETE_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp126_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ discrim_part_opt(_t);
+ _t = _retTree;
+ _t = __t208;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PRIVATE_EXTENSION_DECLARATION:
+ {
+ RefAdaAST __t209 = _t;
+ RefAdaAST tmp127_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PRIVATE_EXTENSION_DECLARATION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t209;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DERIVED_RECORD_EXTENSION:
+ {
+ RefAdaAST __t210 = _t;
+ RefAdaAST tmp128_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DERIVED_RECORD_EXTENSION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ record_definition(_t);
+ _t = _retTree;
+ _t = __t210;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ {
+ RefAdaAST __t211 = _t;
+ RefAdaAST tmp129_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ORDINARY_DERIVED_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t211;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PRIVATE_TYPE_DECLARATION:
+ {
+ RefAdaAST __t212 = _t;
+ RefAdaAST tmp130_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PRIVATE_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ _t = __t212;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case RECORD_TYPE_DECLARATION:
+ {
+ RefAdaAST __t213 = _t;
+ RefAdaAST tmp131_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RECORD_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ record_definition(_t);
+ _t = _retTree;
+ _t = __t213;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SUBTYPE_DECLARATION:
+ {
+ RefAdaAST __t214 = _t;
+ RefAdaAST tmp132_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SUBTYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp133_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t214;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PACKAGE_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ {
+ generic_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ {
+ use_clause(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case RECORD_REPRESENTATION_CLAUSE:
+ {
+ rep_spec(_t);
+ _t = _retTree;
+ break;
+ }
+ case EXCEPTION_RENAMING_DECLARATION:
+ {
+ RefAdaAST __t215 = _t;
+ RefAdaAST tmp134_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EXCEPTION_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ compound_name(_t);
+ _t = _retTree;
+ _t = __t215;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OBJECT_RENAMING_DECLARATION:
+ {
+ RefAdaAST __t216 = _t;
+ RefAdaAST tmp135_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OBJECT_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ subtype_mark(_t);
+ _t = _retTree;
+ name(_t);
+ _t = _retTree;
+ _t = __t216;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case EXCEPTION_DECLARATION:
+ {
+ RefAdaAST __t217 = _t;
+ RefAdaAST tmp136_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EXCEPTION_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ _t = __t217;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUMBER_DECLARATION:
+ {
+ RefAdaAST __t218 = _t;
+ RefAdaAST tmp137_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUMBER_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t218;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ARRAY_OBJECT_DECLARATION:
+ {
+ RefAdaAST __t219 = _t;
+ RefAdaAST tmp138_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARRAY_OBJECT_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ array_type_definition(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t219;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OBJECT_DECLARATION:
+ {
+ RefAdaAST __t220 = _t;
+ RefAdaAST tmp139_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OBJECT_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t220;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discrim_part_opt(RefAdaAST _t) {
+ RefAdaAST discrim_part_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t145 = _t;
+ RefAdaAST tmp140_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DISCRIM_PART_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BOX:
+ {
+ RefAdaAST tmp141_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BOX);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DISCRIMINANT_SPECIFICATIONS:
+ {
+ discriminant_specifications(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t145;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::task_definition_opt(RefAdaAST _t) {
+ RefAdaAST task_definition_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ task_items_opt(_t);
+ _t = _retTree;
+ private_task_items_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::task_items_opt(RefAdaAST _t) {
+ RefAdaAST task_items_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t157 = _t;
+ RefAdaAST tmp142_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TASK_ITEMS_OPT);
+ _t = _t->getFirstChild();
+ entrydecls_repspecs_opt(_t);
+ _t = _retTree;
+ _t = __t157;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::private_task_items_opt(RefAdaAST _t) {
+ RefAdaAST private_task_items_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t180 = _t;
+ RefAdaAST tmp143_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PRIVATE_TASK_ITEMS_OPT);
+ _t = _t->getFirstChild();
+ entrydecls_repspecs_opt(_t);
+ _t = _retTree;
+ _t = __t180;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discriminant_specifications(RefAdaAST _t) {
+ RefAdaAST discriminant_specifications_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t148 = _t;
+ RefAdaAST tmp144_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DISCRIMINANT_SPECIFICATIONS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == DISCRIMINANT_SPECIFICATION)) {
+ discriminant_specification(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop150;
+ }
+
+ }
+ _loop150:;
+ } // ( ... )*
+ _t = __t148;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discriminant_specification(RefAdaAST _t) {
+ RefAdaAST discriminant_specification_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t152 = _t;
+ RefAdaAST tmp145_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DISCRIMINANT_SPECIFICATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_mark(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t152;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::entrydecls_repspecs_opt(RefAdaAST _t) {
+ RefAdaAST entrydecls_repspecs_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ENTRY_DECLARATION:
+ {
+ entry_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case RECORD_REPRESENTATION_CLAUSE:
+ {
+ rep_spec(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop160;
+ }
+ }
+ }
+ _loop160:;
+ } // ( ... )*
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::entry_declaration(RefAdaAST _t) {
+ RefAdaAST entry_declaration_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t162 = _t;
+ RefAdaAST tmp146_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ENTRY_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp147_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ discrete_subtype_def_opt(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t162;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::rep_spec(RefAdaAST _t) {
+ RefAdaAST rep_spec_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RECORD_REPRESENTATION_CLAUSE:
+ {
+ RefAdaAST __t168 = _t;
+ RefAdaAST tmp148_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RECORD_REPRESENTATION_CLAUSE);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ align_opt(_t);
+ _t = _retTree;
+ comp_loc_s(_t);
+ _t = _retTree;
+ _t = __t168;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case AT_CLAUSE:
+ {
+ RefAdaAST __t169 = _t;
+ RefAdaAST tmp149_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),AT_CLAUSE);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t169;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ {
+ RefAdaAST __t170 = _t;
+ RefAdaAST tmp150_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ATTRIBUTE_DEFINITION_CLAUSE);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t170;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ {
+ RefAdaAST __t171 = _t;
+ RefAdaAST tmp151_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ENUMERATION_REPESENTATION_CLAUSE);
+ _t = _t->getFirstChild();
+ local_enum_name(_t);
+ _t = _retTree;
+ enumeration_aggregate(_t);
+ _t = _retTree;
+ _t = __t171;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discrete_subtype_def_opt(RefAdaAST _t) {
+ RefAdaAST discrete_subtype_def_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t164 = _t;
+ RefAdaAST tmp152_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DISCRETE_SUBTYPE_DEF_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ case SUBTYPE_INDICATION:
+ {
+ discrete_subtype_definition(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t164;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discrete_subtype_definition(RefAdaAST _t) {
+ RefAdaAST discrete_subtype_definition_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ case SUBTYPE_INDICATION:
+ {
+ subtype_ind(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::subtype_ind(RefAdaAST _t) {
+ RefAdaAST subtype_ind_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t239 = _t;
+ RefAdaAST tmp153_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SUBTYPE_INDICATION);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ constraint_opt(_t);
+ _t = _retTree;
+ _t = __t239;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::align_opt(RefAdaAST _t) {
+ RefAdaAST align_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t173 = _t;
+ RefAdaAST tmp154_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MOD_CLAUSE_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t173;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::comp_loc_s(RefAdaAST _t) {
+ RefAdaAST comp_loc_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t176 = _t;
+ RefAdaAST tmp155_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),COMPONENT_CLAUSES_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ {
+ subtype_mark(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop178;
+ }
+ }
+ }
+ _loop178:;
+ } // ( ... )*
+ _t = __t176;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::local_enum_name(RefAdaAST _t) {
+ RefAdaAST local_enum_name_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST tmp156_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::enumeration_aggregate(RefAdaAST _t) {
+ RefAdaAST enumeration_aggregate_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_2.member(_t->getType()))) {
+ value(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop293;
+ }
+
+ }
+ _loop293:;
+ } // ( ... )*
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::protected_definition(RefAdaAST _t) {
+ RefAdaAST protected_definition_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ prot_op_decl_s(_t);
+ _t = _retTree;
+ prot_private_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::prot_private_opt(RefAdaAST _t) {
+ RefAdaAST prot_private_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t185 = _t;
+ RefAdaAST tmp157_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROT_PRIVATE_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROT_MEMBER_DECLARATIONS:
+ {
+ prot_member_decl_s(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t185;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::prot_member_decl_s(RefAdaAST _t) {
+ RefAdaAST prot_member_decl_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t196 = _t;
+ RefAdaAST tmp158_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROT_MEMBER_DECLARATIONS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENTRY_DECLARATION:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case FUNCTION_DECLARATION:
+ case PROCEDURE_DECLARATION:
+ {
+ prot_op_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case COMPONENT_DECLARATION:
+ {
+ comp_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop198;
+ }
+ }
+ }
+ _loop198:;
+ } // ( ... )*
+ _t = __t196;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::prot_op_decl_s(RefAdaAST _t) {
+ RefAdaAST prot_op_decl_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t189 = _t;
+ RefAdaAST tmp159_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROT_OP_DECLARATIONS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_3.member(_t->getType()))) {
+ prot_op_decl(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop191;
+ }
+
+ }
+ _loop191:;
+ } // ( ... )*
+ _t = __t189;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::prot_op_decl(RefAdaAST _t) {
+ RefAdaAST prot_op_decl_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ENTRY_DECLARATION:
+ {
+ entry_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROCEDURE_DECLARATION:
+ {
+ RefAdaAST __t193 = _t;
+ RefAdaAST tmp160_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t193;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_DECLARATION:
+ {
+ RefAdaAST __t194 = _t;
+ RefAdaAST tmp161_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t194;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case RECORD_REPRESENTATION_CLAUSE:
+ {
+ rep_spec(_t);
+ _t = _retTree;
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::comp_decl(RefAdaAST _t) {
+ RefAdaAST comp_decl_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t200 = _t;
+ RefAdaAST tmp162_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),COMPONENT_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ component_subtype_def(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t200;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::component_subtype_def(RefAdaAST _t) {
+ RefAdaAST component_subtype_def_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::enum_id_s(RefAdaAST _t) {
+ RefAdaAST enum_id_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ { // ( ... )+
+ int _cnt224=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER || _t->getType() == CHARACTER_LITERAL)) {
+ enumeration_literal_specification(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt224>=1 ) { goto _loop224; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt224++;
+ }
+ _loop224:;
+ } // ( ... )+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::range_constraint_opt(RefAdaAST _t) {
+ RefAdaAST range_constraint_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RANGE_CONSTRAINT:
+ {
+ range_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::array_type_declaration(RefAdaAST _t) {
+ RefAdaAST array_type_declaration_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t230 = _t;
+ RefAdaAST tmp163_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARRAY_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp164_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ array_type_definition(_t);
+ _t = _retTree;
+ _t = __t230;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::access_type_declaration(RefAdaAST _t) {
+ RefAdaAST access_type_declaration_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ {
+ RefAdaAST __t263 = _t;
+ RefAdaAST tmp165_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ACCESS_TO_PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp166_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ modifiers(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t263;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ {
+ RefAdaAST __t264 = _t;
+ RefAdaAST tmp167_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ACCESS_TO_FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp168_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ modifiers(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t264;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ACCESS_TO_OBJECT_DECLARATION:
+ {
+ RefAdaAST __t265 = _t;
+ RefAdaAST tmp169_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ACCESS_TO_OBJECT_DECLARATION);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp170_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t265;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::id_and_discrim(RefAdaAST _t) {
+ RefAdaAST id_and_discrim_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST tmp171_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ discrim_part_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::record_definition(RefAdaAST _t) {
+ RefAdaAST record_definition_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case COMPONENT_ITEMS:
+ {
+ component_list(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::array_type_definition(RefAdaAST _t) {
+ RefAdaAST array_type_definition_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ index_or_discrete_range_s(_t);
+ _t = _retTree;
+ component_subtype_def(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::enumeration_literal_specification(RefAdaAST _t) {
+ RefAdaAST enumeration_literal_specification_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp172_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ RefAdaAST tmp173_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHARACTER_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::index_or_discrete_range_s(RefAdaAST _t) {
+ RefAdaAST index_or_discrete_range_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case RANGE:
+ case DOT_DOT:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ index_or_discrete_range(_t);
+ _t = _retTree;
+ break;
+ }
+ case COMMA:
+ {
+ RefAdaAST __t232 = _t;
+ RefAdaAST tmp174_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),COMMA);
+ _t = _t->getFirstChild();
+ index_or_discrete_range_s(_t);
+ _t = _retTree;
+ index_or_discrete_range(_t);
+ _t = _retTree;
+ _t = __t232;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::index_or_discrete_range(RefAdaAST _t) {
+ RefAdaAST index_or_discrete_range_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ {
+ RefAdaAST __t234 = _t;
+ RefAdaAST tmp175_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT_DOT);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t234;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case RANGE:
+ {
+ RefAdaAST __t235 = _t;
+ RefAdaAST tmp176_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RANGE);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BOX:
+ {
+ RefAdaAST tmp177_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BOX);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t235;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ simple_expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::constraint_opt(RefAdaAST _t) {
+ RefAdaAST constraint_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RANGE_CONSTRAINT:
+ {
+ range_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case DIGITS_CONSTRAINT:
+ {
+ digits_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case DELTA_CONSTRAINT:
+ {
+ delta_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case INDEX_CONSTRAINT:
+ {
+ index_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case DISCRIMINANT_CONSTRAINT:
+ {
+ discriminant_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::digits_constraint(RefAdaAST _t) {
+ RefAdaAST digits_constraint_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t243 = _t;
+ RefAdaAST tmp178_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DIGITS_CONSTRAINT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ range_constraint_opt(_t);
+ _t = _retTree;
+ _t = __t243;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::delta_constraint(RefAdaAST _t) {
+ RefAdaAST delta_constraint_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t245 = _t;
+ RefAdaAST tmp179_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DELTA_CONSTRAINT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ range_constraint_opt(_t);
+ _t = _retTree;
+ _t = __t245;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::index_constraint(RefAdaAST _t) {
+ RefAdaAST index_constraint_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t247 = _t;
+ RefAdaAST tmp180_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INDEX_CONSTRAINT);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt249=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == DOT_DOT || _t->getType() == RANGE_ATTRIBUTE_REFERENCE || _t->getType() == SUBTYPE_INDICATION)) {
+ discrete_range(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt249>=1 ) { goto _loop249; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt249++;
+ }
+ _loop249:;
+ } // ( ... )+
+ _t = __t247;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discriminant_constraint(RefAdaAST _t) {
+ RefAdaAST discriminant_constraint_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t252 = _t;
+ RefAdaAST tmp181_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DISCRIMINANT_CONSTRAINT);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt254=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == DISCRIMINANT_ASSOCIATION)) {
+ discriminant_association(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt254>=1 ) { goto _loop254; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt254++;
+ }
+ _loop254:;
+ } // ( ... )+
+ _t = __t252;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discrete_range(RefAdaAST _t) {
+ RefAdaAST discrete_range_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ case SUBTYPE_INDICATION:
+ {
+ subtype_ind(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discriminant_association(RefAdaAST _t) {
+ RefAdaAST discriminant_association_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t256 = _t;
+ RefAdaAST tmp182_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DISCRIMINANT_ASSOCIATION);
+ _t = _t->getFirstChild();
+ selector_names_opt(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t256;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::selector_names_opt(RefAdaAST _t) {
+ RefAdaAST selector_names_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t258 = _t;
+ RefAdaAST tmp183_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SELECTOR_NAMES_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER)) {
+ selector_name(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop260;
+ }
+
+ }
+ _loop260:;
+ } // ( ... )*
+ _t = __t258;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::selector_name(RefAdaAST _t) {
+ RefAdaAST selector_name_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST tmp184_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::component_list(RefAdaAST _t) {
+ RefAdaAST component_list_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ component_items(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case VARIANT_PART:
+ {
+ variant_part(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::component_items(RefAdaAST _t) {
+ RefAdaAST component_items_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t271 = _t;
+ RefAdaAST tmp185_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),COMPONENT_ITEMS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case COMPONENT_DECLARATION:
+ {
+ comp_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop273;
+ }
+ }
+ }
+ _loop273:;
+ } // ( ... )*
+ _t = __t271;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::variant_part(RefAdaAST _t) {
+ RefAdaAST variant_part_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t275 = _t;
+ RefAdaAST tmp186_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VARIANT_PART);
+ _t = _t->getFirstChild();
+ discriminant_direct_name(_t);
+ _t = _retTree;
+ variant_s(_t);
+ _t = _retTree;
+ _t = __t275;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discriminant_direct_name(RefAdaAST _t) {
+ RefAdaAST discriminant_direct_name_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST tmp187_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::variant_s(RefAdaAST _t) {
+ RefAdaAST variant_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t278 = _t;
+ RefAdaAST tmp188_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VARIANTS);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt280=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == VARIANT)) {
+ variant(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt280>=1 ) { goto _loop280; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt280++;
+ }
+ _loop280:;
+ } // ( ... )+
+ _t = __t278;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::variant(RefAdaAST _t) {
+ RefAdaAST variant_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t282 = _t;
+ RefAdaAST tmp189_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VARIANT);
+ _t = _t->getFirstChild();
+ choice_s(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case COMPONENT_ITEMS:
+ {
+ component_list(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t282;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::choice_s(RefAdaAST _t) {
+ RefAdaAST choice_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PIPE:
+ {
+ RefAdaAST __t285 = _t;
+ RefAdaAST tmp190_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PIPE);
+ _t = _t->getFirstChild();
+ choice_s(_t);
+ _t = _retTree;
+ choice(_t);
+ _t = _retTree;
+ _t = __t285;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case OTHERS:
+ case DOT_DOT:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ case AND_THEN:
+ case MARK_WITH_CONSTRAINT:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ choice(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::choice(RefAdaAST _t) {
+ RefAdaAST choice_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case OTHERS:
+ {
+ RefAdaAST tmp191_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OTHERS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ case MARK_WITH_CONSTRAINT:
+ {
+ discrete_with_range(_t);
+ _t = _retTree;
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::discrete_with_range(RefAdaAST _t) {
+ RefAdaAST discrete_with_range_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case MARK_WITH_CONSTRAINT:
+ {
+ mark_with_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::mark_with_constraint(RefAdaAST _t) {
+ RefAdaAST mark_with_constraint_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t289 = _t;
+ RefAdaAST tmp192_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MARK_WITH_CONSTRAINT);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ range_constraint(_t);
+ _t = _retTree;
+ _t = __t289;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::generic_formal_parameter(RefAdaAST _t) {
+ RefAdaAST generic_formal_parameter_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case FORMAL_DISCRETE_TYPE_DECLARATION:
+ {
+ RefAdaAST __t299 = _t;
+ RefAdaAST tmp193_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_DISCRETE_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t299;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ RefAdaAST __t300 = _t;
+ RefAdaAST tmp194_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_SIGNED_INTEGER_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t300;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_MODULAR_TYPE_DECLARATION:
+ {
+ RefAdaAST __t301 = _t;
+ RefAdaAST tmp195_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_MODULAR_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t301;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_DECIMAL_FIXED_POINT_DECLARATION:
+ {
+ RefAdaAST __t302 = _t;
+ RefAdaAST tmp196_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_DECIMAL_FIXED_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t302;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_ORDINARY_FIXED_POINT_DECLARATION:
+ {
+ RefAdaAST __t303 = _t;
+ RefAdaAST tmp197_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_ORDINARY_FIXED_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t303;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_FLOATING_POINT_DECLARATION:
+ {
+ RefAdaAST __t304 = _t;
+ RefAdaAST tmp198_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_FLOATING_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t304;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ARRAY_TYPE_DECLARATION:
+ {
+ formal_array_type_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ {
+ formal_access_type_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case FORMAL_PRIVATE_TYPE_DECLARATION:
+ {
+ RefAdaAST __t305 = _t;
+ RefAdaAST tmp199_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_PRIVATE_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_part(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ _t = __t305;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION:
+ {
+ RefAdaAST __t306 = _t;
+ RefAdaAST tmp200_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_part(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t306;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_PRIVATE_EXTENSION_DECLARATION:
+ {
+ RefAdaAST __t307 = _t;
+ RefAdaAST tmp201_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_PRIVATE_EXTENSION_DECLARATION);
+ _t = _t->getFirstChild();
+ id_part(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t307;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_PROCEDURE_DECLARATION:
+ {
+ RefAdaAST __t308 = _t;
+ RefAdaAST tmp202_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ subprogram_default_opt(_t);
+ _t = _retTree;
+ _t = __t308;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_FUNCTION_DECLARATION:
+ {
+ RefAdaAST __t309 = _t;
+ RefAdaAST tmp203_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ subprogram_default_opt(_t);
+ _t = _retTree;
+ _t = __t309;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_PACKAGE_DECLARATION:
+ {
+ RefAdaAST __t310 = _t;
+ RefAdaAST tmp204_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FORMAL_PACKAGE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ compound_name(_t);
+ _t = _retTree;
+ formal_package_actual_part_opt(_t);
+ _t = _retTree;
+ _t = __t310;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PARAMETER_SPECIFICATION:
+ {
+ parameter_specification(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::formal_array_type_declaration(RefAdaAST _t) {
+ RefAdaAST formal_array_type_declaration_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ array_type_declaration(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::formal_access_type_declaration(RefAdaAST _t) {
+ RefAdaAST formal_access_type_declaration_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ access_type_declaration(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::id_part(RefAdaAST _t) {
+ RefAdaAST id_part_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ def_id(_t);
+ _t = _retTree;
+ discrim_part_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::subprogram_default_opt(RefAdaAST _t) {
+ RefAdaAST subprogram_default_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BOX:
+ {
+ RefAdaAST tmp205_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BOX);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case INDEXED_COMPONENT:
+ {
+ name(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::formal_package_actual_part_opt(RefAdaAST _t) {
+ RefAdaAST formal_package_actual_part_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BOX:
+ {
+ RefAdaAST tmp206_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BOX);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DEFINING_IDENTIFIER_LIST:
+ {
+ defining_identifier_list(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::body_part(RefAdaAST _t) {
+ RefAdaAST body_part_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ declarative_part(_t);
+ _t = _retTree;
+ block_body(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::declarative_part(RefAdaAST _t) {
+ RefAdaAST declarative_part_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t324 = _t;
+ RefAdaAST tmp207_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DECLARATIVE_PART);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case EXCEPTION_DECLARATION:
+ case EXCEPTION_RENAMING_DECLARATION:
+ case GENERIC_PACKAGE_DECLARATION:
+ case INCOMPLETE_TYPE_DECLARATION:
+ case NUMBER_DECLARATION:
+ case OBJECT_DECLARATION:
+ case OBJECT_RENAMING_DECLARATION:
+ case PACKAGE_BODY:
+ case PACKAGE_BODY_STUB:
+ case PACKAGE_RENAMING_DECLARATION:
+ case PACKAGE_SPECIFICATION:
+ case PRIVATE_EXTENSION_DECLARATION:
+ case PRIVATE_TYPE_DECLARATION:
+ case PROTECTED_BODY:
+ case PROTECTED_BODY_STUB:
+ case PROTECTED_TYPE_DECLARATION:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case SINGLE_PROTECTED_DECLARATION:
+ case SINGLE_TASK_DECLARATION:
+ case SUBTYPE_DECLARATION:
+ case TASK_BODY:
+ case TASK_BODY_STUB:
+ case TASK_TYPE_DECLARATION:
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_OBJECT_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ case DERIVED_RECORD_EXTENSION:
+ case ENUMERATION_TYPE_DECLARATION:
+ case FLOATING_POINT_DECLARATION:
+ case FUNCTION_BODY:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_INSTANTIATION:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ case MODULAR_TYPE_DECLARATION:
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ case PROCEDURE_BODY:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ case RECORD_TYPE_DECLARATION:
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ declarative_item(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop326;
+ }
+ }
+ }
+ _loop326:;
+ } // ( ... )*
+ _t = __t324;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::block_body(RefAdaAST _t) {
+ RefAdaAST block_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t343 = _t;
+ RefAdaAST tmp208_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BLOCK_BODY);
+ _t = _t->getFirstChild();
+ handled_stmt_s(_t);
+ _t = _retTree;
+ _t = __t343;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::declarative_item(RefAdaAST _t) {
+ RefAdaAST declarative_item_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PACKAGE_BODY_STUB:
+ {
+ RefAdaAST __t328 = _t;
+ RefAdaAST tmp209_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKAGE_BODY_STUB);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t328;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_BODY:
+ {
+ RefAdaAST __t329 = _t;
+ RefAdaAST tmp210_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKAGE_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ pkg_body_part(_t);
+ _t = _retTree;
+ _t = __t329;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_RENAMING_DECLARATION:
+ case PACKAGE_SPECIFICATION:
+ case GENERIC_PACKAGE_INSTANTIATION:
+ {
+ spec_decl_part(_t);
+ _t = _retTree;
+ break;
+ }
+ case TASK_BODY_STUB:
+ {
+ RefAdaAST __t330 = _t;
+ RefAdaAST tmp211_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TASK_BODY_STUB);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t330;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TASK_BODY:
+ {
+ RefAdaAST __t331 = _t;
+ RefAdaAST tmp212_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TASK_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ _t = __t331;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SINGLE_TASK_DECLARATION:
+ case TASK_TYPE_DECLARATION:
+ {
+ task_type_or_single_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROTECTED_BODY_STUB:
+ {
+ RefAdaAST __t332 = _t;
+ RefAdaAST tmp213_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROTECTED_BODY_STUB);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t332;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROTECTED_BODY:
+ {
+ RefAdaAST __t333 = _t;
+ RefAdaAST tmp214_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROTECTED_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ prot_op_bodies_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ _t = __t333;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROTECTED_TYPE_DECLARATION:
+ case SINGLE_PROTECTED_DECLARATION:
+ {
+ prot_type_or_single_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case FUNCTION_BODY:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case PROCEDURE_BODY:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ subprog_decl_or_rename_or_inst_or_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case EXCEPTION_DECLARATION:
+ case EXCEPTION_RENAMING_DECLARATION:
+ case GENERIC_PACKAGE_DECLARATION:
+ case INCOMPLETE_TYPE_DECLARATION:
+ case NUMBER_DECLARATION:
+ case OBJECT_DECLARATION:
+ case OBJECT_RENAMING_DECLARATION:
+ case PRIVATE_EXTENSION_DECLARATION:
+ case PRIVATE_TYPE_DECLARATION:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case SUBTYPE_DECLARATION:
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_OBJECT_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ case DERIVED_RECORD_EXTENSION:
+ case ENUMERATION_TYPE_DECLARATION:
+ case FLOATING_POINT_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ case MODULAR_TYPE_DECLARATION:
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ case RECORD_TYPE_DECLARATION:
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ decl_common(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::prot_op_bodies_opt(RefAdaAST _t) {
+ RefAdaAST prot_op_bodies_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t339 = _t;
+ RefAdaAST tmp215_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROT_OP_BODIES_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case ENTRY_BODY:
+ {
+ entry_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION_BODY:
+ case FUNCTION_DECLARATION:
+ case PROCEDURE_BODY:
+ case PROCEDURE_DECLARATION:
+ {
+ subprog_decl_or_body(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop341;
+ }
+ }
+ }
+ _loop341:;
+ } // ( ... )*
+ _t = __t339;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::block_body_opt(RefAdaAST _t) {
+ RefAdaAST block_body_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t336 = _t;
+ RefAdaAST tmp216_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BLOCK_BODY_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case HANDLED_SEQUENCE_OF_STATEMENTS:
+ {
+ handled_stmt_s(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t336;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::handled_stmt_s(RefAdaAST _t) {
+ RefAdaAST handled_stmt_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t345 = _t;
+ RefAdaAST tmp217_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),HANDLED_SEQUENCE_OF_STATEMENTS);
+ _t = _t->getFirstChild();
+ statements(_t);
+ _t = _retTree;
+ except_handler_part_opt(_t);
+ _t = _retTree;
+ _t = __t345;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::entry_body(RefAdaAST _t) {
+ RefAdaAST entry_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t405 = _t;
+ RefAdaAST tmp218_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ENTRY_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ entry_body_formal_part(_t);
+ _t = _retTree;
+ entry_barrier(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ _t = __t405;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::statements(RefAdaAST _t) {
+ RefAdaAST statements_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t350 = _t;
+ RefAdaAST tmp219_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SEQUENCE_OF_STATEMENTS);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt352=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case STATEMENT:
+ {
+ statement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ if ( _cnt352>=1 ) { goto _loop352; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+ }
+ _cnt352++;
+ }
+ _loop352:;
+ } // ( ... )+
+ _t = __t350;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::except_handler_part_opt(RefAdaAST _t) {
+ RefAdaAST except_handler_part_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t455 = _t;
+ RefAdaAST tmp220_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EXCEPT_HANDLER_PART_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == EXCEPTION_HANDLER)) {
+ exception_handler(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop457;
+ }
+
+ }
+ _loop457:;
+ } // ( ... )*
+ _t = __t455;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::handled_stmts_opt(RefAdaAST _t) {
+ RefAdaAST handled_stmts_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t347 = _t;
+ RefAdaAST tmp221_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),HANDLED_STMTS_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case SEQUENCE_OF_STATEMENTS:
+ {
+ statements(_t);
+ _t = _retTree;
+ except_handler_part_opt(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t347;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::statement(RefAdaAST _t) {
+ RefAdaAST statement_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t354 = _t;
+ RefAdaAST tmp222_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STATEMENT);
+ _t = _t->getFirstChild();
+ def_label_opt(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NULL_STATEMENT:
+ {
+ null_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case EXIT_STATEMENT:
+ {
+ exit_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case RETURN_STATEMENT:
+ {
+ return_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case GOTO_STATEMENT:
+ {
+ goto_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case DELAY_STATEMENT:
+ {
+ delay_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ABORT_STATEMENT:
+ {
+ abort_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case RAISE_STATEMENT:
+ {
+ raise_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case REQUEUE_STATEMENT:
+ {
+ requeue_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ACCEPT_STATEMENT:
+ {
+ accept_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ASYNCHRONOUS_SELECT:
+ case CONDITIONAL_ENTRY_CALL:
+ case SELECTIVE_ACCEPT:
+ case TIMED_ENTRY_CALL:
+ {
+ select_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case IF_STATEMENT:
+ {
+ if_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case CASE_STATEMENT:
+ {
+ case_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case LOOP_STATEMENT:
+ {
+ loop_stmt(_t);
+ _t = _retTree;
+ id_opt(_t);
+ _t = _retTree;
+ break;
+ }
+ case BLOCK_STATEMENT:
+ {
+ block(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ASSIGNMENT_STATEMENT:
+ case CALL_STATEMENT:
+ {
+ call_or_assignment(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t354;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::def_label_opt(RefAdaAST _t) {
+ RefAdaAST def_label_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t357 = _t;
+ RefAdaAST tmp223_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LABEL_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp224_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t357;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::null_stmt(RefAdaAST _t) {
+ RefAdaAST null_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST tmp225_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NULL_STATEMENT);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::exit_stmt(RefAdaAST _t) {
+ RefAdaAST exit_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t392 = _t;
+ RefAdaAST tmp226_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EXIT_STATEMENT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ label_name(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ case WHEN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case WHEN:
+ {
+ RefAdaAST tmp227_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),WHEN);
+ _t = _t->getNextSibling();
+ condition(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t392;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::return_stmt(RefAdaAST _t) {
+ RefAdaAST return_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t397 = _t;
+ RefAdaAST tmp228_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RETURN_STATEMENT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t397;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::goto_stmt(RefAdaAST _t) {
+ RefAdaAST goto_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t400 = _t;
+ RefAdaAST tmp229_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GOTO_STATEMENT);
+ _t = _t->getFirstChild();
+ label_name(_t);
+ _t = _retTree;
+ _t = __t400;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::delay_stmt(RefAdaAST _t) {
+ RefAdaAST delay_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t419 = _t;
+ RefAdaAST tmp230_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DELAY_STATEMENT);
+ _t = _t->getFirstChild();
+ modifiers(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t419;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::abort_stmt(RefAdaAST _t) {
+ RefAdaAST abort_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t451 = _t;
+ RefAdaAST tmp231_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ABORT_STATEMENT);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt453=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_4.member(_t->getType()))) {
+ name(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt453>=1 ) { goto _loop453; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt453++;
+ }
+ _loop453:;
+ } // ( ... )+
+ _t = __t451;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::raise_stmt(RefAdaAST _t) {
+ RefAdaAST raise_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t467 = _t;
+ RefAdaAST tmp232_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RAISE_STATEMENT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ compound_name(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t467;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::requeue_stmt(RefAdaAST _t) {
+ RefAdaAST requeue_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t470 = _t;
+ RefAdaAST tmp233_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),REQUEUE_STATEMENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ABORT:
+ {
+ RefAdaAST tmp234_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ABORT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t470;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::accept_stmt(RefAdaAST _t) {
+ RefAdaAST accept_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t414 = _t;
+ RefAdaAST tmp235_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ACCEPT_STATEMENT);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ entry_index_opt(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ handled_stmts_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ _t = __t414;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::select_stmt(RefAdaAST _t) {
+ RefAdaAST select_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ASYNCHRONOUS_SELECT:
+ {
+ RefAdaAST __t421 = _t;
+ RefAdaAST tmp236_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ASYNCHRONOUS_SELECT);
+ _t = _t->getFirstChild();
+ triggering_alternative(_t);
+ _t = _retTree;
+ abortable_part(_t);
+ _t = _retTree;
+ _t = __t421;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SELECTIVE_ACCEPT:
+ {
+ RefAdaAST __t422 = _t;
+ RefAdaAST tmp237_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SELECTIVE_ACCEPT);
+ _t = _t->getFirstChild();
+ selective_accept(_t);
+ _t = _retTree;
+ _t = __t422;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TIMED_ENTRY_CALL:
+ {
+ RefAdaAST __t423 = _t;
+ RefAdaAST tmp238_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TIMED_ENTRY_CALL);
+ _t = _t->getFirstChild();
+ entry_call_alternative(_t);
+ _t = _retTree;
+ delay_alternative(_t);
+ _t = _retTree;
+ _t = __t423;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CONDITIONAL_ENTRY_CALL:
+ {
+ RefAdaAST __t424 = _t;
+ RefAdaAST tmp239_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CONDITIONAL_ENTRY_CALL);
+ _t = _t->getFirstChild();
+ entry_call_alternative(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t424;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::if_stmt(RefAdaAST _t) {
+ RefAdaAST if_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t361 = _t;
+ RefAdaAST tmp240_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IF_STATEMENT);
+ _t = _t->getFirstChild();
+ cond_clause(_t);
+ _t = _retTree;
+ elsifs_opt(_t);
+ _t = _retTree;
+ else_opt(_t);
+ _t = _retTree;
+ _t = __t361;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::case_stmt(RefAdaAST _t) {
+ RefAdaAST case_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t373 = _t;
+ RefAdaAST tmp241_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CASE_STATEMENT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ alternative_s(_t);
+ _t = _retTree;
+ _t = __t373;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::loop_stmt(RefAdaAST _t) {
+ RefAdaAST loop_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t380 = _t;
+ RefAdaAST tmp242_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LOOP_STATEMENT);
+ _t = _t->getFirstChild();
+ iteration_scheme_opt(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t380;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::block(RefAdaAST _t) {
+ RefAdaAST block_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t387 = _t;
+ RefAdaAST tmp243_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BLOCK_STATEMENT);
+ _t = _t->getFirstChild();
+ declare_opt(_t);
+ _t = _retTree;
+ block_body(_t);
+ _t = _retTree;
+ _t = __t387;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::call_or_assignment(RefAdaAST _t) {
+ RefAdaAST call_or_assignment_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ASSIGNMENT_STATEMENT:
+ {
+ RefAdaAST __t402 = _t;
+ RefAdaAST tmp244_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ASSIGNMENT_STATEMENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t402;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CALL_STATEMENT:
+ {
+ RefAdaAST __t403 = _t;
+ RefAdaAST tmp245_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CALL_STATEMENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ _t = __t403;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::cond_clause(RefAdaAST _t) {
+ RefAdaAST cond_clause_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t363 = _t;
+ RefAdaAST tmp246_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),COND_CLAUSE);
+ _t = _t->getFirstChild();
+ condition(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t363;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::elsifs_opt(RefAdaAST _t) {
+ RefAdaAST elsifs_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t366 = _t;
+ RefAdaAST tmp247_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ELSIFS_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == COND_CLAUSE)) {
+ cond_clause(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop368;
+ }
+
+ }
+ _loop368:;
+ } // ( ... )*
+ _t = __t366;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::else_opt(RefAdaAST _t) {
+ RefAdaAST else_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t370 = _t;
+ RefAdaAST tmp248_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ELSE_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case SEQUENCE_OF_STATEMENTS:
+ {
+ statements(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t370;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::condition(RefAdaAST _t) {
+ RefAdaAST condition_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ expression(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::alternative_s(RefAdaAST _t) {
+ RefAdaAST alternative_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ { // ( ... )+
+ int _cnt376=0;
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == CASE_STATEMENT_ALTERNATIVE)) {
+ case_statement_alternative(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt376>=1 ) { goto _loop376; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt376++;
+ }
+ _loop376:;
+ } // ( ... )+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::case_statement_alternative(RefAdaAST _t) {
+ RefAdaAST case_statement_alternative_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t378 = _t;
+ RefAdaAST tmp249_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CASE_STATEMENT_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ choice_s(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t378;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::iteration_scheme_opt(RefAdaAST _t) {
+ RefAdaAST iteration_scheme_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t382 = _t;
+ RefAdaAST tmp250_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ITERATION_SCHEME_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case WHILE:
+ {
+ RefAdaAST __t384 = _t;
+ RefAdaAST tmp251_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),WHILE);
+ _t = _t->getFirstChild();
+ condition(_t);
+ _t = _retTree;
+ _t = __t384;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FOR:
+ {
+ RefAdaAST __t385 = _t;
+ RefAdaAST tmp252_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FOR);
+ _t = _t->getFirstChild();
+ RefAdaAST tmp253_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ modifiers(_t);
+ _t = _retTree;
+ discrete_subtype_definition(_t);
+ _t = _retTree;
+ _t = __t385;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t382;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::declare_opt(RefAdaAST _t) {
+ RefAdaAST declare_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t389 = _t;
+ RefAdaAST tmp254_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DECLARE_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DECLARATIVE_PART:
+ {
+ declarative_part(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t389;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::label_name(RefAdaAST _t) {
+ RefAdaAST label_name_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST tmp255_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::entry_body_formal_part(RefAdaAST _t) {
+ RefAdaAST entry_body_formal_part_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ entry_index_spec_opt(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::entry_barrier(RefAdaAST _t) {
+ RefAdaAST entry_barrier_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ condition(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::entry_index_spec_opt(RefAdaAST _t) {
+ RefAdaAST entry_index_spec_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t408 = _t;
+ RefAdaAST tmp256_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ENTRY_INDEX_SPECIFICATION);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ def_id(_t);
+ _t = _retTree;
+ discrete_subtype_definition(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t408;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::entry_call_stmt(RefAdaAST _t) {
+ RefAdaAST entry_call_stmt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t412 = _t;
+ RefAdaAST tmp257_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ENTRY_CALL_STATEMENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ _t = __t412;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::entry_index_opt(RefAdaAST _t) {
+ RefAdaAST entry_index_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t416 = _t;
+ RefAdaAST tmp258_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ENTRY_INDEX_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t416;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::triggering_alternative(RefAdaAST _t) {
+ RefAdaAST triggering_alternative_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t426 = _t;
+ RefAdaAST tmp259_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TRIGGERING_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DELAY_STATEMENT:
+ {
+ delay_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ENTRY_CALL_STATEMENT:
+ {
+ entry_call_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t426;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::abortable_part(RefAdaAST _t) {
+ RefAdaAST abortable_part_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t429 = _t;
+ RefAdaAST tmp260_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ABORTABLE_PART);
+ _t = _t->getFirstChild();
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t429;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::selective_accept(RefAdaAST _t) {
+ RefAdaAST selective_accept_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ guard_opt(_t);
+ _t = _retTree;
+ select_alternative(_t);
+ _t = _retTree;
+ or_select_opt(_t);
+ _t = _retTree;
+ else_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::entry_call_alternative(RefAdaAST _t) {
+ RefAdaAST entry_call_alternative_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t431 = _t;
+ RefAdaAST tmp261_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ENTRY_CALL_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ entry_call_stmt(_t);
+ _t = _retTree;
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t431;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::delay_alternative(RefAdaAST _t) {
+ RefAdaAST delay_alternative_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t442 = _t;
+ RefAdaAST tmp262_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DELAY_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ delay_stmt(_t);
+ _t = _retTree;
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t442;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::stmts_opt(RefAdaAST _t) {
+ RefAdaAST stmts_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case STATEMENT:
+ {
+ statement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop445;
+ }
+ }
+ }
+ _loop445:;
+ } // ( ... )*
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::guard_opt(RefAdaAST _t) {
+ RefAdaAST guard_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t434 = _t;
+ RefAdaAST tmp263_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GUARD_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ condition(_t);
+ _t = _retTree;
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == PRAGMA)) {
+ pragma(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop437;
+ }
+
+ }
+ _loop437:;
+ } // ( ... )*
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t434;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::select_alternative(RefAdaAST _t) {
+ RefAdaAST select_alternative_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ACCEPT_ALTERNATIVE:
+ {
+ accept_alternative(_t);
+ _t = _retTree;
+ break;
+ }
+ case DELAY_ALTERNATIVE:
+ {
+ delay_alternative(_t);
+ _t = _retTree;
+ break;
+ }
+ case TERMINATE_ALTERNATIVE:
+ {
+ RefAdaAST tmp264_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TERMINATE_ALTERNATIVE);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::or_select_opt(RefAdaAST _t) {
+ RefAdaAST or_select_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t447 = _t;
+ RefAdaAST tmp265_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OR_SELECT_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == GUARD_OPT)) {
+ guard_opt(_t);
+ _t = _retTree;
+ select_alternative(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop449;
+ }
+
+ }
+ _loop449:;
+ } // ( ... )*
+ _t = __t447;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::accept_alternative(RefAdaAST _t) {
+ RefAdaAST accept_alternative_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t440 = _t;
+ RefAdaAST tmp266_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ACCEPT_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ accept_stmt(_t);
+ _t = _retTree;
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t440;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::exception_handler(RefAdaAST _t) {
+ RefAdaAST exception_handler_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t459 = _t;
+ RefAdaAST tmp267_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EXCEPTION_HANDLER);
+ _t = _t->getFirstChild();
+ identifier_colon_opt(_t);
+ _t = _retTree;
+ except_choice_s(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t459;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::identifier_colon_opt(RefAdaAST _t) {
+ RefAdaAST identifier_colon_opt_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t461 = _t;
+ RefAdaAST tmp268_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER_COLON_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp269_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t461;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::except_choice_s(RefAdaAST _t) {
+ RefAdaAST except_choice_s_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PIPE:
+ {
+ RefAdaAST __t464 = _t;
+ RefAdaAST tmp270_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PIPE);
+ _t = _t->getFirstChild();
+ except_choice_s(_t);
+ _t = _retTree;
+ exception_choice(_t);
+ _t = _retTree;
+ _t = __t464;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case OTHERS:
+ {
+ exception_choice(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::exception_choice(RefAdaAST _t) {
+ RefAdaAST exception_choice_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ compound_name(_t);
+ _t = _retTree;
+ break;
+ }
+ case OTHERS:
+ {
+ RefAdaAST tmp271_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OTHERS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::operator_call(RefAdaAST _t) {
+ RefAdaAST operator_call_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t473 = _t;
+ RefAdaAST tmp272_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OPERATOR_SYMBOL);
+ _t = _t->getFirstChild();
+ value_s(_t);
+ _t = _retTree;
+ _t = __t473;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::relation(RefAdaAST _t) {
+ RefAdaAST relation_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IN:
+ {
+ RefAdaAST __t485 = _t;
+ RefAdaAST tmp273_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IN);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ range_or_mark(_t);
+ _t = _retTree;
+ _t = __t485;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NOT_IN:
+ {
+ RefAdaAST __t486 = _t;
+ RefAdaAST tmp274_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NOT_IN);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ range_or_mark(_t);
+ _t = _retTree;
+ _t = __t486;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case EQ:
+ {
+ RefAdaAST __t487 = _t;
+ RefAdaAST tmp275_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EQ);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t487;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NE:
+ {
+ RefAdaAST __t488 = _t;
+ RefAdaAST tmp276_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NE);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t488;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LT_:
+ {
+ RefAdaAST __t489 = _t;
+ RefAdaAST tmp277_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LT_);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t489;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LE:
+ {
+ RefAdaAST __t490 = _t;
+ RefAdaAST tmp278_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LE);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t490;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GT:
+ {
+ RefAdaAST __t491 = _t;
+ RefAdaAST tmp279_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GT);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t491;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GE:
+ {
+ RefAdaAST __t492 = _t;
+ RefAdaAST tmp280_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GE);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t492;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ simple_expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::range_or_mark(RefAdaAST _t) {
+ RefAdaAST range_or_mark_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ {
+ subtype_mark(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::signed_term(RefAdaAST _t) {
+ RefAdaAST signed_term_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case UNARY_PLUS:
+ {
+ RefAdaAST __t499 = _t;
+ RefAdaAST tmp281_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),UNARY_PLUS);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ _t = __t499;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case UNARY_MINUS:
+ {
+ RefAdaAST __t500 = _t;
+ RefAdaAST tmp282_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),UNARY_MINUS);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ _t = __t500;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ {
+ term(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::term(RefAdaAST _t) {
+ RefAdaAST term_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case STAR:
+ {
+ RefAdaAST __t502 = _t;
+ RefAdaAST tmp283_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STAR);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ factor(_t);
+ _t = _retTree;
+ _t = __t502;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DIV:
+ {
+ RefAdaAST __t503 = _t;
+ RefAdaAST tmp284_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DIV);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ factor(_t);
+ _t = _retTree;
+ _t = __t503;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MOD:
+ {
+ RefAdaAST __t504 = _t;
+ RefAdaAST tmp285_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MOD);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ factor(_t);
+ _t = _retTree;
+ _t = __t504;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case REM:
+ {
+ RefAdaAST __t505 = _t;
+ RefAdaAST tmp286_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),REM);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ factor(_t);
+ _t = _retTree;
+ _t = __t505;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ {
+ factor(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::factor(RefAdaAST _t) {
+ RefAdaAST factor_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NOT:
+ {
+ RefAdaAST __t507 = _t;
+ RefAdaAST tmp287_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NOT);
+ _t = _t->getFirstChild();
+ primary(_t);
+ _t = _retTree;
+ _t = __t507;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ABS:
+ {
+ RefAdaAST __t508 = _t;
+ RefAdaAST tmp288_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ABS);
+ _t = _t->getFirstChild();
+ primary(_t);
+ _t = _retTree;
+ _t = __t508;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case EXPON:
+ {
+ RefAdaAST __t509 = _t;
+ RefAdaAST tmp289_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EXPON);
+ _t = _t->getFirstChild();
+ primary(_t);
+ _t = _retTree;
+ primary(_t);
+ _t = _retTree;
+ _t = __t509;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ {
+ primary(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::primary(RefAdaAST _t) {
+ RefAdaAST primary_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case INDEXED_COMPONENT:
+ {
+ name_or_qualified(_t);
+ _t = _retTree;
+ break;
+ }
+ case PARENTHESIZED_PRIMARY:
+ {
+ parenthesized_primary(_t);
+ _t = _retTree;
+ break;
+ }
+ case ALLOCATOR:
+ {
+ allocator(_t);
+ _t = _retTree;
+ break;
+ }
+ case NuLL:
+ {
+ RefAdaAST tmp290_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NuLL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUMERIC_LIT:
+ {
+ RefAdaAST tmp291_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUMERIC_LIT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ RefAdaAST tmp292_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHARACTER_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHAR_STRING:
+ {
+ RefAdaAST tmp293_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHAR_STRING);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ operator_call(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::name_or_qualified(RefAdaAST _t) {
+ RefAdaAST name_or_qualified_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp294_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ RefAdaAST __t513 = _t;
+ RefAdaAST tmp295_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT);
+ _t = _t->getFirstChild();
+ name_or_qualified(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ALL:
+ {
+ RefAdaAST tmp296_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ALL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ {
+ RefAdaAST tmp297_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ RefAdaAST tmp298_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHARACTER_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ RefAdaAST tmp299_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OPERATOR_SYMBOL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t513;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INDEXED_COMPONENT:
+ {
+ RefAdaAST __t515 = _t;
+ RefAdaAST tmp300_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INDEXED_COMPONENT);
+ _t = _t->getFirstChild();
+ name_or_qualified(_t);
+ _t = _retTree;
+ value_s(_t);
+ _t = _retTree;
+ _t = __t515;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TIC:
+ {
+ RefAdaAST __t516 = _t;
+ RefAdaAST tmp301_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TIC);
+ _t = _t->getFirstChild();
+ name_or_qualified(_t);
+ _t = _retTree;
+ {
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PARENTHESIZED_PRIMARY:
+ {
+ parenthesized_primary(_t);
+ _t = _retTree;
+ break;
+ }
+ case IDENTIFIER:
+ case RANGE:
+ case DIGITS:
+ case DELTA:
+ case ACCESS:
+ {
+ attribute_id(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t516;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::allocator(RefAdaAST _t) {
+ RefAdaAST allocator_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t519 = _t;
+ RefAdaAST tmp302_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ALLOCATOR);
+ _t = _t->getFirstChild();
+ name_or_qualified(_t);
+ _t = _retTree;
+ _t = __t519;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::subprogram_body(RefAdaAST _t) {
+ RefAdaAST subprogram_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROCEDURE_BODY:
+ {
+ procedure_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION_BODY:
+ {
+ function_body(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::task_body(RefAdaAST _t) {
+ RefAdaAST task_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t525 = _t;
+ RefAdaAST tmp303_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TASK_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ _t = __t525;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::protected_body(RefAdaAST _t) {
+ RefAdaAST protected_body_AST_in = (_t == RefAdaAST(ASTNULL)) ? RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefAdaAST __t527 = _t;
+ RefAdaAST tmp304_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROTECTED_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ prot_op_bodies_opt(_t);
+ _t = _retTree;
+ _t = __t527;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefAdaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaStoreWalker::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& )
+{
+}
+const char* AdaStoreWalker::tokenNames[] = {
+ "<0>",
+ "EOF",
+ "<2>",
+ "NULL_TREE_LOOKAHEAD",
+ "\"pragma\"",
+ "IDENTIFIER",
+ "SEMI",
+ "LPAREN",
+ "COMMA",
+ "RPAREN",
+ "RIGHT_SHAFT",
+ "\"with\"",
+ "DOT",
+ "\"use\"",
+ "\"type\"",
+ "TIC",
+ "\"range\"",
+ "\"digits\"",
+ "\"delta\"",
+ "\"access\"",
+ "\"private\"",
+ "\"package\"",
+ "\"body\"",
+ "\"is\"",
+ "\"procedure\"",
+ "\"function\"",
+ "\"new\"",
+ "\"others\"",
+ "PIPE",
+ "DOT_DOT",
+ "\"all\"",
+ "COLON",
+ "\"in\"",
+ "\"out\"",
+ "\"renames\"",
+ "CHARACTER_LITERAL",
+ "CHAR_STRING",
+ "\"null\"",
+ "\"record\"",
+ "\"separate\"",
+ "\"abstract\"",
+ "\"return\"",
+ "\"task\"",
+ "\"protected\"",
+ "BOX",
+ "ASSIGN",
+ "\"entry\"",
+ "\"for\"",
+ "\"end\"",
+ "\"at\"",
+ "\"mod\"",
+ "\"subtype\"",
+ "\"exception\"",
+ "\"constant\"",
+ "\"array\"",
+ "\"of\"",
+ "\"aliased\"",
+ "\"case\"",
+ "\"when\"",
+ "\"tagged\"",
+ "\"limited\"",
+ "\"generic\"",
+ "\"begin\"",
+ "LT_LT",
+ "GT_GT",
+ "\"if\"",
+ "\"then\"",
+ "\"elsif\"",
+ "\"else\"",
+ "\"loop\"",
+ "\"while\"",
+ "\"reverse\"",
+ "\"declare\"",
+ "\"exit\"",
+ "\"goto\"",
+ "\"accept\"",
+ "\"do\"",
+ "\"delay\"",
+ "\"until\"",
+ "\"select\"",
+ "\"abort\"",
+ "\"or\"",
+ "\"terminate\"",
+ "\"raise\"",
+ "\"requeue\"",
+ "\"and\"",
+ "\"xor\"",
+ "\"not\"",
+ "EQ",
+ "NE",
+ "LT_",
+ "LE",
+ "GT",
+ "GE",
+ "PLUS",
+ "MINUS",
+ "CONCAT",
+ "STAR",
+ "DIV",
+ "\"rem\"",
+ "\"abs\"",
+ "EXPON",
+ "NUMERIC_LIT",
+ "ABORTABLE_PART",
+ "ABORT_STATEMENT",
+ "ACCEPT_ALTERNATIVE",
+ "ACCEPT_STATEMENT",
+ "ALLOCATOR",
+ "ASSIGNMENT_STATEMENT",
+ "ASYNCHRONOUS_SELECT",
+ "ATTRIBUTE_DEFINITION_CLAUSE",
+ "AT_CLAUSE",
+ "BLOCK_STATEMENT",
+ "CASE_STATEMENT",
+ "CASE_STATEMENT_ALTERNATIVE",
+ "CODE_STATEMENT",
+ "COMPONENT_DECLARATION",
+ "CONDITIONAL_ENTRY_CALL",
+ "CONTEXT_CLAUSE",
+ "DECLARATIVE_PART",
+ "DEFINING_IDENTIFIER_LIST",
+ "DELAY_ALTERNATIVE",
+ "DELAY_STATEMENT",
+ "DELTA_CONSTRAINT",
+ "DIGITS_CONSTRAINT",
+ "DISCRIMINANT_ASSOCIATION",
+ "DISCRIMINANT_CONSTRAINT",
+ "DISCRIMINANT_SPECIFICATION",
+ "ENTRY_BODY",
+ "ENTRY_CALL_ALTERNATIVE",
+ "ENTRY_CALL_STATEMENT",
+ "ENTRY_DECLARATION",
+ "ENTRY_INDEX_SPECIFICATION",
+ "ENUMERATION_REPESENTATION_CLAUSE",
+ "EXCEPTION_DECLARATION",
+ "EXCEPTION_HANDLER",
+ "EXCEPTION_RENAMING_DECLARATION",
+ "EXIT_STATEMENT",
+ "FORMAL_PACKAGE_DECLARATION",
+ "GENERIC_FORMAL_PART",
+ "GENERIC_PACKAGE_DECLARATION",
+ "GOTO_STATEMENT",
+ "HANDLED_SEQUENCE_OF_STATEMENTS",
+ "HANDLED_STMTS_OPT",
+ "IF_STATEMENT",
+ "INCOMPLETE_TYPE_DECLARATION",
+ "INDEXED_COMPONENT",
+ "INDEX_CONSTRAINT",
+ "LIBRARY_ITEM",
+ "LOOP_STATEMENT",
+ "NAME",
+ "NULL_STATEMENT",
+ "NUMBER_DECLARATION",
+ "OBJECT_DECLARATION",
+ "OBJECT_RENAMING_DECLARATION",
+ "OPERATOR_SYMBOL",
+ "PACKAGE_BODY",
+ "PACKAGE_BODY_STUB",
+ "PACKAGE_RENAMING_DECLARATION",
+ "PACKAGE_SPECIFICATION",
+ "PARAMETER_SPECIFICATION",
+ "PRIVATE_EXTENSION_DECLARATION",
+ "PRIVATE_TYPE_DECLARATION",
+ "PROTECTED_BODY",
+ "PROTECTED_BODY_STUB",
+ "PROTECTED_TYPE_DECLARATION",
+ "RAISE_STATEMENT",
+ "RANGE_ATTRIBUTE_REFERENCE",
+ "RECORD_REPRESENTATION_CLAUSE",
+ "REQUEUE_STATEMENT",
+ "RETURN_STATEMENT",
+ "SELECTIVE_ACCEPT",
+ "SEQUENCE_OF_STATEMENTS",
+ "SINGLE_PROTECTED_DECLARATION",
+ "SINGLE_TASK_DECLARATION",
+ "STATEMENT",
+ "SUBTYPE_DECLARATION",
+ "SUBTYPE_INDICATION",
+ "SUBTYPE_MARK",
+ "SUBUNIT",
+ "TASK_BODY",
+ "TASK_BODY_STUB",
+ "TASK_TYPE_DECLARATION",
+ "TERMINATE_ALTERNATIVE",
+ "TIMED_ENTRY_CALL",
+ "TRIGGERING_ALTERNATIVE",
+ "USE_CLAUSE",
+ "USE_TYPE_CLAUSE",
+ "VARIANT",
+ "VARIANT_PART",
+ "WITH_CLAUSE",
+ "ABSTRACT_FUNCTION_DECLARATION",
+ "ABSTRACT_PROCEDURE_DECLARATION",
+ "ACCESS_TO_FUNCTION_DECLARATION",
+ "ACCESS_TO_OBJECT_DECLARATION",
+ "ACCESS_TO_PROCEDURE_DECLARATION",
+ "ARRAY_OBJECT_DECLARATION",
+ "ARRAY_TYPE_DECLARATION",
+ "AND_THEN",
+ "BASIC_DECLARATIVE_ITEMS_OPT",
+ "BLOCK_BODY",
+ "BLOCK_BODY_OPT",
+ "CALL_STATEMENT",
+ "COMPONENT_CLAUSES_OPT",
+ "COMPONENT_ITEMS",
+ "COND_CLAUSE",
+ "DECIMAL_FIXED_POINT_DECLARATION",
+ "DECLARE_OPT",
+ "DERIVED_RECORD_EXTENSION",
+ "DISCRETE_SUBTYPE_DEF_OPT",
+ "DISCRIMINANT_SPECIFICATIONS",
+ "DISCRIM_PART_OPT",
+ "ELSE_OPT",
+ "ELSIFS_OPT",
+ "END_ID_OPT",
+ "ENTRY_INDEX_OPT",
+ "ENUMERATION_TYPE_DECLARATION",
+ "EXCEPT_HANDLER_PART_OPT",
+ "EXTENSION_OPT",
+ "FLOATING_POINT_DECLARATION",
+ "FORMAL_DECIMAL_FIXED_POINT_DECLARATION",
+ "FORMAL_DISCRETE_TYPE_DECLARATION",
+ "FORMAL_FLOATING_POINT_DECLARATION",
+ "FORMAL_FUNCTION_DECLARATION",
+ "FORMAL_MODULAR_TYPE_DECLARATION",
+ "FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION",
+ "FORMAL_ORDINARY_FIXED_POINT_DECLARATION",
+ "FORMAL_PART_OPT",
+ "FORMAL_PRIVATE_EXTENSION_DECLARATION",
+ "FORMAL_PRIVATE_TYPE_DECLARATION",
+ "FORMAL_PROCEDURE_DECLARATION",
+ "FORMAL_SIGNED_INTEGER_TYPE_DECLARATION",
+ "FUNCTION_BODY",
+ "FUNCTION_BODY_STUB",
+ "FUNCTION_DECLARATION",
+ "FUNCTION_RENAMING_DECLARATION",
+ "GENERIC_FUNCTION_DECLARATION",
+ "GENERIC_FUNCTION_INSTANTIATION",
+ "GENERIC_FUNCTION_RENAMING",
+ "GENERIC_PACKAGE_INSTANTIATION",
+ "GENERIC_PACKAGE_RENAMING",
+ "GENERIC_PROCEDURE_DECLARATION",
+ "GENERIC_PROCEDURE_INSTANTIATION",
+ "GENERIC_PROCEDURE_RENAMING",
+ "GUARD_OPT",
+ "IDENTIFIER_COLON_OPT",
+ "ID_OPT",
+ "INIT_OPT",
+ "ITERATION_SCHEME_OPT",
+ "LABEL_OPT",
+ "MARK_WITH_CONSTRAINT",
+ "MODIFIERS",
+ "MODULAR_TYPE_DECLARATION",
+ "MOD_CLAUSE_OPT",
+ "NOT_IN",
+ "ORDINARY_DERIVED_TYPE_DECLARATION",
+ "ORDINARY_FIXED_POINT_DECLARATION",
+ "OR_ELSE",
+ "OR_SELECT_OPT",
+ "PARENTHESIZED_PRIMARY",
+ "PRIVATE_DECLARATIVE_ITEMS_OPT",
+ "PRIVATE_TASK_ITEMS_OPT",
+ "PROCEDURE_BODY",
+ "PROCEDURE_BODY_STUB",
+ "PROCEDURE_DECLARATION",
+ "PROCEDURE_RENAMING_DECLARATION",
+ "PROT_MEMBER_DECLARATIONS",
+ "PROT_OP_BODIES_OPT",
+ "PROT_OP_DECLARATIONS",
+ "PROT_PRIVATE_OPT",
+ "RANGED_EXPRS",
+ "RANGE_CONSTRAINT",
+ "RECORD_TYPE_DECLARATION",
+ "SELECTOR_NAMES_OPT",
+ "SIGNED_INTEGER_TYPE_DECLARATION",
+ "TASK_ITEMS_OPT",
+ "UNARY_MINUS",
+ "UNARY_PLUS",
+ "VALUE",
+ "VALUES",
+ "VARIANTS",
+ "COMMENT_INTRO",
+ "OX",
+ "TIC_OR_CHARACTER_LITERAL",
+ "DIGIT",
+ "EXPONENT",
+ "EXTENDED_DIGIT",
+ "BASED_INTEGER",
+ "WS_",
+ "COMMENT",
+ "CHARACTER_STRING",
+ 0
+};
+
+const unsigned long AdaStoreWalker::_tokenSet_0_data_[] = { 37920UL, 262201UL, 4293001216UL, 2175UL, 134479872UL, 0UL, 64UL, 1073741824UL, 3145738UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER RIGHT_SHAFT DOT TIC "in" CHARACTER_LITERAL CHAR_STRING "null"
+// "mod" "or" "and" "xor" "not" EQ NE LT_ LE GT GE PLUS MINUS CONCAT STAR
+// DIV "rem" "abs" EXPON NUMERIC_LIT ALLOCATOR INDEXED_COMPONENT OPERATOR_SYMBOL
+// AND_THEN NOT_IN OR_ELSE PARENTHESIZED_PRIMARY UNARY_MINUS UNARY_PLUS
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaStoreWalker::_tokenSet_0(_tokenSet_0_data_,20);
+const unsigned long AdaStoreWalker::_tokenSet_1_data_[] = { 0UL, 0UL, 0UL, 49152UL, 3338801504UL, 2353094950UL, 151076927UL, 2416967168UL, 328577UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// ATTRIBUTE_DEFINITION_CLAUSE AT_CLAUSE ENUMERATION_REPESENTATION_CLAUSE
+// EXCEPTION_DECLARATION EXCEPTION_RENAMING_DECLARATION GENERIC_PACKAGE_DECLARATION
+// INCOMPLETE_TYPE_DECLARATION NUMBER_DECLARATION OBJECT_DECLARATION OBJECT_RENAMING_DECLARATION
+// PACKAGE_RENAMING_DECLARATION PACKAGE_SPECIFICATION PRIVATE_EXTENSION_DECLARATION
+// PRIVATE_TYPE_DECLARATION PROTECTED_TYPE_DECLARATION RECORD_REPRESENTATION_CLAUSE
+// SINGLE_PROTECTED_DECLARATION SINGLE_TASK_DECLARATION SUBTYPE_DECLARATION
+// TASK_TYPE_DECLARATION USE_CLAUSE USE_TYPE_CLAUSE ABSTRACT_FUNCTION_DECLARATION
+// ABSTRACT_PROCEDURE_DECLARATION ACCESS_TO_FUNCTION_DECLARATION ACCESS_TO_OBJECT_DECLARATION
+// ACCESS_TO_PROCEDURE_DECLARATION ARRAY_OBJECT_DECLARATION ARRAY_TYPE_DECLARATION
+// DECIMAL_FIXED_POINT_DECLARATION DERIVED_RECORD_EXTENSION ENUMERATION_TYPE_DECLARATION
+// FLOATING_POINT_DECLARATION FUNCTION_BODY_STUB FUNCTION_DECLARATION FUNCTION_RENAMING_DECLARATION
+// GENERIC_FUNCTION_DECLARATION GENERIC_FUNCTION_INSTANTIATION GENERIC_FUNCTION_RENAMING
+// GENERIC_PACKAGE_INSTANTIATION GENERIC_PACKAGE_RENAMING GENERIC_PROCEDURE_DECLARATION
+// GENERIC_PROCEDURE_INSTANTIATION GENERIC_PROCEDURE_RENAMING MODULAR_TYPE_DECLARATION
+// ORDINARY_DERIVED_TYPE_DECLARATION ORDINARY_FIXED_POINT_DECLARATION PROCEDURE_BODY_STUB
+// PROCEDURE_DECLARATION PROCEDURE_RENAMING_DECLARATION RECORD_TYPE_DECLARATION
+// SIGNED_INTEGER_TYPE_DECLARATION
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaStoreWalker::_tokenSet_1(_tokenSet_1_data_,20);
+const unsigned long AdaStoreWalker::_tokenSet_2_data_[] = { 939627552UL, 262201UL, 4293001216UL, 2175UL, 134479872UL, 0UL, 64UL, 1073741824UL, 3145738UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER RIGHT_SHAFT DOT TIC "range" "others" PIPE DOT_DOT "in" CHARACTER_LITERAL
+// CHAR_STRING "null" "mod" "or" "and" "xor" "not" EQ NE LT_ LE GT GE PLUS
+// MINUS CONCAT STAR DIV "rem" "abs" EXPON NUMERIC_LIT ALLOCATOR INDEXED_COMPONENT
+// OPERATOR_SYMBOL AND_THEN NOT_IN OR_ELSE PARENTHESIZED_PRIMARY UNARY_MINUS
+// UNARY_PLUS
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaStoreWalker::_tokenSet_2(_tokenSet_2_data_,20);
+const unsigned long AdaStoreWalker::_tokenSet_3_data_[] = { 16UL, 0UL, 0UL, 49152UL, 40UL, 256UL, 0UL, 1024UL, 256UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "pragma" ATTRIBUTE_DEFINITION_CLAUSE AT_CLAUSE ENTRY_DECLARATION ENUMERATION_REPESENTATION_CLAUSE
+// RECORD_REPRESENTATION_CLAUSE FUNCTION_DECLARATION PROCEDURE_DECLARATION
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaStoreWalker::_tokenSet_3(_tokenSet_3_data_,20);
+const unsigned long AdaStoreWalker::_tokenSet_4_data_[] = { 36896UL, 0UL, 0UL, 0UL, 262144UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER DOT TIC INDEXED_COMPONENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaStoreWalker::_tokenSet_4(_tokenSet_4_data_,12);
+
+
diff --git a/languages/ada/AdaStoreWalker.hpp b/languages/ada/AdaStoreWalker.hpp
new file mode 100644
index 00000000..6f108ff6
--- /dev/null
+++ b/languages/ada/AdaStoreWalker.hpp
@@ -0,0 +1,350 @@
+#ifndef INC_AdaStoreWalker_hpp_
+#define INC_AdaStoreWalker_hpp_
+
+#line 1 "expandedada.store.g"
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qfileinfo.h>
+
+#include <codemodel.h>
+#include "AdaAST.hpp"
+#include "ada_utils.hpp"
+
+#line 15 "AdaStoreWalker.hpp"
+#include <antlr/config.hpp>
+#include "AdaStoreWalkerTokenTypes.hpp"
+/* $ANTLR 2.7.7 (20070609): "expandedada.store.g" -> "AdaStoreWalker.hpp"$ */
+#include <antlr/TreeParser.hpp>
+
+#line 10 "expandedada.store.g"
+
+#include <codemodel.h>
+#include <kdebug.h>
+
+#line 26 "AdaStoreWalker.hpp"
+class CUSTOM_API AdaStoreWalker : public ANTLR_USE_NAMESPACE(antlr)TreeParser, public AdaStoreWalkerTokenTypes
+{
+#line 25 "expandedada.store.g"
+
+private:
+ QString m_fileName;
+ QValueList<NamespaceDom> m_scopeStack;
+ CodeModel* m_model;
+ QValueList<QStringList> m_imports;
+ NamespaceDom m_currentContainer;
+ int m_currentAccess;
+ bool m_addToStore; /* auxiliary variable: for the moment, this is `true'
+ only when we are in specs, not bodies. */
+ bool m_isSubprogram; // auxiliary to def_id()
+ FileDom m_file;
+
+public:
+ void setCodeModel (CodeModel* model) { m_model = model; }
+ CodeModel* codeModel () { return m_model; }
+ const CodeModel* codeModel () const { return m_model; }
+
+ QString fileName () const { return m_fileName; }
+ void setFileName (const QString& fileName) { m_fileName = fileName; }
+
+ void init () {
+ m_scopeStack.clear ();
+ m_imports.clear ();
+ m_currentContainer = m_model->globalNamespace ();
+ m_scopeStack.append (m_currentContainer);
+ m_currentAccess = CodeModelItem::Public;
+ m_addToStore = false;
+ m_isSubprogram = false;
+ if (m_model->hasFile(m_fileName))
+ m_model->removeFile (m_model->fileByName(m_fileName));
+ m_file = m_model->create<FileModel>();
+ m_file->setName(m_fileName);
+ m_model->addFile(m_file);
+ }
+
+ void wipeout () { m_model->wipeout (); }
+// void out () { m_store->out (); }
+ void removeWithReferences (const QString& fileName) {
+ m_model->removeFile (m_model->fileByName(fileName));
+ }
+ NamespaceDom insertScopeContainer
+ (NamespaceDom scope, const QStringList & scopes ) {
+ QStringList::ConstIterator it = scopes.begin();
+ QString prefix( *it );
+ NamespaceDom ns = scope->namespaceByName( prefix );
+// kdDebug() << "insertScopeContainer begin with prefix " << prefix << endl;
+ if (!ns.data()) {
+// kdDebug() << "insertScopeContainer: ns is empty" << endl;
+ ns = m_model->create<NamespaceModel>();
+// kdDebug() << "insertScopeContainer: ns created" << endl;
+ ns->setName( prefix );
+// kdDebug() << "insertScopeContainer: ns name set" << endl;
+ scope->addNamespace( ns );
+// kdDebug() << "insertScopeContainer: ns added to a scope" << endl;
+
+ if (scope == m_model->globalNamespace())
+ m_file->addNamespace( ns );
+ }
+// kdDebug() << "insertScopeContainer: while" << endl;
+ while ( ++it != scopes.end() ) {
+ QString nameSegment( *it );
+ prefix += "." + nameSegment;
+// kdDebug() << "insertScopeContainer: while prefix = " << prefix << endl;
+ NamespaceDom inner = scope->namespaceByName( prefix );
+ if (!inner.data() ) {
+// kdDebug() << "insertScopeContainer: inner is empty " << endl;
+ inner = m_model->create<NamespaceModel>();
+// kdDebug() << "insertScopeContainer: inner created " << endl;
+ inner->setName( nameSegment );
+ ns->addNamespace( inner );
+// kdDebug() << "insertScopeContainer: inner added " << endl;
+ }
+ ns = inner;
+ }
+ return ns;
+ }
+ NamespaceDom defineScope( RefAdaAST namenode ) {
+ QStringList scopes( qnamelist( namenode ) );
+// kdDebug() << "defineScope: " << scopes.join(" ") << endl;
+ NamespaceDom psc = insertScopeContainer( m_currentContainer, scopes );
+// kdDebug() << "defineScope psc created" << endl;
+ psc->setStartPosition(namenode->getLine(), namenode->getColumn());
+// kdDebug() << "defineScope start position set" << endl;
+ psc->setFileName(m_fileName);
+// kdDebug() << "defineScope file name set" << endl;
+ // psc->setEndPosition (endLine, 0);
+// kdDebug() << "defineScope return" << endl;
+ return psc;
+ }
+#line 30 "AdaStoreWalker.hpp"
+public:
+ AdaStoreWalker();
+ static void initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory );
+ int getNumTokens() const
+ {
+ return AdaStoreWalker::NUM_TOKENS;
+ }
+ const char* getTokenName( int type ) const
+ {
+ if( type > getNumTokens() ) return 0;
+ return AdaStoreWalker::tokenNames[type];
+ }
+ const char* const* getTokenNames() const
+ {
+ return AdaStoreWalker::tokenNames;
+ }
+ public: void compilation_unit(RefAdaAST _t);
+ public: void context_items_opt(RefAdaAST _t);
+ public: void library_item(RefAdaAST _t);
+ public: void subunit(RefAdaAST _t);
+ public: void pragma(RefAdaAST _t);
+ public: void with_clause(RefAdaAST _t);
+ public: void compound_name(RefAdaAST _t);
+ public: void use_clause(RefAdaAST _t);
+ public: void subtype_mark(RefAdaAST _t);
+ public: void lib_subprog_decl_or_rename_or_inst_or_body(RefAdaAST _t);
+ public: void def_id(RefAdaAST _t);
+ public: void pkg_body_part(RefAdaAST _t);
+ public: void generic_inst(RefAdaAST _t);
+ public: void pkg_spec_part(RefAdaAST _t);
+ public: void renames(RefAdaAST _t);
+ public: void generic_decl(RefAdaAST _t);
+ public: void subprog_def_id(RefAdaAST _t);
+ public: void subprog_decl(RefAdaAST _t);
+ public: void formal_part_opt(RefAdaAST _t);
+ public: void def_designator(RefAdaAST _t);
+ public: void function_tail(RefAdaAST _t);
+ public: void definable_operator_symbol(RefAdaAST _t);
+ public: void spec_decl_part(RefAdaAST _t);
+ public: void basic_declarative_items_opt(RefAdaAST _t);
+ public: void private_declarative_items_opt(RefAdaAST _t);
+ public: void end_id_opt(RefAdaAST _t);
+ public: void basic_decl_item(RefAdaAST _t);
+ public: void generic_formal_part_opt(RefAdaAST _t);
+ public: void procedure_body(RefAdaAST _t);
+ public: void function_body(RefAdaAST _t);
+ public: void subprog_decl_or_rename_or_inst_or_body(RefAdaAST _t);
+ public: void subprog_decl_or_body(RefAdaAST _t);
+ public: void package_body(RefAdaAST _t);
+ public: void pragma_arg(RefAdaAST _t);
+ public: void expression(RefAdaAST _t);
+ public: void attribute_id(RefAdaAST _t);
+ public: void modifiers(RefAdaAST _t);
+ public: void id_opt(RefAdaAST _t);
+ public: void value_s(RefAdaAST _t);
+ public: void value(RefAdaAST _t);
+ public: void ranged_expr_s(RefAdaAST _t);
+ public: void ranged_expr(RefAdaAST _t);
+ public: void simple_expression(RefAdaAST _t);
+ public: void range(RefAdaAST _t);
+ public: void range_constraint(RefAdaAST _t);
+ public: void range_dots(RefAdaAST _t);
+ public: void range_attrib_ref(RefAdaAST _t);
+ public: void prefix(RefAdaAST _t);
+ public: void parameter_specification(RefAdaAST _t);
+ public: void defining_identifier_list(RefAdaAST _t);
+ public: void init_opt(RefAdaAST _t);
+ public: void name(RefAdaAST _t);
+ public: void parenthesized_primary(RefAdaAST _t);
+ public: void extension_opt(RefAdaAST _t);
+ public: void task_type_or_single_decl(RefAdaAST _t);
+ public: void prot_type_or_single_decl(RefAdaAST _t);
+ public: void decl_common(RefAdaAST _t);
+ public: void discrim_part_opt(RefAdaAST _t);
+ public: void task_definition_opt(RefAdaAST _t);
+ public: void task_items_opt(RefAdaAST _t);
+ public: void private_task_items_opt(RefAdaAST _t);
+ public: void discriminant_specifications(RefAdaAST _t);
+ public: void discriminant_specification(RefAdaAST _t);
+ public: void entrydecls_repspecs_opt(RefAdaAST _t);
+ public: void entry_declaration(RefAdaAST _t);
+ public: void rep_spec(RefAdaAST _t);
+ public: void discrete_subtype_def_opt(RefAdaAST _t);
+ public: void discrete_subtype_definition(RefAdaAST _t);
+ public: void subtype_ind(RefAdaAST _t);
+ public: void align_opt(RefAdaAST _t);
+ public: void comp_loc_s(RefAdaAST _t);
+ public: void local_enum_name(RefAdaAST _t);
+ public: void enumeration_aggregate(RefAdaAST _t);
+ public: void protected_definition(RefAdaAST _t);
+ public: void prot_private_opt(RefAdaAST _t);
+ public: void prot_member_decl_s(RefAdaAST _t);
+ public: void prot_op_decl_s(RefAdaAST _t);
+ public: void prot_op_decl(RefAdaAST _t);
+ public: void comp_decl(RefAdaAST _t);
+ public: void component_subtype_def(RefAdaAST _t);
+ public: void enum_id_s(RefAdaAST _t);
+ public: void range_constraint_opt(RefAdaAST _t);
+ public: void array_type_declaration(RefAdaAST _t);
+ public: void access_type_declaration(RefAdaAST _t);
+ public: void id_and_discrim(RefAdaAST _t);
+ public: void record_definition(RefAdaAST _t);
+ public: void array_type_definition(RefAdaAST _t);
+ public: void enumeration_literal_specification(RefAdaAST _t);
+ public: void index_or_discrete_range_s(RefAdaAST _t);
+ public: void index_or_discrete_range(RefAdaAST _t);
+ public: void constraint_opt(RefAdaAST _t);
+ public: void digits_constraint(RefAdaAST _t);
+ public: void delta_constraint(RefAdaAST _t);
+ public: void index_constraint(RefAdaAST _t);
+ public: void discriminant_constraint(RefAdaAST _t);
+ public: void discrete_range(RefAdaAST _t);
+ public: void discriminant_association(RefAdaAST _t);
+ public: void selector_names_opt(RefAdaAST _t);
+ public: void selector_name(RefAdaAST _t);
+ public: void component_list(RefAdaAST _t);
+ public: void component_items(RefAdaAST _t);
+ public: void variant_part(RefAdaAST _t);
+ public: void discriminant_direct_name(RefAdaAST _t);
+ public: void variant_s(RefAdaAST _t);
+ public: void variant(RefAdaAST _t);
+ public: void choice_s(RefAdaAST _t);
+ public: void choice(RefAdaAST _t);
+ public: void discrete_with_range(RefAdaAST _t);
+ public: void mark_with_constraint(RefAdaAST _t);
+ public: void generic_formal_parameter(RefAdaAST _t);
+ public: void formal_array_type_declaration(RefAdaAST _t);
+ public: void formal_access_type_declaration(RefAdaAST _t);
+ public: void id_part(RefAdaAST _t);
+ public: void subprogram_default_opt(RefAdaAST _t);
+ public: void formal_package_actual_part_opt(RefAdaAST _t);
+ public: void body_part(RefAdaAST _t);
+ public: void declarative_part(RefAdaAST _t);
+ public: void block_body(RefAdaAST _t);
+ public: void declarative_item(RefAdaAST _t);
+ public: void prot_op_bodies_opt(RefAdaAST _t);
+ public: void block_body_opt(RefAdaAST _t);
+ public: void handled_stmt_s(RefAdaAST _t);
+ public: void entry_body(RefAdaAST _t);
+ public: void statements(RefAdaAST _t);
+ public: void except_handler_part_opt(RefAdaAST _t);
+ public: void handled_stmts_opt(RefAdaAST _t);
+ public: void statement(RefAdaAST _t);
+ public: void def_label_opt(RefAdaAST _t);
+ public: void null_stmt(RefAdaAST _t);
+ public: void exit_stmt(RefAdaAST _t);
+ public: void return_stmt(RefAdaAST _t);
+ public: void goto_stmt(RefAdaAST _t);
+ public: void delay_stmt(RefAdaAST _t);
+ public: void abort_stmt(RefAdaAST _t);
+ public: void raise_stmt(RefAdaAST _t);
+ public: void requeue_stmt(RefAdaAST _t);
+ public: void accept_stmt(RefAdaAST _t);
+ public: void select_stmt(RefAdaAST _t);
+ public: void if_stmt(RefAdaAST _t);
+ public: void case_stmt(RefAdaAST _t);
+ public: void loop_stmt(RefAdaAST _t);
+ public: void block(RefAdaAST _t);
+ public: void call_or_assignment(RefAdaAST _t);
+ public: void cond_clause(RefAdaAST _t);
+ public: void elsifs_opt(RefAdaAST _t);
+ public: void else_opt(RefAdaAST _t);
+ public: void condition(RefAdaAST _t);
+ public: void alternative_s(RefAdaAST _t);
+ public: void case_statement_alternative(RefAdaAST _t);
+ public: void iteration_scheme_opt(RefAdaAST _t);
+ public: void declare_opt(RefAdaAST _t);
+ public: void label_name(RefAdaAST _t);
+ public: void entry_body_formal_part(RefAdaAST _t);
+ public: void entry_barrier(RefAdaAST _t);
+ public: void entry_index_spec_opt(RefAdaAST _t);
+ public: void entry_call_stmt(RefAdaAST _t);
+ public: void entry_index_opt(RefAdaAST _t);
+ public: void triggering_alternative(RefAdaAST _t);
+ public: void abortable_part(RefAdaAST _t);
+ public: void selective_accept(RefAdaAST _t);
+ public: void entry_call_alternative(RefAdaAST _t);
+ public: void delay_alternative(RefAdaAST _t);
+ public: void stmts_opt(RefAdaAST _t);
+ public: void guard_opt(RefAdaAST _t);
+ public: void select_alternative(RefAdaAST _t);
+ public: void or_select_opt(RefAdaAST _t);
+ public: void accept_alternative(RefAdaAST _t);
+ public: void exception_handler(RefAdaAST _t);
+ public: void identifier_colon_opt(RefAdaAST _t);
+ public: void except_choice_s(RefAdaAST _t);
+ public: void exception_choice(RefAdaAST _t);
+ public: void operator_call(RefAdaAST _t);
+ public: void relation(RefAdaAST _t);
+ public: void range_or_mark(RefAdaAST _t);
+ public: void signed_term(RefAdaAST _t);
+ public: void term(RefAdaAST _t);
+ public: void factor(RefAdaAST _t);
+ public: void primary(RefAdaAST _t);
+ public: void name_or_qualified(RefAdaAST _t);
+ public: void allocator(RefAdaAST _t);
+ public: void subprogram_body(RefAdaAST _t);
+ public: void task_body(RefAdaAST _t);
+ public: void protected_body(RefAdaAST _t);
+public:
+ ANTLR_USE_NAMESPACE(antlr)RefAST getAST()
+ {
+ return ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST);
+ }
+
+protected:
+ RefAdaAST returnAST;
+ RefAdaAST _retTree;
+private:
+ static const char* tokenNames[];
+#ifndef NO_STATIC_CONSTS
+ static const int NUM_TOKENS = 291;
+#else
+ enum {
+ NUM_TOKENS = 291
+ };
+#endif
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+ static const unsigned long _tokenSet_2_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2;
+ static const unsigned long _tokenSet_3_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3;
+ static const unsigned long _tokenSet_4_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_4;
+};
+
+#endif /*INC_AdaStoreWalker_hpp_*/
diff --git a/languages/ada/AdaStoreWalkerTokenTypes.hpp b/languages/ada/AdaStoreWalkerTokenTypes.hpp
new file mode 100644
index 00000000..daaa4b21
--- /dev/null
+++ b/languages/ada/AdaStoreWalkerTokenTypes.hpp
@@ -0,0 +1,307 @@
+#ifndef INC_AdaStoreWalkerTokenTypes_hpp_
+#define INC_AdaStoreWalkerTokenTypes_hpp_
+
+/* $ANTLR 2.7.7 (20070609): "expandedada.store.g" -> "AdaStoreWalkerTokenTypes.hpp"$ */
+
+#ifndef CUSTOM_API
+# define CUSTOM_API
+#endif
+
+#ifdef __cplusplus
+struct CUSTOM_API AdaStoreWalkerTokenTypes {
+#endif
+ enum {
+ EOF_ = 1,
+ PRAGMA = 4,
+ IDENTIFIER = 5,
+ SEMI = 6,
+ LPAREN = 7,
+ COMMA = 8,
+ RPAREN = 9,
+ RIGHT_SHAFT = 10,
+ WITH = 11,
+ DOT = 12,
+ USE = 13,
+ TYPE = 14,
+ TIC = 15,
+ RANGE = 16,
+ DIGITS = 17,
+ DELTA = 18,
+ ACCESS = 19,
+ PRIVATE = 20,
+ PACKAGE = 21,
+ BODY = 22,
+ IS = 23,
+ PROCEDURE = 24,
+ FUNCTION = 25,
+ NEW = 26,
+ OTHERS = 27,
+ PIPE = 28,
+ DOT_DOT = 29,
+ ALL = 30,
+ COLON = 31,
+ IN = 32,
+ OUT = 33,
+ RENAMES = 34,
+ CHARACTER_LITERAL = 35,
+ CHAR_STRING = 36,
+ NuLL = 37,
+ RECORD = 38,
+ SEPARATE = 39,
+ ABSTRACT = 40,
+ RETURN = 41,
+ TASK = 42,
+ PROTECTED = 43,
+ BOX = 44,
+ ASSIGN = 45,
+ ENTRY = 46,
+ FOR = 47,
+ END = 48,
+ AT = 49,
+ MOD = 50,
+ SUBTYPE = 51,
+ EXCEPTION = 52,
+ CONSTANT = 53,
+ ARRAY = 54,
+ OF = 55,
+ ALIASED = 56,
+ CASE = 57,
+ WHEN = 58,
+ TAGGED = 59,
+ LIMITED = 60,
+ GENERIC = 61,
+ BEGIN = 62,
+ LT_LT = 63,
+ GT_GT = 64,
+ IF = 65,
+ THEN = 66,
+ ELSIF = 67,
+ ELSE = 68,
+ LOOP = 69,
+ WHILE = 70,
+ REVERSE = 71,
+ DECLARE = 72,
+ EXIT = 73,
+ GOTO = 74,
+ ACCEPT = 75,
+ DO = 76,
+ DELAY = 77,
+ UNTIL = 78,
+ SELECT = 79,
+ ABORT = 80,
+ OR = 81,
+ TERMINATE = 82,
+ RAISE = 83,
+ REQUEUE = 84,
+ AND = 85,
+ XOR = 86,
+ NOT = 87,
+ EQ = 88,
+ NE = 89,
+ LT_ = 90,
+ LE = 91,
+ GT = 92,
+ GE = 93,
+ PLUS = 94,
+ MINUS = 95,
+ CONCAT = 96,
+ STAR = 97,
+ DIV = 98,
+ REM = 99,
+ ABS = 100,
+ EXPON = 101,
+ NUMERIC_LIT = 102,
+ ABORTABLE_PART = 103,
+ ABORT_STATEMENT = 104,
+ ACCEPT_ALTERNATIVE = 105,
+ ACCEPT_STATEMENT = 106,
+ ALLOCATOR = 107,
+ ASSIGNMENT_STATEMENT = 108,
+ ASYNCHRONOUS_SELECT = 109,
+ ATTRIBUTE_DEFINITION_CLAUSE = 110,
+ AT_CLAUSE = 111,
+ BLOCK_STATEMENT = 112,
+ CASE_STATEMENT = 113,
+ CASE_STATEMENT_ALTERNATIVE = 114,
+ CODE_STATEMENT = 115,
+ COMPONENT_DECLARATION = 116,
+ CONDITIONAL_ENTRY_CALL = 117,
+ CONTEXT_CLAUSE = 118,
+ DECLARATIVE_PART = 119,
+ DEFINING_IDENTIFIER_LIST = 120,
+ DELAY_ALTERNATIVE = 121,
+ DELAY_STATEMENT = 122,
+ DELTA_CONSTRAINT = 123,
+ DIGITS_CONSTRAINT = 124,
+ DISCRIMINANT_ASSOCIATION = 125,
+ DISCRIMINANT_CONSTRAINT = 126,
+ DISCRIMINANT_SPECIFICATION = 127,
+ ENTRY_BODY = 128,
+ ENTRY_CALL_ALTERNATIVE = 129,
+ ENTRY_CALL_STATEMENT = 130,
+ ENTRY_DECLARATION = 131,
+ ENTRY_INDEX_SPECIFICATION = 132,
+ ENUMERATION_REPESENTATION_CLAUSE = 133,
+ EXCEPTION_DECLARATION = 134,
+ EXCEPTION_HANDLER = 135,
+ EXCEPTION_RENAMING_DECLARATION = 136,
+ EXIT_STATEMENT = 137,
+ FORMAL_PACKAGE_DECLARATION = 138,
+ GENERIC_FORMAL_PART = 139,
+ GENERIC_PACKAGE_DECLARATION = 140,
+ GOTO_STATEMENT = 141,
+ HANDLED_SEQUENCE_OF_STATEMENTS = 142,
+ HANDLED_STMTS_OPT = 143,
+ IF_STATEMENT = 144,
+ INCOMPLETE_TYPE_DECLARATION = 145,
+ INDEXED_COMPONENT = 146,
+ INDEX_CONSTRAINT = 147,
+ LIBRARY_ITEM = 148,
+ LOOP_STATEMENT = 149,
+ NAME = 150,
+ NULL_STATEMENT = 151,
+ NUMBER_DECLARATION = 152,
+ OBJECT_DECLARATION = 153,
+ OBJECT_RENAMING_DECLARATION = 154,
+ OPERATOR_SYMBOL = 155,
+ PACKAGE_BODY = 156,
+ PACKAGE_BODY_STUB = 157,
+ PACKAGE_RENAMING_DECLARATION = 158,
+ PACKAGE_SPECIFICATION = 159,
+ PARAMETER_SPECIFICATION = 160,
+ PRIVATE_EXTENSION_DECLARATION = 161,
+ PRIVATE_TYPE_DECLARATION = 162,
+ PROTECTED_BODY = 163,
+ PROTECTED_BODY_STUB = 164,
+ PROTECTED_TYPE_DECLARATION = 165,
+ RAISE_STATEMENT = 166,
+ RANGE_ATTRIBUTE_REFERENCE = 167,
+ RECORD_REPRESENTATION_CLAUSE = 168,
+ REQUEUE_STATEMENT = 169,
+ RETURN_STATEMENT = 170,
+ SELECTIVE_ACCEPT = 171,
+ SEQUENCE_OF_STATEMENTS = 172,
+ SINGLE_PROTECTED_DECLARATION = 173,
+ SINGLE_TASK_DECLARATION = 174,
+ STATEMENT = 175,
+ SUBTYPE_DECLARATION = 176,
+ SUBTYPE_INDICATION = 177,
+ SUBTYPE_MARK = 178,
+ SUBUNIT = 179,
+ TASK_BODY = 180,
+ TASK_BODY_STUB = 181,
+ TASK_TYPE_DECLARATION = 182,
+ TERMINATE_ALTERNATIVE = 183,
+ TIMED_ENTRY_CALL = 184,
+ TRIGGERING_ALTERNATIVE = 185,
+ USE_CLAUSE = 186,
+ USE_TYPE_CLAUSE = 187,
+ VARIANT = 188,
+ VARIANT_PART = 189,
+ WITH_CLAUSE = 190,
+ ABSTRACT_FUNCTION_DECLARATION = 191,
+ ABSTRACT_PROCEDURE_DECLARATION = 192,
+ ACCESS_TO_FUNCTION_DECLARATION = 193,
+ ACCESS_TO_OBJECT_DECLARATION = 194,
+ ACCESS_TO_PROCEDURE_DECLARATION = 195,
+ ARRAY_OBJECT_DECLARATION = 196,
+ ARRAY_TYPE_DECLARATION = 197,
+ AND_THEN = 198,
+ BASIC_DECLARATIVE_ITEMS_OPT = 199,
+ BLOCK_BODY = 200,
+ BLOCK_BODY_OPT = 201,
+ CALL_STATEMENT = 202,
+ COMPONENT_CLAUSES_OPT = 203,
+ COMPONENT_ITEMS = 204,
+ COND_CLAUSE = 205,
+ DECIMAL_FIXED_POINT_DECLARATION = 206,
+ DECLARE_OPT = 207,
+ DERIVED_RECORD_EXTENSION = 208,
+ DISCRETE_SUBTYPE_DEF_OPT = 209,
+ DISCRIMINANT_SPECIFICATIONS = 210,
+ DISCRIM_PART_OPT = 211,
+ ELSE_OPT = 212,
+ ELSIFS_OPT = 213,
+ END_ID_OPT = 214,
+ ENTRY_INDEX_OPT = 215,
+ ENUMERATION_TYPE_DECLARATION = 216,
+ EXCEPT_HANDLER_PART_OPT = 217,
+ EXTENSION_OPT = 218,
+ FLOATING_POINT_DECLARATION = 219,
+ FORMAL_DECIMAL_FIXED_POINT_DECLARATION = 220,
+ FORMAL_DISCRETE_TYPE_DECLARATION = 221,
+ FORMAL_FLOATING_POINT_DECLARATION = 222,
+ FORMAL_FUNCTION_DECLARATION = 223,
+ FORMAL_MODULAR_TYPE_DECLARATION = 224,
+ FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION = 225,
+ FORMAL_ORDINARY_FIXED_POINT_DECLARATION = 226,
+ FORMAL_PART_OPT = 227,
+ FORMAL_PRIVATE_EXTENSION_DECLARATION = 228,
+ FORMAL_PRIVATE_TYPE_DECLARATION = 229,
+ FORMAL_PROCEDURE_DECLARATION = 230,
+ FORMAL_SIGNED_INTEGER_TYPE_DECLARATION = 231,
+ FUNCTION_BODY = 232,
+ FUNCTION_BODY_STUB = 233,
+ FUNCTION_DECLARATION = 234,
+ FUNCTION_RENAMING_DECLARATION = 235,
+ GENERIC_FUNCTION_DECLARATION = 236,
+ GENERIC_FUNCTION_INSTANTIATION = 237,
+ GENERIC_FUNCTION_RENAMING = 238,
+ GENERIC_PACKAGE_INSTANTIATION = 239,
+ GENERIC_PACKAGE_RENAMING = 240,
+ GENERIC_PROCEDURE_DECLARATION = 241,
+ GENERIC_PROCEDURE_INSTANTIATION = 242,
+ GENERIC_PROCEDURE_RENAMING = 243,
+ GUARD_OPT = 244,
+ IDENTIFIER_COLON_OPT = 245,
+ ID_OPT = 246,
+ INIT_OPT = 247,
+ ITERATION_SCHEME_OPT = 248,
+ LABEL_OPT = 249,
+ MARK_WITH_CONSTRAINT = 250,
+ MODIFIERS = 251,
+ MODULAR_TYPE_DECLARATION = 252,
+ MOD_CLAUSE_OPT = 253,
+ NOT_IN = 254,
+ ORDINARY_DERIVED_TYPE_DECLARATION = 255,
+ ORDINARY_FIXED_POINT_DECLARATION = 256,
+ OR_ELSE = 257,
+ OR_SELECT_OPT = 258,
+ PARENTHESIZED_PRIMARY = 259,
+ PRIVATE_DECLARATIVE_ITEMS_OPT = 260,
+ PRIVATE_TASK_ITEMS_OPT = 261,
+ PROCEDURE_BODY = 262,
+ PROCEDURE_BODY_STUB = 263,
+ PROCEDURE_DECLARATION = 264,
+ PROCEDURE_RENAMING_DECLARATION = 265,
+ PROT_MEMBER_DECLARATIONS = 266,
+ PROT_OP_BODIES_OPT = 267,
+ PROT_OP_DECLARATIONS = 268,
+ PROT_PRIVATE_OPT = 269,
+ RANGED_EXPRS = 270,
+ RANGE_CONSTRAINT = 271,
+ RECORD_TYPE_DECLARATION = 272,
+ SELECTOR_NAMES_OPT = 273,
+ SIGNED_INTEGER_TYPE_DECLARATION = 274,
+ TASK_ITEMS_OPT = 275,
+ UNARY_MINUS = 276,
+ UNARY_PLUS = 277,
+ VALUE = 278,
+ VALUES = 279,
+ VARIANTS = 280,
+ COMMENT_INTRO = 281,
+ OX = 282,
+ TIC_OR_CHARACTER_LITERAL = 283,
+ DIGIT = 284,
+ EXPONENT = 285,
+ EXTENDED_DIGIT = 286,
+ BASED_INTEGER = 287,
+ WS_ = 288,
+ COMMENT = 289,
+ CHARACTER_STRING = 290,
+ NULL_TREE_LOOKAHEAD = 3
+ };
+#ifdef __cplusplus
+};
+#endif
+#endif /*INC_AdaStoreWalkerTokenTypes_hpp_*/
diff --git a/languages/ada/AdaStoreWalkerTokenTypes.txt b/languages/ada/AdaStoreWalkerTokenTypes.txt
new file mode 100644
index 00000000..e9ba489c
--- /dev/null
+++ b/languages/ada/AdaStoreWalkerTokenTypes.txt
@@ -0,0 +1,289 @@
+// $ANTLR 2.7.7 (20070609): expandedada.store.g -> AdaStoreWalkerTokenTypes.txt$
+AdaStoreWalker // output token vocab name
+PRAGMA="pragma"=4
+IDENTIFIER=5
+SEMI=6
+LPAREN=7
+COMMA=8
+RPAREN=9
+RIGHT_SHAFT=10
+WITH="with"=11
+DOT=12
+USE="use"=13
+TYPE="type"=14
+TIC=15
+RANGE="range"=16
+DIGITS="digits"=17
+DELTA="delta"=18
+ACCESS="access"=19
+PRIVATE="private"=20
+PACKAGE="package"=21
+BODY="body"=22
+IS="is"=23
+PROCEDURE="procedure"=24
+FUNCTION="function"=25
+NEW="new"=26
+OTHERS="others"=27
+PIPE=28
+DOT_DOT=29
+ALL="all"=30
+COLON=31
+IN="in"=32
+OUT="out"=33
+RENAMES="renames"=34
+CHARACTER_LITERAL=35
+CHAR_STRING=36
+NuLL="null"=37
+RECORD="record"=38
+SEPARATE="separate"=39
+ABSTRACT="abstract"=40
+RETURN="return"=41
+TASK="task"=42
+PROTECTED="protected"=43
+BOX=44
+ASSIGN=45
+ENTRY="entry"=46
+FOR="for"=47
+END="end"=48
+AT="at"=49
+MOD="mod"=50
+SUBTYPE="subtype"=51
+EXCEPTION="exception"=52
+CONSTANT="constant"=53
+ARRAY="array"=54
+OF="of"=55
+ALIASED="aliased"=56
+CASE="case"=57
+WHEN="when"=58
+TAGGED="tagged"=59
+LIMITED="limited"=60
+GENERIC="generic"=61
+BEGIN="begin"=62
+LT_LT=63
+GT_GT=64
+IF="if"=65
+THEN="then"=66
+ELSIF="elsif"=67
+ELSE="else"=68
+LOOP="loop"=69
+WHILE="while"=70
+REVERSE="reverse"=71
+DECLARE="declare"=72
+EXIT="exit"=73
+GOTO="goto"=74
+ACCEPT="accept"=75
+DO="do"=76
+DELAY="delay"=77
+UNTIL="until"=78
+SELECT="select"=79
+ABORT="abort"=80
+OR="or"=81
+TERMINATE="terminate"=82
+RAISE="raise"=83
+REQUEUE="requeue"=84
+AND="and"=85
+XOR="xor"=86
+NOT="not"=87
+EQ=88
+NE=89
+LT_=90
+LE=91
+GT=92
+GE=93
+PLUS=94
+MINUS=95
+CONCAT=96
+STAR=97
+DIV=98
+REM="rem"=99
+ABS="abs"=100
+EXPON=101
+NUMERIC_LIT=102
+ABORTABLE_PART=103
+ABORT_STATEMENT=104
+ACCEPT_ALTERNATIVE=105
+ACCEPT_STATEMENT=106
+ALLOCATOR=107
+ASSIGNMENT_STATEMENT=108
+ASYNCHRONOUS_SELECT=109
+ATTRIBUTE_DEFINITION_CLAUSE=110
+AT_CLAUSE=111
+BLOCK_STATEMENT=112
+CASE_STATEMENT=113
+CASE_STATEMENT_ALTERNATIVE=114
+CODE_STATEMENT=115
+COMPONENT_DECLARATION=116
+CONDITIONAL_ENTRY_CALL=117
+CONTEXT_CLAUSE=118
+DECLARATIVE_PART=119
+DEFINING_IDENTIFIER_LIST=120
+DELAY_ALTERNATIVE=121
+DELAY_STATEMENT=122
+DELTA_CONSTRAINT=123
+DIGITS_CONSTRAINT=124
+DISCRIMINANT_ASSOCIATION=125
+DISCRIMINANT_CONSTRAINT=126
+DISCRIMINANT_SPECIFICATION=127
+ENTRY_BODY=128
+ENTRY_CALL_ALTERNATIVE=129
+ENTRY_CALL_STATEMENT=130
+ENTRY_DECLARATION=131
+ENTRY_INDEX_SPECIFICATION=132
+ENUMERATION_REPESENTATION_CLAUSE=133
+EXCEPTION_DECLARATION=134
+EXCEPTION_HANDLER=135
+EXCEPTION_RENAMING_DECLARATION=136
+EXIT_STATEMENT=137
+FORMAL_PACKAGE_DECLARATION=138
+GENERIC_FORMAL_PART=139
+GENERIC_PACKAGE_DECLARATION=140
+GOTO_STATEMENT=141
+HANDLED_SEQUENCE_OF_STATEMENTS=142
+HANDLED_STMTS_OPT=143
+IF_STATEMENT=144
+INCOMPLETE_TYPE_DECLARATION=145
+INDEXED_COMPONENT=146
+INDEX_CONSTRAINT=147
+LIBRARY_ITEM=148
+LOOP_STATEMENT=149
+NAME=150
+NULL_STATEMENT=151
+NUMBER_DECLARATION=152
+OBJECT_DECLARATION=153
+OBJECT_RENAMING_DECLARATION=154
+OPERATOR_SYMBOL=155
+PACKAGE_BODY=156
+PACKAGE_BODY_STUB=157
+PACKAGE_RENAMING_DECLARATION=158
+PACKAGE_SPECIFICATION=159
+PARAMETER_SPECIFICATION=160
+PRIVATE_EXTENSION_DECLARATION=161
+PRIVATE_TYPE_DECLARATION=162
+PROTECTED_BODY=163
+PROTECTED_BODY_STUB=164
+PROTECTED_TYPE_DECLARATION=165
+RAISE_STATEMENT=166
+RANGE_ATTRIBUTE_REFERENCE=167
+RECORD_REPRESENTATION_CLAUSE=168
+REQUEUE_STATEMENT=169
+RETURN_STATEMENT=170
+SELECTIVE_ACCEPT=171
+SEQUENCE_OF_STATEMENTS=172
+SINGLE_PROTECTED_DECLARATION=173
+SINGLE_TASK_DECLARATION=174
+STATEMENT=175
+SUBTYPE_DECLARATION=176
+SUBTYPE_INDICATION=177
+SUBTYPE_MARK=178
+SUBUNIT=179
+TASK_BODY=180
+TASK_BODY_STUB=181
+TASK_TYPE_DECLARATION=182
+TERMINATE_ALTERNATIVE=183
+TIMED_ENTRY_CALL=184
+TRIGGERING_ALTERNATIVE=185
+USE_CLAUSE=186
+USE_TYPE_CLAUSE=187
+VARIANT=188
+VARIANT_PART=189
+WITH_CLAUSE=190
+ABSTRACT_FUNCTION_DECLARATION=191
+ABSTRACT_PROCEDURE_DECLARATION=192
+ACCESS_TO_FUNCTION_DECLARATION=193
+ACCESS_TO_OBJECT_DECLARATION=194
+ACCESS_TO_PROCEDURE_DECLARATION=195
+ARRAY_OBJECT_DECLARATION=196
+ARRAY_TYPE_DECLARATION=197
+AND_THEN=198
+BASIC_DECLARATIVE_ITEMS_OPT=199
+BLOCK_BODY=200
+BLOCK_BODY_OPT=201
+CALL_STATEMENT=202
+COMPONENT_CLAUSES_OPT=203
+COMPONENT_ITEMS=204
+COND_CLAUSE=205
+DECIMAL_FIXED_POINT_DECLARATION=206
+DECLARE_OPT=207
+DERIVED_RECORD_EXTENSION=208
+DISCRETE_SUBTYPE_DEF_OPT=209
+DISCRIMINANT_SPECIFICATIONS=210
+DISCRIM_PART_OPT=211
+ELSE_OPT=212
+ELSIFS_OPT=213
+END_ID_OPT=214
+ENTRY_INDEX_OPT=215
+ENUMERATION_TYPE_DECLARATION=216
+EXCEPT_HANDLER_PART_OPT=217
+EXTENSION_OPT=218
+FLOATING_POINT_DECLARATION=219
+FORMAL_DECIMAL_FIXED_POINT_DECLARATION=220
+FORMAL_DISCRETE_TYPE_DECLARATION=221
+FORMAL_FLOATING_POINT_DECLARATION=222
+FORMAL_FUNCTION_DECLARATION=223
+FORMAL_MODULAR_TYPE_DECLARATION=224
+FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION=225
+FORMAL_ORDINARY_FIXED_POINT_DECLARATION=226
+FORMAL_PART_OPT=227
+FORMAL_PRIVATE_EXTENSION_DECLARATION=228
+FORMAL_PRIVATE_TYPE_DECLARATION=229
+FORMAL_PROCEDURE_DECLARATION=230
+FORMAL_SIGNED_INTEGER_TYPE_DECLARATION=231
+FUNCTION_BODY=232
+FUNCTION_BODY_STUB=233
+FUNCTION_DECLARATION=234
+FUNCTION_RENAMING_DECLARATION=235
+GENERIC_FUNCTION_DECLARATION=236
+GENERIC_FUNCTION_INSTANTIATION=237
+GENERIC_FUNCTION_RENAMING=238
+GENERIC_PACKAGE_INSTANTIATION=239
+GENERIC_PACKAGE_RENAMING=240
+GENERIC_PROCEDURE_DECLARATION=241
+GENERIC_PROCEDURE_INSTANTIATION=242
+GENERIC_PROCEDURE_RENAMING=243
+GUARD_OPT=244
+IDENTIFIER_COLON_OPT=245
+ID_OPT=246
+INIT_OPT=247
+ITERATION_SCHEME_OPT=248
+LABEL_OPT=249
+MARK_WITH_CONSTRAINT=250
+MODIFIERS=251
+MODULAR_TYPE_DECLARATION=252
+MOD_CLAUSE_OPT=253
+NOT_IN=254
+ORDINARY_DERIVED_TYPE_DECLARATION=255
+ORDINARY_FIXED_POINT_DECLARATION=256
+OR_ELSE=257
+OR_SELECT_OPT=258
+PARENTHESIZED_PRIMARY=259
+PRIVATE_DECLARATIVE_ITEMS_OPT=260
+PRIVATE_TASK_ITEMS_OPT=261
+PROCEDURE_BODY=262
+PROCEDURE_BODY_STUB=263
+PROCEDURE_DECLARATION=264
+PROCEDURE_RENAMING_DECLARATION=265
+PROT_MEMBER_DECLARATIONS=266
+PROT_OP_BODIES_OPT=267
+PROT_OP_DECLARATIONS=268
+PROT_PRIVATE_OPT=269
+RANGED_EXPRS=270
+RANGE_CONSTRAINT=271
+RECORD_TYPE_DECLARATION=272
+SELECTOR_NAMES_OPT=273
+SIGNED_INTEGER_TYPE_DECLARATION=274
+TASK_ITEMS_OPT=275
+UNARY_MINUS=276
+UNARY_PLUS=277
+VALUE=278
+VALUES=279
+VARIANTS=280
+COMMENT_INTRO=281
+OX=282
+TIC_OR_CHARACTER_LITERAL=283
+DIGIT=284
+EXPONENT=285
+EXTENDED_DIGIT=286
+BASED_INTEGER=287
+WS_=288
+COMMENT=289
+CHARACTER_STRING=290
diff --git a/languages/ada/AdaTokenTypes.hpp b/languages/ada/AdaTokenTypes.hpp
new file mode 100644
index 00000000..918b1cfd
--- /dev/null
+++ b/languages/ada/AdaTokenTypes.hpp
@@ -0,0 +1,306 @@
+#ifndef INC_AdaTokenTypes_hpp_
+#define INC_AdaTokenTypes_hpp_
+
+/* $ANTLR 2.7.7 (20070609): "ada.g" -> "AdaTokenTypes.hpp"$ */
+
+#ifndef CUSTOM_API
+# define CUSTOM_API
+#endif
+
+#ifdef __cplusplus
+struct CUSTOM_API AdaTokenTypes {
+#endif
+ enum {
+ EOF_ = 1,
+ PRAGMA = 4,
+ IDENTIFIER = 5,
+ SEMI = 6,
+ LPAREN = 7,
+ COMMA = 8,
+ RPAREN = 9,
+ RIGHT_SHAFT = 10,
+ WITH = 11,
+ DOT = 12,
+ USE = 13,
+ TYPE = 14,
+ TIC = 15,
+ RANGE = 16,
+ DIGITS = 17,
+ DELTA = 18,
+ ACCESS = 19,
+ PRIVATE = 20,
+ PACKAGE = 21,
+ BODY = 22,
+ IS = 23,
+ PROCEDURE = 24,
+ FUNCTION = 25,
+ NEW = 26,
+ OTHERS = 27,
+ PIPE = 28,
+ DOT_DOT = 29,
+ ALL = 30,
+ COLON = 31,
+ IN = 32,
+ OUT = 33,
+ RENAMES = 34,
+ CHARACTER_LITERAL = 35,
+ CHAR_STRING = 36,
+ NuLL = 37,
+ RECORD = 38,
+ SEPARATE = 39,
+ ABSTRACT = 40,
+ RETURN = 41,
+ TASK = 42,
+ PROTECTED = 43,
+ BOX = 44,
+ ASSIGN = 45,
+ ENTRY = 46,
+ FOR = 47,
+ END = 48,
+ AT = 49,
+ MOD = 50,
+ SUBTYPE = 51,
+ EXCEPTION = 52,
+ CONSTANT = 53,
+ ARRAY = 54,
+ OF = 55,
+ ALIASED = 56,
+ CASE = 57,
+ WHEN = 58,
+ TAGGED = 59,
+ LIMITED = 60,
+ GENERIC = 61,
+ BEGIN = 62,
+ LT_LT = 63,
+ GT_GT = 64,
+ IF = 65,
+ THEN = 66,
+ ELSIF = 67,
+ ELSE = 68,
+ LOOP = 69,
+ WHILE = 70,
+ REVERSE = 71,
+ DECLARE = 72,
+ EXIT = 73,
+ GOTO = 74,
+ ACCEPT = 75,
+ DO = 76,
+ DELAY = 77,
+ UNTIL = 78,
+ SELECT = 79,
+ ABORT = 80,
+ OR = 81,
+ TERMINATE = 82,
+ RAISE = 83,
+ REQUEUE = 84,
+ AND = 85,
+ XOR = 86,
+ NOT = 87,
+ EQ = 88,
+ NE = 89,
+ LT_ = 90,
+ LE = 91,
+ GT = 92,
+ GE = 93,
+ PLUS = 94,
+ MINUS = 95,
+ CONCAT = 96,
+ STAR = 97,
+ DIV = 98,
+ REM = 99,
+ ABS = 100,
+ EXPON = 101,
+ NUMERIC_LIT = 102,
+ ABORTABLE_PART = 103,
+ ABORT_STATEMENT = 104,
+ ACCEPT_ALTERNATIVE = 105,
+ ACCEPT_STATEMENT = 106,
+ ALLOCATOR = 107,
+ ASSIGNMENT_STATEMENT = 108,
+ ASYNCHRONOUS_SELECT = 109,
+ ATTRIBUTE_DEFINITION_CLAUSE = 110,
+ AT_CLAUSE = 111,
+ BLOCK_STATEMENT = 112,
+ CASE_STATEMENT = 113,
+ CASE_STATEMENT_ALTERNATIVE = 114,
+ CODE_STATEMENT = 115,
+ COMPONENT_DECLARATION = 116,
+ CONDITIONAL_ENTRY_CALL = 117,
+ CONTEXT_CLAUSE = 118,
+ DECLARATIVE_PART = 119,
+ DEFINING_IDENTIFIER_LIST = 120,
+ DELAY_ALTERNATIVE = 121,
+ DELAY_STATEMENT = 122,
+ DELTA_CONSTRAINT = 123,
+ DIGITS_CONSTRAINT = 124,
+ DISCRIMINANT_ASSOCIATION = 125,
+ DISCRIMINANT_CONSTRAINT = 126,
+ DISCRIMINANT_SPECIFICATION = 127,
+ ENTRY_BODY = 128,
+ ENTRY_CALL_ALTERNATIVE = 129,
+ ENTRY_CALL_STATEMENT = 130,
+ ENTRY_DECLARATION = 131,
+ ENTRY_INDEX_SPECIFICATION = 132,
+ ENUMERATION_REPESENTATION_CLAUSE = 133,
+ EXCEPTION_DECLARATION = 134,
+ EXCEPTION_HANDLER = 135,
+ EXCEPTION_RENAMING_DECLARATION = 136,
+ EXIT_STATEMENT = 137,
+ FORMAL_PACKAGE_DECLARATION = 138,
+ GENERIC_FORMAL_PART = 139,
+ GENERIC_PACKAGE_DECLARATION = 140,
+ GOTO_STATEMENT = 141,
+ HANDLED_SEQUENCE_OF_STATEMENTS = 142,
+ HANDLED_STMTS_OPT = 143,
+ IF_STATEMENT = 144,
+ INCOMPLETE_TYPE_DECLARATION = 145,
+ INDEXED_COMPONENT = 146,
+ INDEX_CONSTRAINT = 147,
+ LIBRARY_ITEM = 148,
+ LOOP_STATEMENT = 149,
+ NAME = 150,
+ NULL_STATEMENT = 151,
+ NUMBER_DECLARATION = 152,
+ OBJECT_DECLARATION = 153,
+ OBJECT_RENAMING_DECLARATION = 154,
+ OPERATOR_SYMBOL = 155,
+ PACKAGE_BODY = 156,
+ PACKAGE_BODY_STUB = 157,
+ PACKAGE_RENAMING_DECLARATION = 158,
+ PACKAGE_SPECIFICATION = 159,
+ PARAMETER_SPECIFICATION = 160,
+ PRIVATE_EXTENSION_DECLARATION = 161,
+ PRIVATE_TYPE_DECLARATION = 162,
+ PROTECTED_BODY = 163,
+ PROTECTED_BODY_STUB = 164,
+ PROTECTED_TYPE_DECLARATION = 165,
+ RAISE_STATEMENT = 166,
+ RANGE_ATTRIBUTE_REFERENCE = 167,
+ RECORD_REPRESENTATION_CLAUSE = 168,
+ REQUEUE_STATEMENT = 169,
+ RETURN_STATEMENT = 170,
+ SELECTIVE_ACCEPT = 171,
+ SEQUENCE_OF_STATEMENTS = 172,
+ SINGLE_PROTECTED_DECLARATION = 173,
+ SINGLE_TASK_DECLARATION = 174,
+ STATEMENT = 175,
+ SUBTYPE_DECLARATION = 176,
+ SUBTYPE_INDICATION = 177,
+ SUBTYPE_MARK = 178,
+ SUBUNIT = 179,
+ TASK_BODY = 180,
+ TASK_BODY_STUB = 181,
+ TASK_TYPE_DECLARATION = 182,
+ TERMINATE_ALTERNATIVE = 183,
+ TIMED_ENTRY_CALL = 184,
+ TRIGGERING_ALTERNATIVE = 185,
+ USE_CLAUSE = 186,
+ USE_TYPE_CLAUSE = 187,
+ VARIANT = 188,
+ VARIANT_PART = 189,
+ WITH_CLAUSE = 190,
+ ABSTRACT_FUNCTION_DECLARATION = 191,
+ ABSTRACT_PROCEDURE_DECLARATION = 192,
+ ACCESS_TO_FUNCTION_DECLARATION = 193,
+ ACCESS_TO_OBJECT_DECLARATION = 194,
+ ACCESS_TO_PROCEDURE_DECLARATION = 195,
+ ARRAY_OBJECT_DECLARATION = 196,
+ ARRAY_TYPE_DECLARATION = 197,
+ AND_THEN = 198,
+ BASIC_DECLARATIVE_ITEMS_OPT = 199,
+ BLOCK_BODY = 200,
+ BLOCK_BODY_OPT = 201,
+ CALL_STATEMENT = 202,
+ COMPONENT_CLAUSES_OPT = 203,
+ COMPONENT_ITEMS = 204,
+ COND_CLAUSE = 205,
+ DECIMAL_FIXED_POINT_DECLARATION = 206,
+ DECLARE_OPT = 207,
+ DERIVED_RECORD_EXTENSION = 208,
+ DISCRETE_SUBTYPE_DEF_OPT = 209,
+ DISCRIMINANT_SPECIFICATIONS = 210,
+ DISCRIM_PART_OPT = 211,
+ ELSE_OPT = 212,
+ ELSIFS_OPT = 213,
+ END_ID_OPT = 214,
+ ENTRY_INDEX_OPT = 215,
+ ENUMERATION_TYPE_DECLARATION = 216,
+ EXCEPT_HANDLER_PART_OPT = 217,
+ EXTENSION_OPT = 218,
+ FLOATING_POINT_DECLARATION = 219,
+ FORMAL_DECIMAL_FIXED_POINT_DECLARATION = 220,
+ FORMAL_DISCRETE_TYPE_DECLARATION = 221,
+ FORMAL_FLOATING_POINT_DECLARATION = 222,
+ FORMAL_FUNCTION_DECLARATION = 223,
+ FORMAL_MODULAR_TYPE_DECLARATION = 224,
+ FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION = 225,
+ FORMAL_ORDINARY_FIXED_POINT_DECLARATION = 226,
+ FORMAL_PART_OPT = 227,
+ FORMAL_PRIVATE_EXTENSION_DECLARATION = 228,
+ FORMAL_PRIVATE_TYPE_DECLARATION = 229,
+ FORMAL_PROCEDURE_DECLARATION = 230,
+ FORMAL_SIGNED_INTEGER_TYPE_DECLARATION = 231,
+ FUNCTION_BODY = 232,
+ FUNCTION_BODY_STUB = 233,
+ FUNCTION_DECLARATION = 234,
+ FUNCTION_RENAMING_DECLARATION = 235,
+ GENERIC_FUNCTION_DECLARATION = 236,
+ GENERIC_FUNCTION_INSTANTIATION = 237,
+ GENERIC_FUNCTION_RENAMING = 238,
+ GENERIC_PACKAGE_INSTANTIATION = 239,
+ GENERIC_PACKAGE_RENAMING = 240,
+ GENERIC_PROCEDURE_DECLARATION = 241,
+ GENERIC_PROCEDURE_INSTANTIATION = 242,
+ GENERIC_PROCEDURE_RENAMING = 243,
+ GUARD_OPT = 244,
+ IDENTIFIER_COLON_OPT = 245,
+ ID_OPT = 246,
+ INIT_OPT = 247,
+ ITERATION_SCHEME_OPT = 248,
+ LABEL_OPT = 249,
+ MARK_WITH_CONSTRAINT = 250,
+ MODIFIERS = 251,
+ MODULAR_TYPE_DECLARATION = 252,
+ MOD_CLAUSE_OPT = 253,
+ NOT_IN = 254,
+ ORDINARY_DERIVED_TYPE_DECLARATION = 255,
+ ORDINARY_FIXED_POINT_DECLARATION = 256,
+ OR_ELSE = 257,
+ OR_SELECT_OPT = 258,
+ PARENTHESIZED_PRIMARY = 259,
+ PRIVATE_DECLARATIVE_ITEMS_OPT = 260,
+ PRIVATE_TASK_ITEMS_OPT = 261,
+ PROCEDURE_BODY = 262,
+ PROCEDURE_BODY_STUB = 263,
+ PROCEDURE_DECLARATION = 264,
+ PROCEDURE_RENAMING_DECLARATION = 265,
+ PROT_MEMBER_DECLARATIONS = 266,
+ PROT_OP_BODIES_OPT = 267,
+ PROT_OP_DECLARATIONS = 268,
+ PROT_PRIVATE_OPT = 269,
+ RANGED_EXPRS = 270,
+ RANGE_CONSTRAINT = 271,
+ RECORD_TYPE_DECLARATION = 272,
+ SELECTOR_NAMES_OPT = 273,
+ SIGNED_INTEGER_TYPE_DECLARATION = 274,
+ TASK_ITEMS_OPT = 275,
+ UNARY_MINUS = 276,
+ UNARY_PLUS = 277,
+ VALUE = 278,
+ VALUES = 279,
+ VARIANTS = 280,
+ COMMENT_INTRO = 281,
+ OX = 282,
+ TIC_OR_CHARACTER_LITERAL = 283,
+ DIGIT = 284,
+ EXPONENT = 285,
+ EXTENDED_DIGIT = 286,
+ BASED_INTEGER = 287,
+ WS_ = 288,
+ COMMENT = 289,
+ NULL_TREE_LOOKAHEAD = 3
+ };
+#ifdef __cplusplus
+};
+#endif
+#endif /*INC_AdaTokenTypes_hpp_*/
diff --git a/languages/ada/AdaTokenTypes.txt b/languages/ada/AdaTokenTypes.txt
new file mode 100644
index 00000000..2415ea0c
--- /dev/null
+++ b/languages/ada/AdaTokenTypes.txt
@@ -0,0 +1,288 @@
+// $ANTLR 2.7.7 (20070609): ada.g -> AdaTokenTypes.txt$
+Ada // output token vocab name
+PRAGMA="pragma"=4
+IDENTIFIER=5
+SEMI=6
+LPAREN=7
+COMMA=8
+RPAREN=9
+RIGHT_SHAFT=10
+WITH="with"=11
+DOT=12
+USE="use"=13
+TYPE="type"=14
+TIC=15
+RANGE="range"=16
+DIGITS="digits"=17
+DELTA="delta"=18
+ACCESS="access"=19
+PRIVATE="private"=20
+PACKAGE="package"=21
+BODY="body"=22
+IS="is"=23
+PROCEDURE="procedure"=24
+FUNCTION="function"=25
+NEW="new"=26
+OTHERS="others"=27
+PIPE=28
+DOT_DOT=29
+ALL="all"=30
+COLON=31
+IN="in"=32
+OUT="out"=33
+RENAMES="renames"=34
+CHARACTER_LITERAL=35
+CHAR_STRING=36
+NuLL="null"=37
+RECORD="record"=38
+SEPARATE="separate"=39
+ABSTRACT="abstract"=40
+RETURN="return"=41
+TASK="task"=42
+PROTECTED="protected"=43
+BOX=44
+ASSIGN=45
+ENTRY="entry"=46
+FOR="for"=47
+END="end"=48
+AT="at"=49
+MOD="mod"=50
+SUBTYPE="subtype"=51
+EXCEPTION="exception"=52
+CONSTANT="constant"=53
+ARRAY="array"=54
+OF="of"=55
+ALIASED="aliased"=56
+CASE="case"=57
+WHEN="when"=58
+TAGGED="tagged"=59
+LIMITED="limited"=60
+GENERIC="generic"=61
+BEGIN="begin"=62
+LT_LT=63
+GT_GT=64
+IF="if"=65
+THEN="then"=66
+ELSIF="elsif"=67
+ELSE="else"=68
+LOOP="loop"=69
+WHILE="while"=70
+REVERSE="reverse"=71
+DECLARE="declare"=72
+EXIT="exit"=73
+GOTO="goto"=74
+ACCEPT="accept"=75
+DO="do"=76
+DELAY="delay"=77
+UNTIL="until"=78
+SELECT="select"=79
+ABORT="abort"=80
+OR="or"=81
+TERMINATE="terminate"=82
+RAISE="raise"=83
+REQUEUE="requeue"=84
+AND="and"=85
+XOR="xor"=86
+NOT="not"=87
+EQ=88
+NE=89
+LT_=90
+LE=91
+GT=92
+GE=93
+PLUS=94
+MINUS=95
+CONCAT=96
+STAR=97
+DIV=98
+REM="rem"=99
+ABS="abs"=100
+EXPON=101
+NUMERIC_LIT=102
+ABORTABLE_PART=103
+ABORT_STATEMENT=104
+ACCEPT_ALTERNATIVE=105
+ACCEPT_STATEMENT=106
+ALLOCATOR=107
+ASSIGNMENT_STATEMENT=108
+ASYNCHRONOUS_SELECT=109
+ATTRIBUTE_DEFINITION_CLAUSE=110
+AT_CLAUSE=111
+BLOCK_STATEMENT=112
+CASE_STATEMENT=113
+CASE_STATEMENT_ALTERNATIVE=114
+CODE_STATEMENT=115
+COMPONENT_DECLARATION=116
+CONDITIONAL_ENTRY_CALL=117
+CONTEXT_CLAUSE=118
+DECLARATIVE_PART=119
+DEFINING_IDENTIFIER_LIST=120
+DELAY_ALTERNATIVE=121
+DELAY_STATEMENT=122
+DELTA_CONSTRAINT=123
+DIGITS_CONSTRAINT=124
+DISCRIMINANT_ASSOCIATION=125
+DISCRIMINANT_CONSTRAINT=126
+DISCRIMINANT_SPECIFICATION=127
+ENTRY_BODY=128
+ENTRY_CALL_ALTERNATIVE=129
+ENTRY_CALL_STATEMENT=130
+ENTRY_DECLARATION=131
+ENTRY_INDEX_SPECIFICATION=132
+ENUMERATION_REPESENTATION_CLAUSE=133
+EXCEPTION_DECLARATION=134
+EXCEPTION_HANDLER=135
+EXCEPTION_RENAMING_DECLARATION=136
+EXIT_STATEMENT=137
+FORMAL_PACKAGE_DECLARATION=138
+GENERIC_FORMAL_PART=139
+GENERIC_PACKAGE_DECLARATION=140
+GOTO_STATEMENT=141
+HANDLED_SEQUENCE_OF_STATEMENTS=142
+HANDLED_STMTS_OPT=143
+IF_STATEMENT=144
+INCOMPLETE_TYPE_DECLARATION=145
+INDEXED_COMPONENT=146
+INDEX_CONSTRAINT=147
+LIBRARY_ITEM=148
+LOOP_STATEMENT=149
+NAME=150
+NULL_STATEMENT=151
+NUMBER_DECLARATION=152
+OBJECT_DECLARATION=153
+OBJECT_RENAMING_DECLARATION=154
+OPERATOR_SYMBOL=155
+PACKAGE_BODY=156
+PACKAGE_BODY_STUB=157
+PACKAGE_RENAMING_DECLARATION=158
+PACKAGE_SPECIFICATION=159
+PARAMETER_SPECIFICATION=160
+PRIVATE_EXTENSION_DECLARATION=161
+PRIVATE_TYPE_DECLARATION=162
+PROTECTED_BODY=163
+PROTECTED_BODY_STUB=164
+PROTECTED_TYPE_DECLARATION=165
+RAISE_STATEMENT=166
+RANGE_ATTRIBUTE_REFERENCE=167
+RECORD_REPRESENTATION_CLAUSE=168
+REQUEUE_STATEMENT=169
+RETURN_STATEMENT=170
+SELECTIVE_ACCEPT=171
+SEQUENCE_OF_STATEMENTS=172
+SINGLE_PROTECTED_DECLARATION=173
+SINGLE_TASK_DECLARATION=174
+STATEMENT=175
+SUBTYPE_DECLARATION=176
+SUBTYPE_INDICATION=177
+SUBTYPE_MARK=178
+SUBUNIT=179
+TASK_BODY=180
+TASK_BODY_STUB=181
+TASK_TYPE_DECLARATION=182
+TERMINATE_ALTERNATIVE=183
+TIMED_ENTRY_CALL=184
+TRIGGERING_ALTERNATIVE=185
+USE_CLAUSE=186
+USE_TYPE_CLAUSE=187
+VARIANT=188
+VARIANT_PART=189
+WITH_CLAUSE=190
+ABSTRACT_FUNCTION_DECLARATION=191
+ABSTRACT_PROCEDURE_DECLARATION=192
+ACCESS_TO_FUNCTION_DECLARATION=193
+ACCESS_TO_OBJECT_DECLARATION=194
+ACCESS_TO_PROCEDURE_DECLARATION=195
+ARRAY_OBJECT_DECLARATION=196
+ARRAY_TYPE_DECLARATION=197
+AND_THEN=198
+BASIC_DECLARATIVE_ITEMS_OPT=199
+BLOCK_BODY=200
+BLOCK_BODY_OPT=201
+CALL_STATEMENT=202
+COMPONENT_CLAUSES_OPT=203
+COMPONENT_ITEMS=204
+COND_CLAUSE=205
+DECIMAL_FIXED_POINT_DECLARATION=206
+DECLARE_OPT=207
+DERIVED_RECORD_EXTENSION=208
+DISCRETE_SUBTYPE_DEF_OPT=209
+DISCRIMINANT_SPECIFICATIONS=210
+DISCRIM_PART_OPT=211
+ELSE_OPT=212
+ELSIFS_OPT=213
+END_ID_OPT=214
+ENTRY_INDEX_OPT=215
+ENUMERATION_TYPE_DECLARATION=216
+EXCEPT_HANDLER_PART_OPT=217
+EXTENSION_OPT=218
+FLOATING_POINT_DECLARATION=219
+FORMAL_DECIMAL_FIXED_POINT_DECLARATION=220
+FORMAL_DISCRETE_TYPE_DECLARATION=221
+FORMAL_FLOATING_POINT_DECLARATION=222
+FORMAL_FUNCTION_DECLARATION=223
+FORMAL_MODULAR_TYPE_DECLARATION=224
+FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION=225
+FORMAL_ORDINARY_FIXED_POINT_DECLARATION=226
+FORMAL_PART_OPT=227
+FORMAL_PRIVATE_EXTENSION_DECLARATION=228
+FORMAL_PRIVATE_TYPE_DECLARATION=229
+FORMAL_PROCEDURE_DECLARATION=230
+FORMAL_SIGNED_INTEGER_TYPE_DECLARATION=231
+FUNCTION_BODY=232
+FUNCTION_BODY_STUB=233
+FUNCTION_DECLARATION=234
+FUNCTION_RENAMING_DECLARATION=235
+GENERIC_FUNCTION_DECLARATION=236
+GENERIC_FUNCTION_INSTANTIATION=237
+GENERIC_FUNCTION_RENAMING=238
+GENERIC_PACKAGE_INSTANTIATION=239
+GENERIC_PACKAGE_RENAMING=240
+GENERIC_PROCEDURE_DECLARATION=241
+GENERIC_PROCEDURE_INSTANTIATION=242
+GENERIC_PROCEDURE_RENAMING=243
+GUARD_OPT=244
+IDENTIFIER_COLON_OPT=245
+ID_OPT=246
+INIT_OPT=247
+ITERATION_SCHEME_OPT=248
+LABEL_OPT=249
+MARK_WITH_CONSTRAINT=250
+MODIFIERS=251
+MODULAR_TYPE_DECLARATION=252
+MOD_CLAUSE_OPT=253
+NOT_IN=254
+ORDINARY_DERIVED_TYPE_DECLARATION=255
+ORDINARY_FIXED_POINT_DECLARATION=256
+OR_ELSE=257
+OR_SELECT_OPT=258
+PARENTHESIZED_PRIMARY=259
+PRIVATE_DECLARATIVE_ITEMS_OPT=260
+PRIVATE_TASK_ITEMS_OPT=261
+PROCEDURE_BODY=262
+PROCEDURE_BODY_STUB=263
+PROCEDURE_DECLARATION=264
+PROCEDURE_RENAMING_DECLARATION=265
+PROT_MEMBER_DECLARATIONS=266
+PROT_OP_BODIES_OPT=267
+PROT_OP_DECLARATIONS=268
+PROT_PRIVATE_OPT=269
+RANGED_EXPRS=270
+RANGE_CONSTRAINT=271
+RECORD_TYPE_DECLARATION=272
+SELECTOR_NAMES_OPT=273
+SIGNED_INTEGER_TYPE_DECLARATION=274
+TASK_ITEMS_OPT=275
+UNARY_MINUS=276
+UNARY_PLUS=277
+VALUE=278
+VALUES=279
+VARIANTS=280
+COMMENT_INTRO=281
+OX=282
+TIC_OR_CHARACTER_LITERAL=283
+DIGIT=284
+EXPONENT=285
+EXTENDED_DIGIT=286
+BASED_INTEGER=287
+WS_=288
+COMMENT=289
diff --git a/languages/ada/AdaTreeParserSuper.cpp b/languages/ada/AdaTreeParserSuper.cpp
new file mode 100644
index 00000000..be5f0623
--- /dev/null
+++ b/languages/ada/AdaTreeParserSuper.cpp
@@ -0,0 +1,9050 @@
+/* $ANTLR 2.7.7 (20070609): "ada.tree.g" -> "AdaTreeParserSuper.cpp"$ */
+#include "AdaTreeParserSuper.hpp"
+#include <antlr/Token.hpp>
+#include <antlr/AST.hpp>
+#include <antlr/NoViableAltException.hpp>
+#include <antlr/MismatchedTokenException.hpp>
+#include <antlr/SemanticException.hpp>
+#include <antlr/BitSet.hpp>
+#line 1 "ada.tree.g"
+#line 11 "AdaTreeParserSuper.cpp"
+AdaTreeParserSuper::AdaTreeParserSuper()
+ : ANTLR_USE_NAMESPACE(antlr)TreeParser() {
+}
+
+void AdaTreeParserSuper::compilation_unit(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST compilation_unit_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ context_items_opt(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LIBRARY_ITEM:
+ {
+ library_item(_t);
+ _t = _retTree;
+ break;
+ }
+ case SUBUNIT:
+ {
+ subunit(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == PRAGMA)) {
+ pragma(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop4;
+ }
+
+ }
+ _loop4:;
+ } // ( ... )*
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::context_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST context_items_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t12 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp1_AST_in = _t;
+ match(_t,CONTEXT_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case WITH_CLAUSE:
+ {
+ with_clause(_t);
+ _t = _retTree;
+ break;
+ }
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ {
+ use_clause(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop14;
+ }
+ }
+ }
+ _loop14:;
+ } // ( ... )*
+ _t = __t12;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::library_item(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST library_item_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t32 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp2_AST_in = _t;
+ match(_t,LIBRARY_ITEM);
+ _t = _t->getFirstChild();
+ modifiers(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case FUNCTION_BODY:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case PROCEDURE_BODY:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ subprog_decl_or_rename_or_inst_or_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case PACKAGE_BODY:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t34 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp3_AST_in = _t;
+ match(_t,PACKAGE_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ pkg_body_part(_t);
+ _t = _retTree;
+ _t = __t34;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PACKAGE_INSTANTIATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t35 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp4_AST_in = _t;
+ match(_t,GENERIC_PACKAGE_INSTANTIATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ generic_inst(_t);
+ _t = _retTree;
+ _t = __t35;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_SPECIFICATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t36 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp5_AST_in = _t;
+ match(_t,PACKAGE_SPECIFICATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ pkg_spec_part(_t);
+ _t = _retTree;
+ _t = __t36;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_RENAMING_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t37 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp6_AST_in = _t;
+ match(_t,PACKAGE_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t37;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PACKAGE_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ {
+ generic_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t32;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::subunit(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST subunit_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t514 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp7_AST_in = _t;
+ match(_t,SUBUNIT);
+ _t = _t->getFirstChild();
+ compound_name(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case FUNCTION_BODY:
+ case PROCEDURE_BODY:
+ {
+ subprogram_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case PACKAGE_BODY:
+ {
+ package_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case TASK_BODY:
+ {
+ task_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROTECTED_BODY:
+ {
+ protected_body(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t514;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::pragma(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST pragma_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t6 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp8_AST_in = _t;
+ match(_t,PRAGMA);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp9_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_tokenSet_0.member(_t->getType()))) {
+ pragma_arg(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop8;
+ }
+
+ }
+ _loop8:;
+ } // ( ... )*
+ _t = __t6;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::pragma_arg(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST pragma_arg_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RIGHT_SHAFT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t10 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp10_AST_in = _t;
+ match(_t,RIGHT_SHAFT);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp11_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ _t = __t10;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::expression(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST expression_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case AND:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t472 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp12_AST_in = _t;
+ match(_t,AND);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t472;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case AND_THEN:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t473 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp13_AST_in = _t;
+ match(_t,AND_THEN);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t473;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OR:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t474 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp14_AST_in = _t;
+ match(_t,OR);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t474;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OR_ELSE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t475 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp15_AST_in = _t;
+ match(_t,OR_ELSE);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t475;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case XOR:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t476 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp16_AST_in = _t;
+ match(_t,XOR);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ relation(_t);
+ _t = _retTree;
+ _t = __t476;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case NOT_IN:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ relation(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::with_clause(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST with_clause_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t16 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp17_AST_in = _t;
+ match(_t,WITH_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt18=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER || _t->getType() == DOT)) {
+ compound_name(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt18>=1 ) { goto _loop18; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt18++;
+ }
+ _loop18:;
+ } // ( ... )+
+ _t = __t16;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::use_clause(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST use_clause_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case USE_TYPE_CLAUSE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t22 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp18_AST_in = _t;
+ match(_t,USE_TYPE_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt24=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER || _t->getType() == DOT || _t->getType() == TIC)) {
+ subtype_mark(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt24>=1 ) { goto _loop24; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt24++;
+ }
+ _loop24:;
+ } // ( ... )+
+ _t = __t22;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case USE_CLAUSE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t25 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp19_AST_in = _t;
+ match(_t,USE_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt27=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER || _t->getType() == DOT)) {
+ compound_name(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt27>=1 ) { goto _loop27; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt27++;
+ }
+ _loop27:;
+ } // ( ... )+
+ _t = __t25;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::compound_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST compound_name_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp20_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t20 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp21_AST_in = _t;
+ match(_t,DOT);
+ _t = _t->getFirstChild();
+ compound_name(_t);
+ _t = _retTree;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp22_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ _t = __t20;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::subtype_mark(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST subtype_mark_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ compound_name(_t);
+ _t = _retTree;
+ break;
+ }
+ case TIC:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t29 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp23_AST_in = _t;
+ match(_t,TIC);
+ _t = _t->getFirstChild();
+ compound_name(_t);
+ _t = _retTree;
+ attribute_id(_t);
+ _t = _retTree;
+ _t = __t29;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::attribute_id(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST attribute_id_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RANGE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp24_AST_in = _t;
+ match(_t,RANGE);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DIGITS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp25_AST_in = _t;
+ match(_t,DIGITS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DELTA:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp26_AST_in = _t;
+ match(_t,DELTA);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ACCESS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp27_AST_in = _t;
+ match(_t,ACCESS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp28_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::modifiers(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST modifiers_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t39 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp29_AST_in = _t;
+ match(_t,MODIFIERS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ABSTRACT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp30_AST_in = _t;
+ match(_t,ABSTRACT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ACCESS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp31_AST_in = _t;
+ match(_t,ACCESS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ALIASED:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp32_AST_in = _t;
+ match(_t,ALIASED);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ALL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp33_AST_in = _t;
+ match(_t,ALL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CONSTANT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp34_AST_in = _t;
+ match(_t,CONSTANT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IN:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp35_AST_in = _t;
+ match(_t,IN);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LIMITED:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp36_AST_in = _t;
+ match(_t,LIMITED);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OUT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp37_AST_in = _t;
+ match(_t,OUT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PRIVATE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp38_AST_in = _t;
+ match(_t,PRIVATE);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROTECTED:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp39_AST_in = _t;
+ match(_t,PROTECTED);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case REVERSE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp40_AST_in = _t;
+ match(_t,REVERSE);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TAGGED:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp41_AST_in = _t;
+ match(_t,TAGGED);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ goto _loop41;
+ }
+ }
+ }
+ _loop41:;
+ } // ( ... )*
+ _t = __t39;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::subprog_decl_or_rename_or_inst_or_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST subprog_decl_or_rename_or_inst_or_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ subprog_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROCEDURE_BODY:
+ {
+ procedure_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION_BODY:
+ {
+ function_body(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::def_id(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST def_id_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ compound_name(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::pkg_body_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST pkg_body_part_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ declarative_part(_t);
+ _t = _retTree;
+ block_body_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::generic_inst(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST generic_inst_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ compound_name(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case VALUES:
+ {
+ value_s(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::pkg_spec_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST pkg_spec_part_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ basic_declarative_items_opt(_t);
+ _t = _retTree;
+ private_declarative_items_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::renames(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST renames_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case CHARACTER_STRING:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp42_AST_in = _t;
+ match(_t,CHARACTER_STRING);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp43_AST_in = _t;
+ match(_t,OPERATOR_SYMBOL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case INDEXED_COMPONENT:
+ {
+ name(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::generic_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST generic_decl_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case GENERIC_PACKAGE_RENAMING:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t277 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp44_AST_in = _t;
+ match(_t,GENERIC_PACKAGE_RENAMING);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ def_id(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t277;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PACKAGE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t278 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp45_AST_in = _t;
+ match(_t,GENERIC_PACKAGE_DECLARATION);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ def_id(_t);
+ _t = _retTree;
+ pkg_spec_part(_t);
+ _t = _retTree;
+ _t = __t278;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PROCEDURE_RENAMING:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t279 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp46_AST_in = _t;
+ match(_t,GENERIC_PROCEDURE_RENAMING);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t279;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PROCEDURE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t280 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp47_AST_in = _t;
+ match(_t,GENERIC_PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t280;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_FUNCTION_RENAMING:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t281 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp48_AST_in = _t;
+ match(_t,GENERIC_FUNCTION_RENAMING);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t281;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_FUNCTION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t282 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp49_AST_in = _t;
+ match(_t,GENERIC_FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ generic_formal_part_opt(_t);
+ _t = _retTree;
+ def_id(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t282;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::id_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST id_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t43 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp50_AST_in = _t;
+ match(_t,ID_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case OPERATOR_SYMBOL:
+ {
+ def_designator(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t43;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::def_designator(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST def_designator_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ compound_name(_t);
+ _t = _retTree;
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ definable_operator_symbol(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::end_id_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST end_id_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t46 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp51_AST_in = _t;
+ match(_t,END);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case OPERATOR_SYMBOL:
+ {
+ def_designator(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t46;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::subprog_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST subprog_decl_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t49 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp52_AST_in = _t;
+ match(_t,GENERIC_PROCEDURE_INSTANTIATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ generic_inst(_t);
+ _t = _retTree;
+ _t = __t49;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t50 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp53_AST_in = _t;
+ match(_t,PROCEDURE_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t50;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROCEDURE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t51 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp54_AST_in = _t;
+ match(_t,PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t51;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROCEDURE_BODY_STUB:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t52 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp55_AST_in = _t;
+ match(_t,PROCEDURE_BODY_STUB);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t52;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t53 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp56_AST_in = _t;
+ match(_t,ABSTRACT_PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t53;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_FUNCTION_INSTANTIATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t54 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp57_AST_in = _t;
+ match(_t,GENERIC_FUNCTION_INSTANTIATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ generic_inst(_t);
+ _t = _retTree;
+ _t = __t54;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_RENAMING_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t55 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp58_AST_in = _t;
+ match(_t,FUNCTION_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t55;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t56 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp59_AST_in = _t;
+ match(_t,FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t56;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_BODY_STUB:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t57 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp60_AST_in = _t;
+ match(_t,FUNCTION_BODY_STUB);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t57;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ABSTRACT_FUNCTION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t58 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp61_AST_in = _t;
+ match(_t,ABSTRACT_FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t58;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::formal_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST formal_part_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t84 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp62_AST_in = _t;
+ match(_t,FORMAL_PART_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == PARAMETER_SPECIFICATION)) {
+ parameter_specification(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop86;
+ }
+
+ }
+ _loop86:;
+ } // ( ... )*
+ _t = __t84;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::function_tail(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST function_tail_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ formal_part_opt(_t);
+ _t = _retTree;
+ subtype_mark(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::value_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST value_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t468 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp63_AST_in = _t;
+ match(_t,VALUES);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt470=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_tokenSet_1.member(_t->getType()))) {
+ value(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt470>=1 ) { goto _loop470; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt470++;
+ }
+ _loop470:;
+ } // ( ... )+
+ _t = __t468;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::value(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST value_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case OTHERS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t63 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp64_AST_in = _t;
+ match(_t,OTHERS);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ _t = __t63;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case RIGHT_SHAFT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t64 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp65_AST_in = _t;
+ match(_t,RIGHT_SHAFT);
+ _t = _t->getFirstChild();
+ ranged_expr_s(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t64;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case RANGE:
+ case PIPE:
+ case DOT_DOT:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ ranged_expr_s(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::ranged_expr_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST ranged_expr_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PIPE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t66 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp66_AST_in = _t;
+ match(_t,PIPE);
+ _t = _t->getFirstChild();
+ ranged_expr_s(_t);
+ _t = _retTree;
+ ranged_expr(_t);
+ _t = _retTree;
+ _t = __t66;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case RANGE:
+ case DOT_DOT:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ ranged_expr(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::ranged_expr(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST ranged_expr_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t68 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp67_AST_in = _t;
+ match(_t,DOT_DOT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t68;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case RANGE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t69 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp68_AST_in = _t;
+ match(_t,RANGE);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ range(_t);
+ _t = _retTree;
+ _t = __t69;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::simple_expression(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST simple_expression_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PLUS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t488 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp69_AST_in = _t;
+ match(_t,PLUS);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ signed_term(_t);
+ _t = _retTree;
+ _t = __t488;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MINUS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t489 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp70_AST_in = _t;
+ match(_t,MINUS);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ signed_term(_t);
+ _t = _retTree;
+ _t = __t489;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CONCAT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t490 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp71_AST_in = _t;
+ match(_t,CONCAT);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ signed_term(_t);
+ _t = _retTree;
+ _t = __t490;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ signed_term(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::range(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST range_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ {
+ range_dots(_t);
+ _t = _retTree;
+ break;
+ }
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range_attrib_ref(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::range_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST range_constraint_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t71 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp72_AST_in = _t;
+ match(_t,RANGE_CONSTRAINT);
+ _t = _t->getFirstChild();
+ range(_t);
+ _t = _retTree;
+ _t = __t71;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::range_dots(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST range_dots_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t75 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp73_AST_in = _t;
+ match(_t,DOT_DOT);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t75;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::range_attrib_ref(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST range_attrib_ref_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t77 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp74_AST_in = _t;
+ match(_t,RANGE_ATTRIBUTE_REFERENCE);
+ _t = _t->getFirstChild();
+ prefix(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t77;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::prefix(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST prefix_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp75_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t80 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp76_AST_in = _t;
+ match(_t,DOT);
+ _t = _t->getFirstChild();
+ prefix(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ALL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp77_AST_in = _t;
+ match(_t,ALL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp78_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t80;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INDEXED_COMPONENT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t82 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp79_AST_in = _t;
+ match(_t,INDEXED_COMPONENT);
+ _t = _t->getFirstChild();
+ prefix(_t);
+ _t = _retTree;
+ value_s(_t);
+ _t = _retTree;
+ _t = __t82;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::parameter_specification(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST parameter_specification_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t88 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp80_AST_in = _t;
+ match(_t,PARAMETER_SPECIFICATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_mark(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t88;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::defining_identifier_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST defining_identifier_list_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t90 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp81_AST_in = _t;
+ match(_t,DEFINING_IDENTIFIER_LIST);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt92=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER)) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp82_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ else {
+ if ( _cnt92>=1 ) { goto _loop92; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt92++;
+ }
+ _loop92:;
+ } // ( ... )+
+ _t = __t90;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::init_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST init_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t136 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp83_AST_in = _t;
+ match(_t,INIT_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t136;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::name(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST name_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp84_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t95 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp85_AST_in = _t;
+ match(_t,DOT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ALL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp86_AST_in = _t;
+ match(_t,ALL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp87_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp88_AST_in = _t;
+ match(_t,CHARACTER_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp89_AST_in = _t;
+ match(_t,OPERATOR_SYMBOL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t95;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INDEXED_COMPONENT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t97 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp90_AST_in = _t;
+ match(_t,INDEXED_COMPONENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ value_s(_t);
+ _t = _retTree;
+ _t = __t97;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TIC:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t98 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp91_AST_in = _t;
+ match(_t,TIC);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ attribute_id(_t);
+ _t = _retTree;
+ _t = __t98;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::definable_operator_symbol(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST definable_operator_symbol_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp92_AST_in = _t;
+ match(_t,OPERATOR_SYMBOL);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::parenthesized_primary(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST parenthesized_primary_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t101 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp93_AST_in = _t;
+ match(_t,PARENTHESIZED_PRIMARY);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NuLL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp94_AST_in = _t;
+ match(_t,NuLL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case VALUES:
+ {
+ value_s(_t);
+ _t = _retTree;
+ extension_opt(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t101;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::extension_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST extension_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t104 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp95_AST_in = _t;
+ match(_t,EXTENSION_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NuLL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp96_AST_in = _t;
+ match(_t,NuLL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case VALUES:
+ {
+ value_s(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t104;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::spec_decl_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST spec_decl_part_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case GENERIC_PACKAGE_INSTANTIATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t109 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp97_AST_in = _t;
+ match(_t,GENERIC_PACKAGE_INSTANTIATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ generic_inst(_t);
+ _t = _retTree;
+ _t = __t109;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_SPECIFICATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t110 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp98_AST_in = _t;
+ match(_t,PACKAGE_SPECIFICATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ pkg_spec_part(_t);
+ _t = _retTree;
+ _t = __t110;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_RENAMING_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t111 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp99_AST_in = _t;
+ match(_t,PACKAGE_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ renames(_t);
+ _t = _retTree;
+ _t = __t111;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::basic_declarative_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST basic_declarative_items_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t114 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp100_AST_in = _t;
+ match(_t,BASIC_DECLARATIVE_ITEMS_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_tokenSet_2.member(_t->getType()))) {
+ basic_decl_item(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop116;
+ }
+
+ }
+ _loop116:;
+ } // ( ... )*
+ _t = __t114;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::private_declarative_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST private_declarative_items_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t118 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp101_AST_in = _t;
+ match(_t,PRIVATE_DECLARATIVE_ITEMS_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_tokenSet_2.member(_t->getType()))) {
+ basic_decl_item(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop120;
+ }
+
+ }
+ _loop120:;
+ } // ( ... )*
+ _t = __t118;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::basic_decl_item(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST basic_decl_item_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PACKAGE_RENAMING_DECLARATION:
+ case PACKAGE_SPECIFICATION:
+ case GENERIC_PACKAGE_INSTANTIATION:
+ {
+ spec_decl_part(_t);
+ _t = _retTree;
+ break;
+ }
+ case SINGLE_TASK_DECLARATION:
+ case TASK_TYPE_DECLARATION:
+ {
+ task_type_or_single_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROTECTED_TYPE_DECLARATION:
+ case SINGLE_PROTECTED_DECLARATION:
+ {
+ prot_type_or_single_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ subprog_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case EXCEPTION_DECLARATION:
+ case EXCEPTION_RENAMING_DECLARATION:
+ case GENERIC_PACKAGE_DECLARATION:
+ case INCOMPLETE_TYPE_DECLARATION:
+ case NUMBER_DECLARATION:
+ case OBJECT_DECLARATION:
+ case OBJECT_RENAMING_DECLARATION:
+ case PRIVATE_EXTENSION_DECLARATION:
+ case PRIVATE_TYPE_DECLARATION:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case SUBTYPE_DECLARATION:
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_OBJECT_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ case DERIVED_RECORD_EXTENSION:
+ case ENUMERATION_TYPE_DECLARATION:
+ case FLOATING_POINT_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ case MODULAR_TYPE_DECLARATION:
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ case RECORD_TYPE_DECLARATION:
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ decl_common(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::task_type_or_single_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST task_type_or_single_decl_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case TASK_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t123 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp102_AST_in = _t;
+ match(_t,TASK_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ discrim_part_opt(_t);
+ _t = _retTree;
+ task_definition_opt(_t);
+ _t = _retTree;
+ _t = __t123;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SINGLE_TASK_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t124 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp103_AST_in = _t;
+ match(_t,SINGLE_TASK_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ task_definition_opt(_t);
+ _t = _retTree;
+ _t = __t124;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::prot_type_or_single_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST prot_type_or_single_decl_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROTECTED_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t164 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp104_AST_in = _t;
+ match(_t,PROTECTED_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ discrim_part_opt(_t);
+ _t = _retTree;
+ protected_definition(_t);
+ _t = _retTree;
+ _t = __t164;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SINGLE_PROTECTED_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t165 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp105_AST_in = _t;
+ match(_t,SINGLE_PROTECTED_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ protected_definition(_t);
+ _t = _retTree;
+ _t = __t165;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::decl_common(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST decl_common_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ENUMERATION_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t184 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp106_AST_in = _t;
+ match(_t,ENUMERATION_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp107_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ enum_id_s(_t);
+ _t = _retTree;
+ _t = __t184;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t185 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp108_AST_in = _t;
+ match(_t,SIGNED_INTEGER_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp109_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ range(_t);
+ _t = _retTree;
+ _t = __t185;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MODULAR_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t186 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp110_AST_in = _t;
+ match(_t,MODULAR_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp111_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ _t = __t186;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FLOATING_POINT_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t187 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp112_AST_in = _t;
+ match(_t,FLOATING_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp113_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ range_constraint_opt(_t);
+ _t = _retTree;
+ _t = __t187;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t188 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp114_AST_in = _t;
+ match(_t,ORDINARY_FIXED_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp115_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ range(_t);
+ _t = _retTree;
+ _t = __t188;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t189 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp116_AST_in = _t;
+ match(_t,DECIMAL_FIXED_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp117_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ range_constraint_opt(_t);
+ _t = _retTree;
+ _t = __t189;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ARRAY_TYPE_DECLARATION:
+ {
+ array_type_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ {
+ access_type_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case INCOMPLETE_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t190 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp118_AST_in = _t;
+ match(_t,INCOMPLETE_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp119_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ discrim_part_opt(_t);
+ _t = _retTree;
+ _t = __t190;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PRIVATE_EXTENSION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t191 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp120_AST_in = _t;
+ match(_t,PRIVATE_EXTENSION_DECLARATION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t191;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DERIVED_RECORD_EXTENSION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t192 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp121_AST_in = _t;
+ match(_t,DERIVED_RECORD_EXTENSION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ record_definition(_t);
+ _t = _retTree;
+ _t = __t192;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t193 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp122_AST_in = _t;
+ match(_t,ORDINARY_DERIVED_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t193;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PRIVATE_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t194 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp123_AST_in = _t;
+ match(_t,PRIVATE_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ _t = __t194;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case RECORD_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t195 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp124_AST_in = _t;
+ match(_t,RECORD_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_and_discrim(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ record_definition(_t);
+ _t = _retTree;
+ _t = __t195;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SUBTYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t196 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp125_AST_in = _t;
+ match(_t,SUBTYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp126_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t196;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GENERIC_PACKAGE_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ {
+ generic_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ {
+ use_clause(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case RECORD_REPRESENTATION_CLAUSE:
+ {
+ rep_spec(_t);
+ _t = _retTree;
+ break;
+ }
+ case EXCEPTION_RENAMING_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t197 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp127_AST_in = _t;
+ match(_t,EXCEPTION_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ compound_name(_t);
+ _t = _retTree;
+ _t = __t197;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OBJECT_RENAMING_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t198 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp128_AST_in = _t;
+ match(_t,OBJECT_RENAMING_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ subtype_mark(_t);
+ _t = _retTree;
+ name(_t);
+ _t = _retTree;
+ _t = __t198;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case EXCEPTION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t199 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp129_AST_in = _t;
+ match(_t,EXCEPTION_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ _t = __t199;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUMBER_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t200 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp130_AST_in = _t;
+ match(_t,NUMBER_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t200;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ARRAY_OBJECT_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t201 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp131_AST_in = _t;
+ match(_t,ARRAY_OBJECT_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ array_type_definition(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t201;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OBJECT_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t202 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp132_AST_in = _t;
+ match(_t,OBJECT_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t202;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discrim_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discrim_part_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t127 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp133_AST_in = _t;
+ match(_t,DISCRIM_PART_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BOX:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp134_AST_in = _t;
+ match(_t,BOX);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DISCRIMINANT_SPECIFICATIONS:
+ {
+ discriminant_specifications(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t127;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::task_definition_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST task_definition_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ task_items_opt(_t);
+ _t = _retTree;
+ private_task_items_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::task_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST task_items_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t139 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp135_AST_in = _t;
+ match(_t,TASK_ITEMS_OPT);
+ _t = _t->getFirstChild();
+ entrydecls_repspecs_opt(_t);
+ _t = _retTree;
+ _t = __t139;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::private_task_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST private_task_items_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t162 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp136_AST_in = _t;
+ match(_t,PRIVATE_TASK_ITEMS_OPT);
+ _t = _t->getFirstChild();
+ entrydecls_repspecs_opt(_t);
+ _t = _retTree;
+ _t = __t162;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discriminant_specifications(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discriminant_specifications_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t130 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp137_AST_in = _t;
+ match(_t,DISCRIMINANT_SPECIFICATIONS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == DISCRIMINANT_SPECIFICATION)) {
+ discriminant_specification(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop132;
+ }
+
+ }
+ _loop132:;
+ } // ( ... )*
+ _t = __t130;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discriminant_specification(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discriminant_specification_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t134 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp138_AST_in = _t;
+ match(_t,DISCRIMINANT_SPECIFICATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_mark(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t134;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::entrydecls_repspecs_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST entrydecls_repspecs_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ENTRY_DECLARATION:
+ {
+ entry_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case RECORD_REPRESENTATION_CLAUSE:
+ {
+ rep_spec(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop142;
+ }
+ }
+ }
+ _loop142:;
+ } // ( ... )*
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::entry_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST entry_declaration_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t144 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp139_AST_in = _t;
+ match(_t,ENTRY_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp140_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ discrete_subtype_def_opt(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t144;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::rep_spec(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST rep_spec_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RECORD_REPRESENTATION_CLAUSE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t150 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp141_AST_in = _t;
+ match(_t,RECORD_REPRESENTATION_CLAUSE);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ align_opt(_t);
+ _t = _retTree;
+ comp_loc_s(_t);
+ _t = _retTree;
+ _t = __t150;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case AT_CLAUSE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t151 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp142_AST_in = _t;
+ match(_t,AT_CLAUSE);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t151;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t152 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp143_AST_in = _t;
+ match(_t,ATTRIBUTE_DEFINITION_CLAUSE);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t152;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t153 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp144_AST_in = _t;
+ match(_t,ENUMERATION_REPESENTATION_CLAUSE);
+ _t = _t->getFirstChild();
+ local_enum_name(_t);
+ _t = _retTree;
+ enumeration_aggregate(_t);
+ _t = _retTree;
+ _t = __t153;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discrete_subtype_def_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discrete_subtype_def_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t146 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp145_AST_in = _t;
+ match(_t,DISCRETE_SUBTYPE_DEF_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ case SUBTYPE_INDICATION:
+ {
+ discrete_subtype_definition(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t146;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discrete_subtype_definition(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discrete_subtype_definition_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ case SUBTYPE_INDICATION:
+ {
+ subtype_ind(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::subtype_ind(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST subtype_ind_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t221 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp146_AST_in = _t;
+ match(_t,SUBTYPE_INDICATION);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ constraint_opt(_t);
+ _t = _retTree;
+ _t = __t221;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::align_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST align_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t155 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp147_AST_in = _t;
+ match(_t,MOD_CLAUSE_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t155;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::comp_loc_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST comp_loc_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t158 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp148_AST_in = _t;
+ match(_t,COMPONENT_CLAUSES_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ {
+ subtype_mark(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop160;
+ }
+ }
+ }
+ _loop160:;
+ } // ( ... )*
+ _t = __t158;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::local_enum_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST local_enum_name_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp149_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::enumeration_aggregate(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST enumeration_aggregate_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_tokenSet_1.member(_t->getType()))) {
+ value(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop275;
+ }
+
+ }
+ _loop275:;
+ } // ( ... )*
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::protected_definition(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST protected_definition_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ prot_op_decl_s(_t);
+ _t = _retTree;
+ prot_private_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::prot_private_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST prot_private_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t167 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp150_AST_in = _t;
+ match(_t,PROT_PRIVATE_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROT_MEMBER_DECLARATIONS:
+ {
+ prot_member_decl_s(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t167;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::prot_member_decl_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST prot_member_decl_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t178 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp151_AST_in = _t;
+ match(_t,PROT_MEMBER_DECLARATIONS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENTRY_DECLARATION:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case FUNCTION_DECLARATION:
+ case PROCEDURE_DECLARATION:
+ {
+ prot_op_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case COMPONENT_DECLARATION:
+ {
+ comp_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop180;
+ }
+ }
+ }
+ _loop180:;
+ } // ( ... )*
+ _t = __t178;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::prot_op_decl_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST prot_op_decl_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t171 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp152_AST_in = _t;
+ match(_t,PROT_OP_DECLARATIONS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_tokenSet_3.member(_t->getType()))) {
+ prot_op_decl(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop173;
+ }
+
+ }
+ _loop173:;
+ } // ( ... )*
+ _t = __t171;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::prot_op_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST prot_op_decl_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ENTRY_DECLARATION:
+ {
+ entry_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROCEDURE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t175 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp153_AST_in = _t;
+ match(_t,PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t175;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t176 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp154_AST_in = _t;
+ match(_t,FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t176;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case RECORD_REPRESENTATION_CLAUSE:
+ {
+ rep_spec(_t);
+ _t = _retTree;
+ break;
+ }
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::comp_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST comp_decl_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t182 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp155_AST_in = _t;
+ match(_t,COMPONENT_DECLARATION);
+ _t = _t->getFirstChild();
+ defining_identifier_list(_t);
+ _t = _retTree;
+ component_subtype_def(_t);
+ _t = _retTree;
+ init_opt(_t);
+ _t = _retTree;
+ _t = __t182;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::component_subtype_def(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST component_subtype_def_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::enum_id_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST enum_id_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ { // ( ... )+
+ int _cnt206=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER || _t->getType() == CHARACTER_LITERAL)) {
+ enumeration_literal_specification(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt206>=1 ) { goto _loop206; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt206++;
+ }
+ _loop206:;
+ } // ( ... )+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::range_constraint_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST range_constraint_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RANGE_CONSTRAINT:
+ {
+ range_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::array_type_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST array_type_declaration_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t212 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp156_AST_in = _t;
+ match(_t,ARRAY_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp157_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ array_type_definition(_t);
+ _t = _retTree;
+ _t = __t212;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::access_type_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST access_type_declaration_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t245 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp158_AST_in = _t;
+ match(_t,ACCESS_TO_PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp159_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ modifiers(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t245;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t246 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp160_AST_in = _t;
+ match(_t,ACCESS_TO_FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp161_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ modifiers(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t246;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ACCESS_TO_OBJECT_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t247 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp162_AST_in = _t;
+ match(_t,ACCESS_TO_OBJECT_DECLARATION);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp163_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t247;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::id_and_discrim(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST id_and_discrim_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp164_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ discrim_part_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::record_definition(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST record_definition_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case COMPONENT_ITEMS:
+ {
+ component_list(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::array_type_definition(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST array_type_definition_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ index_or_discrete_range_s(_t);
+ _t = _retTree;
+ component_subtype_def(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::enumeration_literal_specification(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST enumeration_literal_specification_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp165_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp166_AST_in = _t;
+ match(_t,CHARACTER_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::index_or_discrete_range_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST index_or_discrete_range_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case RANGE:
+ case DOT_DOT:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ index_or_discrete_range(_t);
+ _t = _retTree;
+ break;
+ }
+ case COMMA:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t214 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp167_AST_in = _t;
+ match(_t,COMMA);
+ _t = _t->getFirstChild();
+ index_or_discrete_range_s(_t);
+ _t = _retTree;
+ index_or_discrete_range(_t);
+ _t = _retTree;
+ _t = __t214;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::index_or_discrete_range(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST index_or_discrete_range_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t216 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp168_AST_in = _t;
+ match(_t,DOT_DOT);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t216;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case RANGE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t217 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp169_AST_in = _t;
+ match(_t,RANGE);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BOX:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp170_AST_in = _t;
+ match(_t,BOX);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t217;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ simple_expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::constraint_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST constraint_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case RANGE_CONSTRAINT:
+ {
+ range_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case DIGITS_CONSTRAINT:
+ {
+ digits_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case DELTA_CONSTRAINT:
+ {
+ delta_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case INDEX_CONSTRAINT:
+ {
+ index_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case DISCRIMINANT_CONSTRAINT:
+ {
+ discriminant_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::digits_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST digits_constraint_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t225 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp171_AST_in = _t;
+ match(_t,DIGITS_CONSTRAINT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ range_constraint_opt(_t);
+ _t = _retTree;
+ _t = __t225;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::delta_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST delta_constraint_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t227 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp172_AST_in = _t;
+ match(_t,DELTA_CONSTRAINT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ range_constraint_opt(_t);
+ _t = _retTree;
+ _t = __t227;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::index_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST index_constraint_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t229 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp173_AST_in = _t;
+ match(_t,INDEX_CONSTRAINT);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt231=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == DOT_DOT || _t->getType() == RANGE_ATTRIBUTE_REFERENCE || _t->getType() == SUBTYPE_INDICATION)) {
+ discrete_range(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt231>=1 ) { goto _loop231; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt231++;
+ }
+ _loop231:;
+ } // ( ... )+
+ _t = __t229;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discriminant_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discriminant_constraint_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t234 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp174_AST_in = _t;
+ match(_t,DISCRIMINANT_CONSTRAINT);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt236=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == DISCRIMINANT_ASSOCIATION)) {
+ discriminant_association(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt236>=1 ) { goto _loop236; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt236++;
+ }
+ _loop236:;
+ } // ( ... )+
+ _t = __t234;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discrete_range(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discrete_range_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ case SUBTYPE_INDICATION:
+ {
+ subtype_ind(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discriminant_association(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discriminant_association_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t238 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp175_AST_in = _t;
+ match(_t,DISCRIMINANT_ASSOCIATION);
+ _t = _t->getFirstChild();
+ selector_names_opt(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t238;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::selector_names_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST selector_names_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t240 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp176_AST_in = _t;
+ match(_t,SELECTOR_NAMES_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENTIFIER)) {
+ selector_name(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop242;
+ }
+
+ }
+ _loop242:;
+ } // ( ... )*
+ _t = __t240;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::selector_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST selector_name_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp177_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::component_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST component_list_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ component_items(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case VARIANT_PART:
+ {
+ variant_part(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::component_items(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST component_items_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t253 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp178_AST_in = _t;
+ match(_t,COMPONENT_ITEMS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case COMPONENT_DECLARATION:
+ {
+ comp_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop255;
+ }
+ }
+ }
+ _loop255:;
+ } // ( ... )*
+ _t = __t253;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::variant_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST variant_part_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t257 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp179_AST_in = _t;
+ match(_t,VARIANT_PART);
+ _t = _t->getFirstChild();
+ discriminant_direct_name(_t);
+ _t = _retTree;
+ variant_s(_t);
+ _t = _retTree;
+ _t = __t257;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discriminant_direct_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discriminant_direct_name_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp180_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::variant_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST variant_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t260 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp181_AST_in = _t;
+ match(_t,VARIANTS);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt262=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == VARIANT)) {
+ variant(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt262>=1 ) { goto _loop262; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt262++;
+ }
+ _loop262:;
+ } // ( ... )+
+ _t = __t260;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::variant(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST variant_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t264 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp182_AST_in = _t;
+ match(_t,VARIANT);
+ _t = _t->getFirstChild();
+ choice_s(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case COMPONENT_ITEMS:
+ {
+ component_list(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t264;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::choice_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST choice_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PIPE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t267 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp183_AST_in = _t;
+ match(_t,PIPE);
+ _t = _t->getFirstChild();
+ choice_s(_t);
+ _t = _retTree;
+ choice(_t);
+ _t = _retTree;
+ _t = __t267;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case OTHERS:
+ case DOT_DOT:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ case AND_THEN:
+ case MARK_WITH_CONSTRAINT:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ choice(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::choice(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST choice_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case OTHERS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp184_AST_in = _t;
+ match(_t,OTHERS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ case MARK_WITH_CONSTRAINT:
+ {
+ discrete_with_range(_t);
+ _t = _retTree;
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::discrete_with_range(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST discrete_with_range_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case MARK_WITH_CONSTRAINT:
+ {
+ mark_with_constraint(_t);
+ _t = _retTree;
+ break;
+ }
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::mark_with_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST mark_with_constraint_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t271 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp185_AST_in = _t;
+ match(_t,MARK_WITH_CONSTRAINT);
+ _t = _t->getFirstChild();
+ subtype_mark(_t);
+ _t = _retTree;
+ range_constraint(_t);
+ _t = _retTree;
+ _t = __t271;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::generic_formal_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST generic_formal_part_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t284 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp186_AST_in = _t;
+ match(_t,GENERIC_FORMAL_PART);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ {
+ use_clause(_t);
+ _t = _retTree;
+ break;
+ }
+ case FORMAL_PACKAGE_DECLARATION:
+ case PARAMETER_SPECIFICATION:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case FORMAL_DECIMAL_FIXED_POINT_DECLARATION:
+ case FORMAL_DISCRETE_TYPE_DECLARATION:
+ case FORMAL_FLOATING_POINT_DECLARATION:
+ case FORMAL_FUNCTION_DECLARATION:
+ case FORMAL_MODULAR_TYPE_DECLARATION:
+ case FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION:
+ case FORMAL_ORDINARY_FIXED_POINT_DECLARATION:
+ case FORMAL_PRIVATE_EXTENSION_DECLARATION:
+ case FORMAL_PRIVATE_TYPE_DECLARATION:
+ case FORMAL_PROCEDURE_DECLARATION:
+ case FORMAL_SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ generic_formal_parameter(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop286;
+ }
+ }
+ }
+ _loop286:;
+ } // ( ... )*
+ _t = __t284;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::generic_formal_parameter(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST generic_formal_parameter_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case FORMAL_DISCRETE_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t288 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp187_AST_in = _t;
+ match(_t,FORMAL_DISCRETE_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t288;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t289 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp188_AST_in = _t;
+ match(_t,FORMAL_SIGNED_INTEGER_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t289;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_MODULAR_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t290 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp189_AST_in = _t;
+ match(_t,FORMAL_MODULAR_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t290;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_DECIMAL_FIXED_POINT_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t291 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp190_AST_in = _t;
+ match(_t,FORMAL_DECIMAL_FIXED_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t291;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_ORDINARY_FIXED_POINT_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t292 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp191_AST_in = _t;
+ match(_t,FORMAL_ORDINARY_FIXED_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t292;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_FLOATING_POINT_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t293 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp192_AST_in = _t;
+ match(_t,FORMAL_FLOATING_POINT_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t293;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ARRAY_TYPE_DECLARATION:
+ {
+ formal_array_type_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ {
+ formal_access_type_declaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case FORMAL_PRIVATE_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t294 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp193_AST_in = _t;
+ match(_t,FORMAL_PRIVATE_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_part(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ _t = __t294;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t295 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp194_AST_in = _t;
+ match(_t,FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION);
+ _t = _t->getFirstChild();
+ id_part(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t295;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_PRIVATE_EXTENSION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t296 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp195_AST_in = _t;
+ match(_t,FORMAL_PRIVATE_EXTENSION_DECLARATION);
+ _t = _t->getFirstChild();
+ id_part(_t);
+ _t = _retTree;
+ modifiers(_t);
+ _t = _retTree;
+ subtype_ind(_t);
+ _t = _retTree;
+ _t = __t296;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_PROCEDURE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t297 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp196_AST_in = _t;
+ match(_t,FORMAL_PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ subprogram_default_opt(_t);
+ _t = _retTree;
+ _t = __t297;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_FUNCTION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t298 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp197_AST_in = _t;
+ match(_t,FORMAL_FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ subprogram_default_opt(_t);
+ _t = _retTree;
+ _t = __t298;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FORMAL_PACKAGE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t299 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp198_AST_in = _t;
+ match(_t,FORMAL_PACKAGE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ compound_name(_t);
+ _t = _retTree;
+ formal_package_actual_part_opt(_t);
+ _t = _retTree;
+ _t = __t299;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PARAMETER_SPECIFICATION:
+ {
+ parameter_specification(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::formal_array_type_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST formal_array_type_declaration_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ array_type_declaration(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::formal_access_type_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST formal_access_type_declaration_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ access_type_declaration(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::id_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST id_part_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ def_id(_t);
+ _t = _retTree;
+ discrim_part_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::subprogram_default_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST subprogram_default_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BOX:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp199_AST_in = _t;
+ match(_t,BOX);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case INDEXED_COMPONENT:
+ {
+ name(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::formal_package_actual_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST formal_package_actual_part_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BOX:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp200_AST_in = _t;
+ match(_t,BOX);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DEFINING_IDENTIFIER_LIST:
+ {
+ defining_identifier_list(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::procedure_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST procedure_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t309 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp201_AST_in = _t;
+ match(_t,PROCEDURE_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ _t = __t309;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::function_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST function_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t311 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp202_AST_in = _t;
+ match(_t,FUNCTION_BODY);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ _t = __t311;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::body_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST body_part_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ declarative_part(_t);
+ _t = _retTree;
+ block_body(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::declarative_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST declarative_part_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t314 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp203_AST_in = _t;
+ match(_t,DECLARATIVE_PART);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case EXCEPTION_DECLARATION:
+ case EXCEPTION_RENAMING_DECLARATION:
+ case GENERIC_PACKAGE_DECLARATION:
+ case INCOMPLETE_TYPE_DECLARATION:
+ case NUMBER_DECLARATION:
+ case OBJECT_DECLARATION:
+ case OBJECT_RENAMING_DECLARATION:
+ case PACKAGE_BODY:
+ case PACKAGE_BODY_STUB:
+ case PACKAGE_RENAMING_DECLARATION:
+ case PACKAGE_SPECIFICATION:
+ case PRIVATE_EXTENSION_DECLARATION:
+ case PRIVATE_TYPE_DECLARATION:
+ case PROTECTED_BODY:
+ case PROTECTED_BODY_STUB:
+ case PROTECTED_TYPE_DECLARATION:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case SINGLE_PROTECTED_DECLARATION:
+ case SINGLE_TASK_DECLARATION:
+ case SUBTYPE_DECLARATION:
+ case TASK_BODY:
+ case TASK_BODY_STUB:
+ case TASK_TYPE_DECLARATION:
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_OBJECT_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ case DERIVED_RECORD_EXTENSION:
+ case ENUMERATION_TYPE_DECLARATION:
+ case FLOATING_POINT_DECLARATION:
+ case FUNCTION_BODY:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_INSTANTIATION:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ case MODULAR_TYPE_DECLARATION:
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ case PROCEDURE_BODY:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ case RECORD_TYPE_DECLARATION:
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ declarative_item(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop316;
+ }
+ }
+ }
+ _loop316:;
+ } // ( ... )*
+ _t = __t314;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::block_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST block_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t336 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp204_AST_in = _t;
+ match(_t,BLOCK_BODY);
+ _t = _t->getFirstChild();
+ handled_stmt_s(_t);
+ _t = _retTree;
+ _t = __t336;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::declarative_item(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST declarative_item_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PACKAGE_BODY_STUB:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t318 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp205_AST_in = _t;
+ match(_t,PACKAGE_BODY_STUB);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t318;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_BODY:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t319 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp206_AST_in = _t;
+ match(_t,PACKAGE_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ pkg_body_part(_t);
+ _t = _retTree;
+ _t = __t319;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PACKAGE_RENAMING_DECLARATION:
+ case PACKAGE_SPECIFICATION:
+ case GENERIC_PACKAGE_INSTANTIATION:
+ {
+ spec_decl_part(_t);
+ _t = _retTree;
+ break;
+ }
+ case TASK_BODY_STUB:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t320 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp207_AST_in = _t;
+ match(_t,TASK_BODY_STUB);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t320;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TASK_BODY:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t321 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp208_AST_in = _t;
+ match(_t,TASK_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ _t = __t321;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SINGLE_TASK_DECLARATION:
+ case TASK_TYPE_DECLARATION:
+ {
+ task_type_or_single_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROTECTED_BODY_STUB:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t322 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp209_AST_in = _t;
+ match(_t,PROTECTED_BODY_STUB);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ _t = __t322;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROTECTED_BODY:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t323 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp210_AST_in = _t;
+ match(_t,PROTECTED_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ prot_op_bodies_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ _t = __t323;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROTECTED_TYPE_DECLARATION:
+ case SINGLE_PROTECTED_DECLARATION:
+ {
+ prot_type_or_single_decl(_t);
+ _t = _retTree;
+ break;
+ }
+ case ABSTRACT_FUNCTION_DECLARATION:
+ case ABSTRACT_PROCEDURE_DECLARATION:
+ case FUNCTION_BODY:
+ case FUNCTION_BODY_STUB:
+ case FUNCTION_DECLARATION:
+ case FUNCTION_RENAMING_DECLARATION:
+ case GENERIC_FUNCTION_INSTANTIATION:
+ case GENERIC_PROCEDURE_INSTANTIATION:
+ case PROCEDURE_BODY:
+ case PROCEDURE_BODY_STUB:
+ case PROCEDURE_DECLARATION:
+ case PROCEDURE_RENAMING_DECLARATION:
+ {
+ subprog_decl_or_rename_or_inst_or_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case ATTRIBUTE_DEFINITION_CLAUSE:
+ case AT_CLAUSE:
+ case ENUMERATION_REPESENTATION_CLAUSE:
+ case EXCEPTION_DECLARATION:
+ case EXCEPTION_RENAMING_DECLARATION:
+ case GENERIC_PACKAGE_DECLARATION:
+ case INCOMPLETE_TYPE_DECLARATION:
+ case NUMBER_DECLARATION:
+ case OBJECT_DECLARATION:
+ case OBJECT_RENAMING_DECLARATION:
+ case PRIVATE_EXTENSION_DECLARATION:
+ case PRIVATE_TYPE_DECLARATION:
+ case RECORD_REPRESENTATION_CLAUSE:
+ case SUBTYPE_DECLARATION:
+ case USE_CLAUSE:
+ case USE_TYPE_CLAUSE:
+ case ACCESS_TO_FUNCTION_DECLARATION:
+ case ACCESS_TO_OBJECT_DECLARATION:
+ case ACCESS_TO_PROCEDURE_DECLARATION:
+ case ARRAY_OBJECT_DECLARATION:
+ case ARRAY_TYPE_DECLARATION:
+ case DECIMAL_FIXED_POINT_DECLARATION:
+ case DERIVED_RECORD_EXTENSION:
+ case ENUMERATION_TYPE_DECLARATION:
+ case FLOATING_POINT_DECLARATION:
+ case GENERIC_FUNCTION_DECLARATION:
+ case GENERIC_FUNCTION_RENAMING:
+ case GENERIC_PACKAGE_RENAMING:
+ case GENERIC_PROCEDURE_DECLARATION:
+ case GENERIC_PROCEDURE_RENAMING:
+ case MODULAR_TYPE_DECLARATION:
+ case ORDINARY_DERIVED_TYPE_DECLARATION:
+ case ORDINARY_FIXED_POINT_DECLARATION:
+ case RECORD_TYPE_DECLARATION:
+ case SIGNED_INTEGER_TYPE_DECLARATION:
+ {
+ decl_common(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::prot_op_bodies_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST prot_op_bodies_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t329 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp211_AST_in = _t;
+ match(_t,PROT_OP_BODIES_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case ENTRY_BODY:
+ {
+ entry_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION_BODY:
+ case FUNCTION_DECLARATION:
+ case PROCEDURE_BODY:
+ case PROCEDURE_DECLARATION:
+ {
+ subprog_decl_or_body(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop331;
+ }
+ }
+ }
+ _loop331:;
+ } // ( ... )*
+ _t = __t329;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::block_body_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST block_body_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t326 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp212_AST_in = _t;
+ match(_t,BLOCK_BODY_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case HANDLED_SEQUENCE_OF_STATEMENTS:
+ {
+ handled_stmt_s(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t326;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::handled_stmt_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST handled_stmt_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t338 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp213_AST_in = _t;
+ match(_t,HANDLED_SEQUENCE_OF_STATEMENTS);
+ _t = _t->getFirstChild();
+ statements(_t);
+ _t = _retTree;
+ except_handler_part_opt(_t);
+ _t = _retTree;
+ _t = __t338;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::entry_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST entry_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t398 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp214_AST_in = _t;
+ match(_t,ENTRY_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ entry_body_formal_part(_t);
+ _t = _retTree;
+ entry_barrier(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ _t = __t398;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::subprog_decl_or_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST subprog_decl_or_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROCEDURE_BODY:
+ {
+ procedure_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROCEDURE_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t333 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp215_AST_in = _t;
+ match(_t,PROCEDURE_DECLARATION);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ _t = __t333;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION_BODY:
+ {
+ function_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION_DECLARATION:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t334 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp216_AST_in = _t;
+ match(_t,FUNCTION_DECLARATION);
+ _t = _t->getFirstChild();
+ def_designator(_t);
+ _t = _retTree;
+ function_tail(_t);
+ _t = _retTree;
+ _t = __t334;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::statements(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST statements_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t343 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp217_AST_in = _t;
+ match(_t,SEQUENCE_OF_STATEMENTS);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt345=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case STATEMENT:
+ {
+ statement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ if ( _cnt345>=1 ) { goto _loop345; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+ }
+ _cnt345++;
+ }
+ _loop345:;
+ } // ( ... )+
+ _t = __t343;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::except_handler_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST except_handler_part_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t448 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp218_AST_in = _t;
+ match(_t,EXCEPT_HANDLER_PART_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == EXCEPTION_HANDLER)) {
+ exception_handler(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop450;
+ }
+
+ }
+ _loop450:;
+ } // ( ... )*
+ _t = __t448;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::handled_stmts_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST handled_stmts_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t340 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp219_AST_in = _t;
+ match(_t,HANDLED_STMTS_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case SEQUENCE_OF_STATEMENTS:
+ {
+ statements(_t);
+ _t = _retTree;
+ except_handler_part_opt(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t340;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::statement(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST statement_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t347 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp220_AST_in = _t;
+ match(_t,STATEMENT);
+ _t = _t->getFirstChild();
+ def_label_opt(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NULL_STATEMENT:
+ {
+ null_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case EXIT_STATEMENT:
+ {
+ exit_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case RETURN_STATEMENT:
+ {
+ return_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case GOTO_STATEMENT:
+ {
+ goto_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case DELAY_STATEMENT:
+ {
+ delay_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ABORT_STATEMENT:
+ {
+ abort_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case RAISE_STATEMENT:
+ {
+ raise_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case REQUEUE_STATEMENT:
+ {
+ requeue_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ACCEPT_STATEMENT:
+ {
+ accept_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ASYNCHRONOUS_SELECT:
+ case CONDITIONAL_ENTRY_CALL:
+ case SELECTIVE_ACCEPT:
+ case TIMED_ENTRY_CALL:
+ {
+ select_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case IF_STATEMENT:
+ {
+ if_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case CASE_STATEMENT:
+ {
+ case_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case LOOP_STATEMENT:
+ {
+ loop_stmt(_t);
+ _t = _retTree;
+ id_opt(_t);
+ _t = _retTree;
+ break;
+ }
+ case BLOCK_STATEMENT:
+ {
+ block(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ASSIGNMENT_STATEMENT:
+ case CALL_STATEMENT:
+ {
+ call_or_assignment(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t347;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::def_label_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST def_label_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t350 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp221_AST_in = _t;
+ match(_t,LABEL_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp222_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t350;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::null_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST null_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp223_AST_in = _t;
+ match(_t,NULL_STATEMENT);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::exit_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST exit_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t385 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp224_AST_in = _t;
+ match(_t,EXIT_STATEMENT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ label_name(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ case WHEN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case WHEN:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp225_AST_in = _t;
+ match(_t,WHEN);
+ _t = _t->getNextSibling();
+ condition(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t385;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::return_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST return_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t390 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp226_AST_in = _t;
+ match(_t,RETURN_STATEMENT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t390;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::goto_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST goto_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t393 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp227_AST_in = _t;
+ match(_t,GOTO_STATEMENT);
+ _t = _t->getFirstChild();
+ label_name(_t);
+ _t = _retTree;
+ _t = __t393;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::delay_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST delay_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t412 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp228_AST_in = _t;
+ match(_t,DELAY_STATEMENT);
+ _t = _t->getFirstChild();
+ modifiers(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t412;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::abort_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST abort_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t444 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp229_AST_in = _t;
+ match(_t,ABORT_STATEMENT);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt446=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_tokenSet_4.member(_t->getType()))) {
+ name(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt446>=1 ) { goto _loop446; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt446++;
+ }
+ _loop446:;
+ } // ( ... )+
+ _t = __t444;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::raise_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST raise_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t460 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp230_AST_in = _t;
+ match(_t,RAISE_STATEMENT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ compound_name(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t460;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::requeue_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST requeue_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t463 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp231_AST_in = _t;
+ match(_t,REQUEUE_STATEMENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ABORT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp232_AST_in = _t;
+ match(_t,ABORT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t463;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::accept_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST accept_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t407 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp233_AST_in = _t;
+ match(_t,ACCEPT_STATEMENT);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ entry_index_opt(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ handled_stmts_opt(_t);
+ _t = _retTree;
+ end_id_opt(_t);
+ _t = _retTree;
+ _t = __t407;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::select_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST select_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ASYNCHRONOUS_SELECT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t414 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp234_AST_in = _t;
+ match(_t,ASYNCHRONOUS_SELECT);
+ _t = _t->getFirstChild();
+ triggering_alternative(_t);
+ _t = _retTree;
+ abortable_part(_t);
+ _t = _retTree;
+ _t = __t414;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SELECTIVE_ACCEPT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t415 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp235_AST_in = _t;
+ match(_t,SELECTIVE_ACCEPT);
+ _t = _t->getFirstChild();
+ selective_accept(_t);
+ _t = _retTree;
+ _t = __t415;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TIMED_ENTRY_CALL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t416 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp236_AST_in = _t;
+ match(_t,TIMED_ENTRY_CALL);
+ _t = _t->getFirstChild();
+ entry_call_alternative(_t);
+ _t = _retTree;
+ delay_alternative(_t);
+ _t = _retTree;
+ _t = __t416;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CONDITIONAL_ENTRY_CALL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t417 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp237_AST_in = _t;
+ match(_t,CONDITIONAL_ENTRY_CALL);
+ _t = _t->getFirstChild();
+ entry_call_alternative(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t417;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::if_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST if_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t354 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp238_AST_in = _t;
+ match(_t,IF_STATEMENT);
+ _t = _t->getFirstChild();
+ cond_clause(_t);
+ _t = _retTree;
+ elsifs_opt(_t);
+ _t = _retTree;
+ else_opt(_t);
+ _t = _retTree;
+ _t = __t354;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::case_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST case_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t366 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp239_AST_in = _t;
+ match(_t,CASE_STATEMENT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ alternative_s(_t);
+ _t = _retTree;
+ _t = __t366;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::loop_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST loop_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t373 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp240_AST_in = _t;
+ match(_t,LOOP_STATEMENT);
+ _t = _t->getFirstChild();
+ iteration_scheme_opt(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t373;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::block(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST block_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t380 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp241_AST_in = _t;
+ match(_t,BLOCK_STATEMENT);
+ _t = _t->getFirstChild();
+ declare_opt(_t);
+ _t = _retTree;
+ block_body(_t);
+ _t = _retTree;
+ _t = __t380;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::call_or_assignment(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST call_or_assignment_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ASSIGNMENT_STATEMENT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t395 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp242_AST_in = _t;
+ match(_t,ASSIGNMENT_STATEMENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t395;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CALL_STATEMENT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t396 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp243_AST_in = _t;
+ match(_t,CALL_STATEMENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ _t = __t396;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::cond_clause(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST cond_clause_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t356 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp244_AST_in = _t;
+ match(_t,COND_CLAUSE);
+ _t = _t->getFirstChild();
+ condition(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t356;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::elsifs_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST elsifs_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t359 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp245_AST_in = _t;
+ match(_t,ELSIFS_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == COND_CLAUSE)) {
+ cond_clause(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop361;
+ }
+
+ }
+ _loop361:;
+ } // ( ... )*
+ _t = __t359;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::else_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST else_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t363 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp246_AST_in = _t;
+ match(_t,ELSE_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case SEQUENCE_OF_STATEMENTS:
+ {
+ statements(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t363;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::condition(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST condition_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ expression(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::alternative_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST alternative_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ { // ( ... )+
+ int _cnt369=0;
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == CASE_STATEMENT_ALTERNATIVE)) {
+ case_statement_alternative(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt369>=1 ) { goto _loop369; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);}
+ }
+
+ _cnt369++;
+ }
+ _loop369:;
+ } // ( ... )+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::case_statement_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST case_statement_alternative_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t371 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp247_AST_in = _t;
+ match(_t,CASE_STATEMENT_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ choice_s(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t371;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::iteration_scheme_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST iteration_scheme_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t375 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp248_AST_in = _t;
+ match(_t,ITERATION_SCHEME_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case WHILE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t377 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp249_AST_in = _t;
+ match(_t,WHILE);
+ _t = _t->getFirstChild();
+ condition(_t);
+ _t = _retTree;
+ _t = __t377;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FOR:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t378 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp250_AST_in = _t;
+ match(_t,FOR);
+ _t = _t->getFirstChild();
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp251_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ modifiers(_t);
+ _t = _retTree;
+ discrete_subtype_definition(_t);
+ _t = _retTree;
+ _t = __t378;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t375;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::declare_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST declare_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t382 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp252_AST_in = _t;
+ match(_t,DECLARE_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DECLARATIVE_PART:
+ {
+ declarative_part(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t382;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::label_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST label_name_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp253_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::entry_body_formal_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST entry_body_formal_part_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ entry_index_spec_opt(_t);
+ _t = _retTree;
+ formal_part_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::entry_barrier(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST entry_barrier_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ condition(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::entry_index_spec_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST entry_index_spec_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t401 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp254_AST_in = _t;
+ match(_t,ENTRY_INDEX_SPECIFICATION);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ def_id(_t);
+ _t = _retTree;
+ discrete_subtype_definition(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t401;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::entry_call_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST entry_call_stmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t405 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp255_AST_in = _t;
+ match(_t,ENTRY_CALL_STATEMENT);
+ _t = _t->getFirstChild();
+ name(_t);
+ _t = _retTree;
+ _t = __t405;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::entry_index_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST entry_index_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t409 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp256_AST_in = _t;
+ match(_t,ENTRY_INDEX_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t409;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::triggering_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST triggering_alternative_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t419 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp257_AST_in = _t;
+ match(_t,TRIGGERING_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DELAY_STATEMENT:
+ {
+ delay_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ case ENTRY_CALL_STATEMENT:
+ {
+ entry_call_stmt(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t419;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::abortable_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST abortable_part_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t422 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp258_AST_in = _t;
+ match(_t,ABORTABLE_PART);
+ _t = _t->getFirstChild();
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t422;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::selective_accept(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST selective_accept_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ guard_opt(_t);
+ _t = _retTree;
+ select_alternative(_t);
+ _t = _retTree;
+ or_select_opt(_t);
+ _t = _retTree;
+ else_opt(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::entry_call_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST entry_call_alternative_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t424 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp259_AST_in = _t;
+ match(_t,ENTRY_CALL_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ entry_call_stmt(_t);
+ _t = _retTree;
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t424;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::delay_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST delay_alternative_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t435 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp260_AST_in = _t;
+ match(_t,DELAY_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ delay_stmt(_t);
+ _t = _retTree;
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t435;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::stmts_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST stmts_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PRAGMA:
+ {
+ pragma(_t);
+ _t = _retTree;
+ break;
+ }
+ case STATEMENT:
+ {
+ statement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ goto _loop438;
+ }
+ }
+ }
+ _loop438:;
+ } // ( ... )*
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::guard_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST guard_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t427 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp261_AST_in = _t;
+ match(_t,GUARD_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case IN:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case OR:
+ case AND:
+ case XOR:
+ case NOT:
+ case EQ:
+ case NE:
+ case LT_:
+ case LE:
+ case GT:
+ case GE:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case AND_THEN:
+ case NOT_IN:
+ case OR_ELSE:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ condition(_t);
+ _t = _retTree;
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == PRAGMA)) {
+ pragma(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop430;
+ }
+
+ }
+ _loop430:;
+ } // ( ... )*
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t427;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::select_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST select_alternative_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ACCEPT_ALTERNATIVE:
+ {
+ accept_alternative(_t);
+ _t = _retTree;
+ break;
+ }
+ case DELAY_ALTERNATIVE:
+ {
+ delay_alternative(_t);
+ _t = _retTree;
+ break;
+ }
+ case TERMINATE_ALTERNATIVE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp262_AST_in = _t;
+ match(_t,TERMINATE_ALTERNATIVE);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::or_select_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST or_select_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t440 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp263_AST_in = _t;
+ match(_t,OR_SELECT_OPT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ if ((_t->getType() == GUARD_OPT)) {
+ guard_opt(_t);
+ _t = _retTree;
+ select_alternative(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop442;
+ }
+
+ }
+ _loop442:;
+ } // ( ... )*
+ _t = __t440;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::accept_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST accept_alternative_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t433 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp264_AST_in = _t;
+ match(_t,ACCEPT_ALTERNATIVE);
+ _t = _t->getFirstChild();
+ accept_stmt(_t);
+ _t = _retTree;
+ stmts_opt(_t);
+ _t = _retTree;
+ _t = __t433;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::exception_handler(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST exception_handler_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t452 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp265_AST_in = _t;
+ match(_t,EXCEPTION_HANDLER);
+ _t = _t->getFirstChild();
+ identifier_colon_opt(_t);
+ _t = _retTree;
+ except_choice_s(_t);
+ _t = _retTree;
+ statements(_t);
+ _t = _retTree;
+ _t = __t452;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::identifier_colon_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST identifier_colon_opt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t454 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp266_AST_in = _t;
+ match(_t,IDENTIFIER_COLON_OPT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp267_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t454;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::except_choice_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST except_choice_s_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PIPE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t457 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp268_AST_in = _t;
+ match(_t,PIPE);
+ _t = _t->getFirstChild();
+ except_choice_s(_t);
+ _t = _retTree;
+ exception_choice(_t);
+ _t = _retTree;
+ _t = __t457;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case OTHERS:
+ {
+ exception_choice(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::exception_choice(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST exception_choice_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ {
+ compound_name(_t);
+ _t = _retTree;
+ break;
+ }
+ case OTHERS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp269_AST_in = _t;
+ match(_t,OTHERS);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::operator_call(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST operator_call_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t466 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp270_AST_in = _t;
+ match(_t,OPERATOR_SYMBOL);
+ _t = _t->getFirstChild();
+ value_s(_t);
+ _t = _retTree;
+ _t = __t466;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::relation(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST relation_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IN:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t478 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp271_AST_in = _t;
+ match(_t,IN);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ range_or_mark(_t);
+ _t = _retTree;
+ _t = __t478;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NOT_IN:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t479 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp272_AST_in = _t;
+ match(_t,NOT_IN);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ range_or_mark(_t);
+ _t = _retTree;
+ _t = __t479;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case EQ:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t480 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp273_AST_in = _t;
+ match(_t,EQ);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t480;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t481 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp274_AST_in = _t;
+ match(_t,NE);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t481;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LT_:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t482 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp275_AST_in = _t;
+ match(_t,LT_);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t482;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t483 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp276_AST_in = _t;
+ match(_t,LE);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t483;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t484 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp277_AST_in = _t;
+ match(_t,GT);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t484;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GE:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t485 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp278_AST_in = _t;
+ match(_t,GE);
+ _t = _t->getFirstChild();
+ simple_expression(_t);
+ _t = _retTree;
+ simple_expression(_t);
+ _t = _retTree;
+ _t = __t485;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case PLUS:
+ case MINUS:
+ case CONCAT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ {
+ simple_expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::range_or_mark(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST range_or_mark_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOT_DOT:
+ case RANGE_ATTRIBUTE_REFERENCE:
+ {
+ range(_t);
+ _t = _retTree;
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ {
+ subtype_mark(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::signed_term(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST signed_term_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case UNARY_PLUS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t492 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp279_AST_in = _t;
+ match(_t,UNARY_PLUS);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ _t = __t492;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case UNARY_MINUS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t493 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp280_AST_in = _t;
+ match(_t,UNARY_MINUS);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ _t = __t493;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case MOD:
+ case NOT:
+ case STAR:
+ case DIV:
+ case REM:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ {
+ term(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::term(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST term_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case STAR:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t495 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp281_AST_in = _t;
+ match(_t,STAR);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ factor(_t);
+ _t = _retTree;
+ _t = __t495;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DIV:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t496 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp282_AST_in = _t;
+ match(_t,DIV);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ factor(_t);
+ _t = _retTree;
+ _t = __t496;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MOD:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t497 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp283_AST_in = _t;
+ match(_t,MOD);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ factor(_t);
+ _t = _retTree;
+ _t = __t497;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case REM:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t498 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp284_AST_in = _t;
+ match(_t,REM);
+ _t = _t->getFirstChild();
+ term(_t);
+ _t = _retTree;
+ factor(_t);
+ _t = _retTree;
+ _t = __t498;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NOT:
+ case ABS:
+ case EXPON:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ {
+ factor(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::factor(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST factor_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NOT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t500 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp285_AST_in = _t;
+ match(_t,NOT);
+ _t = _t->getFirstChild();
+ primary(_t);
+ _t = _retTree;
+ _t = __t500;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ABS:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t501 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp286_AST_in = _t;
+ match(_t,ABS);
+ _t = _t->getFirstChild();
+ primary(_t);
+ _t = _retTree;
+ _t = __t501;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case EXPON:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t502 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp287_AST_in = _t;
+ match(_t,EXPON);
+ _t = _t->getFirstChild();
+ primary(_t);
+ _t = _retTree;
+ primary(_t);
+ _t = _retTree;
+ _t = __t502;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case CHARACTER_LITERAL:
+ case CHAR_STRING:
+ case NuLL:
+ case NUMERIC_LIT:
+ case ALLOCATOR:
+ case INDEXED_COMPONENT:
+ case OPERATOR_SYMBOL:
+ case PARENTHESIZED_PRIMARY:
+ {
+ primary(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::primary(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST primary_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ case DOT:
+ case TIC:
+ case INDEXED_COMPONENT:
+ {
+ name_or_qualified(_t);
+ _t = _retTree;
+ break;
+ }
+ case PARENTHESIZED_PRIMARY:
+ {
+ parenthesized_primary(_t);
+ _t = _retTree;
+ break;
+ }
+ case ALLOCATOR:
+ {
+ allocator(_t);
+ _t = _retTree;
+ break;
+ }
+ case NuLL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp288_AST_in = _t;
+ match(_t,NuLL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUMERIC_LIT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp289_AST_in = _t;
+ match(_t,NUMERIC_LIT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp290_AST_in = _t;
+ match(_t,CHARACTER_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHAR_STRING:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp291_AST_in = _t;
+ match(_t,CHAR_STRING);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ operator_call(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::name_or_qualified(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST name_or_qualified_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp292_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t506 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp293_AST_in = _t;
+ match(_t,DOT);
+ _t = _t->getFirstChild();
+ name_or_qualified(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ALL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp294_AST_in = _t;
+ match(_t,ALL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENTIFIER:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp295_AST_in = _t;
+ match(_t,IDENTIFIER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHARACTER_LITERAL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp296_AST_in = _t;
+ match(_t,CHARACTER_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OPERATOR_SYMBOL:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp297_AST_in = _t;
+ match(_t,OPERATOR_SYMBOL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t506;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INDEXED_COMPONENT:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t508 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp298_AST_in = _t;
+ match(_t,INDEXED_COMPONENT);
+ _t = _t->getFirstChild();
+ name_or_qualified(_t);
+ _t = _retTree;
+ value_s(_t);
+ _t = _retTree;
+ _t = __t508;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TIC:
+ {
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t509 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp299_AST_in = _t;
+ match(_t,TIC);
+ _t = _t->getFirstChild();
+ name_or_qualified(_t);
+ _t = _retTree;
+ {
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PARENTHESIZED_PRIMARY:
+ {
+ parenthesized_primary(_t);
+ _t = _retTree;
+ break;
+ }
+ case IDENTIFIER:
+ case RANGE:
+ case DIGITS:
+ case DELTA:
+ case ACCESS:
+ {
+ attribute_id(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ _t = __t509;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::allocator(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST allocator_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t512 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp300_AST_in = _t;
+ match(_t,ALLOCATOR);
+ _t = _t->getFirstChild();
+ name_or_qualified(_t);
+ _t = _retTree;
+ _t = __t512;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::subprogram_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST subprogram_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROCEDURE_BODY:
+ {
+ procedure_body(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION_BODY:
+ {
+ function_body(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t);
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::package_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST package_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t518 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp301_AST_in = _t;
+ match(_t,PACKAGE_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ pkg_body_part(_t);
+ _t = _retTree;
+ _t = __t518;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::task_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST task_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t520 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp302_AST_in = _t;
+ match(_t,TASK_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ body_part(_t);
+ _t = _retTree;
+ _t = __t520;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::protected_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
+ ANTLR_USE_NAMESPACE(antlr)RefAST protected_body_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
+
+ try { // for error handling
+ ANTLR_USE_NAMESPACE(antlr)RefAST __t522 = _t;
+ ANTLR_USE_NAMESPACE(antlr)RefAST tmp303_AST_in = _t;
+ match(_t,PROTECTED_BODY);
+ _t = _t->getFirstChild();
+ def_id(_t);
+ _t = _retTree;
+ prot_op_bodies_opt(_t);
+ _t = _retTree;
+ _t = __t522;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void AdaTreeParserSuper::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& )
+{
+}
+const char* AdaTreeParserSuper::tokenNames[] = {
+ "<0>",
+ "EOF",
+ "<2>",
+ "NULL_TREE_LOOKAHEAD",
+ "\"pragma\"",
+ "IDENTIFIER",
+ "SEMI",
+ "LPAREN",
+ "COMMA",
+ "RPAREN",
+ "RIGHT_SHAFT",
+ "\"with\"",
+ "DOT",
+ "\"use\"",
+ "\"type\"",
+ "TIC",
+ "\"range\"",
+ "\"digits\"",
+ "\"delta\"",
+ "\"access\"",
+ "\"private\"",
+ "\"package\"",
+ "\"body\"",
+ "\"is\"",
+ "\"procedure\"",
+ "\"function\"",
+ "\"new\"",
+ "\"others\"",
+ "PIPE",
+ "DOT_DOT",
+ "\"all\"",
+ "COLON",
+ "\"in\"",
+ "\"out\"",
+ "\"renames\"",
+ "CHARACTER_LITERAL",
+ "CHAR_STRING",
+ "\"null\"",
+ "\"record\"",
+ "\"separate\"",
+ "\"abstract\"",
+ "\"return\"",
+ "\"task\"",
+ "\"protected\"",
+ "BOX",
+ "ASSIGN",
+ "\"entry\"",
+ "\"for\"",
+ "\"end\"",
+ "\"at\"",
+ "\"mod\"",
+ "\"subtype\"",
+ "\"exception\"",
+ "\"constant\"",
+ "\"array\"",
+ "\"of\"",
+ "\"aliased\"",
+ "\"case\"",
+ "\"when\"",
+ "\"tagged\"",
+ "\"limited\"",
+ "\"generic\"",
+ "\"begin\"",
+ "LT_LT",
+ "GT_GT",
+ "\"if\"",
+ "\"then\"",
+ "\"elsif\"",
+ "\"else\"",
+ "\"loop\"",
+ "\"while\"",
+ "\"reverse\"",
+ "\"declare\"",
+ "\"exit\"",
+ "\"goto\"",
+ "\"accept\"",
+ "\"do\"",
+ "\"delay\"",
+ "\"until\"",
+ "\"select\"",
+ "\"abort\"",
+ "\"or\"",
+ "\"terminate\"",
+ "\"raise\"",
+ "\"requeue\"",
+ "\"and\"",
+ "\"xor\"",
+ "\"not\"",
+ "EQ",
+ "NE",
+ "LT_",
+ "LE",
+ "GT",
+ "GE",
+ "PLUS",
+ "MINUS",
+ "CONCAT",
+ "STAR",
+ "DIV",
+ "\"rem\"",
+ "\"abs\"",
+ "EXPON",
+ "NUMERIC_LIT",
+ "ABORTABLE_PART",
+ "ABORT_STATEMENT",
+ "ACCEPT_ALTERNATIVE",
+ "ACCEPT_STATEMENT",
+ "ALLOCATOR",
+ "ASSIGNMENT_STATEMENT",
+ "ASYNCHRONOUS_SELECT",
+ "ATTRIBUTE_DEFINITION_CLAUSE",
+ "AT_CLAUSE",
+ "BLOCK_STATEMENT",
+ "CASE_STATEMENT",
+ "CASE_STATEMENT_ALTERNATIVE",
+ "CODE_STATEMENT",
+ "COMPONENT_DECLARATION",
+ "CONDITIONAL_ENTRY_CALL",
+ "CONTEXT_CLAUSE",
+ "DECLARATIVE_PART",
+ "DEFINING_IDENTIFIER_LIST",
+ "DELAY_ALTERNATIVE",
+ "DELAY_STATEMENT",
+ "DELTA_CONSTRAINT",
+ "DIGITS_CONSTRAINT",
+ "DISCRIMINANT_ASSOCIATION",
+ "DISCRIMINANT_CONSTRAINT",
+ "DISCRIMINANT_SPECIFICATION",
+ "ENTRY_BODY",
+ "ENTRY_CALL_ALTERNATIVE",
+ "ENTRY_CALL_STATEMENT",
+ "ENTRY_DECLARATION",
+ "ENTRY_INDEX_SPECIFICATION",
+ "ENUMERATION_REPESENTATION_CLAUSE",
+ "EXCEPTION_DECLARATION",
+ "EXCEPTION_HANDLER",
+ "EXCEPTION_RENAMING_DECLARATION",
+ "EXIT_STATEMENT",
+ "FORMAL_PACKAGE_DECLARATION",
+ "GENERIC_FORMAL_PART",
+ "GENERIC_PACKAGE_DECLARATION",
+ "GOTO_STATEMENT",
+ "HANDLED_SEQUENCE_OF_STATEMENTS",
+ "HANDLED_STMTS_OPT",
+ "IF_STATEMENT",
+ "INCOMPLETE_TYPE_DECLARATION",
+ "INDEXED_COMPONENT",
+ "INDEX_CONSTRAINT",
+ "LIBRARY_ITEM",
+ "LOOP_STATEMENT",
+ "NAME",
+ "NULL_STATEMENT",
+ "NUMBER_DECLARATION",
+ "OBJECT_DECLARATION",
+ "OBJECT_RENAMING_DECLARATION",
+ "OPERATOR_SYMBOL",
+ "PACKAGE_BODY",
+ "PACKAGE_BODY_STUB",
+ "PACKAGE_RENAMING_DECLARATION",
+ "PACKAGE_SPECIFICATION",
+ "PARAMETER_SPECIFICATION",
+ "PRIVATE_EXTENSION_DECLARATION",
+ "PRIVATE_TYPE_DECLARATION",
+ "PROTECTED_BODY",
+ "PROTECTED_BODY_STUB",
+ "PROTECTED_TYPE_DECLARATION",
+ "RAISE_STATEMENT",
+ "RANGE_ATTRIBUTE_REFERENCE",
+ "RECORD_REPRESENTATION_CLAUSE",
+ "REQUEUE_STATEMENT",
+ "RETURN_STATEMENT",
+ "SELECTIVE_ACCEPT",
+ "SEQUENCE_OF_STATEMENTS",
+ "SINGLE_PROTECTED_DECLARATION",
+ "SINGLE_TASK_DECLARATION",
+ "STATEMENT",
+ "SUBTYPE_DECLARATION",
+ "SUBTYPE_INDICATION",
+ "SUBTYPE_MARK",
+ "SUBUNIT",
+ "TASK_BODY",
+ "TASK_BODY_STUB",
+ "TASK_TYPE_DECLARATION",
+ "TERMINATE_ALTERNATIVE",
+ "TIMED_ENTRY_CALL",
+ "TRIGGERING_ALTERNATIVE",
+ "USE_CLAUSE",
+ "USE_TYPE_CLAUSE",
+ "VARIANT",
+ "VARIANT_PART",
+ "WITH_CLAUSE",
+ "ABSTRACT_FUNCTION_DECLARATION",
+ "ABSTRACT_PROCEDURE_DECLARATION",
+ "ACCESS_TO_FUNCTION_DECLARATION",
+ "ACCESS_TO_OBJECT_DECLARATION",
+ "ACCESS_TO_PROCEDURE_DECLARATION",
+ "ARRAY_OBJECT_DECLARATION",
+ "ARRAY_TYPE_DECLARATION",
+ "AND_THEN",
+ "BASIC_DECLARATIVE_ITEMS_OPT",
+ "BLOCK_BODY",
+ "BLOCK_BODY_OPT",
+ "CALL_STATEMENT",
+ "COMPONENT_CLAUSES_OPT",
+ "COMPONENT_ITEMS",
+ "COND_CLAUSE",
+ "DECIMAL_FIXED_POINT_DECLARATION",
+ "DECLARE_OPT",
+ "DERIVED_RECORD_EXTENSION",
+ "DISCRETE_SUBTYPE_DEF_OPT",
+ "DISCRIMINANT_SPECIFICATIONS",
+ "DISCRIM_PART_OPT",
+ "ELSE_OPT",
+ "ELSIFS_OPT",
+ "END_ID_OPT",
+ "ENTRY_INDEX_OPT",
+ "ENUMERATION_TYPE_DECLARATION",
+ "EXCEPT_HANDLER_PART_OPT",
+ "EXTENSION_OPT",
+ "FLOATING_POINT_DECLARATION",
+ "FORMAL_DECIMAL_FIXED_POINT_DECLARATION",
+ "FORMAL_DISCRETE_TYPE_DECLARATION",
+ "FORMAL_FLOATING_POINT_DECLARATION",
+ "FORMAL_FUNCTION_DECLARATION",
+ "FORMAL_MODULAR_TYPE_DECLARATION",
+ "FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION",
+ "FORMAL_ORDINARY_FIXED_POINT_DECLARATION",
+ "FORMAL_PART_OPT",
+ "FORMAL_PRIVATE_EXTENSION_DECLARATION",
+ "FORMAL_PRIVATE_TYPE_DECLARATION",
+ "FORMAL_PROCEDURE_DECLARATION",
+ "FORMAL_SIGNED_INTEGER_TYPE_DECLARATION",
+ "FUNCTION_BODY",
+ "FUNCTION_BODY_STUB",
+ "FUNCTION_DECLARATION",
+ "FUNCTION_RENAMING_DECLARATION",
+ "GENERIC_FUNCTION_DECLARATION",
+ "GENERIC_FUNCTION_INSTANTIATION",
+ "GENERIC_FUNCTION_RENAMING",
+ "GENERIC_PACKAGE_INSTANTIATION",
+ "GENERIC_PACKAGE_RENAMING",
+ "GENERIC_PROCEDURE_DECLARATION",
+ "GENERIC_PROCEDURE_INSTANTIATION",
+ "GENERIC_PROCEDURE_RENAMING",
+ "GUARD_OPT",
+ "IDENTIFIER_COLON_OPT",
+ "ID_OPT",
+ "INIT_OPT",
+ "ITERATION_SCHEME_OPT",
+ "LABEL_OPT",
+ "MARK_WITH_CONSTRAINT",
+ "MODIFIERS",
+ "MODULAR_TYPE_DECLARATION",
+ "MOD_CLAUSE_OPT",
+ "NOT_IN",
+ "ORDINARY_DERIVED_TYPE_DECLARATION",
+ "ORDINARY_FIXED_POINT_DECLARATION",
+ "OR_ELSE",
+ "OR_SELECT_OPT",
+ "PARENTHESIZED_PRIMARY",
+ "PRIVATE_DECLARATIVE_ITEMS_OPT",
+ "PRIVATE_TASK_ITEMS_OPT",
+ "PROCEDURE_BODY",
+ "PROCEDURE_BODY_STUB",
+ "PROCEDURE_DECLARATION",
+ "PROCEDURE_RENAMING_DECLARATION",
+ "PROT_MEMBER_DECLARATIONS",
+ "PROT_OP_BODIES_OPT",
+ "PROT_OP_DECLARATIONS",
+ "PROT_PRIVATE_OPT",
+ "RANGED_EXPRS",
+ "RANGE_CONSTRAINT",
+ "RECORD_TYPE_DECLARATION",
+ "SELECTOR_NAMES_OPT",
+ "SIGNED_INTEGER_TYPE_DECLARATION",
+ "TASK_ITEMS_OPT",
+ "UNARY_MINUS",
+ "UNARY_PLUS",
+ "VALUE",
+ "VALUES",
+ "VARIANTS",
+ "COMMENT_INTRO",
+ "OX",
+ "TIC_OR_CHARACTER_LITERAL",
+ "DIGIT",
+ "EXPONENT",
+ "EXTENDED_DIGIT",
+ "BASED_INTEGER",
+ "WS_",
+ "COMMENT",
+ "CHARACTER_STRING",
+ 0
+};
+
+const unsigned long AdaTreeParserSuper::_tokenSet_0_data_[] = { 37920UL, 262201UL, 4293001216UL, 2175UL, 134479872UL, 0UL, 64UL, 1073741824UL, 3145738UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER RIGHT_SHAFT DOT TIC "in" CHARACTER_LITERAL CHAR_STRING "null"
+// "mod" "or" "and" "xor" "not" EQ NE LT_ LE GT GE PLUS MINUS CONCAT STAR
+// DIV "rem" "abs" EXPON NUMERIC_LIT ALLOCATOR INDEXED_COMPONENT OPERATOR_SYMBOL
+// AND_THEN NOT_IN OR_ELSE PARENTHESIZED_PRIMARY UNARY_MINUS UNARY_PLUS
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaTreeParserSuper::_tokenSet_0(_tokenSet_0_data_,20);
+const unsigned long AdaTreeParserSuper::_tokenSet_1_data_[] = { 939627552UL, 262201UL, 4293001216UL, 2175UL, 134479872UL, 0UL, 64UL, 1073741824UL, 3145738UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER RIGHT_SHAFT DOT TIC "range" "others" PIPE DOT_DOT "in" CHARACTER_LITERAL
+// CHAR_STRING "null" "mod" "or" "and" "xor" "not" EQ NE LT_ LE GT GE PLUS
+// MINUS CONCAT STAR DIV "rem" "abs" EXPON NUMERIC_LIT ALLOCATOR INDEXED_COMPONENT
+// OPERATOR_SYMBOL AND_THEN NOT_IN OR_ELSE PARENTHESIZED_PRIMARY UNARY_MINUS
+// UNARY_PLUS
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaTreeParserSuper::_tokenSet_1(_tokenSet_1_data_,20);
+const unsigned long AdaTreeParserSuper::_tokenSet_2_data_[] = { 0UL, 0UL, 0UL, 49152UL, 3338801504UL, 2353094950UL, 151076927UL, 2416967168UL, 328577UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// ATTRIBUTE_DEFINITION_CLAUSE AT_CLAUSE ENUMERATION_REPESENTATION_CLAUSE
+// EXCEPTION_DECLARATION EXCEPTION_RENAMING_DECLARATION GENERIC_PACKAGE_DECLARATION
+// INCOMPLETE_TYPE_DECLARATION NUMBER_DECLARATION OBJECT_DECLARATION OBJECT_RENAMING_DECLARATION
+// PACKAGE_RENAMING_DECLARATION PACKAGE_SPECIFICATION PRIVATE_EXTENSION_DECLARATION
+// PRIVATE_TYPE_DECLARATION PROTECTED_TYPE_DECLARATION RECORD_REPRESENTATION_CLAUSE
+// SINGLE_PROTECTED_DECLARATION SINGLE_TASK_DECLARATION SUBTYPE_DECLARATION
+// TASK_TYPE_DECLARATION USE_CLAUSE USE_TYPE_CLAUSE ABSTRACT_FUNCTION_DECLARATION
+// ABSTRACT_PROCEDURE_DECLARATION ACCESS_TO_FUNCTION_DECLARATION ACCESS_TO_OBJECT_DECLARATION
+// ACCESS_TO_PROCEDURE_DECLARATION ARRAY_OBJECT_DECLARATION ARRAY_TYPE_DECLARATION
+// DECIMAL_FIXED_POINT_DECLARATION DERIVED_RECORD_EXTENSION ENUMERATION_TYPE_DECLARATION
+// FLOATING_POINT_DECLARATION FUNCTION_BODY_STUB FUNCTION_DECLARATION FUNCTION_RENAMING_DECLARATION
+// GENERIC_FUNCTION_DECLARATION GENERIC_FUNCTION_INSTANTIATION GENERIC_FUNCTION_RENAMING
+// GENERIC_PACKAGE_INSTANTIATION GENERIC_PACKAGE_RENAMING GENERIC_PROCEDURE_DECLARATION
+// GENERIC_PROCEDURE_INSTANTIATION GENERIC_PROCEDURE_RENAMING MODULAR_TYPE_DECLARATION
+// ORDINARY_DERIVED_TYPE_DECLARATION ORDINARY_FIXED_POINT_DECLARATION PROCEDURE_BODY_STUB
+// PROCEDURE_DECLARATION PROCEDURE_RENAMING_DECLARATION RECORD_TYPE_DECLARATION
+// SIGNED_INTEGER_TYPE_DECLARATION
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaTreeParserSuper::_tokenSet_2(_tokenSet_2_data_,20);
+const unsigned long AdaTreeParserSuper::_tokenSet_3_data_[] = { 16UL, 0UL, 0UL, 49152UL, 40UL, 256UL, 0UL, 1024UL, 256UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "pragma" ATTRIBUTE_DEFINITION_CLAUSE AT_CLAUSE ENTRY_DECLARATION ENUMERATION_REPESENTATION_CLAUSE
+// RECORD_REPRESENTATION_CLAUSE FUNCTION_DECLARATION PROCEDURE_DECLARATION
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaTreeParserSuper::_tokenSet_3(_tokenSet_3_data_,20);
+const unsigned long AdaTreeParserSuper::_tokenSet_4_data_[] = { 36896UL, 0UL, 0UL, 0UL, 262144UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENTIFIER DOT TIC INDEXED_COMPONENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet AdaTreeParserSuper::_tokenSet_4(_tokenSet_4_data_,12);
+
+
diff --git a/languages/ada/AdaTreeParserSuper.hpp b/languages/ada/AdaTreeParserSuper.hpp
new file mode 100644
index 00000000..a4d164f0
--- /dev/null
+++ b/languages/ada/AdaTreeParserSuper.hpp
@@ -0,0 +1,241 @@
+#ifndef INC_AdaTreeParserSuper_hpp_
+#define INC_AdaTreeParserSuper_hpp_
+
+#include <antlr/config.hpp>
+#include "AdaTreeParserSuperTokenTypes.hpp"
+/* $ANTLR 2.7.7 (20070609): "ada.tree.g" -> "AdaTreeParserSuper.hpp"$ */
+#include <antlr/TreeParser.hpp>
+
+class CUSTOM_API AdaTreeParserSuper : public ANTLR_USE_NAMESPACE(antlr)TreeParser, public AdaTreeParserSuperTokenTypes
+{
+#line 1 "ada.tree.g"
+#line 13 "AdaTreeParserSuper.hpp"
+public:
+ AdaTreeParserSuper();
+ static void initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory );
+ int getNumTokens() const
+ {
+ return AdaTreeParserSuper::NUM_TOKENS;
+ }
+ const char* getTokenName( int type ) const
+ {
+ if( type > getNumTokens() ) return 0;
+ return AdaTreeParserSuper::tokenNames[type];
+ }
+ const char* const* getTokenNames() const
+ {
+ return AdaTreeParserSuper::tokenNames;
+ }
+ public: void compilation_unit(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void context_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void library_item(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void subunit(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void pragma(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void pragma_arg(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void expression(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void with_clause(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void use_clause(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void compound_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void subtype_mark(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void attribute_id(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void modifiers(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void subprog_decl_or_rename_or_inst_or_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void def_id(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void pkg_body_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void generic_inst(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void pkg_spec_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void renames(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void generic_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void id_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void def_designator(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void end_id_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void subprog_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void formal_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void function_tail(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void value_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void value(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void ranged_expr_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void ranged_expr(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void simple_expression(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void range(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void range_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void range_dots(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void range_attrib_ref(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void prefix(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void parameter_specification(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void defining_identifier_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void init_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void name(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void definable_operator_symbol(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void parenthesized_primary(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void extension_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void spec_decl_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void basic_declarative_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void private_declarative_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void basic_decl_item(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void task_type_or_single_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void prot_type_or_single_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void decl_common(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discrim_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void task_definition_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void task_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void private_task_items_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discriminant_specifications(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discriminant_specification(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void entrydecls_repspecs_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void entry_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void rep_spec(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discrete_subtype_def_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discrete_subtype_definition(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void subtype_ind(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void align_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void comp_loc_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void local_enum_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void enumeration_aggregate(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void protected_definition(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void prot_private_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void prot_member_decl_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void prot_op_decl_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void prot_op_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void comp_decl(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void component_subtype_def(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void enum_id_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void range_constraint_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void array_type_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void access_type_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void id_and_discrim(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void record_definition(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void array_type_definition(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void enumeration_literal_specification(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void index_or_discrete_range_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void index_or_discrete_range(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void constraint_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void digits_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void delta_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void index_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discriminant_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discrete_range(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discriminant_association(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void selector_names_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void selector_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void component_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void component_items(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void variant_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discriminant_direct_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void variant_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void variant(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void choice_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void choice(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void discrete_with_range(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void mark_with_constraint(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void generic_formal_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void generic_formal_parameter(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void formal_array_type_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void formal_access_type_declaration(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void id_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void subprogram_default_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void formal_package_actual_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void procedure_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void function_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void body_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void declarative_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void block_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void declarative_item(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void prot_op_bodies_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void block_body_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void handled_stmt_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void entry_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void subprog_decl_or_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void statements(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void except_handler_part_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void handled_stmts_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void statement(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void def_label_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void null_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void exit_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void return_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void goto_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void delay_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void abort_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void raise_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void requeue_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void accept_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void select_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void if_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void case_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void loop_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void block(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void call_or_assignment(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void cond_clause(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void elsifs_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void else_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void condition(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void alternative_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void case_statement_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void iteration_scheme_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void declare_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void label_name(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void entry_body_formal_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void entry_barrier(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void entry_index_spec_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void entry_call_stmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void entry_index_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void triggering_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void abortable_part(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void selective_accept(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void entry_call_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void delay_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void stmts_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void guard_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void select_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void or_select_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void accept_alternative(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void exception_handler(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void identifier_colon_opt(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void except_choice_s(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void exception_choice(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void operator_call(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void relation(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void range_or_mark(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void signed_term(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void term(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void factor(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void primary(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void name_or_qualified(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void allocator(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void subprogram_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void package_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void task_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+ public: void protected_body(ANTLR_USE_NAMESPACE(antlr)RefAST _t);
+public:
+ ANTLR_USE_NAMESPACE(antlr)RefAST getAST()
+ {
+ return returnAST;
+ }
+
+protected:
+ ANTLR_USE_NAMESPACE(antlr)RefAST returnAST;
+ ANTLR_USE_NAMESPACE(antlr)RefAST _retTree;
+private:
+ static const char* tokenNames[];
+#ifndef NO_STATIC_CONSTS
+ static const int NUM_TOKENS = 291;
+#else
+ enum {
+ NUM_TOKENS = 291
+ };
+#endif
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+ static const unsigned long _tokenSet_2_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2;
+ static const unsigned long _tokenSet_3_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3;
+ static const unsigned long _tokenSet_4_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_4;
+};
+
+#endif /*INC_AdaTreeParserSuper_hpp_*/
diff --git a/languages/ada/AdaTreeParserSuperTokenTypes.hpp b/languages/ada/AdaTreeParserSuperTokenTypes.hpp
new file mode 100644
index 00000000..924b7415
--- /dev/null
+++ b/languages/ada/AdaTreeParserSuperTokenTypes.hpp
@@ -0,0 +1,307 @@
+#ifndef INC_AdaTreeParserSuperTokenTypes_hpp_
+#define INC_AdaTreeParserSuperTokenTypes_hpp_
+
+/* $ANTLR 2.7.7 (20070609): "ada.tree.g" -> "AdaTreeParserSuperTokenTypes.hpp"$ */
+
+#ifndef CUSTOM_API
+# define CUSTOM_API
+#endif
+
+#ifdef __cplusplus
+struct CUSTOM_API AdaTreeParserSuperTokenTypes {
+#endif
+ enum {
+ EOF_ = 1,
+ PRAGMA = 4,
+ IDENTIFIER = 5,
+ SEMI = 6,
+ LPAREN = 7,
+ COMMA = 8,
+ RPAREN = 9,
+ RIGHT_SHAFT = 10,
+ WITH = 11,
+ DOT = 12,
+ USE = 13,
+ TYPE = 14,
+ TIC = 15,
+ RANGE = 16,
+ DIGITS = 17,
+ DELTA = 18,
+ ACCESS = 19,
+ PRIVATE = 20,
+ PACKAGE = 21,
+ BODY = 22,
+ IS = 23,
+ PROCEDURE = 24,
+ FUNCTION = 25,
+ NEW = 26,
+ OTHERS = 27,
+ PIPE = 28,
+ DOT_DOT = 29,
+ ALL = 30,
+ COLON = 31,
+ IN = 32,
+ OUT = 33,
+ RENAMES = 34,
+ CHARACTER_LITERAL = 35,
+ CHAR_STRING = 36,
+ NuLL = 37,
+ RECORD = 38,
+ SEPARATE = 39,
+ ABSTRACT = 40,
+ RETURN = 41,
+ TASK = 42,
+ PROTECTED = 43,
+ BOX = 44,
+ ASSIGN = 45,
+ ENTRY = 46,
+ FOR = 47,
+ END = 48,
+ AT = 49,
+ MOD = 50,
+ SUBTYPE = 51,
+ EXCEPTION = 52,
+ CONSTANT = 53,
+ ARRAY = 54,
+ OF = 55,
+ ALIASED = 56,
+ CASE = 57,
+ WHEN = 58,
+ TAGGED = 59,
+ LIMITED = 60,
+ GENERIC = 61,
+ BEGIN = 62,
+ LT_LT = 63,
+ GT_GT = 64,
+ IF = 65,
+ THEN = 66,
+ ELSIF = 67,
+ ELSE = 68,
+ LOOP = 69,
+ WHILE = 70,
+ REVERSE = 71,
+ DECLARE = 72,
+ EXIT = 73,
+ GOTO = 74,
+ ACCEPT = 75,
+ DO = 76,
+ DELAY = 77,
+ UNTIL = 78,
+ SELECT = 79,
+ ABORT = 80,
+ OR = 81,
+ TERMINATE = 82,
+ RAISE = 83,
+ REQUEUE = 84,
+ AND = 85,
+ XOR = 86,
+ NOT = 87,
+ EQ = 88,
+ NE = 89,
+ LT_ = 90,
+ LE = 91,
+ GT = 92,
+ GE = 93,
+ PLUS = 94,
+ MINUS = 95,
+ CONCAT = 96,
+ STAR = 97,
+ DIV = 98,
+ REM = 99,
+ ABS = 100,
+ EXPON = 101,
+ NUMERIC_LIT = 102,
+ ABORTABLE_PART = 103,
+ ABORT_STATEMENT = 104,
+ ACCEPT_ALTERNATIVE = 105,
+ ACCEPT_STATEMENT = 106,
+ ALLOCATOR = 107,
+ ASSIGNMENT_STATEMENT = 108,
+ ASYNCHRONOUS_SELECT = 109,
+ ATTRIBUTE_DEFINITION_CLAUSE = 110,
+ AT_CLAUSE = 111,
+ BLOCK_STATEMENT = 112,
+ CASE_STATEMENT = 113,
+ CASE_STATEMENT_ALTERNATIVE = 114,
+ CODE_STATEMENT = 115,
+ COMPONENT_DECLARATION = 116,
+ CONDITIONAL_ENTRY_CALL = 117,
+ CONTEXT_CLAUSE = 118,
+ DECLARATIVE_PART = 119,
+ DEFINING_IDENTIFIER_LIST = 120,
+ DELAY_ALTERNATIVE = 121,
+ DELAY_STATEMENT = 122,
+ DELTA_CONSTRAINT = 123,
+ DIGITS_CONSTRAINT = 124,
+ DISCRIMINANT_ASSOCIATION = 125,
+ DISCRIMINANT_CONSTRAINT = 126,
+ DISCRIMINANT_SPECIFICATION = 127,
+ ENTRY_BODY = 128,
+ ENTRY_CALL_ALTERNATIVE = 129,
+ ENTRY_CALL_STATEMENT = 130,
+ ENTRY_DECLARATION = 131,
+ ENTRY_INDEX_SPECIFICATION = 132,
+ ENUMERATION_REPESENTATION_CLAUSE = 133,
+ EXCEPTION_DECLARATION = 134,
+ EXCEPTION_HANDLER = 135,
+ EXCEPTION_RENAMING_DECLARATION = 136,
+ EXIT_STATEMENT = 137,
+ FORMAL_PACKAGE_DECLARATION = 138,
+ GENERIC_FORMAL_PART = 139,
+ GENERIC_PACKAGE_DECLARATION = 140,
+ GOTO_STATEMENT = 141,
+ HANDLED_SEQUENCE_OF_STATEMENTS = 142,
+ HANDLED_STMTS_OPT = 143,
+ IF_STATEMENT = 144,
+ INCOMPLETE_TYPE_DECLARATION = 145,
+ INDEXED_COMPONENT = 146,
+ INDEX_CONSTRAINT = 147,
+ LIBRARY_ITEM = 148,
+ LOOP_STATEMENT = 149,
+ NAME = 150,
+ NULL_STATEMENT = 151,
+ NUMBER_DECLARATION = 152,
+ OBJECT_DECLARATION = 153,
+ OBJECT_RENAMING_DECLARATION = 154,
+ OPERATOR_SYMBOL = 155,
+ PACKAGE_BODY = 156,
+ PACKAGE_BODY_STUB = 157,
+ PACKAGE_RENAMING_DECLARATION = 158,
+ PACKAGE_SPECIFICATION = 159,
+ PARAMETER_SPECIFICATION = 160,
+ PRIVATE_EXTENSION_DECLARATION = 161,
+ PRIVATE_TYPE_DECLARATION = 162,
+ PROTECTED_BODY = 163,
+ PROTECTED_BODY_STUB = 164,
+ PROTECTED_TYPE_DECLARATION = 165,
+ RAISE_STATEMENT = 166,
+ RANGE_ATTRIBUTE_REFERENCE = 167,
+ RECORD_REPRESENTATION_CLAUSE = 168,
+ REQUEUE_STATEMENT = 169,
+ RETURN_STATEMENT = 170,
+ SELECTIVE_ACCEPT = 171,
+ SEQUENCE_OF_STATEMENTS = 172,
+ SINGLE_PROTECTED_DECLARATION = 173,
+ SINGLE_TASK_DECLARATION = 174,
+ STATEMENT = 175,
+ SUBTYPE_DECLARATION = 176,
+ SUBTYPE_INDICATION = 177,
+ SUBTYPE_MARK = 178,
+ SUBUNIT = 179,
+ TASK_BODY = 180,
+ TASK_BODY_STUB = 181,
+ TASK_TYPE_DECLARATION = 182,
+ TERMINATE_ALTERNATIVE = 183,
+ TIMED_ENTRY_CALL = 184,
+ TRIGGERING_ALTERNATIVE = 185,
+ USE_CLAUSE = 186,
+ USE_TYPE_CLAUSE = 187,
+ VARIANT = 188,
+ VARIANT_PART = 189,
+ WITH_CLAUSE = 190,
+ ABSTRACT_FUNCTION_DECLARATION = 191,
+ ABSTRACT_PROCEDURE_DECLARATION = 192,
+ ACCESS_TO_FUNCTION_DECLARATION = 193,
+ ACCESS_TO_OBJECT_DECLARATION = 194,
+ ACCESS_TO_PROCEDURE_DECLARATION = 195,
+ ARRAY_OBJECT_DECLARATION = 196,
+ ARRAY_TYPE_DECLARATION = 197,
+ AND_THEN = 198,
+ BASIC_DECLARATIVE_ITEMS_OPT = 199,
+ BLOCK_BODY = 200,
+ BLOCK_BODY_OPT = 201,
+ CALL_STATEMENT = 202,
+ COMPONENT_CLAUSES_OPT = 203,
+ COMPONENT_ITEMS = 204,
+ COND_CLAUSE = 205,
+ DECIMAL_FIXED_POINT_DECLARATION = 206,
+ DECLARE_OPT = 207,
+ DERIVED_RECORD_EXTENSION = 208,
+ DISCRETE_SUBTYPE_DEF_OPT = 209,
+ DISCRIMINANT_SPECIFICATIONS = 210,
+ DISCRIM_PART_OPT = 211,
+ ELSE_OPT = 212,
+ ELSIFS_OPT = 213,
+ END_ID_OPT = 214,
+ ENTRY_INDEX_OPT = 215,
+ ENUMERATION_TYPE_DECLARATION = 216,
+ EXCEPT_HANDLER_PART_OPT = 217,
+ EXTENSION_OPT = 218,
+ FLOATING_POINT_DECLARATION = 219,
+ FORMAL_DECIMAL_FIXED_POINT_DECLARATION = 220,
+ FORMAL_DISCRETE_TYPE_DECLARATION = 221,
+ FORMAL_FLOATING_POINT_DECLARATION = 222,
+ FORMAL_FUNCTION_DECLARATION = 223,
+ FORMAL_MODULAR_TYPE_DECLARATION = 224,
+ FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION = 225,
+ FORMAL_ORDINARY_FIXED_POINT_DECLARATION = 226,
+ FORMAL_PART_OPT = 227,
+ FORMAL_PRIVATE_EXTENSION_DECLARATION = 228,
+ FORMAL_PRIVATE_TYPE_DECLARATION = 229,
+ FORMAL_PROCEDURE_DECLARATION = 230,
+ FORMAL_SIGNED_INTEGER_TYPE_DECLARATION = 231,
+ FUNCTION_BODY = 232,
+ FUNCTION_BODY_STUB = 233,
+ FUNCTION_DECLARATION = 234,
+ FUNCTION_RENAMING_DECLARATION = 235,
+ GENERIC_FUNCTION_DECLARATION = 236,
+ GENERIC_FUNCTION_INSTANTIATION = 237,
+ GENERIC_FUNCTION_RENAMING = 238,
+ GENERIC_PACKAGE_INSTANTIATION = 239,
+ GENERIC_PACKAGE_RENAMING = 240,
+ GENERIC_PROCEDURE_DECLARATION = 241,
+ GENERIC_PROCEDURE_INSTANTIATION = 242,
+ GENERIC_PROCEDURE_RENAMING = 243,
+ GUARD_OPT = 244,
+ IDENTIFIER_COLON_OPT = 245,
+ ID_OPT = 246,
+ INIT_OPT = 247,
+ ITERATION_SCHEME_OPT = 248,
+ LABEL_OPT = 249,
+ MARK_WITH_CONSTRAINT = 250,
+ MODIFIERS = 251,
+ MODULAR_TYPE_DECLARATION = 252,
+ MOD_CLAUSE_OPT = 253,
+ NOT_IN = 254,
+ ORDINARY_DERIVED_TYPE_DECLARATION = 255,
+ ORDINARY_FIXED_POINT_DECLARATION = 256,
+ OR_ELSE = 257,
+ OR_SELECT_OPT = 258,
+ PARENTHESIZED_PRIMARY = 259,
+ PRIVATE_DECLARATIVE_ITEMS_OPT = 260,
+ PRIVATE_TASK_ITEMS_OPT = 261,
+ PROCEDURE_BODY = 262,
+ PROCEDURE_BODY_STUB = 263,
+ PROCEDURE_DECLARATION = 264,
+ PROCEDURE_RENAMING_DECLARATION = 265,
+ PROT_MEMBER_DECLARATIONS = 266,
+ PROT_OP_BODIES_OPT = 267,
+ PROT_OP_DECLARATIONS = 268,
+ PROT_PRIVATE_OPT = 269,
+ RANGED_EXPRS = 270,
+ RANGE_CONSTRAINT = 271,
+ RECORD_TYPE_DECLARATION = 272,
+ SELECTOR_NAMES_OPT = 273,
+ SIGNED_INTEGER_TYPE_DECLARATION = 274,
+ TASK_ITEMS_OPT = 275,
+ UNARY_MINUS = 276,
+ UNARY_PLUS = 277,
+ VALUE = 278,
+ VALUES = 279,
+ VARIANTS = 280,
+ COMMENT_INTRO = 281,
+ OX = 282,
+ TIC_OR_CHARACTER_LITERAL = 283,
+ DIGIT = 284,
+ EXPONENT = 285,
+ EXTENDED_DIGIT = 286,
+ BASED_INTEGER = 287,
+ WS_ = 288,
+ COMMENT = 289,
+ CHARACTER_STRING = 290,
+ NULL_TREE_LOOKAHEAD = 3
+ };
+#ifdef __cplusplus
+};
+#endif
+#endif /*INC_AdaTreeParserSuperTokenTypes_hpp_*/
diff --git a/languages/ada/AdaTreeParserSuperTokenTypes.txt b/languages/ada/AdaTreeParserSuperTokenTypes.txt
new file mode 100644
index 00000000..dfd0b0df
--- /dev/null
+++ b/languages/ada/AdaTreeParserSuperTokenTypes.txt
@@ -0,0 +1,289 @@
+// $ANTLR 2.7.7 (20070609): ada.tree.g -> AdaTreeParserSuperTokenTypes.txt$
+AdaTreeParserSuper // output token vocab name
+PRAGMA="pragma"=4
+IDENTIFIER=5
+SEMI=6
+LPAREN=7
+COMMA=8
+RPAREN=9
+RIGHT_SHAFT=10
+WITH="with"=11
+DOT=12
+USE="use"=13
+TYPE="type"=14
+TIC=15
+RANGE="range"=16
+DIGITS="digits"=17
+DELTA="delta"=18
+ACCESS="access"=19
+PRIVATE="private"=20
+PACKAGE="package"=21
+BODY="body"=22
+IS="is"=23
+PROCEDURE="procedure"=24
+FUNCTION="function"=25
+NEW="new"=26
+OTHERS="others"=27
+PIPE=28
+DOT_DOT=29
+ALL="all"=30
+COLON=31
+IN="in"=32
+OUT="out"=33
+RENAMES="renames"=34
+CHARACTER_LITERAL=35
+CHAR_STRING=36
+NuLL="null"=37
+RECORD="record"=38
+SEPARATE="separate"=39
+ABSTRACT="abstract"=40
+RETURN="return"=41
+TASK="task"=42
+PROTECTED="protected"=43
+BOX=44
+ASSIGN=45
+ENTRY="entry"=46
+FOR="for"=47
+END="end"=48
+AT="at"=49
+MOD="mod"=50
+SUBTYPE="subtype"=51
+EXCEPTION="exception"=52
+CONSTANT="constant"=53
+ARRAY="array"=54
+OF="of"=55
+ALIASED="aliased"=56
+CASE="case"=57
+WHEN="when"=58
+TAGGED="tagged"=59
+LIMITED="limited"=60
+GENERIC="generic"=61
+BEGIN="begin"=62
+LT_LT=63
+GT_GT=64
+IF="if"=65
+THEN="then"=66
+ELSIF="elsif"=67
+ELSE="else"=68
+LOOP="loop"=69
+WHILE="while"=70
+REVERSE="reverse"=71
+DECLARE="declare"=72
+EXIT="exit"=73
+GOTO="goto"=74
+ACCEPT="accept"=75
+DO="do"=76
+DELAY="delay"=77
+UNTIL="until"=78
+SELECT="select"=79
+ABORT="abort"=80
+OR="or"=81
+TERMINATE="terminate"=82
+RAISE="raise"=83
+REQUEUE="requeue"=84
+AND="and"=85
+XOR="xor"=86
+NOT="not"=87
+EQ=88
+NE=89
+LT_=90
+LE=91
+GT=92
+GE=93
+PLUS=94
+MINUS=95
+CONCAT=96
+STAR=97
+DIV=98
+REM="rem"=99
+ABS="abs"=100
+EXPON=101
+NUMERIC_LIT=102
+ABORTABLE_PART=103
+ABORT_STATEMENT=104
+ACCEPT_ALTERNATIVE=105
+ACCEPT_STATEMENT=106
+ALLOCATOR=107
+ASSIGNMENT_STATEMENT=108
+ASYNCHRONOUS_SELECT=109
+ATTRIBUTE_DEFINITION_CLAUSE=110
+AT_CLAUSE=111
+BLOCK_STATEMENT=112
+CASE_STATEMENT=113
+CASE_STATEMENT_ALTERNATIVE=114
+CODE_STATEMENT=115
+COMPONENT_DECLARATION=116
+CONDITIONAL_ENTRY_CALL=117
+CONTEXT_CLAUSE=118
+DECLARATIVE_PART=119
+DEFINING_IDENTIFIER_LIST=120
+DELAY_ALTERNATIVE=121
+DELAY_STATEMENT=122
+DELTA_CONSTRAINT=123
+DIGITS_CONSTRAINT=124
+DISCRIMINANT_ASSOCIATION=125
+DISCRIMINANT_CONSTRAINT=126
+DISCRIMINANT_SPECIFICATION=127
+ENTRY_BODY=128
+ENTRY_CALL_ALTERNATIVE=129
+ENTRY_CALL_STATEMENT=130
+ENTRY_DECLARATION=131
+ENTRY_INDEX_SPECIFICATION=132
+ENUMERATION_REPESENTATION_CLAUSE=133
+EXCEPTION_DECLARATION=134
+EXCEPTION_HANDLER=135
+EXCEPTION_RENAMING_DECLARATION=136
+EXIT_STATEMENT=137
+FORMAL_PACKAGE_DECLARATION=138
+GENERIC_FORMAL_PART=139
+GENERIC_PACKAGE_DECLARATION=140
+GOTO_STATEMENT=141
+HANDLED_SEQUENCE_OF_STATEMENTS=142
+HANDLED_STMTS_OPT=143
+IF_STATEMENT=144
+INCOMPLETE_TYPE_DECLARATION=145
+INDEXED_COMPONENT=146
+INDEX_CONSTRAINT=147
+LIBRARY_ITEM=148
+LOOP_STATEMENT=149
+NAME=150
+NULL_STATEMENT=151
+NUMBER_DECLARATION=152
+OBJECT_DECLARATION=153
+OBJECT_RENAMING_DECLARATION=154
+OPERATOR_SYMBOL=155
+PACKAGE_BODY=156
+PACKAGE_BODY_STUB=157
+PACKAGE_RENAMING_DECLARATION=158
+PACKAGE_SPECIFICATION=159
+PARAMETER_SPECIFICATION=160
+PRIVATE_EXTENSION_DECLARATION=161
+PRIVATE_TYPE_DECLARATION=162
+PROTECTED_BODY=163
+PROTECTED_BODY_STUB=164
+PROTECTED_TYPE_DECLARATION=165
+RAISE_STATEMENT=166
+RANGE_ATTRIBUTE_REFERENCE=167
+RECORD_REPRESENTATION_CLAUSE=168
+REQUEUE_STATEMENT=169
+RETURN_STATEMENT=170
+SELECTIVE_ACCEPT=171
+SEQUENCE_OF_STATEMENTS=172
+SINGLE_PROTECTED_DECLARATION=173
+SINGLE_TASK_DECLARATION=174
+STATEMENT=175
+SUBTYPE_DECLARATION=176
+SUBTYPE_INDICATION=177
+SUBTYPE_MARK=178
+SUBUNIT=179
+TASK_BODY=180
+TASK_BODY_STUB=181
+TASK_TYPE_DECLARATION=182
+TERMINATE_ALTERNATIVE=183
+TIMED_ENTRY_CALL=184
+TRIGGERING_ALTERNATIVE=185
+USE_CLAUSE=186
+USE_TYPE_CLAUSE=187
+VARIANT=188
+VARIANT_PART=189
+WITH_CLAUSE=190
+ABSTRACT_FUNCTION_DECLARATION=191
+ABSTRACT_PROCEDURE_DECLARATION=192
+ACCESS_TO_FUNCTION_DECLARATION=193
+ACCESS_TO_OBJECT_DECLARATION=194
+ACCESS_TO_PROCEDURE_DECLARATION=195
+ARRAY_OBJECT_DECLARATION=196
+ARRAY_TYPE_DECLARATION=197
+AND_THEN=198
+BASIC_DECLARATIVE_ITEMS_OPT=199
+BLOCK_BODY=200
+BLOCK_BODY_OPT=201
+CALL_STATEMENT=202
+COMPONENT_CLAUSES_OPT=203
+COMPONENT_ITEMS=204
+COND_CLAUSE=205
+DECIMAL_FIXED_POINT_DECLARATION=206
+DECLARE_OPT=207
+DERIVED_RECORD_EXTENSION=208
+DISCRETE_SUBTYPE_DEF_OPT=209
+DISCRIMINANT_SPECIFICATIONS=210
+DISCRIM_PART_OPT=211
+ELSE_OPT=212
+ELSIFS_OPT=213
+END_ID_OPT=214
+ENTRY_INDEX_OPT=215
+ENUMERATION_TYPE_DECLARATION=216
+EXCEPT_HANDLER_PART_OPT=217
+EXTENSION_OPT=218
+FLOATING_POINT_DECLARATION=219
+FORMAL_DECIMAL_FIXED_POINT_DECLARATION=220
+FORMAL_DISCRETE_TYPE_DECLARATION=221
+FORMAL_FLOATING_POINT_DECLARATION=222
+FORMAL_FUNCTION_DECLARATION=223
+FORMAL_MODULAR_TYPE_DECLARATION=224
+FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION=225
+FORMAL_ORDINARY_FIXED_POINT_DECLARATION=226
+FORMAL_PART_OPT=227
+FORMAL_PRIVATE_EXTENSION_DECLARATION=228
+FORMAL_PRIVATE_TYPE_DECLARATION=229
+FORMAL_PROCEDURE_DECLARATION=230
+FORMAL_SIGNED_INTEGER_TYPE_DECLARATION=231
+FUNCTION_BODY=232
+FUNCTION_BODY_STUB=233
+FUNCTION_DECLARATION=234
+FUNCTION_RENAMING_DECLARATION=235
+GENERIC_FUNCTION_DECLARATION=236
+GENERIC_FUNCTION_INSTANTIATION=237
+GENERIC_FUNCTION_RENAMING=238
+GENERIC_PACKAGE_INSTANTIATION=239
+GENERIC_PACKAGE_RENAMING=240
+GENERIC_PROCEDURE_DECLARATION=241
+GENERIC_PROCEDURE_INSTANTIATION=242
+GENERIC_PROCEDURE_RENAMING=243
+GUARD_OPT=244
+IDENTIFIER_COLON_OPT=245
+ID_OPT=246
+INIT_OPT=247
+ITERATION_SCHEME_OPT=248
+LABEL_OPT=249
+MARK_WITH_CONSTRAINT=250
+MODIFIERS=251
+MODULAR_TYPE_DECLARATION=252
+MOD_CLAUSE_OPT=253
+NOT_IN=254
+ORDINARY_DERIVED_TYPE_DECLARATION=255
+ORDINARY_FIXED_POINT_DECLARATION=256
+OR_ELSE=257
+OR_SELECT_OPT=258
+PARENTHESIZED_PRIMARY=259
+PRIVATE_DECLARATIVE_ITEMS_OPT=260
+PRIVATE_TASK_ITEMS_OPT=261
+PROCEDURE_BODY=262
+PROCEDURE_BODY_STUB=263
+PROCEDURE_DECLARATION=264
+PROCEDURE_RENAMING_DECLARATION=265
+PROT_MEMBER_DECLARATIONS=266
+PROT_OP_BODIES_OPT=267
+PROT_OP_DECLARATIONS=268
+PROT_PRIVATE_OPT=269
+RANGED_EXPRS=270
+RANGE_CONSTRAINT=271
+RECORD_TYPE_DECLARATION=272
+SELECTOR_NAMES_OPT=273
+SIGNED_INTEGER_TYPE_DECLARATION=274
+TASK_ITEMS_OPT=275
+UNARY_MINUS=276
+UNARY_PLUS=277
+VALUE=278
+VALUES=279
+VARIANTS=280
+COMMENT_INTRO=281
+OX=282
+TIC_OR_CHARACTER_LITERAL=283
+DIGIT=284
+EXPONENT=285
+EXTENDED_DIGIT=286
+BASED_INTEGER=287
+WS_=288
+COMMENT=289
+CHARACTER_STRING=290
diff --git a/languages/ada/Makefile.am b/languages/ada/Makefile.am
new file mode 100644
index 00000000..4a7eb0c1
--- /dev/null
+++ b/languages/ada/Makefile.am
@@ -0,0 +1,41 @@
+# Here resides the Ada support part.
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+
+INCLUDES = -I$(top_srcdir)/lib/antlr -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+SUBDIRS = app_templates file_templates doc
+
+
+kde_module_LTLIBRARIES = libkdevadasupport.la
+libkdevadasupport_la_LDFLAGS = $(LEXLIB) $(all_libraries) $(KDE_PLUGIN)
+libkdevadasupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la $(top_builddir)/lib/antlr/src/libantlr.la
+
+libkdevadasupport_la_SOURCES = adasupportpart.cpp problemreporter.cpp backgroundparser.cpp addclassdlg.ui addclass.cpp configproblemreporter.ui ada_utils.cpp adasupport.cpp AdaLexer.cpp AdaParser.cpp AdaTreeParserSuper.cpp AdaStoreWalker.cpp
+
+METASOURCES = AUTO
+
+EXTRA_DIST = ada.g ada.tree.g ada.store.g
+
+## The following three rules assume that you have Java installed,
+## ANTLR installed, and you have the antlr jar in your CLASSPATH.
+
+#AdaLexer.hpp AdaLexer.cpp AdaParser.hpp AdaParser.cpp: ada.g
+# antlr ada.g
+
+#AdaTreeParserSuper.hpp AdaTreeParserSuper.cpp: ada.tree.g
+# antlr ada.tree.g
+
+#AdaStoreWalker.hpp AdaStoreWalker.cpp: ada.store.g
+# antlr -glib ada.tree.g ada.store.g
+
+genparser:
+ antlr ada.g && antlr ada.tree.g && antlr -glib ada.tree.g ada.store.g
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevadasupport.desktop
+
+rcdir = $(kde_datadir)/kdevadasupport
+rc_DATA = kdevadasupport.rc
+
+KDE_OPTIONS = nofinal
diff --git a/languages/ada/README b/languages/ada/README
new file mode 100644
index 00000000..0146b60f
--- /dev/null
+++ b/languages/ada/README
@@ -0,0 +1 @@
+Please read the README.dox file. \ No newline at end of file
diff --git a/languages/ada/README.dox b/languages/ada/README.dox
new file mode 100644
index 00000000..e71e6d45
--- /dev/null
+++ b/languages/ada/README.dox
@@ -0,0 +1,31 @@
+/** \class AdaSupportPart
+Ada Language Support
+
+The ANTLR Ada core support files are:
+ - ada.g -- contains AdaLexer and AdaParser, requires AdaAST.hpp and adasupport.cpp
+ - ada.tree.g -- contains the AdaTreeParserSuper
+ - AdaAST.hpp -- definition of the AST node used by ada.g
+ - adasupport.hpp -- general purpose utilities
+ - adasupport.cpp -- implementation of general purpose utilities and implementation of AdaParser class methods from ada.g
+
+These are ANTLR master files.
+They only depend on the ANTLR C++ runtime support and on the C++ STL.
+They should be kept free of all other dependencies.
+In particular, they do not depend on Kdevelop, KDE, or Qt.
+
+In order to generate the parser by hand, antlr v2.7.2 is required.
+There are parser compilation errors with some gcc versions. To avoid
+them, replace file antlr/CppCodeGenerator.java in the antlr source code tree
+with the one from <a href="ftp://fara.cs.uni-potsdam.de/incoming/CppCodeGenerator.java.gz">ftp://fara.cs.uni-potsdam.de/incoming/CppCodeGenerator.java.gz</a>.
+
+\unmaintained This part is currently un-maintained.
+
+\authors <a href="mailto:okellogg AT users.sourceforge.net">Oliver Kellogg</a>
+\authors <a href="mailto:roberto AT kdevelop.org">Roberto Raggi</a>
+\authors <a href="mailto:cloudtemple AT mksat.net">Alexander Dymo</a>
+
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\requirement Ada compiler
+
+*/
diff --git a/languages/ada/ada.g b/languages/ada/ada.g
new file mode 100644
index 00000000..5f97952b
--- /dev/null
+++ b/languages/ada/ada.g
@@ -0,0 +1,1982 @@
+/*
+ * Ada95 Grammar for ANTLR, target language C++
+ *
+ * Copyright (C) 2003 Oliver M. Kellogg <okellogg@users.sourceforge.net>
+ * Modifications (C) 2005 Daniel Zuberbuehler <dzubi@users.sourceforge.net>
+ *
+ * Adapted from lexer9x.l/grammar9x.y,
+ *
+ ******* A YACC grammar for Ada 9X *********************************
+ * Copyright (C) Intermetrics, Inc. 1994 Cambridge, MA USA *
+ * Copying permitted if accompanied by this statement. *
+ * Derivative works are permitted if accompanied by this statement.*
+ * This grammar is thought to be correct as of May 1, 1994 *
+ * but as usual there is *no warranty* to that effect. *
+ *******************************************************************
+ *
+ * $Id$
+ *
+ * Not all rules from the Ada95 Reference Manual (RM) Annex P,
+ * Syntax Summary, are mirrored as rules here.
+ * The tree nodes follow the RM grammar as closely as sensible.
+ * This applies in particular to the terminals. OTOH, trivially
+ * reconstructable non-terminal rules are not reflected in the tree.
+ * FIXME: Document the exact rationale of the tree design.
+ *
+ */
+
+
+header "pre_include_hpp" {
+#include <antlr/SemanticException.hpp> // antlr wants this
+#include "AdaAST.hpp"
+#include "preambles.h"
+}
+
+options {
+ language="Cpp";
+}
+
+//-----------------------------------------------------------------------------
+// Define a Parser, calling it AdaParser
+//-----------------------------------------------------------------------------
+class AdaParser extends Parser;
+options {
+ k = 2; // token lookahead
+ exportVocab=Ada; // Call its vocabulary "Ada"
+ // codeGenMakeSwitchThreshold = 2; // Some optimizations
+ // codeGenBitsetTestThreshold = 3;
+ defaultErrorHandler = false; // Generate parser error handlers
+ buildAST = true;
+ ASTLabelType = "RefAdaAST";
+}
+
+{
+ ANTLR_PARSER_PREAMBLE
+
+public:
+ // Ada support stuff
+ void push_def_id (const RefAdaAST& defid);
+ const RefAdaAST& pop_def_id ();
+ bool end_id_matches_def_id (const RefAdaAST& endid);
+ bool definable_operator (const char *string); // operator_symbol sans "/="
+ bool is_operator_symbol (const char *string);
+}
+
+// Compilation Unit: This is the start rule for this parser.
+// The rules in this grammar are listed in the order in which
+// compilation_unit introduces them, depth first, with the
+// exception of the expression related rules which are listed
+// towards the end.
+compilation_unit
+ : context_items_opt ( library_item | subunit ) ( pragma )*
+ ;
+
+// The pragma related rules are pulled up here to get them out of the way.
+
+pragma : PRAGMA^ IDENTIFIER pragma_args_opt SEMI!
+ ;
+
+pragma_args_opt : ( LPAREN! pragma_arg ( COMMA! pragma_arg )* RPAREN! )?
+ ;
+
+pragma_arg : ( IDENTIFIER RIGHT_SHAFT^ )? expression
+ ;
+
+context_items_opt : ( pragma | with_clause | use_clause )*
+ { #context_items_opt =
+ #(#[CONTEXT_CLAUSE, "CONTEXT_CLAUSE"], #context_items_opt); }
+ // RM Annex P neglects pragmas; we include them.
+ // The node should really be named CONTEXT_ITEMS_OPT but we
+ // stick with the RM wording.
+ ;
+
+with_clause : w:WITH^ c_name_list SEMI!
+ { Set(#w, WITH_CLAUSE); }
+ ;
+
+c_name_list : compound_name ( COMMA! compound_name )*
+ ;
+
+compound_name : IDENTIFIER ( DOT^ IDENTIFIER )*
+ // Strangely, the RM never defines this rule, which however is
+ // required for tightening up the syntax of certain names
+ // (library unit names etc.)
+ ;
+
+use_clause : u:USE^
+ ( TYPE! subtype_mark ( COMMA! subtype_mark )*
+ { Set(#u, USE_TYPE_CLAUSE); }
+ | c_name_list { Set(#u, USE_CLAUSE); }
+ )
+ SEMI!
+ ;
+
+subtype_mark : compound_name ( TIC^ attribute_id )?
+ // { #subtype_mark = #(#[SUBTYPE_MARK, "SUBTYPE_MARK"], #subtype_mark); }
+ ;
+
+attribute_id : RANGE
+ | DIGITS
+ | DELTA
+ | ACCESS
+ | IDENTIFIER
+ ;
+
+library_item : private_opt
+ /* Slightly loose; PRIVATE can only precede
+ {generic|package|subprog}_decl.
+ Semantic check required to ensure it.*/
+ ( lib_pkg_spec_or_body
+ | subprog_decl_or_rename_or_inst_or_body[true]
+ | generic_decl[true]
+ )
+ { #library_item = #(#[LIBRARY_ITEM, "LIBRARY_ITEM"], #library_item); }
+ ;
+
+private_opt : ( PRIVATE )?
+ { #private_opt = #(#[MODIFIERS, "MODIFIERS"], #private_opt); }
+ ;
+
+lib_pkg_spec_or_body
+ : pkg:PACKAGE^
+ ( BODY! def_id[true] IS! pkg_body_part SEMI!
+ { Set(#pkg, PACKAGE_BODY); }
+ | def_id[true] spec_decl_part[#pkg]
+ )
+ ;
+
+subprog_decl [boolean lib_level]
+ { RefAdaAST t; }
+ : p:PROCEDURE^ def_id[lib_level]
+ ( generic_subp_inst
+ { Set(#p, GENERIC_PROCEDURE_INSTANTIATION); }
+ | formal_part_opt
+ ( renames { Set(#p, PROCEDURE_RENAMING_DECLARATION); }
+ | is_separate_or_abstract_or_decl[#p]
+ )
+ SEMI!
+ )
+ | f:FUNCTION^ def_designator[lib_level]
+ ( generic_subp_inst
+ { Set(#f, GENERIC_FUNCTION_INSTANTIATION); }
+ | function_tail
+ ( renames { Set(#f, FUNCTION_RENAMING_DECLARATION); }
+ | is_separate_or_abstract_or_decl[#f]
+ )
+ SEMI!
+ )
+ ;
+
+def_id [boolean lib_level]
+ : { lib_level }? cn:compound_name { push_def_id(#cn); }
+ | { !lib_level }? n:IDENTIFIER { push_def_id(#n); }
+ ;
+
+generic_subp_inst : IS! generic_inst SEMI!
+ ;
+
+generic_inst : NEW! compound_name ( LPAREN! value_s RPAREN! )?
+ { pop_def_id(); }
+ ;
+
+parenth_values : LPAREN! value ( COMMA! value )* RPAREN!
+ ;
+
+value : ( OTHERS^ RIGHT_SHAFT! expression
+ | ranged_expr_s ( RIGHT_SHAFT^ expression )?
+ )
+ // { #value = #(#[VALUE, "VALUE"], #value); }
+ ;
+
+ranged_expr_s : ranged_expr ( PIPE^ ranged_expr )*
+ // { #ranged_expr_s =
+ // #(#[RANGED_EXPRS, "RANGED_EXPRS"], #ranged_expr_s); }
+ ;
+
+ranged_expr : expression
+ ( DOT_DOT^ simple_expression
+ | RANGE^ range
+ )?
+ ;
+
+range_constraint : r:RANGE^ range
+ { Set(#r, RANGE_CONSTRAINT); }
+ ;
+
+range : ( (range_dots) => range_dots
+ | range_attrib_ref
+ )
+ // Current assumption is we don't need an extra node for range,
+ // otherwise uncomment the following line:
+ // { #range = #(#[RANGE_EXPR, "RANGE_EXPR"], #range); }
+ ;
+
+range_dots : simple_expression DOT_DOT^ simple_expression
+ ;
+
+range_attrib_ref : // "name TIC RANGE" is ambiguous; instead:
+ prefix TIC! r:RANGE^ ( LPAREN! expression RPAREN! )?
+ { Set(#r, RANGE_ATTRIBUTE_REFERENCE); }
+ ;
+
+// Here, the definition of `prefix' deviates from the RM.
+// This gives us some more strictness than `name' (which the RM uses to
+// define `prefix'.)
+prefix : IDENTIFIER
+ ( DOT^ ( ALL | IDENTIFIER )
+ | p:LPAREN^ value_s RPAREN!
+ { Set(#p, INDEXED_COMPONENT); }
+ )*
+ ;
+
+formal_part_opt : ( LPAREN! parameter_specification
+ ( SEMI! parameter_specification )*
+ RPAREN! )?
+ { #formal_part_opt = #([FORMAL_PART_OPT, "FORMAL_PART_OPT"],
+ #formal_part_opt); }
+ ;
+
+parameter_specification : def_ids_colon mode_opt subtype_mark init_opt
+ { #parameter_specification =
+ #(#[PARAMETER_SPECIFICATION,
+ "PARAMETER_SPECIFICATION"], #parameter_specification); }
+ ;
+
+def_ids_colon : defining_identifier_list COLON!
+ ;
+
+defining_identifier_list : IDENTIFIER ( COMMA! IDENTIFIER )*
+ { #defining_identifier_list =
+ #(#[DEFINING_IDENTIFIER_LIST,
+ "DEFINING_IDENTIFIER_LIST"], #defining_identifier_list); }
+ ;
+
+mode_opt : ( IN ( OUT )? | OUT | ACCESS )?
+ { #mode_opt = #(#[MODIFIERS, "MODIFIERS"], #mode_opt); }
+ ;
+
+renames { RefAdaAST dummy; }
+ : RENAMES! ( name
+ | dummy=definable_operator_symbol
+ )
+ { pop_def_id(); }
+ ;
+
+name { RefAdaAST dummy; }
+ : IDENTIFIER
+ ( DOT^ ( ALL
+ | IDENTIFIER
+ | CHARACTER_LITERAL
+ | dummy=is_operator
+ )
+ | p:LPAREN^ value_s RPAREN!
+ { Set(#p, INDEXED_COMPONENT); }
+ | TIC^ attribute_id // must be in here because of e.g.
+ // Character'Pos (x)
+ )*
+ // { #name = #(#[NAME, "NAME"], #name); }
+ ;
+
+is_operator returns [RefAdaAST d]
+ : { is_operator_symbol(LT(1)->getText().c_str()) }?
+ op:CHAR_STRING { #op->setType(OPERATOR_SYMBOL); d=#op; }
+ ;
+
+definable_operator_symbol returns [RefAdaAST d]
+ : { definable_operator(LT(1)->getText().c_str()) }?
+ op:CHAR_STRING { #op->setType(OPERATOR_SYMBOL); d=#op; }
+ ;
+
+parenthesized_primary : pp:LPAREN^
+ ( NuLL RECORD!
+ | value_s extension_opt
+ )
+ RPAREN!
+ { Set(#pp, PARENTHESIZED_PRIMARY); }
+ ;
+
+extension_opt : ( WITH! ( NuLL RECORD! | value_s ) )?
+ { #extension_opt =
+ #(#[EXTENSION_OPT, "EXTENSION_OPT"], #extension_opt); }
+ ;
+
+is_separate_or_abstract_or_decl! [RefAdaAST t]
+ : IS! separate_or_abstract[t]
+ | { pop_def_id();
+ if (t->getType() == AdaTokenTypes::PROCEDURE)
+ Set(t, PROCEDURE_DECLARATION);
+ else
+ Set(t, FUNCTION_DECLARATION);
+ }
+ ;
+
+separate_or_abstract! [RefAdaAST t]
+ : SEPARATE!
+ { pop_def_id();
+ if (t->getType() == AdaTokenTypes::PROCEDURE)
+ Set(t, PROCEDURE_BODY_STUB);
+ else
+ Set(t, FUNCTION_BODY_STUB);
+ }
+ | ABSTRACT!
+ { pop_def_id();
+ if (t->getType() == AdaTokenTypes::PROCEDURE)
+ Set(t, ABSTRACT_PROCEDURE_DECLARATION);
+ else
+ Set(t, ABSTRACT_FUNCTION_DECLARATION);
+ }
+ ;
+
+def_designator [boolean lib_level]
+ { RefAdaAST d; }
+ : { lib_level }? n:compound_name { push_def_id(#n); }
+ | { !lib_level }? d=designator { push_def_id(d); }
+ ;
+
+designator returns [RefAdaAST d]
+ { RefAdaAST op; }
+ : op=definable_operator_symbol { d = op; }
+ | n:IDENTIFIER { d = #n; }
+ ;
+
+function_tail : func_formal_part_opt RETURN! subtype_mark
+ ;
+
+// formal_part_opt is not strict enough for functions, i.e. it permits
+// "in out" and "out" as modes, thus we make an extra rule:
+func_formal_part_opt : ( LPAREN! func_param ( SEMI! func_param )* RPAREN! )?
+ { #func_formal_part_opt =
+ #([FORMAL_PART_OPT,
+ "FORMAL_PART_OPT"], #func_formal_part_opt); }
+ ;
+
+func_param : def_ids_colon in_access_opt subtype_mark init_opt
+ { #func_param =
+ #(#[PARAMETER_SPECIFICATION,
+ "PARAMETER_SPECIFICATION"], #func_param); }
+ ;
+
+in_access_opt : ( IN | ACCESS )?
+ { #in_access_opt = #(#[MODIFIERS, "MODIFIERS"], #in_access_opt); }
+ ;
+
+spec_decl_part [RefAdaAST pkg]
+ : ( IS! ( generic_inst { Set(pkg, GENERIC_PACKAGE_INSTANTIATION); }
+ | pkg_spec_part { Set(pkg, PACKAGE_SPECIFICATION); }
+ )
+ | renames { Set(pkg, PACKAGE_RENAMING_DECLARATION); }
+ )
+ SEMI!
+ ;
+
+pkg_spec_part : basic_declarative_items_opt
+ private_declarative_items_opt
+ end_id_opt
+ ;
+
+private_declarative_items_opt : ( PRIVATE! ( basic_decl_item | pragma )* )?
+ { #private_declarative_items_opt =
+ #(#[PRIVATE_DECLARATIVE_ITEMS_OPT,
+ "PRIVATE_DECLARATIVE_ITEMS_OPT"],
+ #private_declarative_items_opt); }
+ ;
+
+basic_declarative_items_opt : ( basic_decl_item | pragma )*
+ { #basic_declarative_items_opt =
+ #(#[BASIC_DECLARATIVE_ITEMS_OPT,
+ "BASIC_DECLARATIVE_ITEMS_OPT"],
+ #basic_declarative_items_opt); }
+ ;
+
+basic_declarative_items : ( basic_decl_item | pragma )+
+ { #basic_declarative_items =
+ #(#[BASIC_DECLARATIVE_ITEMS_OPT,
+ "BASIC_DECLARATIVE_ITEMS_OPT"],
+ #basic_declarative_items); }
+ ;
+
+basic_decl_item
+ : pkg:PACKAGE^ def_id[false] spec_decl_part[#pkg]
+ | tsk:TASK^ task_type_or_single_decl[#tsk]
+ | pro:PROTECTED^ prot_type_or_single_decl[#pro] SEMI!
+ | subprog_decl[false]
+ | decl_common
+ ;
+
+task_type_or_single_decl [RefAdaAST tsk]
+ : TYPE! def_id[false] discrim_part_opt task_definition_opt
+ { Set(tsk, TASK_TYPE_DECLARATION); }
+ | def_id[false] task_definition_opt
+ { Set(tsk, SINGLE_TASK_DECLARATION); }
+ ;
+
+task_definition_opt
+ : IS! task_items_opt private_task_items_opt end_id_opt SEMI!
+ | SEMI! { pop_def_id(); }
+ ;
+
+discrim_part_opt
+ : ( discrim_part_text )?
+ { #discrim_part_opt =
+ #(#[DISCRIM_PART_OPT,
+ "DISCRIM_PART_OPT"], #discrim_part_opt); }
+ ;
+
+discrim_part_text : LPAREN! (BOX | discriminant_specifications) RPAREN!
+ ;
+
+known_discrim_part
+ : LPAREN! discriminant_specifications RPAREN!
+ { #known_discrim_part =
+ #(#[DISCRIM_PART_OPT,
+ "DISCRIM_PART_OPT"], #known_discrim_part); }
+ ;
+
+empty_discrim_opt : /* empty */
+ { #empty_discrim_opt =
+ #(#[DISCRIM_PART_OPT,
+ "DISCRIM_PART_OPT"], #empty_discrim_opt); }
+ ;
+
+discrim_part
+ : discrim_part_text
+ { #discrim_part =
+ #(#[DISCRIM_PART_OPT,
+ "DISCRIM_PART_OPT"], #discrim_part); }
+ ;
+
+discriminant_specifications : discriminant_specification
+ ( SEMI! discriminant_specification )*
+ { #discriminant_specifications =
+ #(#[DISCRIMINANT_SPECIFICATIONS,
+ "DISCRIMINANT_SPECIFICATIONS"],
+ #discriminant_specifications); }
+ ;
+
+discriminant_specification : def_ids_colon access_opt subtype_mark init_opt
+ { #discriminant_specification =
+ #(#[DISCRIMINANT_SPECIFICATION,
+ "DISCRIMINANT_SPECIFICATION"],
+ #discriminant_specification); }
+ ;
+
+access_opt : ( ACCESS )?
+ { #access_opt = #(#[MODIFIERS, "MODIFIERS"], #access_opt); }
+ ;
+
+init_opt : ( ASSIGN! expression )?
+ { #init_opt = #(#[INIT_OPT, "INIT_OPT"], #init_opt); }
+ ; // `expression' is of course much too loose;
+ // semantic checks are required in the usage contexts.
+
+task_items_opt : ( pragma )* entrydecls_repspecs_opt
+ { #task_items_opt =
+ #(#[TASK_ITEMS_OPT, "TASK_ITEMS_OPT"], #task_items_opt); }
+ ;
+
+entrydecls_repspecs_opt : ( entry_declaration ( pragma | rep_spec )* )*
+ ;
+
+entry_declaration : e:ENTRY^ IDENTIFIER
+ discrete_subtype_def_opt formal_part_opt SEMI!
+ { Set (#e, ENTRY_DECLARATION); }
+ ;
+
+discrete_subtype_def_opt : ( (LPAREN discrete_subtype_definition RPAREN) =>
+ LPAREN! discrete_subtype_definition RPAREN!
+ | /* empty */
+ )
+ { #discrete_subtype_def_opt =
+ #(#[DISCRETE_SUBTYPE_DEF_OPT,
+ "DISCRETE_SUBTYPE_DEF_OPT"], #discrete_subtype_def_opt); }
+ ;
+
+discrete_subtype_definition : ( (range) => range
+ | subtype_ind
+ )
+ // Looks alot like discrete_range, but it's not
+ // (as soon as we start doing semantics.)
+ /* TBC: No need for extra node, just use the inner nodes?
+ { #discrete_subtype_definition =
+ #(#[DISCRETE_SUBTYPE_DEFINITION,
+ "DISCRETE_SUBTYPE_DEFINITION"],
+ #discrete_subtype_definition); }
+ */
+ ;
+
+rep_spec : r:FOR^ subtype_mark USE! rep_spec_part[#r] SEMI!
+ ;
+
+rep_spec_part [RefAdaAST t]
+ : RECORD! align_opt comp_loc_s END! RECORD! // record_type_spec
+ { Set(t, RECORD_REPRESENTATION_CLAUSE); }
+ | AT! expression // address_spec (Ada83)
+ { Set(t, AT_CLAUSE); }
+ | expression // attrib_def. Semantic check must ensure that the
+ // respective subtype_mark contains an attribute reference.
+ { Set(t, ATTRIBUTE_DEFINITION_CLAUSE); }
+ ;
+
+align_opt : ( AT! MOD! expression SEMI! )?
+ { #align_opt = #(#[MOD_CLAUSE_OPT, "MOD_CLAUSE_OPT"], #align_opt); }
+ ;
+
+comp_loc_s : ( pragma | subtype_mark AT! expression RANGE! range SEMI! )*
+ { #comp_loc_s = #(#[COMPONENT_CLAUSES_OPT, "COMPONENT_CLAUSES_OPT"],
+ #comp_loc_s); }
+ ;
+
+private_task_items_opt : ( PRIVATE! ( pragma )* entrydecls_repspecs_opt )?
+ { #private_task_items_opt =
+ #(#[PRIVATE_TASK_ITEMS_OPT,
+ "PRIVATE_TASK_ITEMS_OPT"], #private_task_items_opt); }
+ // Maybe we could just reuse TASK_ITEMS_OPT here instead of
+ // making a separate node type.
+ ;
+
+prot_type_or_single_decl [RefAdaAST pro]
+ : TYPE! def_id[false] discrim_part_opt protected_definition
+ { Set(pro, PROTECTED_TYPE_DECLARATION); }
+ | def_id[false] protected_definition
+ { Set(pro, SINGLE_PROTECTED_DECLARATION); }
+ ;
+
+prot_private_opt : ( PRIVATE! ( prot_op_decl | comp_decl )* )?
+ { #prot_private_opt =
+ #(#[PROT_PRIVATE_OPT,
+ "PROT_PRIVATE_OPT"], #prot_private_opt); }
+ ;
+
+protected_definition
+ : IS! prot_op_decl_s prot_private_opt end_id_opt
+ ;
+
+prot_op_decl_s : ( prot_op_decl )*
+ { #prot_op_decl_s = #(#[PROT_OP_DECLARATIONS,
+ "PROT_OP_DECLARATIONS"], #prot_op_decl_s); }
+ ;
+
+prot_op_decl : entry_declaration
+ | p:PROCEDURE^ def_id[false] formal_part_opt SEMI!
+ { pop_def_id(); Set(#p, PROCEDURE_DECLARATION); }
+ | f:FUNCTION^ def_designator[false] function_tail SEMI!
+ { pop_def_id(); Set(#f, FUNCTION_DECLARATION); }
+ | rep_spec
+ | pragma
+ ;
+
+prot_member_decl_s : ( prot_op_decl | comp_decl )*
+ { #prot_member_decl_s =
+ #(#[PROT_MEMBER_DECLARATIONS,
+ "PROT_MEMBER_DECLARATIONS"], #prot_member_decl_s); }
+ ;
+
+comp_decl : def_ids_colon component_subtype_def init_opt SEMI!
+ { #comp_decl =
+ #(#[COMPONENT_DECLARATION,
+ "COMPONENT_DECLARATION"], #comp_decl); }
+ ;
+
+// decl_common is shared between declarative_item and basic_decl_item.
+// decl_common only contains specifications.
+decl_common
+ : t:TYPE^ IDENTIFIER
+ ( IS! type_def[#t]
+ | ( discrim_part
+ ( IS! derived_or_private_or_record[#t, true]
+ | { Set(#t, INCOMPLETE_TYPE_DECLARATION); }
+ )
+ | empty_discrim_opt
+ { Set(#t, INCOMPLETE_TYPE_DECLARATION); }
+ // NB: In this case, the discrim_part_opt does not
+ // appear in the INCOMPLETE_TYPE_DECLARATION node.
+ )
+ /* The artificial derived_or_private_or_record rule
+ gives us some syntax-level control over where a
+ discrim_part may appear.
+ However, a semantic check is still necessary to make
+ sure the discrim_part is not given for a derived type
+ of an elementary type, or for the full view of a
+ private type that turns out to be such. */
+ )
+ SEMI!
+ | s:SUBTYPE^ IDENTIFIER IS! subtype_ind SEMI! // subtype_decl
+ { Set(#s, SUBTYPE_DECLARATION); }
+ | generic_decl[false]
+ | use_clause
+ | r:FOR^ ( (local_enum_name USE LPAREN) => local_enum_name USE!
+ enumeration_aggregate
+ { Set(#r, ENUMERATION_REPESENTATION_CLAUSE); }
+ | subtype_mark USE! rep_spec_part[#r]
+ )
+ SEMI!
+ | (IDENTIFIER COLON EXCEPTION RENAMES) =>
+ IDENTIFIER erd:COLON^ EXCEPTION! RENAMES! compound_name SEMI!
+ { Set(#erd, EXCEPTION_RENAMING_DECLARATION); }
+ | (IDENTIFIER COLON subtype_mark RENAMES) =>
+ IDENTIFIER ord:COLON^ subtype_mark RENAMES! name SEMI!
+ { Set(#ord, OBJECT_RENAMING_DECLARATION); }
+ | defining_identifier_list od:COLON^ // object_declaration
+ ( EXCEPTION!
+ { Set(#od, EXCEPTION_DECLARATION); }
+ | (CONSTANT ASSIGN) => CONSTANT! ASSIGN! expression
+ { Set(#od, NUMBER_DECLARATION); }
+ | aliased_constant_opt
+ ( array_type_definition[#od] init_opt
+ { Set(#od, ARRAY_OBJECT_DECLARATION); }
+ // Not an RM rule, but simplifies distinction
+ // from the non-array object_declaration.
+ | subtype_ind init_opt
+ { Set(#od, OBJECT_DECLARATION); }
+ )
+ )
+ SEMI!
+ ;
+
+type_def [RefAdaAST t]
+ : LPAREN! enum_id_s RPAREN!
+ { Set(t, ENUMERATION_TYPE_DECLARATION); }
+ | RANGE! range
+ { Set(t, SIGNED_INTEGER_TYPE_DECLARATION); }
+ | MOD! expression
+ { Set(t, MODULAR_TYPE_DECLARATION); }
+ | DIGITS! expression range_constraint_opt
+ { Set(t, FLOATING_POINT_DECLARATION); }
+ | DELTA! expression
+ ( RANGE! range
+ { Set(t, ORDINARY_FIXED_POINT_DECLARATION); }
+ | DIGITS! expression range_constraint_opt
+ { Set(t, DECIMAL_FIXED_POINT_DECLARATION); }
+ )
+ | array_type_definition[t]
+ | access_type_definition[t]
+ | empty_discrim_opt derived_or_private_or_record[t, false]
+ ;
+
+enum_id_s : enumeration_literal_specification
+ ( COMMA! enumeration_literal_specification )*
+ ;
+
+enumeration_literal_specification : IDENTIFIER | CHARACTER_LITERAL
+ ;
+
+range_constraint_opt : ( range_constraint )?
+ ;
+
+array_type_definition [RefAdaAST t]
+ : ARRAY! LPAREN! index_or_discrete_range_s RPAREN!
+ OF! component_subtype_def
+ { Set(t, ARRAY_TYPE_DECLARATION); }
+ ;
+
+index_or_discrete_range_s
+ : index_or_discrete_range ( COMMA^ index_or_discrete_range )*
+ ;
+
+index_or_discrete_range
+ : simple_expression
+ ( DOT_DOT^ simple_expression // constrained
+ | RANGE^ ( BOX // unconstrained
+ | range // constrained
+ )
+ )?
+ ;
+
+component_subtype_def : aliased_opt subtype_ind
+ ;
+
+aliased_opt : ( ALIASED )?
+ { #aliased_opt = #(#[MODIFIERS, "MODIFIERS"], #aliased_opt); }
+ ;
+
+subtype_ind : subtype_mark constraint_opt
+ { #subtype_ind = #(#[SUBTYPE_INDICATION, "SUBTYPE_INDICATION"],
+ #subtype_ind); }
+ ;
+
+constraint_opt : ( range_constraint
+ | digits_constraint
+ | delta_constraint
+ | (index_constraint) => index_constraint
+ | discriminant_constraint
+ )?
+ ;
+
+digits_constraint : d:DIGITS^ expression range_constraint_opt
+ { Set(#d, DIGITS_CONSTRAINT); }
+ ;
+
+delta_constraint : d:DELTA^ expression range_constraint_opt
+ { Set(#d, DELTA_CONSTRAINT); }
+ ;
+
+index_constraint : p:LPAREN^ discrete_range ( COMMA! discrete_range )* RPAREN!
+ { Set(#p, INDEX_CONSTRAINT); }
+ ;
+
+discrete_range
+ : (range) => range
+ | subtype_ind
+ ;
+
+discriminant_constraint : p:LPAREN^ discriminant_association
+ ( COMMA! discriminant_association )* RPAREN!
+ { Set(#p, DISCRIMINANT_CONSTRAINT); }
+ ;
+
+discriminant_association : selector_names_opt expression
+ { #discriminant_association =
+ #(#[DISCRIMINANT_ASSOCIATION,
+ "DISCRIMINANT_ASSOCIATION"], #discriminant_association); }
+ ;
+
+selector_names_opt : ( (association_head) => association_head
+ | /* empty */
+ )
+ { #selector_names_opt =
+ #(#[SELECTOR_NAMES_OPT,
+ "SELECTOR_NAMES_OPT"], #selector_names_opt); }
+ ;
+
+association_head : selector_name ( PIPE! selector_name )* RIGHT_SHAFT!
+ ;
+
+selector_name : IDENTIFIER // TBD: sem pred
+ ;
+
+access_type_definition [RefAdaAST t]
+ : ACCESS!
+ ( protected_opt
+ ( PROCEDURE! formal_part_opt
+ { Set(t, ACCESS_TO_PROCEDURE_DECLARATION); }
+ | FUNCTION! func_formal_part_opt RETURN! subtype_mark
+ { Set(t, ACCESS_TO_FUNCTION_DECLARATION); }
+ )
+ | constant_all_opt subtype_ind
+ { Set(t, ACCESS_TO_OBJECT_DECLARATION); }
+ )
+ ;
+
+protected_opt : ( PROTECTED )?
+ { #protected_opt = #(#[MODIFIERS, "MODIFIERS"], #protected_opt); }
+ ;
+
+constant_all_opt : ( CONSTANT | ALL )?
+ { #constant_all_opt =
+ #(#[MODIFIERS, "MODIFIERS"], #constant_all_opt); }
+ ;
+
+derived_or_private_or_record [RefAdaAST t, boolean has_discrim]
+ : ( ( ABSTRACT )? NEW subtype_ind WITH ) =>
+ abstract_opt NEW! subtype_ind WITH!
+ ( PRIVATE! { Set(t, PRIVATE_EXTENSION_DECLARATION); }
+ | record_definition[has_discrim]
+ { Set(t, DERIVED_RECORD_EXTENSION); }
+ )
+ | NEW! subtype_ind { Set(t, ORDINARY_DERIVED_TYPE_DECLARATION); }
+ | abstract_tagged_limited_opt
+ ( PRIVATE! { Set(t, PRIVATE_TYPE_DECLARATION); }
+ | record_definition[has_discrim]
+ { Set(t, RECORD_TYPE_DECLARATION); }
+ )
+ ;
+
+abstract_opt : ( ABSTRACT )?
+ { #abstract_opt = #(#[MODIFIERS, "MODIFIERS"], #abstract_opt); }
+ ;
+
+record_definition [boolean has_discrim]
+ : RECORD! component_list[has_discrim] END! RECORD!
+ | NuLL! RECORD! // Thus the component_list is optional in the tree.
+ ;
+
+component_list [boolean has_discrim]
+ : NuLL! SEMI! // Thus the component_list is optional in the tree.
+ | component_items ( variant_part { has_discrim }? )?
+ | empty_component_items variant_part { has_discrim }?
+ ;
+
+component_items : ( pragma | comp_decl )+
+ { #component_items =
+ #(#[COMPONENT_ITEMS,
+ "COMPONENT_ITEMS"], #component_items); }
+ ;
+
+empty_component_items :
+ { #empty_component_items =
+ #(#[COMPONENT_ITEMS,
+ "COMPONENT_ITEMS"], #empty_component_items); }
+ ;
+
+variant_part : c:CASE^ discriminant_direct_name IS! variant_s END! CASE! SEMI!
+ { Set (#c, VARIANT_PART); }
+ ;
+
+discriminant_direct_name : IDENTIFIER // TBD: symtab lookup.
+ ;
+
+variant_s : ( variant )+
+ { #variant_s = #(#[VARIANTS, "VARIANTS"], #variant_s); }
+ ;
+
+variant : w:WHEN^ choice_s RIGHT_SHAFT! component_list[true]
+ { Set (#w, VARIANT); }
+ ;
+
+choice_s : choice ( PIPE^ choice )*
+ ;
+
+choice : OTHERS
+ | (discrete_with_range) => discrete_with_range
+ | expression // ( DOT_DOT^ simple_expression )?
+ ; // No, that's already in discrete_with_range
+
+discrete_with_range : (mark_with_constraint) => mark_with_constraint
+ | range
+ ;
+
+mark_with_constraint : subtype_mark range_constraint
+ { #mark_with_constraint =
+ #(#[MARK_WITH_CONSTRAINT,
+ "MARK_WITH_CONSTRAINT"], #mark_with_constraint); }
+ ;
+
+abstract_tagged_limited_opt
+ : ( ABSTRACT TAGGED! | TAGGED )?
+ ( LIMITED )?
+ { #abstract_tagged_limited_opt =
+ #(#[MODIFIERS, "MODIFIERS"], #abstract_tagged_limited_opt); }
+ ;
+
+local_enum_name : IDENTIFIER // to be refined: do a symbol table lookup
+ ;
+
+enumeration_aggregate : parenth_values
+ ;
+
+aliased_constant_opt : ( ALIASED )? ( CONSTANT )?
+ { #aliased_constant_opt =
+ #(#[MODIFIERS, "MODIFIERS"], #aliased_constant_opt); }
+ ;
+
+generic_decl [boolean lib_level]
+ : g:GENERIC^ generic_formal_part_opt
+ ( PACKAGE! def_id[lib_level]
+ ( renames { Set(#g, GENERIC_PACKAGE_RENAMING); }
+ | IS! pkg_spec_part { Set(#g, GENERIC_PACKAGE_DECLARATION); }
+ )
+ | PROCEDURE! def_id[lib_level] formal_part_opt
+ ( renames { Set(#g, GENERIC_PROCEDURE_RENAMING); }
+ // ^^^ Semantic check must ensure that the (generic_formal)*
+ // after GENERIC is not given here.
+ | { Set(#g, GENERIC_PROCEDURE_DECLARATION); pop_def_id(); }
+ )
+ | FUNCTION! def_designator[lib_level] function_tail
+ ( renames { Set(#g, GENERIC_FUNCTION_RENAMING); }
+ // ^^^ Semantic check must ensure that the (generic_formal)*
+ // after GENERIC is not given here.
+ | { Set(#g, GENERIC_FUNCTION_DECLARATION); pop_def_id(); }
+ )
+ )
+ SEMI!
+ ;
+
+generic_formal_part_opt : ( use_clause | pragma | generic_formal_parameter )*
+ { #generic_formal_part_opt =
+ #(#[GENERIC_FORMAL_PART,
+ "GENERIC_FORMAL_PART"],
+ #generic_formal_part_opt); }
+ ;
+
+generic_formal_parameter :
+ ( t:TYPE^ def_id[false]
+ ( IS!
+ ( LPAREN! BOX! RPAREN!
+ { Set (#t, FORMAL_DISCRETE_TYPE_DECLARATION); }
+ | RANGE! BOX!
+ { Set (#t, FORMAL_SIGNED_INTEGER_TYPE_DECLARATION); }
+ | MOD! BOX!
+ { Set (#t, FORMAL_MODULAR_TYPE_DECLARATION); }
+ | DELTA! BOX!
+ ( DIGITS! BOX!
+ { Set (#t, FORMAL_DECIMAL_FIXED_POINT_DECLARATION); }
+ | { Set (#t, FORMAL_ORDINARY_FIXED_POINT_DECLARATION); }
+ )
+ | DIGITS! BOX!
+ { Set (#t, FORMAL_FLOATING_POINT_DECLARATION); }
+ | array_type_definition[#t]
+ | access_type_definition[#t]
+ | empty_discrim_opt discriminable_type_definition[#t]
+ )
+ | discrim_part IS! discriminable_type_definition[#t]
+ )
+ { pop_def_id(); }
+ | w:WITH^ ( PROCEDURE! def_id[false] formal_part_opt subprogram_default_opt
+ { Set(#w, FORMAL_PROCEDURE_DECLARATION); }
+ | FUNCTION! def_designator[false] function_tail subprogram_default_opt
+ { Set(#w, FORMAL_FUNCTION_DECLARATION); }
+ | PACKAGE! def_id[false] IS! NEW! compound_name formal_package_actual_part_opt
+ { Set(#w, FORMAL_PACKAGE_DECLARATION); }
+ )
+ { pop_def_id(); }
+ | parameter_specification
+ )
+ SEMI!
+ ;
+
+discriminable_type_definition [RefAdaAST t]
+ : ( ( ABSTRACT )? NEW subtype_ind WITH ) =>
+ abstract_opt NEW! subtype_ind WITH! PRIVATE!
+ { Set (t, FORMAL_PRIVATE_EXTENSION_DECLARATION); }
+ | NEW! subtype_ind
+ { Set (t, FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION); }
+ | abstract_tagged_limited_opt PRIVATE!
+ { Set (t, FORMAL_PRIVATE_TYPE_DECLARATION); }
+ ;
+
+subprogram_default_opt : ( IS! ( BOX | name ) )?
+ ;
+
+formal_package_actual_part_opt
+ : ( LPAREN! ( BOX | defining_identifier_list ) RPAREN! )?
+ ;
+
+subprog_decl_or_rename_or_inst_or_body [boolean lib_level]
+ { RefAdaAST t; }
+ : p:PROCEDURE^ def_id[lib_level]
+ ( generic_subp_inst
+ { Set(#p, GENERIC_PROCEDURE_INSTANTIATION); }
+ | formal_part_opt
+ ( renames { Set(#p, PROCEDURE_RENAMING_DECLARATION); }
+ | IS! ( separate_or_abstract[#p]
+ | body_part { Set(#p, PROCEDURE_BODY); }
+ )
+ | { pop_def_id();
+ Set(#p, PROCEDURE_DECLARATION); }
+ )
+ SEMI!
+ )
+ | f:FUNCTION^ def_designator[lib_level]
+ ( generic_subp_inst
+ { Set(#f, GENERIC_FUNCTION_INSTANTIATION); }
+ | function_tail
+ ( renames { Set(#f, FUNCTION_RENAMING_DECLARATION); }
+ | IS! ( separate_or_abstract[#f]
+ | body_part { Set(#f, FUNCTION_BODY); }
+ )
+ | { pop_def_id();
+ Set(#f, FUNCTION_DECLARATION); }
+ )
+ SEMI!
+ )
+ ;
+
+body_part : declarative_part block_body end_id_opt
+ ;
+
+declarative_part : ( pragma | declarative_item )*
+ { #declarative_part =
+ #(#[DECLARATIVE_PART, "DECLARATIVE_PART"],
+ #declarative_part); }
+ ;
+
+// A declarative_item may appear in the declarative part of any body.
+declarative_item :
+ ( pkg:PACKAGE^ ( body_is
+ ( separate { Set(#pkg, PACKAGE_BODY_STUB); }
+ | pkg_body_part
+ { Set(#pkg, PACKAGE_BODY); }
+ )
+ SEMI!
+ | def_id[false] spec_decl_part[#pkg]
+ )
+ | tsk:TASK^ ( body_is
+ ( separate { Set(#tsk, TASK_BODY_STUB); }
+ | body_part { Set(#tsk, TASK_BODY); }
+ )
+ SEMI!
+ | task_type_or_single_decl[#tsk]
+ )
+ | pro:PROTECTED^
+ ( body_is
+ ( separate { Set(#pro, PROTECTED_BODY_STUB); }
+ | prot_op_bodies_opt end_id_opt
+ { Set(#pro, PROTECTED_BODY); }
+ )
+ | prot_type_or_single_decl[#pro]
+ )
+ SEMI!
+ | subprog_decl_or_rename_or_inst_or_body[false]
+ | decl_common
+ )
+ /* DECLARATIVE_ITEM is just a pass-thru node so we omit it.
+ Objections anybody?
+ { #declarative_item =
+ #(#[DECLARATIVE_ITEM,
+ "DECLARATIVE_ITEM"], #declarative_item); }
+ */
+ ;
+
+body_is : BODY! def_id[false] IS!
+ ;
+
+separate : SEPARATE! { pop_def_id(); }
+ ;
+
+pkg_body_part : declarative_part block_body_opt end_id_opt
+ ;
+
+block_body_opt : ( BEGIN! handled_stmt_s )?
+ { #block_body_opt =
+ #(#[BLOCK_BODY_OPT,
+ "BLOCK_BODY_OPT"], #block_body_opt); }
+ ;
+
+prot_op_bodies_opt : ( entry_body
+ | subprog_decl_or_body
+ | pragma
+ )*
+ { #prot_op_bodies_opt =
+ #(#[PROT_OP_BODIES_OPT,
+ "PROT_OP_BODIES_OPT"], #prot_op_bodies_opt); }
+ ;
+
+subprog_decl_or_body
+ : p:PROCEDURE^ def_id[false] formal_part_opt
+ ( IS! body_part { Set(#p, PROCEDURE_BODY); }
+ | { pop_def_id(); Set(#p, PROCEDURE_DECLARATION); }
+ )
+ SEMI!
+ | f:FUNCTION^ def_designator[false] function_tail
+ ( IS! body_part { Set(#f, FUNCTION_BODY); }
+ | { pop_def_id(); Set(#f, FUNCTION_DECLARATION); }
+ )
+ SEMI!
+ ;
+
+block_body : b:BEGIN^ handled_stmt_s
+ { Set(#b, BLOCK_BODY); }
+ ;
+
+handled_stmt_s : statements except_handler_part_opt
+ { #handled_stmt_s =
+ #(#[HANDLED_SEQUENCE_OF_STATEMENTS,
+ "HANDLED_SEQUENCE_OF_STATEMENTS"], #handled_stmt_s); }
+ ;
+
+handled_stmts_opt : ( statements except_handler_part_opt )?
+ { #handled_stmts_opt =
+ #(#[HANDLED_STMTS_OPT,
+ "HANDLED_STMTS_OPT"], #handled_stmts_opt); }
+ ;
+
+statements : ( pragma | statement )+
+ { #statements = #(#[SEQUENCE_OF_STATEMENTS,
+ "SEQUENCE_OF_STATEMENTS"], #statements); }
+ ;
+
+statement : def_label_opt
+ ( null_stmt
+ | exit_stmt
+ | return_stmt
+ | goto_stmt
+ | delay_stmt
+ | abort_stmt
+ | raise_stmt
+ | requeue_stmt
+ | accept_stmt
+ | select_stmt
+ | if_stmt
+ | case_stmt
+ | loop_stmt SEMI!
+ | block END! SEMI!
+ | statement_identifier
+ ( loop_stmt id_opt SEMI!
+ | block end_id_opt SEMI!
+ )
+ | call_or_assignment
+ // | code_stmt // TBD: resolve ambiguity
+ )
+ { #statement = #(#[STATEMENT, "STATEMENT"], #statement); }
+ ;
+
+def_label_opt : ( LT_LT! IDENTIFIER GT_GT! )?
+ { #def_label_opt = #(#[LABEL_OPT, "LABEL_OPT"], #def_label_opt); }
+ ;
+
+null_stmt : s:NuLL SEMI!
+ { Set(#s, NULL_STATEMENT); }
+ ;
+
+if_stmt : s:IF^ cond_clause elsifs_opt
+ else_opt
+ END! IF! SEMI!
+ { Set(#s, IF_STATEMENT); }
+ ;
+
+cond_clause : condition c:THEN^ statements
+ { Set(#c, COND_CLAUSE); }
+ ;
+
+condition : expression
+ // { #condition = #(#[CONDITION, "CONDITION"], #condition); }
+ ;
+
+elsifs_opt : ( ELSIF! cond_clause )*
+ { #elsifs_opt = #(#[ELSIFS_OPT, "ELSIFS_OPT"], #elsifs_opt); }
+ ;
+
+else_opt : ( ELSE! statements )?
+ { #else_opt = #(#[ELSE_OPT, "ELSE_OPT"], #else_opt); }
+ ;
+
+case_stmt : s:CASE^ expression IS! alternative_s END! CASE! SEMI!
+ { Set(#s, CASE_STATEMENT); }
+ ;
+
+alternative_s : ( case_statement_alternative )+
+ ;
+
+case_statement_alternative : s:WHEN^ choice_s RIGHT_SHAFT! statements
+ { Set(#s, CASE_STATEMENT_ALTERNATIVE); }
+ ;
+
+loop_stmt : iteration_scheme_opt
+ l:LOOP^ statements END! LOOP! // basic_loop
+ { Set(#l, LOOP_STATEMENT); }
+ ;
+
+iteration_scheme_opt : ( WHILE^ condition
+ | FOR^ IDENTIFIER IN! reverse_opt discrete_subtype_definition
+ )?
+ { #iteration_scheme_opt =
+ #(#[ITERATION_SCHEME_OPT,
+ "ITERATION_SCHEME_OPT"], #iteration_scheme_opt); }
+ ;
+
+reverse_opt : ( REVERSE )?
+ { #reverse_opt = #(#[MODIFIERS, "MODIFIERS"], #reverse_opt); }
+ ;
+
+id_opt_aux { RefAdaAST endid; } :
+ endid=definable_operator_symbol { end_id_matches_def_id (endid) }?
+ | n:compound_name { end_id_matches_def_id (#n) }?
+ /* Ordinarily we would need to be stricter here, i.e.
+ match compound_name only for the library-level case
+ (and IDENTIFIER otherwise), but end_id_matches_def_id
+ does the right thing for us. */
+ | { pop_def_id(); }
+ ;
+
+id_opt : id_opt_aux
+ { #id_opt = #(#[ID_OPT, "ID_OPT"], #id_opt); }
+ ;
+
+end_id_opt : e:END^ id_opt_aux
+ { Set(#e, END_ID_OPT); }
+ ;
+
+/* Note: This rule should really be `statement_identifier_opt'.
+ However, manual disambiguation of `loop_stmt' from `block'
+ in the presence of the statement_identifier in `statement'
+ results in this rule. The case of loop_stmt/block given
+ without the statement_identifier is directly coded in
+ `statement'. */
+statement_identifier! : n:IDENTIFIER COLON!
+ { push_def_id(#n); }
+ ;
+
+/*
+statement_identifier_opt : ( n:IDENTIFIER COLON! { push_def_id(#n); } )?
+ { #statement_identifier_opt =
+ #(#[STATEMENT_IDENTIFIER_OPT,
+ "STATEMENT_IDENTIFIER_OPT"], #statement_identifier_opt); }
+ ;
+ */
+
+block : declare_opt block_body
+ { #block = #(#[BLOCK_STATEMENT, "BLOCK_STATEMENT"], #block); }
+ ;
+
+declare_opt : ( DECLARE! declarative_part )?
+ { #declare_opt = #(#[DECLARE_OPT, "DECLARE_OPT"], #declare_opt); }
+ ;
+
+exit_stmt : s:EXIT^ ( label_name )? ( WHEN condition )? SEMI!
+ { Set(#s, EXIT_STATEMENT); }
+ ;
+
+label_name : IDENTIFIER
+ ;
+
+return_stmt : s:RETURN^ ( expression )? SEMI!
+ { Set(#s, RETURN_STATEMENT); }
+ ;
+
+goto_stmt : s:GOTO^ label_name SEMI!
+ { Set(#s, GOTO_STATEMENT); }
+ ;
+
+call_or_assignment : // procedure_call is in here.
+ name ( ASSIGN! expression
+ { #call_or_assignment =
+ #(#[ASSIGNMENT_STATEMENT,
+ "ASSIGNMENT_STATEMENT"], #call_or_assignment); }
+ | { #call_or_assignment =
+ #(#[CALL_STATEMENT,
+ "CALL_STATEMENT"], #call_or_assignment); }
+ /* Preliminary. Use semantic analysis to produce
+ {PROCEDURE|ENTRY}_CALL_STATEMENT. */
+ )
+ SEMI!
+ ;
+
+entry_body : e:ENTRY^ def_id[false] entry_body_formal_part entry_barrier IS!
+ body_part SEMI!
+ { Set (#e, ENTRY_BODY); }
+ ;
+
+entry_body_formal_part : entry_index_spec_opt formal_part_opt
+ ;
+
+entry_index_spec_opt :
+ ( (LPAREN FOR) =>
+ LPAREN! FOR! def_id[false] IN! discrete_subtype_definition RPAREN!
+ | /* empty */
+ )
+ { #entry_index_spec_opt =
+ #(#[ENTRY_INDEX_SPECIFICATION,
+ "ENTRY_INDEX_SPECIFICATION"], #entry_index_spec_opt); }
+ ;
+
+entry_barrier : WHEN! condition
+ ;
+
+entry_call_stmt : name SEMI! // Semantic analysis required, for example
+ // to ensure `name' is an entry.
+ { #entry_call_stmt =
+ #(#[ENTRY_CALL_STATEMENT,
+ "ENTRY_CALL_STATEMENT"], #entry_call_stmt); }
+ ;
+
+accept_stmt : a:ACCEPT^ def_id[false] entry_index_opt formal_part_opt
+ ( DO! handled_stmts_opt end_id_opt SEMI!
+ | SEMI! { pop_def_id(); }
+ )
+ { Set (#a, ACCEPT_STATEMENT); }
+ ;
+
+entry_index_opt : ( (LPAREN expression RPAREN) => LPAREN! expression RPAREN!
+ // Looks alot like parenthesized_expr_opt, but it's not.
+ // We need the syn pred for the usage context in accept_stmt.
+ // The formal_part_opt that follows the entry_index_opt there
+ // creates ambiguity (due to the opening LPAREN.)
+ | /* empty */
+ )
+ { #entry_index_opt =
+ #(#[ENTRY_INDEX_OPT,
+ "ENTRY_INDEX_OPT"], #entry_index_opt); }
+ ;
+
+delay_stmt : d:DELAY^ until_opt expression SEMI!
+ { Set (#d, DELAY_STATEMENT); }
+ ;
+
+until_opt : ( UNTIL )?
+ { #until_opt = #(#[MODIFIERS, "MODIFIERS"], #until_opt); }
+ ;
+
+// SELECT_STATEMENT itself is not modeled since it is trivially
+// reconstructed:
+// select_statement ::= selective_accept | timed_entry_call
+// | conditional_entry_call | asynchronous_select
+//
+select_stmt : s:SELECT^
+ ( (triggering_alternative THEN ABORT) =>
+ triggering_alternative THEN! ABORT! abortable_part
+ { Set (#s, ASYNCHRONOUS_SELECT); }
+ | selective_accept
+ { Set (#s, SELECTIVE_ACCEPT); }
+ | entry_call_alternative
+ ( OR! delay_alternative { Set (#s, TIMED_ENTRY_CALL); }
+ | ELSE! statements { Set (#s, CONDITIONAL_ENTRY_CALL); }
+ )
+ )
+ END! SELECT! SEMI!
+ // { Set (#s, SELECT_STATEMENT); }
+ ;
+
+triggering_alternative : ( delay_stmt | entry_call_stmt ) stmts_opt
+ { #triggering_alternative =
+ #(#[TRIGGERING_ALTERNATIVE,
+ "TRIGGERING_ALTERNATIVE"], #triggering_alternative); }
+ ;
+
+abortable_part : stmts_opt
+ { #abortable_part =
+ #(#[ABORTABLE_PART,
+ "ABORTABLE_PART"], #abortable_part); }
+ ;
+
+entry_call_alternative : entry_call_stmt stmts_opt
+ { #entry_call_alternative =
+ #(#[ENTRY_CALL_ALTERNATIVE,
+ "ENTRY_CALL_ALTERNATIVE"], #entry_call_alternative); }
+ ;
+
+selective_accept : guard_opt select_alternative or_select_opt else_opt
+ ;
+
+guard_opt : ( w:WHEN^ condition RIGHT_SHAFT! ( pragma )* )?
+ { Set(#w, GUARD_OPT); }
+ ;
+
+select_alternative // Not modeled since it's just a pass-through.
+ : accept_alternative
+ | delay_alternative
+ | t:TERMINATE SEMI! { Set(#t, TERMINATE_ALTERNATIVE); }
+ ;
+
+accept_alternative : accept_stmt stmts_opt
+ { #accept_alternative =
+ #(#[ACCEPT_ALTERNATIVE,
+ "ACCEPT_ALTERNATIVE"], #accept_alternative); }
+ ;
+
+delay_alternative : delay_stmt stmts_opt
+ { #delay_alternative =
+ #(#[DELAY_ALTERNATIVE,
+ "DELAY_ALTERNATIVE"], #delay_alternative); }
+ ;
+
+stmts_opt : ( pragma | statement )*
+ ;
+
+or_select_opt : ( OR! guard_opt select_alternative )*
+ { #or_select_opt =
+ #(#[OR_SELECT_OPT, "OR_SELECT_OPT"], #or_select_opt); }
+ ;
+
+abort_stmt : a:ABORT^ name ( COMMA! name )* SEMI!
+ { Set (#a, ABORT_STATEMENT); }
+ ;
+
+except_handler_part_opt : ( EXCEPTION! ( exception_handler )+ )?
+ { #except_handler_part_opt =
+ #(#[EXCEPT_HANDLER_PART_OPT,
+ "EXCEPT_HANDLER_PART_OPT"], #except_handler_part_opt); }
+ ;
+
+exception_handler : w:WHEN^ identifier_colon_opt except_choice_s RIGHT_SHAFT!
+ statements
+ { Set (#w, EXCEPTION_HANDLER); }
+ ;
+
+identifier_colon_opt : ( IDENTIFIER COLON! )?
+ { #identifier_colon_opt =
+ #(#[IDENTIFIER_COLON_OPT,
+ "IDENTIFIER_COLON_OPT"], #identifier_colon_opt); }
+ ;
+
+except_choice_s : exception_choice ( PIPE^ exception_choice )*
+ ;
+
+exception_choice : compound_name
+ | OTHERS
+ ;
+
+raise_stmt : r:RAISE^ ( compound_name )? SEMI!
+ { Set (#r, RAISE_STATEMENT); }
+ ;
+
+requeue_stmt : r:REQUEUE^ name ( WITH! ABORT )? SEMI!
+ { Set (#r, REQUEUE_STATEMENT); }
+ ;
+
+operator_call : cs:CHAR_STRING^ operator_call_tail[#cs]
+ ;
+
+operator_call_tail [RefAdaAST opstr]
+ : LPAREN! { is_operator_symbol(opstr->getText().c_str()) }?
+ value_s RPAREN! { opstr->setType(OPERATOR_SYMBOL); }
+ ;
+
+value_s : value ( COMMA! value )*
+ { #value_s = #(#[VALUES, "VALUES"], #value_s); }
+ ;
+
+/*
+literal : NUMERIC_LIT
+ | CHARACTER_LITERAL
+ | CHAR_STRING
+ | NuLL
+ ;
+ */
+
+expression : relation
+ ( a:AND^ ( THEN! { Set (#a, AND_THEN); } )? relation
+ | o:OR^ ( ELSE! { Set (#o, OR_ELSE); } )? relation
+ | XOR^ relation
+ )*
+ ;
+
+relation : simple_expression
+ ( IN^ range_or_mark
+ | n:NOT^ IN! range_or_mark { Set (#n, NOT_IN); }
+ | EQ^ simple_expression
+ | NE^ simple_expression
+ | LT_^ simple_expression
+ | LE^ simple_expression
+ | GT^ simple_expression
+ | GE^ simple_expression
+ )?
+ ;
+
+range_or_mark : (range) => range
+ | subtype_mark
+ ;
+
+simple_expression : signed_term
+ ( PLUS^ signed_term
+ | MINUS^ signed_term
+ | CONCAT^ signed_term
+ )*
+ ;
+
+signed_term
+ : p:PLUS^ term { Set(#p, UNARY_PLUS); }
+ | m:MINUS^ term { Set(#m, UNARY_MINUS); }
+ | term
+ ;
+
+term : factor ( STAR^ factor
+ | DIV^ factor
+ | MOD^ factor
+ | REM^ factor
+ )*
+ ;
+
+factor : ( NOT^ primary
+ | ABS^ primary
+ | primary ( EXPON^ primary )?
+ )
+ ;
+
+primary : ( name_or_qualified
+ | parenthesized_primary
+ | allocator
+ | NuLL
+ | NUMERIC_LIT
+ | CHARACTER_LITERAL
+ | cs:CHAR_STRING^ ( operator_call_tail[#cs] )?
+ )
+ ;
+
+// Temporary, to be turned into just `qualified'.
+// We get away with it because `qualified' is always mentioned
+// together with `name'.
+// Only exception: `code_stmt', which is not yet implemented.
+name_or_qualified { RefAdaAST dummy; }
+ : IDENTIFIER
+ ( DOT^ ( ALL
+ | IDENTIFIER
+ | CHARACTER_LITERAL
+ | dummy=is_operator
+ )
+ | p:LPAREN^ value_s RPAREN!
+ { Set(#p, INDEXED_COMPONENT); }
+ | TIC^ ( parenthesized_primary | attribute_id )
+ )*
+ ;
+
+allocator : n:NEW^ name_or_qualified
+ { Set(#n, ALLOCATOR); }
+ ;
+
+subunit : sep:SEPARATE^ LPAREN! compound_name RPAREN!
+ { Set(#sep, SUBUNIT); }
+ ( subprogram_body
+ | package_body
+ | task_body
+ | protected_body
+ )
+ ;
+
+subprogram_body
+ : p:PROCEDURE^ def_id[false] formal_part_opt IS! body_part SEMI!
+ { pop_def_id(); Set(#p, PROCEDURE_BODY); }
+ | f:FUNCTION^ def_designator[false] function_tail IS! body_part SEMI!
+ { pop_def_id(); Set(#f, FUNCTION_BODY); }
+ ;
+
+package_body : p:PACKAGE^ body_is pkg_body_part SEMI!
+ { Set(#p, PACKAGE_BODY); }
+ ;
+
+task_body : t:TASK^ body_is body_part SEMI!
+ { Set(#t, TASK_BODY); }
+ ;
+
+protected_body : p:PROTECTED^ body_is prot_op_bodies_opt end_id_opt SEMI!
+ { Set(#p, PROTECTED_BODY); }
+ ;
+
+// TBD
+// code_stmt : qualified SEMI!
+// ;
+
+//----------------------------------------------------------------------------
+// The Ada scanner
+//----------------------------------------------------------------------------
+{
+#include "preambles.h"
+}
+class AdaLexer extends Lexer;
+
+options {
+ charVocabulary = '\3'..'\377';
+ exportVocab = Ada; // call the vocabulary "Ada"
+ testLiterals = false; // don't automatically test for literals
+ k = 4; // number of characters of lookahead
+ caseSensitive = false;
+ caseSensitiveLiterals = false;
+ ///defaultErrorHandler = true;
+}
+
+tokens {
+ // part 1: keywords
+ ABORT = "abort" ;
+ ABS = "abs" ;
+ ABSTRACT = "abstract" ;
+ ACCEPT = "accept" ;
+ ACCESS = "access" ;
+ ALIASED = "aliased" ;
+ ALL = "all" ;
+ AND = "and" ;
+ ARRAY = "array" ;
+ AT = "at" ;
+ BEGIN = "begin" ;
+ BODY = "body" ;
+ CASE = "case" ;
+ CONSTANT = "constant" ;
+ DECLARE = "declare" ;
+ DELAY = "delay" ;
+ DELTA = "delta" ;
+ DIGITS = "digits" ;
+ DO = "do" ;
+ ELSE = "else" ;
+ ELSIF = "elsif" ;
+ END = "end" ;
+ ENTRY = "entry" ;
+ EXCEPTION = "exception" ;
+ EXIT = "exit" ;
+ FOR = "for" ;
+ FUNCTION = "function" ;
+ GENERIC = "generic" ;
+ GOTO = "goto" ;
+ IF = "if" ;
+ IN = "in" ;
+ IS = "is" ;
+ LIMITED = "limited" ;
+ LOOP = "loop" ;
+ MOD = "mod" ;
+ NEW = "new" ;
+ NOT = "not" ;
+ NuLL = "null" ;
+ OF = "of" ;
+ OR = "or" ;
+ OTHERS = "others" ;
+ OUT = "out" ;
+ PACKAGE = "package" ;
+ PRAGMA = "pragma" ;
+ PRIVATE = "private" ;
+ PROCEDURE = "procedure" ;
+ PROTECTED = "protected" ;
+ RAISE = "raise" ;
+ RANGE = "range" ;
+ RECORD = "record" ;
+ REM = "rem" ;
+ RENAMES = "renames" ;
+ REQUEUE = "requeue" ;
+ RETURN = "return" ;
+ REVERSE = "reverse" ;
+ SELECT = "select" ;
+ SEPARATE = "separate" ;
+ SUBTYPE = "subtype" ;
+ TAGGED = "tagged" ;
+ TASK = "task" ;
+ TERMINATE = "terminate" ;
+ THEN = "then" ;
+ TYPE = "type" ;
+ UNTIL = "until" ;
+ USE = "use" ;
+ WHEN = "when" ;
+ WHILE = "while" ;
+ WITH = "with" ;
+ XOR = "xor" ;
+
+ // part 2: RM tokens (synthetic)
+ ABORTABLE_PART;
+ ABORT_STATEMENT;
+ /*ABSTRACT_SUBPROGRAM_DECLARATION; =>
+ ABSTRACT_{FUNCTION|PROCEDURE}_DECLARATION */
+ ACCEPT_ALTERNATIVE;
+ ACCEPT_STATEMENT;
+ /* ACCESS_TO_FUNCTION_DEFINITION => ACCESS_TO_FUNCTION_DECLARATION */
+ /* ACCESS_TO_OBJECT_DEFINITION => ACCESS_TO_OBJECT_DECLARATION */
+ /* ACCESS_TO_PROCEDURE_DEFINITION => ACCESS_TO_PROCEDURE_DECLARATION */
+ /* ACCESS_TYPE_DEFINITION => ACCESS_TYPE_DECLARATION */
+ ALLOCATOR;
+ /* ARRAY_TYPE_DEFINITION => ARRAY_TYPE_DECLARATION */
+ ASSIGNMENT_STATEMENT;
+ ASYNCHRONOUS_SELECT;
+ ATTRIBUTE_DEFINITION_CLAUSE;
+ AT_CLAUSE;
+ BLOCK_STATEMENT;
+ CASE_STATEMENT;
+ CASE_STATEMENT_ALTERNATIVE;
+ CODE_STATEMENT;
+ COMPONENT_DECLARATION;
+ // COMPONENT_LIST; // not currently used as an explicit node
+ // CONDITION; // not currently used
+ CONDITIONAL_ENTRY_CALL;
+ CONTEXT_CLAUSE;
+ /* DECIMAL_FIXED_POINT_DEFINITION => DECIMAL_FIXED_POINT_DECLARATION */
+ // DECLARATIVE_ITEM; // not currently used
+ DECLARATIVE_PART;
+ DEFINING_IDENTIFIER_LIST;
+ DELAY_ALTERNATIVE;
+ DELAY_STATEMENT;
+ DELTA_CONSTRAINT;
+ /* DERIVED_TYPE_DEFINITION; =>
+ DERIVED_RECORD_EXTENSION, ORDINARY_DERIVED_TYPE_DECLARATION */
+ DIGITS_CONSTRAINT;
+ // DISCRETE_RANGE; // Not used; instead, directly use its RHS alternatives.
+ DISCRIMINANT_ASSOCIATION;
+ DISCRIMINANT_CONSTRAINT;
+ DISCRIMINANT_SPECIFICATION;
+ ENTRY_BODY;
+ ENTRY_CALL_ALTERNATIVE;
+ ENTRY_CALL_STATEMENT;
+ ENTRY_DECLARATION;
+ ENTRY_INDEX_SPECIFICATION;
+ ENUMERATION_REPESENTATION_CLAUSE;
+ /* ENUMERATION_TYPE_DEFINITION => ENUMERATION_TYPE_DECLARATION */
+ EXCEPTION_DECLARATION;
+ EXCEPTION_HANDLER;
+ EXCEPTION_RENAMING_DECLARATION;
+ EXIT_STATEMENT;
+ /* FLOATING_POINT_DEFINITION => FLOATING_POINT_DECLARATION */
+ /* FORMAL_ACCESS_TYPE_DEFINITION => FORMAL_ACCESS_TYPE_DECLARATION */
+ /* FORMAL_ARRAY_TYPE_DEFINITION => FORMAL_ARRAY_TYPE_DECLARATION */
+ /* FORMAL_DECIMAL_FIXED_POINT_DEFINITION =>
+ FORMAL_DECIMAL_FIXED_POINT_DECLARATION */
+ /* FORMAL_DERIVED_TYPE_DEFINITION =>
+ FORMAL_{ORDINARY_DERIVED_TYPE|PRIVATE_EXTENSION}_DECLARATION */
+ /* FORMAL_DISCRETE_TYPE_DEFINITION => FORMAL_DISCRETE_TYPE_DECLARATION */
+ /* FORMAL_FLOATING_POINT_DEFINITION =>
+ FORMAL_FLOATING_POINT_DECLARATION */
+ /* FORMAL_MODULAR_TYPE_DEFINITION => FORMAL_MODULAR_TYPE_DECLARATION */
+ /* FORMAL_ORDINARY_FIXED_POINT_DEFINITION =>
+ FORMAL_ORDINARY_FIXED_POINT_DECLARATION */
+ FORMAL_PACKAGE_DECLARATION;
+ /* FORMAL_PRIVATE_TYPE_DEFINITION => FORMAL_PRIVATE_TYPE_DECLARATION */
+ /* FORMAL_SIGNED_INTEGER_TYPE_DEFINITION =>
+ FORMAL_SIGNED_INTEGER_TYPE_DECLARATION */
+ /* FORMAL_SUBPROGRAM_DECLARATION; =>
+ FORMAL_{FUNCTION|PROCEDURE}_DECLARATION */
+ /* FORMAL_TYPE_DECLARATION; not used, replaced by the corresponding
+ finer grained declarations */
+ /* FORMAL_TYPE_DEFINITION; not used at all; we use declarations
+ not definitions */
+ /* FULL_TYPE_DECLARATION; not used, replaced by the corresponding
+ finer grained declarations */
+ GENERIC_FORMAL_PART;
+ /* GENERIC_INSTANTIATION; =>
+ GENERIC_{FUNCTION|PACKAGE|PROCEDURE}_INSTANTIATION */
+ GENERIC_PACKAGE_DECLARATION;
+ /* GENERIC_RENAMING_DECLARATION; =>
+ GENERIC_{FUNCTION|PACKAGE|PROCEDURE}_RENAMING */
+ /* GENERIC_SUBPROGRAM_DECLARATION; =>
+ GENERIC_{FUNCTION|PROCEDURE}_DECLARATION */
+ GOTO_STATEMENT;
+ HANDLED_SEQUENCE_OF_STATEMENTS;
+ HANDLED_STMTS_OPT;
+ IF_STATEMENT;
+ INCOMPLETE_TYPE_DECLARATION;
+ INDEXED_COMPONENT;
+ INDEX_CONSTRAINT;
+ LIBRARY_ITEM;
+ LOOP_STATEMENT;
+ /* MODULAR_TYPE_DEFINITION => MODULAR_TYPE_DECLARATION */
+ NAME;
+ NULL_STATEMENT;
+ NUMBER_DECLARATION;
+ OBJECT_DECLARATION;
+ OBJECT_RENAMING_DECLARATION;
+ OPERATOR_SYMBOL;
+ /* ORDINARY_FIXED_POINT_DEFINITION => ORDINARY_FIXED_POINT_DECLARATION */
+ PACKAGE_BODY;
+ PACKAGE_BODY_STUB;
+ PACKAGE_RENAMING_DECLARATION;
+ PACKAGE_SPECIFICATION;
+ PARAMETER_SPECIFICATION;
+ // PREFIX; // not used
+ // PRIMARY; // not used
+ PRIVATE_EXTENSION_DECLARATION;
+ PRIVATE_TYPE_DECLARATION;
+ // PROCEDURE_CALL_STATEMENT; // NYI, using CALL_STATEMENT for now.
+ PROTECTED_BODY;
+ PROTECTED_BODY_STUB;
+ PROTECTED_TYPE_DECLARATION;
+ RAISE_STATEMENT;
+ RANGE_ATTRIBUTE_REFERENCE;
+ RECORD_REPRESENTATION_CLAUSE;
+ /* RECORD_TYPE_DEFINITION => RECORD_TYPE_DECLARATION */
+ REQUEUE_STATEMENT;
+ RETURN_STATEMENT;
+ SELECTIVE_ACCEPT;
+ /* SELECT_ALTERNATIVE; Not used - instead, we use the finer grained rules
+ ACCEPT_ALTERNATIVE | DELAY_ALTERNATIVE
+ | TERMINATE_ALTERNATIVE */
+ /* SELECT_STATEMENT; Not used - instead, we use the finer grained rules
+ SELECTIVE_ACCEPT | TIMED_ENTRY_CALL
+ | CONDITIONAL_ENTRY_CALL | ASYNCHRONOUS_SELECT */
+ SEQUENCE_OF_STATEMENTS;
+ /* SIGNED_INTEGER_TYPE_DEFINITION => SIGNED_INTEGER_TYPE_DECLARATION */
+ SINGLE_PROTECTED_DECLARATION;
+ SINGLE_TASK_DECLARATION;
+ STATEMENT;
+ /* SUBPROGRAM_BODY; => {FUNCTION|PROCEDURE}_BODY */
+ /* SUBPROGRAM_BODY_STUB; => {FUNCTION|PROCEDURE}_BODY_STUB */
+ /* SUBPROGRAM_DECLARATION; => {FUNCTION|PROCEDURE}_DECLARATION */
+ /* SUBPROGRAM_RENAMING_DECLARATION; =>
+ {FUNCTION|PROCEDURE}_RENAMING_DECLARATION */
+ SUBTYPE_DECLARATION;
+ SUBTYPE_INDICATION;
+ SUBTYPE_MARK;
+ SUBUNIT;
+ TASK_BODY;
+ TASK_BODY_STUB;
+ TASK_TYPE_DECLARATION;
+ TERMINATE_ALTERNATIVE;
+ TIMED_ENTRY_CALL;
+ TRIGGERING_ALTERNATIVE;
+ /* TYPE_DECLARATION; not used, replaced by the corresponding
+ finer grained declarations */
+ USE_CLAUSE;
+ USE_TYPE_CLAUSE;
+ VARIANT;
+ VARIANT_PART;
+ WITH_CLAUSE;
+
+ // part 3: Non-RM synthetic tokens.
+ // They exist mainly to normalize the node structure with respect to
+ // optional items. (Without them, the presence or absence of an optional
+ // item would change the node layout, but we want a fixed layout.)
+ ABSTRACT_FUNCTION_DECLARATION;
+ ABSTRACT_PROCEDURE_DECLARATION;
+ ACCESS_TO_FUNCTION_DECLARATION;
+ ACCESS_TO_OBJECT_DECLARATION;
+ ACCESS_TO_PROCEDURE_DECLARATION;
+ /* ACCESS_TYPE_DECLARATION; not used, replaced by
+ ACCESS_TO_{FUNCTION|OBJECT|PROCEDURE}_DECLARATION
+ */
+ ARRAY_OBJECT_DECLARATION;
+ ARRAY_TYPE_DECLARATION;
+ AND_THEN;
+ BASIC_DECLARATIVE_ITEMS_OPT;
+ BLOCK_BODY;
+ BLOCK_BODY_OPT;
+ CALL_STATEMENT; // See {PROCEDURE|ENTRY}_CALL_STATEMENT
+ COMPONENT_CLAUSES_OPT;
+ COMPONENT_ITEMS;
+ COND_CLAUSE;
+ DECIMAL_FIXED_POINT_DECLARATION;
+ DECLARE_OPT;
+ DERIVED_RECORD_EXTENSION;
+ // DERIVED_TYPE_DECLARATION; // not used
+ DISCRETE_SUBTYPE_DEF_OPT;
+ DISCRIMINANT_SPECIFICATIONS;
+ DISCRIM_PART_OPT;
+ ELSE_OPT;
+ ELSIFS_OPT;
+ END_ID_OPT;
+ ENTRY_INDEX_OPT;
+ ENUMERATION_TYPE_DECLARATION;
+ EXCEPT_HANDLER_PART_OPT;
+ EXTENSION_OPT;
+ FLOATING_POINT_DECLARATION;
+ /* FORMAL_ACCESS_TYPE_DECLARATION => ACCESS_TYPE_DECLARATION */
+ /* FORMAL_ARRAY_TYPE_DECLARATION => ARRAY_TYPE_DECLARATION */
+ FORMAL_DECIMAL_FIXED_POINT_DECLARATION;
+ FORMAL_DISCRETE_TYPE_DECLARATION;
+ FORMAL_FLOATING_POINT_DECLARATION;
+ FORMAL_FUNCTION_DECLARATION;
+ FORMAL_MODULAR_TYPE_DECLARATION;
+ FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION;
+ FORMAL_ORDINARY_FIXED_POINT_DECLARATION;
+ FORMAL_PART_OPT;
+ FORMAL_PRIVATE_EXTENSION_DECLARATION;
+ FORMAL_PRIVATE_TYPE_DECLARATION;
+ FORMAL_PROCEDURE_DECLARATION;
+ FORMAL_SIGNED_INTEGER_TYPE_DECLARATION;
+ FUNCTION_BODY;
+ FUNCTION_BODY_STUB;
+ FUNCTION_DECLARATION;
+ FUNCTION_RENAMING_DECLARATION;
+ GENERIC_FUNCTION_DECLARATION;
+ GENERIC_FUNCTION_INSTANTIATION;
+ GENERIC_FUNCTION_RENAMING;
+ GENERIC_PACKAGE_INSTANTIATION;
+ GENERIC_PACKAGE_RENAMING;
+ GENERIC_PROCEDURE_DECLARATION;
+ GENERIC_PROCEDURE_INSTANTIATION;
+ GENERIC_PROCEDURE_RENAMING;
+ GUARD_OPT;
+ IDENTIFIER_COLON_OPT;
+ ID_OPT;
+ INIT_OPT;
+ ITERATION_SCHEME_OPT;
+ LABEL_OPT;
+ MARK_WITH_CONSTRAINT;
+ MODIFIERS; /* Possible values: abstract access aliased all constant in
+ limited out private protected reverse tagged */
+ MODULAR_TYPE_DECLARATION;
+ MOD_CLAUSE_OPT;
+ // NAME_OR_QUALIFIED;
+ NOT_IN;
+ ORDINARY_DERIVED_TYPE_DECLARATION;
+ ORDINARY_FIXED_POINT_DECLARATION;
+ OR_ELSE;
+ OR_SELECT_OPT;
+ PARENTHESIZED_PRIMARY;
+ // PARENTHESIZED_VALUES;
+ // PARENTHESIZED_VALUES_OPT;
+ PRIVATE_DECLARATIVE_ITEMS_OPT;
+ PRIVATE_TASK_ITEMS_OPT;
+ PROCEDURE_BODY;
+ PROCEDURE_BODY_STUB;
+ PROCEDURE_DECLARATION;
+ PROCEDURE_RENAMING_DECLARATION;
+ PROT_MEMBER_DECLARATIONS;
+ PROT_OP_BODIES_OPT;
+ PROT_OP_DECLARATIONS;
+ PROT_PRIVATE_OPT;
+ RANGED_EXPRS; // ugh, what an ugly name
+ RANGE_CONSTRAINT;
+ RECORD_TYPE_DECLARATION;
+ SELECTOR_NAMES_OPT;
+ SIGNED_INTEGER_TYPE_DECLARATION;
+ TASK_ITEMS_OPT;
+ UNARY_MINUS;
+ UNARY_PLUS;
+ VALUE;
+ VALUES;
+ VARIANTS;
+}
+
+{
+ ANTLR_LEXER_PREAMBLE
+ private:
+ bool lastTokenWasTicCompatible;
+}
+
+//----------------------------------------------------------------------------
+// OPERATORS
+//----------------------------------------------------------------------------
+COMMENT_INTRO : "--" {lastTokenWasTicCompatible=false;};
+DOT_DOT : ".." {lastTokenWasTicCompatible=false;};
+LT_LT : "<<" {lastTokenWasTicCompatible=false;};
+OX : "<>" {lastTokenWasTicCompatible=false;};
+GT_GT : ">>" {lastTokenWasTicCompatible=false;};
+ASSIGN : ":=" {lastTokenWasTicCompatible=false;};
+RIGHT_SHAFT : "=>" {lastTokenWasTicCompatible=false;};
+NE : "/=" {lastTokenWasTicCompatible=false;};
+LE : "<=" {lastTokenWasTicCompatible=false;};
+GE : ">=" {lastTokenWasTicCompatible=false;};
+EXPON : "**" {lastTokenWasTicCompatible=false;};
+PIPE : '|' {lastTokenWasTicCompatible=false;};
+CONCAT : '&' {lastTokenWasTicCompatible=false;};
+DOT : '.' {lastTokenWasTicCompatible=false;};
+EQ : '=' {lastTokenWasTicCompatible=false;};
+LT_ : '<' {lastTokenWasTicCompatible=false;};
+GT : '>' {lastTokenWasTicCompatible=false;};
+PLUS : '+' {lastTokenWasTicCompatible=false;};
+MINUS : '-' {lastTokenWasTicCompatible=false;};
+STAR : '*' {lastTokenWasTicCompatible=false;};
+DIV : '/' {lastTokenWasTicCompatible=false;};
+LPAREN : '(' {lastTokenWasTicCompatible=false;};
+RPAREN : ')' {lastTokenWasTicCompatible=true;};
+COLON : ':' {lastTokenWasTicCompatible=false;};
+COMMA : ',' {lastTokenWasTicCompatible=false;};
+SEMI : ';' {lastTokenWasTicCompatible=false;};
+
+
+// Literals.
+
+// Rule for IDENTIFIER: testLiterals is set to true. This means that
+// after we match the rule, we look in the literals table to see if
+// it's a keyword or really an identifier.
+IDENTIFIER
+ options {testLiterals=true;}
+ : ( 'a'..'z' ) ( ('_')? ( 'a'..'z'|'0'..'9' ) )*
+ ;
+
+TIC_OR_CHARACTER_LITERAL :
+ "'"! { $setType(TIC); } (
+ { ! lastTokenWasTicCompatible }? . "'"!
+ { $setType(CHARACTER_LITERAL); }
+ )?
+ {lastTokenWasTicCompatible=false;};
+
+CHAR_STRING : '"'! ("\"\"" | ~('"'))* '"'!
+ {lastTokenWasTicCompatible=true;};
+
+NUMERIC_LIT : ( DIGIT )+
+ ( '#' BASED_INTEGER ( '.' BASED_INTEGER )? '#'
+ | ( '_' ( DIGIT )+ )+ // INTEGER
+ )?
+ ( { LA(2)!='.' }? //&& LA(3)!='.' }?
+ ( '.' ( DIGIT )+ ( '_' ( DIGIT )+ )* ( EXPONENT )?
+ | EXPONENT
+ )
+ )?
+ {lastTokenWasTicCompatible=false;};
+
+// a couple protected methods to assist in matching the various numbers
+
+protected
+DIGIT : ( '0'..'9' ) {lastTokenWasTicCompatible=false;};
+
+protected
+EXPONENT : ('e') ('+'|'-')? ( DIGIT )+ {lastTokenWasTicCompatible=false;};
+
+protected
+EXTENDED_DIGIT : ( DIGIT | 'a'..'f' ) {lastTokenWasTicCompatible=false;};
+
+protected
+BASED_INTEGER : ( EXTENDED_DIGIT ) ( ('_')? EXTENDED_DIGIT )* {lastTokenWasTicCompatible=false;};
+
+
+// Whitespace -- ignored
+WS_ : ( ' '
+ | '\t'
+ | '\f'
+ // handle newlines
+ | ( "\r\n" // Evil DOS
+ | '\r' // Macintosh
+ | '\n' // Unix (the right way)
+ )
+ { newline(); }
+ )
+ { $setType(antlr::Token::SKIP); }
+ ;
+
+// Single-line comments
+COMMENT : COMMENT_INTRO (~('\n'|'\r'))* ('\n'|'\r'('\n')?)
+ { $setType(antlr::Token::SKIP);
+ newline();
+ lastTokenWasTicCompatible=false; }
+ ;
+
diff --git a/languages/ada/ada.store.g b/languages/ada/ada.store.g
new file mode 100644
index 00000000..dbca7312
--- /dev/null
+++ b/languages/ada/ada.store.g
@@ -0,0 +1,610 @@
+/* $Id$
+ * ANTLR Ada tree walker for building the Kdevelop class store
+ * Copyright (C) 2003 Oliver Kellogg <okellogg@users.sourceforge.net>
+ */
+
+header "pre_include_hpp" {
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qfileinfo.h>
+
+#include <codemodel.h>
+#include "AdaAST.hpp"
+#include "ada_utils.hpp"
+}
+
+header "post_include_hpp" {
+#include <codemodel.h>
+#include <kdebug.h>
+}
+
+options {
+ language="Cpp";
+}
+
+class AdaStoreWalker extends AdaTreeParserSuper;
+options {
+ importVocab = Ada;
+ ASTLabelType = "RefAdaAST";
+}
+
+{
+private:
+ QString m_fileName;
+ QValueList<NamespaceDom> m_scopeStack;
+ CodeModel* m_model;
+ QValueList<QStringList> m_imports;
+ NamespaceDom m_currentContainer;
+ int m_currentAccess;
+ bool m_addToStore; /* auxiliary variable: for the moment, this is `true'
+ only when we are in specs, not bodies. */
+ bool m_isSubprogram; // auxiliary to def_id()
+ FileDom m_file;
+
+public:
+ void setCodeModel (CodeModel* model) { m_model = model; }
+ CodeModel* codeModel () { return m_model; }
+ const CodeModel* codeModel () const { return m_model; }
+
+ QString fileName () const { return m_fileName; }
+ void setFileName (const QString& fileName) { m_fileName = fileName; }
+
+ void init () {
+ m_scopeStack.clear ();
+ m_imports.clear ();
+ m_currentContainer = m_model->globalNamespace ();
+ m_scopeStack.append (m_currentContainer);
+ m_currentAccess = CodeModelItem::Public;
+ m_addToStore = false;
+ m_isSubprogram = false;
+ if (m_model->hasFile(m_fileName))
+ m_model->removeFile (m_model->fileByName(m_fileName));
+ m_file = m_model->create<FileModel>();
+ m_file->setName(m_fileName);
+ m_model->addFile(m_file);
+ }
+
+ void wipeout () { m_model->wipeout (); }
+// void out () { m_store->out (); }
+ void removeWithReferences (const QString& fileName) {
+ m_model->removeFile (m_model->fileByName(fileName));
+ }
+ NamespaceDom insertScopeContainer
+ (NamespaceDom scope, const QStringList & scopes ) {
+ QStringList::ConstIterator it = scopes.begin();
+ QString prefix( *it );
+ NamespaceDom ns = scope->namespaceByName( prefix );
+// kdDebug() << "insertScopeContainer begin with prefix " << prefix << endl;
+ if (!ns.data()) {
+// kdDebug() << "insertScopeContainer: ns is empty" << endl;
+ ns = m_model->create<NamespaceModel>();
+// kdDebug() << "insertScopeContainer: ns created" << endl;
+ ns->setName( prefix );
+// kdDebug() << "insertScopeContainer: ns name set" << endl;
+ scope->addNamespace( ns );
+// kdDebug() << "insertScopeContainer: ns added to a scope" << endl;
+
+ if (scope == m_model->globalNamespace())
+ m_file->addNamespace( ns );
+ }
+// kdDebug() << "insertScopeContainer: while" << endl;
+ while ( ++it != scopes.end() ) {
+ QString nameSegment( *it );
+ prefix += "." + nameSegment;
+// kdDebug() << "insertScopeContainer: while prefix = " << prefix << endl;
+ NamespaceDom inner = scope->namespaceByName( prefix );
+ if (!inner.data() ) {
+// kdDebug() << "insertScopeContainer: inner is empty " << endl;
+ inner = m_model->create<NamespaceModel>();
+// kdDebug() << "insertScopeContainer: inner created " << endl;
+ inner->setName( nameSegment );
+ ns->addNamespace( inner );
+// kdDebug() << "insertScopeContainer: inner added " << endl;
+ }
+ ns = inner;
+ }
+ return ns;
+ }
+ NamespaceDom defineScope( RefAdaAST namenode ) {
+ QStringList scopes( qnamelist( namenode ) );
+// kdDebug() << "defineScope: " << scopes.join(" ") << endl;
+ NamespaceDom psc = insertScopeContainer( m_currentContainer, scopes );
+// kdDebug() << "defineScope psc created" << endl;
+ psc->setStartPosition(namenode->getLine(), namenode->getColumn());
+// kdDebug() << "defineScope start position set" << endl;
+ psc->setFileName(m_fileName);
+// kdDebug() << "defineScope file name set" << endl;
+ // psc->setEndPosition (endLine, 0);
+// kdDebug() << "defineScope return" << endl;
+ return psc;
+ }
+}
+
+/*
+ * Only those rules that require specific action for the kdevelop
+ * class store are overloaded here.
+ */
+
+compilation_unit
+ : { init(); }
+ context_items_opt ( library_item | subunit ) ( pragma )*
+ ;
+
+
+with_clause
+ : #(WITH_CLAUSE ( compound_name
+ // TBD: slurp in the actual files
+ )+ )
+ ;
+
+/*
+compound_name
+ : IDENTIFIER
+ | #(DOT compound_name IDENTIFIER)
+ ;
+ */
+
+use_clause
+ : #(USE_TYPE_CLAUSE ( subtype_mark )+ )
+ | #(USE_CLAUSE ( c:compound_name
+ { m_imports.back ().push_back (qtext (#c)); }
+ )+ )
+ ;
+
+
+library_item :
+ #(LIBRARY_ITEM
+ #(MODIFIERS ( PRIVATE { m_currentAccess = CodeModelItem::Protected; } )? )
+ ( lib_subprog_decl_or_rename_or_inst_or_body
+ | #(PACKAGE_BODY pb:def_id pkg_body_part)
+ | #(GENERIC_PACKAGE_INSTANTIATION gpi:def_id
+ {
+ defineScope( #gpi );
+ }
+ generic_inst
+ )
+ | #(PACKAGE_SPECIFICATION ps:def_id
+ {
+ NamespaceDom psc = defineScope( #ps );
+ m_currentContainer = psc;
+ m_scopeStack.append( psc );
+ m_addToStore = true;
+ }
+ pkg_spec_part
+ {
+ m_scopeStack.remove(m_scopeStack.last());
+ if (m_scopeStack.count() == 0) {
+ kdDebug() << "adastore: m_scopeStack is empty!" << endl;
+ m_scopeStack.append( m_model->globalNamespace() );
+ }
+ m_currentContainer = m_scopeStack.last();
+ // m_currentContainer->setEndPosition (endLine, 0);
+ m_addToStore = false;
+ }
+ )
+ | #(PACKAGE_RENAMING_DECLARATION prd:def_id
+ {
+ defineScope( #prd );
+ }
+ renames
+ )
+ | generic_decl
+ )
+ )
+ ;
+
+
+subprog_def_id
+ : { m_isSubprogram = true; }
+ def_id
+ { m_isSubprogram = false; }
+ ;
+
+subprog_decl
+ : #(GENERIC_PROCEDURE_INSTANTIATION subprog_def_id generic_inst)
+ | #(PROCEDURE_RENAMING_DECLARATION subprog_def_id formal_part_opt renames)
+ | #(PROCEDURE_DECLARATION subprog_def_id formal_part_opt)
+ | #(PROCEDURE_BODY_STUB subprog_def_id formal_part_opt)
+ | #(ABSTRACT_PROCEDURE_DECLARATION subprog_def_id formal_part_opt)
+ | #(GENERIC_FUNCTION_INSTANTIATION def_designator generic_inst)
+ | #(FUNCTION_RENAMING_DECLARATION def_designator function_tail renames)
+ | #(FUNCTION_DECLARATION def_designator function_tail)
+ | #(FUNCTION_BODY_STUB def_designator function_tail)
+ | #(ABSTRACT_FUNCTION_DECLARATION subprog_def_id function_tail)
+ ;
+
+
+def_id
+ : cn:compound_name
+ {
+// kdDebug() << "cn:compound_name started " << endl;
+ if (m_addToStore) {
+// kdDebug() << "cn:compound_name m_addToStore " << endl;
+ if (m_isSubprogram) {
+// kdDebug() << "cn:compound_name m_isSubprogram " << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName (qtext (cn));
+ method->setFileName(m_fileName);
+// kdDebug() << "cn:compound_name method->setStartPosition(" << endl;
+ method->setStartPosition(#cn->getLine(), #cn->getColumn());
+
+ if (m_currentContainer == m_model->globalNamespace())
+ m_file->addFunction(method);
+ else
+ m_currentContainer->addFunction(method);
+ //FIXME: adymo: is this valid for CodeModel
+/* ParsedMethod *old = m_currentContainer->getMethod (method);
+ if (old) {
+ delete (method);
+ method = old;
+ } else {
+ m_currentContainer->addMethod (method);
+ }*/
+ } else {
+ // TBC: what about other declarations?
+ }
+ }
+ }
+ ;
+
+/*
+generic_inst : compound_name ( value_s )?
+ ;
+ */
+
+/*
+formal_part_opt : #(FORMAL_PART_OPT ( parameter_specification )* )
+ ;
+ */
+
+/*
+parameter_specification
+ : #(PARAMETER_SPECIFICATION defining_identifier_list modifiers
+ subtype_mark init_opt)
+ ;
+ */
+
+/*
+defining_identifier_list : #(DEFINING_IDENTIFIER_LIST ( IDENTIFIER )+ )
+ ;
+ */
+
+/*
+renames : CHARACTER_STRING // CHARACTER_STRING should not really be there.
+ | OPERATOR_SYMBOL // OPERATOR_SYMBOL should be used instead.
+ | name
+ ;
+ */
+
+/*
+name : IDENTIFIER
+ | #(DOT name
+ ( ALL
+ | IDENTIFIER
+ | CHARACTER_LITERAL
+ | OPERATOR_SYMBOL
+ )
+ )
+ | #(INDEXED_COMPONENT name value_s)
+ | #(TIC name attribute_id)
+ ;
+ */
+
+def_designator
+ : cn:compound_name
+ {
+// kdDebug() << "def_designator cn:compound_name started" << endl;
+ if (m_addToStore) {
+// kdDebug() << "def_designator cn:compound_name m_addToStore" << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName (qtext (cn));
+ method->setFileName(m_fileName);
+// kdDebug() << "def_designator cn:compound_name method->setStartPosition(" << endl;
+ method->setStartPosition(#cn->getLine(), #cn->getColumn());
+
+ if (m_currentContainer == m_model->globalNamespace())
+ m_file->addFunction(method);
+ else
+ m_currentContainer->addFunction(method);
+ //FIXME: adymo: is this valid for CodeModel
+/* ParsedMethod *old = m_currentContainer->getMethod (method);
+ if (old) {
+ delete method;
+ method = old;
+ } else {
+ m_currentContainer->addMethod (method);
+ }*/
+ }
+ }
+ | definable_operator_symbol
+ ;
+
+/*
+function_tail : formal_part_opt subtype_mark
+ ;
+ */
+
+spec_decl_part
+ : #(GENERIC_PACKAGE_INSTANTIATION def_id generic_inst)
+ | #(PACKAGE_SPECIFICATION ps:def_id
+ {
+ NamespaceDom psc = defineScope( #ps );
+ m_currentContainer = psc;
+ m_scopeStack.append( psc );
+ m_addToStore = true;
+ }
+ pkg_spec_part
+ {
+ m_scopeStack.remove(m_scopeStack.last());
+ if (m_scopeStack.count() == 0) {
+ kdDebug() << "adastore: m_scopeStack is empty!" << endl;
+ m_scopeStack.append( m_model->globalNamespace() );
+ }
+ m_currentContainer = m_scopeStack.last();
+ // m_currentContainer->setDeclarationEndsOnLine (endLine);
+ m_addToStore = false;
+ }
+ )
+ | #(PACKAGE_RENAMING_DECLARATION def_id renames)
+ ;
+
+pkg_spec_part :
+ basic_declarative_items_opt
+ private_declarative_items_opt
+ end_id_opt
+ ;
+
+private_declarative_items_opt
+ : ( { m_currentAccess = CodeModelItem::Protected; }
+ ( basic_decl_item | pragma )+
+ { m_currentAccess = CodeModelItem::Public; }
+ )?
+ ;
+
+/*
+task_type_or_single_decl
+ : #(TASK_TYPE_DECLARATION def_id discrim_part_opt task_definition_opt)
+ | #(SINGLE_TASK_DECLARATION def_id task_definition_opt)
+ ;
+ */
+
+/*
+discriminant_specification
+ : #(DISCRIMINANT_SPECIFICATION defining_identifier_list
+ modifiers subtype_mark init_opt)
+ ;
+ */
+
+/*
+entry_declaration
+ : #(ENTRY_DECLARATION IDENTIFIER
+ discrete_subtype_def_opt formal_part_opt)
+ ;
+ */
+
+/*
+prot_op_decl
+ : entry_declaration
+ | #(PROCEDURE_DECLARATION def_id formal_part_opt)
+ | #(FUNCTION_DECLARATION def_designator function_tail)
+ | rep_spec
+ | pragma
+ ;
+ */
+
+/*
+prot_member_decl_s
+ : #(PROT_MEMBER_DECLARATIONS ( prot_op_decl | comp_decl )* )
+ ;
+
+comp_decl
+ : #(COMPONENT_DECLARATION defining_identifier_list component_subtype_def init_opt)
+ ;
+ */
+
+/*
+// decl_common is shared between declarative_item and basic_decl_item.
+// decl_common only contains specifications.
+decl_common
+ : // type_def:
+ #(ENUMERATION_TYPE_DECLARATION IDENTIFIER enum_id_s)
+ | #(SIGNED_INTEGER_TYPE_DECLARATION IDENTIFIER range)
+ | #(MODULAR_TYPE_DECLARATION IDENTIFIER expression)
+ | #(FLOATING_POINT_DECLARATION IDENTIFIER expression range_constraint_opt)
+ | #(ORDINARY_FIXED_POINT_DECLARATION IDENTIFIER expression range)
+ | #(DECIMAL_FIXED_POINT_DECLARATION IDENTIFIER expression expression range_constraint_opt)
+ | array_type_declaration
+ | access_type_declaration
+ //
+ | #(INCOMPLETE_TYPE_DECLARATION IDENTIFIER discrim_part_opt)
+ // derived_or_private_or_record
+ | #(PRIVATE_EXTENSION_DECLARATION id_and_discrim modifiers subtype_ind)
+ | #(DERIVED_RECORD_EXTENSION id_and_discrim modifiers subtype_ind record_definition)
+ | #(ORDINARY_DERIVED_TYPE_DECLARATION id_and_discrim subtype_ind)
+ | #(PRIVATE_TYPE_DECLARATION id_and_discrim modifiers)
+ | #(RECORD_TYPE_DECLARATION id_and_discrim modifiers record_definition)
+ //
+ | #(SUBTYPE_DECLARATION IDENTIFIER subtype_ind)
+ | generic_decl
+ | use_clause
+ | rep_spec // enumeration_representation_clause only
+ | #(EXCEPTION_RENAMING_DECLARATION def_id compound_name)
+ | #(OBJECT_RENAMING_DECLARATION def_id subtype_mark name)
+ | #(EXCEPTION_DECLARATION defining_identifier_list)
+ | #(NUMBER_DECLARATION defining_identifier_list expression)
+ | #(ARRAY_OBJECT_DECLARATION defining_identifier_list modifiers
+ array_type_definition init_opt)
+ | #(OBJECT_DECLARATION defining_identifier_list modifiers
+ subtype_ind init_opt)
+ ;
+ */
+
+/*
+id_and_discrim
+ : IDENTIFIER discrim_part_opt
+ ;
+ */
+
+/*
+enumeration_literal_specification : IDENTIFIER | CHARACTER_LITERAL
+ ;
+ */
+
+/*
+array_type_declaration
+ : #(ARRAY_TYPE_DECLARATION IDENTIFIER array_type_definition)
+ ;
+ */
+
+/*
+access_type_declaration
+ : #(ACCESS_TO_PROCEDURE_DECLARATION IDENTIFIER modifiers formal_part_opt)
+ | #(ACCESS_TO_FUNCTION_DECLARATION IDENTIFIER modifiers function_tail)
+ | #(ACCESS_TO_OBJECT_DECLARATION IDENTIFIER modifiers subtype_ind)
+ ;
+ */
+
+
+generic_decl
+ : #(GENERIC_PACKAGE_RENAMING generic_formal_part_opt def_id renames)
+ | #(GENERIC_PACKAGE_DECLARATION generic_formal_part_opt gpd:def_id
+ {
+ NamespaceDom psc = defineScope( #gpd );
+ m_currentContainer = psc;
+ m_scopeStack.append( psc );
+ m_addToStore = true;
+ }
+ pkg_spec_part
+ {
+ m_scopeStack.remove(m_scopeStack.last());
+ if (m_scopeStack.count() == 0)
+ m_scopeStack.append( m_model->globalNamespace() );
+ m_currentContainer = m_scopeStack.last();
+ // m_currentContainer->setDeclarationEndsOnLine (endLine);
+ m_addToStore = false;
+ }
+ )
+ | #(GENERIC_PROCEDURE_RENAMING generic_formal_part_opt def_id
+ formal_part_opt renames)
+ | #(GENERIC_PROCEDURE_DECLARATION generic_formal_part_opt subprog_def_id
+ formal_part_opt)
+ | #(GENERIC_FUNCTION_RENAMING generic_formal_part_opt def_designator
+ function_tail renames)
+ | #(GENERIC_FUNCTION_DECLARATION generic_formal_part_opt subprog_def_id
+ function_tail)
+ ;
+
+/*
+generic_formal_part_opt
+ : #(GENERIC_FORMAL_PART
+ ( pragma | use_clause | generic_formal_parameter )*
+ )
+ ;
+ */
+
+/*
+generic_formal_parameter
+ : // FORMAL_TYPE_DECLARATIONs:
+ #(FORMAL_DISCRETE_TYPE_DECLARATION def_id)
+ | #(FORMAL_SIGNED_INTEGER_TYPE_DECLARATION def_id)
+ | #(FORMAL_MODULAR_TYPE_DECLARATION def_id)
+ | #(FORMAL_DECIMAL_FIXED_POINT_DECLARATION def_id)
+ | #(FORMAL_ORDINARY_FIXED_POINT_DECLARATION def_id)
+ | #(FORMAL_FLOATING_POINT_DECLARATION def_id)
+ | formal_array_type_declaration
+ | formal_access_type_declaration
+ | #(FORMAL_PRIVATE_TYPE_DECLARATION id_part modifiers)
+ | #(FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION id_part subtype_ind)
+ | #(FORMAL_PRIVATE_EXTENSION_DECLARATION id_part modifiers subtype_ind)
+ | #(FORMAL_PROCEDURE_DECLARATION def_id formal_part_opt
+ subprogram_default_opt)
+ | #(FORMAL_FUNCTION_DECLARATION def_designator function_tail
+ subprogram_default_opt)
+ | #(FORMAL_PACKAGE_DECLARATION def_id compound_name formal_package_actual_part_opt)
+ | parameter_specification
+ ;
+ */
+
+lib_subprog_decl_or_rename_or_inst_or_body
+ : { m_addToStore = true; }
+ ( subprog_decl
+ | procedure_body
+ | function_body
+ )
+ { m_addToStore = false; }
+ ;
+
+subprog_decl_or_rename_or_inst_or_body
+ : subprog_decl
+ | procedure_body
+ | function_body
+ ;
+
+
+/*
+// A declarative_item may appear in the declarative part of any body.
+declarative_item
+ : #(PACKAGE_BODY_STUB def_id)
+ | #(PACKAGE_BODY def_id pkg_body_part)
+ | spec_decl_part
+ | #(TASK_BODY_STUB def_id)
+ | #(TASK_BODY def_id body_part)
+ | task_type_or_single_decl
+ | #(PROTECTED_BODY_STUB def_id)
+ | #(PROTECTED_BODY def_id prot_op_bodies_opt)
+ | prot_type_or_single_decl
+ | subprog_decl_or_rename_or_inst_or_body
+ | decl_common
+ ;
+ */
+
+
+subprog_decl_or_body
+ : procedure_body
+ | #(PROCEDURE_DECLARATION subprog_def_id formal_part_opt)
+ | function_body
+ | #(FUNCTION_DECLARATION def_designator function_tail)
+ ;
+
+/*
+// Temporary, to be turned into just `qualified'.
+// We get away with it because `qualified' is always mentioned
+// together with `name'.
+// Only exception: `code_stmt', which is not yet implemented.
+name_or_qualified
+ : IDENTIFIER
+ | #(DOT name_or_qualified
+ ( ALL
+ | IDENTIFIER
+ | CHARACTER_LITERAL
+ | OPERATOR_SYMBOL
+ )
+ )
+ | #(INDEXED_COMPONENT name_or_qualified value_s)
+ | #(TIC name_or_qualified
+ ( parenthesized_primary
+ | attribute_id
+ )
+ )
+ ;
+ */
+
+package_body
+ : #(PACKAGE_BODY id:def_id
+ /* TBD
+ { QString name (qtext (id));
+ }
+ */
+ pkg_body_part)
+ ;
+
+/*
+task_body : #(TASK_BODY def_id body_part)
+ ;
+ */
+
+/*
+protected_body : #(PROTECTED_BODY def_id prot_op_bodies_opt)
+ ;
+ */
+
diff --git a/languages/ada/ada.tree.g b/languages/ada/ada.tree.g
new file mode 100644
index 00000000..df167dcd
--- /dev/null
+++ b/languages/ada/ada.tree.g
@@ -0,0 +1,964 @@
+/*
+ * ANTLR Ada95 tree super grammar (base class)
+ *
+ * Oliver M. Kellogg <okellogg@users.sourceforge.net>
+ *
+ * $Id$
+ *
+ */
+
+
+options {
+ language="Cpp";
+}
+
+class AdaTreeParserSuper extends TreeParser;
+options {
+ importVocab=Ada;
+}
+
+// Compilation Unit: This is the start rule.
+
+compilation_unit
+ : context_items_opt ( library_item | subunit ) ( pragma )*
+ ;
+
+pragma : #(PRAGMA IDENTIFIER ( pragma_arg )* )
+ ;
+
+pragma_arg
+ : #(RIGHT_SHAFT IDENTIFIER expression)
+ | expression
+ ;
+
+context_items_opt
+ : #(CONTEXT_CLAUSE ( pragma | with_clause | use_clause )* )
+ ;
+
+with_clause
+ : #(WITH_CLAUSE ( compound_name )+ )
+ ;
+
+compound_name
+ : IDENTIFIER
+ | #(DOT compound_name IDENTIFIER)
+ ;
+
+use_clause
+ : #(USE_TYPE_CLAUSE ( subtype_mark )+ )
+ | #(USE_CLAUSE ( compound_name )+ )
+ ;
+
+subtype_mark
+ : compound_name
+ | #(TIC compound_name attribute_id)
+ ;
+
+attribute_id : RANGE
+ | DIGITS
+ | DELTA
+ | ACCESS
+ | IDENTIFIER
+ ;
+
+library_item :
+ #(LIBRARY_ITEM modifiers
+ ( subprog_decl_or_rename_or_inst_or_body
+ | #(PACKAGE_BODY def_id pkg_body_part)
+ | #(GENERIC_PACKAGE_INSTANTIATION def_id generic_inst)
+ | #(PACKAGE_SPECIFICATION def_id pkg_spec_part)
+ | #(PACKAGE_RENAMING_DECLARATION def_id renames)
+ | generic_decl
+ )
+ )
+ ;
+
+modifiers : #(MODIFIERS
+ ( ABSTRACT
+ | ACCESS
+ | ALIASED
+ | ALL
+ | CONSTANT
+ | IN
+ | LIMITED
+ | OUT
+ | PRIVATE
+ | PROTECTED
+ | REVERSE
+ | TAGGED
+ )*
+ // We can afford to be this loose because the parser
+ // has already fended off illegal usages, i.e. we can
+ // be sure that we are only dealing with permissible
+ // values for each usage context here.
+ // Only exception: PRIVATE as the prefix of private
+ // {generic|package|subprogram} library-level decl.
+ // The parser has let this in for bodies as well
+ // (which is not legal), so we need a semantic check.
+ )
+ ;
+
+id_opt : #(ID_OPT ( def_designator )? )
+ ;
+
+end_id_opt : #(END ( def_designator )? )
+ ;
+
+subprog_decl
+ : #(GENERIC_PROCEDURE_INSTANTIATION def_id generic_inst)
+ | #(PROCEDURE_RENAMING_DECLARATION def_id formal_part_opt renames)
+ | #(PROCEDURE_DECLARATION def_id formal_part_opt)
+ | #(PROCEDURE_BODY_STUB def_id formal_part_opt)
+ | #(ABSTRACT_PROCEDURE_DECLARATION def_id formal_part_opt)
+ | #(GENERIC_FUNCTION_INSTANTIATION def_designator generic_inst)
+ | #(FUNCTION_RENAMING_DECLARATION def_designator function_tail renames)
+ | #(FUNCTION_DECLARATION def_designator function_tail)
+ | #(FUNCTION_BODY_STUB def_designator function_tail)
+ | #(ABSTRACT_FUNCTION_DECLARATION def_id function_tail)
+ ;
+
+def_id : compound_name // Can afford looseness because parser is tight.
+ ;
+
+generic_inst : compound_name ( value_s )?
+ ;
+
+value : #(OTHERS expression)
+ | #(RIGHT_SHAFT ranged_expr_s expression)
+ | ranged_expr_s
+ ;
+
+ranged_expr_s
+ : #(PIPE ranged_expr_s ranged_expr)
+ | ranged_expr
+ ;
+
+ranged_expr
+ : #(DOT_DOT expression simple_expression)
+ | #(RANGE expression range)
+ | expression
+ ;
+
+range_constraint : #(RANGE_CONSTRAINT range)
+ ;
+
+range : ( range_dots
+ | range_attrib_ref
+ )
+ ;
+
+range_dots : #(DOT_DOT simple_expression simple_expression)
+ ;
+
+range_attrib_ref : #(RANGE_ATTRIBUTE_REFERENCE prefix ( expression )? )
+ ;
+
+prefix : IDENTIFIER
+ | #(DOT prefix ( ALL | IDENTIFIER ) )
+ | #(INDEXED_COMPONENT prefix value_s )
+ ;
+
+formal_part_opt : #(FORMAL_PART_OPT ( parameter_specification )* )
+ ;
+
+parameter_specification
+ : #(PARAMETER_SPECIFICATION defining_identifier_list modifiers
+ subtype_mark init_opt)
+ ;
+
+defining_identifier_list : #(DEFINING_IDENTIFIER_LIST ( IDENTIFIER )+ )
+ ;
+
+renames : CHARACTER_STRING // CHARACTER_STRING should not really be there.
+ | OPERATOR_SYMBOL // OPERATOR_SYMBOL should be used instead.
+ | name
+ ;
+
+name : IDENTIFIER
+ | #(DOT name
+ ( ALL
+ | IDENTIFIER
+ | CHARACTER_LITERAL
+ | OPERATOR_SYMBOL
+ )
+ )
+ | #(INDEXED_COMPONENT name value_s)
+ | #(TIC name attribute_id)
+ ;
+
+definable_operator_symbol : OPERATOR_SYMBOL
+ ;
+
+parenthesized_primary
+ : #(PARENTHESIZED_PRIMARY ( NuLL | value_s extension_opt ) )
+ ;
+
+extension_opt : #(EXTENSION_OPT ( NuLL | value_s )? )
+ ;
+
+def_designator
+ : compound_name
+ | definable_operator_symbol
+ ;
+
+function_tail : formal_part_opt subtype_mark
+ ;
+
+spec_decl_part
+ : #(GENERIC_PACKAGE_INSTANTIATION def_id generic_inst)
+ | #(PACKAGE_SPECIFICATION def_id pkg_spec_part)
+ | #(PACKAGE_RENAMING_DECLARATION def_id renames)
+ ;
+
+pkg_spec_part
+ : basic_declarative_items_opt
+ private_declarative_items_opt
+ end_id_opt
+ ;
+
+basic_declarative_items_opt
+ : #(BASIC_DECLARATIVE_ITEMS_OPT ( basic_decl_item )* )
+ ;
+
+private_declarative_items_opt
+ : #(PRIVATE_DECLARATIVE_ITEMS_OPT ( basic_decl_item )* )
+ ;
+
+basic_decl_item
+ : spec_decl_part
+ | task_type_or_single_decl
+ | prot_type_or_single_decl
+ | subprog_decl
+ | decl_common
+ ;
+
+task_type_or_single_decl
+ : #(TASK_TYPE_DECLARATION def_id discrim_part_opt task_definition_opt)
+ | #(SINGLE_TASK_DECLARATION def_id task_definition_opt)
+ ;
+
+task_definition_opt
+ : task_items_opt private_task_items_opt
+ ;
+
+discrim_part_opt
+ : #(DISCRIM_PART_OPT ( BOX | discriminant_specifications )? )
+ ;
+
+discriminant_specifications
+ : #(DISCRIMINANT_SPECIFICATIONS ( discriminant_specification )* )
+ ;
+
+discriminant_specification
+ : #(DISCRIMINANT_SPECIFICATION defining_identifier_list
+ modifiers subtype_mark init_opt)
+ ;
+
+init_opt : #(INIT_OPT ( expression )? )
+ ; // `expression' is of course much too loose;
+ // semantic checks are required in the usage contexts.
+
+task_items_opt
+ : #(TASK_ITEMS_OPT entrydecls_repspecs_opt)
+ ;
+
+entrydecls_repspecs_opt
+ : ( entry_declaration | pragma | rep_spec )*
+ ;
+
+entry_declaration
+ : #(ENTRY_DECLARATION IDENTIFIER
+ discrete_subtype_def_opt formal_part_opt)
+ ;
+
+discrete_subtype_def_opt
+ : #(DISCRETE_SUBTYPE_DEF_OPT ( discrete_subtype_definition )? )
+ ;
+
+discrete_subtype_definition // TBD
+ : range
+ | subtype_ind
+ ;
+
+rep_spec : #(RECORD_REPRESENTATION_CLAUSE subtype_mark align_opt comp_loc_s)
+ | #(AT_CLAUSE subtype_mark expression)
+ | #(ATTRIBUTE_DEFINITION_CLAUSE subtype_mark expression)
+ // attrib_def. Semantic check must ensure that the
+ // subtype_mark contains an attribute reference.
+ | #(ENUMERATION_REPESENTATION_CLAUSE local_enum_name enumeration_aggregate)
+ ;
+
+align_opt : #(MOD_CLAUSE_OPT ( expression )? )
+ ;
+
+comp_loc_s
+ : #(COMPONENT_CLAUSES_OPT
+ ( pragma
+ | subtype_mark expression range
+ )*
+ )
+ ;
+
+private_task_items_opt
+ : #(PRIVATE_TASK_ITEMS_OPT entrydecls_repspecs_opt )
+ ;
+
+prot_type_or_single_decl
+ : #(PROTECTED_TYPE_DECLARATION def_id discrim_part_opt protected_definition)
+ | #(SINGLE_PROTECTED_DECLARATION def_id protected_definition)
+ ;
+
+prot_private_opt : #(PROT_PRIVATE_OPT ( prot_member_decl_s )? )
+ ;
+
+protected_definition
+ : prot_op_decl_s prot_private_opt end_id_opt
+ ;
+
+prot_op_decl_s
+ : #(PROT_OP_DECLARATIONS ( prot_op_decl )* )
+ ;
+
+prot_op_decl
+ : entry_declaration
+ | #(PROCEDURE_DECLARATION def_id formal_part_opt)
+ | #(FUNCTION_DECLARATION def_designator function_tail)
+ | rep_spec
+ | pragma
+ ;
+
+prot_member_decl_s
+ : #(PROT_MEMBER_DECLARATIONS ( prot_op_decl | comp_decl )* )
+ ;
+
+comp_decl
+ : #(COMPONENT_DECLARATION defining_identifier_list component_subtype_def init_opt)
+ ;
+
+// decl_common is shared between declarative_item and basic_decl_item.
+// decl_common only contains specifications.
+decl_common
+ : // type_def:
+ #(ENUMERATION_TYPE_DECLARATION IDENTIFIER enum_id_s)
+ | #(SIGNED_INTEGER_TYPE_DECLARATION IDENTIFIER range)
+ | #(MODULAR_TYPE_DECLARATION IDENTIFIER expression)
+ | #(FLOATING_POINT_DECLARATION IDENTIFIER expression range_constraint_opt)
+ | #(ORDINARY_FIXED_POINT_DECLARATION IDENTIFIER expression range)
+ | #(DECIMAL_FIXED_POINT_DECLARATION IDENTIFIER expression expression range_constraint_opt)
+ | array_type_declaration
+ | access_type_declaration
+ //
+ | #(INCOMPLETE_TYPE_DECLARATION IDENTIFIER discrim_part_opt)
+ // derived_or_private_or_record
+ | #(PRIVATE_EXTENSION_DECLARATION id_and_discrim modifiers subtype_ind)
+ | #(DERIVED_RECORD_EXTENSION id_and_discrim modifiers subtype_ind record_definition)
+ | #(ORDINARY_DERIVED_TYPE_DECLARATION id_and_discrim subtype_ind)
+ | #(PRIVATE_TYPE_DECLARATION id_and_discrim modifiers)
+ | #(RECORD_TYPE_DECLARATION id_and_discrim modifiers record_definition)
+ //
+ | #(SUBTYPE_DECLARATION IDENTIFIER subtype_ind)
+ | generic_decl
+ | use_clause
+ | rep_spec // enumeration_representation_clause only
+ | #(EXCEPTION_RENAMING_DECLARATION def_id compound_name)
+ | #(OBJECT_RENAMING_DECLARATION def_id subtype_mark name)
+ | #(EXCEPTION_DECLARATION defining_identifier_list)
+ | #(NUMBER_DECLARATION defining_identifier_list expression)
+ | #(ARRAY_OBJECT_DECLARATION defining_identifier_list modifiers
+ array_type_definition init_opt)
+ | #(OBJECT_DECLARATION defining_identifier_list modifiers
+ subtype_ind init_opt)
+ ;
+
+id_and_discrim
+ : IDENTIFIER discrim_part_opt
+ ;
+
+enum_id_s : ( enumeration_literal_specification )+
+ ;
+
+enumeration_literal_specification : IDENTIFIER | CHARACTER_LITERAL
+ ;
+
+array_type_definition
+ : index_or_discrete_range_s component_subtype_def
+ ;
+
+range_constraint_opt : ( range_constraint )?
+ ;
+
+array_type_declaration
+ : #(ARRAY_TYPE_DECLARATION IDENTIFIER array_type_definition)
+ ;
+
+index_or_discrete_range_s
+ : index_or_discrete_range
+ | #(COMMA index_or_discrete_range_s index_or_discrete_range)
+ ;
+
+index_or_discrete_range
+ : #(DOT_DOT simple_expression simple_expression)
+ | #(RANGE simple_expression ( BOX | range) )
+ | simple_expression
+ ;
+
+component_subtype_def : modifiers subtype_ind // mod=aliased_opt
+ ;
+
+subtype_ind
+ : #(SUBTYPE_INDICATION subtype_mark constraint_opt)
+ ;
+
+constraint_opt
+ : ( range_constraint
+ | digits_constraint
+ | delta_constraint
+ | index_constraint
+ | discriminant_constraint
+ )?
+ ;
+
+digits_constraint
+ : #(DIGITS_CONSTRAINT expression range_constraint_opt)
+ ;
+
+delta_constraint
+ : #(DELTA_CONSTRAINT expression range_constraint_opt)
+ ;
+
+index_constraint
+ : #(INDEX_CONSTRAINT ( discrete_range )+ )
+ ;
+
+discrete_range
+ : range
+ | subtype_ind
+ ;
+
+discriminant_constraint
+ : #(DISCRIMINANT_CONSTRAINT ( discriminant_association )+ )
+ ;
+
+discriminant_association
+ : #(DISCRIMINANT_ASSOCIATION selector_names_opt expression)
+ ;
+
+selector_names_opt
+ : #(SELECTOR_NAMES_OPT ( selector_name )* )
+ ;
+
+selector_name : IDENTIFIER // TBD: sem pred
+ ;
+
+access_type_declaration
+ : #(ACCESS_TO_PROCEDURE_DECLARATION IDENTIFIER modifiers formal_part_opt)
+ | #(ACCESS_TO_FUNCTION_DECLARATION IDENTIFIER modifiers function_tail)
+ | #(ACCESS_TO_OBJECT_DECLARATION IDENTIFIER modifiers subtype_ind)
+ ;
+
+record_definition : ( component_list )?
+ ;
+
+component_list
+ : component_items ( variant_part )?
+ ;
+
+component_items
+ : #(COMPONENT_ITEMS ( pragma | comp_decl )* )
+ ;
+
+variant_part
+ : #(VARIANT_PART discriminant_direct_name variant_s)
+ ;
+
+discriminant_direct_name : IDENTIFIER // TBD: symtab lookup.
+ ;
+
+variant_s : #(VARIANTS ( variant )+ )
+ ;
+
+variant : #(VARIANT choice_s ( component_list )? )
+ ;
+
+choice_s : #(PIPE choice_s choice )
+ | choice
+ ;
+
+choice : OTHERS
+ | discrete_with_range
+ | expression
+ ;
+
+discrete_with_range : mark_with_constraint | range
+ ;
+
+mark_with_constraint
+ : #(MARK_WITH_CONSTRAINT subtype_mark range_constraint)
+ ;
+
+local_enum_name : IDENTIFIER // to be refined: do a symbol table lookup
+ ;
+
+enumeration_aggregate : ( value )*
+ ;
+
+generic_decl
+ : #(GENERIC_PACKAGE_RENAMING generic_formal_part_opt def_id renames)
+ | #(GENERIC_PACKAGE_DECLARATION generic_formal_part_opt def_id
+ pkg_spec_part)
+ | #(GENERIC_PROCEDURE_RENAMING generic_formal_part_opt def_id
+ formal_part_opt renames)
+ | #(GENERIC_PROCEDURE_DECLARATION generic_formal_part_opt def_id
+ formal_part_opt)
+ | #(GENERIC_FUNCTION_RENAMING generic_formal_part_opt def_designator
+ function_tail renames)
+ | #(GENERIC_FUNCTION_DECLARATION generic_formal_part_opt def_id
+ function_tail)
+ ;
+
+generic_formal_part_opt
+ : #(GENERIC_FORMAL_PART
+ ( pragma | use_clause | generic_formal_parameter )*
+ )
+ ;
+
+generic_formal_parameter
+ : // FORMAL_TYPE_DECLARATIONs:
+ #(FORMAL_DISCRETE_TYPE_DECLARATION def_id)
+ | #(FORMAL_SIGNED_INTEGER_TYPE_DECLARATION def_id)
+ | #(FORMAL_MODULAR_TYPE_DECLARATION def_id)
+ | #(FORMAL_DECIMAL_FIXED_POINT_DECLARATION def_id)
+ | #(FORMAL_ORDINARY_FIXED_POINT_DECLARATION def_id)
+ | #(FORMAL_FLOATING_POINT_DECLARATION def_id)
+ | formal_array_type_declaration
+ | formal_access_type_declaration
+ | #(FORMAL_PRIVATE_TYPE_DECLARATION id_part modifiers)
+ | #(FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION id_part subtype_ind)
+ | #(FORMAL_PRIVATE_EXTENSION_DECLARATION id_part modifiers subtype_ind)
+ | #(FORMAL_PROCEDURE_DECLARATION def_id formal_part_opt
+ subprogram_default_opt)
+ | #(FORMAL_FUNCTION_DECLARATION def_designator function_tail
+ subprogram_default_opt)
+ | #(FORMAL_PACKAGE_DECLARATION def_id compound_name formal_package_actual_part_opt)
+ | parameter_specification
+ ;
+
+
+id_part : def_id discrim_part_opt
+ ;
+
+formal_array_type_declaration : array_type_declaration
+ ;
+
+formal_access_type_declaration : access_type_declaration
+ ;
+
+subprogram_default_opt : ( BOX | name )?
+ // #(SUBPROGRAM_DEFAULT_OPT ( BOX | name )? )
+ ;
+
+formal_package_actual_part_opt
+ : ( BOX | defining_identifier_list )?
+ ;
+
+subprog_decl_or_rename_or_inst_or_body
+ : subprog_decl
+ | procedure_body
+ | function_body
+ ;
+
+procedure_body
+ : #(PROCEDURE_BODY def_id formal_part_opt body_part)
+ ;
+
+function_body
+ : #(FUNCTION_BODY def_designator function_tail body_part)
+ ;
+
+body_part : declarative_part block_body end_id_opt
+ ;
+
+declarative_part
+ : #(DECLARATIVE_PART ( pragma | declarative_item )* )
+ ;
+
+// A declarative_item may appear in the declarative part of any body.
+declarative_item
+ : #(PACKAGE_BODY_STUB def_id)
+ | #(PACKAGE_BODY def_id pkg_body_part)
+ | spec_decl_part
+ | #(TASK_BODY_STUB def_id)
+ | #(TASK_BODY def_id body_part end_id_opt)
+ | task_type_or_single_decl
+ | #(PROTECTED_BODY_STUB def_id)
+ | #(PROTECTED_BODY def_id prot_op_bodies_opt end_id_opt)
+ | prot_type_or_single_decl
+ | subprog_decl_or_rename_or_inst_or_body
+ | decl_common
+ ;
+
+pkg_body_part : declarative_part block_body_opt end_id_opt
+ ;
+
+block_body_opt
+ : #(BLOCK_BODY_OPT ( handled_stmt_s )? )
+ ;
+
+prot_op_bodies_opt
+ : #(PROT_OP_BODIES_OPT
+ ( pragma | entry_body | subprog_decl_or_body )*
+ )
+ ;
+
+subprog_decl_or_body
+ : procedure_body
+ | #(PROCEDURE_DECLARATION def_id formal_part_opt)
+ | function_body
+ | #(FUNCTION_DECLARATION def_designator function_tail)
+ ;
+
+block_body : #(BLOCK_BODY handled_stmt_s)
+ ;
+
+handled_stmt_s
+ : #(HANDLED_SEQUENCE_OF_STATEMENTS statements except_handler_part_opt)
+ ;
+
+handled_stmts_opt
+ : #(HANDLED_STMTS_OPT ( statements except_handler_part_opt )? )
+ ;
+
+statements
+ : #(SEQUENCE_OF_STATEMENTS ( pragma | statement )+ )
+ ;
+
+statement : #(STATEMENT def_label_opt
+ ( null_stmt
+ | exit_stmt
+ | return_stmt
+ | goto_stmt
+ | delay_stmt
+ | abort_stmt
+ | raise_stmt
+ | requeue_stmt
+ | accept_stmt
+ | select_stmt
+ | if_stmt
+ | case_stmt
+ | loop_stmt id_opt
+ | block end_id_opt
+ | call_or_assignment
+ // | code_stmt // not yet implemented in parser
+ )
+ )
+ ;
+
+def_label_opt : #(LABEL_OPT ( IDENTIFIER )? )
+ ;
+
+null_stmt : NULL_STATEMENT
+ ;
+
+if_stmt : #(IF_STATEMENT cond_clause elsifs_opt else_opt)
+ ;
+
+cond_clause : #(COND_CLAUSE condition statements)
+ ;
+
+condition : expression
+ ;
+
+elsifs_opt : #(ELSIFS_OPT ( cond_clause )* )
+ ;
+
+else_opt : #(ELSE_OPT ( statements )? )
+ ;
+
+case_stmt : #(CASE_STATEMENT expression alternative_s)
+ ;
+
+alternative_s : ( case_statement_alternative )+
+ ;
+
+case_statement_alternative
+ : #(CASE_STATEMENT_ALTERNATIVE choice_s statements)
+ ;
+
+loop_stmt
+ : #(LOOP_STATEMENT iteration_scheme_opt statements)
+ ;
+
+iteration_scheme_opt
+ : #(ITERATION_SCHEME_OPT
+ ( #(WHILE condition)
+ | #(FOR IDENTIFIER modifiers discrete_subtype_definition)
+ )? // mod=reverse_opt
+ )
+ ;
+
+block : #(BLOCK_STATEMENT declare_opt block_body)
+ ;
+
+declare_opt
+ : #(DECLARE_OPT ( declarative_part )? )
+ ;
+
+exit_stmt
+ : #(EXIT_STATEMENT ( label_name )? ( WHEN condition )? ) // TBD !!!
+ ;
+
+label_name : IDENTIFIER
+ ;
+
+return_stmt
+ : #(RETURN_STATEMENT ( expression )? )
+ ;
+
+goto_stmt : #(GOTO_STATEMENT label_name)
+ ;
+
+call_or_assignment
+ : #(ASSIGNMENT_STATEMENT name expression)
+ | #(CALL_STATEMENT name)
+ ;
+
+entry_body
+ : #(ENTRY_BODY def_id entry_body_formal_part entry_barrier body_part)
+ ;
+
+entry_body_formal_part : entry_index_spec_opt formal_part_opt
+ ;
+
+entry_index_spec_opt
+ : #(ENTRY_INDEX_SPECIFICATION ( def_id discrete_subtype_definition )? )
+ ;
+
+entry_barrier : condition
+ ;
+
+entry_call_stmt
+ : #(ENTRY_CALL_STATEMENT name)
+ ;
+
+accept_stmt
+ : #(ACCEPT_STATEMENT def_id entry_index_opt formal_part_opt
+ handled_stmts_opt end_id_opt )
+ ;
+
+entry_index_opt
+ : #(ENTRY_INDEX_OPT ( expression )? )
+ ;
+
+delay_stmt
+ : #(DELAY_STATEMENT modifiers expression) //mod=until_opt
+ ;
+
+// SELECT_STATEMENT itself is not modeled since it is trivially
+// reconstructed:
+// select_statement ::= selective_accept | timed_entry_call
+// | conditional_entry_call | asynchronous_select
+//
+select_stmt
+ : #(ASYNCHRONOUS_SELECT triggering_alternative abortable_part)
+ | #(SELECTIVE_ACCEPT selective_accept)
+ | #(TIMED_ENTRY_CALL entry_call_alternative delay_alternative)
+ | #(CONDITIONAL_ENTRY_CALL entry_call_alternative statements)
+ ;
+
+triggering_alternative
+ : #(TRIGGERING_ALTERNATIVE
+ ( delay_stmt | entry_call_stmt ) stmts_opt
+ )
+ ;
+
+abortable_part
+ : #(ABORTABLE_PART stmts_opt)
+ ;
+
+entry_call_alternative
+ : #(ENTRY_CALL_ALTERNATIVE entry_call_stmt stmts_opt)
+ ;
+
+selective_accept : guard_opt select_alternative or_select_opt else_opt
+ ;
+
+guard_opt : #(GUARD_OPT ( condition ( pragma )* )? )
+ ;
+
+select_alternative
+ : accept_alternative
+ | delay_alternative
+ | TERMINATE_ALTERNATIVE
+ ;
+
+accept_alternative
+ : #(ACCEPT_ALTERNATIVE accept_stmt stmts_opt)
+ ;
+
+delay_alternative
+ : #(DELAY_ALTERNATIVE delay_stmt stmts_opt)
+ ;
+
+stmts_opt : ( pragma | statement )*
+ ;
+
+or_select_opt
+ : #(OR_SELECT_OPT ( guard_opt select_alternative )* )
+ ;
+
+abort_stmt
+ : #(ABORT_STATEMENT ( name )+ )
+ ;
+
+except_handler_part_opt
+ : #(EXCEPT_HANDLER_PART_OPT ( exception_handler )* )
+ ;
+
+exception_handler
+ : #(EXCEPTION_HANDLER identifier_colon_opt except_choice_s
+ statements
+ )
+ ;
+
+identifier_colon_opt
+ : #(IDENTIFIER_COLON_OPT ( IDENTIFIER )? )
+ ;
+
+except_choice_s
+ : #(PIPE except_choice_s exception_choice)
+ | exception_choice
+ ;
+
+exception_choice : compound_name
+ | OTHERS
+ ;
+
+raise_stmt
+ : #(RAISE_STATEMENT ( compound_name )? )
+ ;
+
+requeue_stmt
+ : #(REQUEUE_STATEMENT name ( ABORT )? )
+ ;
+
+operator_call : #(OPERATOR_SYMBOL value_s)
+ ;
+
+value_s : #(VALUES ( value )+ )
+ ;
+
+expression
+ : #(AND expression relation)
+ | #(AND_THEN expression relation)
+ | #(OR expression relation)
+ | #(OR_ELSE expression relation)
+ | #(XOR expression relation)
+ | relation
+ ;
+
+relation
+ : #(IN simple_expression range_or_mark)
+ | #(NOT_IN simple_expression range_or_mark)
+ | #(EQ simple_expression simple_expression)
+ | #(NE simple_expression simple_expression)
+ | #(LT_ simple_expression simple_expression)
+ | #(LE simple_expression simple_expression)
+ | #(GT simple_expression simple_expression)
+ | #(GE simple_expression simple_expression)
+ | simple_expression
+ ;
+
+range_or_mark
+ : range
+ | subtype_mark
+ ;
+
+simple_expression
+ : #(PLUS simple_expression signed_term)
+ | #(MINUS simple_expression signed_term)
+ | #(CONCAT simple_expression signed_term)
+ | signed_term
+ ;
+
+signed_term
+ : #(UNARY_PLUS term)
+ | #(UNARY_MINUS term)
+ | term
+ ;
+
+term : #(STAR term factor)
+ | #(DIV term factor)
+ | #(MOD term factor)
+ | #(REM term factor)
+ | factor
+ ;
+
+factor : #(NOT primary)
+ | #(ABS primary)
+ | #(EXPON primary primary)
+ | primary
+ ;
+
+primary :
+ ( name_or_qualified
+ | parenthesized_primary
+ | allocator
+ | NuLL
+ | NUMERIC_LIT
+ | CHARACTER_LITERAL
+ | CHAR_STRING
+ | operator_call
+ )
+ ;
+
+// Temporary, to be turned into just `qualified'.
+// We get away with it because `qualified' is always mentioned
+// together with `name'.
+// Only exception: `code_stmt', which is not yet implemented.
+name_or_qualified
+ : IDENTIFIER
+ | #(DOT name_or_qualified
+ ( ALL
+ | IDENTIFIER
+ | CHARACTER_LITERAL
+ | OPERATOR_SYMBOL
+ )
+ )
+ | #(INDEXED_COMPONENT name_or_qualified value_s)
+ | #(TIC name_or_qualified
+ ( parenthesized_primary
+ | attribute_id
+ )
+ )
+ ;
+
+allocator : #(ALLOCATOR name_or_qualified)
+ ;
+
+subunit : #(SUBUNIT compound_name
+ ( subprogram_body
+ | package_body
+ | task_body
+ | protected_body
+ )
+ )
+ ;
+
+subprogram_body
+ : procedure_body
+ | function_body
+ ;
+
+package_body : #(PACKAGE_BODY def_id pkg_body_part)
+ ;
+
+task_body : #(TASK_BODY def_id body_part)
+ ;
+
+protected_body : #(PROTECTED_BODY def_id prot_op_bodies_opt)
+ ;
+
+// TBD
+// code_stmt : #(CODE_STATEMENT qualified)
+// ;
+
diff --git a/languages/ada/ada_utils.cpp b/languages/ada/ada_utils.cpp
new file mode 100644
index 00000000..9630f058
--- /dev/null
+++ b/languages/ada/ada_utils.cpp
@@ -0,0 +1,69 @@
+/*
+ */
+#include <stdlib.h>
+#include <unistd.h>
+#include <iostream>
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qfile.h>
+#include <qregexp.h>
+
+#include <kdebug.h>
+
+#include "ada_utils.hpp"
+#include "adasupport.hpp"
+
+QString qtext (const RefAdaAST& n)
+{
+ return QString::fromLatin1 (text (n).c_str ());
+}
+
+QStringList qnamelist (const RefAdaAST& n)
+{
+ QString txt = qtext (n);
+ // kdDebug() << "qnamelist: input is " << txt << endl;
+ return QStringList::split ('.', txt);
+}
+
+QString ada_spec_filename (const QString& comp_unit_name)
+{
+ QString fn (comp_unit_name.lower ());
+
+ fn.replace (QRegExp("."), "-");
+ fn += ".ads";
+ return fn;
+}
+
+QString fq_specfilename (const QString& comp_unit_name)
+{
+ QString fname = ada_spec_filename (comp_unit_name);
+
+ if (QFile::exists (fname))
+ return fname;
+
+ QString adaincpath = getenv ("ADA_INCLUDE_PATH");
+ if (adaincpath.isNull ())
+ return QString::null;
+
+ QStringList dirs = QStringList::split (':', adaincpath);
+ QString fq_filename;
+ for (QStringList::Iterator it = dirs.begin (); it != dirs.end (); it++) {
+ fq_filename = *it;
+ if (! fq_filename.endsWith ("/"))
+ fq_filename += "/";
+ fq_filename += fname;
+ if (QFile::exists (fq_filename))
+ return fq_filename;
+ }
+ if (fname.startsWith ("ada-") ||
+ fname.startsWith ("text_io") ||
+ fname.startsWith ("system") ||
+ fname.startsWith ("unchecked_")) {
+ kdDebug () << "resolution of Ada predefined library is TBD" << endl;
+ } else {
+ kdDebug () << "Cannot find file " << fname << endl;
+ }
+ return QString::null;
+}
+
diff --git a/languages/ada/ada_utils.hpp b/languages/ada/ada_utils.hpp
new file mode 100644
index 00000000..b1df43dd
--- /dev/null
+++ b/languages/ada/ada_utils.hpp
@@ -0,0 +1,15 @@
+/*
+ */
+#ifndef ADA_UTILS_H
+#define ADA_UTILS_H
+
+#include <qstring.h>
+#include "AdaAST.hpp"
+
+QString qtext (const RefAdaAST& n);
+QStringList qnamelist (const RefAdaAST& n);
+QString ada_spec_filename (const QString& comp_unit_name);
+QString fq_specfilename (const QString& comp_unit_name);
+
+#endif
+
diff --git a/languages/ada/adasupport.cpp b/languages/ada/adasupport.cpp
new file mode 100644
index 00000000..6b877b7b
--- /dev/null
+++ b/languages/ada/adasupport.cpp
@@ -0,0 +1,168 @@
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stack>
+#include <string>
+#include <antlr/AST.hpp>
+#include "AdaParser.hpp"
+#include "AdaTokenTypes.hpp"
+#include "adasupport.hpp"
+
+#define eq !strcmp
+
+using namespace std;
+
+const RefAdaAST AdaAST::nullAdaAST(antlr::nullAST.get() );
+
+using namespace std;
+
+string text (const RefAdaAST& n)
+{
+ if (n == 0 || n == AdaAST::nullAdaAST)
+ return "";
+ string retval;
+ int type = n->getType();
+ if (type == AdaTokenTypes::DOT) {
+ const RefAdaAST& sibs = n->down ();
+ retval = text (sibs);
+ retval.append (".");
+ retval.append (text (sibs->right()));
+ } else {
+ retval = n->getText();
+ }
+ /*
+ const RefAdaAST& r = n->right();
+ if (r != 0 && r->getType () == AdaTokenTypes::DOT) {
+ retval.append (".");
+ retval.append (text (r->right()));
+ }
+ */
+ return retval;
+}
+
+int txteq (RefAdaAST n1, RefAdaAST n2)
+{
+ if (!n1 || !n2 || n1 == antlr::nullAST || n2 == antlr::nullAST)
+ return 0;
+ const char* s1 = n1->getText().c_str();
+ const char* s2 = n2->getText().c_str();
+ if (strcasecmp (s1, s2) != 0)
+ return 0;
+ n1 = n1->right ();
+ n2 = n2->right ();
+ if (!n1 || !n2 || n1 == antlr::nullAST || n2 == antlr::nullAST)
+ return 1;
+ if (n1->getType () == AdaTokenTypes::DOT)
+ if (n2->getType () == AdaTokenTypes::DOT)
+ return txteq (n1->right (), n2->right ());
+ else
+ return 0;
+ else if (n2->getType () == AdaTokenTypes::DOT)
+ return 0;
+ return 1;
+}
+
+std::stack<RefAdaAST> defid_stack;
+
+void AdaParser::push_def_id (const RefAdaAST& defid)
+{
+#ifdef __DEBUG__
+ string txt (text (defid));
+ printf ("push_def_id: pushing %s\n", txt.c_str());
+#endif
+ defid_stack.push (defid);
+}
+
+const RefAdaAST& AdaParser::pop_def_id ()
+{
+ if (defid_stack.size() == 0) {
+ fprintf (stderr, "pop_def_id() called on empty stack\n");
+ // return static_cast<RefAdaAST>(antlr::nullAST);
+ return AdaAST::nullAdaAST;
+ }
+ RefAdaAST& top = defid_stack.top ();
+#ifdef __DEBUG__
+ string txt (text (top));
+ printf ("pop_def_id: popping %s\n", txt.c_str());
+#endif
+ defid_stack.pop ();
+ return top;
+}
+
+bool AdaParser::end_id_matches_def_id (const RefAdaAST& endid)
+{
+ if (defid_stack.size() == 0)
+ return false;
+ RefAdaAST& top = defid_stack.top ();
+ string defid (text (top));
+ defid_stack.pop();
+ if (endid == 0 || endid == antlr::nullAST)
+ return false;
+ string txt (text (endid));
+ if (strcasecmp (defid.c_str (), txt.c_str ()) != 0) {
+ string errtxt ("End id ");
+ errtxt.append (txt);
+ errtxt.append (" does not match ");
+ errtxt.append (defid);
+ reportError (errtxt);
+ return false;
+ }
+#ifdef __DEBUG__
+ printf ("end_id_matches_def_id: popped %s\n", txt.c_str());
+#endif
+ return true;
+}
+
+char * strtolower (char *string)
+{
+ char *p = string;
+ if (!p)
+ return NULL;
+ while (*p)
+ {
+ if (isupper (*p))
+ *p = tolower (*p);
+ p++;
+ }
+ return string;
+}
+
+char * extracted_operator (const char *string)
+{
+ int len = strlen (string);
+ static char op[10];
+
+ if (len < 4 && len > 5 || *string != '"' || *(string + len - 1) != '"')
+ return NULL;
+
+ strcpy (op, string + 1);
+ op[len - 2] = '\0'; /* discard ending quotation mark */
+ strtolower (op);
+ return op;
+}
+
+bool AdaParser::definable_operator (const char *string)
+{ // operator_symbol sans "/="
+ char *op = extracted_operator (string);
+ if (op == NULL)
+ return false;
+ return
+ (eq (op, "=") ||
+ eq (op, "<") || eq (op, ">") ||
+ eq (op, "<=") || eq (op, ">=") ||
+ eq (op, "&") || eq (op, "**") ||
+ eq (op, "*") || eq (op, "/") || eq (op, "+") || eq (op, "-") ||
+ eq (op, "abs") || eq (op, "rem") || eq (op, "mod") ||
+ eq (op, "and") || eq (op, "or") || eq (op, "xor") || eq (op, "not"));
+}
+
+bool AdaParser::is_operator_symbol (const char *string)
+{
+ char *op;
+ if (definable_operator (string))
+ return true;
+ op = extracted_operator (string);
+ return (eq (op, "/="));
+}
+
diff --git a/languages/ada/adasupport.hpp b/languages/ada/adasupport.hpp
new file mode 100644
index 00000000..9d65e0e5
--- /dev/null
+++ b/languages/ada/adasupport.hpp
@@ -0,0 +1,13 @@
+/*
+ */
+#ifndef ADASUPPORT_H
+#define ADASUPPORT_H
+
+#include <string>
+#include "AdaAST.hpp"
+
+std::string text (const RefAdaAST& n);
+int txteq (RefAdaAST n1, RefAdaAST n2);
+
+#endif
+
diff --git a/languages/ada/adasupportpart.cpp b/languages/ada/adasupportpart.cpp
new file mode 100644
index 00000000..39ead02a
--- /dev/null
+++ b/languages/ada/adasupportpart.cpp
@@ -0,0 +1,376 @@
+
+#include <qfileinfo.h>
+#include <qlistview.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+#include <qvbox.h>
+#include <qprogressbar.h>
+#include <qwhatsthis.h>
+
+#include <kgenericfactory.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstatusbar.h>
+#include <kdialogbase.h>
+#include <kiconloader.h>
+
+#include <fstream>
+#include <sstream>
+
+#include "kdevgenericfactory.h"
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevmainwindow.h"
+#include "kdevpartcontroller.h"
+#include "codemodel.h"
+#include "adasupportpart.h"
+#include "problemreporter.h"
+#include "backgroundparser.h"
+
+#include "AdaLexer.hpp"
+#include "AdaParser.hpp"
+#include "AdaStoreWalker.hpp"
+#include "AdaAST.hpp"
+
+#include <kdevplugininfo.h>
+
+enum { KDEV_DB_VERSION = 6 };
+enum { KDEV_PCS_VERSION = 6 };
+
+typedef KDevGenericFactory<AdaSupportPart> AdaSupportPartFactory;
+
+static const KDevPluginInfo data("kdevadasupport");
+K_EXPORT_COMPONENT_FACTORY (libkdevadasupport, AdaSupportPartFactory (data))
+
+
+struct AdaSupportPartData {
+ ProblemReporter* problemReporter;
+
+ AdaSupportPartData () : problemReporter (0) {}
+};
+
+AdaSupportPart::AdaSupportPart (QObject *parent, const char *name, const QStringList &)
+ : KDevLanguageSupport (&data, parent, name ? name : "AdaSupportPart"), d (new AdaSupportPartData())
+{
+ setInstance (AdaSupportPartFactory::instance ());
+
+ d->problemReporter = new ProblemReporter (this);
+// connect (core (), SIGNAL (configWidget (KDialogBase*)),
+// d->problemReporter, SLOT (configWidget (KDialogBase*)));
+ d->problemReporter->setIcon( SmallIcon("info") );
+ mainWindow( )->embedOutputView( d->problemReporter, i18n("Problems"), i18n("Problem reporter"));
+ QWhatsThis::add(d->problemReporter, i18n("<b>Problem reporter</b><p>This window shows various \"problems\" in your project. "
+ "It displays errors reported by a language parser."));
+
+ setXMLFile ("adasupportpart.rc");
+
+ connect (core (), SIGNAL (projectOpened ()), this, SLOT (projectOpened ()));
+ connect (core (), SIGNAL (projectClosed ()), this, SLOT (projectClosed ()));
+
+ connect (partController (), SIGNAL (savedFile (const KURL&)),
+ this, SLOT (savedFile (const KURL&)));
+
+// connect (core (), SIGNAL (configWidget (KDialogBase*)), this, SLOT (configWidget (KDialogBase*)));
+ connect( core(), SIGNAL(configWidget(KDialogBase*)),
+ d->problemReporter, SLOT(configWidget(KDialogBase*)) );
+
+ // a small hack (robe)
+ //classStore ()->globalScope ()->setName ("(default packages)");
+ //classStore ()->addScope (classStore ()->globalScope ());
+ //classStore ()->globalScope ()->setName (QString::null);
+}
+
+
+AdaSupportPart::~AdaSupportPart ()
+{
+ mainWindow ()->removeView (d->problemReporter);
+ delete (d->problemReporter);
+ d->problemReporter = 0;
+
+ delete (d);
+ d = 0;
+}
+
+
+KDevLanguageSupport::Features AdaSupportPart::features ()
+{
+ return KDevLanguageSupport::Features
+ ( // TBD: Classes |
+ Functions | Namespaces);
+}
+
+void AdaSupportPart::projectOpened ()
+{
+ connect (project (), SIGNAL (addedFilesToProject (const QStringList &)),
+ this, SLOT (addedFilesToProject (const QStringList &)));
+ connect (project (), SIGNAL (removedFilesFromProject (const QStringList &)),
+ this, SLOT (removedFilesFromProject (const QStringList &)));
+ connect( project( ), SIGNAL( changedFilesInProject( const QStringList & ) ),
+ this, SLOT( changedFilesInProject( const QStringList & ) ) );
+
+ QTimer::singleShot (0, this, SLOT (initialParse ()));
+}
+
+
+void AdaSupportPart::projectClosed ()
+{
+ saveProjectSourceInfo();
+}
+
+
+void AdaSupportPart::initialParse ()
+{
+ kdDebug () << "------------------------------------------> initialParse ()" << endl;
+
+ if (project ())
+ {
+ mainWindow()->statusBar()->message( i18n("Updating...") );
+ kapp->processEvents( );
+ kapp->setOverrideCursor (waitCursor);
+
+ int n = 0;
+ QStringList files = project ()->allFiles ();
+
+ QProgressBar* bar = new QProgressBar( files.count( ), mainWindow( )->statusBar( ) );
+ bar->setMinimumWidth( 120 );
+ bar->setCenterIndicator( true );
+ mainWindow( )->statusBar( )->addWidget( bar );
+ bar->show( );
+
+ for (QStringList::Iterator it = files.begin (); it != files.end (); ++it) {
+ bar->setProgress( n++ );
+
+ QString fn = project ()->projectDirectory () + "/" + *it;
+ maybeParse (fn);
+ kapp->processEvents (500);
+ }
+
+ emit updatedSourceInfo();
+
+ mainWindow( )->statusBar( )->removeWidget( bar );
+ delete bar;
+
+ kapp->restoreOverrideCursor ();
+ mainWindow( )->statusBar( )->message( i18n( "Done" ), 2000 );
+/* mainWindow ()->statusBar ()->message
+ (i18n ("Found 1 problem", "Found %n problems", d->problemReporter->childCount ()));*/
+ }
+}
+
+QStringList AdaSupportPart::fileExtensions ()
+{
+ return QStringList () << "ads" << "adb";
+}
+
+void AdaSupportPart::maybeParse (const QString &fileName)
+{
+ kdDebug () << "AdaSupportPart::maybeParse: " << fileName << endl;
+
+ if (!fileExtensions ().contains (QFileInfo (fileName).extension ()))
+ return;
+
+// mainWindow ()->statusBar ()->message (i18n ("Parsing file: %1").arg (fileName));
+ parse (fileName);
+}
+
+
+void AdaSupportPart::addedFilesToProject (const QStringList &fileList)
+{
+ QStringList::ConstIterator it;
+
+ for (it = fileList.begin (); it != fileList.end (); ++it)
+ {
+ QString path = project ()->projectDirectory () + "/" + (*it);
+ maybeParse (path);
+ emit addedSourceInfo( path );
+ }
+}
+
+
+void AdaSupportPart::removedFilesFromProject (const QStringList &fileList)
+{
+ QStringList::ConstIterator it;
+
+ for (it = fileList.begin (); it != fileList.end (); ++it)
+ {
+ kdDebug () << "AdaSupportPart::removedFileFromProject () -- " << (*it) << endl;
+ QString path = project ()->projectDirectory () + "/" + (*it);
+
+ if( codeModel()->hasFile(path) )
+ {
+ emit aboutToRemoveSourceInfo( path );
+ codeModel()->removeFile( codeModel()->fileByName(path) );
+ }
+ }
+
+// emit updatedSourceInfo();
+}
+
+
+void AdaSupportPart::parse (const QString &fileName)
+{
+ kdDebug () << "AdaSupportPart::parse () -- " << fileName << endl;
+
+ std::ifstream stream (QFile::encodeName( fileName ).data());
+ QCString _fn = fileName.utf8 ();
+ std::string fn (_fn.data ());
+
+ AdaLexer lexer (stream);
+ lexer.setFilename (fn);
+ lexer.setProblemReporter (d->problemReporter);
+
+ AdaParser parser (lexer);
+ parser.setFilename (fn);
+ parser.setProblemReporter (d->problemReporter);
+
+ // make an ast factory
+ antlr::ASTFactory ast_factory;
+ // initialize and put it in the parser...
+ parser.initializeASTFactory (ast_factory);
+ parser.setASTFactory (&ast_factory);
+ // parser.setASTNodeType ("RefAdaAST");
+
+ try {
+ // old: parser.setASTNodeFactory (AdaAST::factory);
+ lexer.resetErrors ();
+ parser.resetErrors ();
+
+ parser.compilation_unit ();
+ int errors = lexer.numberOfErrors () + parser.numberOfErrors ();
+
+ RefAdaAST ast = RefAdaAST (parser.getAST ());
+
+ if (errors == 0 && ast != antlr::nullAST) {
+ kdDebug () << "-------------------> start StoreWalker" << endl;
+ AdaStoreWalker walker;
+ walker.setFileName (fileName);
+ walker.setCodeModel (codeModel ());
+ walker.compilation_unit (ast);
+ }
+ } catch (antlr::ANTLRException& ex) {
+ kdDebug () << "*exception*: " << ex.toString ().c_str () << endl;
+ d->problemReporter->reportError (QString::fromLatin1( ex.getMessage ().c_str() ),
+ fileName,
+ lexer.getLine (),
+ lexer.getColumn ());
+ }
+}
+
+void AdaSupportPart::parseContents (const QString& contents, const QString& fileName)
+{
+ kdDebug () << "AdaSupportPart::parseContents () -- " << fileName << endl;
+
+ QCString _fn = QFile::encodeName (fileName);
+ std::string fn (_fn.data ());
+
+ QCString text = contents.utf8 ();
+ std::istringstream stream ((const char *)text);
+
+ AdaLexer lexer (stream);
+ lexer.setFilename (fn);
+ lexer.setProblemReporter (d->problemReporter);
+
+ AdaParser parser (lexer);
+ parser.setFilename (fn);
+ parser.setProblemReporter (d->problemReporter);
+
+ try {
+ lexer.resetErrors ();
+ parser.resetErrors ();
+
+ parser.compilation_unit ();
+ int errors = lexer.numberOfErrors () + parser.numberOfErrors ();
+ Q_UNUSED( errors );
+
+ } catch (antlr::ANTLRException& ex) {
+ kdDebug () << "*exception*: " << ex.toString ().c_str () << endl;
+ d->problemReporter->reportError (QString::fromLatin1( ex.getMessage().c_str() ),
+ fileName,
+ lexer.getLine (),
+ lexer.getColumn ());
+ }
+}
+
+
+
+void AdaSupportPart::savedFile (const KURL& fileName)
+{
+ kdDebug () << "AdaSupportPart::savedFile ()" << endl;
+
+ if (project ()->allFiles ().contains (fileName.path().mid (project ()->projectDirectory ().length () + 1))) {
+ maybeParse (fileName.path());
+ emit updatedSourceInfo();
+ }
+}
+
+KMimeType::List AdaSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+
+ list << KMimeType::mimeType( "text/x-adasrc" );
+
+ return list;
+}
+
+//@todo adymo: implement source info loading and saving
+//hint: check javasupport for an example
+// and modify initialParse() method
+void AdaSupportPart::saveProjectSourceInfo( )
+{
+/* const FileList fileList = codeModel()->fileList();
+
+ if( !project() || fileList.isEmpty() )
+ return;
+
+ QFile f( project()->projectDirectory() + "/" + project()->projectName() + ".pcs" );
+ if( !f.open( IO_WriteOnly ) )
+ return;
+
+ QDataStream stream( &f );
+ QMap<QString, Q_ULONG> offsets;
+
+ QString pcs( "PCS" );
+ stream << pcs << KDEV_PCS_VERSION;
+
+ stream << int( fileList.size() );
+ for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it ){
+ const FileDom dom = (*it);
+#if QT_VERSION >= 0x030100
+ stream << dom->name() << m_timestamp[ dom->name() ].toTime_t();
+#else
+ stream << dom->name() << toTime_t(m_timestamp[ dom->name() ]);
+#endif
+ offsets.insert( dom->name(), stream.device()->at() );
+ stream << (Q_ULONG)0; // dummy offset
+ }
+
+ for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it ){
+ const FileDom dom = (*it);
+ int offset = stream.device()->at();
+
+ dom->write( stream );
+
+ int end = stream.device()->at();
+
+ stream.device()->at( offsets[dom->name()] );
+ stream << offset;
+ stream.device()->at( end );
+ }*/
+}
+
+void AdaSupportPart::changedFilesInProject( const QStringList & fileList )
+{
+ QStringList files = fileList;
+
+ for ( QStringList::ConstIterator it = files.begin(); it != files.end(); ++it )
+ {
+ QString path = project ()->projectDirectory () + "/" + *it ;
+
+ maybeParse( path );
+ emit addedSourceInfo( path );
+ }
+}
+
+
+#include "adasupportpart.moc"
diff --git a/languages/ada/adasupportpart.h b/languages/ada/adasupportpart.h
new file mode 100644
index 00000000..d9f2c45d
--- /dev/null
+++ b/languages/ada/adasupportpart.h
@@ -0,0 +1,50 @@
+//
+#ifndef __ADASUPPORTPART_H__
+#define __ADASUPPORTPART_H__
+
+#include "kdevlanguagesupport.h"
+
+#include <qwaitcondition.h>
+
+class AdaSupportPartData;
+class KDialogBase;
+class QStringList;
+
+class AdaSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+public:
+ AdaSupportPart (QObject *parent, const char *name, const QStringList &);
+ ~AdaSupportPart ();
+
+ void parseContents (const QString& contents, const QString& fileName);
+
+protected:
+ Features features ();
+ KMimeType::List mimeTypes ();
+ QStringList fileExtensions ();
+
+private slots:
+ void projectOpened ();
+ void projectClosed ();
+
+ void addedFilesToProject (const QStringList &fileList);
+ void removedFilesFromProject (const QStringList &fileList);
+ void changedFilesInProject( const QStringList &fileList );
+
+ void initialParse ();
+ void savedFile (const KURL&);
+
+private:
+ void maybeParse (const QString &fileName);
+ void parse (const QString &fileName);
+
+ void saveProjectSourceInfo( );
+private:
+ AdaSupportPartData* d;
+
+friend class ProblemReporter;
+};
+
+
+#endif
diff --git a/languages/ada/addclass.cpp b/languages/ada/addclass.cpp
new file mode 100644
index 00000000..5a5ccb13
--- /dev/null
+++ b/languages/ada/addclass.cpp
@@ -0,0 +1,351 @@
+#include <sys/stat.h>
+#include <sys/types.h>
+
+
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qtextedit.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+
+
+#include <klineedit.h>
+#include <kcombobox.h>
+#include <keditlistbox.h>
+#include <kdebug.h>
+
+
+#include "addclassdlg.h"
+
+
+#include "addclass.h"
+
+
+AddClassInfo::AddClassInfo()
+ : interfaceOpt(false), abstractOpt(false), finalOpt(false),
+ createConstructor(true), createMain(false)
+{
+}
+
+
+QString AddClassInfo::adaFileName() const
+{
+ QString dest = className;
+ dest.replace(QRegExp("\\."), "/");
+ return sourceDir + "/" + dest + ".ada";
+}
+
+
+AddClass::AddClass()
+{
+}
+
+
+void AddClass::setInfo(const AddClassInfo &info)
+{
+ m_info = info;
+}
+
+
+AddClassInfo &AddClass::info()
+{
+ return m_info;
+}
+
+
+void AddClass::setBaseClasses(const QStringList &classes)
+{
+ m_baseClasses = classes;
+}
+
+
+bool AddClass::showDialog()
+{
+ AddClassDlg dlg;
+
+ QString dir = m_info.projectDir;
+ if (m_info.sourceDir.isEmpty())
+ m_info.sourceDir = "src";
+ if (dir.isEmpty())
+ dir = m_info.sourceDir;
+ else
+ dir = dir + "/" + m_info.sourceDir;
+
+ dlg.SourcePath->setText(dir);
+ dlg.ClassName->setText(m_info.className);
+ dlg.Extends->insertStringList(m_baseClasses);
+ dlg.Extends->setEditText(m_info.extends);
+ dlg.Interface->setChecked(m_info.interfaceOpt);
+ dlg.Abstract->setChecked(m_info.abstractOpt);
+ dlg.Final->setChecked(m_info.finalOpt);
+
+ switch (m_info.visibility)
+ {
+ case AddClassInfo::ProtectedClass:
+ dlg.Protected->setChecked(true);
+ break;
+ case AddClassInfo::PrivateClass:
+ dlg.Private->setChecked(true);
+ break;
+ default:
+ dlg.Public->setChecked(true);
+ break;
+ }
+
+ dlg.Implements->insertStringList(m_info.implements);
+ dlg.Constructor->setChecked(m_info.createConstructor);
+ dlg.Main->setChecked(m_info.createMain);
+ dlg.Documentation->setText(m_info.documentation);
+ dlg.License->setEditText(m_info.license);
+
+ if (dlg.exec() == QDialog::Accepted)
+ {
+ m_info.projectDir = "";
+ m_info.sourceDir = dlg.SourcePath->text();
+ m_info.className = dlg.ClassName->text();
+ m_info.extends = dlg.Extends->currentText();
+ m_info.interfaceOpt = dlg.Interface->isChecked();
+ m_info.abstractOpt = dlg.Abstract->isChecked();
+ m_info.finalOpt = dlg.Final->isChecked();
+
+ if (dlg.Protected->isChecked())
+ m_info.visibility = AddClassInfo::ProtectedClass;
+ else if (dlg.Private->isChecked())
+ m_info.visibility = AddClassInfo::PrivateClass;
+ else
+ m_info.visibility = AddClassInfo::PublicClass;
+
+ m_info.implements = dlg.Implements->items();
+ m_info.createConstructor = dlg.Constructor->isChecked();
+ m_info.createMain = dlg.Main->isChecked();
+ m_info.documentation = dlg.Documentation->text();
+ m_info.license = dlg.License->currentText();
+
+ return true;
+ }
+
+ return false;
+}
+
+
+static bool makeDirs(const QString &dest)
+{
+ QStringList dirs = QStringList::split("/", dest);
+
+ QString d = "";
+
+ for (QStringList::Iterator it=dirs.begin(); it != dirs.end(); ++it)
+ {
+ d = d + "/" + *it;
+
+ QFileInfo fi(d);
+
+ if (fi.exists() && !fi.isDir())
+ {
+ /// @todo message to user!
+ return false;
+ }
+
+ if (!fi.exists())
+ if (::mkdir(QFile::encodeName(d), 0755) != 0)
+ return false;
+ }
+
+ return true;
+}
+
+
+bool AddClass::generate()
+{
+ QString code;
+
+ // license
+
+ if (!m_info.license.isEmpty())
+ {
+ code += "/*\n";
+
+ if (m_info.license == "GPL")
+ {
+ code +=
+ " * This program is free software; you can redistribute it and/or modify\n"
+ " * it under the terms of the GNU General Public License as published by\n"
+ " * the Free Software Foundation; either version 2 of the License, or\n"
+ " * (at your option) any later version.\n";
+ }
+ else if (m_info.license == "LGPL")
+ {
+ code +=
+ " * This program is free software; you can redistribute it and/or modify\n"
+ " * it under the terms of the GNU Library General Public License as\n"
+ " * published by the Free Software Foundation; either version 2 of the\n"
+ " * License, or (at your option) any later version.\n";
+ }
+ else if (m_info.license == "QPL")
+ {
+ code +=
+ " * This program may be distributed under the terms of the Q Public\n"
+ " * License as defined by Trolltech AS of Norway and appearing in the\n"
+ " * file LICENSE.QPL included in the packaging of this file.\n"
+ " *\n"
+ " * This program is distributed in the hope that it will be useful,\n"
+ " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
+ }
+ else
+ {
+ code += " * This program is licensed under the " + m_info.license + ".\n";
+ code += " * Please see the documentation for details.\n";
+ }
+
+ code += " */\n\n\n";
+ }
+
+ // find class and package name
+ QString className, packageName;
+
+ int i = m_info.className.findRev('.');
+ if (i == -1)
+ {
+ packageName = "";
+ className = m_info.className;
+ }
+ else
+ {
+ packageName = m_info.className.left(i);
+ className = m_info.className.mid(i+1);
+ }
+
+ // package
+ if (!packageName.isEmpty())
+ code += "package " + packageName + ";\n\n\n";
+
+ // documentation
+
+ if (!m_info.documentation.isEmpty())
+ {
+ code += "/**\n";
+
+ QTextStream ts(&m_info.documentation, IO_ReadOnly);
+
+ while (!ts.eof())
+ code += " * " + ts.readLine() + "\n";
+
+ code += " */\n\n";
+ }
+
+ // visibility
+
+ switch (m_info.visibility)
+ {
+ case AddClassInfo::PrivateClass:
+ code += "private";
+ break;
+ case AddClassInfo::ProtectedClass:
+ code += "protected";
+ break;
+ default:
+ code += "public";
+ break;
+ }
+
+ // abstract, final
+
+ if (!m_info.interfaceOpt)
+ {
+ if (m_info.abstractOpt)
+ code += " abstract";
+ if (m_info.finalOpt)
+ code += " final";
+ }
+
+ // generate class/interface declaration
+
+ if (m_info.interfaceOpt)
+ code += " interface ";
+ else
+ code += " class ";
+
+ // classname
+
+ code += className;
+
+ // extends
+
+ if (!m_info.extends.isEmpty())
+ code += " extends " + m_info.extends;
+
+ // implements
+
+ if ((m_info.implements.count() > 0) && !m_info.interfaceOpt)
+ {
+ code += " implements ";
+ unsigned int c=0;
+ for (QStringList::Iterator it = m_info.implements.begin(); it != m_info.implements.end(); ++it, c++)
+ {
+ code += *it;
+ if (c+1 < m_info.implements.count())
+ code += ", ";
+ }
+ }
+
+ // body start
+
+ code += "\n{\n\n";
+
+ // default constructor
+
+ if (m_info.createConstructor && !m_info.interfaceOpt)
+ {
+ code += " " + className + "()\n";
+ code += " {\n";
+ if (!m_info.extends.isEmpty())
+ code += " super();\n";
+ code += " }\n\n";
+ }
+
+ // main method
+
+ if (m_info.createMain && !m_info.interfaceOpt)
+ {
+ code += " public static void main(String[] args)\n";
+ code += " {\n";
+ code += " }\n\n";
+ }
+
+ // body end
+
+ code += "};\n";
+
+ // create directories
+
+ QString dest = packageName;
+ dest.replace(QRegExp("\\."), "/");
+ dest = m_info.sourceDir + "/" + dest;
+
+ if (!makeDirs(dest))
+ return false;
+
+ // write out the file
+
+ if (QFile::exists(m_info.adaFileName()))
+ {
+ /// @todo ask before overwriting!
+ }
+
+ QFile of(m_info.adaFileName());
+ if (!of.open(IO_WriteOnly))
+ {
+ /// @todo message to user
+ return false;
+ }
+
+ QTextStream os(&of);
+ os << code;
+
+ of.close();
+
+ return true;
+}
diff --git a/languages/ada/addclass.h b/languages/ada/addclass.h
new file mode 100644
index 00000000..7bcfd370
--- /dev/null
+++ b/languages/ada/addclass.h
@@ -0,0 +1,55 @@
+#ifndef __ADDCLASS_H__
+#define __ADDCLASS_H__
+
+
+#include <qstring.h>
+#include <qstringlist.h>
+
+
+class AddClassInfo
+{
+public:
+
+ AddClassInfo();
+
+ enum Visibility { PublicClass, ProtectedClass, PrivateClass};
+
+ QString className;
+ QString extends;
+ bool interfaceOpt, abstractOpt, finalOpt;
+ QString projectDir, sourceDir;
+ Visibility visibility;
+ QStringList implements;
+ bool createConstructor, createMain;
+ QString documentation;
+ QString license;
+
+ QString adaFileName() const;
+
+};
+
+
+class AddClass
+{
+public:
+
+ AddClass();
+
+ void setInfo(const AddClassInfo &info);
+ AddClassInfo &info();
+
+ void setBaseClasses(const QStringList &classes);
+ bool showDialog();
+
+ bool generate();
+
+
+private:
+
+ AddClassInfo m_info;
+ QStringList m_baseClasses;
+
+};
+
+
+#endif
diff --git a/languages/ada/addclassdlg.ui b/languages/ada/addclassdlg.ui
new file mode 100644
index 00000000..49900786
--- /dev/null
+++ b/languages/ada/addclassdlg.ui
@@ -0,0 +1,434 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>AddClassDlg</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AddClassDlg</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>656</width>
+ <height>684</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Add Class</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KEditListBox" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>Implements</cstring>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="title">
+ <string>&amp;Implements</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Class</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+
+ <widget class="KComboBox" row="2" column="1" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>Extends</cstring>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ <property name="autoCompletion">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <spacer row="4" column="4" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="3" column="2">
+ <property name="name">
+ <cstring>Abstract</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Abstract</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="1">
+ <property name="name">
+ <cstring>Interface</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Interface</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ClassName</cstring>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="4" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>Public</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Public</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>Protected</cstring>
+ </property>
+ <property name="text">
+ <string>P&amp;rotected</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>Private</cstring>
+ </property>
+ <property name="text">
+ <string>Pri&amp;vate</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="3" column="3">
+ <property name="name">
+ <cstring>Final</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Final</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>ClassName</cstring>
+ </property>
+ </widget>
+ <spacer row="3" column="4" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Extends:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>Extends</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="5">
+ <property name="name">
+ <cstring>BrowseSourcePath</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>SourcePath</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Source path:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>SourcePath</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>GroupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Options</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>Constructor</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Create default constructor</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>Main</cstring>
+ </property>
+ <property name="text">
+ <string>Create &amp;main method</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox" row="3" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>GroupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Documentation</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;License:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>License</cstring>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="1" column="1">
+ <item>
+ <property name="text">
+ <string>LGPL</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>GPL</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>QPL</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>License</cstring>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Documentation</cstring>
+ </property>
+ </widget>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="Line" row="4" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>Line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="3">
+ <property name="name">
+ <cstring>PushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ </widget>
+ <spacer row="5" column="2">
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="5" column="0">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="1">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>Interface</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Abstract</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>Interface</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Final</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>AddClassDlg</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>AddClassDlg</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>Interface</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Constructor</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>Interface</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Main</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>Interface</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Implements</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>SourcePath</tabstop>
+ <tabstop>BrowseSourcePath</tabstop>
+ <tabstop>ClassName</tabstop>
+ <tabstop>Extends</tabstop>
+ <tabstop>Interface</tabstop>
+ <tabstop>Abstract</tabstop>
+ <tabstop>Final</tabstop>
+ <tabstop>Public</tabstop>
+ <tabstop>Protected</tabstop>
+ <tabstop>Private</tabstop>
+ <tabstop>Constructor</tabstop>
+ <tabstop>Main</tabstop>
+ <tabstop>License</tabstop>
+ <tabstop>PushButton1</tabstop>
+ <tabstop>PushButton2</tabstop>
+ <tabstop>PushButton3</tabstop>
+</tabstops>
+<slots>
+ <slot>Public_toggled( bool )</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">keditlistbox.h</include>
+ <include location="global" impldecl="in implementation">kcombobox.h</include>
+ <include location="global" impldecl="in implementation">klineedit.h</include>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/ada/app_templates/Makefile.am b/languages/ada/app_templates/Makefile.am
new file mode 100644
index 00000000..3da5006f
--- /dev/null
+++ b/languages/ada/app_templates/Makefile.am
@@ -0,0 +1,5 @@
+SUBDIRS = adahello
+
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/CompiledLanguageIDE/AdaIDE
+profiles_DATA = ada.appwizard
+
diff --git a/languages/ada/app_templates/ada.appwizard b/languages/ada/app_templates/ada.appwizard
new file mode 100644
index 00000000..2c31ec96
--- /dev/null
+++ b/languages/ada/app_templates/ada.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=adahello
diff --git a/languages/ada/app_templates/adahello/.kdev_ignore b/languages/ada/app_templates/adahello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/ada/app_templates/adahello/.kdev_ignore
diff --git a/languages/ada/app_templates/adahello/Makefile.am b/languages/ada/app_templates/adahello/Makefile.am
new file mode 100644
index 00000000..45e04df7
--- /dev/null
+++ b/languages/ada/app_templates/adahello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = main.adb app.kdevelop ada-Makefile app.kdevelop.filelist
+
+### no need to change below:
+template_DATA = adahello.kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+adahello.tar.gz:
+ $(TAR) -cf adahello.tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 adahello.tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = adahello.tar.gz adahello.png
+
+CLEANFILES = *.tar.gz
+
diff --git a/languages/ada/app_templates/adahello/ada-Makefile b/languages/ada/app_templates/adahello/ada-Makefile
new file mode 100644
index 00000000..134ffab6
--- /dev/null
+++ b/languages/ada/app_templates/adahello/ada-Makefile
@@ -0,0 +1,2 @@
+all:
+ gnatmake src/%{APPNAMELC}.adb -o %{APPNAMELC}
diff --git a/languages/ada/app_templates/adahello/ada-Makefile.am b/languages/ada/app_templates/adahello/ada-Makefile.am
new file mode 100644
index 00000000..02520f20
--- /dev/null
+++ b/languages/ada/app_templates/adahello/ada-Makefile.am
@@ -0,0 +1,5 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = src
diff --git a/languages/ada/app_templates/adahello/ada-Makefile.cvs b/languages/ada/app_templates/adahello/ada-Makefile.cvs
new file mode 100644
index 00000000..d1607023
--- /dev/null
+++ b/languages/ada/app_templates/adahello/ada-Makefile.cvs
@@ -0,0 +1,8 @@
+default: all
+
+all:
+ aclocal
+ autoheader
+ automake
+ autoconf
+
diff --git a/languages/ada/app_templates/adahello/adahello b/languages/ada/app_templates/adahello/adahello
new file mode 100644
index 00000000..73d82f8d
--- /dev/null
+++ b/languages/ada/app_templates/adahello/adahello
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=Simple Hello world program
+Name[fr]=Un simple programme de test « Hello world »
+Icon=adahello.png
+Category=Ada
+Comment=Generates a simple Hello world program in Ada
+Comment[fr]=Génère un simple programme de test du type « Hello world » dans le language ADA.
+FileTemplates=adb,AdaStyle
+ShowFilesAfterGeneration=src/APPNAMELC.adb
diff --git a/languages/ada/app_templates/adahello/adahello.kdevtemplate b/languages/ada/app_templates/adahello/adahello.kdevtemplate
new file mode 100644
index 00000000..380f739b
--- /dev/null
+++ b/languages/ada/app_templates/adahello/adahello.kdevtemplate
@@ -0,0 +1,132 @@
+# KDE Config File
+[General]
+Name=Simple Hello world program
+Name[ca]=Simple programa Hello world
+Name[da]=Simpelt Goddag verden program
+Name[de]=Ein einfaches "Hello World"-Programm
+Name[el]=Απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε
+Name[es]=Programa «Hola mundo» sencillo
+Name[et]=Lihtne "Tere, maailm" programm
+Name[eu]="Kaixo mundua" programa sinplea
+Name[fa]=برنامۀ سادۀ Hello world
+Name[fr]=Programme « Bonjour monde » simple
+Name[ga]=Ríomhchlár simplí "Hello World"
+Name[gl]=Programa sinxelo Ola mundo
+Name[hu]=Egyszerű Hello world program
+Name[it]=Semplice programma di "Hello world"
+Name[ja]=ç°¡å˜ãª Hello world プログラム
+Name[ms]=Program Hello World mudah
+Name[nds]=En eenfach "Moin Welt"-Programm
+Name[ne]=साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Eenvoudig 'Hello World' programma
+Name[pl]=Prosty program witaj świecie
+Name[pt]=Programa simples Olá Mundo
+Name[pt_BR]=Programa simples Olá Mundo
+Name[ru]=ПроÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Hello world
+Name[sk]=Jednoduchý "Ahoj svet" program
+Name[sl]=Preprost program Hello world
+Name[sr]=ЈедноÑтаван „Здраво Ñвете“ програм
+Name[sr@Latn]=Jednostavan „Zdravo svete“ program
+Name[sv]=Enkelt Hello world-program
+Name[tr]=Basit Merhaba dünya programı
+Name[zh_CN]=简å•çš„ Hello world 程åº
+Name[zh_TW]=簡單的 Hello world 程å¼
+Icon=adahello.png
+Category=Ada
+Comment=Generates a simple Hello world program in Ada
+Comment[ca]=Genera un simple programa de Hello world en Ada
+Comment[da]=Genererer et simpelt Goddag verden program i Ada
+Comment[de]=Erstellt ein einfaches "Hello World"-Program in Ada
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε σε Ada
+Comment[es]=Genera un programa «Hola mundo» sencillo en Ada
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine ADA-s
+Comment[eu]="Kaixo mundua" programa sinple bat sortzen du Adan
+Comment[fa]=یک برنامۀ سادۀ Hello world در آدا تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en Ada
+Comment[ga]=Cruthaíonn sé seo feidhmchlár simplí "Hello World" in Ada
+Comment[gl]=Xera un programa sinxelo Hello world en Ada
+Comment[hu]=Létrehoz egy egyszerű Hello world programot ADA nyelven
+Comment[it]=Genera un semplice programma di "Hello world" in Ada
+Comment[ja]=Ada ã§ç°¡å˜ãª Hello world プログラムを作æˆã—ã¾ã™
+Comment[ms]=Menjana program Hello World mudah dalam Ada
+Comment[nds]=Stellt in Ada en eenfach "Moin Welt"-Programm op
+Comment[ne]=à¤à¤¡à¤¾à¤®à¤¾ साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudig Hello World programma in Ada
+Comment[pl]=Generuje prosty program Witaj świecie w Adzie
+Comment[pt]=Gera um programa simples de Olá Mundo em Ada
+Comment[pt_BR]=Gera um programa simples de Olá Mundo em Ada
+Comment[ru]=Создание проÑтой программы Hello world на Ada
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program v Ada
+Comment[sl]=Ustvari preprost program Hello world v Adi
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ у Ada-и
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ u Ada-i
+Comment[sv]=Skapar ett enkelt Hello world-program i Ada
+Comment[tr]=Ada dilinde basit bir Merhaba Dünya programı üretir.
+Comment[zh_CN]=以 Ada 语言生æˆç®€å•çš„ Hello world 程åº
+Comment[zh_TW]=產生 Ada çš„ Hello world 程å¼
+FileTemplates=adb,AdaStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.adb
+Archive=adahello.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/ada-Makefile
+Dest=%{dest}/Makefile
+
+[FILE3]
+Type=install
+Source=%{src}/app.kdevelop.filelist
+Dest=%{dest}/%{APPNAMELC}.kdevelop.filelist
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE4]
+Type=install
+Source=%{src}/main.adb
+Dest=%{dest}/src/%{APPNAMELC}.adb
+
+[MSG]
+Type=message
+Comment=A simple "Hello world" program in ADA was created in %{dest}
+Comment[ca]=Un simple programa de "Hello world" en ADA ha estat creat en %{dest}
+Comment[da]=Et simpelt "Goddag verden" program i ADA blev oprettet i %{dest}
+Comment[de]=Ein einfaches "Hello world" Programm in Ada wurde in %{dest} erstellt
+Comment[el]=Ένα απλό Ï€ÏόγÏαμμα "Γεια σου Κόσμε" σε ADA δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un programa «Hola mundo» sencillo en ADA ha sido creado en %{dest}
+Comment[et]=Lihtne "Tere, maailm" programm ADA-s loodi asukohta %{dest}
+Comment[eu]="Kaixo mundua" programa sinple bat sortu da ADAn hemen: %{dest}
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در آدا در %{dest} ایجاد شد
+Comment[fr]=Un programme « Bonjour monde » simple en ADA a été créé dans %{dest}
+Comment[ga]=Cruthaíodh ríomhchlár simplí "Hello World" ADA i %{dest}
+Comment[gl]=Creouse un programa sinxelo "Ola mundo" en ADA en %{dest}
+Comment[hu]=Létrejött egy egyszerű Hello world program ADA nyelven itt: %{dest}
+Comment[it]=È stato creato un semplice programma di "Hello world" in ADA in %{dest}
+Comment[ja]=Ada ã§è¨˜è¿°ã•ã‚ŒãŸ "Hello world" プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[ms]=Program "Hello World" mudah dalam ada telah dicipta dalam %{dest}
+Comment[nds]=In %{dest} wöör en eenfach "Moin Welt"-Programm in Ada opstellt
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण "हेलà¥à¤²à¥‹ वोलà¥à¤¡" कारà¥à¤¯à¤•à¥à¤°à¤® à¤à¤¡à¤¾à¤®à¤¾ %{dest} सिरà¥à¤œà¤¨à¤¾ गरिà¤à¤•à¥‹ थियो
+Comment[nl]=Een eenvoudig "Hello World" programma in Ada is aangemaakt in %{dest}
+Comment[pl]=Prosty program "Witaj świecie" w języku ADA został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples "Olá mundo" em ADA em %{dest}
+Comment[pt_BR]=Foi criado um programa simples "Olá mundo" em ADA em %{dest}
+Comment[ru]=ПроÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° "Hello world" на ADA Ñоздана в %{dest}
+Comment[sk]=Jednoduchý "Ahoj svet" program v Ada bol vytvorený v %{dest}
+Comment[sl]=Preprost program »Hello world« v jeziku ADA je bil ustvarjen v %{dest}
+Comment[sr]=ЈедноÑтаван „Здраво Ñвете“ програм у Ada-и је направљен у %{dest}
+Comment[sr@Latn]=Jednostavan „Zdravo svete“ program u Ada-i je napravljen u %{dest}
+Comment[sv]=Ett enkelt "Hello world"-program in Ada skapades i %{dest}
+Comment[tr]=ADA'da basit bir "Merhaba Dünya" programı %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了 Ada 语言的“Hello worldâ€ç¨‹åº
+Comment[zh_TW]=Ada çš„ Hello world 程å¼å·²ç”¢ç”Ÿåœ¨ ${dest}
diff --git a/languages/ada/app_templates/adahello/adahello.png b/languages/ada/app_templates/adahello/adahello.png
new file mode 100644
index 00000000..888d4f13
--- /dev/null
+++ b/languages/ada/app_templates/adahello/adahello.png
Binary files differ
diff --git a/languages/ada/app_templates/adahello/app.kdevelop b/languages/ada/app_templates/adahello/app.kdevelop
new file mode 100644
index 00000000..b430f6e8
--- /dev/null
+++ b/languages/ada/app_templates/adahello/app.kdevelop
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>Ada</primarylanguage>
+ <keywords>
+ <keyword>Ada</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <directoryradio>build</directoryradio>
+ <customdirectory>/</customdirectory>
+ <mainprogram>%{APPNAMELC}</mainprogram>
+ <programargs/>
+ <terminal>false</terminal>
+ <autocompile>false</autocompile>
+ <envvars/>
+ </run>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir/>
+ </build>
+ </kdevcustomproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ads"/>
+ <type ext="adb"/>
+ <type ext="ada"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/ada/app_templates/adahello/app.kdevelop.filelist b/languages/ada/app_templates/adahello/app.kdevelop.filelist
new file mode 100644
index 00000000..e5b69ca2
--- /dev/null
+++ b/languages/ada/app_templates/adahello/app.kdevelop.filelist
@@ -0,0 +1 @@
+src/%{APPNAMELC}.adb \ No newline at end of file
diff --git a/languages/ada/app_templates/adahello/configure.in b/languages/ada/app_templates/adahello/configure.in
new file mode 100644
index 00000000..a8f81958
--- /dev/null
+++ b/languages/ada/app_templates/adahello/configure.in
@@ -0,0 +1,10 @@
+AC_INIT(configure.in)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+AM_CONFIG_HEADER(config.h)
+
+AC_LANG_ADA
+AC_PROG_ADA
+AC_ADA_LIBRARY_LDFLAGS
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/ada/app_templates/adahello/main.adb b/languages/ada/app_templates/adahello/main.adb
new file mode 100644
index 00000000..e2c6f5da
--- /dev/null
+++ b/languages/ada/app_templates/adahello/main.adb
@@ -0,0 +1,8 @@
+with Text_IO;
+
+procedure Main is
+
+begin
+ Text_IO.Put_Line ("Hello World");
+end Main;
+
diff --git a/languages/ada/app_templates/adahello/src-Makefile.am b/languages/ada/app_templates/adahello/src-Makefile.am
new file mode 100644
index 00000000..06291dbf
--- /dev/null
+++ b/languages/ada/app_templates/adahello/src-Makefile.am
@@ -0,0 +1,8 @@
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.adb
+
+# set the include path found by configure
+INCLUDES= $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries)
diff --git a/languages/ada/backgroundparser.cpp b/languages/ada/backgroundparser.cpp
new file mode 100644
index 00000000..f94f3216
--- /dev/null
+++ b/languages/ada/backgroundparser.cpp
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "backgroundparser.h"
+#include "problemreporter.h"
+#include "AdaLexer.hpp"
+#include "AdaParser.hpp"
+#include "AdaAST.hpp"
+#include <kdebug.h>
+#include <qfile.h>
+
+#include <config.h>
+
+#include <sstream>
+
+BackgroundParser::BackgroundParser( ProblemReporter* reporter,
+ const QString& source,
+ const QString& filename )
+ : m_reporter( reporter ),
+ m_source( source.unicode(), source.length() ),
+ m_fileName( filename )
+{
+}
+
+BackgroundParser::~BackgroundParser()
+{
+}
+
+void BackgroundParser::run()
+{
+ QCString _fn = QFile::encodeName(m_fileName);
+ std::string fn( _fn.data() );
+
+ std::istringstream stream( m_source.utf8().data() );
+
+ AdaLexer lexer( stream );
+ lexer.setFilename( fn );
+ lexer.setProblemReporter( m_reporter );
+
+ AdaParser parser( lexer );
+ parser.setFilename( fn );
+ parser.setProblemReporter( m_reporter );
+
+ // make an ast factory
+ antlr::ASTFactory ast_factory;
+ // initialize and put it in the parser...
+ parser.initializeASTFactory (ast_factory);
+ parser.setASTFactory (&ast_factory);
+ // parser.setASTNodeType ("RefAdaAST");
+
+ try{
+ lexer.resetErrors();
+ parser.resetErrors();
+
+ parser.compilation_unit();
+
+ } catch( antlr::ANTLRException& ex ){
+ kdDebug() << "*exception*: " << ex.toString().c_str() << endl;
+ m_reporter->reportError( QString::fromLatin1( ex.getMessage().c_str() ),
+ m_fileName,
+ lexer.getLine(),
+ lexer.getColumn() );
+ }
+
+ kdDebug() << "BackgroundParser::run() FINISHED." << endl;
+}
+
+
+
diff --git a/languages/ada/backgroundparser.h b/languages/ada/backgroundparser.h
new file mode 100644
index 00000000..0b4eef16
--- /dev/null
+++ b/languages/ada/backgroundparser.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2002 by Roberto Raggi
+ * roberto@kdevelop.org
+ * Copyright (C) 2003 Oliver Kellogg
+ * okellogg@users.sourceforge.net
+ *
+ * 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.
+ */
+
+#ifndef BACKGROUNDPARSER_H
+#define BACKGROUNDPARSER_H
+
+#include <qthread.h>
+#include <qstring.h>
+#include <kdebug.h>
+
+class ProblemReporter;
+
+class BackgroundParser: public QThread{
+public:
+ BackgroundParser( ProblemReporter* reporter,
+ const QString& source,
+ const QString& filename );
+ virtual ~BackgroundParser();
+
+ virtual void run();
+
+private:
+ ProblemReporter* m_reporter;
+ QString m_source;
+ QString m_fileName;
+};
+
+#endif
diff --git a/languages/ada/configproblemreporter.ui b/languages/ada/configproblemreporter.ui
new file mode 100644
index 00000000..75f35b1f
--- /dev/null
+++ b/languages/ada/configproblemreporter.ui
@@ -0,0 +1,89 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ConfigureProblemReporter</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ConfigureProblemReporter</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>390</width>
+ <height>304</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>bgParserCheckbox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Enable background parsing</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>delaySlider</cstring>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="lineStep">
+ <number>250</number>
+ </property>
+ <property name="pageStep">
+ <number>500</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ <property name="tickInterval">
+ <number>250</number>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>101</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>bgParserCheckbox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>bgParserCheckbox_toggled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+ <include location="local" impldecl="in implementation">configproblemreporter.ui.h</include>
+</includes>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+ <slot>accept()</slot>
+ <slot>bgParserCheckbox_toggled( bool b )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/ada/configproblemreporter.ui.h b/languages/ada/configproblemreporter.ui.h
new file mode 100644
index 00000000..a336965c
--- /dev/null
+++ b/languages/ada/configproblemreporter.ui.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+#include <kconfig.h>
+#include <kapplication.h>
+
+void ConfigureProblemReporter::init()
+{
+ KConfig* config = kapp->config();
+ config->setGroup( "General Options" );
+ bgParserCheckbox->setChecked( config->readBoolEntry("EnableAdaBgParser", true) );
+ delaySlider->setEnabled( bgParserCheckbox->isChecked() );
+ delaySlider->setValue( config->readNumEntry("BgParserDelay", 500) );
+}
+
+void ConfigureProblemReporter::destroy()
+{
+}
+
+void ConfigureProblemReporter::accept()
+{
+ KConfig* config = kapp->config();
+ config->setGroup( "General Options" );
+ config->writeEntry( "EnableAdaBgParser", bgParserCheckbox->isChecked() );
+ if( bgParserCheckbox->isChecked() )
+ config->writeEntry( "BgParserDelay", delaySlider->value() );
+ config->sync();
+}
+
+
+void ConfigureProblemReporter::bgParserCheckbox_toggled( bool b )
+{
+ delaySlider->setEnabled( b );
+}
diff --git a/languages/ada/configure.in.in b/languages/ada/configure.in.in
new file mode 100644
index 00000000..be677e4b
--- /dev/null
+++ b/languages/ada/configure.in.in
@@ -0,0 +1,4 @@
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+AC_CHECK_HEADERS(sstream)
+AC_LANG_RESTORE
diff --git a/languages/ada/doc/Makefile.am b/languages/ada/doc/Makefile.am
new file mode 100644
index 00000000..ff5f8a32
--- /dev/null
+++ b/languages/ada/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = ada.toc ada_bugs_gcc.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA =
+
diff --git a/languages/ada/doc/ada.toc b/languages/ada/doc/ada.toc
new file mode 100644
index 00000000..434a5b6a
--- /dev/null
+++ b/languages/ada/doc/ada.toc
@@ -0,0 +1,130 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Ada</title>
+<base href="http://www.adahome.com/rm95"/>
+<tocsect1 name="General" url="rm9x-01.html">
+ <tocsect2 name="Scope" url="rm9x-01-01.html"></tocsect2>
+ <tocsect2 name="Normative References" url="rm9x-01-02.html"></tocsect2>
+ <tocsect2 name="Definitions" url="rm9x-01-03.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Lexical Elements" url="rm9x-02.html">
+ <tocsect2 name="Character Set" url="rm9x-02-01.html"></tocsect2>
+ <tocsect2 name="Lexical Elements, Separators, and Delimiters" url="rm9x-02-02.html"></tocsect2>
+ <tocsect2 name="Identifiers" url="rm9x-02-03.html"></tocsect2>
+ <tocsect2 name="Numeric Literals" url="rm9x-02-04.html"></tocsect2>
+ <tocsect2 name="Character Literals" url="rm9x-02-05.html"></tocsect2>
+ <tocsect2 name="String Literals" url="rm9x-02-06.html"></tocsect2>
+ <tocsect2 name="Comments" url="rm9x-02-07.html"></tocsect2>
+ <tocsect2 name="Pragmas" url="rm9x-02-08.html"></tocsect2>
+ <tocsect2 name="Reserved Words" url="rm9x-02-09.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Declarations and Types" url="rm9x-03.html">
+ <tocsect2 name="Declarations" url="rm9x-03-01.html"></tocsect2>
+ <tocsect2 name="Types and Subtypes" url="rm9x-03-02.html"></tocsect2>
+ <tocsect2 name="Objects and Named Numbers" url="rm9x-03-03.html"></tocsect2>
+ <tocsect2 name="Derived Types and Classes" url="rm9x-03-04.html"></tocsect2>
+ <tocsect2 name="Scalar Types" url="rm9x-03-05.html"></tocsect2>
+ <tocsect2 name="Array Types" url="rm9x-03-06.html"></tocsect2>
+ <tocsect2 name="Discriminants" url="rm9x-03-07.html"></tocsect2>
+ <tocsect2 name="Record Types" url="rm9x-03-08.html"></tocsect2>
+ <tocsect2 name="Tagged Types and Type Extensions" url="rm9x-03-09.html"></tocsect2>
+ <tocsect2 name="Access Types" url="rm9x-03-10.html"></tocsect2>
+ <tocsect2 name="Declarative Parts" url="rm9x-03-11.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Names and Expressions" url="rm9x-04.html">
+ <tocsect2 name="Names" url="rm9x-04-01.html"></tocsect2>
+ <tocsect2 name="Literals" url="rm9x-04-02.html"></tocsect2>
+ <tocsect2 name="Aggregates" url="rm9x-04-03.html"></tocsect2>
+ <tocsect2 name="Expressions" url="rm9x-04-04.html"></tocsect2>
+ <tocsect2 name="Operators and Expression Evaluation" url="rm9x-04-05.html"></tocsect2>
+ <tocsect2 name="Type Conversions" url="rm9x-04-06.html"></tocsect2>
+ <tocsect2 name="Qualified Expressions" url="rm9x-04-07.html"></tocsect2>
+ <tocsect2 name="Allocators" url="rm9x-04-08.html"></tocsect2>
+ <tocsect2 name="Static Expressions and Static Subtypes" url="rm9x-04-09.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Statements" url="rm9x-05.html">
+ <tocsect2 name="Simple and Compound Statements - Sequences of Statements" url="rm9x-05-01.html"></tocsect2>
+ <tocsect2 name="Assignment Statements" url="rm9x-05-02.html"></tocsect2>
+ <tocsect2 name="If Statements" url="rm9x-05-03.html"></tocsect2>
+ <tocsect2 name="Case Statements" url="rm9x-05-04.html"></tocsect2>
+ <tocsect2 name="Loop Statements" url="rm9x-05-05.html"></tocsect2>
+ <tocsect2 name="Block Statements" url="rm9x-05-06.html"></tocsect2>
+ <tocsect2 name="Exit Statements" url="rm9x-05-07.html"></tocsect2>
+ <tocsect2 name="Goto Statements" url="rm9x-05-08.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Subprograms" url="rm9x-06.html">
+ <tocsect2 name="Subprogram Declarations" url="rm9x-06-01.html"></tocsect2>
+ <tocsect2 name="Formal Parameter Modes" url="rm9x-06-02.html"></tocsect2>
+ <tocsect2 name="Subprogram Bodies" url="rm9x-06-03.html"></tocsect2>
+ <tocsect2 name="Subprogram Calls" url="rm9x-06-04.html"></tocsect2>
+ <tocsect2 name="Return Statements" url="rm9x-06-05.html"></tocsect2>
+ <tocsect2 name="Overloading of Operators" url="rm9x-06-06.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Packages" url="rm9x-07.html">
+ <tocsect2 name="Package Specifications and Declarations" url="rm9x-07-01.html"></tocsect2>
+ <tocsect2 name="Package Bodies" url="rm9x-07-02.html"></tocsect2>
+ <tocsect2 name="Private Types and Private Extensions" url="rm9x-07-03.html"></tocsect2>
+ <tocsect2 name="Deferred Constants" url="rm9x-07-04.html"></tocsect2>
+ <tocsect2 name="Limited Types" url="rm9x-07-05.html"></tocsect2>
+ <tocsect2 name="User-Defined Assignment and Finalization" url="rm9x-07-06.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Visibility Rules" url="rm9x-08.html">
+ <tocsect2 name="Declarative Region" url="rm9x-08-01.html"></tocsect2>
+ <tocsect2 name="Scope of Declarations" url="rm9x-08-02.html"></tocsect2>
+ <tocsect2 name="Visibility" url="rm9x-08-03.html"></tocsect2>
+ <tocsect2 name="Use Clauses" url="rm9x-08-04.html"></tocsect2>
+ <tocsect2 name="Renaming Declarations" url="rm9x-08-05.html"></tocsect2>
+ <tocsect2 name="The Context of Overload Resolution" url="rm9x-08-06.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Tasks and Synchronization" url="rm9x-09.html">
+ <tocsect2 name="Task Units and Task Objects" url="rm9x-09-01.html"></tocsect2>
+ <tocsect2 name="Task Execution - Task Activation" url="rm9x-09-02.html"></tocsect2>
+ <tocsect2 name="Task Dependence - Termination of Tasks" url="rm9x-09-03.html"></tocsect2>
+ <tocsect2 name="Protected Units and Protected Objects" url="rm9x-09-04.html"></tocsect2>
+ <tocsect2 name="Intertask Communication" url="rm9x-09-05.html"></tocsect2>
+ <tocsect2 name="Delay Statements, Duration, and Time" url="rm9x-09-06.html"></tocsect2>
+ <tocsect2 name="Select Statements" url="rm9x-09-07.html"></tocsect2>
+ <tocsect2 name="Abort of a Task - Abort of a Sequence of Statements" url="rm9x-09-08.html"></tocsect2>
+ <tocsect2 name="Task and Entry Attributes" url="rm9x-09-09.html"></tocsect2>
+ <tocsect2 name="Shared Variables" url="rm9x-09-10.html"></tocsect2>
+ <tocsect2 name="Example of Tasking and Synchronization " url="rm9x-09-11.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Program Structure and Compilation Issues" url="rm9x-10.html">
+ <tocsect2 name="Separate Compilation" url="rm9x-10-01.html"></tocsect2>
+ <tocsect2 name="Program Execution" url="rm9x-10-02.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Exceptions" url="rm9x-11.html">
+ <tocsect2 name="Exception Declarations" url="rm9x-11-01.html"></tocsect2>
+ <tocsect2 name="Exception Handlers" url="rm9x-11-02.html"></tocsect2>
+ <tocsect2 name="Raise Statements" url="rm9x-11-03.html"></tocsect2>
+ <tocsect2 name="Exception Handling" url="rm9x-11-04.html"></tocsect2>
+ <tocsect2 name="Suppressing Checks" url="rm9x-11-05.html"></tocsect2>
+ <tocsect2 name="Exceptions and Optimization" url="rm9x-11-06.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Generic Units" url="rm9x-12.html">
+ <tocsect2 name="Generic Declarations" url="rm9x-12-01.html"></tocsect2>
+ <tocsect2 name="Generic Bodies" url="rm9x-12-02.html"></tocsect2>
+ <tocsect2 name="Generic Instantiation" url="rm9x-12-03.html"></tocsect2>
+ <tocsect2 name="Formal Objects" url="rm9x-12-04.html"></tocsect2>
+ <tocsect2 name="Formal Types" url="rm9x-12-05.html"></tocsect2>
+ <tocsect2 name="Formal Subprograms" url="rm9x-12-06.html"></tocsect2>
+ <tocsect2 name="Formal Packages" url="rm9x-12-07.html"></tocsect2>
+ <tocsect2 name="Example of a Generic Package" url="rm9x-12-08.html"></tocsect2>
+</tocsect1>
+<tocsect1 name="Representation Issues" url="rm9x-13.html">
+ <tocsect2 name="Representation Items" url="rm9x-13-01.html"></tocsect2>
+ <tocsect2 name="Pragma Pack" url="rm9x-13" url="rm9x-13-02.html"></tocsect2>
+ <tocsect2 name="Representation Attributes" url="rm9x-13-03.html"></tocsect2>
+ <tocsect2 name="Enumeration Representation Clauses" url="rm9x-13-04.html"></tocsect2>
+ <tocsect2 name="Record Layout" url="rm9x-13-05.html"></tocsect2>
+ <tocsect2 name="Change of Representation" url="rm9x-13-06.html"></tocsect2>
+ <tocsect2 name="The Package System" url="rm9x-13-07.html"></tocsect2>
+ <tocsect2 name="Machine Code Insertions" url="rm9x-13-08.html"></tocsect2>
+ <tocsect2 name="Unchecked Type Conversions" url="rm9x-13-09.html"></tocsect2>
+ <tocsect2 name="Unchecked Access Value Creation" url="rm9x-13-10.html"></tocsect2>
+ <tocsect2 name="Storage Management" url="rm9x-13-11.html"></tocsect2>
+ <tocsect2 name="Pragma Restrictions" url="rm9x-13-12.html"></tocsect2>
+ <tocsect2 name="Streams" url="rm9x-13-13.html"></tocsect2>
+ <tocsect2 name="Freezing Rules" url="rm9x-13-14.html"></tocsect2>
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/ada/doc/ada_bugs_gcc.toc b/languages/ada/doc/ada_bugs_gcc.toc
new file mode 100644
index 00000000..9c543f0c
--- /dev/null
+++ b/languages/ada/doc/ada_bugs_gcc.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Ada bugs (GCC)</title>
+<base href="http://gcc.gnu.org/bugzilla/"/>
+<tocsect1 name="Query" url="query.cgi">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/ada/file_templates/Makefile.am b/languages/ada/file_templates/Makefile.am
new file mode 100644
index 00000000..58bbd907
--- /dev/null
+++ b/languages/ada/file_templates/Makefile.am
@@ -0,0 +1,3 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = adb ads
+
diff --git a/languages/ada/file_templates/adb b/languages/ada/file_templates/adb
new file mode 100644
index 00000000..0306105a
--- /dev/null
+++ b/languages/ada/file_templates/adb
@@ -0,0 +1,12 @@
+--
+--
+-- Ada Body: $MODULE$
+--
+-- Description:
+--
+--
+-- Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+--
+-- Copyright: See COPYING file that comes with this distribution
+--
+--
diff --git a/languages/ada/file_templates/ads b/languages/ada/file_templates/ads
new file mode 100644
index 00000000..46463d47
--- /dev/null
+++ b/languages/ada/file_templates/ads
@@ -0,0 +1,12 @@
+--
+--
+-- Ada Spec: $MODULE$
+--
+-- Description:
+--
+--
+-- Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+--
+-- Copyright: See COPYING file that comes with this distribution
+--
+--
diff --git a/languages/ada/kdevadasupport.desktop b/languages/ada/kdevadasupport.desktop
new file mode 100644
index 00000000..4f99e10c
--- /dev/null
+++ b/languages/ada/kdevadasupport.desktop
@@ -0,0 +1,87 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Ada Language Support
+Comment[ca]=Suport per al llenguatge Ada
+Comment[da]=Ada sprogunderstøttelse
+Comment[de]=Sprachunterstützung für Ada
+Comment[el]=ΥποστήÏιξη γλώσσας Ada
+Comment[es]=Soporte para lenguaje Ada
+Comment[et]=ADA keele toetus
+Comment[eu]=Ada lenguaiaren euskarria
+Comment[fa]=پشتیبانی زبان آدا
+Comment[fr]=Prise en charge du langage ADA
+Comment[ga]=Tacaíocht Ada
+Comment[gl]=Soporte da linguaxe Ada
+Comment[hi]=à¤à¤¡à¥€à¤ भाषा समरà¥à¤¥à¤¨
+Comment[hu]=Ada nyelvi támogatás
+Comment[is]=Stuðningur við Ada forritunarmálið
+Comment[it]=Supporto al linguaggio Ada
+Comment[ja]=Ada 言語サãƒãƒ¼ãƒˆ
+Comment[ms]=Sokongan Bahasa Ada
+Comment[nds]=Spraakünnerstütten för Ada
+Comment[ne]=à¤à¤¡à¤¾ भाषा समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor Ada
+Comment[pl]=Obsługa języka Ada
+Comment[pt]=Suporte à Linguagem Ada
+Comment[pt_BR]=Suporte à Linguagem Ada
+Comment[ru]=Поддержка Ñзыка Ada
+Comment[sk]=Podpora jazyka Ada
+Comment[sl]=Podpora jeziku ada
+Comment[sr]=Ada језичка подршка
+Comment[sr@Latn]=Ada jeziÄka podrÅ¡ka
+Comment[sv]=Stöd för språket Ada
+Comment[ta]=அடா மொழி ஆதரவà¯
+Comment[tg]=Ðри намудани забони Ada
+Comment[tr]=Ada Dil DesteÄŸi
+Comment[zh_CN]=Ada 语言支æŒ
+Comment[zh_TW]=Ada 語言支æ´
+Name=KDevAdaSupport
+Name[da]=KDevelop Ada-understøttelse
+Name[de]=Unterstützung für Ada (KDevelop)
+Name[hi]=के-डेव-à¤à¤¡à¥€à¤-समरà¥à¤¥à¤¨
+Name[nds]=Ada-Ünnerstütten för KDevelop
+Name[ne]=केडीई विकास à¤à¤¡à¤¾ समरà¥à¤¥à¤¨
+Name[pl]=KDevObsługaAdy
+Name[sk]=KDevAdaPodpora
+Name[sv]=KDevelop Ada-stöd
+Name[ta]=கெடெவ௠அடா ஆதரவà¯
+Name[zh_TW]=KDevelop Ada 支æ´
+GenericName=Ada Language Support
+GenericName[ca]=Suport per al llenguatge Ada
+GenericName[da]=Ada sprogunderstøttelse
+GenericName[de]=Sprachunterstützung für Ada
+GenericName[el]=ΥποστήÏιξη γλώσσας Ada
+GenericName[es]=Soporte para lenguaje Ada
+GenericName[et]=ADA keele toetus
+GenericName[eu]=Ada lenguaiaren euskarria
+GenericName[fa]=پشتیبانی زبان آدا
+GenericName[fr]=Prise en charge du langage ADA
+GenericName[ga]=Tacaíocht Ada
+GenericName[gl]=Soporte da linguaxe Ada
+GenericName[hi]=à¤à¤¡à¥€à¤ भाषा समरà¥à¤¥à¤¨
+GenericName[hu]=Ada-támogatás
+GenericName[it]=Supporto al linguaggio Ada
+GenericName[ja]=Ada 言語サãƒãƒ¼ãƒˆ
+GenericName[ms]=Sokongan Bahasa Ada
+GenericName[nds]=Ünnerstütten för de Spraak Ada
+GenericName[ne]=à¤à¤¡à¤¾ भाषा समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor Ada
+GenericName[pl]=Obsługa języka Ada
+GenericName[pt]=Suporte à Linguagem Ada
+GenericName[pt_BR]=Suporte à Linguagem Ada
+GenericName[ru]=Поддержка Ñзыка Ada
+GenericName[sk]=Podpora jazyka Ada
+GenericName[sl]=Podpora jeziku ada
+GenericName[sr]=Ada језичка подршка
+GenericName[sr@Latn]=Ada jeziÄka podrÅ¡ka
+GenericName[sv]=Stöd för språket Ada
+GenericName[ta]=அடா மொழி ஆதரவà¯
+GenericName[tg]=Ðри намудани забони Ada
+GenericName[tr]=Ada Dil DesteÄŸi
+GenericName[zh_CN]=Ada 语言支æŒ
+GenericName[zh_TW]=Ada 語言支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevadasupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Ada
diff --git a/languages/ada/kdevadasupport.rc b/languages/ada/kdevadasupport.rc
new file mode 100644
index 00000000..23b705db
--- /dev/null
+++ b/languages/ada/kdevadasupport.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="KDevAdaSupport" version="1">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="plugin_action"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar">
+ <Action name="plugin_action"/>
+</ToolBar>
+</kpartplugin>
diff --git a/languages/ada/preambles.h b/languages/ada/preambles.h
new file mode 100644
index 00000000..e9ea460b
--- /dev/null
+++ b/languages/ada/preambles.h
@@ -0,0 +1,89 @@
+/*
+ * Two macros are defined here: ANTLR_PARSER_PREAMBLE and ANTLR_LEXER_PREAMBLE.
+ * They encapsulate the application specific extensions for the classes
+ * AdaParser and AdaLexer which are defined in ada.g.
+ * This keeps ada.g independent of the application.
+ *
+ * Kdevelop version:
+ * (C) 2003 Oliver M. Kellogg (okellogg@users.sourceforge.net)
+ */
+#ifndef _PREAMBLES_H_
+#define _PREAMBLES_H_
+
+#include <string>
+#include "problemreporter.h"
+
+#define ANTLR_PARSER_PREAMBLE \
+ private: \
+ unsigned int m_numberOfErrors; \
+ ProblemReporter* m_problemReporter; \
+ \
+ public: \
+ void resetErrors () { m_numberOfErrors = 0; } \
+ unsigned int numberOfErrors () const { return m_numberOfErrors; } \
+ void setProblemReporter (ProblemReporter* r) { m_problemReporter = r; } \
+ \
+ void reportError (const antlr::RecognitionException& ex) { \
+ m_problemReporter->reportError \
+ (ex.toString().c_str (), \
+ ex.getFilename().c_str (), \
+ ex.getLine (), \
+ ex.getColumn ()); \
+ ++m_numberOfErrors; \
+ } \
+ \
+ void reportError (const std::string& errorMessage) { \
+ m_problemReporter->reportError \
+ (errorMessage.c_str(), \
+ getFilename ().c_str(), \
+ LT(1)->getLine (), \
+ LT(1)->getColumn ()); \
+ ++m_numberOfErrors; \
+ } \
+ \
+ void reportMessage (const std::string& message) { \
+ m_problemReporter->reportMessage \
+ (message.c_str (), \
+ getFilename ().c_str (), \
+ LT(1)->getLine (), \
+ LT(1)->getColumn ()); \
+ }
+
+#define ANTLR_LEXER_PREAMBLE \
+ private: \
+ unsigned int m_numberOfErrors; \
+ ProblemReporter* m_problemReporter; \
+ \
+ public: \
+ void resetErrors () { m_numberOfErrors = 0; } \
+ unsigned int numberOfErrors () const { return m_numberOfErrors; } \
+ void setProblemReporter (ProblemReporter* r) { m_problemReporter = r; } \
+ \
+ void reportError (const antlr::RecognitionException& ex) { \
+ m_problemReporter->reportError \
+ (ex.toString ().c_str (), \
+ ex.getFilename ().c_str (), \
+ ex.getLine (), \
+ ex.getColumn ()); \
+ ++m_numberOfErrors; \
+ } \
+ \
+ void reportError (const std::string& errorMessage) { \
+ m_problemReporter->reportError \
+ (errorMessage.c_str (), \
+ getFilename().c_str (), \
+ getLine (), \
+ getColumn ()); \
+ ++m_numberOfErrors; \
+ } \
+ \
+ void reportWarning (const std::string& warnMessage) { \
+ m_problemReporter->reportWarning \
+ (warnMessage.c_str (), \
+ getFilename ().c_str (), \
+ getLine (), \
+ getColumn ()); \
+ }
+
+#endif // _PREAMBLES_H_
+
diff --git a/languages/ada/problemreporter.cpp b/languages/ada/problemreporter.cpp
new file mode 100644
index 00000000..36ac6186
--- /dev/null
+++ b/languages/ada/problemreporter.cpp
@@ -0,0 +1,282 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+ Copyright (C) 2003 Oliver Kellogg <okellogg@users.sourceforge.net>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include "problemreporter.h"
+#include "adasupportpart.h"
+#include "kdevpartcontroller.h"
+#include "kdevmainwindow.h"
+#include "configproblemreporter.h"
+#include "backgroundparser.h"
+
+#include <qfileinfo.h>
+
+#include <kdeversion.h>
+#include <kparts/part.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/document.h>
+#include <ktexteditor/markinterface.h>
+
+#include <ktexteditor/markinterfaceextension.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstatusbar.h>
+#include <kurl.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+
+#include <kconfig.h>
+
+#include <qtimer.h>
+#include <qregexp.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+#include <kdialogbase.h>
+
+
+class ProblemItem: public QListViewItem{
+public:
+ ProblemItem( QListView* parent, const QString& level, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : QListViewItem( parent, level, problem, file, line, column ) {}
+
+ ProblemItem( QListViewItem* parent, const QString& level, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : QListViewItem( parent, level, problem, file, line, column ) {}
+
+ int compare( QListViewItem* item, int column, bool ascending ) const {
+ if( column == 3 || column == 4 ){
+ int a = text( column ).toInt();
+ int b = item->text( column ).toInt();
+ if( a == b )
+ return 0;
+ return( a > b ? -1 : 1 );
+ }
+ return QListViewItem::compare( item, column, ascending );
+ }
+
+};
+
+ProblemReporter::ProblemReporter( AdaSupportPart* part, QWidget* parent, const char* name )
+ : QListView( parent, name ),
+ m_adaSupport( part ),
+ m_editor( 0 ),
+ m_document( 0 ),
+ m_markIface( 0 ),
+ m_bgParser( 0 )
+{
+ QWhatsThis::add(this, i18n("<b>Problem reporter</b><p>This window shows errors reported by a language parser."));
+
+ addColumn( i18n("Level") );
+ addColumn( i18n("Problem") );
+ addColumn( i18n("File") );
+ addColumn( i18n("Line") );
+ //addColumn( i18n("Column") );
+ setAllColumnsShowFocus( TRUE );
+
+ m_timer = new QTimer( this );
+
+ connect( part->partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part*)) );
+ connect( part->partController(), SIGNAL(partAdded(KParts::Part*)),
+ this, SLOT(slotPartAdded(KParts::Part*)) );
+ connect( part->partController(), SIGNAL(partRemoved(KParts::Part*)),
+ this, SLOT(slotPartRemoved(KParts::Part*)) );
+
+ connect( m_timer, SIGNAL(timeout()), this, SLOT(reparse()) );
+
+ connect( this, SIGNAL(doubleClicked(QListViewItem*)),
+ this, SLOT(slotSelected(QListViewItem*)) );
+ connect( this, SIGNAL(returnPressed(QListViewItem*)),
+ this, SLOT(slotSelected(QListViewItem*)) );
+
+ configure();
+}
+
+ProblemReporter::~ProblemReporter()
+{
+ if( m_bgParser ) {
+ m_bgParser->wait();
+ }
+
+ delete( m_bgParser );
+ m_bgParser = 0;
+}
+
+void ProblemReporter::slotActivePartChanged( KParts::Part* part )
+{
+ if( !part )
+ return;
+
+ if( m_editor )
+ reparse();
+
+ m_document = dynamic_cast<KTextEditor::Document*>( part );
+ if( m_document ){
+ m_filename = m_document->url().path();
+ }
+
+ m_editor = dynamic_cast<KTextEditor::EditInterface*>( part );
+ if( m_editor )
+ connect( m_document, SIGNAL(textChanged()), this, SLOT(slotTextChanged()) );
+
+ m_markIface = dynamic_cast<KTextEditor::MarkInterface*>( part );
+
+ m_timer->changeInterval( m_delay );
+}
+
+void ProblemReporter::slotTextChanged()
+{
+ if( m_active )
+ m_timer->changeInterval( m_delay );
+}
+
+void ProblemReporter::reparse()
+{
+ kdDebug() << "ProblemReporter::reparse()" << endl;
+
+ if( !m_editor )
+ return;
+
+ m_timer->stop();
+
+ if( m_bgParser ) {
+ if( m_bgParser->running() ) {
+ m_timer->changeInterval( m_delay );
+ return;
+ }
+
+ delete( m_bgParser );
+ m_bgParser = 0;
+ }
+
+ QListViewItem* current = firstChild();
+ while( current ){
+ QListViewItem* i = current;
+ current = current->nextSibling();
+
+ if( i->text(2) == m_filename )
+ delete( i );
+ }
+
+ if( m_markIface ){
+ QPtrList<KTextEditor::Mark> marks = m_markIface->marks();
+ QPtrListIterator<KTextEditor::Mark> it( marks );
+ while( it.current() ){
+ m_markIface->removeMark( it.current()->line, KTextEditor::MarkInterface::markType07 );
+ ++it;
+ }
+ }
+
+/* Temporarily deactivated (crashes)*/
+ if (!m_adaSupport->fileExtensions ().contains (QFileInfo (m_filename).extension ()))
+ {
+ m_bgParser = new BackgroundParser( this, m_editor->text(), m_filename );
+ m_bgParser->start();
+ }
+ /**/
+}
+
+void ProblemReporter::slotSelected( QListViewItem* item )
+{
+ KURL url( item->text(2) );
+ int line = item->text( 3 ).toInt();
+ // int column = item->text( 4 ).toInt();
+ m_adaSupport->partController()->editDocument( url, line-1 );
+}
+
+void ProblemReporter::reportError( QString message,
+ QString filename,
+ int line, int column )
+{
+ if( m_markIface ){
+ m_markIface->addMark( line-1, KTextEditor::MarkInterface::markType07 );
+ }
+
+ new ProblemItem( this,
+ "error",
+ message.replace( QRegExp("\n"), "" ),
+ filename,
+ QString::number( line ),
+ QString::number( column ) );
+}
+
+void ProblemReporter::reportWarning( QString message,
+ QString filename,
+ int line, int column )
+{
+ new ProblemItem( this,
+ "warning",
+ message.replace( QRegExp("\n"), "" ),
+ filename,
+ QString::number( line ),
+ QString::number( column ) );
+}
+
+void ProblemReporter::reportMessage( QString message,
+ QString filename,
+ int line, int column )
+{
+ new QListViewItem( this,
+ "message",
+ message.replace( QRegExp("\n"), "" ),
+ filename,
+ QString::number( line ),
+ QString::number( column ) );
+}
+
+void ProblemReporter::configure()
+{
+ kdDebug() << "ProblemReporter::configure()" << endl;
+ KConfig* config = kapp->config();
+ config->setGroup( "General Options" );
+ m_active = config->readBoolEntry( "EnableAdaBgParser", TRUE );
+ m_delay = config->readNumEntry( "BgParserDelay", 500 );
+}
+
+void ProblemReporter::configWidget( KDialogBase* dlg )
+{
+ kdDebug() << "ProblemReporter::configWidget()" << endl;
+ QVBox *vbox = dlg->addVBoxPage(i18n("Ada Parsing"), i18n("Ada Parsing"), BarIcon( "source", KIcon::SizeMedium ));
+ ConfigureProblemReporter* w = new ConfigureProblemReporter( vbox );
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ connect(dlg, SIGNAL(okClicked()), this, SLOT(configure()));
+}
+
+void ProblemReporter::slotPartAdded( KParts::Part* part )
+{
+ KTextEditor::MarkInterfaceExtension* iface = dynamic_cast<KTextEditor::MarkInterfaceExtension*>( part );
+
+ if( !iface )
+ return;
+
+ iface->setPixmap( KTextEditor::MarkInterface::markType07, SmallIcon("stop") );
+}
+
+void ProblemReporter::slotPartRemoved( KParts::Part* part )
+{
+ kdDebug() << "ProblemReporter::slotPartRemoved()" << endl;
+ if( part == m_document ){
+ m_document = 0;
+ m_editor = 0;
+ m_timer->stop();
+ }
+}
+
+#include "problemreporter.moc"
diff --git a/languages/ada/problemreporter.h b/languages/ada/problemreporter.h
new file mode 100644
index 00000000..b42a6ad3
--- /dev/null
+++ b/languages/ada/problemreporter.h
@@ -0,0 +1,79 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+ Copyright (C) 2003 Oliver Kellogg <okellogg@users.sourceforge.net>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef PROBLEMSREPORTER_H
+#define PROBLEMSREPORTER_H
+
+#include <qlistview.h>
+
+class AdaSupportPart;
+class QTimer;
+class KDialogBase;
+class BackgroundParser;
+
+namespace KParts{
+ class Part;
+}
+
+namespace KTextEditor{
+ class EditInterface;
+ class MarkInterface;
+ class Document;
+}
+
+class ProblemReporter: public QListView{
+ Q_OBJECT
+public:
+ ProblemReporter( AdaSupportPart* part, QWidget* parent=0, const char* name=0 );
+ virtual ~ProblemReporter();
+
+ virtual void reportError( QString message, QString filename,
+ int line, int column );
+
+ virtual void reportWarning( QString message, QString filename,
+ int line, int column );
+
+ virtual void reportMessage( QString message, QString filename,
+ int line, int column );
+
+public slots:
+ void reparse();
+ void configure();
+ void configWidget( KDialogBase* );
+
+private slots:
+ void slotPartAdded( KParts::Part* );
+ void slotPartRemoved( KParts::Part* );
+ void slotActivePartChanged( KParts::Part* );
+ void slotTextChanged();
+ void slotSelected( QListViewItem* );
+
+private:
+ AdaSupportPart* m_adaSupport;
+ KTextEditor::EditInterface* m_editor;
+ KTextEditor::Document* m_document;
+ KTextEditor::MarkInterface* m_markIface;
+ QTimer* m_timer;
+ QString m_filename;
+ int m_active;
+ int m_delay;
+ BackgroundParser* m_bgParser;
+};
+
+#endif
diff --git a/languages/bash/Makefile.am b/languages/bash/Makefile.am
new file mode 100644
index 00000000..90b94689
--- /dev/null
+++ b/languages/bash/Makefile.am
@@ -0,0 +1,20 @@
+#Here resides the Bash Shell support part.
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+SUBDIRS = app_templates doc
+
+kde_module_LTLIBRARIES = libkdevbashsupport.la
+libkdevbashsupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevbashsupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la
+
+libkdevbashsupport_la_SOURCES = bashsupport_part.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevbashsupport.desktop
+
+rcdir = $(kde_datadir)/kdevbashsupport
+rc_DATA = kdevbashsupport.rc
diff --git a/languages/bash/README.dox b/languages/bash/README.dox
new file mode 100644
index 00000000..95765f0a
--- /dev/null
+++ b/languages/bash/README.dox
@@ -0,0 +1,15 @@
+/** \class BashSupportPart
+
+Supports bash language
+
+\authors <a href="mailto:geiseri AT kde.org">Ian Reinhart Geiser</a>
+
+\maintainer <a href="mailto:geiseri AT kde.org">Ian Reinhart Geiser</a>
+
+\feature function browser support
+\feature runs bash script in external terminal
+\feature syntax highlighting and code folding via katepart
+\feature Code completion works for variables
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+*/
diff --git a/languages/bash/app_templates/Makefile.am b/languages/bash/app_templates/Makefile.am
new file mode 100644
index 00000000..7dbe86af
--- /dev/null
+++ b/languages/bash/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = bashhello
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/ScriptingLanguageIDE/ShellIDE
+profiles_DATA = bash.appwizard
diff --git a/languages/bash/app_templates/bash.appwizard b/languages/bash/app_templates/bash.appwizard
new file mode 100644
index 00000000..2e4473b0
--- /dev/null
+++ b/languages/bash/app_templates/bash.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=bashhello
diff --git a/languages/bash/app_templates/bashhello/.kdev_ignore b/languages/bash/app_templates/bashhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/bash/app_templates/bashhello/.kdev_ignore
diff --git a/languages/bash/app_templates/bashhello/Makefile.am b/languages/bash/app_templates/bashhello/Makefile.am
new file mode 100644
index 00000000..45e403b8
--- /dev/null
+++ b/languages/bash/app_templates/bashhello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.sh app.kdevelop
+templateName = bashhello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/bash/app_templates/bashhello/app.kdevelop b/languages/bash/app_templates/bashhello/app.kdevelop
new file mode 100644
index 00000000..40e783a4
--- /dev/null
+++ b/languages/bash/app_templates/bashhello/app.kdevelop
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Bash</primarylanguage>
+ <keywords>
+ <keyword>Bash</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevdistpart</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <activedir>src</activedir>
+ <includepatterns>*.sh</includepatterns>
+ <excludepatterns>*~</excludepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.sh" name="Scripts" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="sh"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/bash/app_templates/bashhello/app.sh b/languages/bash/app_templates/bashhello/app.sh
new file mode 100644
index 00000000..9e70bd5f
--- /dev/null
+++ b/languages/bash/app_templates/bashhello/app.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# $Id$
+# %{APPNAME} - Copyright (C) %{YEAR} %{AUTHOR} <%{EMAIL}>
+
+
+hello()
+{
+ echo "Hello $NAME"
+}
+
+echo "This is a test"
+
+LST="Ian Ben Rook Kaz"
+for NAME in $LST
+do
+ hello
+done
diff --git a/languages/bash/app_templates/bashhello/bashhello b/languages/bash/app_templates/bashhello/bashhello
new file mode 100644
index 00000000..7c9b9222
--- /dev/null
+++ b/languages/bash/app_templates/bashhello/bashhello
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=Simple Bash Shell Script
+Name[fr]=Un simple script de test « Hello world »
+Category=Shell
+Category[fr]=Interpréteur BASH
+Comment=This generates a simplistic 'Hello world' program in Bash shell
+Comment[fr]=Génère un simple script de test du type « Hello world » pour l'interpréteur BASH.
+FileTemplates=sh,ShellStyle
+ShowFilesAfterGeneration=APPNAMELC.sh
diff --git a/languages/bash/app_templates/bashhello/bashhello.kdevtemplate b/languages/bash/app_templates/bashhello/bashhello.kdevtemplate
new file mode 100644
index 00000000..e62b1514
--- /dev/null
+++ b/languages/bash/app_templates/bashhello/bashhello.kdevtemplate
@@ -0,0 +1,111 @@
+# KDE Config File
+[General]
+Name=Simple Bash Shell Script
+Name[ca]=Simple script de l'intèrpret de comandaments Bash
+Name[da]=Simpelt Bash skal-script
+Name[de]=Ein einfaches Shell-Skript für Bash
+Name[el]=Απλό σενάÏιο κελÏφους Bash
+Name[es]=Guión sencillo para el intérprete de órdenes Bash
+Name[et]=Lihtne bash'i shelliskript
+Name[eu]=Bash shell-aren script sinplea
+Name[fa]=دست‌نوشتۀ سادۀ پوستۀ Bash
+Name[fr]=Script shell Bash simple
+Name[ga]=Script Shimplí Bhlaoisce Bash
+Name[gl]=Script sinxelo en Bash Shell
+Name[hu]=Egyszerű Bash-szkript
+Name[it]=Semplice script shell Bash
+Name[ja]=ç°¡å˜ãª Bash シェルスクリプト
+Name[nds]=En eenfach Konsoolskript för Bash
+Name[ne]=साधारण बà¥à¤¯à¤¾à¤¸ शेल सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ
+Name[nl]=Eenvoudig Bash-shellscript
+Name[pl]=Prosty skrypt powłoki Bash
+Name[pt]=Programa Simples da 'Shell' Bash
+Name[pt_BR]=Programa Simples da 'Shell' Bash
+Name[ru]=ПроÑтой Ñкрипт Bash
+Name[sk]=Jednoduchý skript pre Bash Shell
+Name[sl]=Preprost skript za lupino Bash
+Name[sr]=ЈедноÑтавна Ñкрипта шкољке Bash
+Name[sr@Latn]=Jednostavna skripta Å¡koljke Bash
+Name[sv]=Enkelt Bash-skalskript
+Name[tr]=Basit Bash Kabuk BetiÄŸi
+Name[zh_CN]=简å•çš„ Bash Shell 脚本
+Name[zh_TW]=簡單的 Bash shell 文稿
+Category=Shell
+Category[fr]=Interpréteur BASH
+Comment=This generates a simplistic 'Hello world' program in Bash shell
+Comment[ca]=Genera un simple programa de 'Hello world' en l'intèrpret de comandaments Bash
+Comment[da]=Dette genererer et simplistisk 'Goddag verden' program i en Bash skal
+Comment[de]=Generiert ein einfaches "Hello world"-Programm für die Bash-Shell
+Comment[el]=Αυτό δημιουÏγεί ένα απλό Ï€ÏόγÏαμμα 'Γεια σου κόσμε' στο κέλυφος Bash
+Comment[es]=Genera un sencillo programa «Hola mundo» para el intérprete de órdenes Bash
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine bash'i shellis
+Comment[eu]=Honek "Kaixo mundua" programa sinple bat sortzen du Bash shell-erako
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در پوستۀ Bash تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » des plus simples en shell Bash
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí "Hello World" i mblaosc Bash
+Comment[gl]=Xera un programa sinxelo 'Ola mundo' en Bash shell
+Comment[hu]=Létrehoz egy egyszerű Hello world programot a Bash parancsértelmezőhöz
+Comment[it]=Questo genera un semplice programma shell di "Hello world" in Bash
+Comment[ja]=ç°¡å˜ãª Hello world プログラムを Bash シェルã§è¨˜è¿°ã—ã¾ã™
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm för de Bash-Konsool op
+Comment[ne]=यसले बà¥à¤¯à¤¾à¤¸ शेलमा साधारण 'हेलà¥à¤¡à¥‹ वोलà¥à¤¡à¤•à¤¾à¤°' कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Dit genereert een eenvoudig "Hello World" programma in Bash-shell
+Comment[pl]=Generuje prosty program 'Witaj świecie' jako skrypt powłoki Bash
+Comment[pt]=Isto gera um programa simplista 'Olá mundo' para a linha de comandos Bash
+Comment[pt_BR]=Isto gera um programa simplista 'Olá mundo' para a linha de comandos Bash
+Comment[ru]=Создание проÑтой программы 'Hello world' на Bash
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program v Bash Shell
+Comment[sl]=Ustvari preprost program 'Dobrodošel svet' v lupini Bash
+Comment[sr]=Ово прави једноÑтаван „Здраво Ñвете“ програм за шкољку Bash
+Comment[sr@Latn]=Ovo pravi jednostavan „Zdravo svete“ program za školjku Bash
+Comment[sv]=Detta skapar ett förenklat 'Hello world'-program för Bash-skalet
+Comment[tr]=Bu, Bash kabuğunda basit bir "Merhaba Dünya" programı üretir.
+Comment[zh_CN]=è¿™å°†ç”Ÿæˆ Bash shell 中å¯ä»¥ä½¿ç”¨çš„“Hello worldâ€ç¨‹åº
+Comment[zh_TW]=這會產生一個簡單的 Bash shell çš„ hello world 程å¼
+FileTemplates=sh,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.sh
+Archive=bashhello.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.sh
+Dest=%{dest}/%{APPNAMELC}.sh
+
+[MSG]
+Type=message
+Comment=A simple bash shell script project was created in %{dest}
+Comment[ca]=Un simple script de l'intèrpret de comandaments Bash ha estat creat en %{dest}
+Comment[da]=Et simpelt bash skalscript-projekt blev oprettet i %{dest}
+Comment[de]=Ein einfaches Shell-Skript-Projekt für Bash wurde in %{dest} erstellt
+Comment[el]=Ένα απλό σενάÏιο κελÏφους bash δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo proyecto de guión de intérprete de órdenes ha sido creado en %{dest}
+Comment[et]=Lihtne bash'i shelliskript loodi asukohta %{dest}
+Comment[eu]=Bash shell-erako proiektu sinple bat sortu da hemen:%{dest}
+Comment[fa]=یک پروژۀ دست‌نوشتۀ پوستۀ bash ساده در %{dest} ایجاد شد
+Comment[fr]=Un projet de script shell Bash simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh tionscadal simplí bash i %{dest}
+Comment[gl]=Creouse un proxecto de script sinxelo en bash shell en %{dest}
+Comment[hu]=Létrejött egy egyszerű Bash-szkript (projekt) itt: %{dest}
+Comment[it]=È stato creato un semplice progetto di script shell in Bash in %{dest}
+Comment[ja]=ç°¡å˜ãª bash シェルスクリプトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach Konsoolskript-Projekt för Bash opstellt
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण शेल सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ परियोजना %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरिà¤à¤•à¥‹ थियो
+Comment[nl]=Een eenvoudig Bash-shellscript is aangemaakt in %{dest}
+Comment[pl]=Prosty skrypt powłoki został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples "Olá mundo" em Bash em %{dest}
+Comment[pt_BR]=Foi criado um programa simples "Olá mundo" em Bash em %{dest}
+Comment[ru]=ПроÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° "Hello world" на Bash Ñоздана в %{dest}
+Comment[sk]=Jednoduchý Bash Shell projekt bol vytvorený v %{dest}
+Comment[sl]=Projekt s preprostim skriptom za lupino Bash je bil ustvarjen v %{dest}
+Comment[sr]=Пројекат једноÑтавне Ñкрипте за шкољку Bash направљен је у %{dest}
+Comment[sr@Latn]=Projekat jednostavne skripte za Å¡koljku Bash napravljen je u %{dest}
+Comment[sv]=Ett enkelt Bash skalskriptprojekt skapades i %{dest}
+Comment[tr]=Basit bir bash betik projesi %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了简å•çš„ Bash Shell 脚本工程
+Comment[zh_TW]=Bash shell çš„ Hello world 程å¼å·²ç”¢ç”Ÿåœ¨ ${dest}
diff --git a/languages/bash/app_templates/bashhello/bashhello.png b/languages/bash/app_templates/bashhello/bashhello.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/bash/app_templates/bashhello/bashhello.png
Binary files differ
diff --git a/languages/bash/bashsupport_part.cpp b/languages/bash/bashsupport_part.cpp
new file mode 100644
index 00000000..389c0a70
--- /dev/null
+++ b/languages/bash/bashsupport_part.cpp
@@ -0,0 +1,442 @@
+/*
+* Copyright (C) 2003 Ian Reinhart Geiser <geiseri@kde.org>
+*/
+#include "bashsupport_part.h"
+
+#include <qwhatsthis.h>
+
+#include <qfileinfo.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <kapplication.h>
+#include <qregexp.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kdevgenericfactory.h>
+#include <kprocess.h>
+#include <kdebug.h>
+#include <kaction.h>
+#include <kparts/part.h>
+#include <kdialogbase.h>
+
+
+#include <kdevcore.h>
+#include <kdevmainwindow.h>
+#include <kdevlanguagesupport.h>
+#include <kdevpartcontroller.h>
+#include <kdevproject.h>
+#include <kdevappfrontend.h>
+#include <kdevplugininfo.h>
+#include <domutil.h>
+#include <codemodel.h>
+
+typedef KDevGenericFactory<BashSupportPart> BashSupportFactory;
+static const KDevPluginInfo data("kdevbashsupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevbashsupport, BashSupportFactory( data ) )
+
+BashSupportPart::BashSupportPart(QObject *parent, const char *name, const QStringList& )
+: KDevLanguageSupport (&data, parent, name ? name : "BashSupportPart" )
+{
+ setInstance(BashSupportFactory::instance());
+ setXMLFile("kdevbashsupport.rc");
+
+ KAction *action;
+ action = new KAction( i18n("&Run"), "exec",Key_F9,this, SLOT(slotRun()),actionCollection(), "build_execute" );
+ action->setToolTip(i18n("Run"));
+ action->setWhatsThis(i18n("<b>Run</b><p>Starts an application."));
+
+ kdDebug() << "Creating BashSupportPart" << endl;
+
+ connect( core(), SIGNAL(projectConfigWidget(KDialogBase*)),
+ this, SLOT(projectConfigWidget(KDialogBase*)) );
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)), this, SLOT(savedFile(const KURL&)) );
+ connect(partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part *)));
+
+ m_cc = new BashCodeCompletion();
+}
+
+
+BashSupportPart::~BashSupportPart()
+{
+ delete( m_cc );
+ m_cc = 0;
+}
+
+
+void BashSupportPart::projectConfigWidget(KDialogBase *dlg)
+{
+ Q_UNUSED( dlg );
+// QVBox *vbox = dlg->addVBoxPage(i18n("Bash"));
+// RubyConfigWidget *w = new RubyConfigWidget(*projectDom(), (QWidget *)vbox, "Bash config widget");
+// connect( dlg, SIGNAL(okClicked()), w, SLOT(accept()) );
+}
+
+void BashSupportPart::projectOpened()
+{
+ kdDebug(9014) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(0, this, SLOT(parse()));
+}
+
+
+void BashSupportPart::projectClosed()
+{
+
+}
+
+void BashSupportPart::slotRun ()
+{
+ QString file;
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ if(ro_part)
+ file = ro_part->url().path();
+
+ QString cmd = interpreter() + " " + file;
+ startApplication(cmd);
+}
+
+QString BashSupportPart::interpreter()
+{
+ QString prog = DomUtil::readEntry(*projectDom(), "/kdevrbashsupport/run/interpreter");
+ if (prog.isEmpty())
+ prog = "bash";
+ return prog;
+}
+
+void BashSupportPart::parse()
+{
+ kdDebug(9014) << "initialParse()" << endl;
+
+ if (project())
+ {
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it)
+ {
+ kdDebug(9014) << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+ parse(project()->projectDirectory() + "/" + *it);
+ }
+ emit updatedSourceInfo();
+ kapp->restoreOverrideCursor();
+ } else {
+ kdDebug(9014) << "No project" << endl;
+ }
+}
+
+void BashSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+kdDebug(9014) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ parse(project()->projectDirectory() + "/" + ( *it ) );
+ }
+
+ emit updatedSourceInfo();
+}
+
+
+void BashSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug(9014) << "removedFilesFromProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ if( codeModel()->hasFile(fileName) ){
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+ }
+
+ //emit updatedSourceInfo();
+}
+
+void BashSupportPart::savedFile(const KURL &fileName)
+{
+ kdDebug(9014) << "savedFile()" << endl;
+
+ if (project()->allFiles().contains(fileName.path().mid ( project()->projectDirectory().length() + 1 )))
+ {
+ parse(fileName.path());
+ emit addedSourceInfo( fileName.path() );
+ }
+}
+
+void BashSupportPart::startApplication(const QString &program)
+{
+ kdDebug() << "starting application" << program << endl;
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), program, TRUE);
+}
+
+
+KDevLanguageSupport::Features BashSupportPart::features()
+{
+ return Features(Variables | Functions);
+}
+
+void BashSupportPart::parse(const QString &fileName)
+{
+ QFileInfo fi(fileName);
+ m_vars.clear();
+ if (fi.extension() == "sh")
+ {
+ if( codeModel()->hasFile(fileName) ){
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+
+ FileDom m_file = codeModel()->create<FileModel>();
+ m_file->setName( fileName );
+
+ m_vars.clear();
+ QFile f(QFile::encodeName(fileName));
+ if (!f.open(IO_ReadOnly))
+ return;
+ QString rawline;
+ QString line;
+ uint lineNo = 0;
+ //KRegExp methodre("\\b([\\d\\w]+[\\s]*)\\([\\s]*\\)");
+ QRegExp methodre("^\\s*(\\w+)\\s*\\(\\s*\\)");
+ QRegExp varre( "^\\s*(\\w+)[=]" );
+ QRegExp expvarre( "^export\\s*(\\w+)[=]" );
+ QRegExp forvarre("\\bfor[\\s]+([\\d\\w]+)[\\s]+in[\\s]+");
+
+ QTextStream stream(&f);
+ while (!stream.atEnd())
+ {
+ rawline = stream.readLine();
+ line = rawline.stripWhiteSpace().local8Bit();
+ kdDebug() << "Trying line: " << line << endl;
+ if (methodre.search(line) != -1)
+ {
+ FunctionDom method = codeModel()->create<FunctionModel>();
+ method->setName(methodre.cap(1));
+ method->setFileName(fileName);
+ method->setStartPosition(lineNo, 0);
+
+ if( !m_file->hasFunction(method->name()) ){
+ kdDebug() << "Add global method " << method->name() << endl;
+ m_file->addFunction( method );
+ }
+ }
+ else if(varre.search(line) != -1)
+ {
+ addAttribute(varre.cap(1), m_file, lineNo);
+ }
+ else if(expvarre.search(line) != -1)
+ {
+ addAttribute(expvarre.cap(1), m_file, lineNo);
+ }
+ else if(forvarre.search(line) != -1)
+ {
+ addAttribute(forvarre.cap(1), m_file, lineNo);
+ }
+ ++lineNo;
+ }
+ f.close();
+
+ kdDebug() << "Trying to add list..." << endl;
+ codeModel()->addFile( m_file );
+ VariableList attrList = codeModel()->globalNamespace()->variableList();
+ for (VariableList::Iterator it = attrList.begin(); it != attrList.end(); ++it)
+ {
+ kdDebug() << "Adding " << (*it)->name() << endl;
+ m_vars.append((*it)->name());
+ }
+ m_cc->setVars(m_vars);
+
+ codeModel()->addFile( m_file );
+ }
+
+}
+
+void BashSupportPart::slotActivePartChanged(KParts::Part *part)
+{
+ kdDebug() << "Changeing part..." << endl;
+ m_cc->setActiveEditorPart(part);
+}
+
+void BashSupportPart::addAttribute(const QString &name, FileDom file, uint lineNo)
+{
+ VariableDom var = codeModel()->create<VariableModel>();
+ var->setName(name);
+ var->setFileName(file->name());
+ var->setStartPosition( lineNo, 0 );
+ var->setType(i18n("Variable"));
+
+ if( !file->hasVariable(var->name()) ){
+ kdDebug() << "Add global attribute " << var->name() << endl;
+ file->addVariable(var);
+ }
+}
+
+BashCodeCompletion::BashCodeCompletion()
+{
+ m_argWidgetShow = false;
+ m_completionBoxShow=false;
+}
+
+BashCodeCompletion::~BashCodeCompletion()
+{
+
+}
+
+void BashCodeCompletion::setActiveEditorPart(KParts::Part *part)
+{
+ if (!part || !part->widget())
+ return;
+
+ kdDebug() << "BashCodeCompletion::setActiveEditorPart" << endl;
+
+// We need to think about this
+// if(!(m_config->getCodeCompletion() || m_config->getCodeHinting())){
+// return; // no help
+// }
+
+ m_editInterface = dynamic_cast<KTextEditor::EditInterface*>(part);
+ if (!m_editInterface)
+ {
+ kdDebug() << "editor doesn't support the EditDocumentIface" << endl;
+ return;
+ }
+
+ m_cursorInterface = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget());
+ if (!m_cursorInterface)
+ {
+ kdDebug() << "editor does not support the ViewCursorInterface" << endl;
+ return;
+ }
+
+ m_codeInterface = dynamic_cast<KTextEditor::CodeCompletionInterface*>(part->widget());
+ if (!m_codeInterface) { // no CodeCompletionDocument available
+ kdDebug() << "editor doesn't support the CodeCompletionDocumentIface" << endl;
+ return;
+ }
+
+ disconnect(part->widget(), 0, this, 0 ); // to make sure that it is't connected twice
+ connect(part->widget(), SIGNAL(cursorPositionChanged()),
+ this, SLOT(cursorPositionChanged()));
+ connect(part->widget(), SIGNAL(argHintHidden()), this, SLOT(argHintHidden()));
+ connect(part->widget(), SIGNAL(completionAborted()), this, SLOT(completionBoxAbort()));
+ connect(part->widget(), SIGNAL(completionDone()), this, SLOT(completionBoxHidden()));
+
+}
+
+void BashCodeCompletion::setVars(QStringList lst)
+{
+ m_vars = lst;
+}
+
+QValueList<KTextEditor::CompletionEntry> BashCodeCompletion::getVars(const QString &startText)
+{
+ kdDebug() << "getVars for " << startText << endl;
+ QValueList<KTextEditor::CompletionEntry> varList;
+ QValueList<QString>::ConstIterator it;
+ for (it = m_vars.begin(); it != m_vars.end(); ++it) {
+ QString var = "$" + (*it);
+ kdDebug() << "Compair " << var << endl;
+ if( var.startsWith( startText ))
+ {
+ KTextEditor::CompletionEntry e;
+ e.text = var;
+ //e.postfix ="";
+ //e.prefix ="";
+ kdDebug() << "getVar: " << var << endl;
+ varList.append(e);
+ }
+ }
+
+ return varList;
+}
+
+void BashCodeCompletion::cursorPositionChanged()
+{
+ uint line, col;
+ m_cursorInterface->cursorPositionReal(&line, &col);
+ kdDebug() << "BashCodeCompletion::cursorPositionChanged:" << line << ":" << col << endl;
+
+ QString lineStr = m_editInterface->textLine(line);
+ if(lineStr.isNull() || lineStr.isEmpty()){
+ kdDebug() << "No Text..." << endl;
+ return; // nothing to do
+ }
+// if(m_config->getCodeCompletion())
+// {
+ QString restLine = lineStr.mid(col);
+ QString prevText = lineStr.mid(0,col);
+
+ if(restLine.left(1) != " " && restLine.left(1) != "\t" && !restLine.isNull())
+ {
+ kdDebug() << "no codecompletion because no empty character after cursor:" << restLine << ":" << endl;
+ return;
+ }
+
+ QRegExp prevReg("[$][\\d\\w]*\\b$");
+
+ int pos = prevReg.search( prevText );
+ if (pos > -1 )
+ {
+ // We are in completion mode
+ QString startMatch = prevReg.cap(0);
+ kdDebug() << "Matching: " << startMatch << endl;
+ m_completionBoxShow=true;
+ m_codeInterface->showCompletionBox(getVars(startMatch),2);
+ }
+ else
+ {
+ kdDebug() << "no vars in: " << prevText << endl;
+ return;
+ }
+
+// }
+
+}
+
+void BashCodeCompletion::completionBoxHidden()
+{
+ kdDebug() << "Complete..." << endl;
+ m_completionBoxShow=false;
+/* uint line, col, start;
+ m_cursorInterface->cursorPositionReal(&line, &col);
+ QString lineStr = m_editInterface->textLine(line);
+
+ start = lineStr.findRev(QRegExp("[$][\\d\\w]*\\b$"));
+ m_editInterface->removeText ( start, col, line, col );
+*/
+}
+
+void BashCodeCompletion::completionBoxAbort()
+{
+ kdDebug() << "aborted..." << endl;
+ m_completionBoxShow=false;
+}
+
+KMimeType::List BashSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+
+ KMimeType::Ptr mime = KMimeType::mimeType( "application/x-shellscript" );
+ if( mime )
+ list << mime;
+
+ return list;
+}
+#include "bashsupport_part.moc"
diff --git a/languages/bash/bashsupport_part.h b/languages/bash/bashsupport_part.h
new file mode 100644
index 00000000..20c11c4e
--- /dev/null
+++ b/languages/bash/bashsupport_part.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2003 Ian Reinhart Geiser <geiseri@kde.org>
+ */
+
+
+#ifndef __KDEVPART_BASHSUPPORT_H__
+#define __KDEVPART_BASHSUPPORT_H__
+
+
+#include <qguardedptr.h>
+
+#include <kprocess.h>
+#include <kdialogbase.h>
+
+#include <codemodel.h>
+#include <kdevplugin.h>
+#include <kdevlanguagesupport.h>
+
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <ktexteditor/codecompletioninterface.h>
+
+//class BashSupportWidget;
+
+class BashCodeCompletion : QObject
+{
+ Q_OBJECT
+ public:
+ BashCodeCompletion();
+ ~BashCodeCompletion();
+ void setActiveEditorPart(KParts::Part*);
+ void setVars(QStringList);
+ QValueList<KTextEditor::CompletionEntry> getVars(const QString& textHint);
+
+ public slots:
+ void cursorPositionChanged();
+ void completionBoxHidden();
+ void completionBoxAbort();
+
+ private:
+ QStringList m_vars;
+ bool m_argWidgetShow;
+ bool m_completionBoxShow;
+ KTextEditor::EditInterface *m_editInterface;
+ KTextEditor::CodeCompletionInterface *m_codeInterface;
+ KTextEditor::ViewCursorInterface *m_cursorInterface;
+};
+
+class BashSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+ public:
+ BashSupportPart(QObject *parent, const char *name, const QStringList &);
+ virtual ~BashSupportPart();
+
+ protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+ private slots:
+ void slotRun();
+ void projectConfigWidget(KDialogBase *dlg);
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void parse();
+ void slotActivePartChanged(KParts::Part *part);
+
+ private:
+ void startApplication(const QString &program);
+ QString interpreter();
+ void parse(const QString &fileName);
+ void addAttribute(const QString &name, FileDom file, uint line);
+ BashCodeCompletion *m_cc;
+ QStringList m_vars;
+
+};
+
+#endif
diff --git a/languages/bash/doc/Makefile.am b/languages/bash/doc/Makefile.am
new file mode 100644
index 00000000..1474d939
--- /dev/null
+++ b/languages/bash/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = bash.toc bash_bugs.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA =
+
diff --git a/languages/bash/doc/bash.toc b/languages/bash/doc/bash.toc
new file mode 100644
index 00000000..060c59c7
--- /dev/null
+++ b/languages/bash/doc/bash.toc
@@ -0,0 +1,80 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Bash Reference Manual</title>
+<base href="http://bashdb.sourceforge.net/"/>
+<tocsect1 name="Introduction" url="bashref.html#SEC1">
+ <tocsect2 name="What is Bash?" url="bashref.html#SEC2"/>
+ <tocsect2 name="What is a Shell?" url="bashref.html#SEC3"/>
+</tocsect1>
+<tocsect1 name="Definitions" url="bashref.html#SEC4"></tocsect1>
+<tocsect1 name="Basic Shell Features" url="bashref.html#SEC5">
+ <tocsect2 name="Shell Syntax" url="bashref.html#SEC6"/>
+ <tocsect2 name="Shell Commands" url="bashref.html#SEC15"/>
+ <tocsect2 name="Shell Functions" url="bashref.html#SEC22"/>
+ <tocsect2 name="Shell Parameters" url="bashref.html#SEC23"/>
+ <tocsect2 name="Shell Expansions" url="bashref.html#SEC26"/>
+ <tocsect2 name="Shell Redirections" url="bashref.html#SEC37"/>
+ <tocsect2 name="Executeing Commands" url="bashref.html#SEC47"/>
+ <tocsect2 name="Shell Scripts" url="bashref.html#SEC54"/>
+</tocsect1>
+<tocsect1 name="Shell Builtin Commands" url="bashref.html#SEC55">
+ <tocsect2 name="Bourne Shell Builtins" url="bashref.html#SEC56"/>
+ <tocsect2 name="Bash Builtin Commands" url="bashref.html#SEC57"/>
+ <tocsect2 name="The Set Builtin" url="bashref.html#SEC58"/>
+ <tocsect2 name="Special Builtins" url="bashref.html#SEC59"/>
+</tocsect1>
+<tocsect1 name="Shell Variables" url="bashref.html#SEC60">
+ <tocsect2 name="Bourne Shell Variables" url="bashref.html#SEC61"/>
+ <tocsect2 name="Bash Variables" url="bashref.html#SEC62"/>
+</tocsect1>
+<tocsect1 name="Bash Features" url="bashref.html#SEC63">
+ <tocsect2 name="Invoking Bash" url="bashref.html#SEC64"/>
+ <tocsect2 name="Bash Startup Files" url="bashref.html#SEC65"/>
+ <tocsect2 name="Bash Conditional Expressions" url="bashref.html#SEC77"/>
+ <tocsect2 name="Shell Arithmetic" url="bashref.html#SEC78"/>
+ <tocsect2 name="Aliases" url="bashref.html#SEC79"/>
+ <tocsect2 name="Arrays" url="bashref.html#SEC80"/>
+ <tocsect2 name="The Directory Stack" url="bashref.html#SEC81"/>
+ <tocsect2 name="Controlling the Prompt" url="bashref.html#SEC83"/>
+ <tocsect2 name="The Restricted Shell" url="bashref.html#SEC84"/>
+ <tocsect2 name="Bash POSIX Mode" url="bashref.html#SEC85"/>
+</tocsect1>
+<tocsect1 name="Job Control" url="bashref.html#SEC86">
+ <tocsect2 name="Job Control Basics" url="bashref.html#SEC87"/>
+ <tocsect2 name="Job Control Builtins" url="bashref.html#SEC88"/>
+ <tocsect2 name="Job Control Variables" url="bashref.html#SEC89"/>
+</tocsect1>
+<tocsect1 name="Using History Interactively" url="bashref.html#SEC114">
+ <tocsect2 name="Bash History Facilities" url="bashref.html#SEC115"/>
+ <tocsect2 name="Bash Hisotry Builtins" url="bashref.html#SEC116"/>
+ <tocsect2 name="History Expansion" url="bashref.html#SEC117"/>
+</tocsect1>
+<tocsect1 name="Command Line Editing" url="bashref.html#SEC90">
+ <tocsect2 name="Introduciton to Line Editing" url="bashref.html#SEC91"/>
+ <tocsect2 name="Readline Interaction" url="bashref.html#SEC92"/>
+ <tocsect2 name="Readline Init File" url="bashref.html#SEC98"/>
+ <tocsect2 name="Bindable Readline Commands" url="bashref.html#SEC102"/>
+ <tocsect2 name="Readline VI Mode" url="bashref.html#SEC111"/>
+ <tocsect2 name="Programmable Completion" url="bashref.html#SEC112"/>
+ <tocsect2 name="Programmable Completion Builtins" url="bashref.html#SEC113"/>
+</tocsect1>
+<tocsect1 name="Installing Bash" url="bashref.html#SEC121">
+ <tocsect2 name="Basic Installation" url="bashref.html#SEC122"/>
+ <tocsect2 name="Compilers and Options" url="bashref.html#SEC123"/>
+ <tocsect2 name="Compileing for Multiple Architectures" url="bashref.html#SEC124"/>
+ <tocsect2 name="Installation Names" url="bashref.html#SEC125"/>
+ <tocsect2 name="Specifying the System Type" url="bashref.html#SEC126"/>
+ <tocsect2 name="Shareing Defaults" url="bashref.html#SEC127"/>
+ <tocsect2 name="Operation Controls" url="bashref.html#SEC128"/>
+ <tocsect2 name="Operational Features" url="bashref.html#SEC129"/>
+</tocsect1>
+<tocsect1 name="Reporting Bugs" url="bashref.html#SEC130"></tocsect1>
+<tocsect1 name="Major Differences From The Bourne Shell" url="bashref.html#SEC131"></tocsect1>
+<tocsect1 name="Enhancements to BASH 2.05b" url="bashref.html#SEC133"></tocsect1>
+<tocsect1 name="Index of Shell Builtin Commands" url="bashref.html#SEC134"></tocsect1>
+<tocsect1 name="Index of Shell Reserved Words" url="bashref.html#SEC135"></tocsect1>
+<tocsect1 name="Parameter and Variable Index" url="bashref.html#SEC136"></tocsect1>
+<tocsect1 name="Function Index" url="bashref.html#SEC137"></tocsect1>
+<tocsect1 name="Concept Index" url="bashref.html#SEC138"></tocsect1>
+</kdeveloptoc>
+
diff --git a/languages/bash/doc/bash_bugs.toc b/languages/bash/doc/bash_bugs.toc
new file mode 100644
index 00000000..aa7b42e3
--- /dev/null
+++ b/languages/bash/doc/bash_bugs.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Bash bugs</title>
+<base href="http://groups.google.com/"/>
+<tocsect1 name="Query" url="groups?group=gnu.bash.bug">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/bash/kdevbashsupport.desktop b/languages/bash/kdevbashsupport.desktop
new file mode 100644
index 00000000..f46b99eb
--- /dev/null
+++ b/languages/bash/kdevbashsupport.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Bash Support
+Comment[ca]=Suport per a Bash
+Comment[da]=Bash understøttelse
+Comment[de]=Unterstützung für Bash
+Comment[el]=ΥποστήÏιξη Bash
+Comment[es]=Soporte para Bash
+Comment[et]=Bash'i toetus
+Comment[eu]=Bash-en euskarria
+Comment[fa]=پشتیبانی Bash
+Comment[fr]=Prise en charge de BASH
+Comment[ga]=Tacaíocht Bash
+Comment[gl]=Soporte de Bash
+Comment[hi]=बैश समरà¥à¤¥à¤¨
+Comment[hu]=Bash-támogatás
+Comment[is]=Bash stuðnigur
+Comment[it]=Supporto per Bash
+Comment[ja]=Bash サãƒãƒ¼ãƒˆ
+Comment[nds]=Bash-Ünnerstütten
+Comment[ne]=बà¥à¤¯à¤¾à¤¸ समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor Bash
+Comment[pl]=Obsługa bash-a
+Comment[pt]=Suporte a Bash
+Comment[pt_BR]=Suporte ao Bash
+Comment[ru]=Поддержка Ñзыка Bash
+Comment[sk]=Podpora Bash
+Comment[sl]=Podpora bash
+Comment[sr]=Bash подршка
+Comment[sr@Latn]=Bash podrška
+Comment[sv]=Bash-stöd
+Comment[ta]=பாஷ௠ஆதரவà¯
+Comment[tg]=Ðри намудани забони Bash
+Comment[tr]=Bash DesteÄŸi
+Comment[zh_CN]=Bash 支æŒ
+Comment[zh_TW]=Bash 支æ´
+Name=KDevBashSupport
+Name[da]=KDevelop Bash-understøttelse
+Name[de]=Unterstützung für Bash (KDevelop)
+Name[hi]=के-डेव-बैश-समरà¥à¤¥à¤¨
+Name[nds]=Bash-Ünnerstütten för KDevelop
+Name[ne]=केडीई विकास बà¥à¤¯à¤¾à¤¸ समरà¥à¤¥à¤¨
+Name[pl]=KDevObsługaBasha
+Name[sk]=KDevBashPodpora
+Name[sv]=KDevelop Bash-stöd
+Name[ta]=கெடெவà¯à®ªà®¾à®·à¯ ஆதரவà¯
+Name[zh_TW]=KDevelop Bash 支æ´
+GenericName=Bash Support
+GenericName[ca]=Suport per a Bash
+GenericName[da]=Bash-understøttelse
+GenericName[de]=Unterstützung für Bash
+GenericName[el]=ΥποστήÏιξη Bash
+GenericName[es]=Soporte para Bash
+GenericName[et]=Bash'i toetus
+GenericName[eu]=Bash-en euskarria
+GenericName[fa]=پشتیبانی Bash
+GenericName[fr]=Prise en charge de BASH
+GenericName[ga]=Tacaíocht Bash
+GenericName[gl]=Soporte de Bash
+GenericName[hi]=बैश समरà¥à¤¥à¤¨
+GenericName[hu]=Bash-támogatás
+GenericName[it]=Supporto Bash
+GenericName[ja]=Bash サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för Bash
+GenericName[ne]=बà¥à¤¯à¤¾à¤¸ समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor Bash
+GenericName[pl]=Obsługa bash-a
+GenericName[pt]=Suporte de Bash
+GenericName[pt_BR]=Suporte ao Bash
+GenericName[ru]=Поддержка Ñзыка Bash
+GenericName[sk]=Podpora Bash
+GenericName[sl]=Podpora bash
+GenericName[sr]=Bash подршка
+GenericName[sr@Latn]=Bash podrška
+GenericName[sv]=Bash-stöd
+GenericName[ta]=பாஷ௠ஆதரவà¯
+GenericName[tg]=Ðри намудани забони Bash
+GenericName[tr]=Bash DesteÄŸi
+GenericName[zh_CN]=Bash 支æŒ
+GenericName[zh_TW]=Bash 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevbashsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Bash
diff --git a/languages/bash/kdevbashsupport.rc b/languages/bash/kdevbashsupport.rc
new file mode 100644
index 00000000..d4592d6b
--- /dev/null
+++ b/languages/bash/kdevbashsupport.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevBashSupport" version="2">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_execute" />
+ </Menu>
+</MenuBar>
+<ToolBar name="buildToolBar">
+ <Action name="build_execute" group="build_operations" />
+</ToolBar>
+</kpartgui>
diff --git a/languages/cpp/KDevCppSupportIface.cpp b/languages/cpp/KDevCppSupportIface.cpp
new file mode 100644
index 00000000..f5af83c9
--- /dev/null
+++ b/languages/cpp/KDevCppSupportIface.cpp
@@ -0,0 +1,24 @@
+
+#include "KDevCppSupportIface.h"
+#include "cppsupportpart.h"
+
+KDevCppSupportIface::KDevCppSupportIface( CppSupportPart* cppSupport )
+ : QObject( cppSupport ), DCOPObject( "KDevCppSupport" ), m_cppSupport( cppSupport )
+{
+}
+
+KDevCppSupportIface::~KDevCppSupportIface()
+{
+}
+
+void KDevCppSupportIface::addClass()
+{
+ m_cppSupport->slotNewClass();
+}
+
+void KDevCppSupportIface::parseProject()
+{
+ m_cppSupport->parseProject();
+}
+
+#include "KDevCppSupportIface.moc"
diff --git a/languages/cpp/KDevCppSupportIface.h b/languages/cpp/KDevCppSupportIface.h
new file mode 100644
index 00000000..34780d8c
--- /dev/null
+++ b/languages/cpp/KDevCppSupportIface.h
@@ -0,0 +1,27 @@
+
+#ifndef KDEVCPPSUPPORTIFACE_H
+#define KDEVCPPSUPPORTIFACE_H
+
+#include <qobject.h>
+#include <dcopobject.h>
+
+class CppSupportPart;
+
+class KDevCppSupportIface : public QObject, public DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+public:
+ KDevCppSupportIface( CppSupportPart* cppSupport );
+ ~KDevCppSupportIface();
+
+k_dcop:
+ void addClass();
+ void parseProject();
+
+private:
+ CppSupportPart* m_cppSupport;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/Makefile.am b/languages/cpp/Makefile.am
new file mode 100644
index 00000000..30ba6d44
--- /dev/null
+++ b/languages/cpp/Makefile.am
@@ -0,0 +1,59 @@
+# Here resides the C/C++ support part.
+
+SUBDIRS = templates subclassing_template newclass_templates file_templates \
+ app_templates compiler pcsimporter debugger doc
+
+INCLUDES = -I$(top_srcdir)/languages/lib/designer_integration \
+ -I$(top_srcdir)/languages/lib/interfaces -I$(top_srcdir)/lib/catalog -I$(top_srcdir)/lib/compat \
+ -I$(top_srcdir)/lib/cppparser -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ -I$(top_builddir)/languages/lib/designer_integration -I$(top_builddir)/bdb/build_unix -I$(top_srcdir)/bdb/include \
+ $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevcppsupport.la
+libkdevcppsupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevcppsupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/lib/catalog/libkdevcatalog.la $(top_builddir)/lib/cppparser/libkdevcppparser.la \
+ $(top_builddir)/languages/lib/interfaces/liblang_interfaces.la \
+ $(top_builddir)/languages/lib/designer_integration/libdesignerintegration.la $(top_builddir)/lib/interfaces/libkdevinterfaces.la
+
+libkdevcppsupport_la_SOURCES = KDevCppSupportIface.cpp KDevCppSupportIface.skel \
+ addattributedialog.cpp addattributedialogbase.ui addmethoddialog.cpp addmethoddialogbase.ui \
+ ast_utils.cpp backgroundparser.cpp ccconfigwidget.cpp ccconfigwidgetbase.ui \
+ classgeneratorconfig.cpp classgeneratorconfigbase.ui codeinformationrepository.cpp \
+ completiondebug.cpp configproblemreporter.ui cppcodecompletion.cpp \
+ cppcodecompletionconfig.cpp cppevaluation.cpp cppimplementationwidget.cpp cppnewclassdlg.cpp \
+ cppnewclassdlgbase.ui cppsplitheadersourceconfig.cpp cppsupport_utils.cpp \
+ cppsupportfactory.cpp cppsupportpart.cpp creategettersetter.ui \
+ creategettersetterconfiguration.cpp creategettersetterconfiguration.h creategettersetterdialog.cpp \
+ creategettersetterdialog.h createpcsdialog.cpp createpcsdialogbase.ui doxydoc.cpp includefiles.cpp \
+ includepathresolver.cpp kdevdriver.cpp problemreporter.cpp qtbuildconfig.cpp \
+ qtdesignercppintegration.cpp setuphelper.cpp simplecontext.cpp simpletype.cpp simpletypecatalog.cpp \
+ simpletypefunction.cpp simpletypenamespace.cpp store_walker.cpp storeconverter.cpp \
+ stringhelpers.cpp subclassingdlg.cpp subclassingdlgbase.ui tag_creator.cpp typedesc.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevcppsupport.desktop kdevcsupport.desktop
+
+rcdir = $(kde_datadir)/kdevcppsupport
+rc_DATA = kdevcppsupport.rc
+
+templatedir = ${kde_datadir}/kdevabbrev/templates
+template_DATA = cpptemplates
+
+configurationdir = ${kde_datadir}/kdevcppsupport
+configuration_DATA = configuration
+
+AM_CXXFLAGS = -DAST_DEBUG
+
+#bin_PROGRAMS = r++
+#r___LDFLAGS = $(all_libraries)
+#r___SOURCES = main.cpp
+#r___DEPENDENCIES = libkdevcppsupport.la
+#r___LDADD = libkdevcppsupport.la $(top_builddir)/lib/catalog/libkdevcatalog.la $(top_builddir)/lib/cppparser/libkdevcppparser.la
+noinst_HEADERS = cppevaluation.h cppimplementationwidget.h \
+ cppsplitheadersourceconfig.h declarationinfo.h expressioninfo.h includefiles.h includepathresolver.h \
+ qtdesignercppintegration.h setuphelper.h simplecontext.h simpletypecatalog.h simpletypefunction.h \
+ simpletypenamespace.h storeconverter.h
diff --git a/languages/cpp/README.dox b/languages/cpp/README.dox
new file mode 100644
index 00000000..ba1fbc05
--- /dev/null
+++ b/languages/cpp/README.dox
@@ -0,0 +1,34 @@
+/** \class CppSupportPart
+Provides C/C++ language support for KDevelop.
+
+Well the first thing you should read is lib/catalog it contains the source of the persistant class store
+after that languages/cpp/tag_creator.*
+it is the component that stores the informations collected by the c++ parser into the PCS
+then you can play with KDevPCSImporter the code of the dialog is in languages/cpp/createpcsdialog* and languages/cpp/pcsimporter/*
+and of course lib/interfaces/kdevpcsimporter.*
+and if you want play with the c++ parser go to lib/cppparser/, the best is to start to read driver.*
+
+\authors <a href="mailto:roberto AT kdevelop.org">Roberto Raggi</a>
+
+\maintainer <a href="mailto:roberto AT kdevelop.org">Roberto Raggi</a>
+
+\feature supports C/C++ language
+\feature can do code completion
+\feature has presistent class store
+\feature code highlight
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug bugs in <a href="http://bugs.kde.org/buglist.cgi?product=kdevelop&component=cppsupport&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=Bug+Number">cppsupport component at Bugzilla database</a>
+
+\faq <b>How can I have documentation on functions when using codecompletion ?</b>
+ -# Create the xml-output with <a href="http://www.doxygen.org">Doxygen</a> of the files you want to add to the classstore
+ -# Create the new PCS-database with r++. Now you have to use the -d command line switch of r++ to have it include the documentation.
+ It is used like -d/path/of/doxygen/xml/output (notice that there is _no_ whitespace between -d and the path!).
+ You can use it multiple times to have r++ search for the informations in different directories.
+ r++ -d has to be used (like every other commandline switch) before you write the directories you want r++ to create the PCSdatabase from.
+ -# Activate your newly created Database in the Project->Project Options...->C++ Specific->Code Completion...
+ .
+\faq <b>How does this work ?</b> I have no clue. Ask roberto! :)
+\faq <b>How does r++ work ?</b> I have no clue. Ask roberto! :)
+
+*/
diff --git a/languages/cpp/addattributedialog.cpp b/languages/cpp/addattributedialog.cpp
new file mode 100644
index 00000000..408b2ff8
--- /dev/null
+++ b/languages/cpp/addattributedialog.cpp
@@ -0,0 +1,265 @@
+/*
+* Copyright (C) 2003 Roberto Raggi (roberto@kdevelop.org)
+*
+* 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
+* Library General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; see the file COPYING.LIB. If not, write to
+* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+* Boston, MA 02111-1307, USA.
+*
+*/
+
+#include "addattributedialog.h"
+#include "cppsupportpart.h"
+#include "backgroundparser.h"
+#include "cppsupport_utils.h"
+
+#include <kdevpartcontroller.h>
+
+#include <codemodel.h>
+
+#include <kfiledialog.h>
+#include <kparts/part.h>
+#include <ktexteditor/editinterface.h>
+#include <klineedit.h>
+
+#include <qfileinfo.h>
+#include <qcombobox.h>
+#include <qlistview.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qtextstream.h>
+
+AddAttributeDialog::AddAttributeDialog( CppSupportPart* cppSupport, ClassDom klass,
+ QWidget* parent, const char* name, bool modal, WFlags fl )
+: AddAttributeDialogBase( parent, name, modal, fl ), m_cppSupport( cppSupport ), m_klass( klass ), m_count( 0 )
+{
+ access->insertStringList( QStringList() << "Public" << "Protected" << "Private" );
+
+ storage->insertStringList( QStringList() << "Normal" << "Static" );
+
+ returnType->setAutoCompletion( true );
+ returnType->insertStringList( QStringList()
+ << "void"
+ << "char"
+ << "wchar_t"
+ << "bool"
+ << "short"
+ << "int"
+ << "long"
+ << "signed"
+ << "unsigned"
+ << "float"
+ << "double" );
+
+ returnType->insertStringList( typeNameList( m_cppSupport->codeModel() ) );
+
+ updateGUI();
+ addAttribute();
+}
+
+AddAttributeDialog::~AddAttributeDialog()
+{}
+
+void AddAttributeDialog::reject()
+{
+ QDialog::reject();
+}
+
+void AddAttributeDialog::accept()
+{
+ m_cppSupport->partController()->editDocument( KURL( m_klass->fileName() ) );
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( m_cppSupport->partController() ->activePart() );
+ if ( !editIface )
+ {
+ /// @todo show messagebox
+ QDialog::accept();
+ return ;
+ }
+
+ int line, column;
+ m_klass->getEndPosition( &line, &column );
+
+ // compute the insertion point map
+ QMap<QString, QPair<int, int> > points;
+ QStringList accessList;
+
+ const VariableList variableList = m_klass->variableList();
+ for ( VariableList::ConstIterator it = variableList.begin(); it != variableList.end(); ++it )
+ {
+ int varEndLine, varEndColumn;
+ ( *it ) ->getEndPosition( &varEndLine, &varEndColumn );
+ QString access = accessID( *it );
+ QPair<int, int> varEndPoint = qMakePair( varEndLine, varEndColumn );
+
+ if ( !points.contains( access ) || points[ access ] < varEndPoint )
+ {
+ accessList.remove( access );
+ accessList.push_back( access ); // move 'access' at the end of the list
+
+ points[ access ] = varEndPoint;
+ }
+ }
+
+ int insertedLine = 0;
+
+ accessList += newAccessList( accessList );
+
+ for ( QStringList::iterator it = accessList.begin(); it != accessList.end(); ++it )
+ {
+ QListViewItem* item = attributes->firstChild();
+ while ( item )
+ {
+ QListViewItem * currentItem = item;
+
+ item = item->nextSibling();
+
+ if ( currentItem->text( 0 ) != *it )
+ continue;
+
+ QString access = ( *it ).lower();
+
+ QString str = variableDeclaration( currentItem );
+
+ QPair<int, int> pt;
+ if ( points.contains( *it ) )
+ {
+ pt = points[ *it ];
+ }
+ else
+ {
+ str.prepend( access + ":\n" );
+ points[ *it ] = qMakePair( line - 1, 0 );
+ pt = points[ *it ]; // end of class declaration
+ }
+
+ editIface->insertText( pt.first + insertedLine + 1, 0 /*pt.second*/, str );
+ insertedLine += str.contains( QChar( '\n' ) );
+ }
+ }
+
+ m_cppSupport->backgroundParser() ->addFile( m_klass->fileName() );
+
+ QDialog::accept();
+}
+
+QString AddAttributeDialog::variableDeclaration( QListViewItem* item ) const
+{
+ QString str;
+ QTextStream stream( &str, IO_WriteOnly );
+ QString ind;
+ ind.fill( QChar( ' ' ), 4 );
+
+ stream << ind;
+ if ( item->text( 1 ) == "Static" )
+ stream << "static ";
+ stream << item->text( 2 ) << " " << item->text( 3 );
+ stream << ";\n";
+
+ return str;
+}
+
+
+void AddAttributeDialog::updateGUI()
+{
+ bool enable = attributes->selectedItem() != 0;
+
+ returnType->setEnabled( enable );
+ declarator->setEnabled( enable );
+ access->setEnabled( enable );
+ storage->setEnabled( enable );
+
+ deleteAttributeButton->setEnabled( enable );
+
+ if ( enable )
+ {
+ QListViewItem * item = attributes->selectedItem();
+ item->setText( 0, access->currentText() );
+ item->setText( 1, storage->currentText() );
+ item->setText( 2, returnType->currentText() );
+ item->setText( 3, declarator->text() );
+ }
+}
+
+void AddAttributeDialog::addAttribute()
+{
+ QListViewItem * item = new QListViewItem( attributes, "Protected", "Normal",
+ "int", QString( "attribute_%1" ).arg( ++m_count ) );
+ attributes->setCurrentItem( item );
+ attributes->setSelected( item, true );
+
+ returnType->setFocus();
+}
+
+void AddAttributeDialog::deleteCurrentAttribute()
+{
+ delete( attributes->currentItem() );
+}
+
+void AddAttributeDialog::currentChanged( QListViewItem* item )
+{
+ if ( item )
+ {
+ QString _access = item->text( 0 );
+ QString _storage = item->text( 1 );
+ QString _returnType = item->text( 2 );
+ QString _declarator = item->text( 3 );
+
+ access->setCurrentText( _access );
+ storage->setCurrentText( _storage );
+ returnType->setCurrentText( _returnType );
+ declarator->setText( _declarator );
+ }
+
+ updateGUI();
+}
+
+QStringList AddAttributeDialog::newAccessList( const QStringList& accessList ) const
+{
+ QStringList newAccessList;
+
+ QListViewItem* item = attributes->firstChild();
+ while ( item )
+ {
+ QListViewItem * currentItem = item;
+
+ item = item->nextSibling();
+
+ QString access = currentItem->text( 0 );
+ if ( !( accessList.contains( access ) || newAccessList.contains( access ) ) )
+ newAccessList.push_back( access );
+ }
+
+ return newAccessList;
+}
+
+QString AddAttributeDialog::accessID( VariableDom var ) const
+{
+ switch ( var->access() )
+ {
+ case CodeModelItem::Public:
+ return QString::fromLatin1( "Public" );
+
+ case CodeModelItem::Protected:
+ return QString::fromLatin1( "Protected" );
+
+ case CodeModelItem::Private:
+ return QString::fromLatin1( "Private" );
+ }
+
+ return QString::null;
+}
+
+#include "addattributedialog.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
diff --git a/languages/cpp/addattributedialog.h b/languages/cpp/addattributedialog.h
new file mode 100644
index 00000000..18818ef7
--- /dev/null
+++ b/languages/cpp/addattributedialog.h
@@ -0,0 +1,60 @@
+/*
+* Copyright (C) 2003 Roberto Raggi (roberto@kdevelop.org)
+*
+* 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
+* Library General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; see the file COPYING.LIB. If not, write to
+* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+* Boston, MA 02111-1307, USA.
+*
+*/
+
+#ifndef ADDATTRIBUTEDIALOG_H
+#define ADDATTRIBUTEDIALOG_H
+
+#include "addattributedialogbase.h"
+#include <codemodel.h>
+
+class CppSupportPart;
+
+class AddAttributeDialog : public AddAttributeDialogBase
+{
+ Q_OBJECT
+public:
+ AddAttributeDialog( CppSupportPart* cppSupport, ClassDom klass,
+ QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~AddAttributeDialog();
+
+ virtual void addAttribute();
+ virtual void deleteCurrentAttribute();
+ virtual void currentChanged( QListViewItem* item );
+ virtual void updateGUI();
+
+protected:
+ virtual void reject();
+ virtual void accept();
+
+private:
+ QString accessID( VariableDom var ) const;
+ QStringList newAccessList( const QStringList& accessList ) const;
+ QString variableDeclaration( QListViewItem* item ) const;
+
+private:
+ CppSupportPart* m_cppSupport;
+ ClassDom m_klass;
+ int m_count;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
+
diff --git a/languages/cpp/addattributedialogbase.ui b/languages/cpp/addattributedialogbase.ui
new file mode 100644
index 00000000..eabd89fe
--- /dev/null
+++ b/languages/cpp/addattributedialogbase.ui
@@ -0,0 +1,375 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>AddAttributeDialogBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AddAttributeDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>619</width>
+ <height>413</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Add Attribute</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Access</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Storage</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Declarator</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>attributes</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>111</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>addAttributeButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add Attribute</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>deleteAttributeButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Attribute</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Attribute Properties</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>T&amp;ype:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>returnType</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="0">
+ <property name="name">
+ <cstring>returnType</cstring>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>declarator</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;eclarator:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>declarator</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>storage</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;torage:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>storage</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Acce&amp;ss:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>access</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="0">
+ <property name="name">
+ <cstring>access</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>addAttributeButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>addAttribute()</slot>
+ </connection>
+ <connection>
+ <sender>deleteAttributeButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>deleteCurrentAttribute()</slot>
+ </connection>
+ <connection>
+ <sender>attributes</sender>
+ <signal>selectionChanged(QListViewItem*)</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>currentChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>returnType</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>declarator</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>access</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>storage</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>returnType</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>AddAttributeDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>attributes</tabstop>
+ <tabstop>addAttributeButton</tabstop>
+ <tabstop>deleteAttributeButton</tabstop>
+ <tabstop>returnType</tabstop>
+ <tabstop>declarator</tabstop>
+ <tabstop>access</tabstop>
+ <tabstop>storage</tabstop>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot>addAttribute()</slot>
+ <slot>deleteCurrentAttribute()</slot>
+ <slot>currentChanged(QListViewItem*)</slot>
+ <slot>updateGUI()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/cpp/addmethoddialog.cpp b/languages/cpp/addmethoddialog.cpp
new file mode 100644
index 00000000..943f15d7
--- /dev/null
+++ b/languages/cpp/addmethoddialog.cpp
@@ -0,0 +1,420 @@
+/*
+* Copyright (C) 2003 Roberto Raggi (roberto@kdevelop.org)
+*
+* 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
+* Library General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; see the file COPYING.LIB. If not, write to
+* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+* Boston, MA 02111-1307, USA.
+*
+*/
+
+#include "addmethoddialog.h"
+#include "cppsupportpart.h"
+#include "backgroundparser.h"
+#include "cppsupport_utils.h"
+#include "domutil.h"
+
+#include <kdevpartcontroller.h>
+#include <kdevcreatefile.h>
+
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kparts/part.h>
+#include <ktexteditor/editinterface.h>
+#include <kdebug.h>
+#include <klineedit.h>
+
+#include <qregexp.h>
+#include <qfileinfo.h>
+#include <qcombobox.h>
+#include <qlistview.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qtextstream.h>
+
+AddMethodDialog::AddMethodDialog( CppSupportPart* cppSupport, ClassDom klass,
+ QWidget* parent, const char* name, bool modal, WFlags fl )
+: AddMethodDialogBase( parent, name, modal, fl ), m_cppSupport( cppSupport ), m_klass( klass ), m_count( 0 )
+{
+ QString fileName = m_klass->fileName();
+
+ access->insertStringList( QStringList() << "Public" << "Protected" << "Private" << "Signals" <<
+ "Public Slots" << "Protected Slots" << "Private Slots" );
+
+ storage->insertStringList( QStringList() << "Normal" << "Static" << "Virtual" << "Pure Virtual" << "Friend" );
+
+ // setup sourceFile combo
+ QMap<QString, bool> m;
+#if 0 /// \FIXME ROBE
+
+ FunctionList l = m_klass->functionList();
+ {
+ for ( FunctionList::Iterator it = l.begin(); it != l.end(); ++it )
+ {
+ if ( ( *it ) ->hasImplementation() )
+ m.insert( ( *it ) ->implementedInFile(), true );
+ }
+ }
+#endif
+
+ {
+ QStringList headers = QStringList::split( ",", "h,H,hh,hxx,hpp,inl,tlh,diff,ui.h" );
+ QStringList fileList;
+ QMap<QString, bool>::Iterator it = m.begin();
+ while ( it != m.end() )
+ {
+ QString ext = QFileInfo( it.key() ).extension();
+ if ( !headers.contains( ext ) )
+ sourceFile->insertItem( it.key() );
+ ++it;
+ }
+
+ if ( sourceFile->count() == 0 )
+ {
+ QFileInfo info( fileName );
+ QString impl = DomUtil::readEntry( *cppSupport->projectDom(), "/cppsupportpart/filetemplates/implementationsuffix", "cpp" );
+ sourceFile->insertItem( info.dirPath( true ) + "/" + info.baseName() + impl );
+ }
+ }
+
+ returnType->setAutoCompletion( true );
+ returnType->insertStringList( QStringList()
+ << "void"
+ << "char"
+ << "wchar_t"
+ << "bool"
+ << "short"
+ << "int"
+ << "long"
+ << "signed"
+ << "unsigned"
+ << "float"
+ << "double" );
+
+ returnType->insertStringList( typeNameList( m_cppSupport->codeModel() ) );
+
+ updateGUI();
+ addMethod();
+}
+
+AddMethodDialog::~AddMethodDialog()
+{}
+
+void AddMethodDialog::reject()
+{
+ QDialog::reject();
+}
+
+QString AddMethodDialog::accessID( FunctionDom fun ) const
+{
+ if ( fun->isSignal() )
+ return QString::fromLatin1( "Signals" );
+
+ switch ( fun->access() )
+ {
+ case CodeModelItem::Public:
+ if ( fun->isSlot() )
+ return QString::fromLatin1( "Public Slots" );
+ return QString::fromLatin1( "Public" );
+
+ case CodeModelItem::Protected:
+ if ( fun->isSlot() )
+ return QString::fromLatin1( "Protected Slots" );
+ return QString::fromLatin1( "Protected" );
+
+ case CodeModelItem::Private:
+ if ( fun->isSlot() )
+ return QString::fromLatin1( "Private Slots" );
+ return QString::fromLatin1( "Private" );
+ }
+
+ return QString::null;
+}
+
+void AddMethodDialog::accept()
+{
+ m_cppSupport->partController() ->editDocument( KURL( m_klass->fileName() ) );
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( m_cppSupport->partController() ->activePart() );
+ if ( !editIface )
+ {
+ /// @todo show messagebox
+ QDialog::accept();
+ return ;
+ }
+
+ int line, column;
+ m_klass->getEndPosition( &line, &column );
+
+ // compute the insertion point map
+ QMap<QString, QPair<int, int> > points;
+ QStringList accessList;
+
+ const FunctionList functionList = m_klass->functionList();
+ for ( FunctionList::ConstIterator it = functionList.begin(); it != functionList.end(); ++it )
+ {
+ int funEndLine, funEndColumn;
+ ( *it ) ->getEndPosition( &funEndLine, &funEndColumn );
+ QString access = accessID( *it );
+ QPair<int, int> funEndPoint = qMakePair( funEndLine, funEndColumn );
+
+ if ( !points.contains( access ) || points[ access ] < funEndPoint )
+ {
+ accessList.remove( access );
+ accessList.push_back( access ); // move 'access' at the end of the list
+
+ points[ access ] = funEndPoint;
+ }
+ }
+
+ int insertedLine = 0;
+
+ accessList += newAccessList( accessList );
+
+ for ( QStringList::iterator it = accessList.begin(); it != accessList.end(); ++it )
+ {
+ QListViewItem* item = methods->firstChild();
+ while ( item )
+ {
+ QListViewItem * currentItem = item;
+
+ item = item->nextSibling();
+
+ if ( currentItem->text( 1 ) != *it )
+ continue;
+
+ QString access = ( *it ).lower();
+
+ bool isInline = currentItem->text( 0 ) == "True";
+ QString str = isInline ? functionDefinition( currentItem ) : functionDeclaration( currentItem );
+
+ QPair<int, int> pt;
+ if ( points.contains( *it ) )
+ {
+ pt = points[ *it ];
+ }
+ else
+ {
+ str.prepend( access + ":\n" );
+ points[ *it ] = qMakePair( line - 1, 0 );
+ pt = points[ *it ]; // end of class declaration
+ }
+
+ editIface->insertText( pt.first + insertedLine + 1, 0 /*pt.second*/, str );
+ insertedLine += str.contains( QChar( '\n' ) );
+ }
+ }
+
+ m_cppSupport->backgroundParser() ->addFile( m_klass->fileName() );
+
+ QString str;
+ QListViewItem* item = methods->firstChild();
+ while ( item )
+ {
+ QListViewItem * currentItem = item;
+
+ item = item->nextSibling();
+
+ QString str = functionDefinition( currentItem );
+ if ( str.isEmpty() )
+ continue;
+
+ QString implementationFile = currentItem->text( 5 );
+ if ( currentItem->text( 0 ) == "True" )
+ implementationFile = m_klass->fileName();
+
+ QFileInfo fileInfo( implementationFile );
+ if ( !QFile::exists( fileInfo.absFilePath() ) )
+ {
+ if ( KDevCreateFile * createFileSupp = m_cppSupport->extension<KDevCreateFile>( "KDevelop/CreateFile" ) )
+ createFileSupp->createNewFile( fileInfo.extension(), fileInfo.dirPath( true ), fileInfo.baseName() );
+ }
+
+ m_cppSupport->partController() ->editDocument( KURL( implementationFile ) );
+ editIface = dynamic_cast<KTextEditor::EditInterface*>( m_cppSupport->partController() ->activePart() );
+ if ( !editIface )
+ continue;
+
+ bool isInline = currentItem->text( 0 ) == "True";
+ if ( !isInline )
+ {
+ editIface->insertLine( editIface->numLines(), QString::fromLatin1( "" ) );
+ editIface->insertText( editIface->numLines() - 1, 0, str );
+ m_cppSupport->backgroundParser() ->addFile( implementationFile );
+ }
+ }
+
+ QDialog::accept();
+}
+
+void AddMethodDialog::updateGUI()
+{
+ bool enable = methods->selectedItem() != 0;
+
+ returnType->setEnabled( enable );
+ declarator->setEnabled( enable );
+ access->setEnabled( enable );
+ storage->setEnabled( enable );
+ isInline->setEnabled( enable );
+
+ sourceFile->setEnabled( enable );
+ browseButton->setEnabled( enable );
+
+ deleteMethodButton->setEnabled( enable );
+
+ if ( enable )
+ {
+ QListViewItem * item = methods->selectedItem();
+ item->setText( 0, isInline->isChecked() ? "True" : "False" );
+ item->setText( 1, access->currentText() );
+ item->setText( 2, storage->currentText() );
+ item->setText( 3, returnType->currentText() );
+ item->setText( 4, declarator->text() );
+ item->setText( 5, sourceFile->currentText() );
+
+ if ( isInline->isChecked() || storage->currentText() == "Friend" || storage->currentText() == "Pure Virtual" )
+ {
+ sourceFile->setEnabled( false );
+ browseButton->setEnabled( false );
+ }
+ }
+}
+
+void AddMethodDialog::addMethod()
+{
+ QListViewItem * item = new QListViewItem( methods, "False", "Public", "Normal",
+ "void", QString( "method_%1()" ).arg( ++m_count ),
+ sourceFile->currentText() );
+ methods->setCurrentItem( item );
+ methods->setSelected( item, true );
+
+ returnType->setFocus();
+}
+
+void AddMethodDialog::deleteCurrentMethod()
+{
+ delete( methods->currentItem() );
+ updateGUI();
+}
+
+void AddMethodDialog::currentChanged( QListViewItem* item )
+{
+ if ( item )
+ {
+ QString _isInline = item->text( 0 );
+ QString _access = item->text( 1 );
+ QString _storage = item->text( 2 );
+ QString _returnType = item->text( 3 );
+ QString _declarator = item->text( 4 );
+ QString _sourceFile = item->text( 5 );
+
+ isInline->setChecked( _isInline == "True" ? true : false );
+ access->setCurrentText( _access );
+ storage->setCurrentText( _storage );
+ returnType->setCurrentText( _returnType );
+ declarator->setText( _declarator );
+ sourceFile->setCurrentText( _sourceFile );
+ }
+
+ updateGUI();
+}
+
+void AddMethodDialog::browseImplementationFile()
+{
+ QString fileName = KFileDialog::getOpenFileName();
+ sourceFile->setCurrentText( fileName );
+ updateGUI();
+}
+
+QString AddMethodDialog::functionDeclaration( QListViewItem * item ) const
+{
+ QString str;
+ QTextStream stream( &str, IO_WriteOnly );
+
+ QString access = item->text( 1 ).lower();
+
+ stream << " "; /// @todo use AStyle
+ if ( item->text( 2 ) == "Virtual" || item->text( 2 ) == "Pure Virtual" )
+ stream << "virtual ";
+ else if ( item->text( 2 ) == "Friend" )
+ stream << "friend ";
+ else if ( item->text( 2 ) == "Static" )
+ stream << "static ";
+ stream << item->text( 3 ) << " " << item->text( 4 );
+ if ( item->text( 2 ) == "Pure Virtual" )
+ stream << " = 0";
+ stream << ";\n";
+
+ return str;
+}
+
+QString AddMethodDialog::functionDefinition( QListViewItem* item ) const
+{
+ if ( item->text( 1 ) == "Signals" || item->text( 2 ) == "Pure Virtual" ||
+ item->text( 2 ) == "Friend" )
+ {
+ return QString::null;
+ }
+
+ QString className = m_klass->name();
+ QString fullName = m_klass->scope().join( "::" );
+ if ( !fullName.isEmpty() )
+ fullName += "::";
+ fullName += className;
+
+ QString str;
+ QTextStream stream( &str, IO_WriteOnly );
+
+ bool isInline = item->text( 0 ) == "True";
+
+ QString ind;
+ if ( isInline )
+ ind.fill( QChar( ' ' ), 4 );
+
+ stream << "\n"
+ << ind << "/*!\n"
+ << ind << " \\fn " << fullName << "::" << item->text( 4 ) << "\n"
+ << ind << " */\n";
+
+ stream
+ << ind << item->text( 3 ) << " " << ( isInline ? QString::fromLatin1( "" ) : fullName + "::" )
+ << item->text( 4 ) << "\n"
+ << ind << "{\n"
+ << ind << " /// @todo implement me\n"
+ << ind << "}\n";
+
+ return str;
+}
+
+QStringList AddMethodDialog::newAccessList( const QStringList& accessList ) const
+{
+ QStringList newAccessList;
+
+ QListViewItem* item = methods->firstChild();
+ while ( item )
+ {
+ QListViewItem * currentItem = item;
+
+ item = item->nextSibling();
+
+ QString access = currentItem->text( 1 );
+ if ( !( accessList.contains( access ) || newAccessList.contains( access ) ) )
+ newAccessList.push_back( access );
+ }
+
+ return newAccessList;
+}
+
+#include "addmethoddialog.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
diff --git a/languages/cpp/addmethoddialog.h b/languages/cpp/addmethoddialog.h
new file mode 100644
index 00000000..695ddc80
--- /dev/null
+++ b/languages/cpp/addmethoddialog.h
@@ -0,0 +1,62 @@
+/*
+* Copyright (C) 2003 Roberto Raggi (roberto@kdevelop.org)
+*
+* 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
+* Library General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; see the file COPYING.LIB. If not, write to
+* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+* Boston, MA 02111-1307, USA.
+*
+*/
+
+#ifndef ADDMETHODDIALOG_H
+#define ADDMETHODDIALOG_H
+
+#include "addmethoddialogbase.h"
+#include <codemodel.h>
+
+class CppSupportPart;
+
+class AddMethodDialog : public AddMethodDialogBase
+{
+ Q_OBJECT
+public:
+ AddMethodDialog( CppSupportPart* cppSupport, ClassDom klass,
+ QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~AddMethodDialog();
+
+ virtual void addMethod();
+ virtual void deleteCurrentMethod();
+ virtual void currentChanged( QListViewItem* item );
+ virtual void updateGUI();
+ virtual void browseImplementationFile();
+
+protected:
+ virtual void reject();
+ virtual void accept();
+
+private:
+ QString accessID( FunctionDom fun ) const;
+ QString functionDeclaration( QListViewItem* item ) const;
+ QString functionDefinition( QListViewItem* item ) const;
+ QStringList newAccessList( const QStringList& accessList ) const;
+
+private:
+ CppSupportPart* m_cppSupport;
+ ClassDom m_klass;
+ int m_count;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
+
diff --git a/languages/cpp/addmethoddialogbase.ui b/languages/cpp/addmethoddialogbase.ui
new file mode 100644
index 00000000..5ab3f769
--- /dev/null
+++ b/languages/cpp/addmethoddialogbase.ui
@@ -0,0 +1,459 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>AddMethodDialogBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AddMethodDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>613</width>
+ <height>568</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Add Method</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Inline</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Access</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Storage</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Return Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Declarator</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>methods</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>111</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>addMethodButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add Method</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>deleteMethodButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Method</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Method Properties</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Return t&amp;ype:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>returnType</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="0">
+ <property name="name">
+ <cstring>returnType</cstring>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>declarator</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;eclarator:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>declarator</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>storage</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;torage:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>storage</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="2">
+ <property name="name">
+ <cstring>isInline</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Inline</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Acce&amp;ss:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>access</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="0">
+ <property name="name">
+ <cstring>access</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>I&amp;mplementation File</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>sourceFile</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>browseButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>addMethodButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>addMethod()</slot>
+ </connection>
+ <connection>
+ <sender>deleteMethodButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>deleteCurrentMethod()</slot>
+ </connection>
+ <connection>
+ <sender>methods</sender>
+ <signal>selectionChanged(QListViewItem*)</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>currentChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>returnType</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>declarator</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>access</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>isInline</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>storage</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>returnType</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>sourceFile</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>sourceFile</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>updateGUI()</slot>
+ </connection>
+ <connection>
+ <sender>browseButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AddMethodDialogBase</receiver>
+ <slot>browseImplementationFile()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>methods</tabstop>
+ <tabstop>addMethodButton</tabstop>
+ <tabstop>deleteMethodButton</tabstop>
+ <tabstop>returnType</tabstop>
+ <tabstop>declarator</tabstop>
+ <tabstop>access</tabstop>
+ <tabstop>storage</tabstop>
+ <tabstop>isInline</tabstop>
+ <tabstop>sourceFile</tabstop>
+ <tabstop>browseButton</tabstop>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot>addMethod()</slot>
+ <slot>deleteCurrentMethod()</slot>
+ <slot>currentChanged(QListViewItem*)</slot>
+ <slot>updateGUI()</slot>
+ <slot>browseImplementationFile()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/cpp/app_templates/Makefile.am b/languages/cpp/app_templates/Makefile.am
new file mode 100644
index 00000000..a075677f
--- /dev/null
+++ b/languages/cpp/app_templates/Makefile.am
@@ -0,0 +1,10 @@
+SUBDIRS = kapp kpartapp kpartplugin kcmodule kicker kioslave kdevpart kdevpart2 chello cpphello kscreensaver kofficepart chello_gba dcopservice konqnavpanel qmakesimple qmakeapp qt4makeapp khello khello2 kateplugin kateplugin2 qtopiaapp kdedcop wxhello cppsdlhello kconfig35 kdevlang noatunvisual noatunui kmod kfileplugin clanlib opieapp opieapplet opieinput opiemenu opienet opietoday kxt gtk2mmapp cppcurseshello win32hello win32gui cmakesimple cmakesimplec cmakelibcpp cmakelibc kscons_kxt kscons_kmdi qt4hello qmakeempty automakeempty makefileempty qtopia4app kde4app
+
+profilescdir = $(kde_datadir)/kdevelop/profiles/IDE/CompiledLanguageIDE/CandCppIDE/CIDE
+profilesc_DATA = c.appwizard
+
+profilescppdir = $(kde_datadir)/kdevelop/profiles/IDE/CompiledLanguageIDE/CandCppIDE/CppIDE
+profilescpp_DATA = cpp.appwizard
+
+profileskdecppdir = $(kde_datadir)/kdevelop/profiles/IDE/CompiledLanguageIDE/CandCppIDE/CppIDE/KDECppIDE
+profileskdecpp_DATA = kdecpp.appwizard
diff --git a/languages/cpp/app_templates/automakeempty/Makefile.am b/languages/cpp/app_templates/automakeempty/Makefile.am
new file mode 100644
index 00000000..461e4322
--- /dev/null
+++ b/languages/cpp/app_templates/automakeempty/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = automakeempty-Makefile.am automakeempty-Makefile.cvs \
+ configure.in automakeempty.png app.kdevelop
+templateName = automakeempty
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/automakeempty/app.kdevelop b/languages/cpp/app_templates/automakeempty/app.kdevelop
new file mode 100644
index 00000000..6cadd049
--- /dev/null
+++ b/languages/cpp/app_templates/automakeempty/app.kdevelop
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ </general>
+ <run>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.h" name="Header files" />
+ <group pattern="*.cpp" name="Source files" />
+ </groups>
+ </kdevfileview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/automakeempty/automakeempty-Makefile.am b/languages/cpp/app_templates/automakeempty/automakeempty-Makefile.am
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/languages/cpp/app_templates/automakeempty/automakeempty-Makefile.am
@@ -0,0 +1 @@
+
diff --git a/languages/cpp/app_templates/automakeempty/automakeempty-Makefile.cvs b/languages/cpp/app_templates/automakeempty/automakeempty-Makefile.cvs
new file mode 100644
index 00000000..d1607023
--- /dev/null
+++ b/languages/cpp/app_templates/automakeempty/automakeempty-Makefile.cvs
@@ -0,0 +1,8 @@
+default: all
+
+all:
+ aclocal
+ autoheader
+ automake
+ autoconf
+
diff --git a/languages/cpp/app_templates/automakeempty/automakeempty.kdevtemplate b/languages/cpp/app_templates/automakeempty/automakeempty.kdevtemplate
new file mode 100644
index 00000000..db3cdd13
--- /dev/null
+++ b/languages/cpp/app_templates/automakeempty/automakeempty.kdevtemplate
@@ -0,0 +1,99 @@
+# KDE Config File
+[General]
+Name=Empty Autotools Template
+Name[ca]=Plantilla Autotools buida
+Name[da]=Tom Autotools-skabelon
+Name[de]=Leere Autotools-Vorlage
+Name[el]=Κενό Ï€Ïότυπο των Autotools
+Name[es]=Plantilla Autotools vacía
+Name[et]=Tühi autotoolsi mall
+Name[hu]=Ãœres Autotools sablon
+Name[it]=Modello di autotools vuoto
+Name[nds]=Leddig Vörlaag för Automake un sien Kanuten
+Name[nl]=Leeg Autotools-sjabloon
+Name[pl]=Pusty szablon Autotools
+Name[pt]=Modelo de Autotools Vazio
+Name[pt_BR]=Modelo de Autotools Vazio
+Name[ru]=ПуÑтой шаблон autotools
+Name[sk]=Prázdna šablóna Autotools
+Name[sr]=Празан шаблон Autotools-а
+Name[sr@Latn]=Prazan Å¡ablon Autotools-a
+Name[sv]=Tom mall för Autotools
+Name[zh_TW]=空的 Autotools 樣æ¿
+Icon=automakeempty.png
+Category=C++/Automake project
+Comment=Generate an empty Automake based application
+Comment[ca]=Genera una aplicació buida basada en Automake
+Comment[da]=Opretter et tomt Automake-baseret program
+Comment[de]=Erstellt eine leere auf Automake basierende Anwendung
+Comment[el]=ΔημιουÏγία μίας κενής εφαÏμογής βασισμένης στο Automake
+Comment[es]=Genera una aplicación vacía basada en Automake
+Comment[et]=Tühja rakenduse loomine Automake'i põhjal
+Comment[hu]=Létrehoz egy üres Automake-alapú alkalmazást
+Comment[it]=Genera un'applicazione basata su un Automake vuoto
+Comment[nds]=Stellt en leddig Programm op, dat op Automake opbuut
+Comment[nl]=Genereer een leeg op Automake gebaseerd programma
+Comment[pl]=Generuje pusty program używający Automake
+Comment[pt]=Gera uma aplicação vazia baseada no Automake
+Comment[pt_BR]=Gera uma aplicação vazia baseada no Automake
+Comment[ru]=Создать пуÑтое приложение, иÑпользующее Automake
+Comment[sk]=Vygeneruje prázdnu aplikáciu založenú na Automake
+Comment[sr]=Прави празан програм на оÑнову Automake-а
+Comment[sr@Latn]=Pravi prazan program na osnovu Automake-a
+Comment[sv]=Skapar ett tomt Automake-baserat program
+Comment[zh_TW]=產生一個空的使用 Automake 的應用程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+Archive=automakeempty.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE2]
+Type=install
+Source=%{src}/automakeempty-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/automakeempty-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE4]
+Type=install
+Source=%{src}/configure.in
+Dest=%{dest}/configure.in
+
+[MSG]
+Type=message
+Comment=An Automake based application was created in %{dest}
+Comment[ca]=S'ha creat una aplicació basada en Automake en %{dest}
+Comment[da]=Et Automake-baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf Automake basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μία εφαÏμογή βασισμένη στο Automake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación basada en Automake ha sido creada en %{dest}
+Comment[et]=Rakendus Automake'i põhjal loodi asukohta %{dest}
+Comment[hu]=Létrejött egy Automake-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su automake in %{dest}
+Comment[nds]=In %{dest} wöör en op Automake opbuut Programm opstellt
+Comment[nl]=Een Automake-gebaseerd programma is aangemaakt in %{dest}
+Comment[pl]=Program używający Automake został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada no Automake em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada no Automake em %{dest}
+Comment[ru]=ИÑпользующее Automake приложение Ñоздано в %{dest}
+Comment[sk]=Aplikácia založená na Automake bola vytvorená v %{dest}
+Comment[sr]=Програм на оÑнови Automake-а направљен је у %{dest}
+Comment[sr@Latn]=Program na osnovi Automake-a napravljen je u %{dest}
+Comment[sv]=Ett Automake-baserat program skapades i %{dest}
+Comment[zh_TW]=一個以 Automake 為基礎的應用程å¼å·²å»ºç«‹æ–¼ %{dest}
+
diff --git a/languages/cpp/app_templates/automakeempty/automakeempty.png b/languages/cpp/app_templates/automakeempty/automakeempty.png
new file mode 100644
index 00000000..519c007b
--- /dev/null
+++ b/languages/cpp/app_templates/automakeempty/automakeempty.png
Binary files differ
diff --git a/languages/cpp/app_templates/automakeempty/configure.in b/languages/cpp/app_templates/automakeempty/configure.in
new file mode 100644
index 00000000..7464579b
--- /dev/null
+++ b/languages/cpp/app_templates/automakeempty/configure.in
@@ -0,0 +1,10 @@
+AC_INIT(configure.in)
+
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+
+AC_LANG_CPLUSPLUS
+AC_PROG_CXX
+AM_PROG_LIBTOOL
+
+AC_OUTPUT(Makefile)
diff --git a/languages/cpp/app_templates/c.appwizard b/languages/cpp/app_templates/c.appwizard
new file mode 100644
index 00000000..14009287
--- /dev/null
+++ b/languages/cpp/app_templates/c.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=chello,chellogba,cmakelibc,cmakesimplec,kmod,prc-tool
diff --git a/languages/cpp/app_templates/chello/.kdev_ignore b/languages/cpp/app_templates/chello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/chello/.kdev_ignore
diff --git a/languages/cpp/app_templates/chello/Makefile.am b/languages/cpp/app_templates/chello/Makefile.am
new file mode 100644
index 00000000..f7c9742a
--- /dev/null
+++ b/languages/cpp/app_templates/chello/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = main.c src-Makefile.am c-Makefile.am c-Makefile.cvs \
+ configure.in chello.png app.kdevelop
+
+templateName = chello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles} ${dataFiles} ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/chello/app.kdevelop b/languages/cpp/app_templates/chello/app.kdevelop
new file mode 100644
index 00000000..521c9f89
--- /dev/null
+++ b/languages/cpp/app_templates/chello/app.kdevelop
@@ -0,0 +1,107 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C</primarylanguage>
+ <keywords>
+ <keyword>C</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>true</terminal>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cflags>-O2 -g0 %{CFLAGS}</cflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cflags>-O0 -g3 %{CFLAGS}</cflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="c"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.h" name="Header files" />
+ <group pattern="*.c" name="Source files" />
+ </groups>
+ </kdevfileview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/chello/c-Makefile.am b/languages/cpp/app_templates/chello/c-Makefile.am
new file mode 100644
index 00000000..02520f20
--- /dev/null
+++ b/languages/cpp/app_templates/chello/c-Makefile.am
@@ -0,0 +1,5 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = src
diff --git a/languages/cpp/app_templates/chello/c-Makefile.cvs b/languages/cpp/app_templates/chello/c-Makefile.cvs
new file mode 100644
index 00000000..d1607023
--- /dev/null
+++ b/languages/cpp/app_templates/chello/c-Makefile.cvs
@@ -0,0 +1,8 @@
+default: all
+
+all:
+ aclocal
+ autoheader
+ automake
+ autoconf
+
diff --git a/languages/cpp/app_templates/chello/chello.kdevtemplate b/languages/cpp/app_templates/chello/chello.kdevtemplate
new file mode 100644
index 00000000..8f2ea5dc
--- /dev/null
+++ b/languages/cpp/app_templates/chello/chello.kdevtemplate
@@ -0,0 +1,253 @@
+# KDE Config File
+[General]
+Name=Simple Hello world program
+Name[ca]=Simple programa Hello world
+Name[da]=Simpelt Goddag verden program
+Name[de]=Ein einfaches "Hello World"-Programm
+Name[el]=Απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε
+Name[es]=Programa «Hola mundo» sencillo
+Name[et]=Lihtne "Tere, maailm" programm
+Name[eu]="Kaixo mundua" programa sinplea
+Name[fa]=برنامۀ سادۀ Hello world
+Name[fr]=Programme « Bonjour monde » simple
+Name[ga]=Ríomhchlár simplí "Hello World"
+Name[gl]=Programa sinxelo Ola mundo
+Name[hu]=Egyszerű Hello world program
+Name[it]=Semplice programma di "Hello world"
+Name[ja]=ç°¡å˜ãª Hello world プログラム
+Name[ms]=Program Hello World mudah
+Name[nds]=En eenfach "Moin Welt"-Programm
+Name[ne]=साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Eenvoudig 'Hello World' programma
+Name[pl]=Prosty program witaj świecie
+Name[pt]=Programa simples Olá Mundo
+Name[pt_BR]=Programa simples Olá Mundo
+Name[ru]=ПроÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Hello world
+Name[sk]=Jednoduchý "Ahoj svet" program
+Name[sl]=Preprost program Hello world
+Name[sr]=ЈедноÑтаван „Здраво Ñвете“ програм
+Name[sr@Latn]=Jednostavan „Zdravo svete“ program
+Name[sv]=Enkelt Hello world-program
+Name[tr]=Basit Merhaba dünya programı
+Name[zh_CN]=简å•çš„ Hello world 程åº
+Name[zh_TW]=簡單的 Hello world 程å¼
+Icon=chello.png
+Category=C
+Comment=Generates a simple Hello world program in C
+Comment[ca]=Genera un simple programa de Hello world en C
+Comment[da]=Genererer et simpelt Goddag verden program i C
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in C
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε σε C
+Comment[es]=Genera un sencillo programa «Hola mundo» en C
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine C-s
+Comment[eu]="Kaixo mundua" programa sinplea bat sortzen du C lengoaian
+Comment[fa]=یک برنامۀ سادۀ Hello world در سی تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en C
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí "Hello World" i C
+Comment[gl]=Xera un programa sinxelo Ola mundo en C
+Comment[hu]=Létrehoz egy egyszerű Hello world programot C nyelven
+Comment[it]=Genera un semplice programma di "Hello world" in C
+Comment[ja]=ç°¡å˜ãª Hello world プログラムを C ã§è¨˜è¿°ã—ã¾ã™
+Comment[nds]=Stellt en eenfach "Moin Welt"-Programm in C op
+Comment[ne]=सी मा साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudig Hello World programma in C
+Comment[pl]=Tworzy prosty program 'Witaj świecie' w języku C
+Comment[pt]=Gera um programa simples de Olá mundo em C
+Comment[pt_BR]=Gera um programa simples de Olá mundo em C
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Hello world на C
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program v C
+Comment[sl]=Ustvari preprost program Hello world v C-ju
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм у C-у
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program u C-u
+Comment[sv]=Skapar ett enkelt Hello world-program i C
+Comment[tr]=C'de basit bir Merhaba Dünya programı yaratır.
+Comment[zh_CN]=ç”Ÿæˆ C 语言的 Hello world 程åº
+Comment[zh_TW]=產生 C 語言的 Hello world 程å¼
+FileTemplates=h,CStyle,c,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.c
+Archive=chello.tar.gz
+
+[LIBS]
+Type = value
+ValueType=QString
+Value= OPT_LIBS
+Comment= Optional libraries to link to.
+Comment[ca]= Biblioteques opcionals per enllaçar.
+Comment[da]= Mulige biblioteker at linke til.
+Comment[de]= Optionale Bibliotheken, die eingebunden werden sollen.
+Comment[el]= ΠÏοαιÏετικές βιβλιοθήκες για σÏνδεση με αυτές.
+Comment[es]=Bibliotecas opcionales para enlazar.
+Comment[et]=Täiendavad lingitavad teegid.
+Comment[eu]= Estekatzeko aukerako liburutegiak.
+Comment[fa]= کتابخانه‌های اختیاری برای پیوند کردن.
+Comment[fr]=Bibliothèques optionnelles à lier.
+Comment[ga]= Comhadlanna roghnacha ar féidir nascadh leo.
+Comment[gl]= Librerías opcionais a enlazar.
+Comment[hu]=Linkelési programkönyvtárak (opcionális).
+Comment[it]= librerie opzionali da collegare.
+Comment[ja]=リンクã™ã‚‹ä»–ã®ãƒ©ã‚¤ãƒ–ラリ
+Comment[nds]= Optschonaal Bibliotheken, na de linkt warrn schall
+Comment[ne]= लिङà¥à¤• सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨ वैकलà¥à¤ªà¤¿à¤• लाइबà¥à¤°à¥‡à¤°à¥€
+Comment[nl]=Optionele bibliotheken om naar te linken
+Comment[pl]= Opcjonalne biblioteki, z którymi ma być łączony.
+Comment[pt]= Bibliotecas opcionais com as quais compilar.
+Comment[pt_BR]= Bibliotecas opcionais com as quais compilar.
+Comment[ru]=Дополнительные библиотеки Ð´Ð»Ñ Ñборки.
+Comment[sk]=Voliteľné knižnice pre linkovanie.
+Comment[sl]=Dodatne knjižnice, do katerih se naj poveže.
+Comment[sr]=Опционе библиотеке за повезивање.
+Comment[sr@Latn]=Opcione biblioteke za povezivanje.
+Comment[sv]= Valfria bibliotek att länka till.
+Comment[tr]=Bağlanılacak isteğe bağlı kütüphaneler.
+Comment[zh_CN]=å¯é€‰çš„链接库。
+Comment[zh_TW]=è¦é€£çµçš„函å¼åº«
+Default= -lm
+
+[INCLUDES]
+Type = value
+ValueType=QString
+Value= OPT_INCS
+Comment= Optional include path.
+Comment[ca]= Ruta opcional per a incloure.
+Comment[da]= Mulig include-sti.
+Comment[de]= Optionaler Include-Pfad.
+Comment[el]= ΠÏοαιÏετική διαδÏομή ενσωμάτωσης.
+Comment[es]=Ruta opcional para incluir.
+Comment[et]=Täiendavate päisefailide asukoht.
+Comment[eu]= Aukerako goiburuen bide-izena.
+Comment[fa]=include path اختیاری.
+Comment[fr]=Chemin d'inclusion optionnel.
+Comment[ga]= Conair roghnach ceanntásca.
+Comment[gl]= Ruta opcional de cabeceiras.
+Comment[hu]=Include fájlok könyvtárai (opcionális).
+Comment[it]= percorso opzionale di inclusione.
+Comment[ja]=ヘッダファイルを読ã¿è¾¼ã‚€ä»–ã®ãƒ‘ス
+Comment[nds]= Optschonaal Koppdatei-Padd
+Comment[ne]= मारà¥à¤— सहितको विकलà¥à¤ª
+Comment[nl]=Optioneel Include-pad
+Comment[pl]= Opcjonalna ścieżka do plików dołączanych.
+Comment[pt]= Localização opcional dos ficheiros de inclusão.
+Comment[pt_BR]= Localização opcional dos ficheiros de inclusão.
+Comment[ru]=Дополнительные пути Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ñ‡Ð½Ñ‹Ñ… файлов.
+Comment[sk]=Voliteľná cesta pre include.
+Comment[sl]=Neobvezna pot za vstavke.
+Comment[sr]=Опциона путања за укључивања.
+Comment[sr@Latn]=Opciona putanja za ukljuÄivanja.
+Comment[sv]= Valfri sökväg till deklarationsfiler.
+Comment[tr]=İsteğe bağlı include yolu.
+Comment[zh_CN]=å¯é€‰çš„包å«è·¯å¾„。
+Comment[zh_TW]=引入檔路徑
+Default= -I/usr/include
+
+[CFLAGS]
+Type = value
+ValueType=QString
+Value= CFLAGS
+Comment= Optional CFLAGS to define in the makefile.
+Comment[ca]= CFLAGS opcionals per a definir en el fitxer de make.
+Comment[da]= Mulige CFLAGS at definere i makefile.
+Comment[de]= Optionale CFLAGS, die im Makefile definiert werden.
+Comment[el]= ΠÏοαιÏετικές CFLAGS για οÏισμό μέσα στο makefile.
+Comment[es]=CFLAGS opcionales a definir en el makefile.
+Comment[et]=Täiendavad Makefile'is defineeritavad CFLAGS'id.
+Comment[eu]= Aukerako makefile-ean definitzeko CFLAGS-ak.
+Comment[fa]= CFLAGS اختیاری برای تعری٠در makefile.
+Comment[fr]=CFLAGS optionnels à définir dans le Makefile.
+Comment[ga]= CFLAGS roghnacha le socrú sa makefile.
+Comment[gl]= CFLAGS opcionais a definir no makefile.
+Comment[hu]=A Makefile-hoz definiálható CFLAGS információ (opcionális).
+Comment[it]= CFLAGS opzionale da definire nel makefile.
+Comment[ja]=Makefile ã«å®šç¾©ã™ã‚‹ä»–ã® CFLAGS
+Comment[nds]= Optschonaal CFLAGS, de in de "Make"-Datei fastleggt warrt.
+Comment[ne]= मेकफाइलमा परिभाषित गरà¥à¤¨ CFLAGS विकलà¥à¤ª
+Comment[nl]=Optionele CFLAGS om te definiëren in het makefile.
+Comment[pl]= Opcjonalna wartość zmiennej CFLAGS do zdefiniowania w pliku makefile.
+Comment[pt]= CFLAGS opcionais a definir na Makefile.
+Comment[pt_BR]= CFLAGS opcionais a definir na Makefile.
+Comment[ru]=Дополнительные параметры CFLAGS Ð´Ð»Ñ Makefile.
+Comment[sk]=Voliteľné nastavenie CFLAGS v makefile.
+Comment[sl]=Dodaten CFLAGS za definicijo v datoteki makefile.
+Comment[sr]=Опциона CFLAGS дефиниÑана у Ñправифајлу.
+Comment[sr@Latn]=Opciona CFLAGS definisana u spravifajlu.
+Comment[sv]= Valfria CFLAGS att definiera i byggfilen.
+Comment[tr]=Makefile'da tanımlanacak isteğe bağlı CFLAGS değerleri
+Comment[zh_CN]=在 Makefile 中定义的å¯é€‰ CFLAGS。
+Comment[zh_TW]=makefile 中定義的 CFLAGS
+Default=
+
+[MGS]
+Type=message
+Comment=A simple C project was created in %{dest}.
+Comment[ca]=A simple projecte en C ha estat creat en %{dest}.
+Comment[da]=Et simpelt C projekt blev oprette i %{dest}.
+Comment[de]=Ein einfaches C-Project wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό έÏγο C δημιουÏγήθηκε στο %{dest}.
+Comment[es]=Un sencillo proyecto de C ha sido creado en %{dest}.
+Comment[et]=Lihtne C-projekt loodi asukohta %{dest}.
+Comment[eu]=C proiektu sinple bat sortu da hemen: %{dest}.
+Comment[fa]=یک پروژۀ سادۀ سی در %{dest} ایجاد شد.
+Comment[fr]=Un projet en langage C simple a été créé dans %{dest}.
+Comment[ga]=Cruthaíodh tionscadal simplí C i %{dest}
+Comment[gl]=Creouse un proxecto sinxelo en C en %{dest}.
+Comment[hu]=Létrejött egy egyszerű C-projekt itt: %{dest}.
+Comment[it]=È stato creato un semplice progetto C in %{dest}.
+Comment[ja]=ç°¡å˜ãª C プロジェクトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach C-Projekt opstellt.
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण सी परियोजना %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig C-project is aangemaakt in %{dest}.
+Comment[pl]=Prosty projekt w języku C został utworzony w %{dest}.
+Comment[pt]=Foi criado um programa simples "Olá mundo" em C em %{dest}.
+Comment[pt_BR]=Foi criado um programa simples "Olá mundo" em C em %{dest}.
+Comment[ru]=ПроÑтое приложение "Hello world" на C Ñоздано в %{dest}
+Comment[sk]=Jednoduchý C projekt bol vytvorený v %{dest}.
+Comment[sl]=Preprost projekt v C-ju je bil ustvarjen v %{dest}.
+Comment[sr]=ЈедноÑтаван пројекат у C-у направљен је у %{dest}.
+Comment[sr@Latn]=Jednostavan projekat u C-u napravljen je u %{dest}.
+Comment[sv]=Ett enkelt C-projekt skapades i %{dest}.
+Comment[tr]=Basit bir C projesi %{dest} içinde oluşturuldu.
+Comment[zh_CN]=在 %{dest} 中创建了简å•çš„ C 工程。
+Comment[zh_TW]=一個簡單的 C 專案已建立在 %{dest}。
+Archive=chello.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/c-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/c-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE4]
+Type=install
+Source=%{src}/configure.in
+Dest=%{dest}/configure.in
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{src}/main.c
+Dest=%{dest}/src/%{APPNAMELC}.c
+
diff --git a/languages/cpp/app_templates/chello/chello.png b/languages/cpp/app_templates/chello/chello.png
new file mode 100644
index 00000000..888d4f13
--- /dev/null
+++ b/languages/cpp/app_templates/chello/chello.png
Binary files differ
diff --git a/languages/cpp/app_templates/chello/configure.in b/languages/cpp/app_templates/chello/configure.in
new file mode 100644
index 00000000..3715e0c8
--- /dev/null
+++ b/languages/cpp/app_templates/chello/configure.in
@@ -0,0 +1,10 @@
+AC_INIT(configure.in)
+
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+
+AC_LANG_C
+AC_PROG_CC
+AM_PROG_LIBTOOL
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/cpp/app_templates/chello/main.c b/languages/cpp/app_templates/chello/main.c
new file mode 100644
index 00000000..3ac8c330
--- /dev/null
+++ b/languages/cpp/app_templates/chello/main.c
@@ -0,0 +1,15 @@
+%{C_TEMPLATE}
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+ printf("Hello, world!\n");
+
+ return EXIT_SUCCESS;
+}
diff --git a/languages/cpp/app_templates/chello/src-Makefile.am b/languages/cpp/app_templates/chello/src-Makefile.am
new file mode 100644
index 00000000..51e7609f
--- /dev/null
+++ b/languages/cpp/app_templates/chello/src-Makefile.am
@@ -0,0 +1,8 @@
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.c
+
+# set the include path found by configure
+INCLUDES= $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries)
diff --git a/languages/cpp/app_templates/chello_gba/.kdev_ignore b/languages/cpp/app_templates/chello_gba/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/.kdev_ignore
diff --git a/languages/cpp/app_templates/chello_gba/Makefile.am b/languages/cpp/app_templates/chello_gba/Makefile.am
new file mode 100644
index 00000000..2a72573e
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = main.c font.raw.c master.pal.c src-Makefile.am c-Makefile.am \
+ c-Makefile.cvs configure.in chellogba.png app.kdevelop \
+ main.h gba.h font.bmp README.devel
+templateName = chellogba
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles} ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/chello_gba/README.devel b/languages/cpp/app_templates/chello_gba/README.devel
new file mode 100644
index 00000000..a7cdcc75
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/README.devel
@@ -0,0 +1,30 @@
+***Description***
+
+This is a small demo program for the Gameboy Advance.
+It use a custom font to display strings in MODE 0 on Background 2, but contains only capitalized letters at the moment.
+The tiles & color palette for the font were generated from the bitmap "font.bmp"
+with following commandline.
+
+"gfx2gba -M -t8 -fsrc font.bmp"
+
+You can get a compiled version for Linux from http://gbadev.org/files/gfx2gba06.zip,
+but you don't need it to run the program.
+
+
+***Compiling and Running***
+
+To compile the code please install the DevKitAdvance for Linux/Unix. It contains a gcc 3.x configured as a cross compiler
+for the GBA platform. You can download a precompiled version from http://www.doc.ic.ac.uk/~tb100/
+
+To build the program KDevelop use
+"CC=arm-agb-elf-gcc CXX=arm-agb-elf-g++ ./configure --host=arm-gcc-elf --build=i386"
+as default,but you can change that in the project options if you want.
+
+To start your binary you can use an emulator or buy a flash card (http://www.lik-sang.com).
+KDevelop already contains a plugin to run your GBA program with the VisualBoy Advance emulator.
+You can download the emulator from: http://vboy.emuhq.com/
+
+Have fun!
+
+Please report bugs,wishes,problems.. to smeier@kdevelop.org (Sandy Meier)
+
diff --git a/languages/cpp/app_templates/chello_gba/app.kdevelop b/languages/cpp/app_templates/chello_gba/app.kdevelop
new file mode 100644
index 00000000..0025fd02
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/app.kdevelop
@@ -0,0 +1,100 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C</primarylanguage>
+ <keywords>
+ <keyword>C</keyword>
+ <keyword>GBA</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ </general>
+ <run>
+ <disable_default>true</disable_default>
+ </run>
+ <configurations>
+ <default>
+ <configargs>--host=arm-gcc-elf --build=i386</configargs>
+ <ldflags>-T lnkscript crt0.o</ldflags>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <ccompilerbinary>arm-agb-elf-gcc</ccompilerbinary>
+ <cxxcompilerbinary>arm-agb-elf-g++</cxxcompilerbinary>
+ <cflags>-nostartfiles</cflags>
+ </default>
+ </configurations>
+ </kdevautoproject>
+ <kdevvisualadvance>
+ <binary>src/%{APPNAMELC}.gba</binary>
+ </kdevvisualadvance>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="c"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/chello_gba/c-Makefile.am b/languages/cpp/app_templates/chello_gba/c-Makefile.am
new file mode 100644
index 00000000..02520f20
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/c-Makefile.am
@@ -0,0 +1,5 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = src
diff --git a/languages/cpp/app_templates/chello_gba/c-Makefile.cvs b/languages/cpp/app_templates/chello_gba/c-Makefile.cvs
new file mode 100644
index 00000000..d1607023
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/c-Makefile.cvs
@@ -0,0 +1,8 @@
+default: all
+
+all:
+ aclocal
+ autoheader
+ automake
+ autoconf
+
diff --git a/languages/cpp/app_templates/chello_gba/chellogba.kdevtemplate b/languages/cpp/app_templates/chello_gba/chellogba.kdevtemplate
new file mode 100644
index 00000000..7a3ba857
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/chellogba.kdevtemplate
@@ -0,0 +1,173 @@
+# KDE Config File
+[General]
+Name=Hello world program
+Name[ca]=Programa Hello world
+Name[da]=Goddag verden program
+Name[de]="Hello World"-Programm
+Name[el]=ΠÏόγÏαμμα Γεια σου Κόσμε
+Name[es]=Programa «Hola mundo»
+Name[et]="Tere,maailm" programm
+Name[eu]="Kaixo mundua" programa
+Name[fa]=برنامۀ Hello world
+Name[fr]=Programme « Bonjour monde »
+Name[ga]=Ríomhchlár "Hello world"
+Name[gl]=Programa Ola mundo
+Name[it]=Programma di "Hello world"
+Name[ja]=Hello world プログラム
+Name[nds]="Moin Welt"-Programm
+Name[ne]=हेलà¥à¤¡à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Hello World-programma
+Name[pl]=Program 'Witaj świecie'
+Name[pt]=Programa 'Olá mundo'
+Name[pt_BR]=Programa 'Olá mundo'
+Name[ru]=Программа Hello world
+Name[sk]=Ahoj svet program
+Name[sl]=Program Hello world
+Name[sr]=Програм „Здраво Ñвете“
+Name[sr@Latn]=Program „Zdravo svete“
+Name[sv]=Hello world-program
+Name[tr]=Merhaba Dünya Programı
+Name[zh_CN]=Hello world 程åº
+Name[zh_TW]=Hello world 程å¼
+Icon=chellogba.png
+Category=C/GBA
+Comment=Generates a simple "Hello world" program for the Gameboy Advance. You will need the "devkitadvance" to compile it. See README.devel for more details.
+Comment[ca]=Genera un simple programa de "Hello world" per a la Gameboy Advance. Necessitareu "devkitadvance" per a compilar-lo. Consulteu el README.devel per a més detalls.
+Comment[da]=Genererer et simpelt "Goddag verden" program for Gameboy Advance. Du vil skulle bruge "devkitadvance" for at kompilere det. Se README.devel for flere detaljer.
+Comment[de]=Erstellt ein einfaches "Hello world"-Programm für den Gameboy Advance. Sie benötigen zum Kompilieren das "devkitadvance". Weitere Einzelheiten finden Sie in der Datei README.devel.
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα "Γεια σου κόσμε" για το Gameboy Advance. Θα χÏειαστείτε το "devkitadvance" για τη μεταγλώττισή του. ΑνατÏέξτε στο README.devel για πεÏισσότεÏες πληÏοφοÏίες.
+Comment[es]=Genera un sencillo programa «Hola mundo» para Gameboy Advance. Necesitará «devkitadvance» para compilarlo. Vea README.devel para más detalles.
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine Gameboy Advance'i jaoks. Kompileerimiseks on vajalik "devkitadvance". Täpsemalt räägib sellest fail README.devel.
+Comment[eu]="Kaixo mundua" programa sinple bat sortzen du Gameboy Advance-erako. "devkitadvance" behar duzu konpilatzeko. Ikusi README.devel xehetasun gehiagorako.
+Comment[fa]=یک برنامۀ سادۀ «Hello world» برای Gameboy Advance تولید می‌کند. برای ترجمۀ آن به »devkitadvance« نیاز دارید. برای جزئیات بیشتر، README.devel را ببینید.
+Comment[fr]=Génère un programme « Bonjour monde » simple pour la Gameboy Advance. Vous aurez besoin de « devkitadvance » pour le compiler. Consultez le fichier README.devel pour plus de détails.
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí "Hello World" le haghaidh an Gameboy Advance. Tá gá le "devkitadvance" chun é a thiomsú. Féach ar README.devel chun tuilleadh sonraí a fháil.
+Comment[gl]=Xera un programa sinxelo "Ola mundo" para Gameboy Advance. Necesitará "devkitadvance" para compilalo. Consulte README.devel para máis detalles.
+Comment[hu]=Létrehoz egy egyszerű Hello world programot a Gameboy Advance-hoz. Lefordításához szükség van a "devkitadvance" csomag telepítésére. További információ a README.devel fájlban található.
+Comment[it]=Genera un semplice programma di "Hello world" per il Gameboy Advance. Serve il "devkitadvance" per compilarlo. Guarda un po' README.devel per ulteriori dettagli.
+Comment[ja]=Gameboy Advance ã®ãŸã‚ã® Hello world プログラムを作æˆã—ã¾ã™ã€‚コンパイルã™ã‚‹ã«ã¯ devkitadvance ãŒå¿…è¦ã§ã™ã€‚詳ã—ã㯠README.devel ã‚’ã”覧ãã ã•ã„。
+Comment[nds]=Stellt en eenfach "Moin Welt"-Programm för "Gameboy Advance" op. För't Kompileren deit "devkitadvance" noot. Mehr Enkelheiten laat sik binnen "README.devel" finnen.
+Comment[ne]=गेमबà¥à¤¯à¤¾à¤ à¤à¤¡à¤­à¤¾à¤¨à¥à¤¸à¤•à¤¾ लागि साधारण "हेलà¥à¤²à¥‹ वोलà¥à¤¡ नमसà¥à¤•à¤¾à¤°" उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । यसलाई कमà¥à¤ªà¤¾à¤‡à¤² गरà¥à¤¨ तपाईà¤à¤²à¤¾à¤ˆ "devkitadvance" आवशà¥à¤¯à¤• परà¥à¤¦à¤› । बढी जानकारीका लागि README.devel हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।
+Comment[nl]=Genereert een eenvoudig "Hello World" programma voor de Gameboy Advance. U hebt "devkitadvance" nodig om het te kunnen compileren. Zie het bestand README.devel voor meer informatie.
+Comment[pl]=Generuje prosty program "Witaj świecie" na konsolę Gameboy Advance. Do skompilowania go potrzebny jest "devkitadvance". Więcej informacji można znaleźć w pliku README.devel.
+Comment[pt]=Gera um programa simples "Olá mundo" para o Gameboy Advance. Irá necessitar do "devkitadvance" para o compilar. Veja o README.devel para mais detalhes.
+Comment[pt_BR]=Gera um programa simples "Olá mundo" para o Gameboy Advance. Irá necessitar do "devkitadvance" para o compilar. Veja o README.devel para mais detalhes.
+Comment[ru]=Создание проÑтой программы "Hello world" на Gameboy Advance. Вам необходима программа "devkitadvance" Ð´Ð»Ñ ÐµÑ‘ Ñборки. Прочтите файл README.devel.
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program pre Gameboy Advance.Budete potrebovať "devkitadvance" na to, aby ste ho skompilovali.Pozrite súbor README.devel pre viac detailov.
+Comment[sl]=Ustvari preprost program »Pozdravljen svet« za Gameboy Advance. Za prevajanje boste potrebovali »devkitadvance«. Podrobnosti si lahko ogledate v README.devel.
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм за Gameboy Advance. Требаће вам „devkitadvance“ да биÑте га превели. Погледајте README.devel за више детаља.
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program za Gameboy Advance. Trebaće vam „devkitadvance“ da biste ga preveli. Pogledajte README.devel za više detalja.
+Comment[sv]=Skapar ett enkelt "Hello world"-program för Gameboy Advance. Du behöver "devkitadvance" för att kompilera det. Se filen README.devel för mer information.
+Comment[tr]=Gameboy Advance için basit bir "Merhaba Dünya" programı üretir. Derlemek için "devkitadvance" paketine ihtiyacınız olacak. Daha fazla bilgi için README.devel dosyasına bakın.
+Comment[zh_CN]=ç”Ÿæˆ Gameboy Advance 下的“Hello worldâ€ç¨‹åºã€‚您需è¦â€œdevkitadvaneâ€æ‰èƒ½ç¼–译。请查看 README.devel 中的细节。
+Comment[zh_TW]=產生一個簡單的 Gameboy Advance çš„ Hello world 程å¼ã€‚æ‚¨éœ€è¦ "devkitadvance" 來編譯。詳情請åƒè€ƒ README.devel。
+ShowFileAfterGeneration=README.devel
+FileTemplates=h,CStyle,c,CStyle
+ShowFilesAfterGeneration=%{dest}/src/main.c
+Archive=chellogba.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/README.devel
+Dest=%{dest}/README.devel
+
+[FILE3]
+Type=install
+Source=%{src}/c-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE4]
+Type=install
+Source=%{src}/c-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE5]
+Type=install
+Source=%{src}/configure.in
+Dest=%{dest}/configure.in
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE6]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{src}/main.c
+Dest=%{dest}/src/main.c
+
+[FILE8]
+Type=install
+Source=%{src}/main.h
+Dest=%{dest}/src/main.h
+
+[FILE9]
+Type=install
+Source=%{src}/gba.h
+Dest=%{dest}/src/gba.h
+
+[FILE10]
+Type=install
+Source=%{src}/font.bmp
+Dest=%{dest}/src/font.bmp
+
+[FILE11]
+Type=install
+Source=%{src}/font.raw.c
+Dest=%{dest}/src/font.raw.c
+
+[FILE12]
+Type=install
+Source=%{src}/master.pal.c
+Dest=%{dest}/src/master.pal.c
+
+[MSG]
+Type=message
+Comment=A Hello World program was created in %{dest}
+Comment[ca]=A programa de Hello World ha estat creat en %{dest}
+Comment[da]=Et Goddag verden program blev oprettet i %{dest}
+Comment[de]=Ein "Hello World"-Programm wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€ÏόγÏαμμα Γεια σου Κόσμε δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un programa «Hola mundo» ha sido creado en %{dest}
+Comment[et]="Tere, maailm" programm loodi asukohta %{dest}
+Comment[eu]="Kaixo mundua" programa bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامۀ Hello World در %{dest} ایجاد شد
+Comment[fr]=Un programme « Bonjour monde » a été créé dans %{dest}
+Comment[ga]=Cruthaíodh ríomhchlár "Hello World" i %{dest}
+Comment[gl]=Creouse un programa Ola mundo en %{dest}
+Comment[hu]=Létrejött egy Hello World program itt: %{dest}
+Comment[it]=È stato creato un programma di "Hello World" in %{dest}
+Comment[ja]=Hello World プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en "Moin Welt"-Programm opstellt
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Hello World-programma is aangemaakt in %{dest}
+Comment[pl]=Program 'Witaj świecie' utworzony w %{dest}.
+Comment[pt]=Foi criado um programa Olá Mundo em %{dest}
+Comment[pt_BR]=Foi criado um programa Olá Mundo em %{dest}
+Comment[ru]=ПроÑтое приложение Hello World Ñоздано в %{dest}
+Comment[sk]=Ahoj svet program bol vytvorený v %{dest}
+Comment[sl]=Program »Pozdravljen svet« je bil ustvarjen v %{dest}
+Comment[sr]=„Здраво Ñвете“ је направљен у %{dest}
+Comment[sr@Latn]=„Zdravo svete“ je napravljen u %{dest}
+Comment[sv]=Ett Hello World-program skapades i %{dest}
+Comment[tr]=Bir Merhaba Dünya programı %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 Hello world 程åº
+Comment[zh_TW]=一個 Hello World 程å¼å·²ç¶“建立在 %{dest}
diff --git a/languages/cpp/app_templates/chello_gba/chellogba.png b/languages/cpp/app_templates/chello_gba/chellogba.png
new file mode 100644
index 00000000..81bba90a
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/chellogba.png
Binary files differ
diff --git a/languages/cpp/app_templates/chello_gba/configure.in b/languages/cpp/app_templates/chello_gba/configure.in
new file mode 100644
index 00000000..3715e0c8
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/configure.in
@@ -0,0 +1,10 @@
+AC_INIT(configure.in)
+
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+
+AC_LANG_C
+AC_PROG_CC
+AM_PROG_LIBTOOL
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/cpp/app_templates/chello_gba/font.bmp b/languages/cpp/app_templates/chello_gba/font.bmp
new file mode 100644
index 00000000..28b8c669
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/font.bmp
Binary files differ
diff --git a/languages/cpp/app_templates/chello_gba/font.raw.c b/languages/cpp/app_templates/chello_gba/font.raw.c
new file mode 100644
index 00000000..8efbf1dd
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/font.raw.c
@@ -0,0 +1,123 @@
+const unsigned char font_Tiles[1920]={
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
+0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
+0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
+0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
+0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
+0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
diff --git a/languages/cpp/app_templates/chello_gba/gba.h b/languages/cpp/app_templates/chello_gba/gba.h
new file mode 100644
index 00000000..9e57c8f8
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/gba.h
@@ -0,0 +1,204 @@
+%{H_TEMPLATE}
+// gba.h by eloist
+
+#ifndef GBA_HEADER
+#define GBA_HEADER
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+typedef signed char s8;
+typedef signed short s16;
+typedef signed long s32;
+
+typedef unsigned char byte;
+typedef unsigned short hword;
+typedef unsigned long word;
+
+#define OAMmem (u32*)0x7000000
+#define VideoBuffer (u16*)0x6000000
+#define OAMdata (u16*)0x6100000
+#define BGPaletteMem (u16*)0x5000000
+#define OBJPaletteMem (u16*)0x5000200
+
+#define REG_INTERUPT *(u32*)0x3007FFC
+#define REG_DISPCNT *(u32*)0x4000000
+#define REG_DISPCNT_L *(u16*)0x4000000
+#define REG_DISPCNT_H *(u16*)0x4000002
+#define REG_DISPSTAT *(u16*)0x4000004
+#define REG_VCOUNT *(u16*)0x4000006
+#define REG_BG0CNT *(u16*)0x4000008
+#define REG_BG1CNT *(u16*)0x400000A
+#define REG_BG2CNT *(u16*)0x400000C
+#define REG_BG3CNT *(u16*)0x400000E
+#define REG_BG0HOFS *(u16*)0x4000010
+#define REG_BG0VOFS *(u16*)0x4000012
+#define REG_BG1HOFS *(u16*)0x4000014
+#define REG_BG1VOFS *(u16*)0x4000016
+#define REG_BG2HOFS *(u16*)0x4000018
+#define REG_BG2VOFS *(u16*)0x400001A
+#define REG_BG3HOFS *(u16*)0x400001C
+#define REG_BG3VOFS *(u16*)0x400001E
+#define REG_BG2PA *(u16*)0x4000020
+#define REG_BG2PB *(u16*)0x4000022
+#define REG_BG2PC *(u16*)0x4000024
+#define REG_BG2PD *(u16*)0x4000026
+#define REG_BG2X *(u32*)0x4000028
+#define REG_BG2X_L *(u16*)0x4000028
+#define REG_BG2X_H *(u16*)0x400002A
+#define REG_BG2Y *(u32*)0x400002C
+#define REG_BG2Y_L *(u16*)0x400002C
+#define REG_BG2Y_H *(u16*)0x400002E
+#define REG_BG3PA *(u16*)0x4000030
+#define REG_BG3PB *(u16*)0x4000032
+#define REG_BG3PC *(u16*)0x4000034
+#define REG_BG3PD *(u16*)0x4000036
+#define REG_BG3X *(u32*)0x4000038
+#define REG_BG3X_L *(u16*)0x4000038
+#define REG_BG3X_H *(u16*)0x400003A
+#define REG_BG3Y *(u32*)0x400003C
+#define REG_BG3Y_L *(u16*)0x400003C
+#define REG_BG3Y_H *(u16*)0x400003E
+#define REG_WIN0H *(u16*)0x4000040
+#define REG_WIN1H *(u16*)0x4000042
+#define REG_WIN0V *(u16*)0x4000044
+#define REG_WIN1V *(u16*)0x4000046
+#define REG_WININ *(u16*)0x4000048
+#define REG_WINOUT *(u16*)0x400004A
+#define REG_MOSAIC *(u32*)0x400004C
+#define REG_MOSAIC_L *(u32*)0x400004C
+#define REG_MOSAIC_H *(u32*)0x400004E
+#define REG_BLDMOD *(u16*)0x4000050
+#define REG_COLEV *(u16*)0x4000052
+#define REG_COLEY *(u16*)0x4000054
+#define REG_SG10 *(u32*)0x4000060
+#define REG_SG10_L *(u16*)0x4000060
+#define REG_SG10_H *(u16*)0x4000062
+#define REG_SG11 *(u16*)0x4000064
+#define REG_SG20 *(u16*)0x4000068
+#define REG_SG21 *(u16*)0x400006C
+#define REG_SG30 *(u32*)0x4000070
+#define REG_SG30_L *(u16*)0x4000070
+#define REG_SG30_H *(u16*)0x4000072
+#define REG_SG31 *(u16*)0x4000074
+#define REG_SG40 *(u16*)0x4000078
+#define REG_SG41 *(u16*)0x400007C
+#define REG_SGCNT0 *(u32*)0x4000080
+#define REG_SGCNT0_L *(u16*)0x4000080
+#define REG_SGCNT0_H *(u16*)0x4000082
+#define REG_SGCNT1 *(u16*)0x4000084
+#define REG_SGBIAS *(u16*)0x4000088
+#define REG_SGWR0 *(u32*)0x4000090
+#define REG_SGWR0_L *(u16*)0x4000090
+#define REG_SGWR0_H *(u16*)0x4000092
+#define REG_SGWR1 *(u32*)0x4000094
+#define REG_SGWR1_L *(u16*)0x4000094
+#define REG_SGWR1_H *(u16*)0x4000096
+#define REG_SGWR2 *(u32*)0x4000098
+#define REG_SGWR2_L *(u16*)0x4000098
+#define REG_SGWR2_H *(u16*)0x400009A
+#define REG_SGWR3 *(u32*)0x400009C
+#define REG_SGWR3_L *(u16*)0x400009C
+#define REG_SGWR3_H *(u16*)0x400009E
+#define REG_SGFIF0A *(u32*)0x40000A0
+#define REG_SGFIFOA_L *(u16*)0x40000A0
+#define REG_SGFIFOA_H *(u16*)0x40000A2
+#define REG_SGFIFOB *(u32*)0x40000A4
+#define REG_SGFIFOB_L *(u16*)0x40000A4
+#define REG_SGFIFOB_H *(u16*)0x40000A6
+#define REG_DM0SAD *(u32*)0x40000B0
+#define REG_DM0SAD_L *(u16*)0x40000B0
+#define REG_DM0SAD_H *(u16*)0x40000B2
+#define REG_DM0DAD *(u32*)0x40000B4
+#define REG_DM0DAD_L *(u16*)0x40000B4
+#define REG_DM0DAD_H *(u16*)0x40000B6
+#define REG_DM0CNT *(u32*)0x40000B8
+#define REG_DM0CNT_L *(u16*)0x40000B8
+#define REG_DM0CNT_H *(u16*)0x40000BA
+#define REG_DM1SAD *(u32*)0x40000BC
+#define REG_DM1SAD_L *(u16*)0x40000BC
+#define REG_DM1SAD_H *(u16*)0x40000BE
+#define REG_DM1DAD *(u32*)0x40000C0
+#define REG_DM1DAD_L *(u16*)0x40000C0
+#define REG_DM1DAD_H *(u16*)0x40000C2
+#define REG_DM1CNT *(u32*)0x40000C4
+#define REG_DM1CNT_L *(u16*)0x40000C4
+#define REG_DM1CNT_H *(u16*)0x40000C6
+#define REG_DM2SAD *(u32*)0x40000C8
+#define REG_DM2SAD_L *(u16*)0x40000C8
+#define REG_DM2SAD_H *(u16*)0x40000CA
+#define REG_DM2DAD *(u32*)0x40000CC
+#define REG_DM2DAD_L *(u16*)0x40000CC
+#define REG_DM2DAD_H *(u16*)0x40000CE
+#define REG_DM2CNT *(u32*)0x40000D0
+#define REG_DM2CNT_L *(u16*)0x40000D0
+#define REG_DM2CNT_H *(u16*)0x40000D2
+#define REG_DM3SAD *(u32*)0x40000D4
+#define REG_DM3SAD_L *(u16*)0x40000D4
+#define REG_DM3SAD_H *(u16*)0x40000D6
+#define REG_DM3DAD *(u32*)0x40000D8
+#define REG_DM3DAD_L *(u16*)0x40000D8
+#define REG_DM3DAD_H *(u16*)0x40000DA
+#define REG_DM3CNT *(u32*)0x40000DC
+#define REG_DM3CNT_L *(u16*)0x40000DC
+#define REG_DM3CNT_H *(u16*)0x40000DE
+#define REG_TM0D *(u16*)0x4000100
+#define REG_TM0CNT *(u16*)0x4000102
+#define REG_TM1D *(u16*)0x4000104
+#define REG_TM1CNT *(u16*)0x4000106
+#define REG_TM2D *(u16*)0x4000108
+#define REG_TM2CNT *(u16*)0x400010A
+#define REG_TM3D *(u16*)0x400010C
+#define REG_TM3CNT *(u16*)0x400010E
+#define REG_SCD0 *(u16*)0x4000120
+#define REG_SCD1 *(u16*)0x4000122
+#define REG_SCD2 *(u16*)0x4000124
+#define REG_SCD3 *(u16*)0x4000126
+#define REG_SCCNT *(u32*)0x4000128
+#define REG_SCCNT_L *(u16*)0x4000128
+#define REG_SCCNT_H *(u16*)0x400012A
+#define REG_P1 *(u16*)0x4000130
+#define REG_P1CNT *(u16*)0x4000132
+#define REG_R *(u16*)0x4000134
+#define REG_HS_CTRL *(u16*)0x4000140
+#define REG_JOYRE *(u32*)0x4000150
+#define REG_JOYRE_L *(u16*)0x4000150
+#define REG_JOYRE_H *(u16*)0x4000152
+#define REG_JOYTR *(u32*)0x4000154
+#define REG_JOYTR_L *(u16*)0x4000154
+#define REG_JOYTR_H *(u16*)0x4000156
+#define REG_JSTAT *(u32*)0x4000158
+#define REG_JSTAT_L *(u16*)0x4000158
+#define REG_JSTAT_H *(u16*)0x400015A
+#define REG_IE *(u16*)0x4000200
+#define REG_IF *(u16*)0x4000202
+#define REG_WSCNT *(u16*)0x4000204
+#define REG_IME *(u16*)0x4000208
+#define REG_PAUSE *(u16*)0x4000300
+
+///REG_DISPCNT Defines////
+#define BG0_ENABLE 0x100 //these are just the flags for enabling backgrounds and sprites
+#define BG1_ENABLE 0x200
+#define BG2_ENABLE 0x400
+#define BG3_ENABLE 0x800
+#define OBJ_ENABLE 0x1000
+#define WIN0_ENABLE 0x2000
+#define WIN1_ENABLE 0x4000
+#define WINOBJ_ENABLE 0x8000
+
+
+#define OBJ_MAP_LINEAR 0x40 //I'll talk about this when i talk about hardware sprites
+#define OBJ_MAP_2D 0x0
+#define BACK_BUFFER 0x10 //this is the flag that controlls wich buffer is being rendered
+
+
+#define MODE0 0x0 //these are the modes
+#define MODE1 0x1
+#define MODE2 0x2
+#define MODE3 0x3
+#define MODE4 0x4
+#define MODE5 0x5
+
+#endif
+
diff --git a/languages/cpp/app_templates/chello_gba/main.c b/languages/cpp/app_templates/chello_gba/main.c
new file mode 100644
index 00000000..354b4fd8
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/main.c
@@ -0,0 +1,50 @@
+%{CPP_TEMPLATE}
+
+#include "main.h"
+
+int main(){
+ initTextMode();
+ print("HELLO WORLD",9,9);
+ while(1){} //loop forever
+
+}
+
+
+void print(char* text,u16 x,u16 y){
+ u16 i=0;
+ u16* ScreenBase = (u16*)0x6004000;
+ ScreenBase = ScreenBase + x + y*32;
+ while ( *text != '\0' ){
+
+ *ScreenBase++ = (u16)*text-'A'+1;
+ i++;
+ text++;
+ }
+}
+
+void initTextMode(){
+ REG_DISPCNT = (MODE0 | BG2_ENABLE); //this sets the screen mode to mode 0 and enables background 2
+
+ // 256 colors and charscreenbase 0, screenbase 8
+ // default size is 256x256 pixel
+ REG_BG2CNT = (1 << 7 | 0 << 2 | 8 << 8);
+
+
+ u16* palDest=(u16*)BGPaletteMem; //0x5000000
+ u16* palSource = (u16*)Master_Palette;
+ // copy the palette info (256 colors a 15/16 Bit) into the desired address
+ u16 i=0;
+ for (;i<256;i++) {
+ *palDest++ = *palSource++;
+ }
+
+ // copy the tiles to charbase 0, (0x6000000 start of the videobuffer)
+ u16* fontDest = (u16*)VideoBuffer; //this is the start of video memory
+ u16* fontSource = (u16*)font_Tiles;
+ i=0;
+ for(;i<1920;i=i+2){
+ *fontDest++ = *fontSource++;
+ }
+}
+
+
diff --git a/languages/cpp/app_templates/chello_gba/main.h b/languages/cpp/app_templates/chello_gba/main.h
new file mode 100644
index 00000000..c84f48bb
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/main.h
@@ -0,0 +1,12 @@
+%{H_TEMPLATE}
+
+// gba.h has all the register definitions
+#include "gba.h"
+
+extern u16 font_Tiles[]; // the letters as 8x8 tiles
+extern u16 Master_Palette[]; // the color palette
+
+void print(char* text,u16 x,u16 y);
+void initTextMode();
+
+
diff --git a/languages/cpp/app_templates/chello_gba/master.pal.c b/languages/cpp/app_templates/chello_gba/master.pal.c
new file mode 100644
index 00000000..a24fde37
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/master.pal.c
@@ -0,0 +1,35 @@
+const unsigned short Master_Palette[256]={
+0x0000, 0x7fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
diff --git a/languages/cpp/app_templates/chello_gba/src-Makefile.am b/languages/cpp/app_templates/chello_gba/src-Makefile.am
new file mode 100644
index 00000000..a41e883a
--- /dev/null
+++ b/languages/cpp/app_templates/chello_gba/src-Makefile.am
@@ -0,0 +1,13 @@
+all: %{APPNAMELC}.gba
+
+%{APPNAMELC}.gba: %{APPNAMELC}
+ arm-agb-elf-objcopy -O binary %{APPNAMELC} %{APPNAMELC}.gba
+
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = main.h main.c font.raw.c master.pal.c
+
+# set the include path found by configure
+INCLUDES= $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries)
diff --git a/languages/cpp/app_templates/clanlib/.kdev_ignore b/languages/cpp/app_templates/clanlib/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/.kdev_ignore
diff --git a/languages/cpp/app_templates/clanlib/Makefile.am b/languages/cpp/app_templates/clanlib/Makefile.am
new file mode 100644
index 00000000..f4a650af
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = src-Makefile.am app-Makefile.am main.cpp app.kdevelop \
+ app-configure.in app-autogen.sh
+templateName = clanlib
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz $(templateName).png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/clanlib/app-Makefile.am b/languages/cpp/app_templates/clanlib/app-Makefile.am
new file mode 100644
index 00000000..af437a64
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/app-Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = src
diff --git a/languages/cpp/app_templates/clanlib/app-autogen.sh b/languages/cpp/app_templates/clanlib/app-autogen.sh
new file mode 100644
index 00000000..2b285d79
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/app-autogen.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+aclocal && autoconf && automake --add-missing --copy
diff --git a/languages/cpp/app_templates/clanlib/app-configure.in b/languages/cpp/app_templates/clanlib/app-configure.in
new file mode 100644
index 00000000..c1518570
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/app-configure.in
@@ -0,0 +1,22 @@
+AC_INIT()
+AM_INIT_AUTOMAKE(%{APPNAMELC},%{VERSION})
+
+AC_PROG_CC
+AC_PROG_CXX
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+
+
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+
+AC_CHECK_HEADER([ClanLib/application.h], [],
+ AC_MSG_ERROR([Couldn't find Clanlib headers.]))
+
+AC_CHECK_LIB(clanApp, main, , AC_ERROR([Couldn't find Clanlib libraries]), -lclanCore -lclanSignals -ldl)
+
+AC_LANG_RESTORE
+
+
+AC_OUTPUT(Makefile src/Makefile)
+
diff --git a/languages/cpp/app_templates/clanlib/app.kdevelop b/languages/cpp/app_templates/clanlib/app.kdevelop
new file mode 100644
index 00000000..c0d5c286
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/app.kdevelop
@@ -0,0 +1,106 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>ClanLib</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>true</terminal>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ <configurations>
+ <default>
+ <ldflags></ldflags>
+ </default>
+ </configurations>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/clanlib/clanlib.kdevtemplate b/languages/cpp/app_templates/clanlib/clanlib.kdevtemplate
new file mode 100644
index 00000000..1e7b2677
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/clanlib.kdevtemplate
@@ -0,0 +1,138 @@
+# KDE Config File
+[General]
+Name=Simple ClanLib application
+Name[ca]=Una simple aplicació de ClanLib
+Name[da]=Simpelt ClanLib program
+Name[de]=Eine einfache ClanLib-Anwendung
+Name[el]=Μια απλή εφαÏμογή ClanLib
+Name[es]=Una sencilla aplicación de ClanLib
+Name[et]=Lihtne ClanLib rakendus
+Name[eu]=ClanLib aplikazio simple bat
+Name[fa]=کاربرد سادۀ ClanLib
+Name[fr]=Application ClanLib simple
+Name[ga]=Feidhmchlár simplí ClanLib
+Name[gl]=Aplicación sinxela ClanLib
+Name[hu]=Egyszerű Clanlib-alkalmazás
+Name[it]=semplice applicazione ClanLib
+Name[ja]=ç°¡å˜ãª ClanLib アプリケーション
+Name[nds]=En eenfach ClanLib-Programm
+Name[ne]=साधारण ClanLib अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Eenvoudige ClanLib-toepassing
+Name[pl]=Prosty program używający ClanLib
+Name[pt]=Aplicação simples da ClanLib
+Name[pt_BR]=Aplicação simples da ClanLib
+Name[ru]=ПроÑтое приложение ClanLib
+Name[sk]=Jednoduchá ClanLib aplikácia
+Name[sl]=Preprost program ClanLib
+Name[sr]=ЈедноÑтаван ClanLib програм
+Name[sr@Latn]=Jednostavan ClanLib program
+Name[sv]=Enkelt ClanLib-program
+Name[tr]=Basit ClanLib uygulaması
+Name[zh_CN]=简å•çš„ ClanLib 应用程åº
+Name[zh_TW]=簡單的 ClanLib 應用程å¼
+Category=C++
+Icon=clanlib.png
+Comment=Generates a simple ClanLib application.
+Comment[ca]=Genera una simple aplicació de ClanLib.
+Comment[da]=Genererer et simpelt ClanLib program
+Comment[de]=Erstellt eine einfache ClanLib-Anwendung.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή ClanLib.
+Comment[es]=Genera una sencilla aplicación de ClanLib.
+Comment[et]=Lihtsa ClanLib'i rakenduse loomine.
+Comment[eu]=ClanLib aplikazio simple bat sortzen du.
+Comment[fa]=یک کاربرد سادۀ ClanLib تولید می‌کند.
+Comment[fr]=Génère une application ClanLib simple.
+Comment[ga]=Cruthaíonn sé seo feidhmchlár simplí ClanLib.
+Comment[gl]=Xera una aplicación sinxela ClanLib.
+Comment[hu]=Létrehoz egy egyszerű Clanlib-alkalmazást.
+Comment[it]=Genera una semplice applicazione ClanLib.
+Comment[ja]=ç°¡å˜ãª ClanLib アプリケーションを作æˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach ClanLib-Programm op.
+Comment[ne]=साधारण ClanLib अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een eenvoudige ClanLib-toepassing
+Comment[pl]=Generuje prosty program używający ClanLib.
+Comment[pt]=Gera uma aplicação simples com o ClanLib.
+Comment[pt_BR]=Gera uma aplicação simples com o ClanLib.
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ClanLib.
+Comment[sk]=Vygeneruje jednoduchú ClanLib aplikáciu.
+Comment[sl]=Ustvari preprost program ClanLib.
+Comment[sr]=Прави једноÑтаван ClanLib програм.
+Comment[sr@Latn]=Pravi jednostavan ClanLib program.
+Comment[sv]=Skapar ett enkelt ClanLib-program.
+Comment[tr]=Basit bir ClanLib uygulaması yaratır.
+Comment[zh_CN]=生æˆç®€å•çš„ ClanLib 应用程åºã€‚
+Comment[zh_TW]=產生簡單的 ClanLib 應用程å¼ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/main.cpp
+Archive=clanlib.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/app-configure.in
+Dest=%{dest}/configure.in
+
+[FILE4]
+Type=install
+Source=%{src}/app-autogen.sh
+Dest=%{dest}/autogen.sh
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[MSG]
+Type=message
+Comment=A simple clanlib application was created in %{dest}
+Comment[ca]=Una simple aplicació de clanlib ha estat creada en %{dest}
+Comment[da]=Et simpelt clanlib program blev oprettet i %{dest}
+Comment[de]=Eine einfache ClanLib-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια απλή εφαÏμογή clanlib δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación de ClanLib sencilla ha sido creada en %{dest}
+Comment[et]=Lihtne ClanLib'i rakendus loodi asukohta %{dest}
+Comment[eu]=clanlib aplikazio simple bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد سادۀ clanlib در %{dest} ایجاد شد
+Comment[fr]=Une application Clanlib simple a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár simplí clanlib i %{dest}
+Comment[gl]=Creouse una apliación sinxela clanlib en %{dest}
+Comment[hu]=Létrejött egy egyszerű Clanlib-alkalmazás itt: %{dest}
+Comment[it]=È stata creata una semplice applicazione clanlib in %{dest}
+Comment[ja]=ç°¡å˜ãª clanlib アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach ClanLib-Programm opstellt
+Comment[ne]=साधारण clanlib अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een voorbeeld ClanLib-toepassing is aangemaakt in %{dest}
+Comment[pl]=Prosty program używający ClanLib został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação simples da ClanLib em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação simples da ClanLib em %{dest}
+Comment[ru]=ПроÑтое приложение ClanLib Ñоздано в %{dest}
+Comment[sk]=Jednoduchá ClanLib aplikácia bola vytvorená v %{dest}
+Comment[sl]=Preprost program clanlib je bil ustvarjen v %{dest}
+Comment[sr]=ЈедноÑтаван clanlib програм је направљен у %{dest}
+Comment[sr@Latn]=Jednostavan clanlib program je napravljen u %{dest}
+Comment[sv]=Ett enkelt ClanLib-program skapades i %{dest}
+Comment[zh_CN]=在 %{dest} 中创建了一个简å•çš„ clanlib 程åº
+Comment[zh_TW]=一個簡單的 clanlib 應用程å¼å·²ç¶“建立在 %{dest}
diff --git a/languages/cpp/app_templates/clanlib/clanlib.png b/languages/cpp/app_templates/clanlib/clanlib.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/clanlib.png
Binary files differ
diff --git a/languages/cpp/app_templates/clanlib/main.cpp b/languages/cpp/app_templates/clanlib/main.cpp
new file mode 100644
index 00000000..962e1452
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/main.cpp
@@ -0,0 +1,29 @@
+%{CPP_TEMPLATE}
+
+#include <ClanLib/application.h>
+#include <ClanLib/core.h>
+#include <ClanLib/display.h>
+#include <ClanLib/gl.h>
+#include <ClanLib/sound.h>
+
+class %{APPNAME}Application : public CL_ClanApplication
+{
+public:
+ virtual int main(int argc, char** argv)
+ {
+ CL_SetupCore::init();
+ CL_SetupDisplay::init();
+ CL_SetupGL::init();
+ CL_SetupSound::init();
+
+ // Code here
+
+ CL_SetupSound::deinit();
+ CL_SetupGL::deinit();
+ CL_SetupDisplay::deinit();
+ CL_SetupCore::deinit();
+
+ return 0;
+ }
+} app;
+
diff --git a/languages/cpp/app_templates/clanlib/src-Makefile.am b/languages/cpp/app_templates/clanlib/src-Makefile.am
new file mode 100644
index 00000000..085f4f76
--- /dev/null
+++ b/languages/cpp/app_templates/clanlib/src-Makefile.am
@@ -0,0 +1,4 @@
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = main.cpp
+%{APPNAMELC}_LDADD = -lclanCore -lclanApp -lclanDisplay -lclanGL -lclanSound -lclanSignals
+
diff --git a/languages/cpp/app_templates/cmakelibc/CMakeLists.txt b/languages/cpp/app_templates/cmakelibc/CMakeLists.txt
new file mode 100644
index 00000000..fad51df5
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibc/CMakeLists.txt
@@ -0,0 +1,7 @@
+PROJECT(%{APPNAMELC})
+
+#if you don't want the full compiler output, remove the following line
+SET(CMAKE_VERBOSE_MAKEFILE ON)
+
+SUBDIRS(src)
+
diff --git a/languages/cpp/app_templates/cmakelibc/CMakeLists.txt.src b/languages/cpp/app_templates/cmakelibc/CMakeLists.txt.src
new file mode 100644
index 00000000..d2fabc7a
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibc/CMakeLists.txt.src
@@ -0,0 +1,19 @@
+#this is just a basic CMakeLists.txt, for more information see the cmake manpage
+
+#add definitions, compiler switches, etc.
+ADD_DEFINITIONS(-Wall -O2)
+
+#build a shared library
+ADD_LIBRARY(%{APPNAMELC} SHARED %{APPNAMELC}.c)
+
+#for testing the shared library you probably need some test app too
+ADD_EXECUTABLE(%{APPNAMELC}test %{APPNAMELC}test.c)
+
+#need to link to some other libraries ? just add them here
+TARGET_LINK_LIBRARIES(%{APPNAMELC}test %{APPNAMELC})
+
+#add an install target here
+#INSTALL_FILES(...)
+#INSTALL_PROGRAMS(...)
+#INSTALL_TARGET(...)
+
diff --git a/languages/cpp/app_templates/cmakelibc/Makefile.am b/languages/cpp/app_templates/cmakelibc/Makefile.am
new file mode 100644
index 00000000..c10e704a
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibc/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = test.c lib.h lib.c cmakelibc.png CMakeLists.txt CMakeLists.txt.src
+templateName = cmakelibc
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/cmakelibc/cmakelibc b/languages/cpp/app_templates/cmakelibc/cmakelibc
new file mode 100644
index 00000000..ae927b61
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibc/cmakelibc
@@ -0,0 +1,7 @@
+# KDE Config File
+[General]
+Name=A shared library template
+Icon=cmakelibc.png
+Category=C/CMake based projects
+Comment=Generates a shared library template including a test application in C. It compiles using the CMake build tool instead of the automake/autoconf/libtool combination. It requires cmake 2.1 (available from cmake cvs) or the upcoming cmake 2.2 release.
+ShowFilesAfterGeneration=src/%{APPNAMELC}.c
diff --git a/languages/cpp/app_templates/cmakelibc/cmakelibc.kdevtemplate b/languages/cpp/app_templates/cmakelibc/cmakelibc.kdevtemplate
new file mode 100644
index 00000000..cd3783f7
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibc/cmakelibc.kdevtemplate
@@ -0,0 +1,139 @@
+# KDE Config File
+[General]
+Name=A shared library template
+Name[ca]=Una plantilla de biblioteca compartida
+Name[da]=En delt biblitekskabelon
+Name[de]=Vorlage für eine Shared Library
+Name[el]=Ένα Ï€Ïότυπο κοινόχÏηστης βιβλιοθήκης
+Name[es]=Una plantilla de biblioteca compartida
+Name[et]=Jagatud teegi mall
+Name[eu]=Liburutegi partekatu baten txantiloia
+Name[fa]=قالب کتابخانۀ مشترک
+Name[fr]=Un modèle de bibliothèque partagée
+Name[ga]=Teimpléad comhleabharlainne
+Name[gl]=Plantilla de biblioteca compartida
+Name[hu]=Osztott programkönyvtár-sablon
+Name[it]=Un modello di libreria condivisa
+Name[ja]=共有ライブラリã®ãƒ†ãƒ³ãƒ—レート
+Name[nds]=Vörlaag för deelt Bibliotheek
+Name[ne]=साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरिà¤à¤•à¥‹ लाइबà¥à¤°à¥‡à¤°à¥€ टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ
+Name[nl]=Een gedeelde-bibliotheek-sjabloon
+Name[pl]=Szablon współdzielonej biblioteki
+Name[pt]=Um modelo de uma biblioteca dinâmica
+Name[pt_BR]=Um modelo de uma biblioteca dinâmica
+Name[ru]=Шаблон разделÑемой библиотеки
+Name[sk]=Šablóna pre zdieľanú knižnicu
+Name[sl]=Predloga deljene knjižnice
+Name[sr]=Шаблон дељене библиотеке
+Name[sr@Latn]=Å ablon deljene biblioteke
+Name[sv]=En mall för ett delat bibliotek
+Name[tr]=Bir paylaşılan kütüphane şablonu
+Name[zh_CN]=共享库模æ¿
+Name[zh_TW]=共享函å¼åº«æ¨£æœ¬
+Icon=cmakelibc.png
+Category=C/CMake based projects
+FileTemplates=h,CStyle,c,CStyle
+Comment=Generates a shared library template including a test application in C. It compiles using the CMake build tool instead of the automake/autoconf/libtool combination. It requires cmake 2.1 (available from cmake cvs) or the upcoming cmake 2.2 release.
+Comment[ca]=Genera una plantilla de biblioteca compartida incloguen una aplicació de prova en C. Es compila usant l'eina de construcció CMake en comptes de la combinació automake/autoconf/libtool. Requereix cmake 2.1 (disponible en el cvs de cmake) o la propera versió 2.2.
+Comment[da]=Genererer en delt skabelon for et bibliotek inklusive et testprogram i C. Det kompilerer ved brug af CMake's byggeværktøj i stedet for automake/autoconf/libtool kombinationen. Det kræver cmake 2.1 (tilgængelig fra cmake cvs) eller den fremtidige cmake 2.2 udgivelse.
+Comment[de]=Erstellt eine Vorlage für eine Shared Library inklusive einer Testanwendung in C. Der Kompiliervorgang wird mit CMake anstelle der Kombination automake/autoconf/libtool durchgeführt und erfordert CMake 2.1 (das über das CVS-Archiv von CMake verfügbar ist) oder die kommende Version 2.2 von CMake.
+Comment[el]=ΔημιουÏγεί ένα Ï€Ïότυπο κοινόχÏηστης βιβλιοθήκης που πεÏιλαμβάνει και μια εφαÏμογή δοκιμής σε C. Μεταγλωττίζεται χÏησιμοποιώντας το εÏγαλείο κατασκευής CMake στη θέση του ÏƒÏ…Î½Î´Ï…Î±ÏƒÎ¼Î¿Ï automake/autoconf/libtool. ΧÏειάζεται το cmake 2.1 (διαθέσιμο από το cmake cvs) ή την επεÏχόμενη έκδοση cmake 2.2.
+Comment[es]=Genera una plantilla de biblioteca compartida incluyendo una aplicación de prueba en C. Se compila usando la herramienta CMake en lugar de la combinación automake/autoconf/libtool. Requiere cmake 2.1 (disponible en el cvs de cmake) o la próxima cmake 2.2.
+Comment[et]=Jagatud teegi malli loomine, kaasa arvatud testrakendus C-s. See kompileeritakse CMake'i ehitamistööriistaga, mitte automake/autoconf/libtool'i kombinatsiooniga. Selleks on vajalik CMake 2.1 (saadaval CMake'i CVSis) või peatne CMake'i versioon 2.2.
+Comment[eu]=Liburutegi partekatu baten txantiloia sortzen du C lengoaian idatzitako probarako aplikazio batekin. CMake tresna erabiliz konpilatzen du automake/autoconf/libtool taldea erabili ordez. cmake 2.1 behar du (cmake cvs-an eskuragarri) edo hurrengo cmake 2.2.
+Comment[fa]=یک قالب کتابخانۀ مشترک شامل کاربرد آزمایشی در سی تولید می‌کند. با استÙاده از ابزار ساختن CMake به جای ترکیب automake/autoconf/libtoolØŒ ترجمه می‌کند. به cmake 2.1 )از cmake cvs قابل دسترس است( یا نشر cmake 2.2 در آیندۀ نزدیک، نیاز دارد.
+Comment[fr]=Génère un modèle de bibliothèque partagée comprenant une application de test en C. La compilation s'effectue à l'aide de l'outil de construction CMake au lieu de la combinaison automake / autoconf / libtool. Nécessite CMake 2.1 (disponible sur le CVS de CMake) ou la version 2.2 de CMake à venir.
+Comment[ga]=Cruthaigh teimpléad comhleabharlainne le feidhmchlár tástála i C. Tiomsaítear é le huirlis tógála CMake in ionad automake/autoconf/libtool. Tá cmake 2.1 de dhíth (ar fáil ó cmake cvs) nó leagan 2.2 cmake atá le teacht.
+Comment[gl]=Xera unha plantilla de biblioteca compartida e máis unha aplicación de proba en C. Compílase usando a ferramenta CMake no lugar da combinación automake/autoconf/libtool. Require cmake 2.1 (dispoñíbel no cvs de cmake) ou a próxima versión cmake 2.2.
+Comment[hu]=Létrehoz egy alap osztott programkönyvtárat és egy hozzá tartozó tesztprogramot C nyelven. A fordítási környezet a CMake-re fog alapulni (az automake/autoconf/libtool kombináció helyett). A CMake 2.1 (elérhető a CMake CVS-ben) vagy a rövidesen megjelenő CMake 2.2 szükséges hozzá.
+Comment[it]=Genera un modello di libreria condivisa includente un'applicazione test in C. Compila usando CMake invece della combinazione automake/autoconf/libtool. Richiede cmake 2.1 (disponibile dal CVS di cmake) o la versione a venire di cmake 2.2.
+Comment[ja]=共有ライブラリã®ãƒ†ãƒ³ãƒ—レートを作æˆã—ã¾ã™ã€‚åŒæ™‚ã« C ã§ãƒ†ã‚¹ãƒˆã‚¢ãƒ—リケーションも作æˆã—ã¾ã™ã€‚コンパイルã«ã¯ã€automake/autoconf/libtool ã§ã¯ãªã CMake (2.1 ã¾ãŸã¯ 2.2) ãŒå¿…è¦ã§ã™ã€‚
+Comment[nds]=Stellt en Vörlaag för en deelt Bibliotheek mit en Testprogramm in C op. Dat Kompileren bruukt ansteed vun de "automake/autoconf/libtool"-Kombinatschoon "CMake" in de Verschoon 2.1 (ut dat cmake-CVS) oder 2.2 (de tokamen Utgaav).
+Comment[ne]=C मा परीकà¥à¤·à¤£ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सहितको साà¤à¥‡à¤¦à¤¾à¤°à¥€ टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । यसले automake/autoconf/libtool संयोजनको सटà¥à¤Ÿà¤¾à¤®à¤¾ CMake निरà¥à¤®à¤¾à¤£ उपकरण पà¥à¤°à¤¯à¥‹à¤— गरेर कमà¥à¤ªà¤¾à¤‡à¤² गरà¥à¤¦à¤› । यसका लागि cmake 2.1 (cmake cvs बाट उपलबà¥à¤§ हà¥à¤¨à¥à¤›) वा अब आउने cmake 2.2 उतà¥à¤ªà¤¾à¤¦à¤¨ आवशà¥à¤¯à¤• परà¥à¤¦à¤› ।
+Comment[nl]=Genereert een gedeelde-bibliotheek-sjabloon inclusief een testtoepassing in C. Het compileert met behulp van de CMake build tool in plaats van de combinatie automake/autoconf/libtool. Het vereist cmake 2.1 (beschikbaar in het cvs van cmake) of de aankomende cmake 2.2-uitgave.
+Comment[pl]=Generuje szablon współdzielonej biblioteki zawierający także program testowy w języku C. Kompilacja odbywa sie za pomocą narzędzia CMake zamiast kombinacji automake/autoconf/libtool. Wymaga cmake 2.1 (dostępnego z cvs-u cmake) lub nadchodzącej wersji 2.2.
+Comment[pt]=Gera um modelo de uma biblioteca dinâmica, que inclui uma aplicação de testes em C. Ele é compilado com a ferramenta CMake em vez da combinação automake/autoconf/libtool. Necessita do cmake 2.1 (disponível no CVS do 'cmake') ou da próxima versão cmake 2.2.
+Comment[pt_BR]=Gera um modelo de uma biblioteca dinâmica, que inclui uma aplicação de testes em C. Ele é compilado com a ferramenta CMake em vez da combinação automake/autoconf/libtool. Necessita do cmake 2.1 (disponível no CVS do 'cmake') ou da próxima versão cmake 2.2.
+Comment[ru]=Создание шаблона разделÑемой библиотеки, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‚ÐµÑтовую программу на C. Ð”Ð»Ñ Ñборки потребуетÑÑ CMake вмеÑто комбинации automake/autoconf/libtool. ПотребуетÑÑ cmake 2.1 (из CVS cmake) или релиз cmake 2.2.
+Comment[sk]=Vygeneruje šablónu pre zdieľanú knižnicu vrátane testovacej aplikácie v C.Kompiluje sa pomocou nástroja CMake namiesto kombinácie automake/autoconf/libtool.Vyžaduje cmake 2.1 (dostupné v cmake cvs) alebo nadchádzajúci cmake 2.2 release.
+Comment[sl]=Ustvari predlogo za deljeno knjižnico in testni program v C. Za prevajanje se namesto kombinacije automake/autoconf/libtool uporabi orodje za gradnjo CMake. Potreben je CMake 2.1 ali CMake 2.2.
+Comment[sr]=Прави шаблон дељене библиотеке, укључујући и пробни програм у C-у. Преводи Ñе помоћу алата CMake умеÑто комбинације Automake/Autoconf/Libtool. Захтева CMake 2.1 (доÑтупан у CVS-у CMake-а) или надолазеће издање CMake 2.2.
+Comment[sr@Latn]=Pravi Å¡ablon deljene biblioteke, ukljuÄujući i probni program u C-u. Prevodi se pomoću alata CMake umesto kombinacije Automake/Autoconf/Libtool. Zahteva CMake 2.1 (dostupan u CVS-u CMake-a) ili nadolazeće izdanje CMake 2.2.
+Comment[sv]=Skapar en mall för ett delat bibliotek inklusive ett testprogram i C. Det kompileras med byggverktyget CMake istället för kombinationen automake/autoconf/libtool. Det kräver cmake 2.1 (tillgängligt från cmake CVS-arkiv) eller den förestående utgåvan av cmake 2.2.
+Comment[tr]=C'de bir test uygulaması içeren bir paylaşılan kütüphane uygulaması yaratır. automake/autoconf/libtool birleşimini değil, CMake aracını kullanarak derlenir. cmake 2.1( cmake cvs'inden edinilebilir) veya yakında gelecek olan 2.2 sürümüne ihtiyaç duyar.
+Comment[zh_CN]=生æˆä¸€ä¸ªå…±äº«åº“模æ¿ï¼Œå…¶ä¸­åŒ…å«ä¸€ä¸ª C 的测试应用程åºã€‚该模æ¿ä½¿ç”¨ CMake 编译工具编译,而ä¸æ˜¯ä½¿ç”¨ automake/autoconf/libtool 的组åˆã€‚该模æ¿éœ€è¦ cmake 2.1 (å¯ä»Ž cmake cvs 中获得)或å³å°†å‘布的 cmake 2.2 版本。
+Comment[zh_TW]=產生一個共享函å¼åº«æ¨£æœ¬ï¼ŒåŒ…括一個 C 的測試程å¼ã€‚它è¦ç”¨ CMake 建立工具來編譯,而ä¸æ˜¯ç”¨ automake/autoconf/libtool ç­‰ã€‚å®ƒéœ€è¦ cmake 2.1(å¯ä»¥å¾ž cmake cvs 中å–得),或是以後的版本。
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.c
+Archive=cmakelibc.tar.gz
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/CMakeLists.txt
+Dest=%{dest}/CMakeLists.txt
+
+[FILE2]
+Type=install
+EscapeXML=true
+Source=%{src}/CMakeLists.txt.src
+Dest=%{dest}/src/CMakeLists.txt
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{src}/test.c
+Dest=%{dest}/src/%{APPNAMELC}test.c
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/lib.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE5]
+Type=install
+EscapeXML=true
+Source=%{src}/lib.c
+Dest=%{dest}/src/%{APPNAMELC}.c
+
+[CMAKE]
+Type=finishcmd
+Command=cmake ./ -GKDevelop3
+Directory=%{dest}
+
+[MSG]
+Type=message
+Comment=A CMake based shared library template was created in %{dest}
+Comment[ca]=Una plantilla de biblioteca compartida basada en CMake ha estat creada en %{dest}
+Comment[da]=En CMake baseret skabelon for et delt bibliotek blev oprettet i %{dest}
+Comment[de]=Eine auf CMake basierende Vorlage für eine Shared Library wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïότυπο κοινόχÏηστης βιβλιοθήκης βασισμένο στο CMake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una plantilla de biblioteca compartida basada en CMake ha sido creada en %{dest}
+Comment[et]=Jagatud teegi mall CMake'i põhjal loodi asukohta %{dest}
+Comment[eu]=CMake-en oinarritutako liburutegi partekatu baten txantiloia sortu da hemen: %{dest}
+Comment[fa]=یک قالب کتابخانۀ مشترک بر مبنای CMake در %{dest} ایجاد شد
+Comment[fr]=Un modèle de bibliothèque partagée basée sur CMake a été créé dans %{dest}
+Comment[ga]=Cruthaíodh teimpléad comhleabharlainne bunaithe ar CMake i %{dest}
+Comment[gl]=Creouse una plantilla de biblioteca compartida baseada en CMake en %{dest}
+Comment[hu]=Létrejött egy CMake-alapú osztott programkönyvtár-sablon itt: %{dest}
+Comment[it]=È stato creato un modello di librerie condivise basate su CMake in %{dest}
+Comment[ja]=CMake ベースã®å…±æœ‰ãƒ©ã‚¤ãƒ–ラリテンプレートを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op CMake opbuut Vörlaag för en deelt Bibliotheek opstellt
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ CMake आधारित साà¤à¥‡à¤¦à¤¾à¤°à¥€ लाइबà¥à¤°à¥‡à¤°à¥€ टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een op Cmake gebaseerde bibliotheeksjabloon is aangemaakt in %{dest}
+Comment[pl]=Używający CMake szablon biblioteki współdzielonej został utworzony w %{dest}
+Comment[pt]=Foi criado um modelo de uma biblioteca dinâmica do CMake em %{dest}
+Comment[pt_BR]=Foi criado um modelo de uma biblioteca dinâmica do CMake em %{dest}
+Comment[ru]=ОÑнованный на CMake шаблон разделÑемой библиотеки Ñоздан в %{dest}
+Comment[sk]=Šablóna zdieľanej knižnice založenej na CMake bola vytvorená v %{dest}
+Comment[sl]=Predloga deljene knjižnice, ki uporablja CMake, je bila ustvarjena v %{dest}
+Comment[sr]=Шаблон дељене библиотеке на оÑнову CMake-а направљен је у %{dest}
+Comment[sr@Latn]=Å ablon deljene biblioteke na osnovu CMake-a napravljen je u %{dest}
+Comment[sv]=En CMake-baserad mall för ett delat bibliotek skapades i %{dest}
+Comment[tr]=CMake tabanlı paylaşılan kütüphane şablonu %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了基于 CMake 的共享库
+Comment[zh_TW]=以 CMake 為基礎的共享函å¼åº«æ¨£æœ¬å·²å»ºç«‹åœ¨ %{dest}
diff --git a/languages/cpp/app_templates/cmakelibc/cmakelibc.png b/languages/cpp/app_templates/cmakelibc/cmakelibc.png
new file mode 100644
index 00000000..158d3ce7
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibc/cmakelibc.png
Binary files differ
diff --git a/languages/cpp/app_templates/cmakelibc/lib.c b/languages/cpp/app_templates/cmakelibc/lib.c
new file mode 100644
index 00000000..4d285882
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibc/lib.c
@@ -0,0 +1,13 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "%{APPNAMELC}.h"
+
+
+void do_something()
+{
+ printf("Hello world !\n");
+}
+
+
diff --git a/languages/cpp/app_templates/cmakelibc/lib.h b/languages/cpp/app_templates/cmakelibc/lib.h
new file mode 100644
index 00000000..1b326544
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibc/lib.h
@@ -0,0 +1,7 @@
+#ifndef %{APPNAMELC}_H
+#define %{APPNAMELC}_H
+
+void do_something();
+
+
+#endif
diff --git a/languages/cpp/app_templates/cmakelibc/test.c b/languages/cpp/app_templates/cmakelibc/test.c
new file mode 100644
index 00000000..fb13e866
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibc/test.c
@@ -0,0 +1,8 @@
+
+#include "%{APPNAMELC}.h"
+
+int main(int argc, char** argv)
+{
+ do_something();
+ return 0;
+}
diff --git a/languages/cpp/app_templates/cmakelibcpp/CMakeLists.txt b/languages/cpp/app_templates/cmakelibcpp/CMakeLists.txt
new file mode 100644
index 00000000..8f172103
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibcpp/CMakeLists.txt
@@ -0,0 +1,8 @@
+
+PROJECT(%{APPNAMELC})
+
+#if you don't want the full compiler output, remove the following line
+
+SET(CMAKE_VERBOSE_MAKEFILE ON)
+
+SUBDIRS(src)
diff --git a/languages/cpp/app_templates/cmakelibcpp/CMakeLists.txt.src b/languages/cpp/app_templates/cmakelibcpp/CMakeLists.txt.src
new file mode 100644
index 00000000..ee2bb832
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibcpp/CMakeLists.txt.src
@@ -0,0 +1,19 @@
+#this is just a basic CMakeLists.txt, for more information see the cmake manpage
+
+#add definitions, compiler switches, etc.
+ADD_DEFINITIONS(-Wall -O2)
+
+#build a shared library
+ADD_LIBRARY(%{APPNAMELC} SHARED %{APPNAMELC}.cpp)
+
+#for testing the shared library you probably need some test app too
+ADD_EXECUTABLE(%{APPNAMELC}test %{APPNAMELC}test.cpp)
+
+#need to link to some other libraries ? just add them here
+TARGET_LINK_LIBRARIES(%{APPNAMELC}test %{APPNAMELC})
+
+#add an install target here
+#INSTALL_FILES(...)
+#INSTALL_PROGRAMS(...)
+#INSTALL_TARGET(...)
+
diff --git a/languages/cpp/app_templates/cmakelibcpp/Makefile.am b/languages/cpp/app_templates/cmakelibcpp/Makefile.am
new file mode 100644
index 00000000..395bb107
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibcpp/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = test.cpp lib.h lib.cpp cmakelibcpp.png CMakeLists.txt CMakeLists.txt.src
+templateName = cmakelibcpp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/cmakelibcpp/cmakelibcpp b/languages/cpp/app_templates/cmakelibcpp/cmakelibcpp
new file mode 100644
index 00000000..c68119c5
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibcpp/cmakelibcpp
@@ -0,0 +1,7 @@
+# KDE Config File
+[General]
+Name=A shared library template
+Icon=cmakelibcpp.png
+Category=C++/CMake based projects
+Comment=Generates a shared library template including a test application in C++. It compiles using the CMake build tool instead of the automake/autoconf/libtool combination. It requires cmake 2.1 (available from cmake cvs) or the upcoming cmake 2.2 release.
+ShowFilesAfterGeneration=src/%{APPNAMELC}.cpp
diff --git a/languages/cpp/app_templates/cmakelibcpp/cmakelibcpp.kdevtemplate b/languages/cpp/app_templates/cmakelibcpp/cmakelibcpp.kdevtemplate
new file mode 100644
index 00000000..e6e6ac44
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibcpp/cmakelibcpp.kdevtemplate
@@ -0,0 +1,139 @@
+# KDE Config File
+[General]
+Name=A shared library template
+Name[ca]=Una plantilla de biblioteca compartida
+Name[da]=En delt biblitekskabelon
+Name[de]=Vorlage für eine Shared Library
+Name[el]=Ένα Ï€Ïότυπο κοινόχÏηστης βιβλιοθήκης
+Name[es]=Una plantilla de biblioteca compartida
+Name[et]=Jagatud teegi mall
+Name[eu]=Liburutegi partekatu baten txantiloia
+Name[fa]=قالب کتابخانۀ مشترک
+Name[fr]=Un modèle de bibliothèque partagée
+Name[ga]=Teimpléad comhleabharlainne
+Name[gl]=Plantilla de biblioteca compartida
+Name[hu]=Osztott programkönyvtár-sablon
+Name[it]=Un modello di libreria condivisa
+Name[ja]=共有ライブラリã®ãƒ†ãƒ³ãƒ—レート
+Name[nds]=Vörlaag för deelt Bibliotheek
+Name[ne]=साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरिà¤à¤•à¥‹ लाइबà¥à¤°à¥‡à¤°à¥€ टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ
+Name[nl]=Een gedeelde-bibliotheek-sjabloon
+Name[pl]=Szablon współdzielonej biblioteki
+Name[pt]=Um modelo de uma biblioteca dinâmica
+Name[pt_BR]=Um modelo de uma biblioteca dinâmica
+Name[ru]=Шаблон разделÑемой библиотеки
+Name[sk]=Šablóna pre zdieľanú knižnicu
+Name[sl]=Predloga deljene knjižnice
+Name[sr]=Шаблон дељене библиотеке
+Name[sr@Latn]=Å ablon deljene biblioteke
+Name[sv]=En mall för ett delat bibliotek
+Name[tr]=Bir paylaşılan kütüphane şablonu
+Name[zh_CN]=共享库模æ¿
+Name[zh_TW]=共享函å¼åº«æ¨£æœ¬
+Icon=cmakelibcpp.png
+Category=C++/CMake based projects
+FileTemplates=h,CStyle,cpp,CStyle
+Comment=Generates a shared library template including a test application in C++. It compiles using the CMake build tool instead of the automake/autoconf/libtool combination. It requires cmake 2.1 (available from cmake cvs) or the upcoming cmake 2.2 release.
+Comment[ca]=Genera una plantilla de biblioteca compartida incloguen una aplicació de prova en C++. Es compila usant l'eina de construcció CMake en comptes de la combinació automake/autoconf/libtool. Requereix cmake 2.1 (disponible en el cvs de cmake) o la propera versió 2.2.
+Comment[da]=Genererer skabelon for delt bibliotek inklusive et testprogram i C++. Det kompileres ved brug af CMake byggeværktøjet i stedet for automake/autoconf/libtool kombinationen. Det kræver cmake 2.1 (tilgængelig fra cmake cvs) eller den fremtidige cmake 2.2 udgivelse.
+Comment[de]=Erstellt eine Vorlage für eine Shared Library inklusive einer Testanwendung in C++. Der Kompiliervorgang wird mit CMake anstelle der Kombination automake/autoconf/libtool durchgeführt und erfordert CMake 2.1 (das über das CVS-Archiv von CMake verfügbar ist) oder die kommende Version 2.2 von CMake.
+Comment[el]=ΔημιουÏγεί ένα Ï€Ïότυπο κοινόχÏηστης βιβλιοθήκης που πεÏιλαμβάνει και μια εφαÏμογή δοκιμής σε C++. Μεταγλωττίζεται χÏησιμοποιώντας το εÏγαλείο κατασκευής CMake στη θέση του ÏƒÏ…Î½Î´Ï…Î±ÏƒÎ¼Î¿Ï automake/autoconf/libtool. ΧÏειάζεται το cmake 2.1 (διαθέσιμο από το cmake cvs) ή την επεÏχόμενη έκδοση cmake 2.2.
+Comment[es]=Genera una plantilla de biblioteca compartida incluyendo una aplicación de prueba en C++. Se compila usando la herramienta CMake en lugar de la combinación automake/autoconf/libtool. Requiere cmake 2.1 (disponible en el cvs de cmake) o la próxima cmake 2.2.
+Comment[et]=Jagatud teegi malli loomine, kaasa arvatud testrakendus C++-s. See kompileeritakse CMake'i ehitamistööriistaga, mitte automake/autoconf/libtool'i kombinatsiooniga. Selleks on vajalik CMake 2.1 (saadaval CMake'i CVSis) või peatne CMake'i versioon 2.2.
+Comment[eu]=Liburutegi partekatu baten txantiloia sortzen du C++ lengoaian idatzitako probarako aplikazio batekin. CMake tresna erabiliz konpilatzen du automake/autoconf/libtool taldea erabili ordez. cmake 2.1 behar du (cmake cvs-an eskuragarri) edo hurrengo cmake 2.2.
+Comment[fa]=یک قالب کتابخانۀ مشترک شامل کاربرد آزمایشی در C++ تولید می‌کند. با استÙاده از ابزار ساختن CMake به جای ترکیب automake/autoconf/libtoolØŒ ترجمه می‌کند. به cmake 2.1 )از cmake cvs قابل دسترس است( یا نشر cmake 2.2 در آیندۀ نزدیک، نیاز دارد.
+Comment[fr]=Génère un modèle de bibliothèque partagée incluant une application de test en C++. La compilation s'effectue à l'aide de l'outil de construction CMake au lieu de la combinaison automake / autoconf / libtool. Nécessite CMake 2.1 (disponible sur le CVS de CMake) ou la version 2.2 de CMake à venir.
+Comment[ga]=Cruthaigh teimpléad comhleabharlainne le feidhmchlár tástála i C++. Tiomsaítear é le huirlis tógála CMake in ionad automake/autoconf/libtool. Tá cmake 2.1 de dhíth (ar fáil ó cmake cvs) nó leagan 2.2 cmake atá le teacht.
+Comment[gl]=Xera unha plantilla de biblioteca compartida e máis unha aplicación de proba en C++. Compílase usando a ferramenta CMake no lugar da combinación automake/autoconf/libtool. Require cmake 2.1 (dispoñíbel no cvs de cmake) ou a próxima versión cmake 2.2.
+Comment[hu]=Létrehoz egy alap osztott programkönyvtárat és egy hozzá tartozó tesztprogramot C++ nyelven. A fordítási környezet a CMake-re fog alapulni (az automake/autoconf/libtool kombináció helyett). A CMake 2.1 (elérhető a CMake CVS-ben) vagy a rövidesen megjelenő CMake 2.2 szükséges hozzá.
+Comment[it]=Genera un modello di libreria condivisa che include una applicazione test in C++. Compila usando CMake invece della combinazione automake/autoconf/libtool. Richiede cmake 2.1 (disponibile dal CVS di cmake) o la versione a venire cmake 2.2.
+Comment[ja]=共有ライブラリã®ãƒ†ãƒ³ãƒ—レートを作æˆã—ã¾ã™ã€‚åŒæ™‚ã« C++ ã§ãƒ†ã‚¹ãƒˆã‚¢ãƒ—リケーションも作æˆã—ã¾ã™ã€‚コンパイルã«ã¯ã€automake/autoconf/libtool ã§ã¯ãªã CMake (2.1 ã¾ãŸã¯ 2.2) ãŒå¿…è¦ã§ã™ã€‚
+Comment[nds]=Stellt en Vörlaag för en deelt Bibliotheek mit en Testprogramm in C++ op. Dat Kompileren bruukt ansteed vun de "automake/autoconf/libtool"-Kombinatschoon "CMake" in de Verschoon 2.1 (ut dat cmake-CVS) oder 2.2 (de tokamen Utgaav).
+Comment[ne]=C++ मा परीकà¥à¤·à¤£ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सहितको साà¤à¥‡à¤¦à¤¾à¤°à¥€ टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । यसले automake/autoconf/libtool संयोजनको सटà¥à¤Ÿà¤¾à¤®à¤¾ CMake निरà¥à¤®à¤¾à¤£ उपकरण पà¥à¤°à¤¯à¥‹à¤— गरेर कमà¥à¤ªà¤¾à¤‡à¤² गरà¥à¤¦à¤› । यसका लागि cmake 2.1 (cmake cvs बाट उपलबà¥à¤§ हà¥à¤¨à¥à¤›) वा अब आउने cmake 2.2 उतà¥à¤ªà¤¾à¤¦à¤¨ आवशà¥à¤¯à¤• परà¥à¤¦à¤› ।
+Comment[nl]=Genereert een gedeelde-bibliotheek-sjabloon inclusief een testtoepassing in C++. Het compileert met behulp van de CMake build tool in plaats van de combinatie automake/autoconf/libtool. Het vereist cmake 2.1 (uit het cvs van cmake) of de aankomende cmake 2.2-uitgave.
+Comment[pl]=Generuje szablon współdzielonej biblioteki zawierający także program testowy w języku C++. Kompilacja odbywa sie za pomocą narzędzia CMake zamiast kombinacji automake/autoconf/libtool. Wymaga cmake 2.1 (dostępnego z cvs-u cmake) lub nadchodzącej wersji 2.2.
+Comment[pt]=Gera um modelo de uma biblioteca dinâmica, que inclui uma aplicação de testes em C++. Ele é compilado com a ferramenta CMake em vez da combinação automake/autoconf/libtool. Necessita do cmake 2.1 (disponível no CVS do 'cmake') ou da próxima versão cmake 2.2.
+Comment[pt_BR]=Gera um modelo de uma biblioteca dinâmica, que inclui uma aplicação de testes em C++. Ele é compilado com a ferramenta CMake em vez da combinação automake/autoconf/libtool. Necessita do cmake 2.1 (disponível no CVS do 'cmake') ou da próxima versão cmake 2.2.
+Comment[ru]=Создание шаблона разделÑемой библиотеки, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‚ÐµÑтовую программу на C++. Ð”Ð»Ñ Ñборки потребуетÑÑ CMake вмеÑто комбинации automake/autoconf/libtool. ПотребуетÑÑ cmake 2.1 (из CVS cmake) или релиз cmake 2.2.
+Comment[sk]=Vygeneruje šablónu zdieľanej knižnice vrátane testovacej aplikácie v C++.Kompiluje sa pomocou nástroja CMake namiesto kombinácie automake/autoconf/libtool.Vyžaduje cmake 2.1 (dostupné v cmake cvs) alebo nadchádzajúci cmake 2.2 release.
+Comment[sl]=Ustvari predlogo za deljeno knjižnico in testni program v C++. Za prevajanje se namesto kombinacije automake/autoconf/libtool uporabi orodje za gradnjo CMake. Potreben je CMake 2.1 ali CMake 2.2.
+Comment[sr]=Прави шаблон дељене библиотеке укључујући и пробни програм у C++-у. Преводи Ñе помоћу алата CMake умеÑто комбинације Automake/Autoconf/Libtool. Захтева CMake 2.1 (доÑтупан у CVS-у CMake-а) или надолазеће издање CMake 2.2.
+Comment[sr@Latn]=Pravi Å¡ablon deljene biblioteke ukljuÄujući i probni program u C++-u. Prevodi se pomoću alata CMake umesto kombinacije Automake/Autoconf/Libtool. Zahteva CMake 2.1 (dostupan u CVS-u CMake-a) ili nadolazeće izdanje CMake 2.2.
+Comment[sv]=Skapar en mall för ett delat bibliotek inklusive ett testprogram i C++. Det kompileras med byggverktyget CMake istället för kombinationen automake/autoconf/libtool. Det kräver cmake 2.1 (tillgängligt från cmake CVS-arkiv) eller den förestående utgåvan av cmake 2.2.
+Comment[tr]=C++'da bir test uygulaması içeren bir paylaşılan kütüphane uygulaması yaratır. automake/autoconf/libtool birleşimini değil, CMake aracını kullanarak derlenir. cmake 2.1( cmake cvs'inden edinilebilir) veya yakında gelecek olan 2.2 sürümüne ihtiyaç duyar.
+Comment[zh_CN]=生æˆä¸€ä¸ªå…±äº«åº“模æ¿ï¼Œå…¶ä¸­åŒ…å«ä¸€ä¸ª C++ 的测试应用程åºã€‚该模æ¿ä½¿ç”¨ CMake 编译工具编译,而ä¸æ˜¯ä½¿ç”¨ automake/autoconf/libtool 的组åˆã€‚该模æ¿éœ€è¦ cmake 2.1 (å¯ä»Ž cmake cvs 中获得)或å³å°†å‘布的 cmake 2.2 版本。
+Comment[zh_TW]=產生一個包括 C++ 測試程å¼çš„共享函å¼åº«æ¨£æœ¬ã€‚它è¦ç”¨ CMake 建立工具來編譯,而ä¸æ˜¯ç”¨ automake/autoconf/libtool ç­‰ã€‚å®ƒéœ€è¦ cmake 2.1(å¯ä»¥å¾ž cmake cvs 中å–得),或是以後的版本。
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=cmakelibcpp.tar.gz
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/CMakeLists.txt
+Dest=%{dest}/CMakeLists.txt
+
+[FILE2]
+Type=install
+EscapeXML=true
+Source=%{src}/CMakeLists.txt.src
+Dest=%{dest}/src/CMakeLists.txt
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{src}/test.cpp
+Dest=%{dest}/src/%{APPNAMELC}test.cpp
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/lib.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE5]
+Type=install
+EscapeXML=true
+Source=%{src}/lib.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[CMAKE]
+Type=finishcmd
+Command=cmake ./ -GKDevelop3
+Directory=%{dest}
+
+[MSG]
+Type=message
+Comment=A CMake based shared library template was created in %{dest}
+Comment[ca]=Una plantilla de biblioteca compartida basada en CMake ha estat creada en %{dest}
+Comment[da]=En CMake baseret skabelon for et delt bibliotek blev oprettet i %{dest}
+Comment[de]=Eine auf CMake basierende Vorlage für eine Shared Library wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïότυπο κοινόχÏηστης βιβλιοθήκης βασισμένο στο CMake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una plantilla de biblioteca compartida basada en CMake ha sido creada en %{dest}
+Comment[et]=Jagatud teegi mall CMake'i põhjal loodi asukohta %{dest}
+Comment[eu]=CMake-en oinarritutako liburutegi partekatu baten txantiloia sortu da hemen: %{dest}
+Comment[fa]=یک قالب کتابخانۀ مشترک بر مبنای CMake در %{dest} ایجاد شد
+Comment[fr]=Un modèle de bibliothèque partagée basée sur CMake a été créé dans %{dest}
+Comment[ga]=Cruthaíodh teimpléad comhleabharlainne bunaithe ar CMake i %{dest}
+Comment[gl]=Creouse una plantilla de biblioteca compartida baseada en CMake en %{dest}
+Comment[hu]=Létrejött egy CMake-alapú osztott programkönyvtár-sablon itt: %{dest}
+Comment[it]=È stato creato un modello di librerie condivise basate su CMake in %{dest}
+Comment[ja]=CMake ベースã®å…±æœ‰ãƒ©ã‚¤ãƒ–ラリテンプレートを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op CMake opbuut Vörlaag för en deelt Bibliotheek opstellt
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ CMake आधारित साà¤à¥‡à¤¦à¤¾à¤°à¥€ लाइबà¥à¤°à¥‡à¤°à¥€ टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een op Cmake gebaseerde bibliotheeksjabloon is aangemaakt in %{dest}
+Comment[pl]=Używający CMake szablon biblioteki współdzielonej został utworzony w %{dest}
+Comment[pt]=Foi criado um modelo de uma biblioteca dinâmica do CMake em %{dest}
+Comment[pt_BR]=Foi criado um modelo de uma biblioteca dinâmica do CMake em %{dest}
+Comment[ru]=ОÑнованный на CMake шаблон разделÑемой библиотеки Ñоздан в %{dest}
+Comment[sk]=Šablóna zdieľanej knižnice založenej na CMake bola vytvorená v %{dest}
+Comment[sl]=Predloga deljene knjižnice, ki uporablja CMake, je bila ustvarjena v %{dest}
+Comment[sr]=Шаблон дељене библиотеке на оÑнову CMake-а направљен је у %{dest}
+Comment[sr@Latn]=Å ablon deljene biblioteke na osnovu CMake-a napravljen je u %{dest}
+Comment[sv]=En CMake-baserad mall för ett delat bibliotek skapades i %{dest}
+Comment[tr]=CMake tabanlı paylaşılan kütüphane şablonu %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了基于 CMake 的共享库
+Comment[zh_TW]=以 CMake 為基礎的共享函å¼åº«æ¨£æœ¬å·²å»ºç«‹åœ¨ %{dest}
diff --git a/languages/cpp/app_templates/cmakelibcpp/cmakelibcpp.png b/languages/cpp/app_templates/cmakelibcpp/cmakelibcpp.png
new file mode 100644
index 00000000..158d3ce7
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibcpp/cmakelibcpp.png
Binary files differ
diff --git a/languages/cpp/app_templates/cmakelibcpp/lib.cpp b/languages/cpp/app_templates/cmakelibcpp/lib.cpp
new file mode 100644
index 00000000..7dc4b57d
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibcpp/lib.cpp
@@ -0,0 +1,17 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "%{APPNAMELC}.h"
+
+
+Foo::Foo()
+{
+}
+
+void Foo::doSomething()
+{
+ printf("Hello world !\n");
+}
+
+
diff --git a/languages/cpp/app_templates/cmakelibcpp/lib.h b/languages/cpp/app_templates/cmakelibcpp/lib.h
new file mode 100644
index 00000000..5a434cdb
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibcpp/lib.h
@@ -0,0 +1,12 @@
+#ifndef %{APPNAMELC}_H
+#define %{APPNAMELC}_H
+
+class Foo
+{
+ public:
+ Foo();
+ void doSomething();
+};
+
+
+#endif
diff --git a/languages/cpp/app_templates/cmakelibcpp/test.cpp b/languages/cpp/app_templates/cmakelibcpp/test.cpp
new file mode 100644
index 00000000..b2464709
--- /dev/null
+++ b/languages/cpp/app_templates/cmakelibcpp/test.cpp
@@ -0,0 +1,9 @@
+
+#include "%{APPNAMELC}.h"
+
+int main(int argc, char** argv)
+{
+ Foo foo;
+ foo.doSomething();
+ return 0;
+}
diff --git a/languages/cpp/app_templates/cmakeqt3app/CMakeLists.txt b/languages/cpp/app_templates/cmakeqt3app/CMakeLists.txt
new file mode 100644
index 00000000..819d0a7e
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/CMakeLists.txt
@@ -0,0 +1,14 @@
+
+PROJECT(%{APPNAMELC})
+
+# at least cmake version 2.4.0 is required
+CMAKE_MINIMUM_REQUIRED(VERSION 2.4.0)
+
+# uncomment the following line if you require a special version of Qt
+# and adjust it accordingly
+# SET(QT_MIN_VERSION "3.0.0")
+
+# try to find Qt 3
+FIND_PACKAGE(Qt3 REQUIRED)
+
+ADD_SUBDIRECTORY(src)
diff --git a/languages/cpp/app_templates/cmakeqt3app/CMakeLists.txt.src b/languages/cpp/app_templates/cmakeqt3app/CMakeLists.txt.src
new file mode 100644
index 00000000..c4ce3e70
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/CMakeLists.txt.src
@@ -0,0 +1,28 @@
+# this is just a basic CMakeLists.txt
+# for more information see the cmake man page
+
+# add definitions, compiler switches, etc.
+ADD_DEFINITIONS(${QT_DEFINITIONS} -Wall -O2 -g)
+
+# add the Qt include dir to the include path
+INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR})
+
+# list all source files in a variable
+SET(%{APPNAMELC}_SRCS main.cpp %{APPNAMELC}.cpp)
+
+# specify the headers which have to be processed by moc
+# and collect the results in the variable given above
+QT_WRAP_CPP (%{APPNAMELC} %{APPNAMELC}_SRCS %{APPNAMELC}.h)
+
+# create tan executable from the list of source files
+ADD_EXECUTABLE(%{APPNAMELC} ${%{APPNAMELC}_SRCS})
+
+# link the application to the Qt libs
+TARGET_LINK_LIBRARIES(%{APPNAMELC} ${QT_LIBRARIES} )
+
+# create an install rule for the executable
+INSTALL(TARGETS %{APPNAMELC} DESTINATION bin )
+
+# if you need to install more things, take a look at the install() command
+# in the cmake man page
+
diff --git a/languages/cpp/app_templates/cmakeqt3app/Makefile.am b/languages/cpp/app_templates/cmakeqt3app/Makefile.am
new file mode 100644
index 00000000..c5fca50a
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = main.cpp cmakeqt3app.cpp cmakeqt3app.h cmakeqt3app.png \
+ filesave.xpm fileopen.xpm fileprint.xpm CMakeLists.txt CMakeLists.txt.src
+
+templateName = cmakeqt3app
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app
new file mode 100644
index 00000000..6ef2974f
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app
@@ -0,0 +1,8 @@
+# QMake application
+[General]
+Name=Qt3 Application
+Icon=cmakeqt3app.png
+Category=C++/CMake based projects
+Comment=Generate a CMake based Qt3 application
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.cpp b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.cpp
new file mode 100644
index 00000000..841f88d4
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.cpp
@@ -0,0 +1,283 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qtextedit.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qstatusbar.h>
+#include <qmessagebox.h>
+#include <qprinter.h>
+#include <qapplication.h>
+#include <qaccel.h>
+#include <qtextstream.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+#include <qwhatsthis.h>
+
+#include "filesave.xpm"
+#include "fileopen.xpm"
+#include "fileprint.xpm"
+
+%{APPNAME}::%{APPNAME}()
+ : QMainWindow( 0, "%{APPNAME}", WDestructiveClose )
+{
+ printer = new QPrinter;
+ QPixmap openIcon, saveIcon, printIcon;
+
+ QToolBar * fileTools = new QToolBar( this, "file operations" );
+ fileTools->setLabel( tr("File Operations") );
+
+ openIcon = QPixmap( fileopen );
+ QToolButton * fileOpen
+ = new QToolButton( openIcon, tr("Open File"), QString::null,
+ this, SLOT(choose()), fileTools, "open file" );
+
+ saveIcon = QPixmap( filesave );
+ QToolButton * fileSave
+ = new QToolButton( saveIcon, tr("Save File"), QString::null,
+ this, SLOT(save()), fileTools, "save file" );
+
+ printIcon = QPixmap( fileprint );
+ QToolButton * filePrint
+ = new QToolButton( printIcon, tr("Print File"), QString::null,
+ this, SLOT(print()), fileTools, "print file" );
+
+
+ (void)QWhatsThis::whatsThisButton( fileTools );
+
+ QString fileOpenText = tr("<p><img source=\"fileopen\"> "
+ "Click this button to open a <em>new file</em>. <br>"
+ "You can also select the <b>Open</b> command "
+ "from the <b>File</b> menu.</p>");
+
+ QWhatsThis::add( fileOpen, fileOpenText );
+
+ QMimeSourceFactory::defaultFactory()->setPixmap( "fileopen", openIcon );
+
+ QString fileSaveText = tr("<p>Click this button to save the file you "
+ "are editing. You will be prompted for a file name.\n"
+ "You can also select the <b>Save</b> command "
+ "from the <b>File</b> menu.</p>");
+
+ QWhatsThis::add( fileSave, fileSaveText );
+
+ QString filePrintText = tr("Click this button to print the file you "
+ "are editing.\n You can also select the Print "
+ "command from the File menu.");
+
+ QWhatsThis::add( filePrint, filePrintText );
+
+
+ QPopupMenu * file = new QPopupMenu( this );
+ menuBar()->insertItem( tr("&File"), file );
+
+
+ file->insertItem( tr("&New"), this, SLOT(newDoc()), CTRL+Key_N );
+
+ int id;
+ id = file->insertItem( openIcon, tr("&Open..."),
+ this, SLOT(choose()), CTRL+Key_O );
+ file->setWhatsThis( id, fileOpenText );
+
+ id = file->insertItem( saveIcon, tr("&Save"),
+ this, SLOT(save()), CTRL+Key_S );
+ file->setWhatsThis( id, fileSaveText );
+
+ id = file->insertItem( tr("Save &As..."), this, SLOT(saveAs()) );
+ file->setWhatsThis( id, fileSaveText );
+
+ file->insertSeparator();
+
+ id = file->insertItem( printIcon, tr("&Print..."),
+ this, SLOT(print()), CTRL+Key_P );
+ file->setWhatsThis( id, filePrintText );
+
+ file->insertSeparator();
+
+ file->insertItem( tr("&Close"), this, SLOT(close()), CTRL+Key_W );
+
+ file->insertItem( tr("&Quit"), qApp, SLOT( closeAllWindows() ), CTRL+Key_Q );
+
+ menuBar()->insertSeparator();
+
+ QPopupMenu * help = new QPopupMenu( this );
+ menuBar()->insertItem( tr("&Help"), help );
+
+ help->insertItem( tr("&About"), this, SLOT(about()), Key_F1 );
+ help->insertItem( tr("About &Qt"), this, SLOT(aboutQt()) );
+ help->insertSeparator();
+ help->insertItem( tr("What's &This"), this, SLOT(whatsThis()), SHIFT+Key_F1 );
+
+ e = new QTextEdit( this, "editor" );
+ e->setFocus();
+ setCentralWidget( e );
+ statusBar()->message( tr("Ready"), 2000 );
+
+ resize( 450, 600 );
+}
+
+
+%{APPNAME}::~%{APPNAME}()
+{
+ delete printer;
+}
+
+
+
+void %{APPNAME}::newDoc()
+{
+ %{APPNAME} *ed = new %{APPNAME};
+ ed->setCaption(tr("Qt Example - Application"));
+ ed->show();
+}
+
+void %{APPNAME}::choose()
+{
+ QString fn = QFileDialog::getOpenFileName( QString::null, QString::null,
+ this);
+ if ( !fn.isEmpty() )
+ load( fn );
+ else
+ statusBar()->message( tr("Loading aborted"), 2000 );
+}
+
+
+void %{APPNAME}::load( const QString &fileName )
+{
+ QFile f( fileName );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+
+ QTextStream ts( &f );
+ e->setText( ts.read() );
+ e->setModified( FALSE );
+ setCaption( fileName );
+ statusBar()->message( tr("Loaded document %1").arg(fileName), 2000 );
+}
+
+
+void %{APPNAME}::save()
+{
+ if ( filename.isEmpty() ) {
+ saveAs();
+ return;
+ }
+
+ QString text = e->text();
+ QFile f( filename );
+ if ( !f.open( IO_WriteOnly ) ) {
+ statusBar()->message( tr("Could not write to %1").arg(filename),
+ 2000 );
+ return;
+ }
+
+ QTextStream t( &f );
+ t << text;
+ f.close();
+
+ e->setModified( FALSE );
+
+ setCaption( filename );
+
+ statusBar()->message( tr( "File %1 saved" ).arg( filename ), 2000 );
+}
+
+
+void %{APPNAME}::saveAs()
+{
+ QString fn = QFileDialog::getSaveFileName( QString::null, QString::null,
+ this );
+ if ( !fn.isEmpty() ) {
+ filename = fn;
+ save();
+ } else {
+ statusBar()->message( tr("Saving aborted"), 2000 );
+ }
+}
+
+
+void %{APPNAME}::print()
+{
+ // ###### Rewrite to use QSimpleRichText to print here as well
+ const int Margin = 10;
+ int pageNo = 1;
+
+ if ( printer->setup(this) ) { // printer dialog
+ statusBar()->message( tr("Printing...") );
+ QPainter p;
+ if( !p.begin( printer ) ) // paint on printer
+ return;
+
+ p.setFont( e->font() );
+ int yPos = 0; // y-position for each line
+ QFontMetrics fm = p.fontMetrics();
+ QPaintDeviceMetrics metrics( printer ); // need width/height
+ // of printer surface
+ for( int i = 0 ; i < e->lines() ; i++ ) {
+ if ( Margin + yPos > metrics.height() - Margin ) {
+ QString msg( "Printing (page " );
+ msg += QString::number( ++pageNo );
+ msg += ")...";
+ statusBar()->message( msg );
+ printer->newPage(); // no more room on this page
+ yPos = 0; // back to top of page
+ }
+ p.drawText( Margin, Margin + yPos,
+ metrics.width(), fm.lineSpacing(),
+ ExpandTabs | DontClip,
+ e->text( i ) );
+ yPos = yPos + fm.lineSpacing();
+ }
+ p.end(); // send job to printer
+ statusBar()->message( tr("Printing completed"), 2000 );
+ } else {
+ statusBar()->message( tr("Printing aborted"), 2000 );
+ }
+}
+
+void %{APPNAME}::closeEvent( QCloseEvent* ce )
+{
+ if ( !e->isModified() ) {
+ ce->accept();
+ return;
+ }
+
+ switch( QMessageBox::information( this, tr("Qt Application Example"),
+ tr("Do you want to save the changes"
+ " to the document?"),
+ tr("Yes"), tr("No"), tr("Cancel"),
+ 0, 1 ) ) {
+ case 0:
+ save();
+ ce->accept();
+ break;
+ case 1:
+ ce->accept();
+ break;
+ case 2:
+ default: // just for sanity
+ ce->ignore();
+ break;
+ }
+}
+
+
+void %{APPNAME}::about()
+{
+ QMessageBox::about( this, tr("Qt Application Example"),
+ tr("This example demonstrates simple use of "
+ "QMainWindow,\nQMenuBar and QToolBar."));
+}
+
+
+void %{APPNAME}::aboutQt()
+{
+ QMessageBox::aboutQt( this, tr("Qt Application Example") );
+}
diff --git a/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.h b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.h
new file mode 100644
index 00000000..2d372da9
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.h
@@ -0,0 +1,39 @@
+%{H_TEMPLATE}
+
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+
+#include <qmainwindow.h>
+
+class QTextEdit;
+
+class %{APPNAME}: public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ %{APPNAME}();
+ ~%{APPNAME}();
+
+protected:
+ void closeEvent( QCloseEvent* );
+
+private slots:
+ void newDoc();
+ void choose();
+ void load( const QString &fileName );
+ void save();
+ void saveAs();
+ void print();
+
+ void about();
+ void aboutQt();
+
+private:
+ QPrinter *printer;
+ QTextEdit *e;
+ QString filename;
+};
+
+
+#endif
diff --git a/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.kdevtemplate b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.kdevtemplate
new file mode 100644
index 00000000..ff69203c
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.kdevtemplate
@@ -0,0 +1,126 @@
+# KDE Config File
+[General]
+Name=Qt3 Application
+Name[br]=Meziant Qt3
+Name[ca]=Aplicació Qt3
+Name[da]=Qt3-Program
+Name[de]=Qt3-Anwendung
+Name[el]=ΕφαÏμογή Qt3
+Name[es]=Aplicación Qt3
+Name[et]=Qt3 rakendus
+Name[fr]=Application Qt3
+Name[hu]=Qt3-alapú alkalmazások
+Name[it]=Applicazione Qt3
+Name[ja]=Qt3 アプリケーション
+Name[nds]=Qt3-Programm
+Name[nl]=Qt3-toepassing
+Name[pl]=Program Qt3
+Name[pt]=Aplicação do Qt3
+Name[pt_BR]=Aplicação do Qt3
+Name[ru]=Приложение Qt 3
+Name[sk]=Qt3 aplikácia
+Name[sr]=Qt3 програм
+Name[sr@Latn]=Qt3 program
+Name[sv]=Qt3-program
+Name[zh_TW]=Qt3 應用程å¼
+Icon=cmakeqt3app.png
+Category=C++/CMake based projects
+Comment=Generate a CMake based Qt3 application
+Comment[ca]=Genera una aplicació Qt3 basada en CMake
+Comment[da]=Opretter et CMake-baseret Qt3-program
+Comment[de]=Erstellt eine auf CMake basierende Qt3-Anwendung
+Comment[el]=ΔημιουÏγία μιας εφαÏμογής Qt3 με βάση το CMake
+Comment[es]=Genera una aplicación Qt3 basada en CMake
+Comment[et]=Qt3 rakenduse loomine CMake'i põhjal
+Comment[fr]=Génère une application Qt3 basée sur CMake
+Comment[hu]=Létrehoz egy CMake-alapú Qt3-alkalmazást
+Comment[it]=Genera un'applicazione Qt3 basata su CMake
+Comment[ja]=CMake ベース㮠Qt3 アプリケーションを作æˆ
+Comment[nds]=Stellt en op CMake opbuut Qt3-Programm op
+Comment[nl]=Genereer een CMake-gebaseerde Qt3-toepassing
+Comment[pl]=Generuje program Qt3 używający CMake
+Comment[pt]=Gera uma aplicação em Qt3 baseada no CMake
+Comment[pt_BR]=Gera uma aplicação em Qt3 baseada no CMake
+Comment[ru]=Создание оÑнованного на CMake Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Qt 3
+Comment[sk]=Vygeneruje Qt3 aplikáciu založenú na CMake
+Comment[sr]=Прави Qt3 програм на оÑнову CMake-а
+Comment[sr@Latn]=Pravi Qt3 program na osnovu CMake-a
+Comment[sv]=Skapar ett CMake-baserat Qt3-program
+Comment[zh_TW]=產生使用 CMake çš„ Qt3 應用程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=cmakeqt3app.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/CMakeLists.txt
+Dest=%{dest}/CMakeLists.txt
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE2]
+Type=install
+Source=%{src}/CMakeLists.txt.src
+Dest=%{dest}/src/CMakeLists.txt
+
+[FILE3]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE4]
+Type=install
+Source=%{src}/cmakeqt3app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/cmakeqt3app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE6]
+Type=install
+Source=%{src}/fileopen.xpm
+Dest=%{dest}/src/fileopen.xpm
+
+[FILE7]
+Type=install
+Source=%{src}/filesave.xpm
+Dest=%{dest}/src/filesave.xpm
+
+[FILE8]
+Type=install
+Source=%{src}/fileprint.xpm
+Dest=%{dest}/src/fileprint.xpm
+
+[CMAKE]
+Type=finishcmd
+Command=cmake ./ -GKDevelop3
+Directory=%{dest}
+
+[MSG]
+Type=message
+Comment=A CMake based Qt3 application was created in %{dest}
+Comment[ca]=Una aplicació Qt3 basada en CMake ha estat creada en %{dest}
+Comment[da]=Et CMake-baseret Qt3-program blev oprettet i %{dest}
+Comment[de]=Eine auf CMake basierende Qt3-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή Qt3 βασισμένη στο Qmake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación Qt3 basada en CMake ha sido creada en %{dest}
+Comment[et]=Qt3 rakendus CMake'i põhjal loodi asukohta %{dest}
+Comment[fr]=Une application Qt3 basée sur CMake a été créée dans %{dest}
+Comment[hu]=Létrejött egy CMake-alapú Qt3-alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Qt3 basata su CMake in %{dest}
+Comment[ja]=CMake ベース㮠Qt3 アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op CMake opbuut Qt3-Programm opstellt
+Comment[nl]=Een Cmake-gebaseerde Qt3-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program Qt3 oparty na CMake został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do Qt3 baseada no CMake em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do Qt3 baseada no CMake em %{dest}
+Comment[ru]=ИÑпользующее CMake приложение Qt 3 Ñоздано в %{dest}
+Comment[sk]=Qt3 aplikácia založená na CMake bola vytvorená v %{dest}
+Comment[sr]=Qt3 програм на оÑнову CMake-а направљен је у %{dest}
+Comment[sr@Latn]=Qt3 program na osnovu CMake-a napravljen je u %{dest}
+Comment[sv]=Ett CMake-baserat Qt3-program skapades i %{dest}
+Comment[zh_TW]=一個以 Cmake 為基礎的 Qt3 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.png b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.png
new file mode 100644
index 00000000..dda0a10b
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/cmakeqt3app.png
Binary files differ
diff --git a/languages/cpp/app_templates/cmakeqt3app/fileopen.xpm b/languages/cpp/app_templates/cmakeqt3app/fileopen.xpm
new file mode 100644
index 00000000..880417ee
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/languages/cpp/app_templates/cmakeqt3app/fileprint.xpm b/languages/cpp/app_templates/cmakeqt3app/fileprint.xpm
new file mode 100644
index 00000000..6ada912f
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/fileprint.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *fileprint[] = {
+" 16 14 6 1",
+". c #000000",
+"# c #848284",
+"a c #c6c3c6",
+"b c #ffff00",
+"c c #ffffff",
+"d c None",
+"ddddd.........dd",
+"dddd.cccccccc.dd",
+"dddd.c.....c.ddd",
+"ddd.cccccccc.ddd",
+"ddd.c.....c....d",
+"dd.cccccccc.a.a.",
+"d..........a.a..",
+".aaaaaaaaaa.a.a.",
+".............aa.",
+".aaaaaa###aa.a.d",
+".aaaaaabbbaa...d",
+".............a.d",
+"d.aaaaaaaaa.a.dd",
+"dd...........ddd"
+};
diff --git a/languages/cpp/app_templates/cmakeqt3app/filesave.xpm b/languages/cpp/app_templates/cmakeqt3app/filesave.xpm
new file mode 100644
index 00000000..bd6870f4
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/filesave.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *filesave[] = {
+" 14 14 4 1",
+". c #040404",
+"# c #808304",
+"a c #bfc2bf",
+"b c None",
+"..............",
+".#.aaaaaaaa.a.",
+".#.aaaaaaaa...",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".##........##.",
+".############.",
+".##.........#.",
+".##......aa.#.",
+".##......aa.#.",
+".##......aa.#.",
+"b............."
+};
diff --git a/languages/cpp/app_templates/cmakeqt3app/main.cpp b/languages/cpp/app_templates/cmakeqt3app/main.cpp
new file mode 100644
index 00000000..bd26f19a
--- /dev/null
+++ b/languages/cpp/app_templates/cmakeqt3app/main.cpp
@@ -0,0 +1,13 @@
+%{CPP_TEMPLATE}
+
+#include <qapplication.h>
+#include "%{APPNAMELC}.h"
+
+int main( int argc, char ** argv ) {
+ QApplication a( argc, argv );
+ %{APPNAME} * mw = new %{APPNAME}();
+ mw->setCaption( "%{APPNAME}" );
+ mw->show();
+ a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
+ return a.exec();
+}
diff --git a/languages/cpp/app_templates/cmakesimple/CMakeLists.txt b/languages/cpp/app_templates/cmakesimple/CMakeLists.txt
new file mode 100644
index 00000000..c8087165
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimple/CMakeLists.txt
@@ -0,0 +1,15 @@
+
+PROJECT(%{APPNAMELC})
+
+#if you don't want the full compiler output, remove the following line
+SET(CMAKE_VERBOSE_MAKEFILE ON)
+
+#add definitions, compiler switches, etc.
+ADD_DEFINITIONS(-Wall -O2)
+
+#list all source files here
+ADD_EXECUTABLE(%{APPNAMELC} main.cpp)
+
+#need to link to some other libraries ? just add them here
+#TARGET_LINK_LIBRARIES(%{APPNAMELC} png jpeg)
+
diff --git a/languages/cpp/app_templates/cmakesimple/Makefile.am b/languages/cpp/app_templates/cmakesimple/Makefile.am
new file mode 100644
index 00000000..243ed01d
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimple/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = main.cpp cmakesimple.png CMakeLists.txt README
+templateName = cmakesimple
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/cmakesimple/README b/languages/cpp/app_templates/cmakesimple/README
new file mode 100644
index 00000000..1a96a1e8
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimple/README
@@ -0,0 +1,30 @@
+-----------------------------------------------
+Simple C++ Hello World template based on cmake
+QStart
+Author: Anne-Marie Mahfouf
+Date: 2006-12-06
+-----------------------------------------------
+
+This README file explains you basic things for starting with
+this application template.
+
+-----------------------------------------------
+* REQUIREMENTS *
+- Qt version might be 3.3.4 or 3.3.5
+- kdelibs 3.5 and kdelibs headers 3.5 (devel package) in order to build this template.
+- cmake (http://www.cmake.org/) version 2.1 or 2.2 in your PATH
+-----------------------------------------------
+
+-----------------------------------------------
+* Building and running *
+- cmake will run after the template is loaded provided cmake is in your PATH. If not, you will see an error message in the terminal
+and you will need to install cmake in your PATH.
+- In the Build menu in KDevelop, click on Build Project (or use the F8 shortcut) in order to build your project.
+- Run your project using the Build menu -> Execute Program. Note that default makes your program run in KDevelop integrated terminal. You can run your program in an external terminal by changing the project options (Project -> Project Options -> Run options and check at the bottom "Start in external terminal")
+-----------------------------------------------
+
+-----------------------------------------------
+* Useful link *
+
+CMake Documentation: http://www.cmake.org/HTML/Documentation.html
+
diff --git a/languages/cpp/app_templates/cmakesimple/cmakesimple b/languages/cpp/app_templates/cmakesimple/cmakesimple
new file mode 100644
index 00000000..a0793d8f
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimple/cmakesimple
@@ -0,0 +1,7 @@
+# KDE Config File
+[General]
+Name=Hello world program
+Icon=cmakesimple.png
+Category=C++/CMake based projects
+Comment=Generates a simple Hello world program in C++ using the CMake build tool instead of the automake/autoconf/libtool combination. It requires cmake 2.1 (available from cmake cvs) or the upcoming cmake 2.2 release.
+ShowFilesAfterGeneration=main.cpp
diff --git a/languages/cpp/app_templates/cmakesimple/cmakesimple.kdevtemplate b/languages/cpp/app_templates/cmakesimple/cmakesimple.kdevtemplate
new file mode 100644
index 00000000..2e6032e8
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimple/cmakesimple.kdevtemplate
@@ -0,0 +1,112 @@
+# KDE Config File
+[General]
+Name=Hello world program
+Name[ca]=Programa Hello world
+Name[da]=Goddag verden program
+Name[de]="Hello World"-Programm
+Name[el]=ΠÏόγÏαμμα Γεια σου Κόσμε
+Name[es]=Programa «Hola mundo»
+Name[et]="Tere,maailm" programm
+Name[eu]="Kaixo mundua" programa
+Name[fa]=برنامۀ Hello world
+Name[fr]=Programme « Bonjour monde »
+Name[ga]=Ríomhchlár "Hello world"
+Name[gl]=Programa Ola mundo
+Name[it]=Programma di "Hello world"
+Name[ja]=Hello world プログラム
+Name[nds]="Moin Welt"-Programm
+Name[ne]=हेलà¥à¤¡à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Hello World-programma
+Name[pl]=Program 'Witaj świecie'
+Name[pt]=Programa 'Olá mundo'
+Name[pt_BR]=Programa 'Olá mundo'
+Name[ru]=Программа Hello world
+Name[sk]=Ahoj svet program
+Name[sl]=Program Hello world
+Name[sr]=Програм „Здраво Ñвете“
+Name[sr@Latn]=Program „Zdravo svete“
+Name[sv]=Hello world-program
+Name[tr]=Merhaba Dünya Programı
+Name[zh_CN]=Hello world 程åº
+Name[zh_TW]=Hello world 程å¼
+Icon=cmakesimple.png
+Category=C++/CMake based projects
+Comment=Generates a simple Hello world program in C++ using the CMake build tool instead of the automake/autoconf/libtool combination. It requires cmake 2.1 or cmake 2.2.
+Comment[ca]=Genera un simple programa de Hello world en C++ usant l'eina de construcció CMake en comptes de la combinació automake/autoconf/libtool. Requereix cmake 2.1 o cmake 2.2.
+Comment[da]=Genererer et simpelt Goddag verden program i C++ ved brug af CMake byggeværktøjet i stedet for automake/autoconf/libtool kombinationen. Det kræver cmake 2.1eller cmake 2.2.
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in C++. Der Kompiliervorgang wird mit CMake anstelle der Kombination automake/autoconf/libtool durchgeführt und erfordert CMake 2.1 (das über das CVS-Archiv von CMake verfügbar ist) oder die kommende Version 2.2 von CMake.
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα 'Γεια σου Κόσμε' σε C++, χÏησιμοποιώντας το εÏγαλείο κατασκευής CMake αντί του ÏƒÏ…Î½Î´Ï…Î±ÏƒÎ¼Î¿Ï automake/autoconf/libtool. ΧÏειάζεται το cmake 2.1 ή το cmake 2.2.
+Comment[es]=Genera un sencillo programa «Hola mundo» en C++ usando la herramienta CMake en lugar de la combinación automake/autoconf/libtool. Requiere cmake 2.1 o cmake 2.2.
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine C++-s. See kompileeritakse CMake'i ehitamistööriistaga, mitte automake/autoconf/libtool'i kombinatsiooniga. Selleks on vajalik CMake 2.1 või 2.2.
+Comment[fr]=Génère un programme « Bonjour monde » simple en C++ à l'aide de l'outil de construction CMake au lieu de la combinaison automake / autoconf / libtool. Nécessite cmake 2.1 (disponible sur le CVS de CMake) ou cmake 2.2.
+Comment[hu]=Létrehoz egy egyszerű 'Hello world' programot C++ nyelven a CMake segítségével (az automake/autoconf/libtool kombináció helyett). CMake 2.1 vagy 2.2 szükséges hozzá.
+Comment[it]=Genera un semplice programma di "Hello world" in C++ che usa CMake invece della combinazione automake/autoconf/libtool. Si richiede cmake 2.1 o la versione 2.2.
+Comment[ja]=ビルド㫠automake/autoconf/libtool ã§ã¯ãªã CMake を使ã£ãŸç°¡å˜ãª Hello World プログラムを C++ ã§ä½œæˆã—ã¾ã™ã€‚CMake 2.1 ã¾ãŸã¯ 2.2 ãŒå¿…è¦ã§ã™ã€‚
+Comment[nds]=Stellt en eenfach "Moin Welt"-Programm in C++ op, mit "CMake" ansteed vun de "automake/autoconf/libtool"-Reeg. Nödig is Verschoon 2.1 oder 2.2 vun CMake.
+Comment[nl]=Genereert een eenvoudig Hello World-programma in C++ met behulp van de CMake build tool in plaats van de combinatie automake/autoconf/libtool. Het vereist cmake 2.1 of cmake 2.2.
+Comment[pl]=Generuje prosty program 'Witaj świecie' w języku C++. Kompilacja odbywa sie za pomocą narzędzia CMake zamiast kombinacji automake/autoconf/libtool. Wymaga cmake w wersji 2.1 lub 2.2.
+Comment[pt]=Gera um programa simples Olá Mundo em C++, com a ferramenta CMake em vez da combinação automake/autoconf/libtool. Necessita do cmake 2.1 ou do cmake 2.2.
+Comment[pt_BR]=Gera um programa simples Olá Mundo em C++, com a ferramenta CMake em vez da combinação automake/autoconf/libtool. Necessita do cmake 2.1 ou do cmake 2.2.
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Hello world на C++. Ð”Ð»Ñ Ñборки потребуетÑÑ CMake вмеÑто комбинации automake/autoconf/libtool. ПотребуетÑÑ cmake верÑии 2.1 или 2.2.
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program v C++ s využitím nástroja CMake namiesto kombinácie automake/autoconf/libtool. Vyžaduje cmake 2.1 alebo cmake 2.2.
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм у C++-у кориÑтећи алат CMake умеÑто комбинације Automake/Autoconf/Libtool. Захтева CMake 2.1 или 2.2.
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program u C++-u koristeći alat CMake umesto kombinacije Automake/Autoconf/Libtool. Zahteva CMake 2.1 ili 2.2.
+Comment[sv]=Skapar ett enkelt Hello world-program i C++ med användning av byggverktyget CMake istället för kombinationen automake/autoconf/libtool. Det kräver cmake 2.1 eller cmake 2.2.
+Comment[zh_TW]=它產生一個簡單的 C++ Hello world 程å¼ã€‚它è¦ç”¨ CMake 建立工具來編譯,而ä¸æ˜¯ç”¨ automake/autoconf/libtool ç­‰ã€‚å®ƒéœ€è¦ cmake 2.1 或是 2.2 版以上。
+#FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/main.cpp,%{dest}/README
+Archive=cmakesimple.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/CMakeLists.txt
+Dest=%{dest}/CMakeLists.txt
+
+[FILE2]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/main.cpp
+
+[FILE3]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/README
+
+[CMAKE]
+Type=finishcmd
+Command=cmake ./ -GKDevelop3
+Directory=%{dest}
+
+[MSG]
+Type=message
+Comment=A CMake based hello world program was created in %{dest}
+Comment[ca]=Un programa de hello world basat en CMake ha estat creat en %{dest}
+Comment[da]=Et CMake-baseret Goddag verden program blev oprettet i %{dest}
+Comment[de]=Ein auf CMake basierendes "Hello World"-Programm wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€ÏόγÏαμμα Γεια σου Κόσμε βασισμένο στο CMake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un programa «Hola mundo» basado en CMake ha sido creado en %{dest}
+Comment[et]="Tere, maailm" programm CMake'i põhjal loodi asukohta %{dest}
+Comment[eu]=CMake-en oinarritutako "kaixo mundua" programa bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامۀ Hello World بر مبنای CMake در %{dest} ایجاد شد
+Comment[fr]=Un programme « Bonjour monde » basé sur CMake a été créé dans %{dest}
+Comment[ga]=Cruthaíodh ríomhchlár "Hello World" bunaithe ar CMake i %{dest}
+Comment[gl]=Creouse un programa Ola mundo baseado en CMake en %{dest}
+Comment[hu]=Létrejött egy CMake-alapú Hello world program itt: %{dest}
+Comment[it]=È stato creato un programma di "hello world" basato su CMake in %{dest}
+Comment[ja]=CMake ベース㮠hello world プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op CMake opbuut "Moin Welt"-Programm opstellt
+Comment[ne]=CMake आधारित हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een CMake-gebaseerd Hello World-programma is aangemaakt in %{dest}
+Comment[pl]=Używający CMake program 'Witaj świecie' został utworzony w %{dest}
+Comment[pt]=Foi criado um programa Olá Mundo baseado no CMake em %{dest}
+Comment[pt_BR]=Foi criado um programa Olá Mundo baseado no CMake em %{dest}
+Comment[ru]=ОÑнованное на CMake приложение Ñоздано в %{dest}
+Comment[sk]=Ahoj svet program založený na nástroji CMake bol vytvorený v %{dest}
+Comment[sl]=Program hello world na osnovi CMake je bil ustvarjen v %{dest}
+Comment[sr]=„Здраво Ñвете“ на оÑнову CMake-а направљен је у %{dest}
+Comment[sr@Latn]=„Zdravo svete“ na osnovu CMake-a napravljen je u %{dest}
+Comment[sv]=Ett CMake-baserat Hello world-program skapades i %{dest}
+Comment[tr]=Bir CMake tabanlı Merhaba Dünya programı %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个基于 CMake çš„ hello world 程åº
+Comment[zh_TW]=以 CMake 為基礎的 hello world 程å¼å·²å»ºç«‹åœ¨ %{dest}
diff --git a/languages/cpp/app_templates/cmakesimple/cmakesimple.png b/languages/cpp/app_templates/cmakesimple/cmakesimple.png
new file mode 100644
index 00000000..d1a90c3a
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimple/cmakesimple.png
Binary files differ
diff --git a/languages/cpp/app_templates/cmakesimple/main.cpp b/languages/cpp/app_templates/cmakesimple/main.cpp
new file mode 100644
index 00000000..296f9324
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimple/main.cpp
@@ -0,0 +1,14 @@
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+ printf("Hello, world!\n");
+
+ return EXIT_SUCCESS;
+}
diff --git a/languages/cpp/app_templates/cmakesimplec/CMakeLists.txt b/languages/cpp/app_templates/cmakesimplec/CMakeLists.txt
new file mode 100644
index 00000000..812fc007
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimplec/CMakeLists.txt
@@ -0,0 +1,14 @@
+PROJECT(%{APPNAMELC})
+
+#if you don't want the full compiler output, remove the following line
+SET(CMAKE_VERBOSE_MAKEFILE ON)
+
+#add definitions, compiler switches, etc.
+ADD_DEFINITIONS(-Wall -O2)
+
+#list all source files here
+ADD_EXECUTABLE(%{APPNAMELC} main.c)
+
+#need to link to some other libraries ? just add them here
+#TARGET_LINK_LIBRARIES(%{APPNAMELC} png jpeg)
+
diff --git a/languages/cpp/app_templates/cmakesimplec/Makefile.am b/languages/cpp/app_templates/cmakesimplec/Makefile.am
new file mode 100644
index 00000000..f5a1c3e7
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimplec/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = main.c cmakesimplec.png CMakeLists.txt
+templateName = cmakesimplec
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/cmakesimplec/cmakesimplec b/languages/cpp/app_templates/cmakesimplec/cmakesimplec
new file mode 100644
index 00000000..c0bc6fe2
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimplec/cmakesimplec
@@ -0,0 +1,7 @@
+# KDE Config File
+[General]
+Name=Hello world program
+Icon=cmakesimple.png
+Category=C/CMake based projects
+Comment=Generates a simple Hello world program in C using the CMake build tool instead of the automake/autoconf/libtool combination. It requires cmake 2.1 (available from cmake cvs) or the upcoming cmake 2.2 release.
+ShowFilesAfterGeneration=main.c
diff --git a/languages/cpp/app_templates/cmakesimplec/cmakesimplec.kdevtemplate b/languages/cpp/app_templates/cmakesimplec/cmakesimplec.kdevtemplate
new file mode 100644
index 00000000..3fc09047
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimplec/cmakesimplec.kdevtemplate
@@ -0,0 +1,115 @@
+# KDE Config File
+[General]
+Name=Hello world program
+Name[ca]=Programa Hello world
+Name[da]=Goddag verden program
+Name[de]="Hello World"-Programm
+Name[el]=ΠÏόγÏαμμα Γεια σου Κόσμε
+Name[es]=Programa «Hola mundo»
+Name[et]="Tere,maailm" programm
+Name[eu]="Kaixo mundua" programa
+Name[fa]=برنامۀ Hello world
+Name[fr]=Programme « Bonjour monde »
+Name[ga]=Ríomhchlár "Hello world"
+Name[gl]=Programa Ola mundo
+Name[it]=Programma di "Hello world"
+Name[ja]=Hello world プログラム
+Name[nds]="Moin Welt"-Programm
+Name[ne]=हेलà¥à¤¡à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Hello World-programma
+Name[pl]=Program 'Witaj świecie'
+Name[pt]=Programa 'Olá mundo'
+Name[pt_BR]=Programa 'Olá mundo'
+Name[ru]=Программа Hello world
+Name[sk]=Ahoj svet program
+Name[sl]=Program Hello world
+Name[sr]=Програм „Здраво Ñвете“
+Name[sr@Latn]=Program „Zdravo svete“
+Name[sv]=Hello world-program
+Name[tr]=Merhaba Dünya Programı
+Name[zh_CN]=Hello world 程åº
+Name[zh_TW]=Hello world 程å¼
+Icon=cmakesimplec.png
+Category=C/CMake based projects
+Comment=Generates a simple Hello world program in C using the CMake build tool instead of the automake/autoconf/libtool combination. It requires cmake 2.1 (available from cmake cvs) or the upcoming cmake 2.2 release.
+Comment[ca]=Genera un simple programa de Hello world en C usant l'eina de construcció CMake en comptes de la combinació automake/autoconf/libtool. Requereix cmake 2.1 (disponible en el cvs de cmake) o la propera versió 2.2.
+Comment[da]=Genererer et simpelt Goddag verden program i C ved brug af CMake byggeværktøjet i stedet for automake/autoconf/libtool kombinationen. Det kræver cmake 2.1 (tilgængelig fra cmake cvs) eller den fremtidige cmake 2.2 udgivelse.
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in C. Der Kompiliervorgang wird mit CMake anstelle der Kombination automake/autoconf/libtool durchgeführt und erfordert CMake 2.1 (das über das CVS-Archiv von CMake verfügbar ist) oder die kommende Version 2.2 von CMake.
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε σε C, χÏησιμοποιώντας το εÏγαλείο κατασκευής CMake στη θέση του ÏƒÏ…Î½Î´Ï…Î±ÏƒÎ¼Î¿Ï automake/autoconf/libtool. ΧÏειάζεται το cmake 2.1 (διαθέσιμο από το cmake cvs) ή την επεÏχόμενη έκδοση cmake 2.2.
+Comment[es]=Genera un sencillo programa «Hola mundo» en C usando la herramienta CMake en lugar de la combinación automake/autoconf/libtool. Requiere cmake 2.1 (disponible en el cvs de cmake) o la próxima cmake 2.2.
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine C-s. See kompileeritakse CMake'i ehitamistööriistaga, mitte automake/autoconf/libtool'i kombinatsiooniga. Selleks on vajalik CMake 2.1 (saadaval CMake'i CVSis) või peatne CMake'i versioon 2.2.
+Comment[eu]="Kaixo mundua" programa sinple bat sortzen du C lengoaian. CMake tresna erabiliz konpilatzen du automake/autoconf/libtool taldea erabili ordez. cmake 2.1 behar du (cmake cvs-an eskuragarri) edo hurrengo cmake 2.2.
+Comment[fa]=یک برنامۀ سادۀ Hello world در سی تولید می‌کند. با استÙاده از ابزار ساختن CMake به جای ترکیب automake/autoconf/libtoolØŒ ترجمه می‌کند.به cmake 2.1 دارد )از cmake cvs قابل دسترس است( یا نشر cmake 2.2 در آیندۀ نزدیک، نیاز دارد.
+Comment[fr]=Génère un programme « Bonjour monde » simple en C à l'aide de l'outil de construction CMake au lieu de la combinaison automake / autoconf / libtool. Nécessite cmake 2.1 (disponible sur le CVS de CMake) ou la version 2.2 de CMake à venir.
+Comment[ga]=Cruthaigh ríomhchlár simplí "Hello World" i C a thiomsaítear le huirlis tógála CMake in ionad automake/autoconf/libtool. Tá cmake 2.1 de dhíth (ar fáil ó cmake cvs) nó leagan 2.2 cmake atá le teacht.
+Comment[gl]=Xera un program sinxelo Ola mundo en C usando a ferramenta de compilación CMake no lugar da combinación automake/autoconf/libtool. Require cmake 2.1 (dispoñíbel no cvs de cmake) ou a próxima versión cmake 2.2.
+Comment[hu]=Létrehoz egy egyszerű Hello world programot C nyelven a CMake fordítóeszköz segítségével (az automake/autoconf/libtool kombináció helyett). CMake 2.1 (a CMake CVS-ben elérhető) vagy a rövidesen megjelenő CMake 2.2 szükséges hozzá.
+Comment[it]=Genera un semplice programma di "Hello world" in C che usa CMake invece della combinazione automake/autoconf/libtool. Si richiede cmake 2.1 (disponibile dal CVS di cmake) o la versione a venire cmake 2.2.
+Comment[ja]=ビルド㫠automake/autoconf/libtool ã§ã¯ãªã CMake を使ã£ãŸç°¡å˜ãª Hello World プログラムを C ã§ä½œæˆã—ã¾ã™ã€‚CMake 2.1 ã¾ãŸã¯ 2.2 ãŒå¿…è¦ã§ã™ã€‚
+Comment[nds]=Stellt en eenfach "Moin Welt"-Programm in C op mit "CMake" in de Verschoon 2.1 (ut dat cmake-CVS) oder 2.2 (de tokamen Utgaav) ansteed vun de "automake/autoconf/libtool"-Kombinatschoon.
+Comment[ne]= automake/autoconf/libtool संयोजनको सटà¥à¤Ÿà¤¾à¤®à¤¾ CMake निरà¥à¤®à¤¾à¤£ उपकरण पà¥à¤°à¤¯à¥‹à¤— गरेर C मा साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । यसलाई cmake 2.1 (cmake cvs बाट उपलबà¥à¤§ हà¥à¤¨à¥à¤›) वा आउदै गरेको cmake 2.2 उतà¥à¤ªà¤¾à¤¦à¤¨ आवशà¥à¤¯à¤• हà¥à¤¨à¥à¤› ।
+Comment[nl]=Genereert een eenvoudig Hello World-programma in C met behulp van de CMake build tool in plaats van de combinatie automake/autoconf/libtool. Het vereist cmake 2.1 (uit het cvs van cmake) of de aankomende cmake 2.2-uitgave.
+Comment[pl]=Generuje prosty program 'Witaj świecie' w języku C. Kompilacja odbywa sie za pomocą narzędzia CMake zamiast kombinacji automake/autoconf/libtool. Wymaga cmake 2.1 (dostępnego z cvs-u cmake) lub nadchodzącej wersji 2.2.
+Comment[pt]=Gera um programa simples Olá Mundo em C, com a ferramenta CMake em vez da combinação automake/autoconf/libtool. Necessita do cmake 2.1 (disponível no CVS do 'cmake') ou da próxima versão cmake 2.2.
+Comment[pt_BR]=Gera um programa simples Olá Mundo em C, com a ferramenta CMake em vez da combinação automake/autoconf/libtool. Necessita do cmake 2.1 (disponível no CVS do 'cmake') ou da próxima versão cmake 2.2.
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Hello world на C. Ð”Ð»Ñ Ñборки потребуетÑÑ CMake вмеÑто комбинации automake/autoconf/libtool. ПотребуетÑÑ cmake 2.1 (из CVS cmake) или релиз cmake 2.2.
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program v C s využitím nástrojaCMake namiesto kombinácie automake/autoconf/libtool.Vyžaduje cmake 2.1 (dostupné v cmake cvs) alebo nadchádzajúci cmake 2.2 release.
+Comment[sl]=Ustvari preprost program »Pozdravljen svet« v C. Za prevajanje se namesto kombinacije automake/autoconf/libtool uporabi orodje za gradnjo CMake. Potreben je CMake 2.1 ali CMake 2.2.
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм у C-у кориÑтећи алат CMake умеÑто комбинације Automake/Autoconf/Libtool. Захтева CMake 2.1 (доÑтупан у CVS-у CMake-а) или надолазеће издање CMake 2.2.
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program u C-u koristeći alat CMake umesto kombinacije Automake/Autoconf/Libtool. Zahteva CMake 2.1 (dostupan u CVS-u CMake-a) ili nadolazeće izdanje CMake 2.2.
+Comment[sv]=Skapar ett enkelt Hello world-program i C med användning av byggverktyget CMake istället för kombinationen automake/autoconf/libtool. Det kräver cmake 2.1 (tillgängligt från cmake CVS-arkiv) eller den förestående utgåvan av cmake 2.2.
+Comment[tr]=automake/autoconf/libtool birleşimi yerine CMake aracını kullanarak C'de basit bir Merhaba Dünya programı yaratır. cmake 2.1( cmake cvs'inden edinilebilir) veya yakında gelecek olan 2.2 sürümüne ihtiyaç duyar.
+Comment[zh_CN]=生æˆä¸€ä¸ª C çš„ Hello world 程åºã€‚该程åºä½¿ç”¨ CMake 编译工具编译,而ä¸æ˜¯ä½¿ç”¨ automake/autoconf/libtool 的组åˆã€‚该程åºéœ€è¦ cmake 2.1 (å¯ä»Ž cmake cvs 中获得)或å³å°†å‘布的 cmake 2.2 版本。
+Comment[zh_TW]=它產生一個簡單的 C çš„ Hello world 程å¼ã€‚它è¦ç”¨ CMake 建立工具來編譯,而ä¸æ˜¯ç”¨ automake/autoconf/libtool ç­‰ã€‚å®ƒéœ€è¦ cmake 2.1(å¯ä»¥å¾ž cmake cvs 中å–得),或是以後的版本。
+#FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/main.c
+Archive=cmakesimplec.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/CMakeLists.txt
+Dest=%{dest}/CMakeLists.txt
+
+[FILE2]
+Type=install
+Source=%{src}/main.c
+Dest=%{dest}/main.c
+
+[CMAKE]
+Type=finishcmd
+Command=cmake ./ -GKDevelop3
+Directory=%{dest}
+
+[MSG]
+Type=message
+Comment=A CMake based hello world program was created in %{dest}
+Comment[ca]=Un programa de hello world basat en CMake ha estat creat en %{dest}
+Comment[da]=Et CMake-baseret Goddag verden program blev oprettet i %{dest}
+Comment[de]=Ein auf CMake basierendes "Hello World"-Programm wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€ÏόγÏαμμα Γεια σου Κόσμε βασισμένο στο CMake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un programa «Hola mundo» basado en CMake ha sido creado en %{dest}
+Comment[et]="Tere, maailm" programm CMake'i põhjal loodi asukohta %{dest}
+Comment[eu]=CMake-en oinarritutako "kaixo mundua" programa bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامۀ Hello World بر مبنای CMake در %{dest} ایجاد شد
+Comment[fr]=Un programme « Bonjour monde » basé sur CMake a été créé dans %{dest}
+Comment[ga]=Cruthaíodh ríomhchlár "Hello World" bunaithe ar CMake i %{dest}
+Comment[gl]=Creouse un programa Ola mundo baseado en CMake en %{dest}
+Comment[hu]=Létrejött egy CMake-alapú Hello world program itt: %{dest}
+Comment[it]=È stato creato un programma di "hello world" basato su CMake in %{dest}
+Comment[ja]=CMake ベース㮠hello world プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op CMake opbuut "Moin Welt"-Programm opstellt
+Comment[ne]=CMake आधारित हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een CMake-gebaseerd Hello World-programma is aangemaakt in %{dest}
+Comment[pl]=Używający CMake program 'Witaj świecie' został utworzony w %{dest}
+Comment[pt]=Foi criado um programa Olá Mundo baseado no CMake em %{dest}
+Comment[pt_BR]=Foi criado um programa Olá Mundo baseado no CMake em %{dest}
+Comment[ru]=ОÑнованное на CMake приложение Ñоздано в %{dest}
+Comment[sk]=Ahoj svet program založený na nástroji CMake bol vytvorený v %{dest}
+Comment[sl]=Program hello world na osnovi CMake je bil ustvarjen v %{dest}
+Comment[sr]=„Здраво Ñвете“ на оÑнову CMake-а направљен је у %{dest}
+Comment[sr@Latn]=„Zdravo svete“ na osnovu CMake-a napravljen je u %{dest}
+Comment[sv]=Ett CMake-baserat Hello world-program skapades i %{dest}
+Comment[tr]=Bir CMake tabanlı Merhaba Dünya programı %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个基于 CMake çš„ hello world 程åº
+Comment[zh_TW]=以 CMake 為基礎的 hello world 程å¼å·²å»ºç«‹åœ¨ %{dest}
diff --git a/languages/cpp/app_templates/cmakesimplec/cmakesimplec.png b/languages/cpp/app_templates/cmakesimplec/cmakesimplec.png
new file mode 100644
index 00000000..158d3ce7
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimplec/cmakesimplec.png
Binary files differ
diff --git a/languages/cpp/app_templates/cmakesimplec/main.c b/languages/cpp/app_templates/cmakesimplec/main.c
new file mode 100644
index 00000000..296f9324
--- /dev/null
+++ b/languages/cpp/app_templates/cmakesimplec/main.c
@@ -0,0 +1,14 @@
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+ printf("Hello, world!\n");
+
+ return EXIT_SUCCESS;
+}
diff --git a/languages/cpp/app_templates/cpp.appwizard b/languages/cpp/app_templates/cpp.appwizard
new file mode 100644
index 00000000..dc233269
--- /dev/null
+++ b/languages/cpp/app_templates/cpp.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=opiemenu,win32hello,cppcurseshello,gtk2mmapp,opienet,wxhello,cpphello,opietoday,clanlib,cppsdlhello,qmakeapp,qt4hello,qt4makeapp,cmakelibcpp,opieapp,qmakesimple,cmakesimple,generichello,opieapplet,qtopiaapp,gnome2mmapp,opieinput,win32gui,cmakeqt3app,qmakeempty,automakeempty,makefileempty,qtopia4app
diff --git a/languages/cpp/app_templates/cppcurseshello/.kdev_ignore b/languages/cpp/app_templates/cppcurseshello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/.kdev_ignore
diff --git a/languages/cpp/app_templates/cppcurseshello/Makefile.am b/languages/cpp/app_templates/cppcurseshello/Makefile.am
new file mode 100644
index 00000000..3f6f64af
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = main.cpp src-Makefile.am cpp-Makefile.am cpp-Makefile.cvs\
+ app-configure.in app.kdevelop
+templateName = cppcurseshello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/cppcurseshello/app-configure.in b/languages/cpp/app_templates/cppcurseshello/app-configure.in
new file mode 100644
index 00000000..b7c83189
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/app-configure.in
@@ -0,0 +1,21 @@
+AC_INIT()
+AM_INIT_AUTOMAKE(%{APPNAMELC},%{VERSION})
+
+AC_PROG_CC
+AC_PROG_CXX
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+
+
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+
+AC_CHECK_HEADER([ncurses.h], [],
+ AC_MSG_ERROR([Couldn't find ncurses headers.]))
+
+AC_CHECK_LIB(ncurses, refresh, , AC_ERROR([Couldn't find ncurses library]), -lncurses, -ldl)
+
+AC_LANG_RESTORE
+
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/cpp/app_templates/cppcurseshello/app.kdevelop b/languages/cpp/app_templates/cppcurseshello/app.kdevelop
new file mode 100644
index 00000000..c7498e39
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/app.kdevelop
@@ -0,0 +1,105 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>true</terminal>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.h" name="Header files" />
+ <group pattern="*.cpp" name="Source files" />
+ </groups>
+ </kdevfileview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/cppcurseshello/cpp-Makefile.am b/languages/cpp/app_templates/cppcurseshello/cpp-Makefile.am
new file mode 100644
index 00000000..02520f20
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/cpp-Makefile.am
@@ -0,0 +1,5 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = src
diff --git a/languages/cpp/app_templates/cppcurseshello/cpp-Makefile.cvs b/languages/cpp/app_templates/cppcurseshello/cpp-Makefile.cvs
new file mode 100644
index 00000000..935cee02
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/cpp-Makefile.cvs
@@ -0,0 +1,7 @@
+default: all
+
+all:
+ aclocal
+ automake
+ autoconf
+
diff --git a/languages/cpp/app_templates/cppcurseshello/cppcurseshello b/languages/cpp/app_templates/cppcurseshello/cppcurseshello
new file mode 100644
index 00000000..40fa8bce
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/cppcurseshello
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=Simple ncurses Hello world program
+Name[de]=Einfaches ncurses Hallo-Welt Programm
+Icon=
+Category=C++
+Comment=Generates a simple ncurses based Hello world program in C++
+Comment[de]=Erstellt ein einfaches Hallo Welt programm für C++ basierend auf der ncurses Bibliothek
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/cppcurseshello/cppcurseshello.kdevtemplate b/languages/cpp/app_templates/cppcurseshello/cppcurseshello.kdevtemplate
new file mode 100644
index 00000000..451999a3
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/cppcurseshello.kdevtemplate
@@ -0,0 +1,143 @@
+# KDE Config File
+[General]
+Name=Simple ncurses Hello world program
+Name[ca]=Simple programa de Hello world per a ncurses
+Name[da]=Simpelt ncurses Goddag verden program
+Name[de]=Einfaches auf NCurses basierendes "Hello World"-Programm
+Name[el]=Απλό ncurses Ï€ÏόγÏαμμα Γεια σου κόσμε
+Name[es]=Programa «Hola mundo» sencillo en ncurses
+Name[et]=Lihtne "Tere, maailm" programm ncurses'i põhjal
+Name[eu]=ncurses-en oinarritako "Kaixo mundua" programa sinple bat
+Name[fa]=برنامۀ سادۀ ncurses Hello world
+Name[fr]=Programme « Bonjour monde » simple en ncurses
+Name[ga]=Ríomhchlár simplí "Hello World" le ncurses
+Name[gl]=Programa sinxelo ncurses Ola mundo
+Name[hu]=Egyszerű, Ncurses-alapú Hello world program
+Name[it]=Semplice programma "Hello world" realizzato con ncurses
+Name[ja]=ncurses を使ã£ãŸç°¡å˜ãª Hello World プログラム
+Name[nds]=Eenfach ncurses-"Moin Welt"-Programm
+Name[ne]=साधारण ncurses हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Een eenvoudig ncurses Hello World-programma
+Name[pl]=Prosty program 'Witaj świecie' używający ncurses
+Name[pt]=Programa simples Olá Mundo em ncurses
+Name[pt_BR]=Programa simples Olá Mundo em ncurses
+Name[ru]=ПроÑтое приложение Hello world на ncurses
+Name[sk]=Jednoduchý "Ahoj svet" ncurses program
+Name[sl]=Preprost program Hello world na osnovi ncurses
+Name[sr]=ЈедноÑтаван „Здраво Ñвете“ програм за ncurses
+Name[sr@Latn]=Jednostavan „Zdravo svete“ program za ncurses
+Name[sv]=Enkelt ncurses Hello world-program
+Name[tr]=Basit ncurses Merhaba Dünya programı
+Name[zh_CN]=简å•çš„ ncurses Hello world 程åº
+Name[zh_TW]=簡單的 ncurses Hello world 程å¼
+Icon=
+Category=C++
+Comment=Generates a simple ncurses based Hello world program in C++
+Comment[ca]=Genera un simple programa de Hello world en C++ i basat en ncurses
+Comment[da]=Genererer et simpelt ncurses baseret Goddag verden program in C++
+Comment[de]=Erstellt ein einfaches, auf NCurses basierendes "Hello World"-Programm in C++
+Comment[el]=ΔημιουÏγεί ένα απλό βασισμένο σε ncurses Ï€ÏόγÏαμμα Γεια σου κόσμε σε C++
+Comment[es]=Genera un sencillo programa «Hola mundo» en C++ basado en ncurses
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine ncurses'i põhjal C++-s
+Comment[eu]=ncurses-en oinarritako "Kaixo mundua" programa sinple bat C++ lengoaian
+Comment[fa]=یک برنامۀ سادۀ Hello world در C++ بر مبنای ncurses تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple basé sur ncurses en C++
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí "Hello World" bunaithe ar ncurses, i C++
+Comment[gl]=Xera un programa sinxelo Ola mundo baseado en ncurses en C++
+Comment[hu]=Létrehoz egy egyszerű, Ncurses-alapú Hello world programot C++-ban
+Comment[it]=Genera un semplice programma di "Hello world" in C++ realizzato con ncurses
+Comment[ja]=ncurses を使ã£ãŸç°¡å˜ãª Hello World プログラムを C++ ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach op "ncurses" opbuut "Moin Welt"-Programm in C++ op
+Comment[ne]=C++ मा हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® आधारित साधारण ncurses उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudig ncurses-gebaseerd Hello World-programma in C++
+Comment[pl]=Generuje prosty program 'Witaj świecie' używający ncurses i języka C++.
+Comment[pt]=Gera um programa simples Olá Mundo em C++, baseado no 'ncurses'
+Comment[pt_BR]=Gera um programa simples Olá Mundo em C++, baseado no 'ncurses'
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Hello world на ncurses и C++
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" ncurses program v C++
+Comment[sl]=Ustvari preprost program Hello world na osnovi ncurses v C++
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм на оÑнову ncurses, у C++-у
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program na osnovu ncurses, u C++-u
+Comment[sv]=Skapar ett enkelt ncurses-baserat Hello world-program i C++
+Comment[tr]=C++'da ncurses tabanlı basit bir Merhaba Dünya programı yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªåŸºäºŽ ncurses çš„ C++ Hello world 程åº
+Comment[zh_TW]=產生一個簡單的用 C++ 語言與 ncurses 函å¼åº«çš„ Hello world 程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=cppcurseshello.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/cpp-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/cpp-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE4]
+Type=install
+Source=%{src}/app-configure.in
+Dest=%{dest}/configure.in
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[MSG]
+Type=message
+Comment=A simple hello world program using ncurses was created in %{dest}
+Comment[ca]=Un simple programa de hello world usant ncurses ha estat creat en %{dest}
+Comment[da]=Et simpelt Goddag verden program ved brug af ncurses blev oprettet i %{dest}
+Comment[de]=Ein einfaches "Hello World"-Programm unter Verwendung von NCurses wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε χÏησιμοποιώντας το ncurses δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo programa «Hola mundo» que usa ncurses ha sido creado en %{dest}
+Comment[et]=Lihtne "Tere, maailm" programm ncurses'i põhjas loodi asukohta %{dest}
+Comment[eu]=ncurses-en oinarritako "Kaixo mundua" programa sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامۀ سادۀ hello world با استÙاده از ncurses در %{dest} ایجاد شد
+Comment[fr]=Un programme « Bonjour monde » simple utilisant ncurses a été créé dans %{dest}
+Comment[ga]=Cruthaíodh ríomhchlár simplí "Hello World" le ncurses i %{dest}
+Comment[gl]=Creouse un programa sinxelo ola mundo usando ncurses en in %{dest}
+Comment[hu]=Létrejött egy egyszerű, Ncurses-alapú Hello world program itt: %{dest}
+Comment[it]=È stato creato un programma di "hello world" che usa ncurses in %{dest}
+Comment[ja]=ncurses を使ã£ãŸç°¡å˜ãª Hello World プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach "Moin Welt"-Programm opstellt, dat "ncurses" bruukt
+Comment[ne]=ncurses पà¥à¤°à¤¯à¥‹à¤— गरेर à¤à¤‰à¤Ÿà¤¾ हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig Hallo Wereld-programma gebruikmakend van ncurses is aangemaakt in %{dest}
+Comment[pl]=Prosty program 'Witaj świecie' używający ncurses został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples Olá Mundo que usa o ncurses em %{dest}
+Comment[pt_BR]=Foi criado um programa simples Olá Mundo que usa o ncurses em %{dest}
+Comment[ru]=ПроÑтое приложение Hello world на ncurses Ñоздано в %{dest}
+Comment[sk]=Jednoduchý "Ahoj svet" ncurses program bol vytvorený v %{dest}
+Comment[sl]=Preprost program Hello world na osnovi ncurses je bil ustvarjen v %{dest}
+Comment[sr]=ЈедноÑтаван „Здраво Ñвете“ на оÑнову ncurses направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan „Zdravo svete“ na osnovu ncurses napravljen je u %{dest}
+Comment[sv]=Ett enkelt Hello world-program som använder ncurses skapades i %{dest}
+Comment[tr]=ncurses kullanan basit bir merhaba dünya programı %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了一个使用 ncurses çš„ hello world 程åº
+Comment[zh_TW]=一個簡單的使用 ncurses 函å¼åº«çš„ hello world 程å¼å·²å»ºç«‹åœ¨ %{dest}
diff --git a/languages/cpp/app_templates/cppcurseshello/cppcurseshello.png b/languages/cpp/app_templates/cppcurseshello/cppcurseshello.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/cppcurseshello.png
Binary files differ
diff --git a/languages/cpp/app_templates/cppcurseshello/main.cpp b/languages/cpp/app_templates/cppcurseshello/main.cpp
new file mode 100644
index 00000000..3e23a5df
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/main.cpp
@@ -0,0 +1,49 @@
+%{CPP_TEMPLATE}
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <ncurses.h>
+
+void create_box(int y, int x, int w, int h)
+{
+ mvaddch(y, x, '+');
+ mvaddch(y, x + w, '+');
+ mvaddch(y + h, x, '+');
+ mvaddch(y + h, x + w, '+');
+ mvhline(y, x + 1, '-', w - 1);
+ mvhline(y + h, x + 1, '-', w - 1);
+ mvvline(y + 1, x, '|', h - 1);
+ mvvline(y + 1, x + w, '|', h - 1);
+}
+
+int main()
+{
+ int startx, starty, height, width;
+
+ initscr();
+ start_color();
+ cbreak();
+ keypad(stdscr, TRUE);
+ noecho();
+
+ init_pair(1, COLOR_BLACK, COLOR_CYAN);
+
+ height = 2;
+ width = 30;
+ starty = (LINES - height)/2;
+ startx = (COLS - width)/2;
+
+ attron(COLOR_PAIR(1));
+
+ create_box(starty, startx, width, height);
+ mvprintw(starty, startx + 3, " Hello World! " );
+ mvprintw(starty+1,startx+1," Type any char to exit ");
+ mvprintw(0,0,"");
+ refresh();
+ getch();
+
+ endwin();
+ return 0;
+}
diff --git a/languages/cpp/app_templates/cppcurseshello/src-Makefile.am b/languages/cpp/app_templates/cppcurseshello/src-Makefile.am
new file mode 100644
index 00000000..23de27fb
--- /dev/null
+++ b/languages/cpp/app_templates/cppcurseshello/src-Makefile.am
@@ -0,0 +1,8 @@
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+# set the include path found by configure
+INCLUDES= $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries)
diff --git a/languages/cpp/app_templates/cpphello/.kdev_ignore b/languages/cpp/app_templates/cpphello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/.kdev_ignore
diff --git a/languages/cpp/app_templates/cpphello/Makefile.am b/languages/cpp/app_templates/cpphello/Makefile.am
new file mode 100644
index 00000000..49bd1b67
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = main.cpp src-Makefile.am cpp-Makefile.am cpp-Makefile.cvs \
+ configure.in cpphello.png app.kdevelop
+templateName = cpphello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/cpphello/app.kdevelop b/languages/cpp/app_templates/cpphello/app.kdevelop
new file mode 100644
index 00000000..c7498e39
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/app.kdevelop
@@ -0,0 +1,105 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>true</terminal>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.h" name="Header files" />
+ <group pattern="*.cpp" name="Source files" />
+ </groups>
+ </kdevfileview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/cpphello/configure.in b/languages/cpp/app_templates/cpphello/configure.in
new file mode 100644
index 00000000..612ce0d5
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/configure.in
@@ -0,0 +1,10 @@
+AC_INIT(configure.in)
+
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+
+AC_LANG_CPLUSPLUS
+AC_PROG_CXX
+AM_PROG_LIBTOOL
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/cpp/app_templates/cpphello/cpp-Makefile.am b/languages/cpp/app_templates/cpphello/cpp-Makefile.am
new file mode 100644
index 00000000..02520f20
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/cpp-Makefile.am
@@ -0,0 +1,5 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = src
diff --git a/languages/cpp/app_templates/cpphello/cpp-Makefile.cvs b/languages/cpp/app_templates/cpphello/cpp-Makefile.cvs
new file mode 100644
index 00000000..d1607023
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/cpp-Makefile.cvs
@@ -0,0 +1,8 @@
+default: all
+
+all:
+ aclocal
+ autoheader
+ automake
+ autoconf
+
diff --git a/languages/cpp/app_templates/cpphello/cpphello.kdevtemplate b/languages/cpp/app_templates/cpphello/cpphello.kdevtemplate
new file mode 100644
index 00000000..0b5b9367
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/cpphello.kdevtemplate
@@ -0,0 +1,145 @@
+# KDE Config File
+[General]
+Name=Simple Hello world program
+Name[ca]=Simple programa Hello world
+Name[da]=Simpelt Goddag verden program
+Name[de]=Ein einfaches "Hello World"-Programm
+Name[el]=Απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε
+Name[es]=Programa «Hola mundo» sencillo
+Name[et]=Lihtne "Tere, maailm" programm
+Name[eu]="Kaixo mundua" programa sinplea
+Name[fa]=برنامۀ سادۀ Hello world
+Name[fr]=Programme « Bonjour monde » simple
+Name[ga]=Ríomhchlár simplí "Hello World"
+Name[gl]=Programa sinxelo Ola mundo
+Name[hu]=Egyszerű Hello world program
+Name[it]=Semplice programma di "Hello world"
+Name[ja]=ç°¡å˜ãª Hello world プログラム
+Name[ms]=Program Hello World mudah
+Name[nds]=En eenfach "Moin Welt"-Programm
+Name[ne]=साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Eenvoudig 'Hello World' programma
+Name[pl]=Prosty program witaj świecie
+Name[pt]=Programa simples Olá Mundo
+Name[pt_BR]=Programa simples Olá Mundo
+Name[ru]=ПроÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Hello world
+Name[sk]=Jednoduchý "Ahoj svet" program
+Name[sl]=Preprost program Hello world
+Name[sr]=ЈедноÑтаван „Здраво Ñвете“ програм
+Name[sr@Latn]=Jednostavan „Zdravo svete“ program
+Name[sv]=Enkelt Hello world-program
+Name[tr]=Basit Merhaba dünya programı
+Name[zh_CN]=简å•çš„ Hello world 程åº
+Name[zh_TW]=簡單的 Hello world 程å¼
+Icon=cpphello.png
+Category=C++
+Comment=Generates a simple Hello world program in C++
+Comment[ca]=Genera un simple programa de Hello world en C++
+Comment[da]=Genererer et simpelt Goddag verden program in C++
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in C++
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε σε C++
+Comment[es]=Genera un sencillo programa «Hola mundo» en C++
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine C++-s
+Comment[eu]="Kaixo mundua" programa sinple bat sortzen du C++ lengoaian
+Comment[fa]=یک برنامۀ سادۀ Hello world در C++ تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en C++
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí "Hello World" i C++
+Comment[gl]=Xera un programa sinxelo Ola mundo en C++
+Comment[hu]=Létrehoz egy egyszerű Hello world programot C++-ban
+Comment[it]=Genera un semplice programma di "Hello world" in C++
+Comment[ja]=ç°¡å˜ãª Hello World プログラムを C++ ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach "Moin Welt"-Programm in C++ op
+Comment[ne]=C++ मा à¤à¤‰à¤Ÿà¤¾ साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudig Hello World-programma in C++
+Comment[pl]=Generuje prosty program 'Witaj świecie' w języku C++
+Comment[pt]=Gera um programa simples Olá Mundo em C++
+Comment[pt_BR]=Gera um programa simples Olá Mundo em C++
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Hello world на C++
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program v C++
+Comment[sl]=Ustvari preprost program Hello world v C++
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм у C++-у
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program u C++-u
+Comment[sv]=Skapar ett enkelt Hello world-program i C++
+Comment[tr]=C++'da basit bir Merhaba Dünya programı yaratır.
+Comment[zh_CN]=ç”Ÿæˆ C++ çš„ Hello world 程åº
+Comment[zh_TW]=產生一個簡單的 C++ çš„ Hello world 程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=cpphello.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/cpp-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/cpp-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE4]
+Type=install
+Source=%{src}/configure.in
+Dest=%{dest}/configure.in
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[MSG]
+Type=message
+Comment=A Simple Hello World program was created in %{dest}
+Comment[ca]=Un simple programa de Hello World ha estat creat en %{dest}
+Comment[da]=Et simpelt Goddag verden program blev oprettet i %{dest}
+Comment[de]=Ein einfaches "Hello World"-Programm wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo programa «Hola mundo» ha sido creado en %{dest}
+Comment[et]=Lihtne "Tere, maailm" programm loodi asukohta %{dest}
+Comment[eu]="Kaixo mundua" programa sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامۀ سادۀ Hello World در %{dest} ایجاد شد
+Comment[fr]=Un programme « Bonjour monde » simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh ríomhchlár simplí "Hello World" i %{dest}
+Comment[gl]=Creouse un programa sinxelo Ola mundo en %{dest}
+Comment[hu]=Létrejött egy egyszerű Hello world program itt: %{dest}
+Comment[it]=È stato creato un semplice programma di "Hello World" in %{dest}
+Comment[ja]=ç°¡å˜ãª Hello World プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach "Moin Welt"-Programm opstellt
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig Hello World-programma is aangemaakt in %{dest}
+Comment[pl]=Prosty program 'Witaj świecie' został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples Olá Mundo em %{dest}
+Comment[pt_BR]=Foi criado um programa simples Olá Mundo em %{dest}
+Comment[ru]=ПроÑтое приложение Hello world на C++ Ñоздано в %{dest}
+Comment[sk]=Jednoduchý "Ahoj svet" program bol vytvorený v %{dest}
+Comment[sl]=Preprost program Hello World je bil ustvarjen v %{dest}
+Comment[sr]=ЈедноÑтаван „Здраво Ñвете“ програм направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan „Zdravo svete“ program napravljen je u %{dest}
+Comment[sv]=Ett enkelt Hello world-program skapades i %{dest}
+Comment[tr]=Basit bir Merhaba Dünya programı %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了 Hello world 程åº
+Comment[zh_TW]=一個簡單的 Hello World 程å¼å·²å»ºç«‹æ–¼ %{dest}
+
diff --git a/languages/cpp/app_templates/cpphello/cpphello.png b/languages/cpp/app_templates/cpphello/cpphello.png
new file mode 100644
index 00000000..519c007b
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/cpphello.png
Binary files differ
diff --git a/languages/cpp/app_templates/cpphello/main.cpp b/languages/cpp/app_templates/cpphello/main.cpp
new file mode 100644
index 00000000..f97c8417
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/main.cpp
@@ -0,0 +1,17 @@
+%{CPP_TEMPLATE}
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+#include <cstdlib>
+
+using namespace std;
+
+int main(int argc, char *argv[])
+{
+ cout << "Hello, world!" << endl;
+
+ return EXIT_SUCCESS;
+}
diff --git a/languages/cpp/app_templates/cpphello/src-Makefile.am b/languages/cpp/app_templates/cpphello/src-Makefile.am
new file mode 100644
index 00000000..23de27fb
--- /dev/null
+++ b/languages/cpp/app_templates/cpphello/src-Makefile.am
@@ -0,0 +1,8 @@
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+# set the include path found by configure
+INCLUDES= $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries)
diff --git a/languages/cpp/app_templates/cppsdlhello/.kdev_ignore b/languages/cpp/app_templates/cppsdlhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/.kdev_ignore
diff --git a/languages/cpp/app_templates/cppsdlhello/Makefile.am b/languages/cpp/app_templates/cppsdlhello/Makefile.am
new file mode 100644
index 00000000..e17785a4
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = main.cpp src-Makefile.am cpp-Makefile.am cpp-Makefile.cvs configure.in cppsdlhello.png app.kdevelop acinclude.m4
+templateName = cppsdlhello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/cppsdlhello/README b/languages/cpp/app_templates/cppsdlhello/README
new file mode 100644
index 00000000..bc4e1d15
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/README
@@ -0,0 +1,11 @@
+This template configures KDevelop to be used with libSDL
+
+Got it working using this tutorial:
+http://www.geekcomix.com/snh/files/docs/sdl-kdev/sdl-kdev-mini-how2.html
+and not to forget -lSDL has to get passed to ld :)
+
+This was submitted via a whishlist:
+http://bugs.kde.org/show_bug.cgi?id=53702
+
+Thanks to: Mårten Woxberg < marwo264 (at) student.liu.se >
+For supplying this template.
diff --git a/languages/cpp/app_templates/cppsdlhello/acinclude.m4 b/languages/cpp/app_templates/cppsdlhello/acinclude.m4
new file mode 100644
index 00000000..9681a33a
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/acinclude.m4
@@ -0,0 +1,167 @@
+# Configure paths for SDLmm
+# David Hedbor, 2000-07-22
+# stolen from SDL
+# stolen from Manish Singh
+# stolen back from Frank Belew
+# stolen from Manish Singh
+# Shamelessly stolen from Owen Taylor
+
+dnl AM_PATH_SDLMM([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for SDLmm, and define SDLMM_CXXFLAGS and SDLMM_LIBS
+dnl
+AC_DEFUN(AM_PATH_SDLMM,
+[dnl
+dnl Get the cflags and libraries from the ismap-config script
+dnl
+AC_ARG_WITH(sdlmm-prefix,[ --with-sdlmm-prefix=PFX Prefix where SDLmm is installed (optional)],
+ sdlmm_prefix="$withval", sdlmm_prefix="")
+AC_ARG_WITH(sdlmm-exec-prefix,[ --with-sdlmm-exec-prefix=PFX Exec prefix where SDLmm is installed (optional)],
+ sdlmm_exec_prefix="$withval", sdlmm_exec_prefix="")
+AC_ARG_ENABLE(sdlmmtest, [ --disable-sdlmmtest Do not try to compile and run a test SDLmm program],
+ , enable_sdlmmtest=yes)
+
+ if test x$sdlmm_exec_prefix != x ; then
+ sdlmm_args="$sdlmm_args --exec-prefix=$sdlmm_exec_prefix"
+ if test x${SDLMM_CONFIG+set} != xset ; then
+ SDLMM_CONFIG=$sdlmm_exec_prefix/bin/sdlmm-config
+ fi
+ fi
+ if test x$sdlmm_prefix != x ; then
+ sdlmm_args="$sdlmm_args --prefix=$sdlmm_prefix"
+ if test x${SDLMM_CONFIG+set} != xset ; then
+ SDLMM_CONFIG=$sdlmm_prefix/bin/sdlmm-config
+ fi
+ fi
+
+ AC_PATH_PROG(SDLMM_CONFIG, sdlmm-config, no)
+ min_sdlmm_version=ifelse([$1], ,0.11.0,$1)
+ AC_MSG_CHECKING(for SDLmm version >= $min_sdlmm_version)
+ no_sdlmm=""
+ if test "$SDLMM_CONFIG" = "no" ; then
+ no_sdlmm=yes
+ else
+ SDLMM_CXXFLAGS=`$SDLMM_CONFIG $sdlmmconf_args --cflags`
+ SDLMM_LIBS=`$SDLMM_CONFIG $sdlmmconf_args --libs`
+
+ sdlmm_major_version=`$SDLMM_CONFIG $sdlmm_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ sdlmm_minor_version=`$SDLMM_CONFIG $sdlmm_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ sdlmm_micro_version=`$SDLMM_CONFIG $sdlmm_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_sdlmmtest" = "xyes" ; then
+ ac_save_CXXFLAGS="$CXXFLAGS"
+ ac_save_LIBS="$LIBS"
+ CXXFLAGS="$CXXFLAGS $SDLMM_CXXFLAGS"
+ LIBS="$LIBS $SDLMM_LIBS"
+dnl
+dnl Now check if the installed SDLmm is sufficiently new. (Also sanity
+dnl checks the results of sdlmm-config to some extent
+dnl
+ rm -f conf.sdlmmtest
+ AC_TRY_RUN([
+#include <cstdio>
+#include <cstring>
+#include "SDLmm/sdlmm.h"
+char*
+my_strdup (char *str)
+{
+ char *new_str;
+
+ if (str)
+ {
+ new_str = (char *)malloc ((std::strlen (str) + 1) * sizeof(char));
+ std::strcpy (new_str, str);
+ }
+ else
+ new_str = NULL;
+
+ return new_str;
+}
+
+int main (int argc, char *argv[])
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ /* This hangs on some systems (?)
+ system ("touch conf.sdlmmtest");
+ */
+ { FILE *fp = fopen("conf.sdlmmtest", "a"); if ( fp ) fclose(fp); }
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = my_strdup("$min_sdlmm_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_sdlmm_version");
+ return 1;
+ }
+
+ if (($sdlmm_major_version > major) ||
+ (($sdlmm_major_version == major) && ($sdlmm_minor_version > minor)) ||
+ (($sdlmm_major_version == major) && ($sdlmm_minor_version == minor) && ($sdlmm_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** 'sdlmm-config --version' returned %d.%d.%d, but the minimum version\n", $sdlmm_major_version, $sdlmm_minor_version, $sdlmm_micro_version);
+ printf("*** of SDLmm required is %d.%d.%d. If sdlmm-config is correct, then it is\n", major, minor, micro);
+ printf("*** best to upgrade to the required version.\n");
+ printf("*** If sdlmm-config was wrong, set the environment variable SDLMM_CONFIG\n");
+ printf("*** to point to the correct copy of sdlmm-config, and remove the file\n");
+ printf("*** config.cache before re-running configure\n");
+ return 1;
+ }
+}
+
+],, no_sdlmm=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CXXFLAGS="$ac_save_CXXFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_sdlmm" = x ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$SDLMM_CONFIG" = "no" ; then
+ echo "*** The sdlmm-config script installed by SDLmm could not be found"
+ echo "*** If SDLmm was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the SDLMM_CONFIG environment variable to the"
+ echo "*** full path to sdlmm-config."
+ else
+ if test -f conf.sdlmmtest ; then
+ :
+ else
+ echo "*** Could not run SDLmm test program, checking why..."
+ CXXFLAGS="$CXXFLAGS $SDLMM_CXXFLAGS"
+ LIBS="$LIBS $SDLMM_LIBS"
+ AC_TRY_LINK([
+#include <cstdio>
+#include "sdlmm.h"
+], [ return 0; ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding SDLmm or finding the wrong"
+ echo "*** version of SDLmm. If it is not finding SDLmm, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means SDLmm was incorrectly installed"
+ echo "*** or that you have moved SDLmm since it was installed. In the latter case, you"
+ echo "*** may want to edit the sdlmm-config script: $SDLMM_CONFIG" ])
+ CXXFLAGS="$ac_save_CXXFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ SDLMM_CXXFLAGS=""
+ SDLMM_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(SDLMM_CXXFLAGS)
+ AC_SUBST(SDLMM_LIBS)
+ rm -f conf.sdlmmtest
+])
diff --git a/languages/cpp/app_templates/cppsdlhello/app.kdevelop b/languages/cpp/app_templates/cppsdlhello/app.kdevelop
new file mode 100644
index 00000000..fadfbadc
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/app.kdevelop
@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>SDL</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>true</terminal>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ <configurations>
+ <default>
+ <ldflags>-lSDL</ldflags>
+ </default>
+ </configurations>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/cppsdlhello/configure.in b/languages/cpp/app_templates/cppsdlhello/configure.in
new file mode 100644
index 00000000..440c2e44
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/configure.in
@@ -0,0 +1,90 @@
+AC_INIT(configure.in)
+
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+
+AC_LANG_CPLUSPLUS
+AC_PROG_CXX
+AM_PROG_LIBTOOL
+
+dnl KDE_FIND_PATH(programm-name, variable-name, list of directories,
+dnl if-not-found, test-parameter)
+AC_DEFUN(KDE_FIND_PATH,
+[
+ AC_MSG_CHECKING([for $1])
+ if test -n "$$2"; then
+ kde_cv_path="$$2";
+ else
+ kde_cache=`echo $1 | sed 'y%./+-%__p_%'`
+
+ AC_CACHE_VAL(kde_cv_path_$kde_cache,
+ [
+ kde_cv_path="NONE"
+ dirs="$3"
+ kde_save_IFS=$IFS
+ IFS=':'
+ for dir in $PATH; do
+ dirs="$dirs $dir"
+ done
+ IFS=$kde_save_IFS
+
+ for dir in $dirs; do
+ if test -x "$dir/$1"; then
+ if test -n "$5"
+ then
+ evalstr="$dir/$1 $5 2>&1 "
+ if eval $evalstr; then
+ kde_cv_path="$dir/$1"
+ break
+ fi
+ else
+ kde_cv_path="$dir/$1"
+ break
+ fi
+ fi
+ done
+
+ eval "kde_cv_path_$kde_cache=$kde_cv_path"
+
+ ])
+
+ eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\""
+
+ fi
+
+ if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then
+ AC_MSG_RESULT(not found)
+ $4
+ else
+ AC_MSG_RESULT($kde_cv_path)
+ $2=$kde_cv_path
+
+ fi
+])
+
+KDE_FIND_PATH(sdl-config, LIBSDL_CONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/local/bin /opt/local/bin], [
+ AC_MSG_WARN([Could not find libsdl anywhere, check http://www.sdl.org])
+])
+
+if test -n "$LIBSDL_CONFIG"; then
+ LIBSDL_LIBS="`$LIBSDL_CONFIG --libs`"
+ LIBSDL_RPATH=
+ for args in $LIBSDL_LIBS; do
+ case $args in
+ -L*)
+ LIBSDL_RPATH="$LIBSDL_RPATH $args"
+ ;;
+ esac
+ done
+ LIBSDL_RPATH=`echo $LIBSDL_RPATH | sed -e "s/-L/-R/g"`
+ LIBSDL_CFLAGS="`$LIBSDL_CONFIG --cflags`"
+
+ AC_DEFINE_UNQUOTED(HAVE_LIBSDL, 1, [Defines if your system has the LIBSDL library])
+fi
+
+
+AC_SUBST(LIBSDL_LIBS)
+AC_SUBST(LIBSDL_CFLAGS)
+AC_SUBST(LIBSDL_RPATH)
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/cpp/app_templates/cppsdlhello/cpp-Makefile.am b/languages/cpp/app_templates/cppsdlhello/cpp-Makefile.am
new file mode 100644
index 00000000..02520f20
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/cpp-Makefile.am
@@ -0,0 +1,5 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = src
diff --git a/languages/cpp/app_templates/cppsdlhello/cpp-Makefile.cvs b/languages/cpp/app_templates/cppsdlhello/cpp-Makefile.cvs
new file mode 100644
index 00000000..d1607023
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/cpp-Makefile.cvs
@@ -0,0 +1,8 @@
+default: all
+
+all:
+ aclocal
+ autoheader
+ automake
+ autoconf
+
diff --git a/languages/cpp/app_templates/cppsdlhello/cppsdlhello b/languages/cpp/app_templates/cppsdlhello/cppsdlhello
new file mode 100644
index 00000000..fd64358b
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/cppsdlhello
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=Simple SDL program
+Name[fr]=Un simple programme avec SDL
+Icon=cppsdl.png
+Category=C++
+Comment=Generates a simple SDL program in C++
+Comment[fr]=Génère un simple programme de test avec la bibliothéque SDL dans le language C++.
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/cppsdlhello/cppsdlhello.kdevtemplate b/languages/cpp/app_templates/cppsdlhello/cppsdlhello.kdevtemplate
new file mode 100644
index 00000000..ec4e94b3
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/cppsdlhello.kdevtemplate
@@ -0,0 +1,150 @@
+# KDE Config File
+[General]
+Name=Simple SDL program
+Name[ca]=Simple programa per a SDL
+Name[da]=Simpelt SDL-program
+Name[de]=Einfaches SDL-Programm
+Name[el]=Απλό Ï€ÏόγÏαμμα SDL
+Name[es]=Programa SDL sencillo
+Name[et]=Lihtne SDL programm
+Name[eu]=SDL programa sinplea
+Name[fa]=برنامۀ سادۀ SDL
+Name[fr]=Programme SDL simple
+Name[ga]=Ríomhchlár simplí SDL
+Name[gl]=Programa sinxelo SDL
+Name[hu]=Egyszerű SDL-alkalmazás
+Name[it]=Semplice programma SDL
+Name[ja]=ç°¡å˜ãª SDL プログラム
+Name[nds]=Eenfach SDL-Programm
+Name[ne]=साधारण SDL कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Eenvoudig SDL-programma
+Name[pl]=Prosty program używający SDL
+Name[pt]=Programa simples do SDL
+Name[pt_BR]=Programa simples do SDL
+Name[ru]=ПроÑтое приложение SDL
+Name[sk]=Jednoduchý SDL program
+Name[sl]=Preprost program SDL
+Name[sr]=ЈедноÑтаван SDL програм
+Name[sr@Latn]=Jednostavan SDL program
+Name[sv]=Enkelt SDL-program
+Name[tg]=БарноманавиÑии SDL
+Name[tr]=Basit bir SDL Programı
+Name[zh_CN]=简å•çš„ SDL 程åº
+Name[zh_TW]=簡單的 SDL 程å¼
+Icon=cppsdl.png
+Category=C++
+Comment=Generates a simple SDL program in C++
+Comment[ca]=Genera un simple programa en SDL en C++
+Comment[da]=Genererer et simpelt SDL program i C++
+Comment[de]=Erstellt ein einfaches SDL-Programm in C++
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα SDL σε C++
+Comment[es]=Genera un sencillo programa SDL en C++
+Comment[et]=Lihtsa SDL programmi loomise C++-s
+Comment[eu]=SDL programa sinple bat sortzen du C++ lengoaian
+Comment[fa]=یک برنامۀ سادۀ SDL در C++ تولید می‌کند
+Comment[fr]=Génère un programme SDL simple en C++
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí SDL i C++
+Comment[gl]=Xera un programa sinxelo SDL en C++
+Comment[hu]=Létrehoz egy egyszerű SDL-alkalmazást C++-ban
+Comment[it]=Genera un semplice programma SDL in C++
+Comment[ja]=ç°¡å˜ãª SDL プログラムを C++ ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach SDL-Programm in C++ op
+Comment[ne]= C++ मा साधारण SDL कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudig SDL-programma in C++
+Comment[pl]=Generuje prosty program używający SDL w C++
+Comment[pt]=Gera um programa simples de SDL em C++
+Comment[pt_BR]=Gera um programa simples de SDL em C++
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ SDL на C++
+Comment[sk]=Vygeneruje jednoduchý SDL program v C++
+Comment[sl]=Ustvari preprost program SDL v C++
+Comment[sr]=Прави једноÑтаван SDL програм у C++-у
+Comment[sr@Latn]=Pravi jednostavan SDL program u C++-u
+Comment[sv]=Skapar ett enkelt SDL-program i C++
+Comment[tr]=C++'da basit bir SDL programı yaratır
+Comment[zh_CN]=ç”Ÿæˆ C++ çš„ç®€å• SDL 程åº
+Comment[zh_TW]=產生一個簡單的 C++ SDL 程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=cppsdlhello.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/cpp-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/cpp-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE4]
+Type=install
+Source=%{src}/configure.in
+Dest=%{dest}/configure.in
+
+[FILE5]
+Type=install
+Source=%{src}/acinclude.m4
+Dest=%{dest}/acinclude.m4
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE6]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+
+[MSG]
+Type=message
+Comment=A simple SDL program was created in %{dest}
+Comment[ca]=Un simple programa en SDL ha estat creat en %{dest}
+Comment[da]=Et simpelt SDL-program blev oprettet i %{dest}
+Comment[de]=Ein einfaches SDL-Programm wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό Ï€ÏόγÏαμμα SDL δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo programa SDL ha sido creado en %{dest}
+Comment[et]=Lihtne SDL programm loodi asukohta %{dest}
+Comment[eu]=SDL programa sinple bat soru da hemen: %{dest}
+Comment[fa]=یک برنامۀ سادۀ SDL در %{dest} ایجاد شد
+Comment[fr]=Un programme SDL simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh ríomhchlár simplí SDL i %{dest}
+Comment[gl]=Creouse un programa sinxelo SDL en %{dest}
+Comment[hu]=Létrejött egy egyszerű SDL-alkalmazás itt: %{dest}
+Comment[it]=È stato creato un semplice programma SDL in %{dest}
+Comment[ja]=ç°¡å˜ãª SDL プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach SDL-Programm opstellt
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण SDL कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig SDL-programma is aangemaakt in %{dest}
+Comment[pl]=Prosty program używający SDL został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação simples em SDL em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação simples em SDL em %{dest}
+Comment[ru]=ПроÑтое приложение SDL Ñоздано в %{dest}
+Comment[sk]=Jednoduchý SDL program bol vytvorený v %{dest}
+Comment[sl]=Preprost program SDL je bil ustvarjen v %{dest}
+Comment[sr]=ЈедноÑтаван SDL програм направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan SDL program napravljen je u %{dest}
+Comment[sv]=Ett enkelt SDL-program skapades i %{dest}
+Comment[tr]=Basit bir SDL programı %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了简å•çš„ SDL 程åº
+Comment[zh_TW]=一個簡單的 SDL 程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/cppsdlhello/cppsdlhello.png b/languages/cpp/app_templates/cppsdlhello/cppsdlhello.png
new file mode 100644
index 00000000..888d4f13
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/cppsdlhello.png
Binary files differ
diff --git a/languages/cpp/app_templates/cppsdlhello/main.cpp b/languages/cpp/app_templates/cppsdlhello/main.cpp
new file mode 100644
index 00000000..89e3ba30
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/main.cpp
@@ -0,0 +1,29 @@
+%{CPP_TEMPLATE}
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+#include <stdlib.h>
+#include "SDL.h"
+
+using namespace std;
+
+int main(int argc, char *argv[])
+{
+ cout <<"Initializing SDL." << endl;
+ /* Initializes Audio and the CDROM, add SDL_INIT_VIDEO for Video */
+ if(SDL_Init(SDL_INIT_AUDIO | SDL_INIT_CDROM)< 0) {
+ cout <<"Could not initialize SDL:" << SDL_GetError() << endl;
+ SDL_Quit();
+ } else {
+ cout << "Audio & CDROM initialized correctly" << endl;;
+ /* Trying to read number of CD devices on system */
+ cout << "Drives available :" << SDL_CDNumDrives() << endl;
+ for(int i=0; i < SDL_CDNumDrives(); ++i) {
+ cout << "Drive " << i << "\"" << SDL_CDName(i) << "\"";
+ }
+ }
+ SDL_Quit();
+}
diff --git a/languages/cpp/app_templates/cppsdlhello/src-Makefile.am b/languages/cpp/app_templates/cppsdlhello/src-Makefile.am
new file mode 100644
index 00000000..3f9fd8bf
--- /dev/null
+++ b/languages/cpp/app_templates/cppsdlhello/src-Makefile.am
@@ -0,0 +1,9 @@
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+# set the include path found by configure
+AM_CPPFLAGS = $(LIBSDL_CFLAGS) $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries) $(LIBSDL_RPATH)
+%{APPNAMELC}_LDADD = $(LIBSDL_LIBS)
diff --git a/languages/cpp/app_templates/dcopservice/.kdev_ignore b/languages/cpp/app_templates/dcopservice/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/.kdev_ignore
diff --git a/languages/cpp/app_templates/dcopservice/Makefile.am b/languages/cpp/app_templates/dcopservice/Makefile.am
new file mode 100644
index 00000000..00875115
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = dcopservice.desktop dcopservice.png dcopservice.h \
+ src-Makefile.am main.cpp dcopservice.cpp dcopservice.kdevelop \
+ subdirs
+templateName = dcopservice
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/dcopservice/dcopservice b/languages/cpp/app_templates/dcopservice/dcopservice
new file mode 100644
index 00000000..ff62f5ab
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/dcopservice
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=KDE DCOP Service
+Name[fr]=Un service DCOP pour KDE
+Icon=kdcop.png
+Category=C++/KDE
+Comment=Generates a framework for a KDE dcop service and client access library.
+Comment[fr]=Génère un squelette de programme pour la gestion d'un service DCOP pour KDE et un programme d'accés au bibliothéque.
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/dcopservice/dcopservice.cpp b/languages/cpp/app_templates/dcopservice/dcopservice.cpp
new file mode 100644
index 00000000..a23da01b
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/dcopservice.cpp
@@ -0,0 +1,49 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include <kdebug.h>
+#include <kapplication.h>
+
+%{APPNAME}::%{APPNAME}() : DCOPObject("serviceInterface")
+{
+ kdDebug() << "Starting new service... " << endl;
+ m_List = QStringList();
+}
+
+%{APPNAME}::~%{APPNAME}()
+{
+ kdDebug() << "Going away... " << endl;
+}
+
+QString %{APPNAME}::string(int idx)
+{
+ return *m_List.at(idx);
+}
+
+QStringList %{APPNAME}::list()
+{
+ return m_List;
+}
+
+void %{APPNAME}::add(QString arg)
+{
+ kdDebug() << "Adding " << arg << " to the list" << endl;
+ m_List << arg;
+}
+
+bool %{APPNAME}::remove(QString arg)
+{
+ QStringList::Iterator it = m_List.find(arg);
+ if (it != m_List.end())
+ {
+ m_List.remove(it);
+ }
+ else
+ return false;
+ return true;
+}
+
+bool %{APPNAME}::exit()
+{
+ kapp->quit();
+}
diff --git a/languages/cpp/app_templates/dcopservice/dcopservice.desktop b/languages/cpp/app_templates/dcopservice/dcopservice.desktop
new file mode 100644
index 00000000..2ee5220f
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/dcopservice.desktop
@@ -0,0 +1,43 @@
+[Desktop Entry]
+Type=Service
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+X-DCOP-ServiceType=Unique
+X-KDE-StartupNotify=false
+Comment=Template for dcop services
+Comment[br]=Patrom evit servijoù dcop
+Comment[ca]=Plantilla per als serveis dcop
+Comment[cy]=Patrymlun ar gyfer gwasanaethau dcop
+Comment[da]=Skabelon for DCOP-tjenester
+Comment[de]=Vorlage für DCOP-Dienste
+Comment[el]=ΠÏότυπο για υπηÏεσίες dcop
+Comment[es]=Plantilla para servicios DCOP
+Comment[et]=DCOP-teenuste mall
+Comment[eu]=DCOP zerbitzuentzako plantilla
+Comment[fa]=قالب برای خدمات dcop
+Comment[fr]=Modèle pour les services DCOP
+Comment[ga]=Teimpléad i gcomhair seirbhísí DCOP
+Comment[gl]=Modelo para servizos dcop
+Comment[hi]=डीसीओपी सेवाओं के लिठटेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ
+Comment[hu]=Sablon DCOP-szolgáltatásokhoz
+Comment[is]=Snið fyrir dcop þjónustur
+Comment[it]=Modello per servizi dcop
+Comment[ja]=dcop サービスã®ãŸã‚ã®ãƒ†ãƒ³ãƒ—レート
+Comment[nds]=Vörlaag för DCOP-Deensten
+Comment[ne]=dcop सेवाका लागि टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ
+Comment[nl]=Sjabloon voor DCOP-services
+Comment[pl]=Szablon dla usług dcop
+Comment[pt]=Modelo para serviços dcop
+Comment[pt_BR]=Modelo para serviços dcop
+Comment[ru]=Шаблон Ð´Ð»Ñ ÑервиÑов DCOP
+Comment[sk]=Šablóna pre DCOP služby
+Comment[sl]=Predloga za storitve DCOP
+Comment[sr]=Шаблон за dcop ÑервиÑе
+Comment[sr@Latn]=Å ablon za dcop servise
+Comment[sv]=Mall för DCOP-tjänster
+Comment[ta]=டிகாபà¯à®šà¯‡à®µà¯ˆà®•à¯à®•à®¾à®© மாதரி உரà¯
+Comment[tg]=Қолиб барои хидмадгори DCOP
+Comment[tr]=dcop hizmetleri için şablon
+Comment[zh_CN]=dcop æœåŠ¡æ¨¡æ¿
+Comment[zh_TW]=DCOP æœå‹™æ¨£æœ¬
+
diff --git a/languages/cpp/app_templates/dcopservice/dcopservice.h b/languages/cpp/app_templates/dcopservice/dcopservice.h
new file mode 100644
index 00000000..4e9eda87
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/dcopservice.h
@@ -0,0 +1,35 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAME}_H
+#define _%{APPNAME}_H
+
+#include <qstringlist.h>
+#include <qstring.h>
+#include <dcopobject.h>
+
+class %{APPNAME} : public DCOPObject
+{
+ K_DCOP
+
+ private:
+ QStringList m_List;
+
+ public:
+ %{APPNAME}();
+
+ ~%{APPNAME}();
+
+ k_dcop:
+ QString string(int);
+
+ QStringList list();
+
+ void add(QString);
+
+ bool remove(QString);
+
+ bool exit();
+
+
+};
+#endif
diff --git a/languages/cpp/app_templates/dcopservice/dcopservice.kdevelop b/languages/cpp/app_templates/dcopservice/dcopservice.kdevelop
new file mode 100644
index 00000000..22681e00
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/dcopservice.kdevelop
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>kioslave</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+ <kdevautoproject>
+ <general>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/dcopservice/dcopservice.kdevtemplate b/languages/cpp/app_templates/dcopservice/dcopservice.kdevtemplate
new file mode 100644
index 00000000..dd950d6d
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/dcopservice.kdevtemplate
@@ -0,0 +1,202 @@
+# KDE Config File
+[General]
+Name=KDE DCOP Service
+Name[br]=Servij DCOP KDE
+Name[ca]=Servei DCOP per al KDE
+Name[da]=KDE DCOP-service
+Name[de]=KDE-DCOP-Dienst
+Name[el]=ΥπηÏεσία KDE DCOP
+Name[es]=Servicio DCOP de KDE
+Name[et]=KDE DCOP-teenus
+Name[eu]=KDE-ren DCOP zerbitzua
+Name[fa]=خدمت KDE DCOP
+Name[fr]=Service DCOP KDE
+Name[ga]=Seirbhís DCOP KDE
+Name[gl]=Servicio DCOP de KDE
+Name[hu]=KDE DCOP-szolgáltatás
+Name[it]=Servizio DCOP di KDE
+Name[ja]=KDE DCOP サービス
+Name[nds]=KDE-DCOP-Deenst
+Name[ne]=KDE DCOP सेवा
+Name[nl]=KDE DCOP-service
+Name[pl]=Usługa KDE DCOP
+Name[pt]=Serviço de DCOP do KDE
+Name[pt_BR]=Serviço de DCOP do KDE
+Name[ru]=Ð¡ÐµÑ€Ð²Ð¸Ñ DCOP
+Name[sk]=KDE DCOP služba
+Name[sl]=Storitev DCOP za KDE
+Name[sr]=KDE DCOP ÑервиÑ
+Name[sr@Latn]=KDE DCOP servis
+Name[sv]=KDE:s DCOP-tjänst
+Name[tg]=Хизмати KDE DCOP
+Name[tr]=KDE DCOP Hizmeti
+Name[zh_CN]=KDE DCOP æœåŠ¡
+Name[zh_TW]=KDE DCOP æœå‹™
+Icon=kdcop.png
+Category=C++/KDE
+Comment=Generates a framework for a KDE DCOP service and client access library.
+Comment[ca]=Genera una infraestructura per a un servei DCOP de KDE i la biblioteca d'accés del client.
+Comment[da]=Genererer et skelet for en KDE dcop-tjeneste og klientadgangsbibliotek.
+Comment[de]=Erstellt das Grundgerüst für einen KDE-DCOP-Dienst und eine Bibliothek für den Client-Zugriff.
+Comment[el]=ΔημιουÏγεί ένα πλαίσιο για μια υπηÏεσία KDE DCOP και μια βιβλιοθήκη Ï€Ïόσβασης πελάτη.
+Comment[es]=Genera una infraestructura para un servicio DCOP de KDE y una biblioteca de acceso cliente.
+Comment[et]=KDE DCOP-teenuse raamistiku ja kliendi ligipääsu teegi loomine.
+Comment[eu]=KDE-ren DCOP zerbitzu baterako lan-marko bat eta bezero liburutegi bat sortzen ditu.
+Comment[fa]=چارچوبی برای خدمت KDE DCOP و کتابخانۀ دستیابی کارخواه تولید می‌کند.
+Comment[fr]=Génère une infrastructure pour un service DCOP KDE et une bibliothèque d'accès client.
+Comment[ga]=Cruthaigh creatlach do sheirbhís DCOP KDE agus leabharlann rochtana cliaint.
+Comment[gl]=Xera un contorno de traballo para un servizo DCOP de KDE e unha biblioteca de acceso para clientes.
+Comment[hu]=Létrehoz egy alap KDE DCOP-szolgáltatást és klienselérési programkönyvtárat.
+Comment[it]=Genera l'infrastruttura per un servizio DCOP di KDE e una libreria per l'accesso da client.
+Comment[ja]=KDE DCOP サービスã¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚¢ã‚¯ã‚»ã‚¹ãƒ©ã‚¤ãƒ–ラリã®ãŸã‚ã®ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã‚’作æˆã—ã¾ã™
+Comment[nds]=Stellt en Rahmenwark för en KDE-DCOP-Deenst un en Clienttogriep-Bibliotheek op.
+Comment[ne]=KDE DCOP सेवा र गà¥à¤°à¤¾à¤¹à¤• पहà¥à¤à¤š लाइबà¥à¤°à¥‡à¤°à¥€à¤•à¤¾ लागि फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een framework voor een KDE DCOP-service- en client-bibliotheek.
+Comment[pl]=Generuje schemat dla usługi KDE DCOP i biblioteki dostępu użytkownika.
+Comment[pt]=Gera a plataforma para um serviço de DCOP do KDE e a biblioteca de acesso dos clientes.
+Comment[pt_BR]=Gera a plataforma para um serviço de DCOP do KDE e a biblioteca de acesso dos clientes.
+Comment[ru]=Создание ÑервиÑа DCOP и библиотеки клиента.
+Comment[sk]=Vygeneruje framework pre KDE DCOP službu a klientskú prístupovú knižnicu.
+Comment[sr]=Прави једноÑтаван радни оквир за KDE DCOP ÑÐµÑ€Ð²Ð¸Ñ Ð¸ приÑтупну библиотеку клијента.
+Comment[sr@Latn]=Pravi jednostavan radni okvir za KDE DCOP servis i pristupnu biblioteku klijenta.
+Comment[sv]=Skapar ett ramverk för en KDE DCOP-tjänst och klientåtkomstbibliotek.
+Comment[tr]=Bir KDE DCOP hizmeti ve istemci erişim kütüphanesi için bir çatı yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ª KDE DCOP æœåŠ¡å’Œå®¢æˆ·è®¿é—®åº“的框架。
+Comment[zh_TW]=產生一個 KDE DCOP æœå‹™çš„架構,以åŠå®¢æˆ¶ç«¯å­˜å–的函å¼åº«ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=dcopservice.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/dcopservice.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/dcopservice.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/dcopservice.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE14]
+Type=install
+Source=%{src}/dcopservice.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE15]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[MSG]
+Type=message
+Comment=A KDE DCOP Service was created in %{dest}
+Comment[ca]=Un servei DCOP de KDE ha estat creada en %{dest}
+Comment[da]=En KDE DCOP tjeneste blev oprettet i %{dest}
+Comment[de]=Ein KDE-DCOP-Dienst wurde in %{dest} erstellt.
+Comment[el]=Μια υπηÏεσία KDE DCOP δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un servicio DCOP de KDE ha sido creado en %{dest}
+Comment[et]=KDE DCOP-teenus loodi asukohta %{dest}
+Comment[eu]=KDE-ren DCOP zerbitzu bat sortu da hemen: %{dest}
+Comment[fa]=یک خدمت KDE DCOP در %{dest} ایجاد شد
+Comment[fr]=Un service DCOP KDE a été créé dans %{dest}
+Comment[ga]=Cruthaíodh Seirbhís DCOP KDE i %{dest}
+Comment[gl]=Creouse un servizo DCOP de KDE en %{dest}
+Comment[hu]=Létrejött egy KDE DCOP-szolgáltatás itt: %{dest}
+Comment[it]=È stato creato un servizio DCOP di KDE in %{dest}
+Comment[ja]=KDE DCOP サービスを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KDE-DCOP-Deenst opstellt
+Comment[ne]=KDE DCOP सेवा %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een DCOP-service is aangemaakt in %{dest}
+Comment[pl]=Usługa KDE DCOP została utworzona w %{dest}
+Comment[pt]=Foi criado um serviço de DCOP do KDE em %{dest}
+Comment[pt_BR]=Foi criado um serviço de DCOP do KDE em %{dest}
+Comment[ru]=Ð¡ÐµÑ€Ð²Ð¸Ñ DCOP Ñоздан в %{dest}
+Comment[sk]=KDE DCOP služba bola vytvorená v %{dest}
+Comment[sl]=Storitev DCOP za KDE je bila ustvarjena v %{dest}
+Comment[sr]=KDE DCOP ÑÐµÑ€Ð²Ð¸Ñ Ð½Ð°Ð¿Ñ€Ð°Ð²Ñ™ÐµÐ½ је у %{dest}
+Comment[sr@Latn]=KDE DCOP servis napravljen je u %{dest}
+Comment[sv]=En KDE DCOP-tjänst skapades i %{dest}
+Comment[tr]=Bir KDE DCOP Hizmeti %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了一个 KDE DCOP æœåŠ¡
+Comment[zh_TW]=KDE DCOP æœå‹™å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/dcopservice/dcopservice.png b/languages/cpp/app_templates/dcopservice/dcopservice.png
new file mode 100644
index 00000000..2cb4f1f3
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/dcopservice.png
Binary files differ
diff --git a/languages/cpp/app_templates/dcopservice/main.cpp b/languages/cpp/app_templates/dcopservice/main.cpp
new file mode 100644
index 00000000..55509560
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/main.cpp
@@ -0,0 +1,47 @@
+%{CPP_TEMPLATE}
+
+#include <kuniqueapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <dcopclient.h>
+#include "%{APPNAMELC}.h"
+
+static const char description[] =
+ I18N_NOOP("A KDE KPart Application");
+
+static const char version[] = "0.1";
+
+static KCmdLineOptions options[] =
+{
+ KCmdLineLastOption
+};
+
+int main (int argc, char *argv[])
+{
+ KLocale::setMainCatalogue("kdelibs");
+ KAboutData aboutdata("%{APPNAMELC}", I18N_NOOP("KDE"),
+ version, description,
+ KAboutData::License_GPL, "(C) %{YEAR}, %{AUTHOR}");
+ aboutdata.addAuthor("%{AUTHOR}",I18N_NOOP("Developer"),"%{EMAIL}");
+
+ KCmdLineArgs::init( argc, argv, &aboutdata );
+ KCmdLineArgs::addCmdLineOptions( options );
+ KUniqueApplication::addCmdLineOptions();
+
+ if (!KUniqueApplication::start())
+ {
+ kdDebug() << "%{APPNAMELC} is already running!" << endl;
+ return (0);
+ }
+
+ KUniqueApplication app;
+ kdDebug() << "starting %{APPNAMELC} " << endl;
+ // This app is started automatically, no need for session management
+ app.disableSessionManagement();
+ %{APPNAME} *service = new %{APPNAME};
+ kdDebug() << "starting %{APPNAMELC} " << endl;
+ return app.exec();
+
+}
diff --git a/languages/cpp/app_templates/dcopservice/src-Makefile.am b/languages/cpp/app_templates/dcopservice/src-Makefile.am
new file mode 100644
index 00000000..63b5b8ed
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/src-Makefile.am
@@ -0,0 +1,17 @@
+bin_PROGRAMS = %{APPNAMELC}
+INCLUDES = $(all_includes)
+%{APPNAMELC}_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+%{APPNAMELC}_LDADD = $(LIB_KIO)
+%{APPNAMELC}_SOURCES = main.cpp %{APPNAMELC}.cpp %{APPNAMELC}.skel
+
+
+noinst_HEADERS = %{APPNAMELC}.h
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
+
+
+service_DATA = %{APPNAMELC}.desktop
+servicedir = $(kde_servicesdir)
diff --git a/languages/cpp/app_templates/dcopservice/subdirs b/languages/cpp/app_templates/dcopservice/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/dcopservice/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/generichello/.kdev_ignore b/languages/cpp/app_templates/generichello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/generichello/.kdev_ignore
diff --git a/languages/cpp/app_templates/generichello/Makefile.am b/languages/cpp/app_templates/generichello/Makefile.am
new file mode 100644
index 00000000..b558eecd
--- /dev/null
+++ b/languages/cpp/app_templates/generichello/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = main.cpp cpphello.png app.kdevelop app.prj
+templateName = cppgenerichello
+
+# BELOW is not the GENERIC Template-Template;
+# png-filename differs from archive file name
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz cpphello.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/generichello/app.kdevelop b/languages/cpp/app_templates/generichello/app.kdevelop
new file mode 100644
index 00000000..c0b6cc1e
--- /dev/null
+++ b/languages/cpp/app_templates/generichello/app.kdevelop
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevGenericProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevgenericproject>
+ <backend>ShellScript</backend>
+ <project>%{APPNAMELC}.prj</project>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>true</terminal>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>GccOptions</ccompiler>
+ <cxxcompiler>GppOptions</cxxcompiler>
+ <f77compiler>G77Options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>GccOptions</ccompiler>
+ <cxxcompiler>GppOptions</cxxcompiler>
+ <f77compiler>G77Options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevgenericproject>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.h" name="Header files" />
+ <group pattern="*.cpp" name="Source files" />
+ </groups>
+ </kdevfileview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/generichello/app.prj b/languages/cpp/app_templates/generichello/app.prj
new file mode 100644
index 00000000..a1eeca82
--- /dev/null
+++ b/languages/cpp/app_templates/generichello/app.prj
@@ -0,0 +1,8 @@
+<kdevproject>
+ <group name = "src">
+ <target name = "cpphello">
+ <file name = "%{APPNAMELC}.cpp"/>
+ <attribute name = "buildscript">gcc -o %{APPNAMELC} %{APPNAMELC}.cpp</attribute>
+ </target>
+ </group>
+</kdevproject>
diff --git a/languages/cpp/app_templates/generichello/cpphello.png b/languages/cpp/app_templates/generichello/cpphello.png
new file mode 100644
index 00000000..888d4f13
--- /dev/null
+++ b/languages/cpp/app_templates/generichello/cpphello.png
Binary files differ
diff --git a/languages/cpp/app_templates/generichello/generichello.kdevtemplate b/languages/cpp/app_templates/generichello/generichello.kdevtemplate
new file mode 100644
index 00000000..787140ff
--- /dev/null
+++ b/languages/cpp/app_templates/generichello/generichello.kdevtemplate
@@ -0,0 +1,92 @@
+# KDE Config File
+[General]
+Name=C++ program (shell script build system)
+Name[ca]=Programa C++ (sistema de construcció basat en scripts de shell)
+Name[da]=C++ program (skalscript byggesystem)
+Name[de]=C++-Programm (Shell-Skript basiertes Erstellungssystem)
+Name[el]=ΠÏόγÏαμμα C++ (σÏστημα κατασκευής σενάÏιο κελÏφους)
+Name[es]=Programa en C++ (con sistema de construcción basado en guión de órdenes)
+Name[et]=C++ programm (shelliskripti ehitussüsteem)
+Name[eu]=C++ programa (shell script-en bidez eraikia)
+Name[fa]=برنامۀ ++C )سیستم ساخت دست‌نوشتۀ پوسته(
+Name[fr]=Programme C++ (système de construction en script shell)
+Name[ga]=Ríomhchlár C++ (córas tógála bunaithe ar scripteanna blaoisce
+Name[gl]=Programa C++ (sistema de compilación shell script)
+Name[hu]=C++-program (parancssoros fordítási szkripttel)
+Name[it]=Programma C++ (sistema di compilazione con script di shell)
+Name[ja]=C++ プログラム (シェルスクリプトベースã®ãƒ“ルドシステム)
+Name[nds]=C++-Programm (Konsoolskript-Opstellsystem)
+Name[ne]=C++ कारà¥à¤¯à¤•à¥à¤°à¤® (शेल सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ निरà¥à¤®à¤¾à¤£ पà¥à¤°à¤£à¤¾à¤²à¥€)
+Name[nl]=C++-programma (shellscript build system)
+Name[pl]=Program w C++ (system budowania za pomocą skryptów powłoki)
+Name[pt]=Programa em C++ (sistema de compilação em 'shell script')
+Name[pt_BR]=Programa em C++ (sistema de compilação em 'shell script')
+Name[ru]=Приложение C++ (Ñборка на Ñкриптах командной оболочки)
+Name[sk]=C++ program (shell skript build system)
+Name[sl]=Program v C++ (sistem grajenja lupinskega skripta)
+Name[sr]=C++ програм (Ñкрипта шкољке као ÑиÑтем за градњу)
+Name[sr@Latn]=C++ program (skripta Å¡koljke kao sistem za gradnju)
+Name[sv]=C++ program (skalskript byggsystem)
+Name[tr]=C++ programı (kabuk betiği kurulum sistemi)
+Name[zh_CN]=C++ 程åº(Shell 脚本创建系统)
+Name[zh_TW]=C++ 程å¼ï¼ˆshell 文稿建立系統)
+Icon=cpphello.png
+Category=C++/Generic
+Comment=Generates a simple Hello world program in C++
+Comment[ca]=Genera un simple programa de Hello world en C++
+Comment[da]=Genererer et simpelt Goddag verden program in C++
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in C++
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε σε C++
+Comment[es]=Genera un sencillo programa «Hola mundo» en C++
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine C++-s
+Comment[eu]="Kaixo mundua" programa sinple bat sortzen du C++ lengoaian
+Comment[fa]=یک برنامۀ سادۀ Hello world در C++ تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en C++
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí "Hello World" i C++
+Comment[gl]=Xera un programa sinxelo Ola mundo en C++
+Comment[hu]=Létrehoz egy egyszerű Hello world programot C++-ban
+Comment[it]=Genera un semplice programma di "Hello world" in C++
+Comment[ja]=ç°¡å˜ãª Hello World プログラムを C++ ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach "Moin Welt"-Programm in C++ op
+Comment[ne]=C++ मा à¤à¤‰à¤Ÿà¤¾ साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudig Hello World-programma in C++
+Comment[pl]=Generuje prosty program 'Witaj świecie' w języku C++
+Comment[pt]=Gera um programa simples Olá Mundo em C++
+Comment[pt_BR]=Gera um programa simples Olá Mundo em C++
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Hello world на C++
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program v C++
+Comment[sl]=Ustvari preprost program Hello world v C++
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм у C++-у
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program u C++-u
+Comment[sv]=Skapar ett enkelt Hello world-program i C++
+Comment[tr]=C++'da basit bir Merhaba Dünya programı yaratır.
+Comment[zh_CN]=ç”Ÿæˆ C++ çš„ Hello world 程åº
+Comment[zh_TW]=產生一個簡單的 C++ çš„ Hello world 程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=generichello.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.prj
+Dest=%{dest}/%{APPNAMELC}.prj
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE3]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
diff --git a/languages/cpp/app_templates/generichello/main.cpp b/languages/cpp/app_templates/generichello/main.cpp
new file mode 100644
index 00000000..f97c8417
--- /dev/null
+++ b/languages/cpp/app_templates/generichello/main.cpp
@@ -0,0 +1,17 @@
+%{CPP_TEMPLATE}
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+#include <cstdlib>
+
+using namespace std;
+
+int main(int argc, char *argv[])
+{
+ cout << "Hello, world!" << endl;
+
+ return EXIT_SUCCESS;
+}
diff --git a/languages/cpp/app_templates/gnome2mmapp/.kdev_ignore b/languages/cpp/app_templates/gnome2mmapp/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/.kdev_ignore
diff --git a/languages/cpp/app_templates/gnome2mmapp/Makefile.am b/languages/cpp/app_templates/gnome2mmapp/Makefile.am
new file mode 100644
index 00000000..f86ae76c
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/Makefile.am
@@ -0,0 +1,21 @@
+dataFiles = acconfig.h autogen.sh gnome2mm.glade main_window.cc \
+ main_window_glade.hh Makefile.am app-Makefile.am \
+ configure.in gnome2mm.gladep main_window.hh \
+ app.kdevelop gnome2mm.cc gnome2mmapp main_window_glade.cc\
+ src-Makefile.am config.h gnome2mmapp.png
+
+templateName = gnome2mmapp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/gnome2mmapp/acconfig.h b/languages/cpp/app_templates/gnome2mmapp/acconfig.h
new file mode 100644
index 00000000..c7231ddc
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/acconfig.h
@@ -0,0 +1,23 @@
+// generated 2004/4/12 12:12:12 EDT by amp8165@localhost.(none)
+// using glademm V2.0.0
+
+/* acconfig.h
+ * This file is in the public domain.
+ *
+ * Descriptive text for the C preprocessor macros that
+ * the distributed Autoconf macros can define.
+ * These entries are sometimes used by macros
+ * which glade-- uses.
+ */
+#undef PACKAGE
+#undef VERSION
+#undef ENABLE_NLS
+#undef HAVE_CATGETS
+#undef HAVE_GETTEXT
+#undef HAVE_LC_MESSAGES
+#undef HAVE_STPCPY
+#undef HAVE_LIBSM
+#undef PACKAGE_LOCALE_DIR
+#undef GETTEXT_PACKAGE
+#undef PACKAGE_DATA_DIR
+#undef PACKAGE_SOURCE_DIR
diff --git a/languages/cpp/app_templates/gnome2mmapp/app-Makefile.am b/languages/cpp/app_templates/gnome2mmapp/app-Makefile.am
new file mode 100644
index 00000000..1d95370d
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/app-Makefile.am
@@ -0,0 +1,4 @@
+
+SUBDIRS = src
+
+EXTRA_DIST = AUTHORS TODO README configure
diff --git a/languages/cpp/app_templates/gnome2mmapp/app.kdevelop b/languages/cpp/app_templates/gnome2mmapp/app.kdevelop
new file mode 100644
index 00000000..8ccf488a
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/app.kdevelop
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>GNOME</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cflags>-O2 -g0</cflags>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cflags>-O0 -g3</cflags>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.h" name="Sources" />
+ <group pattern="*.glade" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/gnome2mmapp/autogen.sh b/languages/cpp/app_templates/gnome2mmapp/autogen.sh
new file mode 100755
index 00000000..30e9875b
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/autogen.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+# generated 2004/4/12 12:12:12 EDT by amp8165@localhost.(none)
+# using glademm V2.0.0
+# I didn't want to put a copy of 'macros' in every generated package
+# so I try to find them at autogen.sh time and copy them here.
+# (Normally if you have access to a cvs repository a copy of macros is
+# put into your directory at checkout time. E.g. cvs.gnome.org/gnome-common)
+if [ ! -e macros ]
+then
+ GLADE_MACROS=`which glade | sed -e 's-bin/glade-share/glade-'`
+ if [ -r $GLADE_MACROS/gnome/gnome.m4 ]
+ then
+ if cp --dereference /dev/null /dev/zero
+ then
+ cp -r --dereference $GLADE_MACROS/gnome macros
+ else
+ cp -r $GLADE_MACROS/gnome macros
+ fi
+ else
+ echo "I can't find glade's gnome m4 macros. Please copy them to ./macros and retry."
+ exit 2
+ fi
+fi
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+PKG_NAME="%{APPNAMELC}"
+
+(test -f $srcdir/configure.in \
+## put other tests here
+) || {
+ echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
+ echo " top-level $PKG_NAME directory"
+ exit 1
+}
+
+export ACLOCAL_FLAGS="-I `pwd`/macros $ACLOCAL_FLAGS"
+. $srcdir/macros/autogen.sh
diff --git a/languages/cpp/app_templates/gnome2mmapp/config.h b/languages/cpp/app_templates/gnome2mmapp/config.h
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/config.h
diff --git a/languages/cpp/app_templates/gnome2mmapp/configure.in b/languages/cpp/app_templates/gnome2mmapp/configure.in
new file mode 100644
index 00000000..d25f4fbd
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/configure.in
@@ -0,0 +1,57 @@
+# generated 2004/4/12 12:12:12 EDT by amp8165@localhost.(none)
+# using glademm V2.0.0
+
+AC_INIT(configure.in)
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+AM_CONFIG_HEADER(config.h)
+
+dnl Pick up the Gnome macros.
+AM_ACLOCAL_INCLUDE(macros)
+AM_MAINTAINER_MODE
+
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_STDC
+AC_HEADER_STDC
+AC_PROG_CPP
+AC_PROG_CXX
+AC_PROG_CXXCPP
+AM_PROG_LIBTOOL
+
+# GNOME--:
+# (These macros are in the 'macros' directory)
+# GNOME_INIT sets the GNOME_CONFIG variable, among other things:
+GNOME_INIT
+GNOME_COMMON_INIT
+GNOME_COMPILE_WARNINGS
+dnl *************************************************
+dnl gettext support
+dnl *************************************************
+
+GETTEXT_PACKAGE=gnome2mm
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE")
+
+dnl Add the languages which your application supports here.
+ALL_LINGUAS=""
+AM_GLIB_GNU_GETTEXT
+
+dnl Set PACKAGE_LOCALE_DIR in config.h.
+if test "x${prefix}" = "xNONE"; then
+ AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale")
+else
+ AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale")
+fi
+
+AC_LANG_CPLUSPLUS
+
+AM_PATH_GNOMEMM(1.2.2,, AC_MSG_ERROR(Cannot find a matching GNOME-- library: Please install version 1.2.2 or newer))
+
+# GNOME-CONFIG script knows about gnomemm:
+# ('gnome-config' is installed by GNOME)
+#GNOMEMM_CFLAGS="`$GNOME_CONFIG --cflags gnomemm gnomeui`"
+#GNOMEMM_LIBS="`$GNOME_CONFIG --libs gnomemm gnomeui`"
+#AC_SUBST(GNOMEMM_CFLAGS)
+#AC_SUBST(GNOMEMM_LIBS)
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/cpp/app_templates/gnome2mmapp/gnome2mm.cc b/languages/cpp/app_templates/gnome2mmapp/gnome2mm.cc
new file mode 100644
index 00000000..8a33b9ff
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/gnome2mm.cc
@@ -0,0 +1,22 @@
+%{CC_TEMPLATE}
+
+#include <config.h>
+#include <gnome--/main.h>
+#include <libgnome/gnome-i18n.h>
+
+#include "main_window.hh"
+
+int main(int argc, char **argv)
+{
+#if defined(ENABLE_NLS)
+ bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
+ textdomain (GETTEXT_PACKAGE);
+#endif //ENABLE_NLS
+
+ Gnome::Main m(PACKAGE, VERSION, argc, argv);
+
+ main_window *main_window = new class main_window();
+ m.run();
+ delete main_window;
+ return 0;
+}
diff --git a/languages/cpp/app_templates/gnome2mmapp/gnome2mm.glade b/languages/cpp/app_templates/gnome2mmapp/gnome2mm.glade
new file mode 100644
index 00000000..4c0370aa
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/gnome2mm.glade
@@ -0,0 +1,24 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+<requires lib="gnome"/>
+
+<widget class="GtkWindow" id="main_window">
+ <property agent="glademm" name="cxx_separate_class">True</property>
+ <property agent="glademm" name="cxx_visibility">public</property>
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">%{APPNAME} Project</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_CENTER</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <signal name="delete_event" handler="quit"/>
+
+ <child>
+ <placeholder/>
+ </child>
+</widget>
+
+</glade-interface>
diff --git a/languages/cpp/app_templates/gnome2mmapp/gnome2mm.gladep b/languages/cpp/app_templates/gnome2mmapp/gnome2mm.gladep
new file mode 100644
index 00000000..b7da0659
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/gnome2mm.gladep
@@ -0,0 +1,8 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+ <name>Gnome2mm</name>
+ <program_name>gnome2mm</program_name>
+ <language>C++</language>
+</glade-project>
diff --git a/languages/cpp/app_templates/gnome2mmapp/gnome2mmapp b/languages/cpp/app_templates/gnome2mmapp/gnome2mmapp
new file mode 100644
index 00000000..8593bc68
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/gnome2mmapp
@@ -0,0 +1,8 @@
+# KDE Config File
+[General]
+Name=GNOME-- Application framework
+Category=C++/GTK+
+Icon=gnome2mmapp.png
+Comment=Generates a simple GNOME-- application. Gnomemm, Gtkmm >= 1.2.8 and < 1.3.0 should be installed. To edit glade file glade-- (http://home.wtal.de/petig/Gtk/) is required.
+FileTemplates=hh,CStyle,cc,CStyle
+ShowFilesAfterGeneration=src/APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/gnome2mmapp/gnome2mmapp.kdevtemplate b/languages/cpp/app_templates/gnome2mmapp/gnome2mmapp.kdevtemplate
new file mode 100644
index 00000000..ec101c69
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/gnome2mmapp.kdevtemplate
@@ -0,0 +1,186 @@
+# KDE Config File
+[General]
+Name=GNOME-- Application framework
+Name[ca]=Infraestructura d'aplicació per a GNOME
+Name[da]=GNOME-- Programskelet
+Name[de]="GNOME--"-Anwendungsgrundgerüst
+Name[el]=GNOME-- Πλαίσιο εφαÏμογής
+Name[es]=Infraestructura para aplicación GNOME--
+Name[et]=GNOME-- rakenduse raamistik
+Name[eu]=GNOME-- Aplikazioen lan-markoa
+Name[fa]=چارچوب کاربرد GNOME--
+Name[fr]=Infrastructure d'application GNOME--
+Name[ga]=Creatlach feidhmchláir GNOME--
+Name[gl]=Entorno de traballo para aplicación GNOME
+Name[hu]=GNOME - Alkalmazás-keretrendszer
+Name[it]=Infrastruttura per applicazioni GNOME--
+Name[ja]=GNOME-- アプリケーションフレームワーク
+Name[nds]=Programmrahmenwark för "GNOME--"
+Name[ne]=GNOME-- अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤•
+Name[nl]=GNOME-- Applicationframework
+Name[pl]=GNOME-- Szablon programu
+Name[pt]=Plataforma de aplicações GNOME--
+Name[pt_BR]=Plataforma de aplicações GNOME--
+Name[ru]=Приложение GNOME--
+Name[sk]=GNOME-- aplikaÄný framework
+Name[sl]=Ogrodje programa za GNOME--
+Name[sr]=Радни оквир GNOME-- програма
+Name[sr@Latn]=Radni okvir GNOME-- programa
+Name[sv]=GNOME-- programramverk
+Name[tr]=GNOME-- Uygulama Çatısı
+Name[zh_CN]=GNOME-- 应用程åºæ¡†æž¶
+Name[zh_TW]=GNOME-- 應用程å¼æ¡†æž¶
+Category=C++/GTK+
+Icon=gnome2mmapp.png
+Comment=Generates a simple GNOME-- application. Gnomemm, Gtkmm >= 1.2.8 and < 1.3.0 should be installed. To edit glade file glade-- (http://home.wtal.de/petig/Gtk/) is required.
+Comment[ca]=Genera una simple aplicació GNOME. Gnomemm, Gtkmm >= 1.2.8 i < 1.3.0 haurien d'estar instal·lats. Per editar el fitxer glade es requereix (http://home.wtal.de/petig/Gtk/).
+Comment[da]=Genererer et simpelt GNOME-- program. Gnomemm, Gtkmm >= 1.2.8 og < 1.3.0 skal være installeret. For at redigere glade file glade-- kræves (http://home.wtal.de/petig/Gtk/).
+Comment[de]=Erstellt eine einfache GNOME-Anwendung. Gnomemm, Gtkmm >= 1.2.8 und < 1.3.0 sollten installiert sein. Zum Bearbeiten der glade-Datei ist glade-- (http://home.wtal.de/petig/Gtk/) erforderlich.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή GNOME. Τα Gnomemm, Gtkmm >= 1.2.8 και < 1.3.0 Ï€Ïέπει να είναι εγκατεστημένα. Για την επεξεÏγασία του αÏχείου glade απαιτείται το glade (http://home.wtal.de/petig/Gtk/).
+Comment[es]=Genera una sencilla aplicación GNOME--. Debe tener instalados Gnomemm, Gtkmm >= 1.2.8 y < 1.3.0. Para editar archivos glade se necesita glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[et]=Lihtsa GNOME-- rakenduse loomine. Paigaldatud peavad olema Gnomemm, Gtkmm >= 1.2.8 ja < 1.3.0. Glade-faili redigeerimiseks on vajalik glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[eu]=GNOME-- applicazio sinple bat sortzen du. Gnomemm, Gtkmm >= 1.2.8 and < 1.3.0 instalatu behar dira. Glade fitxategia editatzeko glade-- (http://home.wtal.de/petig/Gtk/) behar da.
+Comment[fa]=یک کاربرد سادۀ GNOME-- تولید می‌کند. Gnomemm، Gtkmm >= ۱.۲.۸ و < ۱.۳.۰ باید نصب شده باشد. برای ویرایش پروندۀ glade، glade-- (http://home.wtal.de/petig/Gtk/) نیاز است.
+Comment[fr]=Génère une application GNOME-- simple. Gnomemm et Gtkmm >= 1.2.8 et < 1.3.0 devront être installés. Pour modifier le fichier glade, glade-- (http://home.wtal.de/petig/Gtk/) est requis.
+Comment[ga]=Cruthaíonn sé seo feidhmchlár simplí GNOME--. Ba chóir Gnomemm, Gtkmm >= 1.2.8 agus < 1.3.0 a bheith suiteáilte. Chun comhad glade a chur in eagar, tá glade-- (http://home.wtal.de/petig/Gtk/) de dhíth ort.
+Comment[gl]=Xera una aplicación sinxela GNOME. Gnomemm, Gtkmm >= 1.2.8 e < 1.3.0 deben estar instalados. Para editar un arquivo glade é necesario glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[hu]=Létrehoz egy egyszerű GNOME--os -alkalmazást. A Gnomemm, a Gtkmm (>= 1.2.8 és < 1.3.0) szükséges hozzá. Glade-fájl szerkesztéséhez a glade-- (http://home.wtal.de/petig/Gtk/) is szükséges.
+Comment[it]=Genera una semplice applicazione GNOME--. Gnomemm, Gtkmm >= 1.2.8 e < 1.3.0 dovrebbero essere installati. Si richiede glade per modificare i file di glade -- (http://home.wtal.de/petig/Gtk/).
+Comment[ja]=ç°¡å˜ãª GNOME-- アプリケーションを作æˆã—ã¾ã™ã€‚Gnomemm, Gtkmm >= 1.2.8 ã‹ã¤ < 1.3.0 ãŒå¿…è¦ã§ã™ã€‚glade ファイルを編集ã™ã‚‹ã«ã¯ glade-- (http://home.wtal.de/petig/Gtk/) ãŒå¿…è¦ã§ã™ã€‚
+Comment[nds]=Stellt en eenfach "GNOME--"-Programm op. "Gnomemm", "Gtkmm" >= 1.2.8 un < 1.3.0 schöölt installeert wesen. För't Bewerken vun de glade-Datei deit "glade--" (http://home.wtal.de/petig/Gtk/) noot.
+Comment[ne]=साधारण जिनोम-- अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । Gnomemm, Gtkmm >= 1.2.8 र < 1.3.0 सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥ परà¥à¤¦à¤› । गà¥à¤²à¥‡à¤¡ फाइल समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¤•à¤¾ लागि गà¥à¤²à¥‡à¤¡-- (http://home.wtal.de/petig/Gtk/) आवशà¥à¤¯à¤• परà¥à¤¦à¤› ।
+Comment[nl]=Genereert een eenvoudige GNOME-- toepassing. Gnomemm, Gtkmm >= 1.2.8 en < 1.3.0 dienen te zijn geïnstalleerd. Voor het bewerken van glade file is glade-- (http://home.wtal.de/petig/Gtk/) nodig.
+Comment[pl]=Generuje prosty program dla środowiska GNOME--. Gnomemm i Gtkmm w wersji >= 1.2.8 i < 1.3.0 powinny być zainstalowane. Do edycji pliku glade konieczny jest program glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[pt]=Gera uma aplicação simples em GNOME--. Deverão estar instalados o Gnomemm, Gtkmm >= 1.2.8 e < 1.3.0. Para editar o ficheiro do Glade,, é necessário o glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[pt_BR]=Gera uma aplicação simples em GNOME--. Deverão estar instalados o Gnomemm, Gtkmm >= 1.2.8 e < 1.3.0. Para editar o ficheiro do Glade,, é necessário o glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ GNOME--. ТребуютÑÑ Gnomemm, Gtkmm >= 1.2.8 и < 1.3.0. Ð”Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° glade нужна ÑоответÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° (http://home.wtal.de/petig/Gtk/).
+Comment[sk]=Vygeneruje jednoduchú GNOME-- aplikáciu. Vyžaduje nainštalovanéGnomemm, Gtkmm >= 1.2.8 a < 1.3.0. Na editovanie glade súboru he potrebnýglade-- (http://home.wtal.de/petig/Gtk/).
+Comment[sr]=Прави једноÑтаван GNOME-- програм. Gnomemm, Gtkmm >= 1.2.8 и < 1.3.0 требало би да Ñу инÑталирани. Да биÑте уређивали glade фајл, неопходан је glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[sr@Latn]=Pravi jednostavan GNOME-- program. Gnomemm, Gtkmm >= 1.2.8 i < 1.3.0 trebalo bi da su instalirani. Da biste uređivali glade fajl, neophodan je glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[sv]=Skapar ett enkelt GNOME-- program. Gnomemm, Gtkmm >= 1.2.8 och < 1.3.0 måste vara installerat. För att redigera glade-filer krävs glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[tr]=Basit bir GNOME-- uygulaması yaratır. Gnomemm, Gtkmm>=1.28 ve <1.3.0 yüklü olmalıdır. Glade dosyasını düzenlemek için glade-- (http://home.wtal.de/petig/Gtk/) gereklidir.
+Comment[zh_CN]=生æˆç®€å•çš„ GNOME-- 应用程åºã€‚必须安装 Gnomemmã€1.2.8 到 1.3.0 之间的 Gtkmm。è¦ç¼–辑 glade 文件,需è¦ä½¿ç”¨ glade-- (http://home.wtal.de/petig/Gtk/)。
+Comment[zh_TW]=產生一個簡單的 GNOME-- 應用程å¼ã€‚è¦å…ˆå®‰è£ Gnomemm,Gtkmm 版本 >= 1.2.8 且 < 1.3.0。è¦ç·¨è¼¯ glade 檔則è¦å…ˆå®‰è£ glade-- (http://home.wtal.de/petig/Gtk/)。
+FileTemplates=hh,CStyle,cc,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=gnome2mmapp.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNOME2]
+Type=include
+File=%{kdevelop}/template-common/gnome2.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/configure.in
+Dest=%{dest}/configure.in
+
+[FILE4]
+Type=install
+Source=%{src}/acconfig.h
+Dest=%{dest}/acconfig.h
+
+[FILE5]
+Type=install
+Source=%{src}/config.h
+Dest=%{dest}/config.h
+
+[FILE6]
+Type=install
+Source=%{src}/autogen.sh
+Dest=%{dest}/autogen.sh
+
+[FILE7]
+Type=install
+Source=%{src}/gnome2mm.glade
+Dest=%{dest}/%{APPNAMELC}.glade
+
+[FILE8]
+Type=install
+Source=%{src}/gnome2mm.gladep
+Dest=%{dest}/%{APPNAMELC}.gladep
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE9]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE10]
+Type=install
+Source=%{src}/gnome2mm.cc
+Dest=%{dest}/src/%{APPNAMELC}.cc
+
+[FILE11]
+Type=install
+Source=%{src}/main_window.hh
+Dest=%{dest}/src/main_window.hh
+
+[FILE12]
+Type=install
+Source=%{src}/main_window.cc
+Dest=%{dest}/src/main_window.cc
+
+[FILE13]
+Type=install
+Source=%{src}/main_window_glade.hh
+Dest=%{dest}/src/main_window_glade.hh
+
+[FILE14]
+Type=install
+Source=%{src}/main_window_glade.cc
+Dest=%{dest}/src/main_window_glade.cc
+
+[MSG]
+Type=message
+Comment=A GNOME-- application framework was created in %{dest}
+Comment[ca]=Una infraestructura d'aplicació per a GNOME ha estat creada en %{dest}
+Comment[da]=Et GNOME-- programskelet blev oprettet i %{dest}
+Comment[de]=Ein GNOME-Anwendungsgerüst wurde in %{dest} erstellt.
+Comment[el]=Ένα πλαίσιο εφαÏμογής GNOME δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una infraestructura de aplicación GNOME-- ha sido creada en %{dest}
+Comment[et]=GNOME-- rakenduse raamistik loodi asukohta %{dest}
+Comment[eu]=GNOME-- applicazioen lan-marko bat sortu da hemen: %{dest}
+Comment[fa]=یک چارچوب کاربرد GNOME-- در %{dest} ایجاد شد
+Comment[fr]=Une infrastructure d'application GNOME-- a été créée dans %{dest}
+Comment[ga]=Cruthaíodh creatlach feidhmchláir GNOME-- i %{dest}
+Comment[gl]=Creouse un contorno de traballo para aplicación GNOME en %{dest}
+Comment[hu]=Létrejött egy GNOME-s alkalmazás-keretrendszer itt: %{dest}
+Comment[it]=È stato creata l'infrastruttura per un'applicazione GNOME in %{dest}
+Comment[ja]=GNOME-- アプリケーションフレームワークを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Programmrahmenwark för "GNOME--" opstellt
+Comment[ne]= जिनोम-- अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een GNOME-- applicationframework is aangemaakt in %{dest}
+Comment[pl]=Szablon programu dla GNOME-- został utworzony w %{dest}
+Comment[pt]=Foi criada a plataforma de uma aplicação GNOME-- em %{dest}
+Comment[pt_BR]=Foi criada a plataforma de uma aplicação GNOME-- em %{dest}
+Comment[ru]=ПроÑтое приложение GNOME-- Ñоздано в %{dest}
+Comment[sk]=GNOME-- aplikaÄný framework bol vytvorený v %{dest}
+Comment[sl]=Ogrodje programa za GNOME-- je bilo ustvarjeno v %{dest}
+Comment[sr]=Радни оквир GNOME-- програма направљен је у %{dest}
+Comment[sr@Latn]=Radni okvir GNOME-- programa napravljen je u %{dest}
+Comment[sv]=Ett GNOME-- programramverk skapades i %{dest}
+Comment[tr]=Bir GNOME-- uygulama çatısı %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了 GNOME-- 应用程åºæ¡†æž¶
+Comment[zh_TW]=GNOME-- 應用程å¼æ¡†æž¶å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/gnome2mmapp/gnome2mmapp.png b/languages/cpp/app_templates/gnome2mmapp/gnome2mmapp.png
new file mode 100644
index 00000000..253a6229
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/gnome2mmapp.png
Binary files differ
diff --git a/languages/cpp/app_templates/gnome2mmapp/main_window.cc b/languages/cpp/app_templates/gnome2mmapp/main_window.cc
new file mode 100644
index 00000000..4c73911b
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/main_window.cc
@@ -0,0 +1,16 @@
+%{CC_TEMPLATE}
+
+// newer (non customized) versions of this file go to main_window.cc_new
+
+// This file is for your program, I won't touch it again!
+
+#include "config.h"
+#include "main_window.hh"
+
+#include <gtk--/main.h>
+
+gint main_window::quit(GdkEventAny *ev)
+{
+ Gtk::Main::quit();
+}
+
diff --git a/languages/cpp/app_templates/gnome2mmapp/main_window.hh b/languages/cpp/app_templates/gnome2mmapp/main_window.hh
new file mode 100644
index 00000000..ae93336b
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/main_window.hh
@@ -0,0 +1,19 @@
+%{HH_TEMPLATE}
+
+// newer (non customized) versions of this file go to main_window.hh_new
+
+// you might replace
+// class foo : public foo_glade { ... };
+// by
+// typedef foo_glade foo;
+// if you didn't make any modifications to the widget
+
+#ifndef _MAIN_WINDOW_HH
+# include "main_window_glade.hh"
+# define _MAIN_WINDOW_HH
+class main_window : public main_window_glade
+{
+protected:
+ virtual gint quit(GdkEventAny *ev);
+};
+#endif
diff --git a/languages/cpp/app_templates/gnome2mmapp/main_window_glade.cc b/languages/cpp/app_templates/gnome2mmapp/main_window_glade.cc
new file mode 100644
index 00000000..bea6c857
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/main_window_glade.cc
@@ -0,0 +1,30 @@
+%{CC_TEMPLATE}
+
+// DO NOT EDIT THIS FILE ! It was created using
+// glade-- /home/amp8165/Projects/gnome2mm/gnome2mm.glade
+// for gtk 2.2.4 and gtkmm 1.2.10
+//
+// Please modify the corresponding derived classes in ./src/main_window.cc
+
+#include "config.h"
+#include <libgnome/libgnome.h>
+#include "main_window_glade.hh"
+#include <gdk/gdkkeysyms.h>
+#include <gtk--/accelgroup.h>
+
+main_window_glade::main_window_glade(
+) : Gtk::Window(GTK_WINDOW_TOPLEVEL)
+{ main_window = this;
+
+ Gtk::AccelGroup *main_window_accgrp = Gtk::AccelGroup::create();
+ gmm_data = new GlademmData(main_window_accgrp);
+ main_window->set_title(_("%{APPNAME} Project"));
+ main_window->set_modal(false);
+ main_window->add_accel_group(*(gmm_data->getAccelGroup()));
+ main_window->show();
+ main_window->delete_event.connect(SigC::slot(this, &main_window_glade::quit));
+}
+
+main_window_glade::~main_window_glade()
+{ delete gmm_data;
+}
diff --git a/languages/cpp/app_templates/gnome2mmapp/main_window_glade.hh b/languages/cpp/app_templates/gnome2mmapp/main_window_glade.hh
new file mode 100644
index 00000000..97a9302f
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/main_window_glade.hh
@@ -0,0 +1,49 @@
+%{HH_TEMPLATE}
+
+// DO NOT EDIT THIS FILE ! It was created using
+// glade-- /home/amp8165/Projects/gnome2mm/gnome2mm.glade
+// for gtk 2.2.4 and gtkmm 1.2.10
+//
+// Please modify the corresponding derived classes in ./src/main_window.hh and./src/main_window.cc
+
+#ifndef _MAIN_WINDOW_GLADE_HH
+# define _MAIN_WINDOW_GLADE_HH
+
+
+#if !defined(GLADEMM_DATA)
+#define GLADEMM_DATA
+#include <gtk--/accelgroup.h>
+
+class GlademmData
+{
+
+ Gtk::AccelGroup *accgrp;
+public:
+
+ GlademmData(Gtk::AccelGroup *ag) : accgrp(ag)
+ {
+ }
+
+ Gtk::AccelGroup * getAccelGroup()
+ { return accgrp;
+ }
+};
+#endif //GLADEMM_DATA
+
+#include <gtk--/window.h>
+
+class main_window_glade : public Gtk::Window
+{
+
+ GlademmData *gmm_data;
+public:
+ class Gtk::Window *main_window;
+protected:
+
+ main_window_glade();
+
+ ~main_window_glade();
+
+ virtual gint quit(GdkEventAny *ev) = 0;
+};
+#endif
diff --git a/languages/cpp/app_templates/gnome2mmapp/src-Makefile.am b/languages/cpp/app_templates/gnome2mmapp/src-Makefile.am
new file mode 100644
index 00000000..fe5ec32c
--- /dev/null
+++ b/languages/cpp/app_templates/gnome2mmapp/src-Makefile.am
@@ -0,0 +1,14 @@
+bin_PROGRAMS = %{APPNAMELC}
+
+%{APPNAMELC}_SOURCES = \
+ %{APPNAMELC}.cc\
+ main_window_glade.cc \
+ main_window.cc
+
+noinst_HEADERS = \
+ main_window_glade.hh \
+ main_window.hh
+
+AM_CXXFLAGS = @CXXFLAGS@ @GNOMEMM_CFLAGS@
+
+%{APPNAMELC}_LDADD = @LIBS@ @GNOMEMM_LIBS@
diff --git a/languages/cpp/app_templates/gtk2mmapp/.kdev_ignore b/languages/cpp/app_templates/gtk2mmapp/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/.kdev_ignore
diff --git a/languages/cpp/app_templates/gtk2mmapp/Makefile.am b/languages/cpp/app_templates/gtk2mmapp/Makefile.am
new file mode 100644
index 00000000..2069ade7
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/Makefile.am
@@ -0,0 +1,21 @@
+dataFiles = acconfig.h autogen.sh gtk2mm.glade main_window.cc \
+ main_window_glade.hh Makefile.am app-Makefile.am \
+ configure.in gtk2mm.gladep main_window.hh \
+ app.kdevelop gtk2mm.cc main_window_glade.cc\
+ src-Makefile.am config.h gtk2mmapp.png
+
+templateName = gtk2mmapp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/gtk2mmapp/acconfig.h b/languages/cpp/app_templates/gtk2mmapp/acconfig.h
new file mode 100644
index 00000000..a3f4402e
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/acconfig.h
@@ -0,0 +1,10 @@
+/* acconfig.h
+ * This file is in the public domain.
+ *
+ * Descriptive text for the C preprocessor macros that
+ * the distributed Autoconf macros can define.
+ * These entries are sometimes used by macros
+ * which glade-- uses.
+ */
+#undef PACKAGE
+#undef VERSION
diff --git a/languages/cpp/app_templates/gtk2mmapp/app-Makefile.am b/languages/cpp/app_templates/gtk2mmapp/app-Makefile.am
new file mode 100644
index 00000000..1d95370d
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/app-Makefile.am
@@ -0,0 +1,4 @@
+
+SUBDIRS = src
+
+EXTRA_DIST = AUTHORS TODO README configure
diff --git a/languages/cpp/app_templates/gtk2mmapp/app.kdevelop b/languages/cpp/app_templates/gtk2mmapp/app.kdevelop
new file mode 100644
index 00000000..47330ca2
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/app.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>GTK</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cflags>-O2 -g0</cflags>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cflags>-O0 -g3</cflags>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.h" name="Sources" />
+ <group pattern="*.glade" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnustep</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/gtk2mmapp/autogen.sh b/languages/cpp/app_templates/gtk2mmapp/autogen.sh
new file mode 100755
index 00000000..231521ba
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/autogen.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+# generated 2004/4/12 11:58:47 EDT by amp8165@localhost.(none)
+# using glademm V2.0.0
+
+if test ! -f install-sh ; then touch install-sh ; fi
+
+MAKE=`which gnumake`
+if test ! -x "$MAKE" ; then MAKE=`which gmake` ; fi
+if test ! -x "$MAKE" ; then MAKE=`which make` ; fi
+HAVE_GNU_MAKE=`$MAKE --version|grep -c "Free Software Foundation"`
+
+if test "$HAVE_GNU_MAKE" != "1"; then
+echo Using non GNU Make at $MAKE
+else
+echo Found GNU Make at $MAKE ... good.
+fi
+
+echo This script runs configure and make...
+echo You did remember necessary arguments for configure, right?
+
+if test ! -x `which aclocal`
+then echo you need autoconfig and automake to generate the Makefile
+fi
+if test ! -x `which automake`
+then echo you need automake to generate the Makefile
+fi
+
+libtoolize --force --copy
+autoheader
+aclocal
+automake --add-missing --copy --gnu
+autoconf
+#./configure $* && $MAKE
diff --git a/languages/cpp/app_templates/gtk2mmapp/config.h b/languages/cpp/app_templates/gtk2mmapp/config.h
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/config.h
diff --git a/languages/cpp/app_templates/gtk2mmapp/configure.in b/languages/cpp/app_templates/gtk2mmapp/configure.in
new file mode 100644
index 00000000..cec72218
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/configure.in
@@ -0,0 +1,19 @@
+
+AC_INIT(configure.in)
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+AC_CONFIG_HEADER(config.h)
+
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_STDC
+AC_HEADER_STDC
+AC_PROG_CPP
+AC_PROG_CXX
+AC_PROG_CXXCPP
+AM_PROG_LIBTOOL
+
+AC_LANG_CPLUSPLUS
+
+PKG_CHECK_MODULES([GTKMM], [gtkmm-2.4 >= 2.8.0])
+
+AC_OUTPUT(Makefile src/Makefile )
diff --git a/languages/cpp/app_templates/gtk2mmapp/gtk2mm.cc b/languages/cpp/app_templates/gtk2mmapp/gtk2mm.cc
new file mode 100644
index 00000000..9845fede
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/gtk2mm.cc
@@ -0,0 +1,15 @@
+%{CC_TEMPLATE}
+
+#include <gtkmm/main.h>
+
+#include "main_window.hh"
+
+int main(int argc, char **argv)
+{
+
+ Gtk::Main m(&argc, &argv);
+
+ main_window main_window;
+ Gtk::Main::run(main_window);
+ return 0;
+}
diff --git a/languages/cpp/app_templates/gtk2mmapp/gtk2mm.glade b/languages/cpp/app_templates/gtk2mmapp/gtk2mm.glade
new file mode 100644
index 00000000..ef4f1b18
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/gtk2mm.glade
@@ -0,0 +1,30 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="main_window">
+ <property agent="glademm" name="cxx_separate_class">True</property>
+ <property agent="glademm" name="cxx_separate_file">True</property>
+ <property agent="glademm" name="cxx_visibility">public</property>
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">%{APPNAME} Project</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_CENTER</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <signal name="delete_event" handler="quit"/>
+
+ <child>
+ <placeholder/>
+ </child>
+</widget>
+
+</glade-interface>
diff --git a/languages/cpp/app_templates/gtk2mmapp/gtk2mm.gladep b/languages/cpp/app_templates/gtk2mmapp/gtk2mm.gladep
new file mode 100644
index 00000000..f09912ac
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/gtk2mm.gladep
@@ -0,0 +1,10 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+ <name>%{APPNAME}</name>
+ <program_name>%{APPNAMELC}</program_name>
+ <language>C++</language>
+ <gnome_support>FALSE</gnome_support>
+ <gettext_support>FALSE</gettext_support>
+</glade-project>
diff --git a/languages/cpp/app_templates/gtk2mmapp/gtk2mmapp.kdevtemplate b/languages/cpp/app_templates/gtk2mmapp/gtk2mmapp.kdevtemplate
new file mode 100644
index 00000000..6d52c9bd
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/gtk2mmapp.kdevtemplate
@@ -0,0 +1,174 @@
+# KDE Config File
+[General]
+Name=Gtk-- Application framework
+Name[ca]=Infraestructura d'aplicació per a Gtk--
+Name[da]=Gtk-- programskelet
+Name[de]="Gtk--"-Anwendungsgrundgerüst
+Name[el]=Gtk-- πλαίσιο εφαÏμογής
+Name[es]=Infraestructura de aplicación Gtk--
+Name[et]=Gtk-- rakenduse raamistik
+Name[eu]=Gtk-- Applicazioen lan-markoa
+Name[fa]=چارچوب کاربرد Gtk--
+Name[fr]=Infrastructure d'application Gtk--
+Name[ga]=Creatlach feidhmchláir Gtk--
+Name[hu]=Gtk-- - alkalmazás-keretrendszer
+Name[it]=Infrastruttura per un'applicazione Gtk--
+Name[ja]=Gtk-- アプリケーションフレームワーク
+Name[nds]="Gtk--"-Programmrahmenwark
+Name[ne]=Gtk-- अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤•
+Name[nl]=Gtk-- Applicationframework
+Name[pl]=Szablon programu Gtk--
+Name[pt]=Plataforma de aplicações em Gtk--
+Name[pt_BR]=Plataforma de aplicações em Gtk--
+Name[ru]=Приложение Gtk--
+Name[sk]=Gtk-- aplikaÄný framework
+Name[sl]=Ogrodje programa za Gtk--
+Name[sr]=Радни оквир Gtk-- програма
+Name[sr@Latn]=Radni okvir Gtk-- programa
+Name[sv]=Gtk-- programramverk
+Name[tr]=Gtk-- Uygulama Çatısı
+Name[zh_CN]=Gtk-- 应用程åºæ¡†æž¶
+Name[zh_TW]=Gtk-- 應用程å¼æ¡†æž¶
+Category=C++/GTK+
+Icon=gtk2mmapp.png
+Comment=Generates a simple Gtk-- application. Gtkmm >= 2.8.0 should be installed. To edit glade file glade-- (http://home.wtal.de/petig/Gtk/) is required.
+Comment[ca]=Genera una simple aplicació Gtk. Gtkmm >= 2.8.0 hauria d'estar instal·lat. Per editar el fitxer glade es requereix glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[da]=Genererer et simpelt Gtk-- program. Gtkmm >= 2.8.0 skal være installeret. For at redigere glade file glade-- kræves (http://home.wtal.de/petig/Gtk/).
+Comment[de]=Erstellt eine einfache Gtk-Anwendung. Gtkmm >= 1.2.8 und < 1.3.0 sollte installiert sein. Zum Bearbeiten der glade-Datei ist glade-- (http://home.wtal.de/petig/Gtk/) erforderlich.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή Gtk. Το Gtkmm >= 2.8.0 Ï€Ïέπει να είναι εγκατεστημένο. Για την επεξεÏγασία του αÏχείου glade απαιτείται το glade (http://home.wtal.de/petig/Gtk/).
+Comment[es]=Genera una sencilla aplicación Gtk--. Debe tener instalado Gtkmm >= 2.8.0. Para editar archivos glade se necesita glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[et]=Lihtsa Gtk-- rakenduse loomine. Paigaldatud peab olema Gtkmm >= 2.8.0. Glade-faili redigeerimiseks on vajalik glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[fr]=Génère une application Gtk-- simple. Gtkmm >= 2.8.0 devra être installé. Pour modifier le fichier glade, glade-- (http://home.wtal.de/petig/Gtk/) est requis.
+Comment[hu]=Létrehoz egy egyszerű Gtk---alapú alkalmazást. Gtkmm >= 2.8.0 szükséges hozzá. Glade-fájl szerkesztéséhez glade-- (http://home.wtal.de/petig/Gtk/) szükséges.
+Comment[it]=Genera una semplice applicazione Gtk--. Dovrebbe essere installato Gtkmm >= 2.8.0. Per modificare il file di glade bisogna avere glade-- installato (http://home.wtal.de/petig/Gtk/).
+Comment[ja]=ç°¡å˜ãª Gtk-- アプリケーションを作æˆã—ã¾ã™ã€‚Gtkmm >= 2.8.0 ãŒå¿…è¦ã§ã™ã€‚Glade ファイルを編集ã™ã‚‹ã«ã¯ glade (http://home.wtal.de/petig/Gtk/) ãŒå¿…è¦ã§ã™ã€‚
+Comment[nds]=Stellt en eenfach "Gtk--"-Programm op. Gtkmm >= 2.8.0 schull installeert wesen. För't Bewerken vun de glade-Datei deit "glade--" (http://home.wtal.de/petig/Gtk/) noot.
+Comment[nl]=Genereert een eenvoudige Gtk-- toepassing. Gtkmm >= 2.8.0 dient te zijn geïnstalleerd. Om het glade-bestand te kunnen bewerken hebt u glade-- (http://home.wtal.de/petig/Gtk/) nodig.
+Comment[pl]=Generuje prosty program Gtk--. Powinno być zainstalowane Gtkmm w wersji >= 2.8.0. Do modyfikacji plików glade konieczne jest glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[pt]=Gera uma aplicação simples em Gtk--. Deverá estar instalado o Gtkmm >= 2.8.0. Para editar o ficheiro do Glade,, é necessário o glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[pt_BR]=Gera uma aplicação simples em Gtk--. Deverá estar instalado o Gtkmm >= 2.8.0. Para editar o ficheiro do Glade,, é necessário o glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Gtk--. ТребуетÑÑ Gtkmm >= 1.2.8 и < 1.3.0. Ð”Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° glade нужна ÑоответÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° (http://home.wtal.de/petig/Gtk/).
+Comment[sk]=Vygeneruje jednoduchú Gtk-- aplikáciu. Vyžaduje nainštalované Gtkmm >= 2.8.0. Na editovanie glade súboru he potrebný glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[sr]=Прави једноÑтаван Gtk-- програм. Gtkmm >= 2.8.0 требало би да је инÑталиран. Да биÑте уређивали glade фајл, неопходан је glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[sr@Latn]=Pravi jednostavan Gtk-- program. Gtkmm >= 2.8.0 trebalo bi da je instaliran. Da biste uređivali glade fajl, neophodan je glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[sv]=Skapar ett enkelt Gtk-- program. Gtkmm >= 2.8.0 måste vara installerat. För att redigera glade-filer krävs glade-- (http://home.wtal.de/petig/Gtk/).
+Comment[zh_TW]=產生一個簡單的 Gtk-- 應用程å¼ã€‚è¦å…ˆå®‰è£ Gtkmm 版本 >= 2.8.0。è¦ç·¨è¼¯ glade 檔則è¦å…ˆå®‰è£ glade-- (http://home.wtal.de/petig/Gtk/)。
+FileTemplates=hh,CStyle,cc,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=gtk2mmapp.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/configure.in
+Dest=%{dest}/configure.in
+
+[FILE4]
+Type=install
+Source=%{src}/acconfig.h
+Dest=%{dest}/acconfig.h
+
+[FILE5]
+Type=install
+Source=%{src}/config.h
+Dest=%{dest}/config.h
+
+[FILE6]
+Type=install
+Source=%{src}/autogen.sh
+Dest=%{dest}/autogen.sh
+
+[FILE7]
+Type=install
+Source=%{src}/gtk2mm.glade
+Dest=%{dest}/%{APPNAMELC}.glade
+
+[FILE8]
+Type=install
+Source=%{src}/gtk2mm.gladep
+Dest=%{dest}/%{APPNAMELC}.gladep
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE9]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE10]
+Type=install
+Source=%{src}/gtk2mm.cc
+Dest=%{dest}/src/%{APPNAMELC}.cc
+
+[FILE11]
+Type=install
+Source=%{src}/main_window.hh
+Dest=%{dest}/src/main_window.hh
+
+[FILE12]
+Type=install
+Source=%{src}/main_window.cc
+Dest=%{dest}/src/main_window.cc
+
+[FILE13]
+Type=install
+Source=%{src}/main_window_glade.hh
+Dest=%{dest}/src/main_window_glade.hh
+
+[FILE14]
+Type=install
+Source=%{src}/main_window_glade.cc
+Dest=%{dest}/src/main_window_glade.cc
+
+[MSG]
+Type=message
+Comment=A Gtk-- application framework was created in %{dest}
+Comment[ca]=Una infraestructura d'aplicació Gtk-- ha estat creada en %{dest}
+Comment[da]=Et Gtk-- programskelet blev oprettet i %{dest}
+Comment[de]=Ein Gtk-Anwendungsgerüst wurde in %{dest} erstellt.
+Comment[el]=Ένα πλαίσιο εφαÏμογής Gtk δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una infraestructura de aplicación Gtk-- ha sido creada en %{dest}
+Comment[et]=Gtk-- rakenduse raamistik loodi asukohta %{dest}
+Comment[eu]=Gtk-- aplikazioen lan-marko bat sortu da hemen: %{dest}
+Comment[fa]=یک چارچوب کاربرد Gtk-- در %{dest} ایجاد شد
+Comment[fr]=Une infrastructure d'application Gtk-- a été créée dans %{dest}
+Comment[ga]=Cruthaíodh creatlach feidhmchláir Gtk-- i %{dest}
+Comment[gl]=Creouse un contorno de traballo para aplicación Gtk en %{dest}
+Comment[hu]=Létrejött egy Gtk-s alkalmazás-keretrendszer itt: %{dest}
+Comment[it]=È stata creata l'infrastruttura per un'applicazione Gtk-- in %{dest}
+Comment[ja]=Gtk-- アプリケーションフレームワークを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en "Gtk-- "-Programmrahmenwark opstellt
+Comment[ne]=Gtk-- अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Gtk-- toepassing is aangemaakt in %{dest}
+Comment[pl]=Szablon programu Gtk-- został utworzony w %{dest}
+Comment[pt]=Foi criada a plataforma de uma aplicação Gtk-- em %{dest}
+Comment[pt_BR]=Foi criada a plataforma de uma aplicação Gtk-- em %{dest}
+Comment[ru]=Приложение Gtk-- Ñоздано в %{dest}
+Comment[sk]=Gtk-- aplikaÄný framework bol vytvorený v %{dest}
+Comment[sl]=Ogrodje za program v Gtk-- je bil ustvarjen v %{dest}
+Comment[sr]=Радни оквир Gtk-- програма направљен је у %{dest}
+Comment[sr@Latn]=Radni okvir Gtk-- programa napravljen je u %{dest}
+Comment[sv]=Ett Gtk-- programramverk skapades i %{dest}
+Comment[tr]=Bir Gtk-- uygulama çatısı %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个 Gtk-- 应用程åºæ¡†æž¶
+Comment[zh_TW]=一個 Gtk-- 應用程å¼æ¡†æž¶å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/gtk2mmapp/gtk2mmapp.png b/languages/cpp/app_templates/gtk2mmapp/gtk2mmapp.png
new file mode 100644
index 00000000..253a6229
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/gtk2mmapp.png
Binary files differ
diff --git a/languages/cpp/app_templates/gtk2mmapp/main_window.cc b/languages/cpp/app_templates/gtk2mmapp/main_window.cc
new file mode 100644
index 00000000..ad36b327
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/main_window.cc
@@ -0,0 +1,12 @@
+%{CC_TEMPLATE}
+
+// newer (non customized) versions of this file go to main_window.cc_new
+
+// This file is for your program, I won't touch it again!
+
+#include "config.h"
+#include "main_window.hh"
+
+bool main_window::quit(GdkEventAny *ev)
+{ return 0;
+}
diff --git a/languages/cpp/app_templates/gtk2mmapp/main_window.hh b/languages/cpp/app_templates/gtk2mmapp/main_window.hh
new file mode 100644
index 00000000..640e1461
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/main_window.hh
@@ -0,0 +1,19 @@
+%{HH_TEMPLATE}
+
+// newer (non customized) versions of this file go to main_window.hh_new
+
+// you might replace
+// class foo : public foo_glade { ... };
+// by
+// typedef foo_glade foo;
+// if you didn't make any modifications to the widget
+
+#ifndef _MAIN_WINDOW_HH
+# include "main_window_glade.hh"
+# define _MAIN_WINDOW_HH
+class main_window : public main_window_glade
+{
+
+ bool quit(GdkEventAny *ev);
+};
+#endif
diff --git a/languages/cpp/app_templates/gtk2mmapp/main_window_glade.cc b/languages/cpp/app_templates/gtk2mmapp/main_window_glade.cc
new file mode 100644
index 00000000..829855a8
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/main_window_glade.cc
@@ -0,0 +1,40 @@
+%{CC_TEMPLATE}
+
+// DO NOT EDIT THIS FILE ! It was created using glade--
+// for gtk 2.8.3 and gtkmm 2.8.0
+//
+// Please modify the corresponding derived classes in ./src/main_window.cc
+
+
+#if defined __GNUC__ && __GNUC__ < 3
+#error This program will crash if compiled with g++ 2.x
+// see the dynamic_cast bug in the gtkmm FAQ
+#endif //
+#include "config.h"
+#include <gtkmmconfig.h>
+#if GTKMM_MAJOR_VERSION==2 && GTKMM_MINOR_VERSION>2
+#include <sigc++/compatibility.h>
+#define GMM_GTKMM_22_24(a,b) b
+#else //gtkmm 2.2
+#define GMM_GTKMM_22_24(a,b) a
+#endif //
+#include "main_window_glade.hh"
+#include <gdk/gdkkeysyms.h>
+#include <gtkmm/accelgroup.h>
+
+main_window_glade::main_window_glade(
+) : Gtk::Window(Gtk::WINDOW_TOPLEVEL)
+{ main_window = this;
+ gmm_data = new GlademmData(get_accel_group());
+ main_window->set_title("%{APPNAME} Project");
+ main_window->set_modal(false);
+ main_window->property_window_position().set_value(Gtk::WIN_POS_CENTER);
+ main_window->set_resizable(true);
+ main_window->property_destroy_with_parent().set_value(false);
+ main_window->show();
+ main_window->signal_delete_event().connect(SigC::slot(*this, &main_window_glade::quit), false);
+}
+
+main_window_glade::~main_window_glade()
+{ delete gmm_data;
+}
diff --git a/languages/cpp/app_templates/gtk2mmapp/main_window_glade.hh b/languages/cpp/app_templates/gtk2mmapp/main_window_glade.hh
new file mode 100644
index 00000000..3c0cc27a
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/main_window_glade.hh
@@ -0,0 +1,48 @@
+%{HH_TEMPLATE}
+
+// DO NOT EDIT THIS FILE ! It was created using glade--
+// for gtk 2.8.3 and gtkmm 2.8.0
+//
+// Please modify the corresponding derived classes in ./src/main_window.hh and./src/main_window.cc
+
+#ifndef _MAIN_WINDOW_GLADE_HH
+# define _MAIN_WINDOW_GLADE_HH
+
+
+#if !defined(GLADEMM_DATA)
+#define GLADEMM_DATA
+#include <gtkmm/accelgroup.h>
+
+class GlademmData
+{
+
+ Glib::RefPtr<Gtk::AccelGroup> accgrp;
+public:
+
+ GlademmData(Glib::RefPtr<Gtk::AccelGroup> ag) : accgrp(ag)
+ {
+ }
+
+ Glib::RefPtr<Gtk::AccelGroup> getAccelGroup()
+ { return accgrp;
+ }
+};
+#endif //GLADEMM_DATA
+
+#include <gtkmm/window.h>
+
+class main_window_glade : public Gtk::Window
+{
+
+ GlademmData *gmm_data;
+public:
+ class Gtk::Window * main_window;
+protected:
+
+ main_window_glade();
+
+ ~main_window_glade();
+private:
+ virtual bool quit(GdkEventAny *ev) = 0;
+};
+#endif
diff --git a/languages/cpp/app_templates/gtk2mmapp/src-Makefile.am b/languages/cpp/app_templates/gtk2mmapp/src-Makefile.am
new file mode 100644
index 00000000..a8c856e9
--- /dev/null
+++ b/languages/cpp/app_templates/gtk2mmapp/src-Makefile.am
@@ -0,0 +1,14 @@
+bin_PROGRAMS = %{APPNAMELC}
+
+%{APPNAMELC}_SOURCES = \
+ %{APPNAMELC}.cc\
+ main_window_glade.cc \
+ main_window.cc
+
+noinst_HEADERS = \
+ main_window_glade.hh \
+ main_window.hh
+
+AM_CXXFLAGS = @CXXFLAGS@ @GTKMM_CFLAGS@
+
+%{APPNAMELC}_LDADD = @LIBS@ @GTKMM_LIBS@
diff --git a/languages/cpp/app_templates/kapp/.kdev_ignore b/languages/cpp/app_templates/kapp/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/.kdev_ignore
diff --git a/languages/cpp/app_templates/kapp/Makefile.am b/languages/cpp/app_templates/kapp/Makefile.am
new file mode 100644
index 00000000..efe532d3
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = app.cpp app.h pref.cpp pref.h appview.cpp appview.h \
+ appiface.h app_client.cpp main.cpp appui.rc src-Makefile.am \
+ kapp.png app.kdevelop subdirs README
+
+templateName = kapp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kapp/README b/languages/cpp/app_templates/kapp/README
new file mode 100644
index 00000000..f04a5635
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/README
@@ -0,0 +1,81 @@
+-----------------------------------------------
+Kde application framework template quickstart
+Author: Thomas Nagy
+Date: 2004-03-22
+-----------------------------------------------
+
+This README file explains you basic things for starting with
+this application template.
+
+
+** Building and installing **
+
+* Build the configure script by "make -f Makefile.cvs"
+
+* To clean, use "make clean", and to clean everything
+(remove the makefiles, etc), use "make distclean"
+
+* To distribute your program, try "make dist".
+This will make a compact tarball archive of your release with the
+necessary scripts inside.
+
+* Modifying the auto-tools scripts
+for automake scripts there is an excellent tutorial there :
+http://developer.kde.org/documentation/other/makefile_am_howto.html
+
+* Simplify your life : install the project in your home directory for
+testing purposes.
+./configure --prefix=/home/user/dummyfolder/
+In the end when you finished the development you can
+rm -rf /home/user/dummyfolder/
+without fear.
+
+
+** Technologies **
+
+* Build the menus of your application easily
+kde applications now use an xml file (*ui.rc file) to build the menus.
+This allow a great customization of the application. However, when
+programming the menu is shown only after a "make install"
+
+For more details, consult :
+http://devel-home.kde.org/~larrosa/tutorial/p9.html
+http://developer.kde.org/documentation/tutorials/xmlui/preface.html
+
+* Use KConfig XT to create your configuration dialogs and make
+them more maintainable.
+
+For more details, consult :
+http://developer.kde.org/documentation/tutorials/kconfigxt/kconfigxt.html
+
+* With KParts, you can embed other kde components in your program, or make your program
+embeddable in other apps. For example, the kmplayer kpart can be called to play videos
+in your app.
+
+For more details, consult :
+http://www-106.ibm.com/developerworks/library/l-kparts/
+http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html
+
+* With dcop, you can control your app from other applications
+Make sure to include K_DCOP and a kdcop: section in your .h file
+http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html
+
+
+** Documentation **
+
+* For the translations :
+1. Download a patched gettext which can be found at:
+ http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/
+2. Install that gettext in ~/bin/
+3. cd ~/yourproject, export PATH=~/bin:$PATH, export
+KDEDIR=/where_your_KDE3_is
+4. make -f admin/Makefile.common package-messages
+5. make package-messages
+6. Translate the po files (not the pot!!) with kbabel or xemacs
+
+* Do not forget to write the documentation for your kde app
+edit the documentation template index.docbook in doc/
+
+
+
diff --git a/languages/cpp/app_templates/kapp/app.cpp b/languages/cpp/app_templates/kapp/app.cpp
new file mode 100644
index 00000000..5460bba9
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/app.cpp
@@ -0,0 +1,247 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include "pref.h"
+
+#include <qdragobject.h>
+#include <kprinter.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kdeversion.h>
+#include <kstatusbar.h>
+#include <kaccel.h>
+#include <kio/netaccess.h>
+#include <kfiledialog.h>
+#include <kconfig.h>
+#include <kurl.h>
+#include <kurldrag.h>
+#include <kurlrequesterdlg.h>
+
+#include <kstdaccel.h>
+#include <kaction.h>
+#include <kstdaction.h>
+
+%{APPNAME}::%{APPNAME}()
+ : KMainWindow( 0, "%{APPNAME}" ),
+ m_view(new %{APPNAME}View(this)),
+ m_printer(0)
+{
+ // accept dnd
+ setAcceptDrops(true);
+
+ // tell the KMainWindow that this is indeed the main widget
+ setCentralWidget(m_view);
+
+ // then, setup our actions
+ setupActions();
+
+ // and a status bar
+ statusBar()->show();
+
+ // Apply the create the main window and ask the mainwindow to
+ // automatically save settings if changed: window size, toolbar
+ // position, icon size, etc. Also to add actions for the statusbar
+ // toolbar, and keybindings if necessary.
+ setupGUI();
+
+ // allow the view to change the statusbar and caption
+ connect(m_view, SIGNAL(signalChangeStatusbar(const QString&)),
+ this, SLOT(changeStatusbar(const QString&)));
+ connect(m_view, SIGNAL(signalChangeCaption(const QString&)),
+ this, SLOT(changeCaption(const QString&)));
+
+}
+
+%{APPNAME}::~%{APPNAME}()
+{
+}
+
+void %{APPNAME}::load(const KURL& url)
+{
+ QString target;
+ // the below code is what you should normally do. in this
+ // example case, we want the url to our own. you probably
+ // want to use this code instead for your app
+
+ #if 0
+ // download the contents
+ if (KIO::NetAccess::download(url, target))
+ {
+ // set our caption
+ setCaption(url);
+
+ // load in the file (target is always local)
+ loadFile(target);
+
+ // and remove the temp file
+ KIO::NetAccess::removeTempFile(target);
+ }
+ #endif
+
+ setCaption(url.prettyURL());
+ m_view->openURL(url);
+}
+
+void %{APPNAME}::setupActions()
+{
+ KStdAction::openNew(this, SLOT(fileNew()), actionCollection());
+ KStdAction::open(this, SLOT(fileOpen()), actionCollection());
+ KStdAction::save(this, SLOT(fileSave()), actionCollection());
+ KStdAction::saveAs(this, SLOT(fileSaveAs()), actionCollection());
+ KStdAction::print(this, SLOT(filePrint()), actionCollection());
+ KStdAction::quit(kapp, SLOT(quit()), actionCollection());
+
+ KStdAction::preferences(this, SLOT(optionsPreferences()), actionCollection());
+
+ // this doesn't do anything useful. it's just here to illustrate
+ // how to insert a custom menu and menu item
+ KAction *custom = new KAction(i18n("Cus&tom Menuitem"), 0,
+ this, SLOT(optionsPreferences()),
+ actionCollection(), "custom_action");
+}
+
+void %{APPNAME}::saveProperties(KConfig *config)
+{
+ // the 'config' object points to the session managed
+ // config file. anything you write here will be available
+ // later when this app is restored
+
+ if (!m_view->currentURL().isEmpty()) {
+#if KDE_IS_VERSION(3,1,3)
+ config->writePathEntry("lastURL", m_view->currentURL());
+#else
+ config->writeEntry("lastURL", m_view->currentURL());
+#endif
+ }
+}
+
+void %{APPNAME}::readProperties(KConfig *config)
+{
+ // the 'config' object points to the session managed
+ // config file. this function is automatically called whenever
+ // the app is being restored. read in here whatever you wrote
+ // in 'saveProperties'
+
+ QString url = config->readPathEntry("lastURL");
+
+ if (!url.isEmpty())
+ m_view->openURL(KURL(url));
+}
+
+void %{APPNAME}::dragEnterEvent(QDragEnterEvent *event)
+{
+ // accept uri drops only
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void %{APPNAME}::dropEvent(QDropEvent *event)
+{
+ // this is a very simplistic implementation of a drop event. we
+ // will only accept a dropped URL. the Qt dnd code can do *much*
+ // much more, so please read the docs there
+ KURL::List urls;
+
+ // see if we can decode a URI.. if not, just ignore it
+ if (KURLDrag::decode(event, urls) && !urls.isEmpty())
+ {
+ // okay, we have a URI.. process it
+ const KURL &url = urls.first();
+
+ // load in the file
+ load(url);
+ }
+}
+
+void %{APPNAME}::fileNew()
+{
+ // this slot is called whenever the File->New menu is selected,
+ // the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ // button is clicked
+
+ // create a new window
+ (new %{APPNAME})->show();
+}
+
+void %{APPNAME}::fileOpen()
+{
+ // this slot is called whenever the File->Open menu is selected,
+ // the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
+ // button is clicked
+/*
+ // this brings up the generic open dialog
+ KURL url = KURLRequesterDlg::getURL(QString::null, this, i18n("Open Location") );
+*/
+ // standard filedialog
+ KURL url = KFileDialog::getOpenURL(QString::null, QString::null, this, i18n("Open Location"));
+ if (!url.isEmpty())
+ m_view->openURL(url);
+}
+
+void %{APPNAME}::fileSave()
+{
+ // this slot is called whenever the File->Save menu is selected,
+ // the Save shortcut is pressed (usually CTRL+S) or the Save toolbar
+ // button is clicked
+
+ // save the current file
+}
+
+void %{APPNAME}::fileSaveAs()
+{
+ // this slot is called whenever the File->Save As menu is selected,
+ KURL file_url = KFileDialog::getSaveURL();
+ if (!file_url.isEmpty() && file_url.isValid())
+ {
+ // save your info, here
+ }
+}
+
+void %{APPNAME}::filePrint()
+{
+ // this slot is called whenever the File->Print menu is selected,
+ // the Print shortcut is pressed (usually CTRL+P) or the Print toolbar
+ // button is clicked
+ if (!m_printer) m_printer = new KPrinter;
+ if (m_printer->setup(this))
+ {
+ // setup the printer. with Qt, you always "print" to a
+ // QPainter.. whether the output medium is a pixmap, a screen,
+ // or paper
+ QPainter p;
+ p.begin(m_printer);
+
+ // we let our view do the actual printing
+ QPaintDeviceMetrics metrics(m_printer);
+ m_view->print(&p, metrics.height(), metrics.width());
+
+ // and send the result to the printer
+ p.end();
+ }
+}
+
+void %{APPNAME}::optionsPreferences()
+{
+ // popup some sort of preference dialog, here
+ %{APPNAME}Preferences dlg;
+ if (dlg.exec())
+ {
+ // redo your settings
+ }
+}
+
+void %{APPNAME}::changeStatusbar(const QString& text)
+{
+ // display the text on the statusbar
+ statusBar()->message(text);
+}
+
+void %{APPNAME}::changeCaption(const QString& text)
+{
+ // display the text on the caption
+ setCaption(text);
+}
+#include "%{APPNAMELC}.moc"
diff --git a/languages/cpp/app_templates/kapp/app.desktop b/languages/cpp/app_templates/kapp/app.desktop
new file mode 100644
index 00000000..7389904a
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/app.desktop
@@ -0,0 +1,44 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC} %i -caption "%c"
+Icon=%{APPNAMELC}
+Type=Application
+X-DocPath=%{APPNAMELC}/%{APPNAMELC}.html
+Comment=A KDE KPart Application
+Comment[br]=Ur meziant Kpart evit KDE
+Comment[ca]=Una aplicació KPart per al KDE
+Comment[cy]=Cymhwysiad KPart KDE
+Comment[da]=Et KDE KPart-program
+Comment[de]=Eine auf der Komponententechnik KPart basierende KDE-Anwendung
+Comment[el]=Μια εφαÏμογή KPart του KDE
+Comment[es]=Una aplicación KPart de KDE
+Comment[et]=KDE KPart rakendus
+Comment[eu]=KDE KPart aplikazio bat
+Comment[fa]=یک کاربرد KDE KPart
+Comment[fr]=Une application KPart pour KDE
+Comment[ga]=Feidhmchlár KPart KDE
+Comment[gl]=Unha aplicación KPart de KDE
+Comment[hi]=à¤à¤• केडीई के-पारà¥à¤Ÿ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=KPart-alapú KDE-alkalmazás
+Comment[is]=KDE KPart forrit
+Comment[it]=Applicazione KPart di KDE
+Comment[ja]=KDE KPart アプリケーション
+Comment[lt]=KDE KPart programa
+Comment[nds]=En KPart-Deelprogramm för KDE
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ केडीई KPart अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een KDE KPart-toepassing
+Comment[pl]=Osadzalny element KPart KDE
+Comment[pt]=Uma Aplicação KPart do KDE
+Comment[pt_BR]=Um Aplicativo KPart do KDE
+Comment[ru]=Приложение KPart Ð´Ð»Ñ KDE
+Comment[sk]=KDE KPart aplikácia
+Comment[sl]=Program KPart za KDE
+Comment[sr]=KDE KPart програм
+Comment[sr@Latn]=KDE KPart program
+Comment[sv]=Ett KDE Kpart-program
+Comment[ta]=கெடி கெபாரà¯à®Ÿà¯ பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Ба кор андохтани KPart барои KDE
+Comment[tr]=Bir KDE KPart Uygulaması
+Comment[zh_CN]=一个 KDE KPart 应用程åº
+Comment[zh_TW]=KDE KPart 應用程å¼
+Terminal=false
diff --git a/languages/cpp/app_templates/kapp/app.h b/languages/cpp/app_templates/kapp/app.h
new file mode 100644
index 00000000..45c65f4b
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/app.h
@@ -0,0 +1,89 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <kmainwindow.h>
+
+#include "%{APPNAMELC}view.h"
+
+class KPrinter;
+class KURL;
+
+/**
+ * This class serves as the main window for %{APPNAME}. It handles the
+ * menus, toolbars, and status bars.
+ *
+ * @short Main window class
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAME} : public KMainWindow
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ %{APPNAME}();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~%{APPNAME}();
+
+ /**
+ * Use this method to load whatever file/URL you have
+ */
+ void load(const KURL& url);
+
+protected:
+ /**
+ * Overridden virtuals for Qt drag 'n drop (XDND)
+ */
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void dropEvent(QDropEvent *event);
+
+protected:
+ /**
+ * This function is called when it is time for the app to save its
+ * properties for session management purposes.
+ */
+ void saveProperties(KConfig *);
+
+ /**
+ * This function is called when this app is restored. The KConfig
+ * object points to the session management config file that was saved
+ * with @ref saveProperties
+ */
+ void readProperties(KConfig *);
+
+
+private slots:
+ void fileNew();
+ void fileOpen();
+ void fileSave();
+ void fileSaveAs();
+ void filePrint();
+ void optionsPreferences();
+
+ void changeStatusbar(const QString& text);
+ void changeCaption(const QString& text);
+
+private:
+ void setupAccel();
+ void setupActions();
+
+private:
+ %{APPNAME}View *m_view;
+
+ KPrinter *m_printer;
+};
+
+#endif // _%{APPNAMEUC}_H_
+
diff --git a/languages/cpp/app_templates/kapp/app.kdevelop b/languages/cpp/app_templates/kapp/app.kdevelop
new file mode 100644
index 00000000..07cf3f0f
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/app.kdevelop
@@ -0,0 +1,168 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <ignoreparts/>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>false</terminal>
+ </run>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ </make>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs/>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ <runappinappdirectory>true</runappinappdirectory>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions/>
+ <updateoptions>-dP</updateoptions>
+ <addoptions/>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions/>
+ <rshoptions/>
+ </kdevcvs>
+ <cppsupportpart>
+ <codecompletion/>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL/>
+ <implementationURL/>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kapp/app.kdevses b/languages/cpp/app_templates/kapp/app.kdevses
new file mode 100644
index 00000000..dcd1c8c1
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/app.kdevses
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE KDevPrjSession>
+<KDevPrjSession>
+ <DocsAndViews NumberOfDocuments="0" />
+ <pluginList>
+ <kdevbookmarks>
+ <bookmarks/>
+ </kdevbookmarks>
+ <kdevdebugger>
+ <breakpointList/>
+ </kdevdebugger>
+ </pluginList>
+</KDevPrjSession>
diff --git a/languages/cpp/app_templates/kapp/app_client.cpp b/languages/cpp/app_templates/kapp/app_client.cpp
new file mode 100644
index 00000000..5c062077
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/app_client.cpp
@@ -0,0 +1,26 @@
+%{CPP_TEMPLATE}
+
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <qdatastream.h>
+#include <qstring.h>
+
+int main(int argc, char **argv)
+{
+ KApplication app(argc, argv, "%{APPNAMELC}_client", false);
+
+ // get our DCOP client and attach so that we may use it
+ DCOPClient *client = app.dcopClient();
+ client->attach();
+
+ // do a 'send' for now
+ QByteArray data;
+ QDataStream ds(data, IO_WriteOnly);
+ if (argc > 1)
+ ds << QString(argv[1]);
+ else
+ ds << QString("http://www.kde.org");
+ client->send("%{APPNAMELC}", "%{APPNAME}Iface", "openURL(QString)", data);
+
+ return app.exec();
+}
diff --git a/languages/cpp/app_templates/kapp/appiface.h b/languages/cpp/app_templates/kapp/appiface.h
new file mode 100644
index 00000000..4a24ae7f
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/appiface.h
@@ -0,0 +1,17 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}IFACE_H_
+#define _%{APPNAMEUC}IFACE_H_
+
+#include <dcopobject.h>
+
+class %{APPNAME}Iface : virtual public DCOPObject
+{
+ K_DCOP
+public:
+
+k_dcop:
+ virtual void openURL(QString url) = 0;
+};
+
+#endif // _%{APPNAMEUC}IFACE_H_
diff --git a/languages/cpp/app_templates/kapp/appui.rc b/languages/cpp/app_templates/kapp/appui.rc
new file mode 100644
index 00000000..ceb4f14e
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="custom"><text>C&amp;ustom</text>
+ <Action name="custom_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kapp/appview.cpp b/languages/cpp/app_templates/kapp/appview.cpp
new file mode 100644
index 00000000..a57adbf3
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/appview.cpp
@@ -0,0 +1,107 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}view.h"
+
+#include <qpainter.h>
+#include <qlayout.h>
+
+#include <kurl.h>
+
+#include <ktrader.h>
+#include <klibloader.h>
+#include <kmessagebox.h>
+#include <krun.h>
+#include <klocale.h>
+
+%{APPNAME}View::%{APPNAME}View(QWidget *parent)
+ : QWidget(parent),
+ DCOPObject("%{APPNAME}Iface")
+{
+ // setup our layout manager to automatically add our widgets
+ QHBoxLayout *top_layout = new QHBoxLayout(this);
+ top_layout->setAutoAdd(true);
+
+ // we want to look for all components that satisfy our needs. the
+ // trader will actually search through *all* registered KDE
+ // applications and components -- not just KParts. So we have to
+ // specify two things: a service type and a constraint
+ //
+ // the service type is like a mime type. we say that we want all
+ // applications and components that can handle HTML -- 'text/html'
+ //
+ // however, by itself, this will return such things as Netscape..
+ // not what we wanted. so we constrain it by saying that the
+ // string 'KParts/ReadOnlyPart' must be found in the ServiceTypes
+ // field. with this, only components of the type we want will be
+ // returned.
+ KTrader::OfferList offers = KTrader::self()->query("text/html", "'KParts/ReadOnlyPart' in ServiceTypes");
+
+ KLibFactory *factory = 0;
+ // in theory, we only care about the first one.. but let's try all
+ // offers just in case the first can't be loaded for some reason
+ KTrader::OfferList::Iterator it(offers.begin());
+ for( ; it != offers.end(); ++it)
+ {
+ KService::Ptr ptr = (*it);
+
+ // we now know that our offer can handle HTML and is a part.
+ // since it is a part, it must also have a library... let's try to
+ // load that now
+ factory = KLibLoader::self()->factory( ptr->library() );
+ if (factory)
+ {
+ m_html = static_cast<KParts::ReadOnlyPart *>(factory->create(this, ptr->name(), "KParts::ReadOnlyPart"));
+ break;
+ }
+ }
+
+ // if our factory is invalid, then we never found our component
+ // and we might as well just exit now
+ if (!factory)
+ {
+ KMessageBox::error(this, i18n("Could not find a suitable HTML component"));
+ return;
+ }
+
+ connect(m_html, SIGNAL(setWindowCaption(const QString&)),
+ this, SLOT(slotSetTitle(const QString&)));
+ connect(m_html, SIGNAL(setStatusBarText(const QString&)),
+ this, SLOT(slotOnURL(const QString&)));
+
+}
+
+%{APPNAME}View::~%{APPNAME}View()
+{
+}
+
+void %{APPNAME}View::print(QPainter *p, int height, int width)
+{
+ // do the actual printing, here
+ // p->drawText(etc..)
+}
+
+QString %{APPNAME}View::currentURL()
+{
+ return m_html->url().url();
+}
+
+void %{APPNAME}View::openURL(QString url)
+{
+ openURL(KURL(url));
+}
+
+void %{APPNAME}View::openURL(const KURL& url)
+{
+ m_html->openURL(url);
+}
+
+void %{APPNAME}View::slotOnURL(const QString& url)
+{
+ emit signalChangeStatusbar(url);
+}
+
+void %{APPNAME}View::slotSetTitle(const QString& title)
+{
+ emit signalChangeCaption(title);
+}
+#include "%{APPNAMELC}view.moc"
diff --git a/languages/cpp/app_templates/kapp/appview.h b/languages/cpp/app_templates/kapp/appview.h
new file mode 100644
index 00000000..ae0c6b6d
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/appview.h
@@ -0,0 +1,77 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}VIEW_H_
+#define _%{APPNAMEUC}VIEW_H_
+
+#include <qwidget.h>
+#include <kparts/part.h>
+#include <%{APPNAMELC}iface.h>
+
+class QPainter;
+class KURL;
+
+/**
+ * This is the main view class for %{APPNAME}. Most of the non-menu,
+ * non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ * here.
+ *
+ * This %{APPNAMELC} uses an HTML component as an example.
+ *
+ * @short Main view
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAME}View : public QWidget, public %{APPNAME}Iface
+{
+ Q_OBJECT
+public:
+ /**
+ * Default constructor
+ */
+ %{APPNAME}View(QWidget *parent);
+
+ /**
+ * Destructor
+ */
+ virtual ~%{APPNAME}View();
+
+ /**
+ * Random 'get' function
+ */
+ QString currentURL();
+
+ /**
+ * Random 'set' function accessed by DCOP
+ */
+ virtual void openURL(QString url);
+
+ /**
+ * Random 'set' function
+ */
+ virtual void openURL(const KURL& url);
+
+ /**
+ * Print this view to any medium -- paper or not
+ */
+ void print(QPainter *, int height, int width);
+
+signals:
+ /**
+ * Use this signal to change the content of the statusbar
+ */
+ void signalChangeStatusbar(const QString& text);
+
+ /**
+ * Use this signal to change the content of the caption
+ */
+ void signalChangeCaption(const QString& text);
+
+private slots:
+ void slotOnURL(const QString& url);
+ void slotSetTitle(const QString& title);
+
+private:
+ KParts::ReadOnlyPart *m_html;
+};
+
+#endif // _%{APPNAMEUC}VIEW_H_
diff --git a/languages/cpp/app_templates/kapp/kapp.kdevtemplate b/languages/cpp/app_templates/kapp/kapp.kdevtemplate
new file mode 100644
index 00000000..7865c973
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/kapp.kdevtemplate
@@ -0,0 +1,253 @@
+# KDE Config File
+[General]
+Name=Application framework
+Name[ca]=Infraestructura d'aplicacions
+Name[da]=Programskelet
+Name[de]=Anwendungsgrundgerüst
+Name[el]=Πλαίσιο εφαÏμογής
+Name[es]=Infraestructura de aplicación
+Name[et]=Rakenduse raamistik
+Name[eu]=Aplikazioen lan-markoa
+Name[fa]=چارچوب کاربرد
+Name[fr]=Infrastructure d'application
+Name[ga]=Creatlach feidhmchláir
+Name[gl]=Entorno de traballo para aplicación
+Name[hu]=Alkalmazás-keretrendszer
+Name[it]=Infrastruttura applicativa
+Name[ja]=アプリケーションフレームワーク
+Name[nds]=Programmrahmenwark
+Name[ne]=अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤•
+Name[nl]=Applicationframework
+Name[pl]=Szablon programu
+Name[pt]=Plataforma de aplicações
+Name[pt_BR]=Plataforma de aplicações
+Name[ru]=Приложение KDE
+Name[sk]=AplikaÄný framework
+Name[sl]=Ogrodje programa
+Name[sr]=Радни оквир програма
+Name[sr@Latn]=Radni okvir programa
+Name[sv]=Programramverk
+Name[tr]=Uygulama Çatısı
+Name[zh_CN]=应用程åºæ¡†æž¶
+Name[zh_TW]=應用程å¼æ¡†æž¶
+Icon=kapp.png
+Category=C++/KDE
+Comment=Generates a simple KDE application with one toplevel window, menus and toolbars. A DCOP interface is also provided, so that your application can provide a scripting interface
+Comment[ca]=Genera una simple aplicació per al KDE amb una finestra principal, menús i barres d'eines. També es proveeix la interfície DCOP, de manera que la vostra aplicació podrà proveir d'una interfície per a scripts
+Comment[da]=Genererer et simpelt KDE program med et vindue på topniveau, menuer og værktøjslinjer. Der sørges også for en DCOP-grænseflade, så dit program kan sørge for en script-grænseflade
+Comment[de]=Erstellt eine einfache KDE-Anwendung mit einem Toplevel-Fenster, Menüs und Werkzeugleisten. Dazu kommt eine DCOP-Schnittstelle, so dass Ihre Anwendung eine Schnittstelle für Skripte anbieten kann.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή KDE με ένα ανώτεÏο παÏάθυÏο, Î¼ÎµÎ½Î¿Ï ÎºÎ±Î¹ γÏαμμές εÏγαλείων. Μια διασÏνδεση DCOP Ï€ÏοσφέÏεται επίσης, έτσι ώστε η εφαÏμογή σας να Ï€ÏοσφέÏει ένα πεÏιβάλλον γÏαφής σεναÏίων
+Comment[es]=Genera una sencilla aplicación de KDE con una ventana de nivel superior, menús y barras de herramientas. También se proporciona una interfaz DCOP para que su aplicación pueda proporcionar una interfaz para guiones de órdenes.
+Comment[et]=Lihtsa KDE rakenduse loomine ühe tipptaseme akna, menüüde ja tööriistaribadega. Lisatakse ka DCOP-liides, mis võimaldab pakkuda rakenduses ka skriptikeelte tuge.
+Comment[eu]=KDE aplikazio sinple bat sortzen du menu eta tresna-barradun goi-mailako lehio batekin. DCOP interfaze bat ere eskeintzen zaio aplikazioari, zure aplikazioak script interfaze bat izan dezan
+Comment[fa]=یک کاربرد سادۀ KDE با یک پنجرۀ سطح بالا، گزینگان Ùˆ میله ابزارها تولید می‌کند. همچنین یک واسط DCOP Ùراهم است. بنابراین، کاربرد شما یک واسط دست‌نوشته‌ای را می‌تواند Ùراهم کند
+Comment[fr]=Génère une application KDE simple comprenant une fenêtre de premier niveau, des menus et des barres d'outils. Une interface DCOP est également prévue, afin que votre application puisse offrir une interface de scriptage
+Comment[ga]=Cruthaíonn sé seo feidhmchlár simplí KDE le príomhfhuinneog amháin, roghchláir agus barraí uirlisí. Soláthraítear comhéadan DCOP freisin, d'fhonn is féidir comhéadan scriptithe a chur ar fáil
+Comment[gl]=Xera unha aplicación KDE sinxela cunha xanela principal, menús e barras de ferramentas. Tamén se proporciona unha interface DCOP de modo que a súa aplicación poida proveer unha interface de scripting.
+Comment[hu]=Létrehoz egy egyszerű KDE-alkalmazást egy főablakkal, menükkel és eszköztárakkal. DCOP-felület is létre lesz hozva, ezért az alkalmazás szkriptelési felületet is biztosíthat.
+Comment[it]=Genera una semplice applicazione KDE con una finestra toplevel, menu e barre degli strumenti. È anche fornita un'interfaccia DCOP così l'applicazione avrà un'interfaccia per lo scripting
+Comment[ja]=ç°¡å˜ãª KDE アプリケーションを作æˆã—ã¾ã™ã€‚アプリケーションã«ã¯ã€ãƒˆãƒƒãƒ—レベルã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã€ãƒ„ールãƒãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚スクリプト化をサãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã« DCOP ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚‚用æ„ã—ã¦ã‚ã‚Šã¾ã™ã€‚
+Comment[nds]=Stellt en eenfach KDE-Programm mit een böverst Finster, Menüs un Warktüüchbalkens op. Ok warrt noch en DCOP-Koppelsteed praatstellt, so dat Dien Programm en Skriptkoppelsteed anbeden kann
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ उचà¥à¤šà¤¤à¤¹ सञà¥à¤à¥à¤¯à¤¾à¤², मेनॠर उपकरणपटà¥à¤Ÿà¥€à¤¸à¤à¤— साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । DCOP पनि पà¥à¤°à¤¦à¤¾à¤¨ गरिनà¥à¤›, जसले गरà¥à¤¦à¤¾ तपाईà¤à¤•à¥‹ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤¿à¤™ इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨ सकà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudige KDE-toepassing met één toplevel window, menu's en toolbars. Er wordt ook een DCOP-interface aangeleverd, zodat uw toepassing een scripting interface kan aanleveren.
+Comment[pl]=Generuje prosty program dla KDE z oknem, menu i paskami narzędzi. Dostępny jest także interfejs DCOP, więc Twoje programy mogą zawierać interfejs do skryptów
+Comment[pt]=Gera uma aplicação simples do KDE com uma janela de topo, menus e barras de ferramentas. Também é oferecida uma interface de DCOP, para que a sua aplicação possa fornecer uma interface de programação
+Comment[pt_BR]=Gera uma aplicação simples do KDE com uma janela de topo, menus e barras de ferramentas. Também é oferecida uma interface de DCOP, para que a sua aplicação possa fornecer uma interface de programação
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE Ñ Ð¾ÐºÐ½Ð¾Ð¼, меню и панелÑми инÑтрументов. Кроме того, в нём ÑодержитÑÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ DCOP Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð°Ñ†Ð¸Ð¸ работы Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких Ñкриптов
+Comment[sk]=Vygenruje jednoduchú KDE aplikáciu s jedným oknom, menu apanelom nástrojov. Taktiež bude poskytnuté DCOP rozhranie, takže aj aplikáciamôže poskytnúť skriptovacie rozhranie
+Comment[sr]=Прави једноÑтаван KDE програм, Ñа једним прозором највишег нивоа, менијима и тракама Ñа алатом. Дат је и DCOP интерфејÑ, тако да ваш програм може да омогући Ñкриптовање
+Comment[sr@Latn]=Pravi jednostavan KDE program, sa jednim prozorom najvišeg nivoa, menijima i trakama sa alatom. Dat je i DCOP interfejs, tako da vaš program može da omogući skriptovanje
+Comment[sv]=Skapar ett enkelt KDE-program med ett toppnivåfönster, menyer och verktygsrader. Ett DCOP-gränssnitt tillhandahålls också, så att programmet kan tillhandahålla ett skriptgränssnitt.
+Comment[tr]=Bir üst seviye penceresi, menüleri ve araç çubukları olan basit bir KDE uygulaması yaratır. Bir DCOP arayüzü sağlanır, böylece uygulama bir betik arayüzü sağlayabilir.
+Comment[zh_CN]=生æˆä¸€ä¸ªå¸¦ä¸€ä¸ªé¡¶å±‚窗å£ã€èœå•å’Œå·¥å…·æ çš„ç®€å• KDE 应用程åºã€‚å¦å¤–还æ供了 DCOP 接å£ï¼Œè¿™æ ·æ‚¨çš„应用也å¯åŒæ—¶æ供脚本接å£ã€‚
+Comment[zh_TW]=產生一個簡單的 KDE 應用程å¼ï¼Œå…§å«é ‚層視窗ã€é¸å–®èˆ‡å·¥å…·åˆ—。å¦å¤–æ供一個 DCOP 介é¢ï¼Œè®“您的應用程å¼å¯ä»¥æ供文稿介é¢ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}view.cpp,%{dest}/src/README
+Archive=kapp.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE13]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE14]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE16]
+Type=install
+Source=%{src}/app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE17]
+Type=install
+Source=%{src}/appview.cpp
+Dest=%{dest}/src/%{APPNAMELC}view.cpp
+
+[FILE18]
+Type=install
+Source=%{src}/appview.h
+Dest=%{dest}/src/%{APPNAMELC}view.h
+
+[FILE19]
+Type=install
+Source=%{src}/appiface.h
+Dest=%{dest}/src/%{APPNAMELC}iface.h
+
+[FILE20]
+Type=install
+Source=%{src}/app_client.cpp
+Dest=%{dest}/src/%{APPNAMELC}_client.cpp
+
+[FILE21]
+Type=install
+Source=%{src}/pref.cpp
+Dest=%{dest}/src/pref.cpp
+
+[FILE22]
+Type=install
+Source=%{src}/pref.h
+Dest=%{dest}/src/pref.h
+
+[FILE23]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE24]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE25]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/src/README
+
+[MSG]
+Type=message
+Comment=A KDE Application was created at %{dest}
+Comment[ca]=Una aplicació per al KDE ha estat creada a %{dest}
+Comment[da]=Et KDE program blev oprettet i %{dest}
+Comment[de]=Eine KDE-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή KDE δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación de KDE ha sido creada en %{dest}
+Comment[et]=KDE rakendus loodi asukohta %{dest}
+Comment[eu]=A KDE aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد KDE در %{dest} Ùراهم شد
+Comment[fr]=Une application KDE a été créée dans %{dest}
+Comment[ga]=Cruthaíodh Feidhmchlár KDE ag %{dest}
+Comment[gl]=Creouse unha aplicación KDE en %{dest}
+Comment[hu]=Létrejött egy KDE-s alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione KDE in %{dest}
+Comment[ja]=KDE アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KDE-Programm opstellt
+Comment[ne]=KDE अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een KDE-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program dla KDE został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do KDE em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do KDE em %{dest}
+Comment[ru]=Приложение KDE Ñоздано в %{dest}
+Comment[sk]=KDE aplikácia bola vytvorená v %{dest}
+Comment[sl]=Program za KDE je bil ustvarjen v %{dest}
+Comment[sr]=KDE програм је направљен у %{dest}
+Comment[sr@Latn]=KDE program je napravljen u %{dest}
+Comment[sv]=Ett KDE-program skapades i %{dest}
+Comment[tr]=Bir KDE Uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 KDE 应用程åº
+Comment[zh_TW]=一個 KDE 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kapp/kapp.png b/languages/cpp/app_templates/kapp/kapp.png
new file mode 100644
index 00000000..a421a664
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/kapp.png
Binary files differ
diff --git a/languages/cpp/app_templates/kapp/main.cpp b/languages/cpp/app_templates/kapp/main.cpp
new file mode 100644
index 00000000..60c161e8
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/main.cpp
@@ -0,0 +1,61 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static const char description[] =
+ I18N_NOOP("A KDE Application");
+
+static const char version[] = "%{VERSION}";
+
+static KCmdLineOptions options[] =
+{
+ { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", 0, 0, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KApplication app;
+
+ // register ourselves as a dcop client
+ app.dcopClient()->registerAs(app.name(), false);
+
+ // see if we are starting with session management
+ if (app.isRestored())
+ {
+ RESTORE(%{APPNAME});
+ }
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->count() == 0)
+ {
+ %{APPNAME} *widget = new %{APPNAME};
+ widget->show();
+ }
+ else
+ {
+ int i = 0;
+ for (; i < args->count(); i++)
+ {
+ %{APPNAME} *widget = new %{APPNAME};
+ widget->show();
+ widget->load(args->url(i));
+ }
+ }
+ args->clear();
+ }
+
+ return app.exec();
+}
diff --git a/languages/cpp/app_templates/kapp/pref.cpp b/languages/cpp/app_templates/kapp/pref.cpp
new file mode 100644
index 00000000..ee647b1c
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/pref.cpp
@@ -0,0 +1,42 @@
+%{CPP_TEMPLATE}
+
+#include "pref.h"
+
+#include <klocale.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+
+%{APPNAME}Preferences::%{APPNAME}Preferences()
+ : KDialogBase(TreeList, i18n("%{APPNAME} Preferences"),
+ Help|Default|Ok|Apply|Cancel, Ok)
+{
+ // this is the base class for your preferences dialog. it is now
+ // a Treelist dialog.. but there are a number of other
+ // possibilities (including Tab, Swallow, and just Plain)
+ QFrame *frame;
+ frame = addPage(i18n("First Page"), i18n("Page One Options"));
+ m_pageOne = new %{APPNAME}PrefPageOne(frame);
+
+ frame = addPage(i18n("Second Page"), i18n("Page Two Options"));
+ m_pageTwo = new %{APPNAME}PrefPageTwo(frame);
+}
+
+%{APPNAME}PrefPageOne::%{APPNAME}PrefPageOne(QWidget *parent)
+ : QFrame(parent)
+{
+ QHBoxLayout *layout = new QHBoxLayout(this);
+ layout->setAutoAdd(true);
+
+ new QLabel(i18n("Add something here"), this);
+}
+
+%{APPNAME}PrefPageTwo::%{APPNAME}PrefPageTwo(QWidget *parent)
+ : QFrame(parent)
+{
+ QHBoxLayout *layout = new QHBoxLayout(this);
+ layout->setAutoAdd(true);
+
+ new QLabel(i18n("Add something here"), this);
+}
+#include "pref.moc"
diff --git a/languages/cpp/app_templates/kapp/pref.h b/languages/cpp/app_templates/kapp/pref.h
new file mode 100644
index 00000000..11aec821
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/pref.h
@@ -0,0 +1,37 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}PREF_H_
+#define _%{APPNAMEUC}PREF_H_
+
+#include <kdialogbase.h>
+#include <qframe.h>
+
+class %{APPNAME}PrefPageOne;
+class %{APPNAME}PrefPageTwo;
+
+class %{APPNAME}Preferences : public KDialogBase
+{
+ Q_OBJECT
+public:
+ %{APPNAME}Preferences();
+
+private:
+ %{APPNAME}PrefPageOne *m_pageOne;
+ %{APPNAME}PrefPageTwo *m_pageTwo;
+};
+
+class %{APPNAME}PrefPageOne : public QFrame
+{
+ Q_OBJECT
+public:
+ %{APPNAME}PrefPageOne(QWidget *parent = 0);
+};
+
+class %{APPNAME}PrefPageTwo : public QFrame
+{
+ Q_OBJECT
+public:
+ %{APPNAME}PrefPageTwo(QWidget *parent = 0);
+};
+
+#endif // _%{APPNAMEUC}PREF_H_
diff --git a/languages/cpp/app_templates/kapp/src-Makefile.am b/languages/cpp/app_templates/kapp/src-Makefile.am
new file mode 100644
index 00000000..51cb1973
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/src-Makefile.am
@@ -0,0 +1,43 @@
+## Makefile.am for %{APPNAMELC}
+
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC} %{APPNAMELC}_client
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+
+# the libraries to link against.
+%{APPNAMELC}_LDADD = $(LIB_KFILE) $(LIB_KDEPRINT)
+
+# which sources should be compiled for %{APPNAMELC}
+%{APPNAMELC}_SOURCES = main.cpp %{APPNAMELC}.cpp %{APPNAMELC}view.cpp \
+ pref.cpp %{APPNAMELC}iface.skel
+
+# these are the headers for your project
+noinst_HEADERS = %{APPNAMELC}.h %{APPNAMELC}view.h pref.h
+
+# client stuff
+%{APPNAMELC}_client_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+%{APPNAMELC}_client_LDADD = $(LIB_KDECORE)
+%{APPNAMELC}_client_SOURCES = %{APPNAMELC}_client.cpp
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
+
+KDE_ICON = AUTO
+
+# this is where the kdelnk file will go
+kdelnkdir = $(kde_appsdir)/Utilities
+kdelnk_DATA = %{APPNAMELC}.desktop
+
+# this is where the XML-GUI resource file goes
+rcdir = $(kde_datadir)/%{APPNAMELC}
+rc_DATA = %{APPNAMELC}ui.rc
diff --git a/languages/cpp/app_templates/kapp/subdirs b/languages/cpp/app_templates/kapp/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kapp/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kateplugin/.kdev_ignore b/languages/cpp/app_templates/kateplugin/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/.kdev_ignore
diff --git a/languages/cpp/app_templates/kateplugin/Makefile.am b/languages/cpp/app_templates/kateplugin/Makefile.am
new file mode 100644
index 00000000..62da4d60
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/Makefile.am
@@ -0,0 +1,19 @@
+templateName = kateplugin
+dataFiles = src-Makefile.am plugin_app.cpp plugin_app.h\
+ plugin_app.rc hi16-action-plugin.png \
+ hi22-action-plugin.png kateplugin.png \
+ plugin.kdevelop subdirs plugin.desktop
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kateplugin/hi16-action-plugin.png b/languages/cpp/app_templates/kateplugin/hi16-action-plugin.png
new file mode 100644
index 00000000..e2d7bab8
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/hi16-action-plugin.png
Binary files differ
diff --git a/languages/cpp/app_templates/kateplugin/hi22-action-plugin.png b/languages/cpp/app_templates/kateplugin/hi22-action-plugin.png
new file mode 100644
index 00000000..4082bf10
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/hi22-action-plugin.png
Binary files differ
diff --git a/languages/cpp/app_templates/kateplugin/kateplugin.kdevtemplate b/languages/cpp/app_templates/kateplugin/kateplugin.kdevtemplate
new file mode 100644
index 00000000..767a0a57
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/kateplugin.kdevtemplate
@@ -0,0 +1,213 @@
+# KDE Config File
+[General]
+Name=Kate plugin
+Name[br]=Lugent Kate
+Name[ca]=Connector per a Kate
+Name[de]=Kate-Modul
+Name[el]=ΠÏόσθετο Kate
+Name[es]=Complemento para Kate
+Name[eu]=Kate plugina
+Name[fa]=وصلۀ Kate
+Name[fr]=Module externe pour Kate
+Name[ga]=Breiseán Kate
+Name[gl]=Extensión para Kate
+Name[hu]=Kate-bővítőmodul
+Name[it]=Plugin per Kate
+Name[ja]=Kate プラグイン
+Name[nds]=Kate-Moduul
+Name[ne]=केट पà¥à¤²à¤—इन
+Name[nl]=Kate-plugin
+Name[pl]=Wtyczka do Kate
+Name[pt]='Plugin' do Kate
+Name[pt_BR]='Plugin' do Kate
+Name[ru]=Модуль Kate
+Name[sk]=Kate modul
+Name[sl]=Vstavek za Kate
+Name[sr]=Прикључак за Kate
+Name[sr@Latn]=PrikljuÄak za Kate
+Name[sv]=Kate-insticksprogram
+Name[tr]=Kate eklentisi
+Name[zh_CN]=Kate æ’件
+Name[zh_TW]=Kate 外掛程å¼
+Icon=kateplugin.png
+Category=C++/KDE
+Comment=Generates a plugin for Kate the text editor.
+Comment[ca]=Genera un connector per a l'editor de text Kate.
+Comment[da]=Genererer et plugin for teksteditoren kate
+Comment[de]=Erstellt ein Modul für den Texteditor Kate
+Comment[el]=ΔημιουÏγεί ένα Ï€Ïόσθετο για το Kate τον επεξεÏγαστή κειμένου.
+Comment[es]=Genera un complemento para el editor de texto Kate.
+Comment[et]=Plugina loomine tekstiredaktorile Kate.
+Comment[eu]=Plugin bat sortzen du Kate testu-editorearentzat.
+Comment[fa]=وصله‌ای برای ویرایشگر متن Kate تولید می‌کند.
+Comment[fr]=Génère un module externe pour l'éditeur de texte Kate.
+Comment[ga]=Cruthaíonn sé seo breiseán le haghaidh eagarthóir téacs Kate.
+Comment[gl]=Xera unha extensión para o editor de textos Kate.
+Comment[hu]=Létrehoz egy bővítőmodult a Kate szövegszerkesztőhöz.
+Comment[it]=Genera un plugin per l'editor di testo Kate.
+Comment[ja]=Kate テキストエディタã®ãŸã‚ã®ãƒ—ラグインを作æˆã—ã¾ã™
+Comment[nds]=Stellt en Moduul för den Texteditor "Kate" op.
+Comment[ne]=केट पाठ समà¥à¤ªà¤¾à¤¦à¤•à¤•à¤¾ लागि पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een plugin voor de Kate-teksteditor
+Comment[pl]=Generuje wtyczkÄ™ do edytora tekstu Kate
+Comment[pt]=Gera um 'plugin' para o Kate, o editor de texto.
+Comment[pt_BR]=Gera um 'plugin' para o Kate, o editor de texto.
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð»Ñ Ñ‚ÐµÐºÑтового редактора Kate.
+Comment[sk]=Vygeneruje modul pre textový editor Kate.
+Comment[sl]=Ustvari vstavek za urejevalnik besedil Kate.
+Comment[sr]=Прави прикључак за уређивач текÑта Kate.
+Comment[sr@Latn]=Pravi prikljuÄak za ureÄ‘ivaÄ teksta Kate.
+Comment[sv]=Skapar ett insticksprogram för texteditorn Kate.
+Comment[tr]=Kate metin düzenleyicisi için bir eklenti yaratır.
+Comment[zh_CN]=ç”Ÿæˆ Kate 文本编辑器的æ’件。
+Comment[zh_TW]=產生一個 Kate 文字編輯器的外掛程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/plugin_%{APPNAMELC}.cpp
+Archive=kateplugin.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/plugin.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/plugin.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE13]
+Type=install
+Source=%{src}/plugin_app.cpp
+Dest=%{dest}/src/plugin_%{APPNAMELC}.cpp
+
+[FILE14]
+Type=install
+Source=%{src}/plugin_app.h
+Dest=%{dest}/src/plugin_%{APPNAMELC}.h
+
+[FILE15]
+Type=install
+EscapeXML=true
+Source=%{src}/plugin_app.rc
+Dest=%{dest}/src/plugin_%{APPNAMELC}.rc
+
+[FILE16]
+Type=install
+Source=%{src}/hi16-action-plugin.png
+Dest=%{dest}/src/hi16-action-plugin.png
+Process=false
+
+[FILE17]
+Type=install
+Source=%{src}/hi22-action-plugin.png
+Dest=%{dest}/src/hi32-action-plugin.png
+Process=false
+
+[MSG]
+Type=message
+Comment=A plugin for Kate was created at %{dest}
+Comment[ca]=Un connector per a Kate ha estat creat a %{dest}
+Comment[da]=Et plugin for Kate blev oprettet på %{dest}
+Comment[de]=Ein Modul für Kate wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο για το Kate δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento para Kate ha sido creado en %{dest}
+Comment[et]=Kate plugin loodi asukohta %{dest}
+Comment[eu]=Kate plugin bat sortu da hemen: %{dest}
+Comment[fa]=وصله‌ای برای Kate در %{dest} ایجاد شد
+Comment[fr]=Un module externe pour Kate a été créé dans %{dest}
+Comment[ga]=Cruthaíodh breiseán Kate ag %{dest}
+Comment[gl]=Creouse unha extensión para Kate en %{dest}
+Comment[hu]=Létrejött egy Kate-bővítőmodul itt: %{dest}
+Comment[it]=È stato creato un plugin per Kate in %{dest}
+Comment[ja]=Kate ã®ãƒ—ラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Moduul för "Kate" opstellt
+Comment[ne]=केटका लागि पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een plugin voor Kate is aangemaakt in %{dest}
+Comment[pl]=Wtyczka dla Kate została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' para o Kate em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' para o Kate em %{dest}
+Comment[ru]=Модуль Kate Ñоздан в %{dest}
+Comment[sk]=Modul pre Kate bol vytvorený v %{dest}
+Comment[sl]=Vstavek za Kate je bil ustvarjen v %{dest}
+Comment[sr]=Прикључак за Kate направљен је у %{dest}
+Comment[sr@Latn]=PrikljuÄak za Kate napravljen je u %{dest}
+Comment[sv]=Ett insticksprogram för Kate skapades i %{dest}
+Comment[tr]=Kate için bir eklenti %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 Kate çš„æ’件
+Comment[zh_TW]=一個 Kate 外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kateplugin/kateplugin.png b/languages/cpp/app_templates/kateplugin/kateplugin.png
new file mode 100644
index 00000000..b442a706
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/kateplugin.png
Binary files differ
diff --git a/languages/cpp/app_templates/kateplugin/plugin.desktop b/languages/cpp/app_templates/kateplugin/plugin.desktop
new file mode 100644
index 00000000..761ac763
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/plugin.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=lib%{APPNAMELC}plugin
+X-Kate-Version=2.2
+Name=My First Kate Plugin
+Name[br]=Ma lugent Kate kentañ
+Name[ca]=El meu primer connector per a Kate
+Name[cy]=F'ategyn cyntaf Kate
+Name[da]=Mit første Kate plugin
+Name[de]=Mein erstes Kate-Modul
+Name[el]=Το Ï€Ïώτο μου Ï€Ïόσθετο για το Kate
+Name[es]=Mi primer complemento para Kate
+Name[et]=Minu esimene Kate plugin
+Name[eu]=Nire lehenengo Kate plugina
+Name[fa]=اولین وصلۀ Kate من
+Name[fr]=Mon premier module externe pour Kate
+Name[ga]=Mo Chéad Bhreiseán Kate
+Name[gl]=A miña primeira extensión para Kate
+Name[hu]=Mintapélda Kate-bővítőmodulra
+Name[it]=Il mio primo plugin di Kate
+Name[ja]=ã¯ã˜ã‚ã¦ã® Kate プラグイン
+Name[ms]=Plugin Kate Pertama Saya
+Name[nds]=Mien eerst Kate-Moduul
+Name[ne]=मेरो पहिलो केट पà¥à¤²à¤—इन
+Name[nl]=Mijn eerste Kate-plugin
+Name[pl]=Moja pierwsza wtyczka do Kate
+Name[pt]=O Meu Primeiro 'Plugin' para o Kate
+Name[pt_BR]=Meu Primeiro Plug-in do Kate
+Name[ru]=Мой первый модуль к Kate
+Name[sk]=Môj prvý Kate modul
+Name[sl]=Moj prvi vstavek za Kate
+Name[sr]=Мој први прикључак за Kate
+Name[sr@Latn]=Moj prvi prikljuÄak za Kate
+Name[sv]=Mitt första insticksprogram för Kate
+Name[tr]=Ä°lk Kate Eklentim
+Name[zh_CN]=我的第一个 Kate æ’件
+Name[zh_TW]=我的第一個 Kate 外掛程å¼
+Comment=Your short description about the plugin goes here
+Comment[ca]=Aquí va la descripció curta referent al connector
+Comment[cy]=Mae eich disgrifiad byr am yr ategyn yn mynd yma
+Comment[da]=Din korte beskrivelse af plugin skal være her
+Comment[de]=Hierhin gehört eine kurze Beschreibung des Moduls
+Comment[el]=Η σÏντομη πεÏιγÏαφή σας σχετικά με το Ï€Ïόσθετο πηγαίνει εδώ
+Comment[es]=Aquí va la descripción corta sobre el complemento
+Comment[et]=Sinu plugina lühikirjeldus
+Comment[eu]=Hemen dihoa plugin-aren buruzko zure deskribapen motza
+Comment[fa]=توصی٠کوتاه شما در مورد وصله در اینجا می‌آید
+Comment[fr]=Une courte description de votre module externe s'insère ici
+Comment[ga]=Cuir do chur síos gearr ar an mbreiseán anseo
+Comment[gl]=A súa descrición breve sobre a extensión vai aquí.
+Comment[hi]=पà¥à¤²à¤—इन के बारे में आपका छोटा सा वरà¥à¤£à¤¨ यहाठजाà¤à¤—ा
+Comment[hu]=Itt lehet egy rövid leírást adni a bővítőmodulról
+Comment[is]=Hér ætti að vera smá lýsing á viðbótinni
+Comment[it]=La tua breve descrizione sui plugin va qui
+Comment[ja]=プラグインã«é–¢ã™ã‚‹çŸ­ã„説明をã“ã“ã«è¨˜è¿°ã—ã¾ã™ã€‚
+Comment[lt]=Čia turėtų būti trumpas priedo aprašymas
+Comment[ms]=Huraian ringkas anda tentang plugin anda di sini
+Comment[nds]=Hier kannst Du en kort Moduulbeschrieven ingeven
+Comment[ne]=पà¥à¤²à¤—इनका बारेमा तपाईà¤à¤•à¥‹ छोटो भनाइ यसà¥à¤¤à¥‹ छ
+Comment[nl]=Hier kunt u een korte omschrijving opgeven
+Comment[pl]=Tu powinien się pojawić krótki opis wtyczki
+Comment[pt]=Aqui deverá colocar uma descrição do 'plugin'
+Comment[pt_BR]=Sua descrição sumária sobre o plug-in vai aqui
+Comment[ru]=ЗдеÑÑŒ раÑполагаетÑÑ ÐºÑ€Ð°Ñ‚ÐºÐ¾Ðµ опиÑание модулÑ
+Comment[sk]=Sem vložte krátky popis modulu
+Comment[sl]=Tukaj je kratek opis o vstavku
+Comment[sr]=Овде иде ваш кратак Ð¾Ð¿Ð¸Ñ Ð¿Ñ€Ð¸ÐºÑ™ÑƒÑ‡ÐºÐ°
+Comment[sr@Latn]=Ovde ide vaÅ¡ kratak opis prikljuÄka
+Comment[sv]=En kort beskrivningen av vad insticksprogrammet gör
+Comment[ta]=உஙà¯à®•à®³à¯ சொரà¯à®•à®¿à®©à¯ சிற௠விவரம௠இஙà¯à®•à®¿à®°à¯à®•à¯à®•à¯à®®à¯
+Comment[tg]=Дар инҷо таÑвири кӯтоҳи модул ҷойгир аÑÑ‚
+Comment[tr]=Eklenti hakkında kısa bir tanımı buraya yazın.
+Comment[zh_CN]=关于这个æ’件的简短æè¿°
+Comment[zh_TW]=您å°æ­¤å¤–掛程å¼çš„æ述寫在這裡
+author=%{AUTHOR}, %{EMAIL}
diff --git a/languages/cpp/app_templates/kateplugin/plugin.kdevelop b/languages/cpp/app_templates/kateplugin/plugin.kdevelop
new file mode 100644
index 00000000..9f0b4ede
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/plugin.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+<kdevautoproject>
+ <general>
+ <activetarget>src/lib%{APPNAMELC}plugin.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kateplugin/plugin_app.cpp b/languages/cpp/app_templates/kateplugin/plugin_app.cpp
new file mode 100644
index 00000000..9fd4a694
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/plugin_app.cpp
@@ -0,0 +1,89 @@
+%{CPP_TEMPLATE}
+
+#include "plugin_%{APPNAMELC}.h"
+
+#include <kaction.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+class PluginView : public KXMLGUIClient
+{
+ friend class KatePlugin%{APPNAME};
+
+ public:
+ Kate::MainWindow *win;
+};
+
+extern "C"
+{
+ void* init_lib%{APPNAMELC}plugin()
+ {
+ KGlobal::locale()->insertCatalogue("kate%{APPNAMELC}");
+ return new KatePluginFactory;
+ }
+}
+
+KatePluginFactory::KatePluginFactory()
+{
+ s_instance = new KInstance( "kate" );
+}
+
+KatePluginFactory::~KatePluginFactory()
+{
+ delete s_instance;
+}
+
+QObject* KatePluginFactory::createObject( QObject* parent, const char* name, const char*, const QStringList & )
+{
+ return new KatePlugin%{APPNAME}( parent, name );
+}
+
+KInstance* KatePluginFactory::s_instance = 0L;
+
+KatePlugin%{APPNAME}::KatePlugin%{APPNAME}( QObject* parent, const char* name )
+ : Kate::Plugin ( (Kate::Application*)parent, name )
+{
+}
+
+KatePlugin%{APPNAME}::~KatePlugin%{APPNAME}()
+{
+}
+
+void KatePlugin%{APPNAME}::addView(Kate::MainWindow *win)
+{
+ /// @todo doesn't this have to be deleted?
+ PluginView *view = new PluginView ();
+
+ (void) new KAction ( i18n("Insert Hello World"), 0, this,
+ SLOT( slotInsertHello() ), view->actionCollection(),
+ "edit_insert_%{APPNAMELC}" );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile("plugins/%{APPNAMELC}/plugin_%{APPNAMELC}.rc");
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+void KatePlugin%{APPNAME}::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+void KatePlugin%{APPNAME}::slotInsertHello()
+{
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+
+ if (kv)
+ kv->insertText ("Hello World");
+}
+
+#include "plugin_%{APPNAMELC}.moc"
+
diff --git a/languages/cpp/app_templates/kateplugin/plugin_app.h b/languages/cpp/app_templates/kateplugin/plugin_app.h
new file mode 100644
index 00000000..8cc5b237
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/plugin_app.h
@@ -0,0 +1,49 @@
+%{H_TEMPLATE}
+
+#ifndef _PLUGIN_%{APPNAMEUC}_H_
+#define _PLUGIN_%{APPNAMEUC}_H_
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+
+#include <klibloader.h>
+#include <klocale.h>
+
+class KatePluginFactory : public KLibFactory
+{
+ Q_OBJECT
+
+ public:
+ KatePluginFactory();
+ virtual ~KatePluginFactory();
+
+ virtual QObject* createObject( QObject* parent = 0, const char* pname = 0, const char* name = "QObject", const QStringList &args = QStringList() );
+
+ private:
+ static KInstance* s_instance;
+};
+
+class KatePlugin%{APPNAME} : public Kate::Plugin, Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+ public:
+ KatePlugin%{APPNAME}( QObject* parent = 0, const char* name = 0 );
+ virtual ~KatePlugin%{APPNAME}();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ public slots:
+ void slotInsertHello();
+
+ private:
+ QPtrList<class PluginView> m_views;
+};
+
+#endif // _PLUGIN_%{APPNAMEUC}_H_
diff --git a/languages/cpp/app_templates/kateplugin/plugin_app.rc b/languages/cpp/app_templates/kateplugin/plugin_app.rc
new file mode 100644
index 00000000..fe98416f
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/plugin_app.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="%{APPNAMELC}" library="lib%{APPNAMELC}plugin" version="1">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="edit_insert_%{APPNAMELC}"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar">
+ <Action name="edit_insert_%{APPNAMELC}"/>
+</ToolBar>
+</kpartplugin>
diff --git a/languages/cpp/app_templates/kateplugin/src-Makefile.am b/languages/cpp/app_templates/kateplugin/src-Makefile.am
new file mode 100644
index 00000000..88ba33a8
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/src-Makefile.am
@@ -0,0 +1,20 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+KDE_ICON = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = lib%{APPNAMELC}plugin.la
+
+lib%{APPNAMELC}plugin_la_SOURCES = plugin_%{APPNAMELC}.cpp
+lib%{APPNAMELC}plugin_la_LIBADD = -lkateinterfaces
+lib%{APPNAMELC}plugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/kate/plugins/%{APPNAMELC}
+plugins_DATA = plugin_%{APPNAMELC}.rc
+
+kde_services_DATA = %{APPNAMELC}.desktop
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/kateplugin/subdirs b/languages/cpp/app_templates/kateplugin/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kateplugin2/.kdev_ignore b/languages/cpp/app_templates/kateplugin2/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/.kdev_ignore
diff --git a/languages/cpp/app_templates/kateplugin2/Makefile.am b/languages/cpp/app_templates/kateplugin2/Makefile.am
new file mode 100644
index 00000000..29aea978
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = src-Makefile.am plugin_app.cpp plugin_app.h \
+ plugin_app.rc hi16-action-plugin.png hi22-action-plugin.png \
+ kateplugin2.png plugin.kdevelop subdirs plugin.desktop
+
+templateName = kateplugin2
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles} ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kateplugin2/hi16-action-plugin.png b/languages/cpp/app_templates/kateplugin2/hi16-action-plugin.png
new file mode 100644
index 00000000..e2d7bab8
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/hi16-action-plugin.png
Binary files differ
diff --git a/languages/cpp/app_templates/kateplugin2/hi22-action-plugin.png b/languages/cpp/app_templates/kateplugin2/hi22-action-plugin.png
new file mode 100644
index 00000000..4082bf10
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/hi22-action-plugin.png
Binary files differ
diff --git a/languages/cpp/app_templates/kateplugin2/kateplugin2.kdevtemplate b/languages/cpp/app_templates/kateplugin2/kateplugin2.kdevtemplate
new file mode 100644
index 00000000..b98ab94f
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/kateplugin2.kdevtemplate
@@ -0,0 +1,214 @@
+# KDE Config File
+[General]
+Name=Kate plugin with config page
+Name[ca]=Connector per a Kate amb pàgina de configuració
+Name[da]=Kate plugin med indstillingsside
+Name[de]=Kate-Modul mit Einstellungsseite
+Name[el]=ΠÏόσθετο Kate με σελίδα ÏÏθμισης
+Name[es]=Complemento para Kate con página de configuración
+Name[et]=Kate plugin seadistustedialoogiga
+Name[eu]=Konfigurazio orridun Kate plugina
+Name[fa]=وصلۀ Kate با صÙØ­Û€ پیکربندی
+Name[fr]=Module externe pour Kate comprenant une page de configuration
+Name[ga]=Breiseán Kate le leathanach cumraíochta
+Name[gl]=Extensión para Kate con páxina de configuración
+Name[hu]=Kate-bővítőmodul beállítólappal
+Name[it]=Plugin per Kate con pagina di configurazione
+Name[ja]=設定ページã®ã‚ã‚‹ Kate プラグイン
+Name[nds]=Kate-Moduul mit Instellensiet
+Name[ne]=कनà¥à¤«à¤¿à¤— पृषà¥à¤ à¤¸à¤à¤— केट पà¥à¤²à¤—इन
+Name[nl]=Kate-plugin met config page
+Name[pl]=Wtyczka do Kate ze stronÄ… konfiguracyjnÄ…
+Name[pt]='Plugin' do Kate com página de configuração
+Name[pt_BR]='Plugin' do Kate com página de configuração
+Name[ru]=Модуль Kate Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð¼ наÑтройки
+Name[sk]=Kate modul s konfiguraÄnou stránkou
+Name[sl]=Vstavek z nastavitveno stranjo za Kate
+Name[sr]=Прикључак за Kate Ñа Ñтраном за подешавања
+Name[sr@Latn]=PrikljuÄak za Kate sa stranom za podeÅ¡avanja
+Name[sv]=Kate-insticksprogram med inställningssida
+Name[tr]=Ayar sayfası olan bir Kate eklentisi
+Name[zh_CN]=带é…置页的 Kate æ’件
+Name[zh_TW]=Kate 外掛程å¼ï¼Œå…§å«è¨­å®šé é¢
+Icon=kateplugin2.png
+Category=C++/KDE
+Comment=Generates a plugin with config page for Kate the text editor.
+Comment[ca]=Genera un connector amb pàgina de configuració per a l'editor de text Kate.
+Comment[da]=Generere et plugin med indstillingsside for teksteditoren Kate.
+Comment[de]=Erstellt ein Modul mit Konfigurationsseite für den Texteditor Kate.
+Comment[el]=ΔημιουÏγεί ένα Ï€Ïόσθετο με σελίδα ÏÏθμισης για το Kate τον επεξεÏγαστή κειμένου.
+Comment[es]=Genera un complemento con página de configuración para el editor de texto Kate.
+Comment[et]=Seadistustedialoogiga plugina loomine tekstiredaktorile Kate.
+Comment[eu]=Konfigurazio orridun Kate plugin bat sortzen du.
+Comment[fa]=وصله‌ای با صÙØ­Û€ پیکربندی ویرایشگر متن Kate تولید می‌کند.
+Comment[fr]=Génère un module externe comprenant une page de configuration pour l'éditeur de texte Kate.
+Comment[ga]=Cruthaíodh breiseán le leathanach cumraíochta le haghaidh eagarthóra téacs Kate.
+Comment[gl]=Xera unha extensión con páxina de configuración para o editor de textos Kate.
+Comment[hu]=Létrehoz egy bővítőmodult beállítólappal a Kate szövegszerkesztőhöz.
+Comment[it]=Genera un plugin con pagina di configurazione per l'editor di testo Kate.
+Comment[ja]=テキストエディタ Kate ã®ãŸã‚ã®è¨­å®šãƒšãƒ¼ã‚¸ã®ã‚るプラグインを作æˆã—ã¾ã™ã€‚
+Comment[nds]=Stellt en Moduul mit Instellensiet för den Texteditor "Kate" op.
+Comment[ne]=केट पाठ समà¥à¤ªà¤¾à¤¦à¤•à¤•à¤¾ लागि कनà¥à¤«à¤¿à¤— पृषà¥à¤ à¤¸à¤à¤— पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een plugin met een config page voor de Kate-teksteditor
+Comment[pl]=Generuje wtyczke wraz ze stronÄ… konfiguracyjnÄ… do edytora tekstu Kate.
+Comment[pt]=Gera um 'plugin' com uma página de configuração para o Kate, o editor de texto.
+Comment[pt_BR]=Gera um 'plugin' com uma página de configuração para o Kate, o editor de texto.
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð»Ñ Ñ‚ÐµÐºÑтового редактора Kate Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð¼ наÑтройки.
+Comment[sk]=Vygeneruje modul s konfiguraÄnou stránkou pre textový editor Kate.
+Comment[sl]=Ustvari vstavek z nastavitveno stranjo za urejevalnik besedil Kate.
+Comment[sr]=Прави прикључак Ñа Ñтраном за подешавање за уређивач текÑта Kate.
+Comment[sr@Latn]=Pravi prikljuÄak sa stranom za podeÅ¡avanje za ureÄ‘ivaÄ teksta Kate.
+Comment[sv]=Skapar ett insticksprogram för texteditorn Kate med en inställningssida.
+Comment[tr]=Kate metin düzenleyicisi için ayar sayfası olan bir eklenti yaratır.
+Comment[zh_CN]=生æˆå¸¦é…置页的 Kate 文本编辑器æ’件。
+Comment[zh_TW]=產生一個 Kate 文字編輯器的外掛程å¼ï¼Œå…§å«è¨­å®šé é¢ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/plugin_%{APPNAMELC}.cpp
+Archive=kateplugin2.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/plugin.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/plugin.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE13]
+Type=install
+Source=%{src}/plugin_app.cpp
+Dest=%{dest}/src/plugin_%{APPNAMELC}.cpp
+
+[FILE14]
+Type=install
+Source=%{src}/plugin_app.h
+Dest=%{dest}/src/plugin_%{APPNAMELC}.h
+
+[FILE15]
+Type=install
+EscapeXML=true
+Source=%{src}/plugin_app.rc
+Dest=%{dest}/src/plugin_%{APPNAMELC}.rc
+
+[FILE16]
+Type=install
+Source=%{src}/hi16-action-plugin.png
+Dest=%{dest}/src/hi16-action-plugin.png
+Process=false
+
+[FILE17]
+Type=install
+Source=%{src}/hi22-action-plugin.png
+Dest=%{dest}/src/hi32-action-plugin.png
+Process=false
+
+[MSG]
+Type=message
+Comment=A plugin for Kate with a config page was created in %{dest}
+Comment[ca]=Un connector per a Kate amb pàgina de configuració ha estat creat en %{dest}
+Comment[da]=Et plugin for Kate med en indstillingsside blev oprettet i %{dest}
+Comment[de]=Ein Modul für Kate mit Konfigurationsseite wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο για το Kate με μια σελίδα ÏÏθμισης δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento para Kate con una página de configuración ha sido creado en %{dest}
+Comment[et]=Seadistustedialoogiga Kate plugin loodi asukohta %{dest}
+Comment[eu]=Konfigurazio orridun Kate plugin bat sortu da hemen:%{dest}
+Comment[fa]=وصله‌ای برای Kate با یک صÙØ­Û€ پیکربندی در %{dest} ایجاد شد
+Comment[fr]=Un module externe pour Kate comprenant une page de configuration a été créé dans %{dest}
+Comment[ga]=Cruthaíodh breiseán Kate le leathanach cumraíochta i %{dest}
+Comment[gl]=Creouse unha extensión para Kate con páxina de configuración en %{dest}
+Comment[hu]=Létrejött egy Kate-bővítőmodul (beállítólappal) itt: %{dest}
+Comment[it]=È stato creato un plugin per Kate con pagina di configurazione in %{dest}
+Comment[ja]=設定ページã®ã‚ã‚‹ Kate プラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Moduul för Kate mit Instellensiet opstellt
+Comment[ne]=कनà¥à¤«à¤¿à¤— पृषà¥à¤ à¤¸à¤à¤— केटका लागि पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een plugin voor Kate met een config page is aangemaakt in %{dest}
+Comment[pl]=Wtyczka do Kate wraz ze stroną konfiguracyjną została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' para o Kate, com uma página de configuração, em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' para o Kate, com uma página de configuração, em %{dest}
+Comment[ru]=Модуль Kate Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð¼ наÑтройки Ñоздан в %{dest}
+Comment[sk]=Modul pre Kate s konfiguraÄnou stránkou bol vytvorený v %{dest}
+Comment[sl]=Vstavek z nastavitveno stranjo za Kate je bil ustvarjen v %{dest}
+Comment[sr]=Прикључак за Kate Ñа Ñтраном за подешавања направљен је у %{dest}
+Comment[sr@Latn]=PrikljuÄak za Kate sa stranom za podeÅ¡avanja napravljen je u %{dest}
+Comment[sv]=Ett insticksprogram för Kate med en inställningssida skapades i %{dest}
+Comment[tr]=Kate için ayar sayfası olan bir eklenti %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个带é…置页的 Kate æ’件
+Comment[zh_TW]=一個內å«è¨­å®šé é¢çš„ Kate 外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kateplugin2/kateplugin2.png b/languages/cpp/app_templates/kateplugin2/kateplugin2.png
new file mode 100644
index 00000000..b442a706
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/kateplugin2.png
Binary files differ
diff --git a/languages/cpp/app_templates/kateplugin2/plugin.desktop b/languages/cpp/app_templates/kateplugin2/plugin.desktop
new file mode 100644
index 00000000..761ac763
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/plugin.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=lib%{APPNAMELC}plugin
+X-Kate-Version=2.2
+Name=My First Kate Plugin
+Name[br]=Ma lugent Kate kentañ
+Name[ca]=El meu primer connector per a Kate
+Name[cy]=F'ategyn cyntaf Kate
+Name[da]=Mit første Kate plugin
+Name[de]=Mein erstes Kate-Modul
+Name[el]=Το Ï€Ïώτο μου Ï€Ïόσθετο για το Kate
+Name[es]=Mi primer complemento para Kate
+Name[et]=Minu esimene Kate plugin
+Name[eu]=Nire lehenengo Kate plugina
+Name[fa]=اولین وصلۀ Kate من
+Name[fr]=Mon premier module externe pour Kate
+Name[ga]=Mo Chéad Bhreiseán Kate
+Name[gl]=A miña primeira extensión para Kate
+Name[hu]=Mintapélda Kate-bővítőmodulra
+Name[it]=Il mio primo plugin di Kate
+Name[ja]=ã¯ã˜ã‚ã¦ã® Kate プラグイン
+Name[ms]=Plugin Kate Pertama Saya
+Name[nds]=Mien eerst Kate-Moduul
+Name[ne]=मेरो पहिलो केट पà¥à¤²à¤—इन
+Name[nl]=Mijn eerste Kate-plugin
+Name[pl]=Moja pierwsza wtyczka do Kate
+Name[pt]=O Meu Primeiro 'Plugin' para o Kate
+Name[pt_BR]=Meu Primeiro Plug-in do Kate
+Name[ru]=Мой первый модуль к Kate
+Name[sk]=Môj prvý Kate modul
+Name[sl]=Moj prvi vstavek za Kate
+Name[sr]=Мој први прикључак за Kate
+Name[sr@Latn]=Moj prvi prikljuÄak za Kate
+Name[sv]=Mitt första insticksprogram för Kate
+Name[tr]=Ä°lk Kate Eklentim
+Name[zh_CN]=我的第一个 Kate æ’件
+Name[zh_TW]=我的第一個 Kate 外掛程å¼
+Comment=Your short description about the plugin goes here
+Comment[ca]=Aquí va la descripció curta referent al connector
+Comment[cy]=Mae eich disgrifiad byr am yr ategyn yn mynd yma
+Comment[da]=Din korte beskrivelse af plugin skal være her
+Comment[de]=Hierhin gehört eine kurze Beschreibung des Moduls
+Comment[el]=Η σÏντομη πεÏιγÏαφή σας σχετικά με το Ï€Ïόσθετο πηγαίνει εδώ
+Comment[es]=Aquí va la descripción corta sobre el complemento
+Comment[et]=Sinu plugina lühikirjeldus
+Comment[eu]=Hemen dihoa plugin-aren buruzko zure deskribapen motza
+Comment[fa]=توصی٠کوتاه شما در مورد وصله در اینجا می‌آید
+Comment[fr]=Une courte description de votre module externe s'insère ici
+Comment[ga]=Cuir do chur síos gearr ar an mbreiseán anseo
+Comment[gl]=A súa descrición breve sobre a extensión vai aquí.
+Comment[hi]=पà¥à¤²à¤—इन के बारे में आपका छोटा सा वरà¥à¤£à¤¨ यहाठजाà¤à¤—ा
+Comment[hu]=Itt lehet egy rövid leírást adni a bővítőmodulról
+Comment[is]=Hér ætti að vera smá lýsing á viðbótinni
+Comment[it]=La tua breve descrizione sui plugin va qui
+Comment[ja]=プラグインã«é–¢ã™ã‚‹çŸ­ã„説明をã“ã“ã«è¨˜è¿°ã—ã¾ã™ã€‚
+Comment[lt]=Čia turėtų būti trumpas priedo aprašymas
+Comment[ms]=Huraian ringkas anda tentang plugin anda di sini
+Comment[nds]=Hier kannst Du en kort Moduulbeschrieven ingeven
+Comment[ne]=पà¥à¤²à¤—इनका बारेमा तपाईà¤à¤•à¥‹ छोटो भनाइ यसà¥à¤¤à¥‹ छ
+Comment[nl]=Hier kunt u een korte omschrijving opgeven
+Comment[pl]=Tu powinien się pojawić krótki opis wtyczki
+Comment[pt]=Aqui deverá colocar uma descrição do 'plugin'
+Comment[pt_BR]=Sua descrição sumária sobre o plug-in vai aqui
+Comment[ru]=ЗдеÑÑŒ раÑполагаетÑÑ ÐºÑ€Ð°Ñ‚ÐºÐ¾Ðµ опиÑание модулÑ
+Comment[sk]=Sem vložte krátky popis modulu
+Comment[sl]=Tukaj je kratek opis o vstavku
+Comment[sr]=Овде иде ваш кратак Ð¾Ð¿Ð¸Ñ Ð¿Ñ€Ð¸ÐºÑ™ÑƒÑ‡ÐºÐ°
+Comment[sr@Latn]=Ovde ide vaÅ¡ kratak opis prikljuÄka
+Comment[sv]=En kort beskrivningen av vad insticksprogrammet gör
+Comment[ta]=உஙà¯à®•à®³à¯ சொரà¯à®•à®¿à®©à¯ சிற௠விவரம௠இஙà¯à®•à®¿à®°à¯à®•à¯à®•à¯à®®à¯
+Comment[tg]=Дар инҷо таÑвири кӯтоҳи модул ҷойгир аÑÑ‚
+Comment[tr]=Eklenti hakkında kısa bir tanımı buraya yazın.
+Comment[zh_CN]=关于这个æ’件的简短æè¿°
+Comment[zh_TW]=您å°æ­¤å¤–掛程å¼çš„æ述寫在這裡
+author=%{AUTHOR}, %{EMAIL}
diff --git a/languages/cpp/app_templates/kateplugin2/plugin.kdevelop b/languages/cpp/app_templates/kateplugin2/plugin.kdevelop
new file mode 100644
index 00000000..cbed4cac
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/plugin.kdevelop
@@ -0,0 +1,114 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+<kdevautoproject>
+ <general>
+ <activetarget>src/lib%{APPNAMELC}plugin.la</activetarget>
+
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kateplugin2/plugin_app.cpp b/languages/cpp/app_templates/kateplugin2/plugin_app.cpp
new file mode 100644
index 00000000..99d78eff
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/plugin_app.cpp
@@ -0,0 +1,140 @@
+%{CPP_TEMPLATE}
+
+#include "plugin_%{APPNAMELC}.h"
+
+#include <kaction.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kfiledialog.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+
+class PluginView : public KXMLGUIClient
+{
+ friend class KatePlugin%{APPNAME};
+
+public:
+ Kate::MainWindow *win;
+};
+
+extern "C"
+{
+ void* init_lib%{APPNAMELC}plugin()
+ {
+ KGlobal::locale()->insertCatalogue("kate%{APPNAMELC}");
+ return new KatePluginFactory;
+ }
+}
+
+KatePluginFactory::KatePluginFactory()
+{
+ s_instance = new KInstance( "kate" );
+}
+
+KatePluginFactory::~KatePluginFactory()
+{
+ delete s_instance;
+}
+
+QObject* KatePluginFactory::createObject( QObject* parent, const char* name, const char*, const QStringList & )
+{
+ return new KatePlugin%{APPNAME}( parent, name );
+}
+
+KInstance* KatePluginFactory::s_instance = 0L;
+
+KatePlugin%{APPNAME}::KatePlugin%{APPNAME}( QObject* parent, const char* name )
+ : Kate::Plugin ( (Kate::Application*)parent, name )
+{
+}
+
+KatePlugin%{APPNAME}::~KatePlugin%{APPNAME}()
+{
+}
+
+void KatePlugin%{APPNAME}::addView(Kate::MainWindow *win)
+{
+ /// @todo doesn't this have to be deleted?
+ PluginView *view = new PluginView ();
+
+ (void) new KAction ( i18n("Insert Hello World"), 0, this,
+ SLOT( slotInsertHello() ), view->actionCollection(),
+ "edit_insert_%{APPNAMELC}" );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile("plugins/%{APPNAMELC}/plugin_%{APPNAMELC}.rc");
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+
+void KatePlugin%{APPNAME}::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+void KatePlugin%{APPNAME}::slotInsertHello()
+{
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+
+ if (kv)
+ kv->insertText ("Hello World");
+}
+
+Kate::PluginConfigPage* KatePlugin%{APPNAME}::configPage (uint, QWidget *w, const char* name)
+{
+ %{APPNAME}ConfigPage* p = new %{APPNAME}ConfigPage(this, w);
+ initConfigPage( p );
+ connect( p, SIGNAL(configPageApplyRequest(%{APPNAME}ConfigPage*)), this, SLOT(slotApplyConfig(%{APPNAME}ConfigPage*)) );
+ return (Kate::PluginConfigPage*)p;
+}
+
+void KatePlugin%{APPNAME}::initConfigPage( %{APPNAME}ConfigPage* p )
+{
+ // TODO: initialize %{APPNAME}ConfigPage here
+ // NOTE: KatePlugin%{APPNAME} is friend of %{APPNAME}ConfigPage
+}
+
+void KatePlugin%{APPNAME}::slotApplyConfig( %{APPNAME}ConfigPage* p )
+{
+ // TODO: save %{APPNAME}ConfigPage here
+ // NOTE: KatePlugin%{APPNAME} is friend of %{APPNAME}ConfigPage
+}
+
+
+/**
+ * %{APPNAME}ConfigPage
+ */
+%{APPNAME}ConfigPage::%{APPNAME}ConfigPage (QObject* parent /*= 0L*/, QWidget *parentWidget /*= 0L*/)
+ : Kate::PluginConfigPage( parentWidget )
+{
+ QVBoxLayout* lo = new QVBoxLayout( this, 0, 0, "config_page_layout" );
+ lo->setSpacing(KDialogBase::spacingHint());
+
+ QLabel* lab = new QLabel("KatePlugin%{APPNAME}'s config page", this);
+
+ lo->addWidget(lab);
+
+ // TODO: add connection to emit SLOT( changed() )
+}
+
+%{APPNAME}ConfigPage::~%{APPNAME}ConfigPage()
+{
+}
+
+void %{APPNAME}ConfigPage::apply()
+{
+ emit configPageApplyRequest( this );
+}
+
+#include "plugin_%{APPNAMELC}.moc"
+
diff --git a/languages/cpp/app_templates/kateplugin2/plugin_app.h b/languages/cpp/app_templates/kateplugin2/plugin_app.h
new file mode 100644
index 00000000..e4f97d00
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/plugin_app.h
@@ -0,0 +1,91 @@
+%{H_TEMPLATE}
+
+#ifndef _PLUGIN_%{APPNAMEUC}_H_
+#define _PLUGIN_%{APPNAMEUC}_H_
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+#include <kate/pluginconfiginterface.h>
+#include <kate/pluginconfiginterfaceextension.h>
+
+#include <klibloader.h>
+#include <klocale.h>
+
+class %{APPNAME}ConfigPage;
+
+class KatePluginFactory : public KLibFactory
+{
+ Q_OBJECT
+
+public:
+ KatePluginFactory();
+ virtual ~KatePluginFactory();
+
+ virtual QObject* createObject( QObject* parent = 0, const char* pname = 0, const char* name = "QObject", const QStringList &args = QStringList() );
+
+private:
+ static KInstance* s_instance;
+};
+
+class KatePlugin%{APPNAME} : public Kate::Plugin, Kate::PluginViewInterface, Kate::PluginConfigInterfaceExtension
+{
+ Q_OBJECT
+
+public:
+ KatePlugin%{APPNAME}( QObject* parent = 0, const char* name = 0 );
+ virtual ~KatePlugin%{APPNAME}();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ /** overwrite some functions */
+ uint configPages () const { return 1; }
+ Kate::PluginConfigPage *configPage (uint , QWidget *w, const char *name=0);
+ QString configPageName(uint) const { return i18n("%{APPNAME}"); };
+ QString configPageFullName(uint) const { return i18n("Configure KatePlugin%{APPNAME}"); };
+ QPixmap configPagePixmap (uint number = 0, int size = KIcon::SizeSmall) const { return 0L; };
+
+public slots:
+ void slotInsertHello();
+ void slotApplyConfig(%{APPNAME}ConfigPage*);
+
+private:
+ void initConfigPage( %{APPNAME}ConfigPage* );
+
+private:
+ QPtrList<class PluginView> m_views;
+};
+
+
+class %{APPNAME}ConfigPage : public Kate::PluginConfigPage
+{
+ Q_OBJECT
+ friend class KatePlugin%{APPNAME};
+
+public:
+ %{APPNAME}ConfigPage (QObject* parent = 0L, QWidget *parentWidget = 0L);
+ ~%{APPNAME}ConfigPage ();
+
+ /** Reimplemented from Kate::PluginConfigPage; just emits configPageApplyRequest( this ). */
+ virtual void apply();
+
+ virtual void reset () { ; };
+ virtual void defaults () { ; };
+
+signals:
+ /** Ask the plugin to set initial values */
+ void configPageApplyRequest( %{APPNAME}ConfigPage* );
+ /** Ask the plugin to apply changes */
+ void configPageInitRequest( %{APPNAME}ConfigPage* );
+
+private: // variables
+
+};
+
+#endif // _PLUGIN_%{APPNAMEUC}_H_
+
diff --git a/languages/cpp/app_templates/kateplugin2/plugin_app.rc b/languages/cpp/app_templates/kateplugin2/plugin_app.rc
new file mode 100644
index 00000000..fe98416f
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/plugin_app.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="%{APPNAMELC}" library="lib%{APPNAMELC}plugin" version="1">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="edit_insert_%{APPNAMELC}"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar">
+ <Action name="edit_insert_%{APPNAMELC}"/>
+</ToolBar>
+</kpartplugin>
diff --git a/languages/cpp/app_templates/kateplugin2/src-Makefile.am b/languages/cpp/app_templates/kateplugin2/src-Makefile.am
new file mode 100644
index 00000000..2dbd9367
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/src-Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+KDE_ICON = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = lib%{APPNAMELC}plugin.la
+
+lib%{APPNAMELC}plugin_la_SOURCES = plugin_%{APPNAMELC}.cpp
+lib%{APPNAMELC}plugin_la_LIBADD = -lkateinterfaces
+lib%{APPNAMELC}plugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/kate/plugins/%{APPNAMELC}
+plugins_DATA = plugin_%{APPNAMELC}.rc
+
+kde_services_DATA = %{APPNAMELC}.desktop
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
+
diff --git a/languages/cpp/app_templates/kateplugin2/subdirs b/languages/cpp/app_templates/kateplugin2/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kateplugin2/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kcmodule/.kdev_ignore b/languages/cpp/app_templates/kcmodule/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/.kdev_ignore
diff --git a/languages/cpp/app_templates/kcmodule/Makefile.am b/languages/cpp/app_templates/kcmodule/Makefile.am
new file mode 100644
index 00000000..66173b12
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = module.cpp module.h module.desktop module.kdevelop \
+ src-Makefile.am kcmodule.png subdirs
+templateName = kcmodule
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kcmodule/kcmodule.kdevtemplate b/languages/cpp/app_templates/kcmodule/kcmodule.kdevtemplate
new file mode 100644
index 00000000..c551eeb5
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/kcmodule.kdevtemplate
@@ -0,0 +1,197 @@
+# KDE Config File
+[General]
+Name=Control Center module
+Name[ca]=Mòdul per al Centre de control
+Name[da]=Kontrolcenter-modul
+Name[de]=Kontrollzentrum-Modul
+Name[el]=ΆÏθÏωμα κέντÏου ελέγχου
+Name[en_GB]=Control Centre module
+Name[es]=Módulo para el Centro de control
+Name[et]=Juhtimiskeskuse moodul
+Name[eu]=Kontrol-gunearen modulua
+Name[fa]=پیمانۀ مرکز کنترل
+Name[fr]=Module du centre de configuration
+Name[ga]=Modúl Lárionad Rialaithe
+Name[gl]=Módulo para Centro de control
+Name[hu]=KControl-beállítómodul
+Name[it]=Modulo del Centro di controllo
+Name[ja]=コントロールセンターモジュール
+Name[nds]=Kuntrullzentrum-Moduul
+Name[ne]=नियनà¥à¤¤à¥à¤°à¤£ केनà¥à¤¦à¥à¤° मोडà¥à¤¯à¥à¤²
+Name[nl]=Configuratiemodule
+Name[pl]=Moduł Centrum Sterowania
+Name[pt]=Módulo do Centro de Controlo
+Name[pt_BR]=Módulo do Centro de Controlo
+Name[ru]=Модуль Центра управлениÑ
+Name[sk]=Control Center modul
+Name[sl]=Modul nadzornega srediÅ¡Äa
+Name[sr]=Модул Контролног центра
+Name[sr@Latn]=Modul Kontrolnog centra
+Name[sv]=Modul i inställningscentralen
+Name[tr]=Kontrol Merkezi Birimi
+Name[zh_CN]=控制中心模å—
+Name[zh_TW]=控制中心模組
+Icon=kcmodule.png
+Category=C++/KDE
+Comment=Generates a framework for a module which can be embedded into the KDE Control Center.
+Comment[ca]=Genera una infraestructura per a un mòdul que es pugui encastar al Centre de control de KDE.
+Comment[da]=Genererer et skelet for et modul som kan indlejres i KDE's kontrolcenter.
+Comment[de]=Erstellt das Gerüst für ein Modul, das in das KDE-Kontrollzentrum integriert werden kann.
+Comment[el]=ΔημιουÏγεί ένα πλαίσιο για ένα άÏθÏωμα το οποίο μποÏεί να ενσωματωθεί το κέντÏο ελέγχου του KDE.
+Comment[en_GB]=Generates a framework for a module which can be embedded into the KDE Control Centre.
+Comment[es]=Genera una infraestructura para un módulo que se puede empotrar en el Centro de control de KDE.
+Comment[et]=Mooduli raamistiku loomine, mida saab põimida KDE juhtimiskeskusse.
+Comment[eu]=KDE-ren kontrol-gunean kapsula daitekeen modulu baten lan-marko bat sortzen du.
+Comment[fa]=چارچوبی برای پیمانه‌ای Ú©Ù‡ در مرکز کنترل KDE می‌تواند نهÙته شود، تولید می‌کند.
+Comment[fr]=Génère une infrastructure pour un module qui peut être intégré dans le centre de configuration de KDE.
+Comment[ga]=Cruthaigh creatlach de mhodúl is féidir leabú i Lárionad Rialaithe KDE.
+Comment[gl]=Xera un contorno de traballo para un módulo que pode incrustarse no Centro de control de KDE.
+Comment[hu]=Létrehoz egy kiindulási KDE vezérlőpult-beállítómodult
+Comment[it]=Genera l'infrastruttura per un modulo che può essere integrato nel Centro di controllo di KDE.
+Comment[ja]=KDE ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚»ãƒ³ã‚¿ãƒ¼ã«å–ã‚Šè¾¼ã‚るモジュールã®ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã‚’作æˆã—ã¾ã™ã€‚
+Comment[nds]=Stellt en Rahmenwark för en Moduul op, dat sik na dat KDE-Kuntrullzentrum inbetten lett.
+Comment[ne]=केडीई नियनà¥à¤¤à¥à¤°à¤£ केनà¥à¤¦à¥à¤°à¤®à¤¾ समà¥à¤®à¤¿à¤²à¤¿à¤¤ गरà¥à¤¨ सकिने मोडà¥à¤¯à¥à¤²à¤•à¤¾ लागि फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een framework voor een module die kan worden ingebed in het configuratiecentrum van KDE.
+Comment[pl]=Generuje szablon modułu, który może zostać włączony w Centrum Sterowania KDE.
+Comment[pt]=Gera a plataforma para um módulo que possa ser incorporado no Centro de Controlo do KDE.
+Comment[pt_BR]=Gera a plataforma para um módulo que possa ser incorporado no Centro de Controlo do KDE.
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð»Ñ Ð¦ÐµÐ½Ñ‚Ñ€Ð° ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ KDE.
+Comment[sk]=Vygeneruje framework pre modul, ktorý môže byť vložený do KDE Control Center.
+Comment[sr]=Прави радни оквир за модул који Ñе може уградити у Контролни центар KDE-а.
+Comment[sr@Latn]=Pravi radni okvir za modul koji se može ugraditi u Kontrolni centar KDE-a.
+Comment[sv]=Skapar ett ramverk för en modul som kan inbäddas i KDE:s inställningscentral.
+Comment[tr]=KDE Kontrol Merkezine gömülebilen bir birim için bir çatı yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªå¯åµŒå…¥ KDE 控制中心的模å—框架。
+Comment[zh_TW]=產生一個å¯ä»¥åµŒå…¥ KDE 控制中心的模組框架。
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=kcmodule.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/module.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE9]
+Type=install
+Source=%{src}/module.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/module.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/module.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE14]
+Type=install
+Source=%{src}/module.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[MSG]
+Type=message
+Comment=A control center module was created in %{dest}
+Comment[ca]=A mòdul per al centre de control ha estat creat en %{dest}
+Comment[da]=Et kontrolcenter-modul blev oprettet i %{dest}
+Comment[de]=Ein Kontrollzentrum-Modul wurde in %{dest} erstellt.
+Comment[el]=Ένα άÏθÏωμα κέντÏου ελέγχου δημιουÏγήθηκε στο %{dest}
+Comment[en_GB]=A control centre module was created in %{dest}
+Comment[es]=Un módulo para el Centro de control ha sido creado en %{dest}
+Comment[et]=Juhtimiskeskuse moodul loodi asukohta %{dest}
+Comment[eu]=Kontrol-gunearen modulu bat sortu da hemen: {dest}
+Comment[fa]=یک پیمانۀ مرکز کنترل در %{dest} ایجاد شد
+Comment[fr]=Un module du centre de configuration a été créé dans %{dest}
+Comment[ga]=Cruthaíodh modúl lárionad rialaithe i %{dest}
+Comment[gl]=Creouse un módulo para o centro de control en %{dest}
+Comment[hu]=Létrejött egy KControl-beállítómodul itt: %{dest}
+Comment[it]=È stato creato un modulo del Centro di controllo in %{dest}
+Comment[ja]=コントロールセンターã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’ %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Kuntrullzentrum-Moduul opstellt
+Comment[ne]=नियनà¥à¤¤à¥à¤°à¤£ केनà¥à¤¦à¥à¤° मोडà¥à¤¯à¥à¤² %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een configuratiemodule is aangemaakt in %{dest}
+Comment[pl]=Moduł Centrum Sterowania został utworzony w %{dest}
+Comment[pt]=Foi criado um módulo do Centro de Controlo em %{dest}
+Comment[pt_BR]=Foi criado um módulo do Centro de Controlo em %{dest}
+Comment[ru]=Модуль Центра ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ KDE Ñоздан в %{dest}
+Comment[sk]=Control center modul bol vytvorený v %{dest}
+Comment[sl]=Modul nadzornega srediÅ¡Äa je bil ustvarjen v %{dest}
+Comment[sr]=Модул Контролног центра направљен је у %{dest}
+Comment[sr@Latn]=Modul Kontrolnog centra napravljen je u %{dest}
+Comment[sv]=En modul i inställningscentralen skapades i %{dest}
+Comment[zh_CN]=在 %{dest} 中创建了一个控制中心模å—
+Comment[zh_TW]=一個控制中心模組已建立於 %{dest}
diff --git a/languages/cpp/app_templates/kcmodule/kcmodule.png b/languages/cpp/app_templates/kcmodule/kcmodule.png
new file mode 100644
index 00000000..dbab73a3
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/kcmodule.png
Binary files differ
diff --git a/languages/cpp/app_templates/kcmodule/module.cpp b/languages/cpp/app_templates/kcmodule/module.cpp
new file mode 100644
index 00000000..69e87692
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/module.cpp
@@ -0,0 +1,66 @@
+%{CPP_TEMPLATE}
+
+#include <qlayout.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kparts/genericfactory.h>
+
+#include "%{APPNAMELC}.h"
+
+typedef KGenericFactory<%{APPNAME}, QWidget> %{APPNAME}Factory;
+K_EXPORT_COMPONENT_FACTORY( kcm_%{APPNAME}, %{APPNAME}Factory("kcm%{APPNAMELC}"))
+
+%{APPNAME}::%{APPNAME}(QWidget *parent, const char *name, const QStringList&)
+ : KCModule(parent, name), myAboutData(0)
+{
+ // place widgets here
+ load();
+};
+
+
+%{APPNAME}::~%{APPNAME}()
+{
+}
+
+
+void %{APPNAME}::load()
+{
+ // insert your loading code here...
+}
+
+
+void %{APPNAME}::defaults()
+{
+ // insert your default settings code here...
+ emit changed(true);
+}
+
+
+void %{APPNAME}::save()
+{
+ // insert your saving code here...
+ emit changed(true);
+}
+
+
+int %{APPNAME}::buttons()
+{
+ return KCModule::Default|KCModule::Apply|KCModule::Help;
+}
+
+
+void %{APPNAME}::configChanged()
+{
+ // insert your saving code here...
+ emit changed(true);
+}
+
+
+QString %{APPNAME}::quickHelp() const
+{
+ return i18n("Helpful information about the %{APPNAMELC} module.");
+}
+
+
+#include "%{APPNAMELC}.moc"
diff --git a/languages/cpp/app_templates/kcmodule/module.desktop b/languages/cpp/app_templates/kcmodule/module.desktop
new file mode 100644
index 00000000..662b3b2f
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/module.desktop
@@ -0,0 +1,81 @@
+[Desktop Entry]
+Exec=kcmshell %{APPNAMELC}
+Icon=misc
+Type=Application
+
+X-KDE-ModuleType=Library
+X-KDE-Library=%{APPNAMELC}
+X-KDE-HasReadOnlyMode=false
+X-KDE-ParentApp=kcontrol
+
+
+
+[Desktop Entry]
+Comment=%{APPNAME} - a kcontrol module
+Comment[br]=%{APPNAME} - ur mollad kcontrol
+Comment[ca]=%{APPNAME} - un mòdul per a kcontrol
+Comment[da]=%{APPNAME} - et kcontrol-modul
+Comment[de]=%{APPNAME} - ein KControl-Modul
+Comment[el]=%{APPNAME} - ένα άÏθÏωμα kcontrol
+Comment[es]=%{APPNAME} - un módulo de kcontrol
+Comment[et]=%{APPNAME} - KDE juhtimiskeskuse moodul
+Comment[eu]=%{APPNAME} - kcontrol modulu bat
+Comment[fa]=%{APPNAME} - یک پیمانۀ kcontrol
+Comment[fr]=%{APPNAME} - un module kcontrol
+Comment[ga]=%{APPNAME} - modúl kcontrol
+Comment[gl]=%{APPNAME} - un módulo de kcontrol
+Comment[hu]=%{APPNAME} - beállítómodul
+Comment[it]=%{APPNAME} - un modulo per kcontrol
+Comment[ja]=%{APPNAME} kcontrol モジュール
+Comment[nds]=%{APPNAME} - en KControl-Moduul
+Comment[ne]=%{APPNAME} - à¤à¤‰à¤Ÿà¤¾ केडीई नियनà¥à¤¤à¥à¤°à¤£ मोडà¥à¤¯à¥à¤²
+Comment[nl]=%{APPNAME} - een kcontrol module
+Comment[pl]=Moduł Centrum Sterowania dla %{APPNAME}
+Comment[pt]=%{APPNAME} - um módulo do kcontrol
+Comment[pt_BR]=%{APPNAME} - um módulo do kcontrol
+Comment[ru]=%{APPNAME} - модуль kcontrol
+Comment[sk]=%{APPNAME} - a kcontrol modul
+Comment[sl]=%{APPNAME} - modul za kcontrol
+Comment[sr]=%{APPNAME} — модул за kcontrol
+Comment[sr@Latn]=%{APPNAME} — modul za kcontrol
+Comment[sv]=%{APPNAME} - en modul i Inställningscentralen
+Comment[ta]=%{APPNAME} - ஒர௠கேகனà¯à®Ÿà¯à®°à¯‹à®²à¯ கூறà¯
+Comment[tg]=%{APPNAME} - модули kcontrol
+Comment[tr]=%{APPNAME} - bir kcontrol birimi
+Comment[zh_CN]=%{APPNAME} - 一个 KDE 控制中心模å—
+Comment[zh_TW]=%{APPNAME} - KDE 控制中心模組
+Keywords=%{APPNAME},%{APPNAMELC}
+Name=The %{APPNAME} Applet
+Name[br]=An arloadig %{APPNAME}
+Name[ca]=La miniaplicació %{APPNAME}
+Name[da]=%{APPNAME}-appletten
+Name[de]=Das Miniprogramm %{APPNAME}
+Name[el]=Η μικÏοεφαÏμογή %{APPNAME}
+Name[es]=Applet %{APPNAME}
+Name[et]=%{APPNAME} aplett
+Name[eu]=%{APPNAME} applet-a
+Name[fa]=برنامک %{APPNAME}
+Name[fr]=L'applet %{APPNAME}
+Name[ga]=An Feidhmchláirín %{APPNAME}
+Name[gl]=Applet %{APPNAME}
+Name[hu]=%{APPNAME} kisalkalmazás
+Name[it]=L'applet %{APPNAME}
+Name[ja]=%{APPNAME} アプレット
+Name[nds]=Dat Lüttprogramm %{APPNAME}
+Name[ne]= %{APPNAME} à¤à¤ªà¥à¤²à¥‡à¤Ÿ
+Name[nl]=De %{APPNAME}-applet
+Name[pl]=Aplet %{APPNAME}
+Name[pt]='Applet' %{APPNAME}
+Name[pt_BR]=O Mini-Aplicativo %{APPNAME}
+Name[ru]=Ðплет %{APPNAME}
+Name[sk]=%{APPNAME} applet
+Name[sl]=Vstavek za %{APPNAME}
+Name[sr]=%{APPNAME} аплет
+Name[sr@Latn]=%{APPNAME} aplet
+Name[sv]=Miniprogram %{APPNAME}
+Name[tr]=%{APPNAME} Küçük Uygulaması
+Name[zh_CN]=%{APPNAME} å°ç¨‹åº
+Name[zh_TW]=%{APPNAME} å°ç¨‹å¼
+
+
+Categories=Qt;KDE;X-KDE-settings-components;
diff --git a/languages/cpp/app_templates/kcmodule/module.h b/languages/cpp/app_templates/kcmodule/module.h
new file mode 100644
index 00000000..cebf0f48
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/module.h
@@ -0,0 +1,32 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+#include <kcmodule.h>
+#include <kaboutdata.h>
+
+class %{APPNAME}: public KCModule
+{
+ Q_OBJECT
+
+public:
+ %{APPNAME}( QWidget *parent=0, const char *name=0, const QStringList& = QStringList() );
+ ~%{APPNAME}();
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ virtual int buttons();
+ virtual QString quickHelp() const;
+ virtual const KAboutData *aboutData()const
+ { return myAboutData; };
+
+public slots:
+ void configChanged();
+
+private:
+ KAboutData *myAboutData;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kcmodule/module.kdevelop b/languages/cpp/app_templates/kcmodule/module.kdevelop
new file mode 100644
index 00000000..76412de2
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/module.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kcmodule/src-Makefile.am b/languages/cpp/app_templates/kcmodule/src-Makefile.am
new file mode 100644
index 00000000..e5d30776
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/src-Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = kcm_%{APPNAMELC}.la
+
+kcm_%{APPNAMELC}_la_SOURCES = %{APPNAMELC}.cpp
+kcm_%{APPNAMELC}_la_LIBADD = $(LIB_KDEUI)
+kcm_%{APPNAMELC}_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined
+
+
+xdg_apps_DATA = %{APPNAMELC}.desktop
+
+
+messages: rc.cpp
+ $(EXTRACTRC) `find -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcm%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/kcmodule/subdirs b/languages/cpp/app_templates/kcmodule/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kcmodule/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kconfig35/Makefile.am b/languages/cpp/app_templates/kconfig35/Makefile.am
new file mode 100644
index 00000000..f5f8132d
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = src-Makefile.am app.cpp app.h main.cpp appui.rc app.kdevelop \
+ subdirs app.desktop kxt35.png appview.h appview.cpp appview_base.ui \
+ prefs-base.ui prefs.cpp prefs.h app.kcfg settings.kcfgc README \
+ src-configure.in.in
+templateName= kconfig35
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/kconfig35/README b/languages/cpp/app_templates/kconfig35/README
new file mode 100644
index 00000000..527ce518
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/README
@@ -0,0 +1,90 @@
+-----------------------------------------------
+Kde templates quickstart
+Author: Thomas Nagy
+Date: 2004-03-22
+-----------------------------------------------
+
+This README file explains you basic things for starting with
+this application template.
+
+-----------------------------------------------
+--NOTE--: you need kdelibs 3.5 and kdelibs headers 3.5 (devel package) in order to build this template.
+Qt version might be 3.3.4 or 3.3.5
+-----------------------------------------------
+
+** Building and installing **
+
+* Build the configure script by "make -f Makefile.cvs"
+
+* To clean, use "make clean", and to clean everything
+(remove the makefiles, etc), use "make distclean"
+
+* To distribute your program, try "make dist".
+This will make a compact tarball archive of your release with the
+necessary scripts inside.
+
+* Modifying the auto-tools scripts
+for automake scripts there is an excellent tutorial there :
+http://developer.kde.org/documentation/other/makefile_am_howto.html
+
+* Simplify your life : install the project in your home directory for
+testing purposes.
+./configure --prefix=/home/user/dummyfolder/
+In the end when you finished the development you can
+rm -rf /home/user/dummyfolder/
+without fear.
+
+
+** Technologies **
+
+* Build the menus of your application easily
+kde applications now use an xml file (*ui.rc file) to build the menus.
+This allow a great customization of the application. However, when
+programming the menu is shown only after a "make install"
+
+For more details, consult :
+http://devel-home.kde.org/~larrosa/tutorial/p9.html
+http://developer.kde.org/documentation/tutorials/xmlui/preface.html
+
+* Use KConfig XT to create your configuration dialogs and make
+them more maintainable.
+
+For that, you will need to write two simple configuration files
+in the src directory : <myproject>.kcfg and a <settings>.kcfgc
+The configure.in.in will need to be modified : change the line #MIN_CONFIG(3.0.0)
+into #MIN_CONFIG(3.2.0)
+
+Take an example on the many apps found in the kdegames source package and consult :
+http://developer.kde.org/documentation/tutorials/kconfigxt/kconfigxt.html
+
+* With KParts, you can embed other kde components in your program, or make your program
+embeddable in other apps. For example, the kmplayer kpart can be called to play videos
+in your app.
+
+For more details, consult :
+http://www-106.ibm.com/developerworks/library/l-kparts/
+http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html
+
+* With dcop, you can control your app from other applications
+Make sure to include K_DCOP and a kdcop: section in your .h file
+http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html
+
+
+** Documentation **
+
+* For the translations :
+1. Download a patched gettext which can be found at:
+ http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/
+2. Install that gettext in ~/bin/
+3. cd ~/yourproject, export PATH=~/bin:$PATH, export
+KDEDIR=/where_your_KDE3_is
+4. make -f admin/Makefile.common package-messages
+5. make package-messages
+6. Translate the po files (not the pot!!) with kbabel or xemacs
+
+* Do not forget to write the documentation for your kde app
+edit the documentation template index.docbook in doc/
+
+
+
diff --git a/languages/cpp/app_templates/kconfig35/app.cpp b/languages/cpp/app_templates/kconfig35/app.cpp
new file mode 100644
index 00000000..e32e28b5
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/app.cpp
@@ -0,0 +1,105 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include "settings.h"
+#include "prefs.h"
+
+#include <qdragobject.h>
+
+#include <kaction.h>
+#include <kconfigdialog.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kprinter.h>
+#include <kstatusbar.h>
+
+%{APPNAMELC}::%{APPNAMELC}()
+ : KMainWindow( 0, "%{APPNAMELC}" ),
+ m_view(new %{APPNAMELC}View(this)),
+ m_printer(0)
+{
+ // accept dnd
+ setAcceptDrops(true);
+
+ // tell the KMainWindow that this is indeed the main widget
+ setCentralWidget(m_view);
+ // and a status bar
+ statusBar()->show();
+ // then, setup our actions
+ setupActions();
+
+ // apply the saved mainwindow settings, if any, and ask the mainwindow
+ // to automatically save settings if changed: window size, toolbar
+ // position, icon size, etc.
+ setAutoSaveSettings();
+
+ // allow the view to change the statusbar and caption
+ connect(m_view, SIGNAL(signalChangeStatusbar(const QString&)),
+ this, SLOT(changeStatusbar(const QString&)));
+ connect(m_view, SIGNAL(signalChangeCaption(const QString&)),
+ this, SLOT(changeCaption(const QString&)));
+
+}
+
+%{APPNAMELC}::~%{APPNAMELC}()
+{
+}
+
+void %{APPNAMELC}::setupActions()
+{
+ KStdAction::openNew(this, SLOT(fileNew()), actionCollection());
+ KStdAction::quit(kapp, SLOT(quit()), actionCollection());
+
+ KStdAction::preferences(this, SLOT(optionsPreferences()), actionCollection());
+
+ // custom menu and menu item
+ KAction *custom = new KAction(i18n("Swi&tch Colors"), 0,
+ m_view, SLOT(switchColors()),
+ actionCollection(), "switch_action");
+
+ setupGUI();
+}
+
+void %{APPNAMELC}::newToolbarConfig()
+{
+ // this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
+ // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
+ setupGUI();
+}
+
+void %{APPNAMELC}::optionsPreferences()
+{
+ // The preference dialog is derived from prefs-base.ui which is subclassed into Prefs
+ //
+ // compare the names of the widgets in the .ui file
+ // to the names of the variables in the .kcfg file
+ KConfigDialog *dialog = new KConfigDialog(this, "settings", Settings::self(), KDialogBase::Swallow);
+ dialog->addPage(new Prefs(), i18n("General"), "package_settings");
+ connect(dialog, SIGNAL(settingsChanged()), m_view, SLOT(settingsChanged()));
+ dialog->show();
+}
+
+void %{APPNAMELC}::changeCaption(const QString& text)
+{
+ // display the text on the caption
+ setCaption(text);
+}
+
+void %{APPNAMELC}::changeStatusbar(const QString& text)
+{
+ // display the text on the statusbar
+ statusBar()->message(text);
+}
+
+void %{APPNAMELC}::fileNew()
+{
+ // this slot is called whenever the File->New menu is selected,
+ // the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ // button is clicked
+
+ // create a new window
+ (new %{APPNAMELC})->show();
+}
+
+#include "%{APPNAMELC}.moc"
+
diff --git a/languages/cpp/app_templates/kconfig35/app.desktop b/languages/cpp/app_templates/kconfig35/app.desktop
new file mode 100644
index 00000000..8b36e6e0
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/app.desktop
@@ -0,0 +1,40 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+Icon=%{APPNAMELC}
+Type=Application
+Comment=A simple KDE Application
+Comment[br]=Ur meziant eeun evit KDE
+Comment[ca]=Una simple aplicació per al KDE
+Comment[da]=Et simpelt KDE program
+Comment[de]=Eine einfache KDE-Anwendung
+Comment[el]=Μια απλή εφαÏμογή του KDE
+Comment[es]=Una aplicación de KDE sencilla
+Comment[et]=Lihtne KDE rakendus
+Comment[eu]=KDE aplikazio simple bat
+Comment[fa]=یک کاربرد سادۀ KDE
+Comment[fr]=Une application simple pour KDE
+Comment[ga]=Feidhmchlár Simplí KDE
+Comment[gl]=Unha aplicación KDE sinxela
+Comment[hi]=à¤à¤• सादा केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=Egyszerű KDE-alkalmazás
+Comment[is]=Einfalt KDE forrit
+Comment[it]=Una semplice applicazione KDE
+Comment[ja]=ç°¡å˜ãª KDE アプリケーション
+Comment[nds]=En eenfach KDE-Programm
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een eenvoudige KDE-toepassing
+Comment[pl]=Prosty program KDE
+Comment[pt]=Uma aplicação simples do KDE
+Comment[pt_BR]=Um simples Aplicativo do KDE
+Comment[ru]=ПроÑтое приложение KDE
+Comment[sk]=Jednoduchá KDE aplikácia
+Comment[sl]=Preprost program za KDE
+Comment[sr]=ЈедноÑтаван KDE програм
+Comment[sr@Latn]=Jednostavan KDE program
+Comment[sv]=Ett enkelt KDE-program
+Comment[ta]=ஒர௠சாதாரண கெடிஇ பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Гузориши оддиKDE
+Comment[tr]=Basit bir KDE Uygulaması
+Comment[zh_CN]=一个简å•çš„ KDE 应用程åº
+Comment[zh_TW]=簡單的 KDE 應用程å¼
diff --git a/languages/cpp/app_templates/kconfig35/app.h b/languages/cpp/app_templates/kconfig35/app.h
new file mode 100644
index 00000000..abfd6c09
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/app.h
@@ -0,0 +1,60 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <kmainwindow.h>
+
+#include "%{APPNAMELC}view.h"
+
+class KPrinter;
+class KURL;
+
+/**
+ * This class serves as the main window for %{APPNAME}. It handles the
+ * menus, toolbars, and status bars.
+ *
+ * @short Main window class
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAMELC} : public KMainWindow
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ %{APPNAMELC}();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~%{APPNAMELC}();
+
+private slots:
+
+ void fileNew();
+ void optionsPreferences();
+ void newToolbarConfig();
+
+ void changeStatusbar(const QString& text);
+ void changeCaption(const QString& text);
+
+private:
+
+ void setupActions();
+
+private:
+ %{APPNAMELC}View *m_view;
+
+ KPrinter *m_printer;
+};
+
+#endif // _%{APPNAMEUC}_H_
+
diff --git a/languages/cpp/app_templates/kconfig35/app.kcfg b/languages/cpp/app_templates/kconfig35/app.kcfg
new file mode 100644
index 00000000..686f25f2
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/app.kcfg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="%{APPNAMELC}rc"/>
+ <group name="Preferences">
+ <entry name="col_background" type="Color">
+ <label>color of the background</label>
+ <default>black</default>
+ </entry>
+ <entry name="col_foreground" type="Color">
+ <label>color of the foreground</label>
+ <default>yellow</default>
+ </entry>
+ <entry name="val_time" type="Int">
+ <label>size of a ball</label>
+ <default>2</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/languages/cpp/app_templates/kconfig35/app.kdevelop b/languages/cpp/app_templates/kconfig35/app.kdevelop
new file mode 100644
index 00000000..07cf3f0f
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/app.kdevelop
@@ -0,0 +1,168 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <ignoreparts/>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>false</terminal>
+ </run>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ </make>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs/>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ <runappinappdirectory>true</runappinappdirectory>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions/>
+ <updateoptions>-dP</updateoptions>
+ <addoptions/>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions/>
+ <rshoptions/>
+ </kdevcvs>
+ <cppsupportpart>
+ <codecompletion/>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL/>
+ <implementationURL/>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kconfig35/appui.rc b/languages/cpp/app_templates/kconfig35/appui.rc
new file mode 100644
index 00000000..06549878
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="move"><text>&amp;Move</text>
+ <Action name="switch_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kconfig35/appview.cpp b/languages/cpp/app_templates/kconfig35/appview.cpp
new file mode 100644
index 00000000..35e23682
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/appview.cpp
@@ -0,0 +1,41 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}view.h"
+#include "settings.h"
+
+#include <klocale.h>
+#include <qlabel.h>
+
+%{APPNAMELC}View::%{APPNAMELC}View(QWidget *parent)
+ : %{APPNAMELC}view_base(parent)
+{
+ settingsChanged();
+}
+
+%{APPNAMELC}View::~%{APPNAMELC}View()
+{
+
+}
+
+void %{APPNAMELC}View::switchColors()
+{
+ // switch the foreground/background colors of the label
+ QColor color = Settings::col_background();
+ Settings::setCol_background( Settings::col_foreground() );
+ Settings::setCol_foreground( color );
+
+ settingsChanged();
+}
+
+void %{APPNAMELC}View::settingsChanged()
+{
+ sillyLabel->setPaletteBackgroundColor( Settings::col_background() );
+ sillyLabel->setPaletteForegroundColor( Settings::col_foreground() );
+
+ // i18n : internationalization
+ sillyLabel->setText( i18n("This project is %1 days old").arg(Settings::val_time()) );
+ emit signalChangeStatusbar( i18n("Settings changed") );
+}
+
+#include "%{APPNAMELC}view.moc"
+
diff --git a/languages/cpp/app_templates/kconfig35/appview.h b/languages/cpp/app_templates/kconfig35/appview.h
new file mode 100644
index 00000000..45a10de7
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/appview.h
@@ -0,0 +1,52 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}VIEW_H_
+#define _%{APPNAMEUC}VIEW_H_
+
+#include <qwidget.h>
+
+#include "%{APPNAMELC}view_base.h"
+
+class QPainter;
+class KURL;
+
+/**
+ * This is the main view class for %{APPNAME}. Most of the non-menu,
+ * non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ * here.
+ *
+ * @short Main view
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAMELC}View : public %{APPNAMELC}view_base
+{
+ Q_OBJECT
+public:
+ /**
+ * Default constructor
+ */
+ %{APPNAMELC}View(QWidget *parent);
+
+ /**
+ * Destructor
+ */
+ virtual ~%{APPNAMELC}View();
+
+signals:
+ /**
+ * Use this signal to change the content of the statusbar
+ */
+ void signalChangeStatusbar(const QString& text);
+
+ /**
+ * Use this signal to change the content of the caption
+ */
+ void signalChangeCaption(const QString& text);
+
+private slots:
+ void switchColors();
+ void settingsChanged();
+};
+
+#endif // _%{APPNAMEUC}VIEW_H_
diff --git a/languages/cpp/app_templates/kconfig35/appview_base.ui b/languages/cpp/app_templates/kconfig35/appview_base.ui
new file mode 100644
index 00000000..626d95df
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/appview_base.ui
@@ -0,0 +1,33 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>%{APPNAMELC}view_base</class>
+<widget class="QWidget">
+<property name="name">
+<cstring>%{APPNAMELC}view_base</cstring>
+</property>
+<property name="geometry">
+<rect>
+<x>0</x>
+<y>0</y>
+<width>268</width>
+<height>164</height>
+</rect>
+</property>
+<property name="caption">
+<string>%{APPNAMELC}_base</string>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel" row="0" column="0">
+<property name="name">
+<cstring>sillyLabel</cstring>
+</property>
+<property name="text">
+<string>hello, world</string>
+</property>
+</widget>
+</grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kconfig35/kconfig35.kdevtemplate b/languages/cpp/app_templates/kconfig35/kconfig35.kdevtemplate
new file mode 100644
index 00000000..0aa709f4
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/kconfig35.kdevtemplate
@@ -0,0 +1,245 @@
+# KDE Config File
+[General]
+Name=KConfig XT for KDE 3.5
+Name[ca]=KConfig XT per a KDE 3.5
+Name[de]=KConfigXT-Anwendung für KDE 3.5
+Name[el]=ΕφαÏμογή KConfig XT για το KDE 3.5
+Name[es]=KConfig XT para KDE 3.5
+Name[et]=KConfig XT KDE 3.5 jaoks
+Name[fr]=Application KConfig XT pour KDE 3.5
+Name[hu]=KConfig XT a KDE 3.5-höz
+Name[it]=KConfig XT per KDE 3.5
+Name[ja]=KDE 3.5 用 KConfig XT
+Name[nds]=KConfig-XT-Programm för KDE 3.5
+Name[nl]=KConfig XT voor KDE 3.5
+Name[pl]=Program KConfig XT dla KDE 3.5
+Name[pt]=Aplicação do KConfig XT para o KDE 3.5
+Name[pt_BR]=Aplicação do KConfig XT para o KDE 3.5
+Name[ru]=Приложение KDE 3.5 Ñ KConfig XT
+Name[sk]=KConfig XT pre KDE 3.5
+Name[sr]=KConfig XT програм за KDE 3.5
+Name[sr@Latn]=KConfig XT program za KDE 3.5
+Name[sv]=KConfig XT för KDE 3.5
+Name[zh_TW]=KDE 3.5 çš„ KConfig XT 應用程å¼
+Category=C++/KDE
+Icon=kxt.png
+Comment=Generates a simple KDE application with one widget and a configuration dialog compatible with KDE 3.5 only
+Comment[ca]=Genera una simple aplicació per al KDE amb un estri i un diàleg de configuració compatible només amb KDE 3.5.
+Comment[da]=Genererer et simpelt KDE-program med en kontrol og en indstillingsdialog der kun er kompatibelt med KDE 3.5
+Comment[de]=Erstellt eine einfache KDE-Anwendung für KDE 3.5 mit einem Widget und einem Einstellungsdialog.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή KDE με ένα γÏαφικό συστατικό, ένα διάλογο ÏÏθμισης συμβατό μόνο με το KDE 3.5
+Comment[en_GB]=Generates a simple KDE application with one widget and a configuration dialogue compatible with KDE 3.5 only
+Comment[es]=Genera una sencilla aplicación para KDE con un widget y un diálogo de configuración compatible solo con KDE 3.5
+Comment[et]=Lihtsa KDE rakenduse loomine ühe vidina ja vaid KDE 3.5-ga ühilduva seadistustedialoogiga.
+Comment[fr]=Génère une application KDE simple comprenant un seul élément graphique et une boîte de dialogue de configuration compatible avec KDE 3.5 uniquement
+Comment[hu]=Létrehoz egy egyszerű KDE-alkalmazást egy grafikus elemmel és egy beállítóablakkal, csak a KDE 3.5-tel kompatibilis
+Comment[it]=Genera una semplice applicazione KDE con un elemento grafico e una finestra di configurazione compatibile solo con KDE 3.5
+Comment[ja]=一ã¤ã®ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆã¨è¨­å®šãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’å«ã‚€ç°¡å˜ãª KDE アプリケーションを作æˆã—ã¾ã™ (KDE 3.5 用)
+Comment[nds]=Stellt en eenfach KDE-Programm mit een Element un en Instelldialoog op, de bloots mit KDE 3.5 kompatibel is.
+Comment[nl]=Genereert een eenvoudige KDE-toepassing met één widget en een configuratiedialoog die alleen met KDE 3.5 compatible is
+Comment[pl]=Generuje prosty program KDE z jednym widżetem i oknem konfiguracyjnym zgodnym z KDE 3.5
+Comment[pt]=Gera uma aplicação simples do KDE com uma janela principal e outra para configuração, apenas para o KDE 3.5
+Comment[pt_BR]=Gera uma aplicação simples do KDE com uma janela principal e outra para configuração, apenas para o KDE 3.5
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE Ñ Ð¾Ð´Ð½Ð¸Ð¼ виджетом и диалогом конфигурации, ÑовмеÑтимое только Ñ KDE 3.5.
+Comment[sk]=Vygeneruje jednoduchú KDE aplikáciu s jedným oknom a konfiguraÄným dialógom kompatibilnú len s KDE 3.5
+Comment[sr]=Прави једноÑтаван KDE програм Ñа једном контролом и дијалогом за подешавање, компатибилан Ñамо Ñа KDE-ом 3.5
+Comment[sr@Latn]=Pravi jednostavan KDE program sa jednom kontrolom i dijalogom za podešavanje, kompatibilan samo sa KDE-om 3.5
+Comment[sv]=Skapar ett enkelt KDE-program med en grafisk komponent och en inställningsdialogruta, som bara fungerar med KDE 3.5
+Comment[zh_TW]=產生一個簡單的 KDE 3.5 上的應用程å¼ï¼Œå…§å«ä¸€å€‹å…ƒä»¶èˆ‡ä¸€å€‹è¨­å®šå°è©±æ¡†ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp,%{dest}/README
+Archive=kconfig35.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE13]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE14]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE16]
+Type=install
+Source=%{src}/app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE17]
+Type=install
+EscapeXML=true
+Source=%{src}/appview_base.ui
+Dest=%{dest}/src/%{APPNAMELC}view_base.ui
+
+[FILE18]
+Type=install
+Source=%{src}/appview.cpp
+Dest=%{dest}/src/%{APPNAMELC}view.cpp
+
+[FILE19]
+Type=install
+Source=%{src}/appview.h
+Dest=%{dest}/src/%{APPNAMELC}view.h
+
+[FILE20]
+Type=install
+EscapeXML=true
+Source=%{src}/prefs-base.ui
+Dest=%{dest}/src/prefs-base.ui
+
+[FILE21]
+Type=install
+Source=%{src}/prefs.cpp
+Dest=%{dest}/src/prefs.cpp
+
+[FILE22]
+Type=install
+Source=%{src}/prefs.h
+Dest=%{dest}/src/prefs.h
+
+[FILE23]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE24]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE25]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/README
+
+[FILE26]
+Type=install
+Source=%{src}/app.kcfg
+Dest=%{dest}/src/%{APPNAMELC}.kcfg
+
+[FILE27]
+Type=install
+Source=%{src}/settings.kcfgc
+Dest=%{dest}/src/settings.kcfgc
+
+[FILE28]
+Type=install
+Source=%{src}/src-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MSG]
+Type=message
+Comment=A KDE 3.5 KConfig XT application was created in %{dest}
+Comment[ca]=Una aplicació KConfig XT per al KDE ha estat creada en %{dest}
+Comment[da]=Et KDE 3.5 KConfig XT-program blev oprettet i %{dest}
+Comment[de]=Eine KConfig-XT-Anwendung für KDE 3.5 wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή KConfig XT του KDE 3.5 δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación KConfig XT para KDE 3.5 ha sido creada en %{dest}
+Comment[et]=KDE 3.5 KConfig XT rakendus loodi asukohta %{dest}
+Comment[fr]=Une application KConfig XT pour KDE 3.5 a été créée dans %{dest}
+Comment[hu]=Létrejött egy KConfig XT-alapú KDE 3.5-alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione KConfig XT per KDE 3.5 in %{dest}
+Comment[ja]=KDE 3.5 用 KConfig XT アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KConfig-XT-Programm för KDE 3.5 opstellt
+Comment[nl]=Een KDE 3.5 KConfig XT-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program KConfig XT dla KDE 3.5 został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do KConfig XT para o KDE 3.5 em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do KConfig XT para o KDE 3.5 em %{dest}
+Comment[ru]=Приложение KDE Ñ KConfig XT Ñоздано в %{dest}
+Comment[sk]=KConfig XT pre KDE 3.5 bola vytvorená v %{dest}
+Comment[sr]=KConfig XT програм за KDE 3.5 направљен је у %{dest}
+Comment[sr@Latn]=KConfig XT program za KDE 3.5 napravljen je u %{dest}
+Comment[sv]=Ett KDE 3.5 KConfig XT-program skapades i %{dest}
+Comment[zh_TW]=一個 KDE 3.5 上的 KConfig XT 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kconfig35/kconfig35.png b/languages/cpp/app_templates/kconfig35/kconfig35.png
new file mode 100644
index 00000000..a3866883
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/kconfig35.png
Binary files differ
diff --git a/languages/cpp/app_templates/kconfig35/kxt35.png b/languages/cpp/app_templates/kconfig35/kxt35.png
new file mode 100644
index 00000000..a3866883
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/kxt35.png
Binary files differ
diff --git a/languages/cpp/app_templates/kconfig35/main.cpp b/languages/cpp/app_templates/kconfig35/main.cpp
new file mode 100644
index 00000000..66f038c9
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/main.cpp
@@ -0,0 +1,57 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static const char description[] =
+ I18N_NOOP("A KDE Application");
+
+static const char version[] = "%{VERSION}";
+
+static KCmdLineOptions options[] =
+{
+ { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", 0, 0, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KApplication app;
+
+ // see if we are starting with session management
+ if (app.isRestored())
+ {
+ RESTORE(%{APPNAMELC});
+ }
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->count() == 0)
+ {
+ %{APPNAMELC} *widget = new %{APPNAMELC};
+ widget->show();
+ }
+ else
+ {
+ int i = 0;
+ for (; i < args->count(); i++)
+ {
+ %{APPNAMELC} *widget = new %{APPNAMELC};
+ widget->show();
+ }
+ }
+ args->clear();
+ }
+
+ return app.exec();
+}
+
diff --git a/languages/cpp/app_templates/kconfig35/prefs-base.ui b/languages/cpp/app_templates/kconfig35/prefs-base.ui
new file mode 100644
index 00000000..5c0fc860
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/prefs-base.ui
@@ -0,0 +1,127 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>Prefs_base</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Prefs_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>282</width>
+ <height>156</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Background color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_col_background</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Project age:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Foreground color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="1" column="1">
+ <property name="name">
+ <cstring>kcfg_col_foreground</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox" row="2" column="1">
+ <property name="name">
+ <cstring>kcfg_val_time</cstring>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/app_templates/kconfig35/prefs.cpp b/languages/cpp/app_templates/kconfig35/prefs.cpp
new file mode 100644
index 00000000..e7a46ddf
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/prefs.cpp
@@ -0,0 +1,12 @@
+%{CPP_TEMPLATE}
+
+#include "prefs.h"
+#include <kdebug.h>
+
+Prefs::Prefs()
+ : Prefs_base()
+{
+// debugging :
+// kdWarning()<<"creating a pref dialog"<<endl;
+}
+
diff --git a/languages/cpp/app_templates/kconfig35/prefs.h b/languages/cpp/app_templates/kconfig35/prefs.h
new file mode 100644
index 00000000..9106fe59
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/prefs.h
@@ -0,0 +1,11 @@
+%{H_TEMPLATE}
+
+#include "prefs-base.h"
+
+
+class Prefs : public Prefs_base
+{
+ public:
+ Prefs();
+};
+
diff --git a/languages/cpp/app_templates/kconfig35/settings.kcfgc b/languages/cpp/app_templates/kconfig35/settings.kcfgc
new file mode 100644
index 00000000..384510cd
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/settings.kcfgc
@@ -0,0 +1,6 @@
+# Code generation options for kconfig_compiler
+File=%{APPNAMELC}.kcfg
+ClassName=Settings
+Singleton=true
+Mutators=col_background,col_foreground
+# will create the necessary code for setting those variables
diff --git a/languages/cpp/app_templates/kconfig35/src-Makefile.am b/languages/cpp/app_templates/kconfig35/src-Makefile.am
new file mode 100644
index 00000000..5f7936da
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/src-Makefile.am
@@ -0,0 +1,41 @@
+## Makefile.am for %{APPNAMELC}
+
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+
+# the libraries to link against.
+%{APPNAMELC}_LDADD = $(LIB_KFILE) $(LIB_KDEPRINT)
+
+# which sources should be compiled for %{APPNAMELC}
+%{APPNAMELC}_SOURCES = settings.kcfgc main.cpp %{APPNAMELC}.cpp %{APPNAMELC}view.cpp \
+ %{APPNAMELC}view_base.ui prefs-base.ui prefs.cpp
+
+xdg_apps_DATA = %{APPNAMELC}.desktop
+kde_kcfg_DATA = %{APPNAMELC}.kcfg
+
+# these are the headers for your project
+noinst_HEADERS = %{APPNAMELC}.h %{APPNAMELC}view.h prefs.h
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
+
+KDE_ICON = AUTO
+
+# this is where the kdelnk file will go
+kdelnkdir = $(kde_appsdir)/Utilities
+kdelnk_DATA = %{APPNAMELC}.desktop
+
+# this is where the XML-GUI resource file goes
+rcdir = $(kde_datadir)/%{APPNAMELC}
+rc_DATA = %{APPNAMELC}ui.rc
diff --git a/languages/cpp/app_templates/kconfig35/src-configure.in.in b/languages/cpp/app_templates/kconfig35/src-configure.in.in
new file mode 100644
index 00000000..61d4a7fd
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/src-configure.in.in
@@ -0,0 +1,7 @@
+
+#MIN_CONFIG(3.2.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
diff --git a/languages/cpp/app_templates/kconfig35/subdirs b/languages/cpp/app_templates/kconfig35/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kconfig35/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kde4app/CMakeLists.txt b/languages/cpp/app_templates/kde4app/CMakeLists.txt
new file mode 100644
index 00000000..2544a271
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/CMakeLists.txt
@@ -0,0 +1,31 @@
+project(%{APPNAME})
+find_package(KDE4 REQUIRED)
+include (KDE4Defaults)
+include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} )
+
+set(%{APPNAMELC}_SRCS
+ %{APPNAMELC}.cpp
+ main.cpp
+ %{APPNAMELC}view.cpp
+ )
+
+#kde4_automoc(${%{APPNAMELC}_SRCS})
+
+kde4_add_ui_files(%{APPNAMELC}_SRCS %{APPNAMELC}view_base.ui prefs_base.ui)
+
+kde4_add_kcfg_files(%{APPNAMELC}_SRCS settings.kcfgc )
+
+kde4_add_executable(%{APPNAMELC} ${%{APPNAMELC}_SRCS})
+
+target_link_libraries(%{APPNAMELC} ${KDE4_KDEUI_LIBS} )
+
+install(TARGETS %{APPNAMELC} DESTINATION ${BIN_INSTALL_DIR} )
+
+
+########### install files ###############
+
+install( FILES %{APPNAMELC}.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} )
+install( FILES %{APPNAMELC}.kcfg DESTINATION ${KCFG_INSTALL_DIR} )
+install( FILES %{APPNAMELC}ui.rc DESTINATION ${DATA_INSTALL_DIR}/%{APPNAMELC} )
+
+
diff --git a/languages/cpp/app_templates/kde4app/Makefile.am b/languages/cpp/app_templates/kde4app/Makefile.am
new file mode 100644
index 00000000..2b39fcb4
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = kapp4.cpp kapp4.h prefs_base.ui kapp4view.cpp kapp4view.h kapp4view_base.ui \
+ main.cpp kde4appui.rc CMakeLists.txt kapp4.desktop kapp4.kcfg settings.kcfgc \
+ kde4app.png README kde4app.kdevelop kde4app.kdevelop.filelist
+
+templateName = kde4app
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/kde4app/README b/languages/cpp/app_templates/kde4app/README
new file mode 100644
index 00000000..a5f3a307
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/README
@@ -0,0 +1,15 @@
+!!!!!ATTENTION!!!!!
+
+Before starting the build you may need to setup the KDE4 environment variables.
+To do this open Project->Project Options and then look at the "Run" and the "Make"
+pages. Each of these two has an environment variables widget in which you have
+to fill in the right values for the variables already listed.
+
+After setting up the variables you'll also need to run cmake inside the build
+directory. This can not be done by kdevelop as a KDE4 environment is needed
+when running cmake to find KDE4. Open the integrated konsole and change to the build
+subdirectory. Then setup a KDE4 environment and run "cmake ../".
+
+More information how to setup a KDE4 development environment can be found on
+http://techbase.kde.org/Getting_Started/Increased_Productivity_in_KDE4_with_Scripts
+
diff --git a/languages/cpp/app_templates/kde4app/kapp4.cpp b/languages/cpp/app_templates/kde4app/kapp4.cpp
new file mode 100644
index 00000000..c11a58d1
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kapp4.cpp
@@ -0,0 +1,90 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include "%{APPNAMELC}view.h"
+#include "settings.h"
+
+#include <QtGui/QDropEvent>
+#include <QtGui/QPainter>
+
+#include <kconfigdialog.h>
+#include <kstatusbar.h>
+
+#include <kaction.h>
+#include <kactioncollection.h>
+#include <kstandardaction.h>
+
+#include <KDE/KLocale>
+
+%{APPNAME}::%{APPNAME}()
+ : KXmlGuiWindow(),
+ m_view(new %{APPNAME}View(this)),
+ m_printer(0)
+{
+ // accept dnd
+ setAcceptDrops(true);
+
+ // tell the KXmlGuiWindow that this is indeed the main widget
+ setCentralWidget(m_view);
+
+ // then, setup our actions
+ setupActions();
+
+ // add a status bar
+ statusBar()->show();
+
+ // a call to KXmlGuiWindow::setupGUI() populates the GUI
+ // with actions, using KXMLGUI.
+ // It also applies the saved mainwindow settings, if any, and ask the
+ // mainwindow to automatically save settings if changed: window size,
+ // toolbar position, icon size, etc.
+ setupGUI();
+}
+
+%{APPNAME}::~%{APPNAME}()
+{
+}
+
+void %{APPNAME}::setupActions()
+{
+ KStandardAction::openNew(this, SLOT(fileNew()), actionCollection());
+ KStandardAction::quit(qApp, SLOT(quit()), actionCollection());
+
+ KStandardAction::preferences(this, SLOT(optionsPreferences()), actionCollection());
+
+ // custom menu and menu item - the slot is in the class %{APPNAME}View
+ KAction *custom = new KAction(KIcon("colorize"), i18n("Swi&tch Colors"), this);
+ actionCollection()->addAction( QLatin1String("switch_action"), custom );
+ connect(custom, SIGNAL(triggered(bool)), m_view, SLOT(switchColors()));
+}
+
+void %{APPNAME}::fileNew()
+{
+ // this slot is called whenever the File->New menu is selected,
+ // the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ // button is clicked
+
+ // create a new window
+ (new %{APPNAME})->show();
+}
+
+void %{APPNAME}::optionsPreferences()
+{
+ // The preference dialog is derived from prefs_base.ui
+ //
+ // compare the names of the widgets in the .ui file
+ // to the names of the variables in the .kcfg file
+ //avoid to have 2 dialogs shown
+ if ( KConfigDialog::showDialog( "settings" ) ) {
+ return;
+ }
+ KConfigDialog *dialog = new KConfigDialog(this, "settings", Settings::self());
+ QWidget *generalSettingsDlg = new QWidget;
+ ui_prefs_base.setupUi(generalSettingsDlg);
+ dialog->addPage(generalSettingsDlg, i18n("General"), "package_setting");
+ connect(dialog, SIGNAL(settingsChanged(QString)), m_view, SLOT(settingsChanged()));
+ dialog->setAttribute( Qt::WA_DeleteOnClose );
+ dialog->show();
+}
+
+#include "%{APPNAMELC}.moc"
diff --git a/languages/cpp/app_templates/kde4app/kapp4.desktop b/languages/cpp/app_templates/kde4app/kapp4.desktop
new file mode 100644
index 00000000..008fad44
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kapp4.desktop
@@ -0,0 +1,30 @@
+[Desktop Entry]
+Name=KApp4
+Name[nds]=KProg4
+Name[sv]=KDE 4-program
+Name[zh_TW]=KApp4 程å¼
+Exec=kapp4 %i -caption "%c"
+Icon=kapp4
+Type=Application
+X-DocPath=kapp4/kapp4.html
+GenericName=A KDE4 Application
+GenericName[ca]=Una aplicació del KDE4
+GenericName[da]=Et KDE4-program
+GenericName[de]=Eine KDE 4-Anwendung
+GenericName[el]=Μία εφαÏμογή του KDE4
+GenericName[es]=Una aplicación para KDE4
+GenericName[et]=KDE4 rakendus
+GenericName[hu]=KDE4-alapú alkalmazás
+GenericName[it]=Applicazione KDE4
+GenericName[nds]=En KDE4-Programm
+GenericName[nl]=Een KDE4-programma
+GenericName[pl]=Program dla KDE4
+GenericName[pt]=Uma Aplicação do KDE4
+GenericName[pt_BR]=Uma Aplicação do KDE4
+GenericName[ru]=Приложение KDE 4
+GenericName[sk]=KDE4 aplikácia
+GenericName[sr]=KDE4 програм
+GenericName[sr@Latn]=KDE4 program
+GenericName[sv]=Ett KDE 4-program
+GenericName[zh_TW]=KDE4 應用程å¼
+Terminal=false
diff --git a/languages/cpp/app_templates/kde4app/kapp4.h b/languages/cpp/app_templates/kde4app/kapp4.h
new file mode 100644
index 00000000..fb059fde
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kapp4.h
@@ -0,0 +1,53 @@
+%{H_TEMPLATE}
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+
+
+#include <kxmlguiwindow.h>
+
+#include "ui_prefs_base.h"
+
+class %{APPNAME}View;
+class KPrinter;
+class KToggleAction;
+class KUrl;
+
+/**
+ * This class serves as the main window for %{APPNAME}. It handles the
+ * menus, toolbars, and status bars.
+ *
+ * @short Main window class
+ * @author Andreas Pakulat <apaku@gmx.de>
+ * @version 0.1
+ */
+class %{APPNAME} : public KXmlGuiWindow
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ %{APPNAME}();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~%{APPNAME}();
+
+private slots:
+ void fileNew();
+ void optionsPreferences();
+
+private:
+ void setupActions();
+
+private:
+ Ui::prefs_base ui_prefs_base ;
+ %{APPNAME}View *m_view;
+
+ KPrinter *m_printer;
+ KToggleAction *m_toolbarAction;
+ KToggleAction *m_statusbarAction;
+};
+
+#endif // _%{APPNAMELC}_H_
diff --git a/languages/cpp/app_templates/kde4app/kapp4.kcfg b/languages/cpp/app_templates/kde4app/kapp4.kcfg
new file mode 100644
index 00000000..6040f769
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kapp4.kcfg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="%{APPNAMELC}rc"/>
+ <group name="Preferences">
+ <entry name="col_background" type="Color">
+ <label>color of the background</label>
+ <default>black</default>
+ </entry>
+ <entry name="col_foreground" type="Color">
+ <label>color of the foreground</label>
+ <default>yellow</default>
+ </entry>
+ <entry name="val_time" type="Int">
+ <label>size of a ball</label>
+ <default>2</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/languages/cpp/app_templates/kde4app/kapp4view.cpp b/languages/cpp/app_templates/kde4app/kapp4view.cpp
new file mode 100644
index 00000000..256f6bcb
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kapp4view.cpp
@@ -0,0 +1,42 @@
+%{CPP_TEMPLATE}
+#include "%{APPNAMELC}view.h"
+#include "settings.h"
+
+#include <klocale.h>
+#include <QtGui/QLabel>
+
+%{APPNAME}View::%{APPNAME}View(QWidget *)
+{
+ ui_%{APPNAMELC}view_base.setupUi(this);
+ settingsChanged();
+ setAutoFillBackground(true);
+}
+
+%{APPNAME}View::~%{APPNAME}View()
+{
+
+}
+
+void %{APPNAME}View::switchColors()
+{
+ // switch the foreground/background colors of the label
+ QColor color = Settings::col_background();
+ Settings::setCol_background( Settings::col_foreground() );
+ Settings::setCol_foreground( color );
+
+ settingsChanged();
+}
+
+void %{APPNAME}View::settingsChanged()
+{
+ QPalette pal;
+ pal.setColor( QPalette::Window, Settings::col_background());
+ pal.setColor( QPalette::WindowText, Settings::col_foreground());
+ ui_%{APPNAMELC}view_base.kcfg_sillyLabel->setPalette( pal );
+
+ // i18n : internationalization
+ ui_%{APPNAMELC}view_base.kcfg_sillyLabel->setText( i18n("This project is %1 days old",Settings::val_time()) );
+ emit signalChangeStatusbar( i18n("Settings changed") );
+}
+
+#include "%{APPNAMELC}view.moc"
diff --git a/languages/cpp/app_templates/kde4app/kapp4view.h b/languages/cpp/app_templates/kde4app/kapp4view.h
new file mode 100644
index 00000000..ab08445f
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kapp4view.h
@@ -0,0 +1,55 @@
+%{H_TEMPLATE}
+#ifndef %{APPNAMELC}VIEW_H
+#define %{APPNAMELC}VIEW_H
+
+#include <QtGui/QWidget>
+
+#include "ui_%{APPNAMELC}view_base.h"
+
+class QPainter;
+class KUrl;
+
+/**
+ * This is the main view class for %{APPNAME}. Most of the non-menu,
+ * non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ * here.
+ *
+ * @short Main view
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+
+class %{APPNAME}View : public QWidget, public Ui::%{APPNAMELC}view_base
+{
+ Q_OBJECT
+public:
+ /**
+ * Default constructor
+ */
+ %{APPNAME}View(QWidget *parent);
+
+ /**
+ * Destructor
+ */
+ virtual ~%{APPNAME}View();
+
+private:
+ Ui::%{APPNAMELC}view_base ui_%{APPNAMELC}view_base;
+
+signals:
+ /**
+ * Use this signal to change the content of the statusbar
+ */
+ void signalChangeStatusbar(const QString& text);
+
+ /**
+ * Use this signal to change the content of the caption
+ */
+ void signalChangeCaption(const QString& text);
+
+private slots:
+ void switchColors();
+ void settingsChanged();
+};
+
+#endif // %{APPNAME}VIEW_H
diff --git a/languages/cpp/app_templates/kde4app/kapp4view_base.ui b/languages/cpp/app_templates/kde4app/kapp4view_base.ui
new file mode 100644
index 00000000..eb6a254a
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kapp4view_base.ui
@@ -0,0 +1,213 @@
+<ui version="4.0" >
+<class>%{APPNAMELC}view_base</class>
+<widget class="QWidget" name="%{APPNAMELC}view_base" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>315</width>
+ <height>233</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>%{APPNAMELC}_base</string>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="leftMargin" >
+ <number>11</number>
+ </property>
+ <property name="topMargin" >
+ <number>11</number>
+ </property>
+ <property name="rightMargin" >
+ <number>11</number>
+ </property>
+ <property name="bottomMargin" >
+ <number>11</number>
+ </property>
+ <property name="horizontalSpacing" >
+ <number>6</number>
+ </property>
+ <property name="verticalSpacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="kcfg_sillyLabel" >
+ <property name="palette" >
+ <palette>
+ <active>
+ <colorrole role="WindowText" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>255</red>
+ <green>255</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Button" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Base" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="AlternateBase" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </active>
+ <inactive>
+ <colorrole role="WindowText" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>255</red>
+ <green>255</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Button" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Base" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="AlternateBase" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </inactive>
+ <disabled>
+ <colorrole role="WindowText" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>119</red>
+ <green>119</green>
+ <blue>119</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Button" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Base" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="AlternateBase" >
+ <brush brushstyle="SolidPattern" >
+ <color alpha="255" >
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>12</pointsize>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>hello, world</string>
+ </property>
+ <property name="scaledContents" >
+ <bool>true</bool>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/languages/cpp/app_templates/kde4app/kde4app.kdevelop b/languages/cpp/app_templates/kde4app/kde4app.kdevelop
new file mode 100644
index 00000000..d36a9536
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kde4app.kdevelop
@@ -0,0 +1,205 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <projectname>%{APPNAMELC}</projectname>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <ignoreparts/>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs/>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ <runappinappdirectory>true</runappinappdirectory>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions/>
+ <updateoptions>-dP</updateoptions>
+ <addoptions/>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions/>
+ <rshoptions/>
+ </kdevcvs>
+ <cppsupportpart>
+ <codecompletion/>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL/>
+ <implementationURL/>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>%{dest}/build/%{APPNAMELC}</mainprogram>
+ <programargs/>
+ <terminal>false</terminal>
+ <autocompile>false</autocompile>
+ <envvars>
+ <envvar value="" name="KDEDIRS" />
+ <envvar value="" name="KDEHOME" />
+ <envvar value="" name="LD_LIBRARY_PATH" />
+ <envvar value="" name="PATH" />
+ <envvar value="" name="PKG_CONFIG_PATH" />
+ <envvar value="" name="QT_PLUGIN_PATH" />
+ </envvars>
+ <autoinstall>false</autoinstall>
+ <autokdesu>false</autokdesu>
+ <globaldebugarguments/>
+ <useglobalprogram>true</useglobalprogram>
+ <globalcwd>%{dest}</globalcwd>
+ <directoryradio>executable</directoryradio>
+ </run>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir>%{dest}/build</builddir>
+ </build>
+ <make>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <prio>0</prio>
+ <dontact>false</dontact>
+ <makebin>make</makebin>
+ <defaulttarget/>
+ <makeoptions/>
+ <selectedenvironment>default</selectedenvironment>
+ <environments>
+ <default>
+ <envvar value="" name="KDEDIRS" />
+ <envvar value="" name="KDEHOME" />
+ <envvar value="" name="LD_LIBRARY_PATH" />
+ <envvar value="" name="PATH" />
+ <envvar value="" name="PKG_CONFIG_PATH" />
+ <envvar value="" name="QT_PLUGIN_PATH" />
+ </default>
+ </environments>
+ </make>
+ <filetypes>
+ <filetype>*.h</filetype>
+ <filetype>*.cpp</filetype>
+ <filetype>CMakeLists.txt</filetype>
+ <filetype>*.desktop</filetype>
+ <filetype>*.kcfg*</filetype>
+ <filetype>*.ui</filetype>
+ <filetype>Doxyfile</filetype>
+ <filetype>*.dox</filetype>
+ <filetype>*.rc</filetype>
+ <filetype>*.cmake</filetype>
+ </filetypes>
+ <other>
+ <prio>0</prio>
+ <otherbin/>
+ <defaulttarget/>
+ <otheroptions/>
+ <selectedenvironment>default</selectedenvironment>
+ <environments>
+ <default/>
+ </environments>
+ </other>
+ <blacklist>
+ <path>build</path>
+ </blacklist>
+ </kdevcustomproject>
+ <kdevcppsupport>
+ <qt>
+ <used>true</used>
+ <version>4</version>
+ <includestyle>4</includestyle>
+ <designerintegration>ExternalDesigner</designerintegration>
+ <designer>/usr/bin/designer-qt4</designer>
+ <root>/usr/lib/qt4</root>
+ </qt>
+ </kdevcppsupport>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kde4app/kde4app.kdevelop.filelist b/languages/cpp/app_templates/kde4app/kde4app.kdevelop.filelist
new file mode 100644
index 00000000..5235563f
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kde4app.kdevelop.filelist
@@ -0,0 +1,13 @@
+# KDevelop Custom Project File List
+CMakeLists.txt
+main.cpp
+prefs_base.ui
+settings.kcfgc
+%{APPNAMELC}.cpp
+%{APPNAMELC}.desktop
+%{APPNAMELC}.h
+%{APPNAMELC}.kcfg
+%{APPNAMELC}ui.rc
+%{APPNAMELC}view.cpp
+%{APPNAMELC}view.h
+%{APPNAMELC}view_base.ui
diff --git a/languages/cpp/app_templates/kde4app/kde4app.kdevtemplate b/languages/cpp/app_templates/kde4app/kde4app.kdevtemplate
new file mode 100644
index 00000000..2a7269fd
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kde4app.kdevtemplate
@@ -0,0 +1,155 @@
+# KDE Config File
+[General]
+Name=KDE4 Application framework
+Name[ca]=Entorn de treball d'aplicacions pel KDE4
+Name[da]=KDE4 program-framework
+Name[de]=KDE 4-Anwendungsgrundgerüst
+Name[el]=Πλαίσιο εφαÏμογής του KDE4
+Name[es]=Infraestructura de aplicación para KDE4
+Name[et]=KDE4 rakenduse raamistik
+Name[hu]=Keretrendszer KDE4-alapú alkalmazáshoz
+Name[it]=Infrastruttura per applicazioni KDE4
+Name[nds]=KDE4-Programmrahmenwark
+Name[nl]=KDE4-programmaframewerk
+Name[pl]=Szablon programu dla KDE4
+Name[pt]=Plataforma de aplicações do KDE4
+Name[pt_BR]=Plataforma de aplicações do KDE4
+Name[ru]=ИнÑтрументарий Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ KDE 4
+Name[sk]=KDE4 aplikaÄný framework
+Name[sr]=Радни оквир KDE4 програма
+Name[sr@Latn]=Radni okvir KDE4 programa
+Name[sv]=KDE 4-programramverk
+Name[zh_TW]=KDE4 應用程å¼æ¡†æž¶
+Icon=kde4app.png
+Category=C++/KDE4
+Comment=Generates a simple KDE4 application with one toplevel window, menus and toolbars.
+Comment[ca]=Genera una aplicació senzilla per al KDE4 amb una finestra principal, menús i barres d'eines.
+Comment[da]=Genererer et simpelt KDE4-program med et vindue på topniveau, menuer og værktøjslinjer.
+Comment[de]=Erstellt eine einfache KDE 4-Anwendung mit einem Toplevel-Fenster, Menüs und Werkzeugleisten.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή του KDE4 με ένα ανώτεÏο παÏάθυÏο, μενοÏ, και γÏαμμές εÏγαλείων.
+Comment[es]=Genera una sencilla aplicación para KDE4 con una ventana principal, menús y barras de herramientas.
+Comment[et]=Lihtsa KDE4 rakenduse loomine ühe tipptaseme akna, menüüde ja tööriistaribadega.
+Comment[hu]=Létrehoz egy egyszerű KDE4-alkalmazást egy főablakkal, menükkel és eszköztárakkal.
+Comment[it]=Genera una semplice applicazione KDE4 con una finestra toplevel, menu e barre degli strumenti.
+Comment[nds]=Stellt en eenfach KDE4-Programm mit een böverst Finster, Menüs un Warktüüchbalkens op.
+Comment[nl]=Genereert een eenvoudig KDE4-programma met een topniveauvenster, menu's en werkbalken.
+Comment[pl]=Generuje prosty program dla KDE4 posiadający okno, menu i paski narzędzi.
+Comment[pt]=Gera uma aplicação para KDE4 simples, com uma janela de topo, menus e barras de ferramentas.
+Comment[pt_BR]=Gera uma aplicação para KDE4 simples, com uma janela de topo, menus e barras de ferramentas.
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE 4 Ñ Ð¾Ð´Ð½Ð¸Ð¼ окном верхнего уровнÑ, меню и панелÑми инÑтрументов.
+Comment[sk]=Vygeneruje jednoduchú KDE4 aplikáciu s jedným oknom, menu a panelom nástrojov.
+Comment[sr]=Прави једноÑтаван KDE4 програм Ñа једним прозором највишег нивоа, менијима и тракама Ñа алатом.
+Comment[sr@Latn]=Pravi jednostavan KDE4 program sa jednim prozorom najvišeg nivoa, menijima i trakama sa alatom.
+Comment[sv]=Skapar ett enkelt KDE 4-program med ett toppnivåfönster, menyer och verktygsrader.
+Comment[zh_TW]=產生一個簡單的 KDE4 應用程å¼ï¼Œå…§å«é ‚層視窗ã€é¸å–®èˆ‡å·¥å…·åˆ—。
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/README
+Archive=kde4app.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/CMakeLists.txt
+Dest=%{dest}/CMakeLists.txt
+
+[FILE2]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/main.cpp
+
+[FILE3]
+Type=install
+Source=%{src}/kapp4.cpp
+Dest=%{dest}/%{APPNAMELC}.cpp
+
+[FILE4]
+Type=install
+Source=%{src}/kapp4.h
+Dest=%{dest}/%{APPNAMELC}.h
+
+[FILE5]
+Type=install
+Source=%{src}/kapp4view.cpp
+Dest=%{dest}/%{APPNAMELC}view.cpp
+
+
+[FILE6]
+Type=install
+Source=%{src}/kapp4view.h
+Dest=%{dest}/%{APPNAMELC}view.h
+
+
+[FILE7]
+Type=install
+Source=%{src}/kde4appui.rc
+Dest=%{dest}/%{APPNAMELC}ui.rc
+
+
+[FILE8]
+Type=install
+Source=%{src}/kapp4view_base.ui
+Dest=%{dest}/%{APPNAMELC}view_base.ui
+
+
+[FILE9]
+Type=install
+Source=%{src}/kapp4.desktop
+Dest=%{dest}/%{APPNAMELC}.desktop
+
+[FILE10]
+Type=install
+Source=%{src}/kapp4.kcfg
+Dest=%{dest}/%{APPNAMELC}.kcfg
+
+
+[FILE11]
+Type=install
+Source=%{src}/prefs_base.ui
+Dest=%{dest}/prefs_base.ui
+
+
+[FILE12]
+Type=install
+Source=%{src}/settings.kcfgc
+Dest=%{dest}/settings.kcfgc
+
+[FILE13]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/README
+
+[FILE14]
+Type=install
+Source=%{src}/kde4app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE15]
+Type=install
+Source=%{src}/kde4app.kdevelop.filelist
+Dest=%{dest}/%{APPNAMELC}.kdevelop.filelist
+
+[MKDIR1]
+Type=mkdir
+Dir=%{dest}/build
+
+[MSG]
+Type=message
+Comment=A KDE4 Application was created at %{dest}
+Comment[ca]=S'ha creat una aplicació per al KDE4 a %{dest}
+Comment[da]=Et KDE4-program blev oprettet i %{dest}
+Comment[de]=Eine KDE 4-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή KDE4 δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación para KDE4 ha sido creada en %{dest}
+Comment[et]=KDE4 rakendus loodi asukohta %{dest}
+Comment[hu]=Létrejött egy KDE4-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione KDE4 in %{dest}
+Comment[nds]=In %{dest} wöör en KDE4-Programm opstellt
+Comment[nl]=Een KDE4-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program dla KDE4 został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do KDE4 em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do KDE4 em %{dest}
+Comment[ru]=Приложение KDE 4 Ñоздано в %{dest}
+Comment[sk]=KDE4 aplikácia bola vytvorená v %{dest}
+Comment[sr]=KDE4 програм је направљен у %{dest}
+Comment[sr@Latn]=KDE4 program je napravljen u %{dest}
+Comment[sv]=Ett KDE 4-program skapades i %{dest}
+Comment[zh_TW]=一個 KDE4 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kde4app/kde4app.png b/languages/cpp/app_templates/kde4app/kde4app.png
new file mode 100644
index 00000000..a421a664
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kde4app.png
Binary files differ
diff --git a/languages/cpp/app_templates/kde4app/kde4appui.rc b/languages/cpp/app_templates/kde4app/kde4appui.rc
new file mode 100644
index 00000000..406bccc6
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/kde4appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KApp4" version="1">
+<MenuBar>
+ <Menu name="move"><text>&amp;Move</text>
+ <Action name="switch_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kde4app/main.cpp b/languages/cpp/app_templates/kde4app/main.cpp
new file mode 100644
index 00000000..2bb5b6bf
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/main.cpp
@@ -0,0 +1,55 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <KDE/KLocale>
+
+static const char description[] =
+ I18N_NOOP("A KDE 4 Application");
+
+static const char version[] = "%{VERSION}";
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", 0, ki18n("%{APPNAME}"), version, ki18n(description),
+ KAboutData::License_%{LICENSE}, ki18n("(C) %{YEAR} %{AUTHOR}"), KLocalizedString(), 0, "%{EMAIL}");
+ about.addAuthor( ki18n("%{AUTHOR}"), KLocalizedString(), "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+
+ KCmdLineOptions options;
+ options.add("+[URL]", ki18n( "Document to open" ));
+ KCmdLineArgs::addCmdLineOptions(options);
+ KApplication app;
+
+ %{APPNAME} *widget = new %{APPNAME};
+
+ // see if we are starting with session management
+ if (app.isSessionRestored())
+ {
+ RESTORE(%{APPNAME});
+ }
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->count() == 0)
+ {
+ //%{APPNAMELC} *widget = new %{APPNAMELC};
+ widget->show();
+ }
+ else
+ {
+ int i = 0;
+ for (; i < args->count(); i++)
+ {
+ //%{APPNAMELC} *widget = new %{APPNAMELC};
+ widget->show();
+ }
+ }
+ args->clear();
+ }
+
+ return app.exec();
+}
diff --git a/languages/cpp/app_templates/kde4app/prefs_base.ui b/languages/cpp/app_templates/kde4app/prefs_base.ui
new file mode 100644
index 00000000..ea400f02
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/prefs_base.ui
@@ -0,0 +1,155 @@
+<ui version="4.0" >
+ <class>prefs_base</class>
+ <widget class="QWidget" name="prefs_base" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>282</width>
+ <height>156</height>
+ </rect>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabel2_2" >
+ <property name="text" >
+ <string>Background color:</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="KColorButton" name="kcfg_col_background" >
+ <property name="toolTip" >
+ <string>Choose a new background color</string>
+ </property>
+ <property name="whatsThis" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change the &lt;span style=" font-weight:600;">background&lt;/span> color by clicking here and choose the new &lt;span style=" color:#ff0000;">color&lt;/span> in the &lt;span style=" font-style:italic;">color dialog&lt;/span>.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="textLabel1" >
+ <property name="text" >
+ <string>Project age:</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="textLabel2" >
+ <property name="text" >
+ <string>Foreground color:</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="KColorButton" name="kcfg_col_foreground" >
+ <property name="toolTip" >
+ <string>Choose a new foreground color</string>
+ </property>
+ <property name="whatsThis" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change the &lt;span style=" font-weight:600;">foreground&lt;/span> color by clicking here and choose the new &lt;span style=" color:#ff0000;">color&lt;/span> in the &lt;span style=" font-style:italic;">color dialog&lt;/span>.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="kcfg_val_time" >
+ <property name="toolTip" >
+ <string>Set the project age (in days)</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Change the project age (in days) by choosing a new number of days.</string>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>2</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>KColorButton</class>
+ <extends>QPushButton</extends>
+ <header>kcolorbutton.h</header>
+ </customwidget>
+ </customwidgets>
+ <includes>
+ <include location="local" >kcolorbutton.h</include>
+ </includes>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/languages/cpp/app_templates/kde4app/settings.kcfgc b/languages/cpp/app_templates/kde4app/settings.kcfgc
new file mode 100644
index 00000000..384510cd
--- /dev/null
+++ b/languages/cpp/app_templates/kde4app/settings.kcfgc
@@ -0,0 +1,6 @@
+# Code generation options for kconfig_compiler
+File=%{APPNAMELC}.kcfg
+ClassName=Settings
+Singleton=true
+Mutators=col_background,col_foreground
+# will create the necessary code for setting those variables
diff --git a/languages/cpp/app_templates/kdecpp.appwizard b/languages/cpp/app_templates/kdecpp.appwizard
new file mode 100644
index 00000000..aa36123a
--- /dev/null
+++ b/languages/cpp/app_templates/kdecpp.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=kdedcop,kioslave,kxt,kdevlang,kmake,kapp,kconfig35,kdevlang,kdevpart,kateplugin,kdevpart2,kopart,noatunui,kateplugin2,kfileplugin,konqnavpanel,noatunvisual,dcopservice,khello,kpartapp,khello2,kpartplugin,kcmodule,kicker,kscreensaver,kscons_kxt,kscons_kmdi
diff --git a/languages/cpp/app_templates/kdedcop/.kdev_ignore b/languages/cpp/app_templates/kdedcop/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/.kdev_ignore
diff --git a/languages/cpp/app_templates/kdedcop/Makefile.am b/languages/cpp/app_templates/kdedcop/Makefile.am
new file mode 100644
index 00000000..87697fcd
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = app.cpp app.h app_iface.h app.kdevelop main.cpp mainclass.cpp \
+ mainclass.h kdedcop.png src-Makefile.am subdirs
+
+templateName = kdedcop
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kdedcop/app.cpp b/languages/cpp/app_templates/kdedcop/app.cpp
new file mode 100644
index 00000000..e295253a
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/app.cpp
@@ -0,0 +1,21 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+
+#include <qlabel.h>
+
+#include <kmainwindow.h>
+#include <klocale.h>
+
+%{APPNAME}::%{APPNAME}()
+ : KMainWindow( 0, "%{APPNAME}" )
+{
+ m_mainClass = new MainClass();
+}
+
+%{APPNAME}::~%{APPNAME}()
+{
+ if (m_mainClass) delete m_mainClass;
+}
+
+#include "%{APPNAMELC}.moc"
diff --git a/languages/cpp/app_templates/kdedcop/app.h b/languages/cpp/app_templates/kdedcop/app.h
new file mode 100644
index 00000000..b908b62c
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/app.h
@@ -0,0 +1,36 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kmainwindow.h>
+
+#include "mainclass.h"
+
+/**
+ * @short Application Main Window
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version 0.1
+ */
+class %{APPNAME} : public KMainWindow
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ %{APPNAME}();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~%{APPNAME}();
+private:
+ MainClass *m_mainClass;
+};
+
+#endif // _%{APPNAMEUC}_H_
diff --git a/languages/cpp/app_templates/kdedcop/app.kdevelop b/languages/cpp/app_templates/kdedcop/app.kdevelop
new file mode 100644
index 00000000..496a3838
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/app.kdevelop
@@ -0,0 +1,116 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>DCOP</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kdedcop/app_iface.h b/languages/cpp/app_templates/kdedcop/app_iface.h
new file mode 100644
index 00000000..57bfb059
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/app_iface.h
@@ -0,0 +1,19 @@
+%{H_TEMPLATE}
+
+#include <dcopobject.h>
+
+class DCOPDemoIface : virtual public DCOPObject
+{
+ K_DCOP
+ k_dcop:
+
+
+ // Here you should place your DCOP interface.
+ // Below are four example methods.
+ virtual QString strVal() const = 0;
+ virtual int intVal() const = 0;
+
+ virtual void setIntVal( int num ) = 0;
+ virtual void setStrVal( const QString &str ) = 0;
+
+};
diff --git a/languages/cpp/app_templates/kdedcop/kdedcop.kdevtemplate b/languages/cpp/app_templates/kdedcop/kdedcop.kdevtemplate
new file mode 100644
index 00000000..99f6e28d
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/kdedcop.kdevtemplate
@@ -0,0 +1,227 @@
+# KDE Config File
+[General]
+Name=Simple DCOP server
+Name[ca]=Simple servidor DCOP
+Name[da]=Simpel DCOP-server
+Name[de]=Einfacher DCOP-Server
+Name[el]=Απλός εξυπηÏετητής DCOP
+Name[es]=Sencillo servidor DCOP
+Name[et]=Lihtne DCOP-server
+Name[eu]=DCOP zerbitzari sinple bat
+Name[fa]=کارساز سادۀ DCOP
+Name[fr]=Serveur DCOP simple
+Name[ga]=Freastalaí simplí DCOP
+Name[gl]=Servidor sinxelo DCOP
+Name[hu]=Egyszerű DCOP-kiszolgáló
+Name[it]=Semplice server DCOP
+Name[ja]=ç°¡å˜ãª DCOP サーãƒ
+Name[nds]=Eenfach DCOP-Server
+Name[ne]=साधारण DCOP सरà¥à¤­à¤°
+Name[nl]=Eenvoudige DCOP-server
+Name[pl]=Prosty serwer DCOP
+Name[pt]=Servidor de DCOP simples
+Name[pt_BR]=Servidor de DCOP simples
+Name[ru]=Сервер DCOP
+Name[sk]=Jednoduchý DCOP server
+Name[sl]=Preprost strežnik DCOP
+Name[sr]=ЈедноÑтаван DCOP Ñервер
+Name[sr@Latn]=Jednostavan DCOP server
+Name[sv]=Enkel DCOP-server
+Name[tr]=Basit DCOP Sunucusu
+Name[zh_CN]=简å•çš„ DCOP æœåŠ¡å™¨
+Name[zh_TW]=簡單的 DCOP 伺æœå™¨
+Icon=kdedcop.png
+Category=C++/KDE
+Comment=Generates a basic KDE DCOP server. This is an ideal starting point for a DCOP server that does not require a GUI interface.
+Comment[ca]=Genera un servidor bàsic DCOP per al KDE. Aquest és un idoni punt de partida per a un servidor DCOP que no requereixi d'una IGU.
+Comment[da]=Genererer en basal KDE DCOP-server. Dette er et ideelt startpunkt for en DCOP-server der ikke kræver en GUI-grænseflade.
+Comment[de]=Erstellt einen einfachen KDE-DCOP-Server. Dies ist ein idealer Ausgangspunkt für einen DCOP-Server, der keine Benutzeroberfläche erfordert.
+Comment[el]=ΔημιουÏγεί ένα βασικό εξυπηÏετητή KDE DCOP. Αυτό είναι ένα ιδανικό σημείο αÏχής για έναν εξυπηÏετητή DCOP ο οποίος δε χÏειάζεται ένα γÏαφικό πεÏιβάλλον.
+Comment[es]=Genera un servidor básico DCOP para KDE. Es un punto de comienzo ideal para un servidor DCOP que no requiera una interfaz gráfica.
+Comment[et]=Lihtsa KDE DCOP-serveri loomine. See on ideaalne algus DCOP-serverile, mis ei eelda graafilist kasutajaliidest.
+Comment[eu]=DCOP zerbitzari sinple bat sortzen du. Hau GUI interfazerik behar ez duen DCOP zerbitzari baterako hasierako puntu aparta da.
+Comment[fa]=یک کارساز پایۀ KDE DCOP تولید می‌کند. این یک نقطۀ شروع دلخواه برای یک کارساز DCOP است، که نیازی به یک واسط ونک ندارد.
+Comment[fr]=Génère un serveur DCOP KDE de base. C'est un bon point de départ pour un serveur DCOP qui ne requiert pas d'interface graphique.
+Comment[gl]=Xera un servidor básico DCOP para KDE. Este é un punto de comezo ideal para un servidor DCOP que non require unha interface GUI.
+Comment[hu]=Létrehoz egy egyszerű KDE DCOP-os kiszolgálót. Jó kiindulópont grafikus felület nélküli DCOP-kiszolgáló készítéséhez.
+Comment[it]=Genera un semplice server DCOP per KDE. È un punto di partenza ideale per un server DCOP che non richiede un'interfaccia GUI.
+Comment[ja]=基本的㪠KDE DCOP サーãƒã‚’作æˆã—ã¾ã™ã€‚GUI ã‚’å¿…è¦ã¨ã—ãªã„ DCOP サーãƒã®ç†æƒ³çš„ãªé–‹å§‹ç‚¹ã§ã™ã€‚
+Comment[nds]=Stellt en eenfach DCOP-Server op. Dat is en goot Anfang för en DCOP-Server ahn Böversiet.
+Comment[ne]=आधारभूत KDE DCOP सरà¥à¤­à¤° उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । यो DCOP सरà¥à¤­à¤°à¤•à¤¾ लागि उपयà¥à¤•à¥à¤¤ सà¥à¤°à¥à¤†à¤¤ बिनà¥à¤¦à¥ हो जसलाई जी यू आई इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸ आवशà¥à¤¯à¤• परà¥à¤¦à¥ˆà¤¨ ।
+Comment[nl]=Genereert een basis KDE DCOP-server. Dit is een ideaal startpunt voor een DCOP-server die geen GUI-interface vereist.
+Comment[pl]=Generuje prosty serwer KDE DCOP. Dobry punkt startu dla serwera DCOP, który nie potrzebuje interfejsu graficznego.
+Comment[pt]=Gera um servidor básico de DCOP para o KDE. Este é um ponto de partida ideal para um servidor de DCOP que não necessite de uma interface gráfica.
+Comment[pt_BR]=Gera um servidor básico de DCOP para o KDE. Este é um ponto de partida ideal para um servidor de DCOP que não necessite de uma interface gráfica.
+Comment[ru]=Создание проÑтого Ñервера DCOP. Ð˜Ð´ÐµÐ°Ð»ÑŒÐ½Ð°Ñ ÑÑ‚Ð°Ñ€Ñ‚Ð¾Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ Ñервера DCOP без графичеÑкого интерфейÑа.
+Comment[sk]=Vygeneruje základný KDE DCOP server. Toto je ideálny štartovací bod pre DCOP server, ktorý nepotrebuje GUI rozhranie.
+Comment[sl]=Ustvari osnovni strežnik DCOP za KDE. To je idealno zaÄetno mesto za strežnik DCOP, ki ne potrebuje grafiÄnega vmesnika.
+Comment[sr]=Прави оÑнован KDE DCOP Ñервер. Ово је идеална почетна тачка за DCOP Ñервер који не захтева GUI.
+Comment[sr@Latn]=Pravi osnovan KDE DCOP server. Ovo je idealna poÄetna taÄka za DCOP server koji ne zahteva GUI.
+Comment[sv]=Skapar en grundläggande KDE DCOP-server. Detta är en idealisk utgångspunkt för en DCOP-server som inte kräver ett grafiskt användargränssnitt.
+Comment[tr]=Basit bir KDE DCOP sunucusu yaratır. Bu grafik arayüz gerektirmeyen bir DCOP sunucusuna başlamak için uygun bir noktadır.
+Comment[zh_CN]=生æˆç®€å•çš„ KDE DCOP æœåŠ¡å™¨ã€‚这是ä¸éœ€è¦å›¾å½¢ç•Œé¢çš„ DCOP æœåŠ¡å™¨çš„良好开端。
+Comment[zh_TW]=產生一個基本的 KDE DCOP 伺æœå™¨ã€‚這個是開發一個ä¸éœ€ä½¿ç”¨è€…介é¢çš„ DCOP 伺æœå™¨çš„一個好起點。
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/main.cpp
+Archive=kdedcop.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE13]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE14]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE16]
+Type=install
+Source=%{src}/app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE17]
+Type=install
+Source=%{src}/mainclass.cpp
+Dest=%{dest}/src/mainclass.cpp
+
+[FILE18]
+Type=install
+Source=%{src}/mainclass.h
+Dest=%{dest}/src/mainclass.h
+
+[FILE19]
+Type=install
+Source=%{src}/app_iface.h
+Dest=%{dest}/src/%{APPNAMELC}_iface.h
+
+[FILE20]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[MSG]
+Type=message
+Comment=A simple DCOP server was created in %{dest}
+Comment[ca]=Un simple servidor DCOP ha estat creat en %{dest}
+Comment[da]=En simpel DCOP-server blev oprettet i %{dest}
+Comment[de]=Ein einfacher DCOP-Server wurde in %{dest} erstellt.
+Comment[el]=Ένας απλός εξυπηÏετητής DCOP δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo servidor DCOP ha sido creado en %{dest}
+Comment[et]=Lihtne DCOP-server loodi asukohta %{dest}
+Comment[eu]=DCOP zerbitzari sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک کارساز سادۀ DCOP در %{dest} ایجاد شد
+Comment[fr]=Un serveur DCOP simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh freastalaí simplí DCOP i %{dest}
+Comment[gl]=Creouse un servidor DCOP sinxelo en %{dest}
+Comment[hu]=Létrejött egy egyszerű DCOP-kiszolgáló itt: %{dest}
+Comment[it]=È stato creato un semplice server DCOP in %{dest}
+Comment[ja]=ç°¡å˜ãª DCOP サーãƒã‚’ %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach DCOP-Server opstellt
+Comment[ne]=साधारण DCOP सरà¥à¤­à¤° %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudige DCOP-server is aangemaakt in %{dest}
+Comment[pl]=Prosty serwer DCOP został utworzony w %{dest}
+Comment[pt]=Foi criado um servidor de DCOP simples em %{dest}
+Comment[pt_BR]=Foi criado um servidor de DCOP simples em %{dest}
+Comment[ru]=ПроÑтой Ñервер DCOP Ñоздан в %{dest}
+Comment[sk]=Jednoduchý DCOP server bol vytvorený v %{dest}
+Comment[sl]=Preprost strežnik DCOP je bil ustvarjen v %{dest}
+Comment[sr]=ЈедноÑтаван DCOP Ñервер направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan DCOP server napravljen je u %{dest}
+Comment[sv]=En enkel DCOP-server skapades i %{dest}
+Comment[tr]=Basit bir DCOP sunucusu %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了简å•çš„ DCOP æœåŠ¡å™¨
+Comment[zh_TW]=一個簡單的 DCOP 伺æœå™¨å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kdedcop/kdedcop.png b/languages/cpp/app_templates/kdedcop/kdedcop.png
new file mode 100644
index 00000000..1d25362b
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/kdedcop.png
Binary files differ
diff --git a/languages/cpp/app_templates/kdedcop/main.cpp b/languages/cpp/app_templates/kdedcop/main.cpp
new file mode 100644
index 00000000..5bfcf8ae
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/main.cpp
@@ -0,0 +1,52 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static const char description[] =
+ I18N_NOOP("A KDE KPart Application");
+
+static const char version[] = "0.1";
+
+static KCmdLineOptions options[] =
+{
+// { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", 0, 0, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions( options );
+ KApplication app;
+ %{APPNAME} *mainWin = 0;
+
+ if (app.isRestored())
+ {
+ RESTORE(%{APPNAME});
+ }
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ /// @todo do something with the command line args here
+
+ mainWin = new %{APPNAME}();
+ app.setMainWidget( mainWin );
+ mainWin->show();
+
+ args->clear();
+ }
+
+ int ret = app.exec();
+
+ delete mainWin;
+ return ret;
+}
diff --git a/languages/cpp/app_templates/kdedcop/mainclass.cpp b/languages/cpp/app_templates/kdedcop/mainclass.cpp
new file mode 100644
index 00000000..8f334114
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/mainclass.cpp
@@ -0,0 +1,31 @@
+%{CPP_TEMPLATE}
+
+#include "mainclass.h"
+
+
+MainClass::MainClass()
+ : DCOPDemoIface(),
+ DCOPObject("mainclass"), /* this is the object name DCOP will expose */
+ m_intValue(0)
+{
+}
+
+MainClass::~MainClass()
+{
+}
+
+void MainClass::setStrVal(const QString & str) {
+ m_strValue = str;
+}
+
+void MainClass::setIntVal(int val) {
+ m_intValue = val;
+}
+
+QString MainClass::strVal() const {
+ return m_strValue;
+}
+
+int MainClass::intVal() const {
+ return m_intValue;
+}
diff --git a/languages/cpp/app_templates/kdedcop/mainclass.h b/languages/cpp/app_templates/kdedcop/mainclass.h
new file mode 100644
index 00000000..ca37f2ad
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/mainclass.h
@@ -0,0 +1,32 @@
+%{H_TEMPLATE}
+
+#ifndef MAINCLASS_H
+#define MAINCLASS_H
+
+#include "%{APPNAMELC}_iface.h"
+
+/**
+ *
+ * @author %{AUTHOR}
+ **/
+class MainClass : virtual public DCOPDemoIface
+{
+public:
+ MainClass();
+
+ ~MainClass();
+
+
+ // Here is the implementation of the example DCOP interface methods.
+ virtual void setStrVal(const QString &);
+ virtual void setIntVal(int);
+ virtual QString strVal() const;
+ virtual int intVal() const;
+
+private:
+ QString m_strValue;
+ int m_intValue;
+
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kdedcop/src-Makefile.am b/languages/cpp/app_templates/kdedcop/src-Makefile.am
new file mode 100644
index 00000000..dc26ec93
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/src-Makefile.am
@@ -0,0 +1,23 @@
+## Makefile.am for %{APPNAMELC}
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = %{APPNAMELC}.h
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
+
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# the application source, library search path, and link libraries
+%{APPNAMELC}_SOURCES = main.cpp %{APPNAMELC}.cpp %{APPNAMELC}_iface.skel mainclass.cpp
+%{APPNAMELC}_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+%{APPNAMELC}_LDADD = $(LIB_KDEUI)
diff --git a/languages/cpp/app_templates/kdedcop/subdirs b/languages/cpp/app_templates/kdedcop/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kdedcop/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kdevlang/.kdev_ignore b/languages/cpp/app_templates/kdevlang/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/.kdev_ignore
diff --git a/languages/cpp/app_templates/kdevlang/Makefile.am b/languages/cpp/app_templates/kdevlang/Makefile.am
new file mode 100644
index 00000000..972dd511
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = src-Makefile.am kdevlang_part.cpp kdevlang_part.h kdevlang.rc \
+ kdevlang.desktop app.kdevelop kdevlang-configure.in.in README.dox
+templateName = kdevlang
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kdevlang/README.dox b/languages/cpp/app_templates/kdevlang/README.dox
new file mode 100644
index 00000000..86968add
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/README.dox
@@ -0,0 +1,55 @@
+/** \class %{APPNAME}
+Put a brief description here, the brief description ends at the first dot.
+Put a more detailed description of your part in these lines. It can span
+over several lines. You can even use some html commands in these lines like:
+<code>This is code</code>, html links <a href="http://somelocation">link text</a>,
+and images.
+
+\authors <a href="mailto:%{EMAIL}">%{AUTHOR}</a>
+\authors <a href="mailto:2nd author AT provider.com">2nd author full name</a>
+...
+\authors <a href="mailto:nth author AT provider.com">nth author full name</a>
+
+\maintainer <a href="mailto:%{EMAIL}">%{AUTHOR}</a>
+\maintainer <a href="mailto:2nd maintainer AT provider.com">2nd maintainer full name</a>
+...
+\maintainer <a href="mailto:nth maintainer AT provider.com">nth maintainer full name</a>
+
+\feature Describe the first feature
+\feature Describe the second feature
+...
+\feature Describe the last feature
+
+\bug bugs in <a href="http://bugs.kde.org/buglist.cgi?product=kdevelop&component=YOUR_COMPONENT_NAME&
+bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=Bug+Number">
+YOUR_COMPONENT_NAME at Bugzilla database</a>
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/cpp/app_templates/kdevlang/app.kdevelop b/languages/cpp/app_templates/kdevlang/app.kdevelop
new file mode 100644
index 00000000..7a0e573b
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/app.kdevelop
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>KDevelop</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kdevlang/kdevlang-configure.in.in b/languages/cpp/app_templates/kdevlang/kdevlang-configure.in.in
new file mode 100644
index 00000000..78ed2275
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/kdevlang-configure.in.in
@@ -0,0 +1,10 @@
+#MIN_CONFIG(3.0.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+KDE_CHECK_HEADERS([kdevelop/kdevcore.h])
+KDE_CHECK_LIB([kdevelop],main,
+ [LIBKDEVELOP="-lkdevelop"])
+AC_SUBST(LIBKDEVELOP)
diff --git a/languages/cpp/app_templates/kdevlang/kdevlang.desktop b/languages/cpp/app_templates/kdevlang/kdevlang.desktop
new file mode 100644
index 00000000..d8f320a3
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/kdevlang.desktop
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=%{APPNAME}
+Comment[pt]=%{APPNAME$}
+Name=KDev%{APPNAME}
+Name[nds]=KDev%{ProgNaam}
+Name[sv]=KDevelop %{APPNAME}
+Name[ta]=கெடெவà¯%{APPNAME}
+Icon=kdevelop
+ServiceTypes=KDevelop/LanguageSupport
+X-KDevelop-Language=ChangeMe
+X-KDE-Library=libkdev%{APPNAMELC}
+X-KDevelop-Version=3
diff --git a/languages/cpp/app_templates/kdevlang/kdevlang.kdevtemplate b/languages/cpp/app_templates/kdevlang/kdevlang.kdevtemplate
new file mode 100644
index 00000000..c3ad93bf
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/kdevlang.kdevtemplate
@@ -0,0 +1,157 @@
+# KDE Config File
+[General]
+Name=KDevelop Language Support Plugin (Standalone build)
+Name[ca]=Connector per al suport de llenguatge a KDevelop (de construcció aïllada)
+Name[da]=KDevelop plugin for sprogstøttet (alenestående bygning)
+Name[de]=KDevelop-Modul für Sprachunterstützung (Unabhängige Erstellung)
+Name[el]=ΠÏόσθετο υποστήÏιξης γλώσσας του KDevelop (αυτόνομη κατασκευή)
+Name[es]=Complemento de implementación de lenguaje para KDevelop (construcción independiente)
+Name[et]=KDevelopi keeletoetuse plugin (autonoomne)
+Name[eu]=KDevelop-en lengoaien euskarrien interfazea (eraikuntza autonomoak)
+Name[fa]=وصلۀ پشتیبانی زبان KDevelop )ساخت خوداتکا(
+Name[fr]=Module externe de prise en charge de langage de KDevelop (construction autonome)
+Name[ga]=Breiseán Tacaíochta Teanga le haghaidh KDevelop (Tógáil Shaorsheasaimh)
+Name[gl]=Extensión de soporte de linguaxes para KDevelop (compilación independente)
+Name[hu]=KDevelop nyelvtámogató modul (önálló)
+Name[it]=Plugin di supporto per linguaggio di KDevelop (compilazione indipendente)
+Name[ja]=KDevelop 言語サãƒãƒ¼ãƒˆãƒ—ラグイン (スタンダローンビルド)
+Name[nds]=KDevelop-Moduul för Spraakünnerstütten (Enkelprogramm)
+Name[ne]=केडीई विकास भाषा समरà¥à¤¥à¤¨ पà¥à¤²à¤—इन (सà¥à¤Ÿà¥à¤¯à¤¾à¤¨à¥à¤¡à¤…लोन निरà¥à¤®à¤¾à¤£)
+Name[nl]=KDEvelop Taalondersteuning Plugin (Standalone build)
+Name[pl]=Wtyczka KDevelopa do obsługi języka (budowana oddzielnie)
+Name[pt]='Plugin' de Suporte a Linguagens do KDevelop (compilação autónoma)
+Name[pt_BR]='Plugin' de Suporte a Linguagens do KDevelop (compilação autónoma)
+Name[ru]=Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñзыковой поддержки Ð´Ð»Ñ KDevelop (внешний)
+Name[sk]=KDevelop modul pre jazykovú podporu (samostatný build)
+Name[sl]=Vstavek jezikovne podpore za KDevelop (samostojna izgradnja)
+Name[sr]=KDevelop-ов Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð·Ð° језичку подршку (ÑамоÑтална градња)
+Name[sr@Latn]=KDevelop-ov interfejs za jeziÄku podrÅ¡ku (samostalna gradnja)
+Name[sv]=KDevelop-insticksprogram för språkstöd (att bygga fristående)
+Name[tr]=KDevelop Dil Desteği Eklentisi (Kendi başına çalışabilen kurulum)
+Name[zh_CN]=KDevelop 语言支æŒæ’件(独立编译)
+Name[zh_TW]=KDevelop 語言支æ´å¤–掛程å¼ï¼ˆå–®ç¨å»ºç«‹ï¼‰
+Category=C++/KDevelop/
+Comment=This generates a language support plugin for KDevelop, to be built outside of the KDevelop source tree.
+Comment[ca]=Genera un connector per al suport de llenguatge a KDevelop, per a que es construeixi fora de l'arbre de fonts de KDevelop.
+Comment[da]=Dette genererer en sprogstøtte-plugin for KDevelop, der skal bygges udenfor KDevelop's kildetræ.
+Comment[de]=Hiermit wird ein Sprachunterstützungsmodul für KDevelop generiert, das außerhalb des Quelltextbaumes von KDevelop erstellt wird.
+Comment[el]=Αυτό δημιουÏγεί ένα Ï€Ïόσθετο υποστήÏιξης γλώσσας για το KDevelop, για την κατασκευή του έξω από το δέντÏο πηγαίου κώδικα του KDevelop.
+Comment[es]=Genera un complemento de implementación de lenguaje para KDevelop, para ser construido fuera del árbol de código fuente de KDevelop.
+Comment[et]=KDevelopi keeletoetuse plugina loomine, mida saab ehitada väljaspool KDevelopi lähtekoodipuud.
+Comment[eu]=Honek KDevelop-en lengoai-euskarrirako plugin bat sortzen du, KDevelop-en iturburu zuhaitzetik at eraikitzeko.
+Comment[fa]=یک وصلۀ پشتیبان برای KDevelop تولید می‌کند، تا در بیرون درخت منبع KDevelop ساخته شود.
+Comment[fr]=Génère un module externe de prise en charge de langage pour KDevelop, à construire en dehors de l'arborescence des sources de KDevelop.
+Comment[gl]=Isto xera unha extensión de soporte de linguaxes para KDevelop que se compilará fóra da árbore de código de KDevelop.
+Comment[hu]=Létrehoz egy nyelvtámogató modult a KDevelophoz, mely a KDevelopos forráskönyvtáron kívül fordítható le.
+Comment[it]=Genera un plugin di supporto per linguaggio per KDevelop, deve essere compilato fuori dell'albero sorgente di KDevelop.
+Comment[nds]=Dit stellt en Spraakünnerstütten-Moduul för KDevelop op, dat buten den KDevelop-Bornboom kompileert warrt.
+Comment[ne]=यसले केडीई विकासका लागि केडीई विकास सà¥à¤°à¥‹à¤¤ टà¥à¤°à¥€à¤•à¥‹ बाहिर निरà¥à¤®à¤¾à¤£ गरà¥à¤¨, भाषा समरà¥à¤¥à¤¨ पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Dit genereert een taalondersteuningsplugin voor KDEvelop, welke buiten de KDevelop sourcetree wordt gebouwd.
+Comment[pl]=Generuje wtyczkę do obsługi języka w KDevelopie. Wtyczka jest budowana poza drzewem źródłowym KDevelopa.
+Comment[pt]=Isto gera um 'plugin' de suporte de linguagens para o KDevelop, que possa ser compilado fora da árvore de código do KDevelop.
+Comment[pt_BR]=Isto gera um 'plugin' de suporte de linguagens para o KDevelop, que possa ser compilado fora da árvore de código do KDevelop.
+Comment[ru]=Создание интерфейÑа Ñзыковой поддержки Ð´Ð»Ñ KDevelop Ñо Ñборкой вне иÑходного кода KDevelop.
+Comment[sk]=Vygeneruje modul pre jazykovú podporu pre KDevelop, tak aby ho bolo možné kompilovať mimo zdrojového stromu KDevelop.
+Comment[sr]=Ово прави прикључак за језичку подршку за KDevelop, који Ñе гради ван KDevelop-овог изворног Ñтабла.
+Comment[sr@Latn]=Ovo pravi prikljuÄak za jeziÄku podrÅ¡ku za KDevelop, koji se gradi van KDevelop-ovog izvornog stabla.
+Comment[sv]=Detta skapar ett KDevelop-insticksprogram för språkstöd, att bygga utanför KDevelops källkodsträd.
+Comment[tr]=Bu KDevelop için, KDevelop kaynak ağacının dışında olacak, bir dil desteği eklentisi yaratır.
+Comment[zh_CN]=è¿™å°†ç”Ÿæˆ KDevelop 的语言支æŒæ’件,å¯ä»¥åœ¨ KDevelop æºä»£ç æ ‘之外编译。
+Comment[zh_TW]=產生一個 KDevelop 語言支æ´å¤–掛程å¼ï¼Œå»ºç«‹åœ¨ KDevelop 程å¼æºç¢¼æ¨¹ä¹‹å¤–。
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}_part.cpp
+Archive=kdevlang.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE5]
+Type=install
+Source=%{src}/kdevlang-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE6]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{src}/kdevlang_part.cpp
+Dest=%{dest}/src/%{APPNAMELC}_part.cpp
+
+[FILE8]
+Type=install
+Source=%{src}/kdevlang_part.h
+Dest=%{dest}/src/%{APPNAMELC}_part.h
+
+[FILE9]
+Type=install
+EscapeXML=true
+Source=%{src}/kdevlang.rc
+Dest=%{dest}/src/kdev%{APPNAMELC}.rc
+
+[FILE10]
+Type=install
+Source=%{src}/kdevlang.desktop
+Dest=%{dest}/src/kdev%{APPNAMELC}.desktop
+
+[FILE11]
+Type=install
+Source=%{src}/README.dox
+Dest=%{dest}/src/README.dox
+
+[MSG]
+Type=message
+Comment=A language plugin for KDevelop for standalone build was created in %{dest}
+Comment[ca]=Un connector per a llenguatge a KDevelop i de construcció aïllada ha estat creat en %{dest}
+Comment[da]=Et sprog-plugin for KDevelop for alenestående bygning blev oprettet i %{dest}
+Comment[de]=Ein Sprachunterstützungsmodul für KDevelop (unabhängige Erstellung) wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο γλώσσας για το KDevelop για αυτόνομη κατασκευή δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento de lenguaje para KDevelop de construcción independiente ha sido creado en %{dest}
+Comment[et]=KDevelopi autonoomne keeleplugin loodi asukohta %{dest}
+Comment[eu]=KDevelop-en hizkuntza plugin autonomo bat sortu da hemen: %{dest}
+Comment[fa]=یک وصلۀ زبان برای KDevelop جهت ساخت خوداتکا در %{dest} ایجاد شد
+Comment[fr]=Un module externe de langage pour KDevelop à construire de façon autonome a été créé dans %{dest}
+Comment[gl]=Creouse unha extensión de linguaxe para KDevelop a compilar de forma independente en %{dest}
+Comment[hu]=Létrejött egy KDevelopos nyelvtámogató modul (önálló lefordításra) itt: %{dest}
+Comment[it]=È stato creato un plugin di linguaggio per KDevelop per compilazione indipendente %{dest}
+Comment[nds]=In %{dest} wöör en Spraakünnerstütten-Moduul för KDevelop (Enkelprogramm) opstellt
+Comment[ne]=सà¥à¤Ÿà¥à¤¯à¤¾à¤¨à¥à¤¡à¤…लोन निरà¥à¤®à¤¾à¤£ गरà¥à¤¨ केडीई विकासका लागि भाषा पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een taalplugin voor KDevelop voor standalone build is aangemaakt in %{dest}
+Comment[pl]=Wtyczka języka dla KDevelopa do budowy oddzielnie została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' de linguagens de compilação autónoma para o KDevelop em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' de linguagens de compilação autónoma para o KDevelop em %{dest}
+Comment[ru]=Внешний Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñзыковой поддержки Ð´Ð»Ñ KDevelop Ñоздан в %{dest}
+Comment[sk]=Modul pre jazykovú podporu pre KDevelop bol vutvorený v %{dest}
+Comment[sr]=Језички прикључак за KDevelop за ÑамоÑталну градњу направљен је у %{dest}
+Comment[sr@Latn]=JeziÄki prikljuÄak za KDevelop za samostalnu gradnju napravljen je u %{dest}
+Comment[sv]=Ett KDevelop-insticksprogram för språkstöd att bygga fristående skapades i %{dest}
+Comment[tr]=Kendi başına çalışabilen bir KDevelop dil eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个独立编译的 KDevelop 语言æ’件
+Comment[zh_TW]=一個單ç¨å»ºç«‹çš„ KDevelop 語言外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kdevlang/kdevlang.png b/languages/cpp/app_templates/kdevlang/kdevlang.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/kdevlang.png
Binary files differ
diff --git a/languages/cpp/app_templates/kdevlang/kdevlang.rc b/languages/cpp/app_templates/kdevlang/kdevlang.rc
new file mode 100644
index 00000000..b4e153fa
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/kdevlang.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevBashSupport" version="1">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_execute" />
+ </Menu>
+</MenuBar>
+<ToolBar name="mainToolBar">
+ <Action name="build_execute" group="build_operations" />
+</ToolBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kdevlang/kdevlang_part.cpp b/languages/cpp/app_templates/kdevlang/kdevlang_part.cpp
new file mode 100644
index 00000000..9d5cadcf
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/kdevlang_part.cpp
@@ -0,0 +1,154 @@
+%{CPP_TEMPLATE}
+
+#include <qwhatsthis.h>
+#include <qtimer.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+#include <kdevcore.h>
+#include <kdevpartcontroller.h>
+#include <kdevplugininfo.h>
+#include <kdevproject.h>
+#include <kaction.h>
+#include <kdebug.h>
+#include <kapplication.h>
+
+//#include "%{APPNAMELC}_widget.h"
+#include "%{APPNAMELC}_part.h"
+
+typedef KGenericFactory<%{APPNAME}Part> %{APPNAME}Factory;
+K_EXPORT_COMPONENT_FACTORY( libkdev%{APPNAMELC}, %{APPNAME}Factory( "kdev%{APPNAMELC}" ) );
+static const KDevPluginInfo data("kdev%{APPNAMELC}");
+
+%{APPNAME}Part::%{APPNAME}Part(QObject *parent, const char *name, const QStringList& )
+: KDevLanguageSupport(&data, parent, name ? name : "%{APPNAME}Part" )
+{
+ setInstance(%{APPNAME}Factory::instance());
+ setXMLFile("kdevlang_%{APPNAMELC}.rc");
+
+
+ m_build = new KAction( i18n("&Run"), "exec",Key_F9,this, SLOT(slotRun()),actionCollection(), "build_execute" );
+
+ kdDebug() << "Creating %{APPNAMELC} Part" << endl;
+
+ connect( core(), SIGNAL(projectConfigWidget(KDialogBase*)),
+ this, SLOT(projectConfigWidget(KDialogBase*)) );
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)), this, SLOT(savedFile(const KURL&)) );
+ connect(partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part *)));
+}
+
+
+%{APPNAME}Part::~%{APPNAME}Part()
+{
+ delete m_build;
+}
+
+KDevLanguageSupport::Features %{APPNAME}Part::features()
+{
+ return Features(Variables | Functions);
+}
+KMimeType::List %{APPNAME}Part::mimeTypes()
+{
+ KMimeType::List list;
+
+ KMimeType::Ptr mime = KMimeType::mimeType( "application/x-shellscript" );
+ if( mime )
+ list << mime;
+
+ return list;
+}
+void %{APPNAME}Part::slotRun()
+{
+ // Execute the application here.
+}
+void %{APPNAME}Part::projectConfigWidget(KDialogBase *dlg)
+{
+ Q_UNUSED( dlg );
+ // Create your config dialog here.
+}
+void %{APPNAME}Part::projectOpened()
+{
+ kdDebug(9014) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(0, this, SLOT(parse()));
+}
+void %{APPNAME}Part::projectClosed()
+{
+
+}
+void %{APPNAME}Part::savedFile(const KURL &fileName)
+{
+
+
+ if (project()->allFiles().contains(fileName.path().mid ( project()->projectDirectory().length() + 1 )))
+ {
+ kdDebug(9014) << "parse file " << fileName.path() << endl;
+ emit addedSourceInfo( fileName.path() );
+ }
+}
+void %{APPNAME}Part::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug(9014) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ kdDebug(9014) << "maybe parse " << project()->projectDirectory() + "/" + ( *it ) << endl;
+ }
+
+ emit updatedSourceInfo();
+}
+void %{APPNAME}Part::removedFilesFromProject(const QStringList &fileList)
+{
+
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ if( codeModel()->hasFile(fileName) )
+ {
+ kdDebug(9014) << "removed " << fileName << endl;
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+ }
+
+}
+void %{APPNAME}Part::parse()
+{
+ kdDebug(9014) << "initialParse()" << endl;
+
+ if (project())
+ {
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it)
+ {
+ kdDebug(9014) << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+ }
+ emit updatedSourceInfo();
+ kapp->restoreOverrideCursor();
+ } else {
+ kdDebug(9014) << "No project" << endl;
+ }
+}
+void %{APPNAME}Part::slotActivePartChanged(KParts::Part *part)
+{
+ kdDebug() << "Changeing active part..." << endl;
+}
+
+#include "%{APPNAMELC}_part.moc"
diff --git a/languages/cpp/app_templates/kdevlang/kdevlang_part.h b/languages/cpp/app_templates/kdevlang/kdevlang_part.h
new file mode 100644
index 00000000..25721d64
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/kdevlang_part.h
@@ -0,0 +1,43 @@
+%{H_TEMPLATE}
+
+#ifndef __KDEVPART_%{APPNAMEUC}_H__
+#define __KDEVPART_%{APPNAMEUC}_H__
+
+
+#include <kdevplugin.h>
+#include <codemodel.h>
+#include <kdevlanguagesupport.h>
+#include <qstringlist.h>
+#include <kdialogbase.h>
+
+class KAction;
+
+/*
+ Please read the README.dox file for more info about this part
+ */
+class %{APPNAME}Part : public KDevLanguageSupport
+{
+ Q_OBJECT
+ public:
+ %{APPNAME}Part(QObject *parent, const char *name, const QStringList &);
+ ~%{APPNAME}Part();
+ protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+ private slots:
+ void slotRun();
+ void projectConfigWidget(KDialogBase *dlg);
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void parse();
+ void slotActivePartChanged(KParts::Part *part);
+ private:
+ KAction *m_build;
+};
+
+
+#endif
diff --git a/languages/cpp/app_templates/kdevlang/src-Makefile.am b/languages/cpp/app_templates/kdevlang/src-Makefile.am
new file mode 100644
index 00000000..325352ad
--- /dev/null
+++ b/languages/cpp/app_templates/kdevlang/src-Makefile.am
@@ -0,0 +1,14 @@
+AM_CPPFLAGS = -I$(kde_includes)/kdevelop/interfaces -I$(kde_includes)/kdevelop/util -I$(kde_includes)/kinterfacedesigner $(all_includes)
+
+kde_module_LTLIBRARIES = libkdev%{APPNAMELC}.la
+libkdev%{APPNAMELC}_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdev%{APPNAMELC}_la_LIBADD = -lkdevelop
+libkdev%{APPNAMELC}_la_SOURCES = %{APPNAMELC}_part.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdev%{APPNAMELC}.desktop
+
+rcdir = $(kde_datadir)/kdev%{APPNAMELC}
+rc_DATA = kdev%{APPNAMELC}.rc
diff --git a/languages/cpp/app_templates/kdevpart/.kdev_ignore b/languages/cpp/app_templates/kdevpart/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/.kdev_ignore
diff --git a/languages/cpp/app_templates/kdevpart/Makefile.am b/languages/cpp/app_templates/kdevpart/Makefile.am
new file mode 100644
index 00000000..d1541685
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = src-Makefile.am kdevpart_part.cpp kdevpart_part.h \
+ kdevpart_widget.h kdevpart_widget.cpp kdevpart_part.rc \
+ kdevpart.desktop app.kdevelop README.dox globalconfigbase.ui globalconfig.h \
+ globalconfig.cpp projectconfigbase.ui projectconfig.h projectconfig.cpp
+templateName = kdevpart
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kdevpart/README.dox b/languages/cpp/app_templates/kdevpart/README.dox
new file mode 100644
index 00000000..86968add
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/README.dox
@@ -0,0 +1,55 @@
+/** \class %{APPNAME}
+Put a brief description here, the brief description ends at the first dot.
+Put a more detailed description of your part in these lines. It can span
+over several lines. You can even use some html commands in these lines like:
+<code>This is code</code>, html links <a href="http://somelocation">link text</a>,
+and images.
+
+\authors <a href="mailto:%{EMAIL}">%{AUTHOR}</a>
+\authors <a href="mailto:2nd author AT provider.com">2nd author full name</a>
+...
+\authors <a href="mailto:nth author AT provider.com">nth author full name</a>
+
+\maintainer <a href="mailto:%{EMAIL}">%{AUTHOR}</a>
+\maintainer <a href="mailto:2nd maintainer AT provider.com">2nd maintainer full name</a>
+...
+\maintainer <a href="mailto:nth maintainer AT provider.com">nth maintainer full name</a>
+
+\feature Describe the first feature
+\feature Describe the second feature
+...
+\feature Describe the last feature
+
+\bug bugs in <a href="http://bugs.kde.org/buglist.cgi?product=kdevelop&component=YOUR_COMPONENT_NAME&
+bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=Bug+Number">
+YOUR_COMPONENT_NAME at Bugzilla database</a>
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/cpp/app_templates/kdevpart/app.kdevelop b/languages/cpp/app_templates/kdevpart/app.kdevelop
new file mode 100644
index 00000000..29beaf21
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/app.kdevelop
@@ -0,0 +1,116 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>KDevelop</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+</kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kdevpart/globalconfig.cpp b/languages/cpp/app_templates/kdevpart/globalconfig.cpp
new file mode 100644
index 00000000..12396fec
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/globalconfig.cpp
@@ -0,0 +1,15 @@
+%{CPP_TEMPLATE}
+#include "%{APPNAMELC}globalconfig.h"
+
+#include "%{APPNAMELC}part.h"
+
+%{APPNAME}GlobalConfig::%{APPNAME}GlobalConfig(%{APPNAME}Part *part, QWidget *parent, const char *name)
+ : %{APPNAME}GlobalConfigBase(parent, name), m_part(part)
+{
+}
+
+void %{APPNAME}GlobalConfig::accept()
+{
+}
+
+#include "%{APPNAMELC}globalconfig.moc"
diff --git a/languages/cpp/app_templates/kdevpart/globalconfig.h b/languages/cpp/app_templates/kdevpart/globalconfig.h
new file mode 100644
index 00000000..1b321cd2
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/globalconfig.h
@@ -0,0 +1,22 @@
+%{H_TEMPLATE}
+#ifndef %{APPNAMEUC}_GLOBAL_CONFIG_H
+#define %{APPNAMEUC}_GLOBAL_CONFIG_H
+
+#include "%{APPNAMELC}globalconfigbase.h"
+
+class %{APPNAME}Part;
+
+class %{APPNAME}GlobalConfig: public %{APPNAME}GlobalConfigBase
+{
+ Q_OBJECT
+public:
+ %{APPNAME}GlobalConfig(%{APPNAME}Part *part, QWidget *parent = 0, const char *name = 0);
+
+public slots:
+ void accept();
+
+private:
+ %{APPNAME}Part *m_part;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kdevpart/globalconfigbase.ui b/languages/cpp/app_templates/kdevpart/globalconfigbase.ui
new file mode 100644
index 00000000..c16bd90d
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/globalconfigbase.ui
@@ -0,0 +1,20 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>%{APPNAME}GlobalConfigBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>%{APPNAME}GlobalConfigBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>%{APPNAME}</string>
+ </property>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kdevpart/kdevpart.desktop b/languages/cpp/app_templates/kdevpart/kdevpart.desktop
new file mode 100644
index 00000000..eb61eef9
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/kdevpart.desktop
@@ -0,0 +1,83 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Name=KDev%{APPNAME}
+Name[nds]=KDev%{ProgNaam}
+Name[sv]=KDevelop %{APPNAME}
+Name[ta]=கெடெவà¯%{APPNAME}
+GenericName=%{APPNAME} Plugin
+GenericName[br]=Lugent %{APPNAME}
+GenericName[ca]=Connector per a %{APPNAME}
+GenericName[da]=%{APPNAME} plugin
+GenericName[de]=%{APPNAME}-Modul
+GenericName[el]=ΠÏόσθετο %{APPNAME}
+GenericName[es]=Complemento %{APPNAME}
+GenericName[et]=%{APPNAME} plugin
+GenericName[eu]=%{APPNAME} plugina
+GenericName[fa]=وصلۀ %{APPNAME}
+GenericName[fr]=Module externe pour %{APPNAME}
+GenericName[ga]=Breiseán %{APPNAME}
+GenericName[gl]=Extensión %{APPNAME}
+GenericName[hu]=%{APPNAME}-bővítőmodul
+GenericName[it]=Plugin %{APPNAME}
+GenericName[ja]=%{APPNAME} プラグイン
+GenericName[nds]=%{APPNAME}-Moduul
+GenericName[ne]=%{APPNAME} पà¥à¤²à¤—इन
+GenericName[nl]=%{APPNAME}-plugin
+GenericName[pl]=Wtyczka %{APPNAME}
+GenericName[pt]='Plugin' %{APPNAME}
+GenericName[pt_BR]=Plug-in do %{APPNAME}
+GenericName[ru]=Модуль %{APPNAME}
+GenericName[sk]=%{APPNAME} modul
+GenericName[sl]=Vstavek za %{APPNAME}
+GenericName[sr]=%{APPNAME} прикључак
+GenericName[sr@Latn]=%{APPNAME} prikljuÄak
+GenericName[sv]=%{APPNAME} insticksprogram
+GenericName[tr]=%{APPNAME} Eklentisi
+GenericName[zh_CN]=%{APPNAME} æ’件
+GenericName[zh_TW]=%{APPNAME} 外掛程å¼
+Comment=%{APPNAME} Description
+Comment[br]=Deskrivadur %{APPNAME}
+Comment[ca]=Descripció per a %{APPNAME}
+Comment[da]=%{APPNAME} beskrivelse
+Comment[de]=%{APPNAME} Beschreibung
+Comment[el]=ΠεÏιγÏαφή %{APPNAME}
+Comment[es]=Descripción de %{APPNAME}
+Comment[et]=%{APPNAME} kirjeldus
+Comment[eu]=%{APPNAME} deskribapena
+Comment[fa]=توصی٠%{APPNAME}
+Comment[fr]=Description pour %{APPNAME}
+Comment[ga]=Cur Síos %{APPNAME}
+Comment[gl]=Descripción de %{APPNAME}
+Comment[hu]=%{APPNAME} leírása
+Comment[it]=Descrizione %{APPNAME}
+Comment[ja]=%{APPNAME} 概説
+Comment[nds]=%{APPNAME}-Beschrieven
+Comment[ne]=%{APPNAME} वरà¥à¤£à¤¨
+Comment[nl]=%{APPNAME} omschrijving
+Comment[pl]=Opis %{APPNAME}
+Comment[pt]=Descrição de %{APPNAME$}
+Comment[pt_BR]=Descrição do %{APPNAME}
+Comment[ru]=ОпиÑание %{APPNAME}
+Comment[sk]=%{APPNAME} popis
+Comment[sl]=Opis za %{APPNAME}
+Comment[sr]=ÐžÐ¿Ð¸Ñ Ð·Ð° %{APPNAME}
+Comment[sr@Latn]=Opis za %{APPNAME}
+Comment[sv]=%{APPNAME} beskrivning
+Comment[tr]=%{APPNAME} Tanımı
+Comment[zh_CN]=%{APPNAME} æè¿°
+Comment[zh_TW]=%{APPNAME} æè¿°
+Icon=kdevelop
+ServiceTypes=KDevelop/Plugin
+
+X-KDevelop-Plugin-Version=1
+X-KDevelop-Plugin-Homepage=
+X-KDevelop-Plugin-BugsEmailAddress=%{EMAIL}
+X-KDevelop-Plugin-Copyright=(C) by %{AUTHOR}
+
+X-KDevelop-Args=
+
+X-KDevelop-Scope=%{SCOPE}
+X-KDE-Library=libkdev%{APPNAMELC}
+X-KDevelop-Version=3
+X-KDevelop-Properties=%{PROPS}
diff --git a/languages/cpp/app_templates/kdevpart/kdevpart.kdevtemplate b/languages/cpp/app_templates/kdevpart/kdevpart.kdevtemplate
new file mode 100644
index 00000000..bc7becbf
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/kdevpart.kdevtemplate
@@ -0,0 +1,242 @@
+# KDE Config File
+[General]
+Name=KDevelop Plugin (KDevelop source tree build)
+Name[ca]=Connector per a KDevelop (de construcció a l'arbre de fonts de KDevelop)
+Name[da]=KDevelop Plugin (KDevelop kildetræ bygning)
+Name[de]=KDevelop-Modul (Erstellung im KDevelop-Quelltextbaum)
+Name[el]=ΠÏόσθετο KDevelop (κατασκευή με το δέντÏο πηγαίου κώδικα του KDevelop)
+Name[es]=Complemento para KDevelop (construcción en árbol de código fuente de KDevelop)
+Name[et]=KDevelopi plugin (Kdevelopi lähtekoodipuus)
+Name[eu]=KDevelop plugina (KDevelop-en iturburu zuhaitzean erakitzeko)
+Name[fa]=وصلۀ KDevelop )ساخت درخت منبع KDevelop(
+Name[fr]=Module externe de KDevelop (construction dans l'arborescence des sources de KDevelop)
+Name[gl]=Extensión para KDevelop (compilación na árbore de código de KDevelop)
+Name[hu]=KDevelop-bővítőmodul (KDevelopos forráskönyvtáron belül)
+Name[it]=Plugin di KDevelop (compila l'albero sorgente di KDevelop)
+Name[ja]=KDevelop プラグイン (KDevelop ソースツリービルド)
+Name[nds]=KDevelop-Moduul (KDevelop-Bornboomprogramm)
+Name[ne]=केडीई विकास पà¥à¤²à¤—इन (केडीई विकास सà¥à¤°à¥‹à¤¤ टà¥à¤°à¥€ निरà¥à¤®à¤¾à¤£)
+Name[nl]=KDevelop-plugin (KDevelop source tree build)
+Name[pl]=Wtyczka KDevelopa (budowa w drzewie źródłowym KDevelopa)
+Name[pt]='Plugin' do KDevelop (compilação na árvore de código do KDevelop)
+Name[pt_BR]='Plugin' do KDevelop (compilação na árvore de código do KDevelop)
+Name[ru]=Модуль KDevelop (в иÑходном коде KDevelop)
+Name[sk]=KDevelop modul (KDevelop zdrojový strom build)
+Name[sr]=Прикључак за KDevelop (градња у изворном Ñтаблу KDevelop-а)
+Name[sr@Latn]=PrikljuÄak za KDevelop (gradnja u izvornom stablu KDevelop-a)
+Name[sv]=KDevelop-insticksprogram (att bygga i KDevelops källkodsträd)
+Name[tr]=KDevelop Eklentisi (KDevelop kaynak ağacı kurulumu)
+Name[zh_CN]=KDevelop æ’件(KDevelop æºä»£ç æ ‘编译)
+Name[zh_TW]=KDevelop 外掛程å¼ï¼ˆKDevelop 程å¼æºç¢¼æ¨¹å…§å»ºç«‹ï¼‰
+Category=C++/KDevelop/
+Comment=This generates a plugin for KDevelop, for building within the KDevelop source tree
+Comment[ca]=Genera un connector per a KDevelop, per a que es construeixi en l'arbre de fonts de KDevelop
+Comment[da]=Dette genererer et plugin for KDevelop, til at bygges indenfor KDevelop's kildetræ
+Comment[de]=Hiermit wird ein Modul für KDevelop erstellt, dessen Erstellung innerhalb des Quelltextbaumes von KDevelop erfolgt.
+Comment[el]=Αυτό δημιουÏγεί ένα Ï€Ïόσθετο για το KDevelop, για κατασκευή του μέσα στο δέντÏο πηγαίου κώδικα του KDevelop
+Comment[es]=Genera un complemento para KDevelop, para ser construido en el árbol de código fuente de KDevelop
+Comment[et]=KDevelopi plugina loomine, mis ehitatakse KDevelopi lähtekoodipuus.
+Comment[eu]=Honek KDevelop-erako plugin bat sortzen du, KDevelop-en iturburu-zuhaitzean eraikitzeko
+Comment[fa]=وصله‌ای برای KDevelop، برای ساختن در درخت منبع KDevelop تولید می‌کند
+Comment[fr]=Génère un module externe pour KDevelop, à construire dans l'arborescence des sources de KDevelop
+Comment[gl]=Isto xera unha extensión para KDevelop que se compilará dentro da árbore de código de KDevelop
+Comment[hu]=Létrehoz egy KDevelop-bővítőmodult, mely a KDevelopos forráskönyvtáron belül fordítható le
+Comment[it]=Genera un plugin per KDevelop, per compilarlo assieme all'albero sorgente di KDevelop
+Comment[nds]=Dit stellt en KDevelop-Moduul för't Kompileren binnen den KDevelop-Bornboom op
+Comment[ne]=यसले केडीई विकास सà¥à¤°à¥‹à¤¤ टà¥à¤°à¥€ भितà¥à¤° निरà¥à¤®à¤¾à¤£ गरà¥à¤¨, केडीई विकासका लागि पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Dit genereert een plugin voor KDevelop, om te bouwen binnen de KDevelop sourcetree
+Comment[pl]=Generuje wtyczkę do KDevelopa, która jest budowana w jego drzewie źródłowym
+Comment[pt]=Isto gera um 'plugin' para o KDevelop, para uma compilação dentro da árvore de código do KDevelop
+Comment[pt_BR]=Isto gera um 'plugin' para o KDevelop, para uma compilação dentro da árvore de código do KDevelop
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ KDevelop в иÑходном коде KDevelop
+Comment[sk]=Vygeneruje modul pre KDevelop, ktorý sa bude kompilovať v rámci KDevelop zdrojového stromu
+Comment[sr]=Ово прави прикључак за KDevelop, за градњу у оквиру KDevelop-овог изворног Ñтабла
+Comment[sr@Latn]=Ovo pravi prikljuÄak za KDevelop, za gradnju u okviru KDevelop-ovog izvornog stabla
+Comment[sv]=Det här skapar ett insticksprogram för KDevelop, att byggas inne i KDevelops källkodsträd.
+Comment[tr]=Bu KDevelop için, KDevelop kaynak ağacınında olacak, bir eklenti yaratır.
+Comment[zh_CN]=è¿™å°†ç”Ÿæˆ KDevelop çš„æ’件,该æ’件需è¦ä¸Ž KDevelop æºä»£ç æ ‘一起编译
+Comment[zh_TW]=產生一個 KDevelop 外掛程å¼ï¼Œå»ºç«‹æ–¼ KDevelop 程å¼æºç¢¼æ¨¹å…§ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}part.cpp
+Archive=kdevpart.tar.gz
+
+[SCOPE]
+Type = value
+ValueType=QString
+Value= SCOPE
+Comment= The scope of a plugin (Global, Project, Core)
+Comment[ca]= L'àmbit d'un connector (Global, Project, Core)
+Comment[da]= Et plugins omfang (Globalt, Projekt, Kerne)
+Comment[de]= Gültigkeitsbereich eines Moduls (Global, Projekt, Kern)
+Comment[el]= Η εμβέλεια ενός Ï€Ïόσθετου (Καθολική, ΈÏγο, ΠυÏήνας)
+Comment[es]=El alcance de un complemento (global, proyecto, núcleo)
+Comment[et]=Plugina skoop (globaalne, projekt, tuum)
+Comment[eu]= Pluginaren barrutia (Globala, Projektua, Nukleoa)
+Comment[fa]=دامنۀ یک وصله )سراسری، پروژه، هسته(
+Comment[fr]= La portée d'un module externe (globale, projet, core)
+Comment[ga]= Scóip an bhreiseáin (Comhchoiteann, Tionscadal, Ceartlár)
+Comment[gl]=Ãmbito da extensión (Global, Proxecto, Núcleo)
+Comment[hu]=A modul hatóköre (globális, projektszintű, alap)
+Comment[it]=Il contesto di un plugin (Globale, Progetto, Core)
+Comment[nds]= Dat Rebeet vun en Moduul (Globaal, Projekt, Karn)
+Comment[ne]= पà¥à¤²à¤—इनको कà¥à¤·à¥‡à¤¤à¥à¤° (विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€, परियोजना, कोर)
+Comment[nl]=Het bereik van een plugin (globaal, project, core)
+Comment[pl]=Przynależność wtyczki (globalna, projekt, część główna)
+Comment[pt]=O âmbito de um 'plugin' (Global, Projecto, Núcleo)
+Comment[pt_BR]=O âmbito de um 'plugin' (Global, Projecto, Núcleo)
+Comment[ru]=Тип Ð¼Ð¾Ð´ÑƒÐ»Ñ (Global, Project, Core)
+Comment[sk]=Rozsah module (globálny, projektový, jadrový)
+Comment[sr]=ОпÑег прикључка (глобални, пројекат, језгро)
+Comment[sr@Latn]=Opseg prikljuÄka (globalni, projekat, jezgro)
+Comment[sv]=Insticksprogrammets omfattning (Global, Projekt, Kärna)
+Comment[tr]=Bir eklentinin alanı (Genel, Proje, İç)
+Comment[zh_CN]=æ’件的范围(全局ã€å·¥ç¨‹ã€æ ¸å¿ƒ)
+Comment[zh_TW]=外掛程å¼çš„範åœï¼ˆå…¨åŸŸã€å°ˆæ¡ˆã€æ ¸å¿ƒï¼‰
+Default= Global
+
+[PROPS]
+Type = value
+ValueType=QString
+Value= PROPS
+Comment= The list of supported KDevelop properties
+Comment[ca]= La llista de propietats suportades del KDevelop
+Comment[da]= Listen af understøttede KDevelop-egenskaber
+Comment[de]= Die Liste der unterstützten KDevelop-Eigenschaften
+Comment[el]= Η λίστα των υποστηÏιζόμενων ιδιοτήτων του KDevelop
+Comment[es]=La lista de propiedades de KDevelop soportadas
+Comment[et]= KDevelopi toetatud omaduste nimekiri
+Comment[eu]= Onartzen diren KDevelop-en propietateen zerrenda
+Comment[fa]=Ùهرست ویژگیهای پشتیبانی‌شدۀ KDevelop
+Comment[fr]= La liste des propriétés de KDevelop prises en charge
+Comment[ga]= Liosta d'airíonna KDevelop a dtacaítear leo
+Comment[gl]=Lista das propiedades de KDevelop soportadas
+Comment[hu]=A támogatott KDevelop-tulajdonságok
+Comment[it]=Lista delle proprietà supportate da KDevelop
+Comment[nds]= De List mit ünnerstütt KDevelop-Egenschappen
+Comment[ne]= केडीई विकास समरà¥à¤¥à¤¨ गरà¥à¤¨à¥‡ गà¥à¤£à¤•à¥‹ सूची
+Comment[nl]=De lijst met ondersteunde KDevelop-properties
+Comment[pl]= Lista obsługiwanych właściwości KDevelopa
+Comment[pt]= A lista de propriedades do KDevelop suportadas
+Comment[pt_BR]= A lista de propriedades do KDevelop suportadas
+Comment[ru]=СпиÑок поддерживаемых типов модулей Ð´Ð»Ñ KDevelop
+Comment[sk]=Zoznam podporovaných vlastností KDevelop
+Comment[sl]=Seznam podprtih lastnosti KDevelop
+Comment[sr]=ЛиÑта подржаних KDevelop-ових ÑвојÑтава
+Comment[sr@Latn]=Lista podržanih KDevelop-ovih svojstava
+Comment[sv]=Listan med egenskaper i KDevelop som stöds
+Comment[tr]=Desteklenen KDevelop özellikleri
+Comment[zh_CN]=列出支æŒçš„ KDevelop 属性
+Comment[zh_TW]=支æ´çš„ KDevelop 屬性列表
+Default=
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/kdevpart_part.cpp
+Dest=%{dest}/%{APPNAMELC}part.cpp
+
+[FILE4]
+Type=install
+Source=%{src}/kdevpart_part.h
+Dest=%{dest}/%{APPNAMELC}part.h
+
+[FILE5]
+Type=install
+Source=%{src}/kdevpart_widget.cpp
+Dest=%{dest}/%{APPNAMELC}widget.cpp
+
+[FILE6]
+Type=install
+Source=%{src}/kdevpart_widget.h
+Dest=%{dest}/%{APPNAMELC}widget.h
+
+[FILE7]
+Type=install
+EscapeXML=true
+Source=%{src}/kdevpart_part.rc
+Dest=%{dest}/kdev%{APPNAMELC}.rc
+
+[FILE71]
+Type=install
+EscapeXML=true
+Source=%{src}/globalconfigbase.ui
+Dest=%{dest}/%{APPNAMELC}globalconfigbase.ui
+
+[FILE711]
+Type=install
+Source=%{src}/globalconfig.h
+Dest=%{dest}/%{APPNAMELC}globalconfig.h
+
+[FILE712]
+Type=install
+Source=%{src}/globalconfig.cpp
+Dest=%{dest}/%{APPNAMELC}globalconfig.cpp
+
+[FILE72]
+Type=install
+EscapeXML=true
+Source=%{src}/projectconfigbase.ui
+Dest=%{dest}/%{APPNAMELC}projectconfigbase.ui
+
+[FILE721]
+Type=install
+Source=%{src}/projectconfig.h
+Dest=%{dest}/%{APPNAMELC}projectconfig.h
+
+[FILE722]
+Type=install
+Source=%{src}/projectconfig.cpp
+Dest=%{dest}/%{APPNAMELC}projectconfig.cpp
+
+[FILE8]
+Type=install
+Source=%{src}/kdevpart.desktop
+Dest=%{dest}/kdev%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{src}/README.dox
+Dest=%{dest}/README.dox
+
+[MSG]
+Type=message
+Comment=A KDevelop plugin was created in %{dest}
+Comment[ca]=Un connector per a KDevelop ha estat creat en %{dest}
+Comment[da]=Et KDevelop plugin blev oprettet i %{dest}
+Comment[de]=Ein KDevelop-Modul wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο του KDevelop δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento para KDevelop ha sido creado en %{dest}
+Comment[et]=KDevelopi plugin loodi asukohta %{dest}
+Comment[eu]=KDevelop plugin bat sortu da hemen: %{dest}
+Comment[fa]=یک وصلۀ KDevelop در %{dest} ایجاد شد
+Comment[fr]=Un module externe pour KDevelop a été créé dans %{dest}
+Comment[ga]=Cruthaíodh breiseán KDevelop i %{dest}
+Comment[gl]=Creouse unha extensión para KDevelop en %{dest}
+Comment[hu]=Létrejött egy KDevelop-bővítőmodul itt: %{dest}
+Comment[it]=È stato creato un plugin per KDevelop in %{dest}
+Comment[ja]=KDevelop プラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KDevelop-Moduul opstellt
+Comment[ne]=केडीई विकास पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Er is een KDevelop-plugin aangemaakt in %{dest}
+Comment[pl]=Wtyczka do KDevelopa została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' do KDevelop em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' do KDevelop em %{dest}
+Comment[ru]=Модуль KDevelop Ñоздан в %{dest}
+Comment[sk]=KDevelop modul bol vytvorený v %{dest}
+Comment[sl]=Vstavek za KDevelop je bil ustvarjen v %{dest}
+Comment[sr]=Прикључак за KDevelop направљен је у %{dest}
+Comment[sr@Latn]=PrikljuÄak za KDevelop napravljen je u %{dest}
+Comment[sv]=Ett insticksprogram för KDevelop skapades i %{dest}
+Comment[tr]=Bir KDevelop eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了 KDevelop æ’件
+Comment[zh_TW]=一個 KDevelop 外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kdevpart/kdevpart.png b/languages/cpp/app_templates/kdevpart/kdevpart.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/kdevpart.png
Binary files differ
diff --git a/languages/cpp/app_templates/kdevpart/kdevpart_part.cpp b/languages/cpp/app_templates/kdevpart/kdevpart_part.cpp
new file mode 100644
index 00000000..dd86843d
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/kdevpart_part.cpp
@@ -0,0 +1,183 @@
+%{CPP_TEMPLATE}
+#include "%{APPNAMELC}part.h"
+
+#include <qtimer.h>
+#include <qpopupmenu.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <kaction.h>
+#include <kdialogbase.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kdevplugininfo.h>
+#include <kdevgenericfactory.h>
+
+#include <kdevcore.h>
+#include <kdevmainwindow.h>
+#include <configwidgetproxy.h>
+
+#include "%{APPNAMELC}widget.h"
+#include "%{APPNAMELC}globalconfig.h"
+#include "%{APPNAMELC}projectconfig.h"
+
+typedef KDevGenericFactory<%{APPNAME}Part> %{APPNAME}Factory;
+KDevPluginInfo data("kdev%{APPNAMELC}");
+K_EXPORT_COMPONENT_FACTORY( libkdev%{APPNAMELC}, %{APPNAME}Factory( data ) );
+
+#define GLOBALDOC_OPTIONS 1
+#define PROJECTDOC_OPTIONS 2
+
+%{APPNAME}Part::%{APPNAME}Part(QObject *parent, const char *name, const QStringList &/*args*/)
+ : KDevPlugin(&data, parent, name ? name : "%{APPNAME}Part")
+{
+ setInstance(%{APPNAME}Factory::instance());
+ setXMLFile("kdev%{APPNAMELC}.rc");
+
+ m_widget = new %{APPNAME}Widget(this);
+ m_widget->setCaption("widget caption");
+ m_widget->setIcon(SmallIcon(info()->icon()));
+
+ QWhatsThis::add(m_widget, i18n("WHAT DOES THIS PART DO?"));
+
+ // now you decide what should happen to the widget. Take a look at kdevcore.h
+ // or at other plugins how to embed it.
+
+ // if you want to embed your widget as an outputview, simply uncomment
+ // the following line.
+ // mainWindow()->embedOutputView( m_widget, "name that should appear", "enter a tooltip" );
+
+ // if you want to embed your widget as a selectview (at the left), simply uncomment
+ // the following line.
+ // mainWindow()->embedSelectView( m_widget, "name that should appear", "enter a tooltip" );
+
+ // if you want to embed your widget as a selectview (at the right), simply uncomment
+ // the following line.
+ // mainWindow()->embedSelectViewRight( m_widget, "name that should appear", "enter a tooltip" );
+
+ setupActions();
+
+ m_configProxy = new ConfigWidgetProxy(core());
+ m_configProxy->createGlobalConfigPage(i18n("%{APPNAME}"), GLOBALDOC_OPTIONS, info()->icon());
+ m_configProxy->createProjectConfigPage(i18n("%{APPNAME}"), PROJECTDOC_OPTIONS, info()->icon());
+ connect(m_configProxy, SIGNAL(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int )),
+ this, SLOT(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int)));
+
+ connect(core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)));
+ connect(core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()));
+ connect(core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()));
+
+
+ QTimer::singleShot(0, this, SLOT(init()));
+}
+
+%{APPNAME}Part::~%{APPNAME}Part()
+{
+// if you embed a widget, you need to tell the mainwindow when you remove it
+// if ( m_widget )
+// {
+// mainWindow()->removeView( m_widget );
+// }
+ delete m_widget;
+ delete m_configProxy;
+}
+
+void %{APPNAME}Part::init()
+{
+// delayed initialization stuff goes here
+}
+
+void %{APPNAME}Part::setupActions()
+{
+// create XMLGUI actions here
+ action = new KAction(i18n("&Do Something..."), 0,
+ this, SLOT(doSomething()), actionCollection(), "plugin_action" );
+ action->setToolTip(i18n("Do something"));
+ action->setWhatsThis(i18n("<b>Do something</b><p>Describe here what does this action do."));
+}
+
+void %{APPNAME}Part::insertConfigWidget(const KDialogBase *dlg, QWidget *page, unsigned int pageNo)
+{
+// create configuraton dialogs here
+ switch (pageNo)
+ {
+ case GLOBALDOC_OPTIONS:
+ {
+ %{APPNAME}GlobalConfig *w = new %{APPNAME}GlobalConfig(this, page, "global config");
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ break;
+ }
+ case PROJECTDOC_OPTIONS:
+ {
+ %{APPNAME}ProjectConfig *w = new %{APPNAME}ProjectConfig(this, page, "project config");
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ break;
+ }
+ }
+}
+
+void %{APPNAME}Part::contextMenu(QPopupMenu *popup, const Context *context)
+{
+// put actions into the context menu here
+ if (context->hasType(Context::EditorContext))
+ {
+ // editor context menu
+ const EditorContext *econtext = static_cast<const EditorContext*>(context);
+
+ // use context and plug actions here
+ action->plug(popup);
+
+ // or create menu items on the fly
+ // int id = -1;
+ // id = popup->insertItem(i18n("Do Something Here"),
+ // this, SLOT(doSomething()) );
+ // popup->setWhatsThis(id, i18n("<b>Do something here</b><p>Describe here what does this action do."
+ }
+ else if (context->hasType(Context::FileContext))
+ {
+ // file context menu
+ const FileContext *fcontext = static_cast<const FileContext*>(context);
+
+ //use context and plug actions here
+ }
+ else if (context->hasType(Context::ProjectModelItemContext))
+ {
+ // project tree context menu
+ const ProjectModelItemContext *pcontext = static_cast<const ProjectModelItemContext*>(context);
+
+ // use context and plug actions here
+ }
+ else if (context->hasType(Context::CodeModelItemContext))
+ {
+ // class tree context menu
+ const CodeModelItemContext *mcontext = static_cast<const CodeModelItemContext*>(context);
+
+ // use context and plug actions here
+ }
+ else if (context->hasType(Context::DocumentationContext))
+ {
+ // documentation viewer context menu
+ const DocumentationContext *dcontext = static_cast<const DocumentationContext*>(context);
+
+ // use context and plug actions here
+ }
+}
+
+void %{APPNAME}Part::projectOpened()
+{
+// do something when the project is opened
+}
+
+void %{APPNAME}Part::projectClosed()
+{
+// do something when the project is closed
+}
+
+void %{APPNAME}Part::doSomething()
+{
+// do something useful here instead of showing the message box
+ KMessageBox::information(m_widget, i18n("This action does nothing."), i18n("%{APPNAME} Plugin"));
+}
+
+#include "%{APPNAMELC}part.moc"
diff --git a/languages/cpp/app_templates/kdevpart/kdevpart_part.h b/languages/cpp/app_templates/kdevpart/kdevpart_part.h
new file mode 100644
index 00000000..168b8a40
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/kdevpart_part.h
@@ -0,0 +1,45 @@
+%{H_TEMPLATE}
+#ifndef KDEV%{APPNAMEUC}_H
+#define KDEV%{APPNAMEUC}_H
+
+#include <kdevplugin.h>
+
+#include <qguardedptr.h>
+
+class QPopupMenu;
+class KAction;
+class KDialogBase;
+class Context;
+class ConfigWidgetProxy;
+class %{APPNAME}Widget;
+
+/**
+Please read the README.dox file for more info about this part
+*/
+class %{APPNAME}Part: public KDevPlugin
+{
+ Q_OBJECT
+public:
+ %{APPNAME}Part(QObject *parent, const char *name, const QStringList &args);
+ ~%{APPNAME}Part();
+
+private slots:
+ void init();
+
+ void insertConfigWidget(const KDialogBase *dlg, QWidget *page, unsigned int pageNo);
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void projectOpened();
+ void projectClosed();
+
+ void doSomething();
+
+private:
+ void setupActions();
+
+ KAction *action;
+
+ QGuardedPtr<%{APPNAME}Widget> m_widget;
+ ConfigWidgetProxy *m_configProxy;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kdevpart/kdevpart_part.rc b/languages/cpp/app_templates/kdevpart/kdevpart_part.rc
new file mode 100644
index 00000000..a38ee14e
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/kdevpart_part.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="%{APPNAMELC}" library="lib%{APPNAMELC}plugin" version="1">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="plugin_action"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar">
+ <Action name="plugin_action"/>
+</ToolBar>
+</kpartplugin>
diff --git a/languages/cpp/app_templates/kdevpart/kdevpart_widget.cpp b/languages/cpp/app_templates/kdevpart/kdevpart_widget.cpp
new file mode 100644
index 00000000..0c05b976
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/kdevpart_widget.cpp
@@ -0,0 +1,21 @@
+%{CPP_TEMPLATE}
+#include "%{APPNAMELC}widget.h"
+
+#include <kurl.h>
+#include <klibloader.h>
+#include <kparts/part.h>
+
+#include <kdevcore.h>
+
+#include "%{APPNAMELC}part.h"
+
+%{APPNAME}Widget::%{APPNAME}Widget(%{APPNAME}Part *part)
+ : QWidget(0, "%{APPNAMELC} widget"), m_part(part)
+{
+}
+
+%{APPNAME}Widget::~%{APPNAME}Widget()
+{
+}
+
+#include "%{APPNAMELC}widget.moc"
diff --git a/languages/cpp/app_templates/kdevpart/kdevpart_widget.h b/languages/cpp/app_templates/kdevpart/kdevpart_widget.h
new file mode 100644
index 00000000..e29e29d2
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/kdevpart_widget.h
@@ -0,0 +1,23 @@
+%{H_TEMPLATE}
+#ifndef %{APPNAMEUC}_WIDGET_H
+#define %{APPNAMEUC}_WIDGET_H
+
+#include <qwidget.h>
+#include <qstring.h>
+
+class KDevProject;
+class %{APPNAME}Part;
+
+class %{APPNAME}Widget: public QWidget
+{
+ Q_OBJECT
+public:
+ %{APPNAME}Widget(%{APPNAME}Part *part);
+ ~%{APPNAME}Widget();
+
+private:
+ %{APPNAME}Part *m_part;
+};
+
+
+#endif
diff --git a/languages/cpp/app_templates/kdevpart/projectconfig.cpp b/languages/cpp/app_templates/kdevpart/projectconfig.cpp
new file mode 100644
index 00000000..5f07993b
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/projectconfig.cpp
@@ -0,0 +1,15 @@
+%{CPP_TEMPLATE}
+#include "%{APPNAMELC}projectconfig.h"
+
+#include "%{APPNAMELC}part.h"
+
+%{APPNAME}ProjectConfig::%{APPNAME}ProjectConfig(%{APPNAME}Part *part, QWidget *parent, const char *name)
+ : %{APPNAME}ProjectConfigBase(parent, name), m_part(part)
+{
+}
+
+void %{APPNAME}ProjectConfig::accept()
+{
+}
+
+#include "%{APPNAMELC}projectconfig.moc"
diff --git a/languages/cpp/app_templates/kdevpart/projectconfig.h b/languages/cpp/app_templates/kdevpart/projectconfig.h
new file mode 100644
index 00000000..ec3ff4df
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/projectconfig.h
@@ -0,0 +1,22 @@
+%{H_TEMPLATE}
+#ifndef %{APPNAMEUC}_PROJECT_CONFIG_H
+#define %{APPNAMEUC}_PROJECT_CONFIG_H
+
+#include "%{APPNAMELC}projectconfigbase.h"
+
+class %{APPNAME}Part;
+
+class %{APPNAME}ProjectConfig: public %{APPNAME}ProjectConfigBase
+{
+ Q_OBJECT
+public:
+ %{APPNAME}ProjectConfig(%{APPNAME}Part *part, QWidget *parent = 0, const char *name = 0);
+
+public slots:
+ void accept();
+
+private:
+ %{APPNAME}Part *m_part;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kdevpart/projectconfigbase.ui b/languages/cpp/app_templates/kdevpart/projectconfigbase.ui
new file mode 100644
index 00000000..c733a774
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/projectconfigbase.ui
@@ -0,0 +1,20 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>%{APPNAME}ProjectConfigBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>%{APPNAME}ProjectConfigBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>%{APPNAME}</string>
+ </property>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kdevpart/src-Makefile.am b/languages/cpp/app_templates/kdevpart/src-Makefile.am
new file mode 100644
index 00000000..5cd25f36
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart/src-Makefile.am
@@ -0,0 +1,20 @@
+INCLUDES = -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/util $(all_includes)
+
+kde_module_LTLIBRARIES = libkdev%{APPNAMELC}.la
+libkdev%{APPNAMELC}_la_LDFLAGS = -module -avoid-version -no-undefined $(all_libraries) $(KDE_PLUGIN)
+libkdev%{APPNAMELC}_la_LIBADD = $(top_builddir)/lib/libkdevelop.la
+
+libkdev%{APPNAMELC}_la_SOURCES = %{APPNAMELC}part.cpp %{APPNAMELC}widget.cpp \
+ %{APPNAMELC}globalconfigbase.ui %{APPNAMELC}globalconfig.cpp \
+ %{APPNAMELC}projectconfigbase.ui %{APPNAMELC}projectconfig.cpp
+
+METASOURCES = AUTO
+
+appsharedir = $(kde_datadir)/kdev%{APPNAMELC}
+appshare_DATA =
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdev%{APPNAMELC}.desktop
+
+rcdir = $(kde_datadir)/kdev%{APPNAMELC}
+rc_DATA = kdev%{APPNAMELC}.rc
diff --git a/languages/cpp/app_templates/kdevpart2/.kdev_ignore b/languages/cpp/app_templates/kdevpart2/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/.kdev_ignore
diff --git a/languages/cpp/app_templates/kdevpart2/Makefile.am b/languages/cpp/app_templates/kdevpart2/Makefile.am
new file mode 100644
index 00000000..6e58fa02
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/Makefile.am
@@ -0,0 +1,21 @@
+dataFiles = src-Makefile.am kdevpart_part.cpp kdevpart_part.h\
+ kdevpart_widget.h kdevpart_widget.cpp \
+ kdevpart_part.rc kdevpart.desktop app.kdevelop \
+ kdevpart-configure.in.in README.dox subdirs globalconfigbase.ui globalconfig.h \
+ globalconfig.cpp projectconfigbase.ui projectconfig.h projectconfig.cpp
+
+templateName = kdevpart2
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kdevpart2/README.dox b/languages/cpp/app_templates/kdevpart2/README.dox
new file mode 100644
index 00000000..86968add
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/README.dox
@@ -0,0 +1,55 @@
+/** \class %{APPNAME}
+Put a brief description here, the brief description ends at the first dot.
+Put a more detailed description of your part in these lines. It can span
+over several lines. You can even use some html commands in these lines like:
+<code>This is code</code>, html links <a href="http://somelocation">link text</a>,
+and images.
+
+\authors <a href="mailto:%{EMAIL}">%{AUTHOR}</a>
+\authors <a href="mailto:2nd author AT provider.com">2nd author full name</a>
+...
+\authors <a href="mailto:nth author AT provider.com">nth author full name</a>
+
+\maintainer <a href="mailto:%{EMAIL}">%{AUTHOR}</a>
+\maintainer <a href="mailto:2nd maintainer AT provider.com">2nd maintainer full name</a>
+...
+\maintainer <a href="mailto:nth maintainer AT provider.com">nth maintainer full name</a>
+
+\feature Describe the first feature
+\feature Describe the second feature
+...
+\feature Describe the last feature
+
+\bug bugs in <a href="http://bugs.kde.org/buglist.cgi?product=kdevelop&component=YOUR_COMPONENT_NAME&
+bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=Bug+Number">
+YOUR_COMPONENT_NAME at Bugzilla database</a>
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/cpp/app_templates/kdevpart2/app.kdevelop b/languages/cpp/app_templates/kdevpart2/app.kdevelop
new file mode 100644
index 00000000..644adcdf
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/app.kdevelop
@@ -0,0 +1,148 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>KDevelop</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <directoryradio>executable</directoryradio>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ </make>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidepatterns></hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <showvcsfields>true</showvcsfields>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions></commitoptions>
+ <addoptions></addoptions>
+ <logoptions></logoptions>
+ <updateoptions>-dP</updateoptions>
+ <removeoptions>-f</removeoptions>
+ <revertoptions>-C -d -P</revertoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <rshoptions></rshoptions>
+ </kdevcvs>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ </codecompletion>
+ </kdevcppsupport>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kdevpart2/globalconfig.cpp b/languages/cpp/app_templates/kdevpart2/globalconfig.cpp
new file mode 100644
index 00000000..12396fec
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/globalconfig.cpp
@@ -0,0 +1,15 @@
+%{CPP_TEMPLATE}
+#include "%{APPNAMELC}globalconfig.h"
+
+#include "%{APPNAMELC}part.h"
+
+%{APPNAME}GlobalConfig::%{APPNAME}GlobalConfig(%{APPNAME}Part *part, QWidget *parent, const char *name)
+ : %{APPNAME}GlobalConfigBase(parent, name), m_part(part)
+{
+}
+
+void %{APPNAME}GlobalConfig::accept()
+{
+}
+
+#include "%{APPNAMELC}globalconfig.moc"
diff --git a/languages/cpp/app_templates/kdevpart2/globalconfig.h b/languages/cpp/app_templates/kdevpart2/globalconfig.h
new file mode 100644
index 00000000..1b321cd2
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/globalconfig.h
@@ -0,0 +1,22 @@
+%{H_TEMPLATE}
+#ifndef %{APPNAMEUC}_GLOBAL_CONFIG_H
+#define %{APPNAMEUC}_GLOBAL_CONFIG_H
+
+#include "%{APPNAMELC}globalconfigbase.h"
+
+class %{APPNAME}Part;
+
+class %{APPNAME}GlobalConfig: public %{APPNAME}GlobalConfigBase
+{
+ Q_OBJECT
+public:
+ %{APPNAME}GlobalConfig(%{APPNAME}Part *part, QWidget *parent = 0, const char *name = 0);
+
+public slots:
+ void accept();
+
+private:
+ %{APPNAME}Part *m_part;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kdevpart2/globalconfigbase.ui b/languages/cpp/app_templates/kdevpart2/globalconfigbase.ui
new file mode 100644
index 00000000..c16bd90d
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/globalconfigbase.ui
@@ -0,0 +1,20 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>%{APPNAME}GlobalConfigBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>%{APPNAME}GlobalConfigBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>%{APPNAME}</string>
+ </property>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kdevpart2/kdevpart-configure.in.in b/languages/cpp/app_templates/kdevpart2/kdevpart-configure.in.in
new file mode 100644
index 00000000..06ee70b8
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/kdevpart-configure.in.in
@@ -0,0 +1,10 @@
+#MIN_CONFIG(3.0.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+KDE_CHECK_HEADERS([kdevelop/interfaces/kdevcore.h])
+KDE_CHECK_LIB([kdevelop],main,
+ [LIBKDEVELOP="-lkdevelop"])
+AC_SUBST(LIBKDEVELOP)
diff --git a/languages/cpp/app_templates/kdevpart2/kdevpart.desktop b/languages/cpp/app_templates/kdevpart2/kdevpart.desktop
new file mode 100644
index 00000000..eb61eef9
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/kdevpart.desktop
@@ -0,0 +1,83 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Name=KDev%{APPNAME}
+Name[nds]=KDev%{ProgNaam}
+Name[sv]=KDevelop %{APPNAME}
+Name[ta]=கெடெவà¯%{APPNAME}
+GenericName=%{APPNAME} Plugin
+GenericName[br]=Lugent %{APPNAME}
+GenericName[ca]=Connector per a %{APPNAME}
+GenericName[da]=%{APPNAME} plugin
+GenericName[de]=%{APPNAME}-Modul
+GenericName[el]=ΠÏόσθετο %{APPNAME}
+GenericName[es]=Complemento %{APPNAME}
+GenericName[et]=%{APPNAME} plugin
+GenericName[eu]=%{APPNAME} plugina
+GenericName[fa]=وصلۀ %{APPNAME}
+GenericName[fr]=Module externe pour %{APPNAME}
+GenericName[ga]=Breiseán %{APPNAME}
+GenericName[gl]=Extensión %{APPNAME}
+GenericName[hu]=%{APPNAME}-bővítőmodul
+GenericName[it]=Plugin %{APPNAME}
+GenericName[ja]=%{APPNAME} プラグイン
+GenericName[nds]=%{APPNAME}-Moduul
+GenericName[ne]=%{APPNAME} पà¥à¤²à¤—इन
+GenericName[nl]=%{APPNAME}-plugin
+GenericName[pl]=Wtyczka %{APPNAME}
+GenericName[pt]='Plugin' %{APPNAME}
+GenericName[pt_BR]=Plug-in do %{APPNAME}
+GenericName[ru]=Модуль %{APPNAME}
+GenericName[sk]=%{APPNAME} modul
+GenericName[sl]=Vstavek za %{APPNAME}
+GenericName[sr]=%{APPNAME} прикључак
+GenericName[sr@Latn]=%{APPNAME} prikljuÄak
+GenericName[sv]=%{APPNAME} insticksprogram
+GenericName[tr]=%{APPNAME} Eklentisi
+GenericName[zh_CN]=%{APPNAME} æ’件
+GenericName[zh_TW]=%{APPNAME} 外掛程å¼
+Comment=%{APPNAME} Description
+Comment[br]=Deskrivadur %{APPNAME}
+Comment[ca]=Descripció per a %{APPNAME}
+Comment[da]=%{APPNAME} beskrivelse
+Comment[de]=%{APPNAME} Beschreibung
+Comment[el]=ΠεÏιγÏαφή %{APPNAME}
+Comment[es]=Descripción de %{APPNAME}
+Comment[et]=%{APPNAME} kirjeldus
+Comment[eu]=%{APPNAME} deskribapena
+Comment[fa]=توصی٠%{APPNAME}
+Comment[fr]=Description pour %{APPNAME}
+Comment[ga]=Cur Síos %{APPNAME}
+Comment[gl]=Descripción de %{APPNAME}
+Comment[hu]=%{APPNAME} leírása
+Comment[it]=Descrizione %{APPNAME}
+Comment[ja]=%{APPNAME} 概説
+Comment[nds]=%{APPNAME}-Beschrieven
+Comment[ne]=%{APPNAME} वरà¥à¤£à¤¨
+Comment[nl]=%{APPNAME} omschrijving
+Comment[pl]=Opis %{APPNAME}
+Comment[pt]=Descrição de %{APPNAME$}
+Comment[pt_BR]=Descrição do %{APPNAME}
+Comment[ru]=ОпиÑание %{APPNAME}
+Comment[sk]=%{APPNAME} popis
+Comment[sl]=Opis za %{APPNAME}
+Comment[sr]=ÐžÐ¿Ð¸Ñ Ð·Ð° %{APPNAME}
+Comment[sr@Latn]=Opis za %{APPNAME}
+Comment[sv]=%{APPNAME} beskrivning
+Comment[tr]=%{APPNAME} Tanımı
+Comment[zh_CN]=%{APPNAME} æè¿°
+Comment[zh_TW]=%{APPNAME} æè¿°
+Icon=kdevelop
+ServiceTypes=KDevelop/Plugin
+
+X-KDevelop-Plugin-Version=1
+X-KDevelop-Plugin-Homepage=
+X-KDevelop-Plugin-BugsEmailAddress=%{EMAIL}
+X-KDevelop-Plugin-Copyright=(C) by %{AUTHOR}
+
+X-KDevelop-Args=
+
+X-KDevelop-Scope=%{SCOPE}
+X-KDE-Library=libkdev%{APPNAMELC}
+X-KDevelop-Version=3
+X-KDevelop-Properties=%{PROPS}
diff --git a/languages/cpp/app_templates/kdevpart2/kdevpart2.kdevtemplate b/languages/cpp/app_templates/kdevpart2/kdevpart2.kdevtemplate
new file mode 100644
index 00000000..6b701188
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/kdevpart2.kdevtemplate
@@ -0,0 +1,276 @@
+# KDE Config File
+[General]
+Name=KDevelop Plugin (Standalone build)
+Name[ca]=Connector per a KDevelop (de construcció aïllada)
+Name[da]=KDevelop plugin (Alenestående)
+Name[de]=KDevelop-Modul (Unabhängige Erstellung)
+Name[el]=ΠÏόσθετο KDevelop (Αυτόνομη κατασκευή)
+Name[es]=Complemento para KDevelop (construcción independiente)
+Name[et]=KDevelopi plugin (autonoomne)
+Name[eu]=KDevelop plugin-a (eraikuntza autonomoak)
+Name[fa]=وصلۀ KDevelop )ساخت خوداتکا(
+Name[fr]=Module externe pour KDevelop (construction autonome)
+Name[ga]=Breiseán KDevelop (Tógáil Shaorsheasaimh)
+Name[gl]=Extensión para KDevelop (compilación independente)
+Name[hu]=KDevelop-bővítőmodul (önálló)
+Name[it]=Plugin di KDevelop (compilazione indipendente)
+Name[ja]=KDevelop プラグイン (スタンダローンビルド)
+Name[nds]=KDevelop-Moduul (Enkelprogramm)
+Name[ne]=केडीई विकास पà¥à¤²à¤—इन (सà¥à¤Ÿà¥à¤¯à¤¾à¤¨à¥à¤¡à¤…लोन निरà¥à¤®à¤¾à¤£)
+Name[nl]=KDevelop-plugin (standalone build)
+Name[pl]=Wtyczka do KDevelopa (budowana oddzielnie)
+Name[pt]='Plugin' do KDevelop (compilação autónoma)
+Name[pt_BR]='Plugin' do KDevelop (compilação autónoma)
+Name[ru]=Модуль KDevelop (внешний)
+Name[sk]=KDevelop modul (samostatný build)
+Name[sl]=Vstavek za KDevelop (samostojna izgradnja)
+Name[sr]=Прикључак за KDevelop
+Name[sr@Latn]=PrikljuÄak za KDevelop
+Name[sv]=KDevelop-insticksprogram (att bygga fristående)
+Name[tr]=KDevelop Eklentisi (Kendi başına çalışabilen)
+Name[zh_CN]=KDevelop æ’件(独立编译)
+Name[zh_TW]=KDevelop 外掛程å¼ï¼ˆå–®ç¨å»ºç«‹ï¼‰
+Category=C++/KDevelop/
+Comment=This generates a KPart for KDevelop, to be built outside of the KDevelop source tree.
+Comment[ca]=Genera una KPart per a KDevelop, per a que es construeixi fora de l'arbre de fonts de KDevelop.
+Comment[da]=Dette genererer en KPart for KDevelop, til at bygges udenfor KDevelop's kildetræ.
+Comment[de]=Hiermit wird eine Komponente (KPart) für KDevelop generiert, die außerhalb des Quelltextbaumes von KDevelop erstellt wird.
+Comment[el]=Αυτό δημιουÏγεί ένα KPart για το KDevelop, για κατασκευή του έξω από το δέντÏο πηγαίου κώδικα του KDevelop.
+Comment[es]=Genera un KPart para KDevelop, para ser construido fuera del árbol de código fuente de KDevelop.
+Comment[et]=KDevelopi KPart'i loomine, mida saab ehitada väljaspool KDevelopi lähtekoodipuud.
+Comment[eu]=Honek KDevelop-en KPart bat sortzen du, KDevelop-en iturburu-zuhaitzetik at eraikitzeko.
+Comment[fa]=یک KPart برای KDevelop، برای ساخته شدن در بیرون درخت منبع پروژه تولید می‌کند.
+Comment[fr]=Génère un KPart pour KDevelop, à construire en dehors de l'arborescence des sources de KDevelop.
+Comment[gl]=Isto xera un KPart para KDevelop que se compilará fóra da árbore de código de KDevelop.
+Comment[hu]=Létrehoz egy KDevelop-bővítőmodult, mely a KDevelopos forráskönyvtáron kívül fordítható le.
+Comment[it]=Genera un KPart per KDevelop, da compilare al di fuori dell'albero sorgente di KDevelop.
+Comment[nds]=Dit stellt en KPart-Komponent för KDevelop op, dat buten den KDevelop-Bornboom kompileert warrt.
+Comment[ne]=यसले केडीई विकास सà¥à¤°à¥‹à¤¤ टà¥à¤°à¥€ बाहिर निरà¥à¤®à¤¾à¤£ हà¥à¤¨à¥‡, केडीई विकासका लागि केडीई भाग उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Dit genereert een KPart voor KDevelop, welke buiten de KDevelop sourcetree wordt gebouwd.
+Comment[pl]=Generuje KPart dla KDevelopa budowane poza jego drzewem źródłowym.
+Comment[pt]=Isto gera uma KPart para o KDevelop, de modo a ser compilada fora da árvore de código do KDevelop.
+Comment[pt_BR]=Isto gera uma KPart para o KDevelop, de modo a ser compilada fora da árvore de código do KDevelop.
+Comment[ru]=Создание компонента KPart Ð´Ð»Ñ KDevelop Ñо Ñборкой вне иÑходного кода KDevelop.
+Comment[sk]=Vygenruje KPart pre KDevelop, tak aby ho bolo možné kompilovať mimo zdrojový strom KDevelop.
+Comment[sr]=Ово прави KPart за KDevelop, за градњу изван KDevelop-овог изворног Ñтабла.
+Comment[sr@Latn]=Ovo pravi KPart za KDevelop, za gradnju izvan KDevelop-ovog izvornog stabla.
+Comment[sv]=Detta skapar ett KDevelop-delprogram, att bygga utanför KDevelops källkodsträd.
+Comment[tr]=Bu, KDevelop için, KDevelop kaynak ağacının dışında yapılacak, bir KPart yaratır.
+Comment[zh_CN]=这将生æˆä¸€ä¸ª KDevelop çš„ KPart,å¯ä»¥åœ¨ KDevelop æºä»£ç æ ‘之外编译。
+Comment[zh_TW]=產生一個 KDevelop çš„ KPart 元件,建立在 KDevelop 程å¼æºç¢¼æ¨¹ä¹‹å¤–。
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}_part.cpp
+Archive=kdevpart2.tar.gz
+
+[SCOPE]
+Type = value
+ValueType=QString
+Value= SCOPE
+Comment= The scope of a plugin (Global, Project, Core)
+Comment[ca]= L'àmbit d'un connector (Global, Project, Core)
+Comment[da]= Et plugins omfang (Globalt, Projekt, Kerne)
+Comment[de]= Gültigkeitsbereich eines Moduls (Global, Projekt, Kern)
+Comment[el]= Η εμβέλεια ενός Ï€Ïόσθετου (Καθολική, ΈÏγο, ΠυÏήνας)
+Comment[es]=El alcance de un complemento (global, proyecto, núcleo)
+Comment[et]=Plugina skoop (globaalne, projekt, tuum)
+Comment[eu]= Pluginaren barrutia (Globala, Projektua, Nukleoa)
+Comment[fa]=دامنۀ یک وصله )سراسری، پروژه، هسته(
+Comment[fr]= La portée d'un module externe (globale, projet, core)
+Comment[ga]= Scóip an bhreiseáin (Comhchoiteann, Tionscadal, Ceartlár)
+Comment[gl]=Ãmbito da extensión (Global, Proxecto, Núcleo)
+Comment[hu]=A modul hatóköre (globális, projektszintű, alap)
+Comment[it]=Il contesto di un plugin (Globale, Progetto, Core)
+Comment[nds]= Dat Rebeet vun en Moduul (Globaal, Projekt, Karn)
+Comment[ne]= पà¥à¤²à¤—इनको कà¥à¤·à¥‡à¤¤à¥à¤° (विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€, परियोजना, कोर)
+Comment[nl]=Het bereik van een plugin (globaal, project, core)
+Comment[pl]=Przynależność wtyczki (globalna, projekt, część główna)
+Comment[pt]=O âmbito de um 'plugin' (Global, Projecto, Núcleo)
+Comment[pt_BR]=O âmbito de um 'plugin' (Global, Projecto, Núcleo)
+Comment[ru]=Тип Ð¼Ð¾Ð´ÑƒÐ»Ñ (Global, Project, Core)
+Comment[sk]=Rozsah module (globálny, projektový, jadrový)
+Comment[sr]=ОпÑег прикључка (глобални, пројекат, језгро)
+Comment[sr@Latn]=Opseg prikljuÄka (globalni, projekat, jezgro)
+Comment[sv]=Insticksprogrammets omfattning (Global, Projekt, Kärna)
+Comment[tr]=Bir eklentinin alanı (Genel, Proje, İç)
+Comment[zh_CN]=æ’件的范围(全局ã€å·¥ç¨‹ã€æ ¸å¿ƒ)
+Comment[zh_TW]=外掛程å¼çš„範åœï¼ˆå…¨åŸŸã€å°ˆæ¡ˆã€æ ¸å¿ƒï¼‰
+Default= Global
+
+[PROPS]
+Type = value
+ValueType=QString
+Value= PROPS
+Comment= The list of supported KDevelop properties
+Comment[ca]= La llista de propietats suportades del KDevelop
+Comment[da]= Listen af understøttede KDevelop-egenskaber
+Comment[de]= Die Liste der unterstützten KDevelop-Eigenschaften
+Comment[el]= Η λίστα των υποστηÏιζόμενων ιδιοτήτων του KDevelop
+Comment[es]=La lista de propiedades de KDevelop soportadas
+Comment[et]= KDevelopi toetatud omaduste nimekiri
+Comment[eu]= Onartzen diren KDevelop-en propietateen zerrenda
+Comment[fa]=Ùهرست ویژگیهای پشتیبانی‌شدۀ KDevelop
+Comment[fr]= La liste des propriétés de KDevelop prises en charge
+Comment[ga]= Liosta d'airíonna KDevelop a dtacaítear leo
+Comment[gl]=Lista das propiedades de KDevelop soportadas
+Comment[hu]=A támogatott KDevelop-tulajdonságok
+Comment[it]=Lista delle proprietà supportate da KDevelop
+Comment[nds]= De List mit ünnerstütt KDevelop-Egenschappen
+Comment[ne]= केडीई विकास समरà¥à¤¥à¤¨ गरà¥à¤¨à¥‡ गà¥à¤£à¤•à¥‹ सूची
+Comment[nl]=De lijst met ondersteunde KDevelop-properties
+Comment[pl]= Lista obsługiwanych właściwości KDevelopa
+Comment[pt]= A lista de propriedades do KDevelop suportadas
+Comment[pt_BR]= A lista de propriedades do KDevelop suportadas
+Comment[ru]=СпиÑок поддерживаемых типов модулей Ð´Ð»Ñ KDevelop
+Comment[sk]=Zoznam podporovaných vlastností KDevelop
+Comment[sl]=Seznam podprtih lastnosti KDevelop
+Comment[sr]=ЛиÑта подржаних KDevelop-ових ÑвојÑтава
+Comment[sr@Latn]=Lista podržanih KDevelop-ovih svojstava
+Comment[sv]=Listan med egenskaper i KDevelop som stöds
+Comment[tr]=Desteklenen KDevelop özellikleri
+Comment[zh_CN]=列出支æŒçš„ KDevelop 属性
+Comment[zh_TW]=支æ´çš„ KDevelop 屬性列表
+Default=
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE4]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE5]
+Type=install
+Source=%{src}/kdevpart-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE6]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{src}/kdevpart_part.cpp
+Dest=%{dest}/src/%{APPNAMELC}part.cpp
+
+[FILE71]
+Type=install
+EscapeXML=true
+Source=%{src}/globalconfigbase.ui
+Dest=%{dest}/src/%{APPNAMELC}globalconfigbase.ui
+
+[FILE711]
+Type=install
+Source=%{src}/globalconfig.h
+Dest=%{dest}/src/%{APPNAMELC}globalconfig.h
+
+[FILE712]
+Type=install
+Source=%{src}/globalconfig.cpp
+Dest=%{dest}/src/%{APPNAMELC}globalconfig.cpp
+
+[FILE72]
+Type=install
+EscapeXML=true
+Source=%{src}/projectconfigbase.ui
+Dest=%{dest}/src/%{APPNAMELC}projectconfigbase.ui
+
+[FILE721]
+Type=install
+Source=%{src}/projectconfig.h
+Dest=%{dest}/src/%{APPNAMELC}projectconfig.h
+
+[FILE722]
+Type=install
+Source=%{src}/projectconfig.cpp
+Dest=%{dest}/src/%{APPNAMELC}projectconfig.cpp
+
+[FILE8]
+Type=install
+Source=%{src}/kdevpart_part.h
+Dest=%{dest}/src/%{APPNAMELC}part.h
+
+[FILE9]
+Type=install
+Source=%{src}/kdevpart_widget.cpp
+Dest=%{dest}/src/%{APPNAMELC}widget.cpp
+
+[FILE10]
+Type=install
+Source=%{src}/kdevpart_widget.h
+Dest=%{dest}/src/%{APPNAMELC}widget.h
+
+[FILE11]
+Type=install
+EscapeXML=true
+Source=%{src}/kdevpart_part.rc
+Dest=%{dest}/src/kdev%{APPNAMELC}.rc
+
+[FILE12]
+Type=install
+Source=%{src}/kdevpart.desktop
+Dest=%{dest}/src/kdev%{APPNAMELC}.desktop
+
+[FILE13]
+Type=install
+Source=%{src}/README.dox
+Dest=%{dest}/src/README.dox
+
+[MSG]
+Type=message
+Comment=A KDevelop plugin was created in %{dest}
+Comment[ca]=Un connector per a KDevelop ha estat creat en %{dest}
+Comment[da]=Et KDevelop plugin blev oprettet i %{dest}
+Comment[de]=Ein KDevelop-Modul wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο του KDevelop δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento para KDevelop ha sido creado en %{dest}
+Comment[et]=KDevelopi plugin loodi asukohta %{dest}
+Comment[eu]=KDevelop plugin bat sortu da hemen: %{dest}
+Comment[fa]=یک وصلۀ KDevelop در %{dest} ایجاد شد
+Comment[fr]=Un module externe pour KDevelop a été créé dans %{dest}
+Comment[ga]=Cruthaíodh breiseán KDevelop i %{dest}
+Comment[gl]=Creouse unha extensión para KDevelop en %{dest}
+Comment[hu]=Létrejött egy KDevelop-bővítőmodul itt: %{dest}
+Comment[it]=È stato creato un plugin per KDevelop in %{dest}
+Comment[ja]=KDevelop プラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KDevelop-Moduul opstellt
+Comment[ne]=केडीई विकास पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Er is een KDevelop-plugin aangemaakt in %{dest}
+Comment[pl]=Wtyczka do KDevelopa została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' do KDevelop em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' do KDevelop em %{dest}
+Comment[ru]=Модуль KDevelop Ñоздан в %{dest}
+Comment[sk]=KDevelop modul bol vytvorený v %{dest}
+Comment[sl]=Vstavek za KDevelop je bil ustvarjen v %{dest}
+Comment[sr]=Прикључак за KDevelop направљен је у %{dest}
+Comment[sr@Latn]=PrikljuÄak za KDevelop napravljen je u %{dest}
+Comment[sv]=Ett insticksprogram för KDevelop skapades i %{dest}
+Comment[tr]=Bir KDevelop eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了 KDevelop æ’件
+Comment[zh_TW]=一個 KDevelop 外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kdevpart2/kdevpart2.png b/languages/cpp/app_templates/kdevpart2/kdevpart2.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/kdevpart2.png
Binary files differ
diff --git a/languages/cpp/app_templates/kdevpart2/kdevpart_part.cpp b/languages/cpp/app_templates/kdevpart2/kdevpart_part.cpp
new file mode 100644
index 00000000..dd86843d
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/kdevpart_part.cpp
@@ -0,0 +1,183 @@
+%{CPP_TEMPLATE}
+#include "%{APPNAMELC}part.h"
+
+#include <qtimer.h>
+#include <qpopupmenu.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <kaction.h>
+#include <kdialogbase.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kdevplugininfo.h>
+#include <kdevgenericfactory.h>
+
+#include <kdevcore.h>
+#include <kdevmainwindow.h>
+#include <configwidgetproxy.h>
+
+#include "%{APPNAMELC}widget.h"
+#include "%{APPNAMELC}globalconfig.h"
+#include "%{APPNAMELC}projectconfig.h"
+
+typedef KDevGenericFactory<%{APPNAME}Part> %{APPNAME}Factory;
+KDevPluginInfo data("kdev%{APPNAMELC}");
+K_EXPORT_COMPONENT_FACTORY( libkdev%{APPNAMELC}, %{APPNAME}Factory( data ) );
+
+#define GLOBALDOC_OPTIONS 1
+#define PROJECTDOC_OPTIONS 2
+
+%{APPNAME}Part::%{APPNAME}Part(QObject *parent, const char *name, const QStringList &/*args*/)
+ : KDevPlugin(&data, parent, name ? name : "%{APPNAME}Part")
+{
+ setInstance(%{APPNAME}Factory::instance());
+ setXMLFile("kdev%{APPNAMELC}.rc");
+
+ m_widget = new %{APPNAME}Widget(this);
+ m_widget->setCaption("widget caption");
+ m_widget->setIcon(SmallIcon(info()->icon()));
+
+ QWhatsThis::add(m_widget, i18n("WHAT DOES THIS PART DO?"));
+
+ // now you decide what should happen to the widget. Take a look at kdevcore.h
+ // or at other plugins how to embed it.
+
+ // if you want to embed your widget as an outputview, simply uncomment
+ // the following line.
+ // mainWindow()->embedOutputView( m_widget, "name that should appear", "enter a tooltip" );
+
+ // if you want to embed your widget as a selectview (at the left), simply uncomment
+ // the following line.
+ // mainWindow()->embedSelectView( m_widget, "name that should appear", "enter a tooltip" );
+
+ // if you want to embed your widget as a selectview (at the right), simply uncomment
+ // the following line.
+ // mainWindow()->embedSelectViewRight( m_widget, "name that should appear", "enter a tooltip" );
+
+ setupActions();
+
+ m_configProxy = new ConfigWidgetProxy(core());
+ m_configProxy->createGlobalConfigPage(i18n("%{APPNAME}"), GLOBALDOC_OPTIONS, info()->icon());
+ m_configProxy->createProjectConfigPage(i18n("%{APPNAME}"), PROJECTDOC_OPTIONS, info()->icon());
+ connect(m_configProxy, SIGNAL(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int )),
+ this, SLOT(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int)));
+
+ connect(core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)));
+ connect(core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()));
+ connect(core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()));
+
+
+ QTimer::singleShot(0, this, SLOT(init()));
+}
+
+%{APPNAME}Part::~%{APPNAME}Part()
+{
+// if you embed a widget, you need to tell the mainwindow when you remove it
+// if ( m_widget )
+// {
+// mainWindow()->removeView( m_widget );
+// }
+ delete m_widget;
+ delete m_configProxy;
+}
+
+void %{APPNAME}Part::init()
+{
+// delayed initialization stuff goes here
+}
+
+void %{APPNAME}Part::setupActions()
+{
+// create XMLGUI actions here
+ action = new KAction(i18n("&Do Something..."), 0,
+ this, SLOT(doSomething()), actionCollection(), "plugin_action" );
+ action->setToolTip(i18n("Do something"));
+ action->setWhatsThis(i18n("<b>Do something</b><p>Describe here what does this action do."));
+}
+
+void %{APPNAME}Part::insertConfigWidget(const KDialogBase *dlg, QWidget *page, unsigned int pageNo)
+{
+// create configuraton dialogs here
+ switch (pageNo)
+ {
+ case GLOBALDOC_OPTIONS:
+ {
+ %{APPNAME}GlobalConfig *w = new %{APPNAME}GlobalConfig(this, page, "global config");
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ break;
+ }
+ case PROJECTDOC_OPTIONS:
+ {
+ %{APPNAME}ProjectConfig *w = new %{APPNAME}ProjectConfig(this, page, "project config");
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ break;
+ }
+ }
+}
+
+void %{APPNAME}Part::contextMenu(QPopupMenu *popup, const Context *context)
+{
+// put actions into the context menu here
+ if (context->hasType(Context::EditorContext))
+ {
+ // editor context menu
+ const EditorContext *econtext = static_cast<const EditorContext*>(context);
+
+ // use context and plug actions here
+ action->plug(popup);
+
+ // or create menu items on the fly
+ // int id = -1;
+ // id = popup->insertItem(i18n("Do Something Here"),
+ // this, SLOT(doSomething()) );
+ // popup->setWhatsThis(id, i18n("<b>Do something here</b><p>Describe here what does this action do."
+ }
+ else if (context->hasType(Context::FileContext))
+ {
+ // file context menu
+ const FileContext *fcontext = static_cast<const FileContext*>(context);
+
+ //use context and plug actions here
+ }
+ else if (context->hasType(Context::ProjectModelItemContext))
+ {
+ // project tree context menu
+ const ProjectModelItemContext *pcontext = static_cast<const ProjectModelItemContext*>(context);
+
+ // use context and plug actions here
+ }
+ else if (context->hasType(Context::CodeModelItemContext))
+ {
+ // class tree context menu
+ const CodeModelItemContext *mcontext = static_cast<const CodeModelItemContext*>(context);
+
+ // use context and plug actions here
+ }
+ else if (context->hasType(Context::DocumentationContext))
+ {
+ // documentation viewer context menu
+ const DocumentationContext *dcontext = static_cast<const DocumentationContext*>(context);
+
+ // use context and plug actions here
+ }
+}
+
+void %{APPNAME}Part::projectOpened()
+{
+// do something when the project is opened
+}
+
+void %{APPNAME}Part::projectClosed()
+{
+// do something when the project is closed
+}
+
+void %{APPNAME}Part::doSomething()
+{
+// do something useful here instead of showing the message box
+ KMessageBox::information(m_widget, i18n("This action does nothing."), i18n("%{APPNAME} Plugin"));
+}
+
+#include "%{APPNAMELC}part.moc"
diff --git a/languages/cpp/app_templates/kdevpart2/kdevpart_part.h b/languages/cpp/app_templates/kdevpart2/kdevpart_part.h
new file mode 100644
index 00000000..168b8a40
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/kdevpart_part.h
@@ -0,0 +1,45 @@
+%{H_TEMPLATE}
+#ifndef KDEV%{APPNAMEUC}_H
+#define KDEV%{APPNAMEUC}_H
+
+#include <kdevplugin.h>
+
+#include <qguardedptr.h>
+
+class QPopupMenu;
+class KAction;
+class KDialogBase;
+class Context;
+class ConfigWidgetProxy;
+class %{APPNAME}Widget;
+
+/**
+Please read the README.dox file for more info about this part
+*/
+class %{APPNAME}Part: public KDevPlugin
+{
+ Q_OBJECT
+public:
+ %{APPNAME}Part(QObject *parent, const char *name, const QStringList &args);
+ ~%{APPNAME}Part();
+
+private slots:
+ void init();
+
+ void insertConfigWidget(const KDialogBase *dlg, QWidget *page, unsigned int pageNo);
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void projectOpened();
+ void projectClosed();
+
+ void doSomething();
+
+private:
+ void setupActions();
+
+ KAction *action;
+
+ QGuardedPtr<%{APPNAME}Widget> m_widget;
+ ConfigWidgetProxy *m_configProxy;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kdevpart2/kdevpart_part.rc b/languages/cpp/app_templates/kdevpart2/kdevpart_part.rc
new file mode 100644
index 00000000..a38ee14e
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/kdevpart_part.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="%{APPNAMELC}" library="lib%{APPNAMELC}plugin" version="1">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="plugin_action"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar">
+ <Action name="plugin_action"/>
+</ToolBar>
+</kpartplugin>
diff --git a/languages/cpp/app_templates/kdevpart2/kdevpart_widget.cpp b/languages/cpp/app_templates/kdevpart2/kdevpart_widget.cpp
new file mode 100644
index 00000000..0c05b976
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/kdevpart_widget.cpp
@@ -0,0 +1,21 @@
+%{CPP_TEMPLATE}
+#include "%{APPNAMELC}widget.h"
+
+#include <kurl.h>
+#include <klibloader.h>
+#include <kparts/part.h>
+
+#include <kdevcore.h>
+
+#include "%{APPNAMELC}part.h"
+
+%{APPNAME}Widget::%{APPNAME}Widget(%{APPNAME}Part *part)
+ : QWidget(0, "%{APPNAMELC} widget"), m_part(part)
+{
+}
+
+%{APPNAME}Widget::~%{APPNAME}Widget()
+{
+}
+
+#include "%{APPNAMELC}widget.moc"
diff --git a/languages/cpp/app_templates/kdevpart2/kdevpart_widget.h b/languages/cpp/app_templates/kdevpart2/kdevpart_widget.h
new file mode 100644
index 00000000..e29e29d2
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/kdevpart_widget.h
@@ -0,0 +1,23 @@
+%{H_TEMPLATE}
+#ifndef %{APPNAMEUC}_WIDGET_H
+#define %{APPNAMEUC}_WIDGET_H
+
+#include <qwidget.h>
+#include <qstring.h>
+
+class KDevProject;
+class %{APPNAME}Part;
+
+class %{APPNAME}Widget: public QWidget
+{
+ Q_OBJECT
+public:
+ %{APPNAME}Widget(%{APPNAME}Part *part);
+ ~%{APPNAME}Widget();
+
+private:
+ %{APPNAME}Part *m_part;
+};
+
+
+#endif
diff --git a/languages/cpp/app_templates/kdevpart2/projectconfig.cpp b/languages/cpp/app_templates/kdevpart2/projectconfig.cpp
new file mode 100644
index 00000000..5f07993b
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/projectconfig.cpp
@@ -0,0 +1,15 @@
+%{CPP_TEMPLATE}
+#include "%{APPNAMELC}projectconfig.h"
+
+#include "%{APPNAMELC}part.h"
+
+%{APPNAME}ProjectConfig::%{APPNAME}ProjectConfig(%{APPNAME}Part *part, QWidget *parent, const char *name)
+ : %{APPNAME}ProjectConfigBase(parent, name), m_part(part)
+{
+}
+
+void %{APPNAME}ProjectConfig::accept()
+{
+}
+
+#include "%{APPNAMELC}projectconfig.moc"
diff --git a/languages/cpp/app_templates/kdevpart2/projectconfig.h b/languages/cpp/app_templates/kdevpart2/projectconfig.h
new file mode 100644
index 00000000..ec3ff4df
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/projectconfig.h
@@ -0,0 +1,22 @@
+%{H_TEMPLATE}
+#ifndef %{APPNAMEUC}_PROJECT_CONFIG_H
+#define %{APPNAMEUC}_PROJECT_CONFIG_H
+
+#include "%{APPNAMELC}projectconfigbase.h"
+
+class %{APPNAME}Part;
+
+class %{APPNAME}ProjectConfig: public %{APPNAME}ProjectConfigBase
+{
+ Q_OBJECT
+public:
+ %{APPNAME}ProjectConfig(%{APPNAME}Part *part, QWidget *parent = 0, const char *name = 0);
+
+public slots:
+ void accept();
+
+private:
+ %{APPNAME}Part *m_part;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kdevpart2/projectconfigbase.ui b/languages/cpp/app_templates/kdevpart2/projectconfigbase.ui
new file mode 100644
index 00000000..c733a774
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/projectconfigbase.ui
@@ -0,0 +1,20 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>%{APPNAME}ProjectConfigBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>%{APPNAME}ProjectConfigBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>%{APPNAME}</string>
+ </property>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kdevpart2/src-Makefile.am b/languages/cpp/app_templates/kdevpart2/src-Makefile.am
new file mode 100644
index 00000000..dded12c0
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/src-Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES = -I$(kde_includes)/kdevelop/interfaces -I$(kde_includes)/kdevelop/util $(all_includes)
+
+kde_module_LTLIBRARIES = libkdev%{APPNAMELC}.la
+libkdev%{APPNAMELC}_la_LDFLAGS = -module -avoid-version -no-undefined $(all_libraries) $(KDE_PLUGIN)
+libkdev%{APPNAMELC}_la_LIBADD = -lkdevelop
+libkdev%{APPNAMELC}_la_SOURCES = %{APPNAMELC}part.cpp %{APPNAMELC}widget.cpp %{APPNAMELC}globalconfigbase.ui %{APPNAMELC}globalconfig.cpp %{APPNAMELC}projectconfigbase.ui %{APPNAMELC}projectconfig.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdev%{APPNAMELC}.desktop
+
+rcdir = $(kde_datadir)/kdev%{APPNAMELC}
+rc_DATA = kdev%{APPNAMELC}.rc
+
+appsharedir = $(kde_datadir)/kdev%{APPNAMELC}
+appshare_DATA =
diff --git a/languages/cpp/app_templates/kdevpart2/subdirs b/languages/cpp/app_templates/kdevpart2/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kdevpart2/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kfileplugin/.kdev_ignore b/languages/cpp/app_templates/kfileplugin/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/.kdev_ignore
diff --git a/languages/cpp/app_templates/kfileplugin/Makefile.am b/languages/cpp/app_templates/kfileplugin/Makefile.am
new file mode 100644
index 00000000..9ac8003d
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = README.devel kfile_plugin.cpp kfile_plugin.desktop \
+ kfile_plugin.h plugin.kdevelop kfileplugin kfileplugin.png \
+ src-Makefile.am subdirs
+templateName = kfileplugin
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kfileplugin/README.devel b/languages/cpp/app_templates/kfileplugin/README.devel
new file mode 100644
index 00000000..21ee67c7
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/README.devel
@@ -0,0 +1,9 @@
+@todo:
+
+1. add information to src/kfile_%{APPNAMELC}.desktop
+MimeType=
+PreferredGroups=
+PreferredItems=
+
+2. plugin
+Note: Please change to "Optimized" compilation if you want to make a release.
diff --git a/languages/cpp/app_templates/kfileplugin/kfile_plugin.cpp b/languages/cpp/app_templates/kfileplugin/kfile_plugin.cpp
new file mode 100644
index 00000000..3e6b849a
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/kfile_plugin.cpp
@@ -0,0 +1,55 @@
+%{CPP_TEMPLATE}
+
+#include <config.h>
+#include "kfile_%{APPNAMELC}.h"
+
+#include <kgenericfactory.h>
+//#include <kio/global.h>
+
+//#include <qfileinfo.h>
+//#include <qdir.h>
+
+typedef KGenericFactory<%{APPNAME}Plugin> %{APPNAME}Factory;
+
+K_EXPORT_COMPONENT_FACTORY(kfile_%{APPNAME}, %{APPNAME}Factory( "kfile_%{APPNAMELC}" ))
+
+%{APPNAME}Plugin::%{APPNAME}Plugin(QObject *parent, const char *name,
+ const QStringList &args)
+ : KFilePlugin(parent, name, args)
+{
+ //add the mimetype here - example:
+ //KFileMimeTypeInfo* info = addMimeTypeInfo( "text/html" );
+ KFileMimeTypeInfo* info = addMimeTypeInfo( "text/html" );
+
+ // our new group
+ KFileMimeTypeInfo::GroupInfo* group = 0L;
+ group = addGroupInfo(info, "%{APPNAME}Info", i18n("%{APPNAME} Information"));
+
+ KFileMimeTypeInfo::ItemInfo* item;
+
+ // our new items in the group
+ item = addItemInfo(group, "Items", i18n("Items"), QVariant::Int);
+ item = addItemInfo(group, "Size", i18n("Size"), QVariant::Int);
+ setUnit(item, KFileMimeTypeInfo::KiloBytes);
+
+ // strings are possible, too:
+ //addItemInfo(group, "Text", i18n("Document Type"), QVariant::String);
+}
+
+bool %{APPNAME}Plugin::readInfo( KFileMetaInfo& info, uint /*what*/)
+{
+ KFileMetaInfoGroup group = appendGroup(info, "%{APPNAME}Info");
+
+ // add your "calculations" here
+ // if something goes wrong, "return false;"
+
+
+ // and finally display it!
+ appendItem(group, "Items", 100);
+ appendItem(group, "Size", int(5000/1024));
+
+ return true;
+}
+
+#include "kfile_%{APPNAMELC}.moc"
+
diff --git a/languages/cpp/app_templates/kfileplugin/kfile_plugin.desktop b/languages/cpp/app_templates/kfileplugin/kfile_plugin.desktop
new file mode 100644
index 00000000..9af8b5e9
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/kfile_plugin.desktop
@@ -0,0 +1,39 @@
+[Desktop Entry]
+Type=Service
+Name=%{APPNAME} Info
+Name[br]=Titouriñ diwar-benn %{APPNAME}
+Name[ca]=Informació per a %{APPNAME}
+Name[da]=%{APPNAME} info
+Name[el]=ΠληÏοφοÏίες %{APPNAME}
+Name[es]=Información de %{APPNAME}
+Name[et]=%{APPNAME} info
+Name[eu]=%{APPNAME} informazioa
+Name[fa]=اطلاعات %{APPNAME}
+Name[fr]=Informations sur %{APPNAME}
+Name[ga]=Eolas faoi %{APPNAME}
+Name[gl]=Información de %{APPNAME}
+Name[hu]=%{APPNAME} jellemzői
+Name[it]=Informazioni su %{APPNAME}
+Name[nds]=%{APPNAME}-Info
+Name[ne]=%{APPNAME} सूचना
+Name[pl]=Informacje dla %{APPNAME}
+Name[pt]=Informação do %{APPNAME}
+Name[pt_BR]=Informações de %{APPNAME}
+Name[ru]=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ %{APPNAME}
+Name[sk]=%{APPNAME} info
+Name[sl]=Informacije o %{APPNAME}
+Name[sr]=Информације за %{APPNAME}
+Name[sr@Latn]=Informacije za %{APPNAME}
+Name[sv]=%{APPNAME} information
+Name[ta]=%{APPNAME} தகவலà¯
+Name[tg]=Маълумот дар бораи %{APPNAME}
+Name[zh_CN]=%{APPNAME}çš„ä¿¡æ¯
+Name[zh_TW]=%{APPNAME} 資訊
+ServiceTypes=KFilePlugin
+X-KDE-Library=kfile_%{APPNAMELC}
+# change MimeType here! (example: inode/directory)
+MimeType=
+# change PreferredGroups here! (example: FolderInfo)
+PreferredGroups=
+# change PreferredItems here! (example: Items;Size)
+PreferredItems=
diff --git a/languages/cpp/app_templates/kfileplugin/kfile_plugin.h b/languages/cpp/app_templates/kfileplugin/kfile_plugin.h
new file mode 100644
index 00000000..358b4dcb
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/kfile_plugin.h
@@ -0,0 +1,24 @@
+%{H_TEMPLATE}
+
+#ifndef __KFILE_%{APPNAMEUC}_H__
+#define __KFILE_%{APPNAMEUC}_H__
+
+/**
+ * Note: For further information look into <$KDEDIR/include/kfilemetainfo.h>
+ */
+#include <kfilemetainfo.h>
+
+class QStringList;
+
+class %{APPNAME}Plugin: public KFilePlugin
+{
+ Q_OBJECT
+
+public:
+ %{APPNAME}Plugin( QObject *parent, const char *name, const QStringList& args );
+
+ virtual bool readInfo( KFileMetaInfo& info, uint what);
+};
+
+#endif // __KFILE_%{APPNAMEUC}_H__
+
diff --git a/languages/cpp/app_templates/kfileplugin/kfileplugin b/languages/cpp/app_templates/kfileplugin/kfileplugin
new file mode 100644
index 00000000..6717cdc2
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/kfileplugin
@@ -0,0 +1,8 @@
+# KDE Config File
+[General]
+Name=KFile plugin
+Icon=kfileplugin.png
+Category=C++/KDE
+Comment=Generates a KFile plugin for konqueror to display meta information.
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=README.devel,src/kfile_APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/kfileplugin/kfileplugin.kdevtemplate b/languages/cpp/app_templates/kfileplugin/kfileplugin.kdevtemplate
new file mode 100644
index 00000000..edff2fd4
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/kfileplugin.kdevtemplate
@@ -0,0 +1,166 @@
+# KDE Config File
+[General]
+Name=KFile plugin
+Name[br]=Lugent KFile
+Name[ca]=Connector KFile
+Name[de]=KFile-Modul
+Name[el]=ΠÏόσθετο KFile
+Name[es]=Complemento para KFile
+Name[et]=KFile'i plugin
+Name[eu]=KFile plugin-a
+Name[fa]=وصلۀ KFile
+Name[fr]=Module externe KFile
+Name[ga]=Breiseán KFile
+Name[gl]=Extensión para KFile
+Name[hu]=KFile-bővítőmodul
+Name[it]=Plugin KFile
+Name[ja]=KFile プラグイン
+Name[nds]=KFile-Moduul
+Name[ne]=केडीई फाइल पà¥à¤²à¤—इन
+Name[nl]=KFile-plugin
+Name[pl]=Wtyczka do KFile
+Name[pt]='Plugin' do KFile
+Name[pt_BR]='Plugin' do KFile
+Name[ru]=Модуль KFile
+Name[sk]=KFile modul
+Name[sl]=Vstavek za KFile
+Name[sr]=Прикључак за KFile
+Name[sr@Latn]=PrikljuÄak za KFile
+Name[sv]=KFile-insticksprogram
+Name[tr]=KFile Eklentisi
+Name[zh_CN]=KFile æ’件
+Name[zh_TW]=KFile 外掛程å¼
+Icon=kfileplugin.png
+Category=C++/KDE
+Comment=Generates a KFile plugin for konqueror to display meta information.
+Comment[ca]=Genera un connector KFile per al konqueror per a mostrar meta informació.
+Comment[da]=Genererer et KFile-plugin for konqueror til at vise meta-information.
+Comment[de]=Erstellt ein KFile-Modul für Konqueror zur Anzeige von Meta-Daten.
+Comment[el]=ΔημιουÏγεί ένα Ï€Ïόσθετο KFile για την εμφάνιση μεταπληÏοφοÏιών στον konqueror.
+Comment[es]=Genera un complemento de KFile para Konqueror que muestra metainformación.
+Comment[et]=Konquerori KFile'i plugina loomine, mis näitab metainfot.
+Comment[eu]=Meta-informazioa bistaratzeko Konqueror-en KFile plugin bat sortzen du.
+Comment[fa]=یک وصلۀ KFile برای konqueror جهت نمایش Ùرااطلاعات تولید می‌کند.
+Comment[fr]=Génère un module externe KFile pour que Konqueror affiche des méta-informations.
+Comment[gl]=Xera unha extensión para KFile para permitir a konqueror mostrar metainformación.
+Comment[hu]=Létrehoz egy KFile-bővítőmodult, mellyel a Konquerorban dokumentumjellemzőket lehet megjeleníteni.
+Comment[it]=Genera un plugin KFile per Konqueror per mostrare meta informazioni.
+Comment[nds]=Stellt en KFile-Moduul för Konqueror op, dat Metadaten wiest.
+Comment[ne]=मेटा सूचना देखाउन कनà¥à¤•à¥à¤µà¥‡à¤°à¤°à¤•à¤¾ लागि केडीई फाइल पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een KFile-plugin voor konqueror voor het weergeven van meta-informatie.
+Comment[pl]=Generuje wtyczkę KFile dla Konquerora do wyświetlania informacji meta.
+Comment[pt]=Gera um 'plugin' do KFile para o Konqueror poder mostrar meta-informações.
+Comment[pt_BR]=Gera um 'plugin' do KFile para o Konqueror poder mostrar meta-informações.
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ KFile Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° метаданных в Konqueror.
+Comment[sk]=Vygeneruje KFile modul pre konqueror na zobrazenie meta informácií.
+Comment[sr]=Прави прикључак за KFile за приказ метаинформација у Konqueror-у.
+Comment[sr@Latn]=Pravi prikljuÄak za KFile za prikaz metainformacija u Konqueror-u.
+Comment[sv]=Skapar ett KFile-insticksprogram till Konqueror för att visa metainformation.
+Comment[tr]=Meta bilgisini göstermesi için Konqueror'a bir KFile eklentisi yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªå¯æ˜¾ç¤ºå…ƒä¿¡æ¯çš„ Konqueror KFile æ’件。
+Comment[zh_TW]=產生一個 Konqueror çš„ KFile 外掛程å¼ï¼Œé¡¯ç¤ºä¸­ç¹¼è³‡è¨Š
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=${dest}/README.devel,%{dest}/src/kfile_%{APPNAMELC}.cpp
+Archive=kfileplugin.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/plugin.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/kfile_plugin.desktop
+Dest=%{dest}/src/kfile_%{APPNAMELC}.desktop
+
+[FILE13]
+Type=install
+Source=%{src}/kfile_plugin.cpp
+Dest=%{dest}/src/kfile_%{APPNAMELC}.cpp
+
+[FILE14]
+Type=install
+Source=%{src}/kfile_plugin.h
+Dest=%{dest}/src/kfile_%{APPNAMELC}.h
+
+[FILE15]
+Type=install
+Source=%{src}/README.devel
+Dest=%{dest}/README.devel
+
diff --git a/languages/cpp/app_templates/kfileplugin/kfileplugin.png b/languages/cpp/app_templates/kfileplugin/kfileplugin.png
new file mode 100644
index 00000000..d2a56245
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/kfileplugin.png
Binary files differ
diff --git a/languages/cpp/app_templates/kfileplugin/plugin.kdevelop b/languages/cpp/app_templates/kfileplugin/plugin.kdevelop
new file mode 100644
index 00000000..a95b52f9
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/plugin.kdevelop
@@ -0,0 +1,114 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+<kdevautoproject>
+ <general>
+ <activetarget>src/kfile_%{APPNAMELC}.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kfileplugin/src-Makefile.am b/languages/cpp/app_templates/kfileplugin/src-Makefile.am
new file mode 100644
index 00000000..48ac1c66
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/src-Makefile.am
@@ -0,0 +1,22 @@
+## Makefile.am for folder file meta info plugin
+
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = kfile_%{APPNAMELC}.h
+
+kde_module_LTLIBRARIES = kfile_%{APPNAMELC}.la
+
+kfile_%{APPNAMELC}_la_SOURCES = kfile_%{APPNAMELC}.cpp
+kfile_%{APPNAMELC}_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kfile_%{APPNAMELC}_la_LIBADD = $(LIB_KIO)
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+services_DATA = kfile_%{APPNAMELC}.desktop
+servicesdir = $(kde_servicesdir)
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kfile_%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/kfileplugin/subdirs b/languages/cpp/app_templates/kfileplugin/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kfileplugin/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/khello/.kdev_ignore b/languages/cpp/app_templates/khello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/khello/.kdev_ignore
diff --git a/languages/cpp/app_templates/khello/Makefile.am b/languages/cpp/app_templates/khello/Makefile.am
new file mode 100644
index 00000000..6f788f99
--- /dev/null
+++ b/languages/cpp/app_templates/khello/Makefile.am
@@ -0,0 +1,18 @@
+# all khello data files
+dataFiles = src-Makefile.am app.cpp app.h main.cpp appui.rc app.kdevelop \
+ subdirs app.desktop khello.png
+templateName = khello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/khello/app.cpp b/languages/cpp/app_templates/khello/app.cpp
new file mode 100644
index 00000000..44332685
--- /dev/null
+++ b/languages/cpp/app_templates/khello/app.cpp
@@ -0,0 +1,23 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+
+#include <qlabel.h>
+
+#include <kmainwindow.h>
+#include <klocale.h>
+
+%{APPNAME}::%{APPNAME}()
+ : KMainWindow( 0, "%{APPNAME}" )
+{
+ // set the shell's ui resource file
+ setXMLFile("%{APPNAMELC}ui.rc");
+
+ new QLabel( "Hello World", this, "hello label" );
+}
+
+%{APPNAME}::~%{APPNAME}()
+{
+}
+
+#include "%{APPNAMELC}.moc"
diff --git a/languages/cpp/app_templates/khello/app.desktop b/languages/cpp/app_templates/khello/app.desktop
new file mode 100644
index 00000000..8b36e6e0
--- /dev/null
+++ b/languages/cpp/app_templates/khello/app.desktop
@@ -0,0 +1,40 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+Icon=%{APPNAMELC}
+Type=Application
+Comment=A simple KDE Application
+Comment[br]=Ur meziant eeun evit KDE
+Comment[ca]=Una simple aplicació per al KDE
+Comment[da]=Et simpelt KDE program
+Comment[de]=Eine einfache KDE-Anwendung
+Comment[el]=Μια απλή εφαÏμογή του KDE
+Comment[es]=Una aplicación de KDE sencilla
+Comment[et]=Lihtne KDE rakendus
+Comment[eu]=KDE aplikazio simple bat
+Comment[fa]=یک کاربرد سادۀ KDE
+Comment[fr]=Une application simple pour KDE
+Comment[ga]=Feidhmchlár Simplí KDE
+Comment[gl]=Unha aplicación KDE sinxela
+Comment[hi]=à¤à¤• सादा केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=Egyszerű KDE-alkalmazás
+Comment[is]=Einfalt KDE forrit
+Comment[it]=Una semplice applicazione KDE
+Comment[ja]=ç°¡å˜ãª KDE アプリケーション
+Comment[nds]=En eenfach KDE-Programm
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een eenvoudige KDE-toepassing
+Comment[pl]=Prosty program KDE
+Comment[pt]=Uma aplicação simples do KDE
+Comment[pt_BR]=Um simples Aplicativo do KDE
+Comment[ru]=ПроÑтое приложение KDE
+Comment[sk]=Jednoduchá KDE aplikácia
+Comment[sl]=Preprost program za KDE
+Comment[sr]=ЈедноÑтаван KDE програм
+Comment[sr@Latn]=Jednostavan KDE program
+Comment[sv]=Ett enkelt KDE-program
+Comment[ta]=ஒர௠சாதாரண கெடிஇ பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Гузориши оддиKDE
+Comment[tr]=Basit bir KDE Uygulaması
+Comment[zh_CN]=一个简å•çš„ KDE 应用程åº
+Comment[zh_TW]=簡單的 KDE 應用程å¼
diff --git a/languages/cpp/app_templates/khello/app.h b/languages/cpp/app_templates/khello/app.h
new file mode 100644
index 00000000..678df7a3
--- /dev/null
+++ b/languages/cpp/app_templates/khello/app.h
@@ -0,0 +1,32 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kmainwindow.h>
+
+/**
+ * @short Application Main Window
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAME} : public KMainWindow
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ %{APPNAME}();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~%{APPNAME}();
+};
+
+#endif // _%{APPNAMEUC}_H_
diff --git a/languages/cpp/app_templates/khello/app.kdevelop b/languages/cpp/app_templates/khello/app.kdevelop
new file mode 100644
index 00000000..7e6cf8da
--- /dev/null
+++ b/languages/cpp/app_templates/khello/app.kdevelop
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/khello/appui.rc b/languages/cpp/app_templates/khello/appui.rc
new file mode 100644
index 00000000..ceb4f14e
--- /dev/null
+++ b/languages/cpp/app_templates/khello/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="custom"><text>C&amp;ustom</text>
+ <Action name="custom_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/khello/khello.kdevtemplate b/languages/cpp/app_templates/khello/khello.kdevtemplate
new file mode 100644
index 00000000..e401fa5d
--- /dev/null
+++ b/languages/cpp/app_templates/khello/khello.kdevtemplate
@@ -0,0 +1,220 @@
+# KDE Config File
+[General]
+Name=Simple KDE Application
+Name[ca]=Una simple aplicació per al KDE
+Name[da]=Et simpelt KDE program
+Name[de]=Einfache KDE-Anwendung
+Name[el]=Απλή εφαÏμογή του KDE
+Name[es]=Aplicación de KDE sencilla
+Name[et]=Lihtne KDE rakendus
+Name[eu]=KDE aplikazio simple bat
+Name[fa]=کاربرد سادۀ KDE
+Name[fr]=Application KDE simple
+Name[ga]=Feidhmchlár Simplí KDE
+Name[gl]=Aplicación KDE sinxela
+Name[hu]=Egyszerű KDE-s alkalmazás
+Name[it]=Una semplice applicazione KDE
+Name[ja]=ç°¡å˜ãª KDE アプリケーション
+Name[nds]=Eenfach KDE-Programm
+Name[ne]=साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Eenvoudige KDE-toepassing
+Name[pl]=Prosty program dla KDE
+Name[pt]=Aplicação Simples do KDE
+Name[pt_BR]=Aplicação Simples do KDE
+Name[ru]=ПроÑтое приложение KDE
+Name[sk]=Jednoduchá KDE aplikácia
+Name[sl]=Preprost program za KDE
+Name[sr]=ЈедноÑтаван KDE програм
+Name[sr@Latn]=Jednostavan KDE program
+Name[sv]=Enkelt KDE-program
+Name[tr]=Basit KDE Uygulaması
+Name[zh_CN]=简å•çš„ KDE 应用程åº
+Name[zh_TW]=簡單的 KDE 應用程å¼
+Category=C++/KDE
+Icon=khello.png
+Comment=Generates a simple KDE application with one widget.
+Comment[ca]=Genera una simple aplicació per al KDE amb un estri.
+Comment[da]=Genererer et simpelt KDE program men en kontrol
+Comment[de]=Erstellt eine einfache KDE-Anwendung mit einem Oberflächenelement
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή KDE με ένα γÏαφικό συστατικό.
+Comment[es]=Genera una sencilla aplicación para KDE con una ventana.
+Comment[et]=Lihtsa KDE rakenduse loomine ühe vidinaga.
+Comment[eu]=Trepeta bakarra duen KDE aplikazio simple bat sortzen du.
+Comment[fa]=یک کاربرد سادۀ KDE با یک عنصر تولید می‌کند.
+Comment[fr]=Génère une application KDE simple comprenant un seul élément graphique (widget).
+Comment[ga]=Cruthaíonn sé seo feidhmchlár simplí KDE le giuirléid amháin.
+Comment[gl]=Xera unha aplicación KDE sinxela con un compoñente.
+Comment[hu]=Létrehoz egy egyszerű KDE-s alkalmazást, egy grafikus elemmel.
+Comment[it]=Genera una semplice applicazione KDE senza elementi grafici.
+Comment[ja]=ウィジェットを一ã¤å«ã‚“ã ç°¡å˜ãª KDE アプリケーションを作æˆã—ã¾ã™ã€‚
+Comment[nds]=Stellt en eenfach KDE-Programm mit een Element op.
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ विगेटसà¤à¤— साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een eenvoudige KDE-toepassing met één widget.
+Comment[pl]=Generuje prosty program dla KDE z jednym widgetem.
+Comment[pt]=Gera uma aplicação simples para o KDE com uma janela.
+Comment[pt_BR]=Gera uma aplicação simples para o KDE com uma janela.
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE Ñ Ð¾Ð´Ð½Ð¸Ð¼ окном.
+Comment[sk]=Vygeneruje jednoduchú KDE aplikáciu s jedným oknom.
+Comment[sl]=Ustvari preprost program za KDE z enim gradnikom.
+Comment[sr]=Прави једноÑтаван KDE програм Ñа једном контролом.
+Comment[sr@Latn]=Pravi jednostavan KDE program sa jednom kontrolom.
+Comment[sv]=Skapar ett enkelt KDE-program med en grafisk komponent.
+Comment[tr]=Tek parçacıklı basit bir KDE uygulaması yaratır.
+Comment[zh_CN]=生æˆåªæœ‰ä¸€ä¸ªéƒ¨ä»¶çš„ KDE 应用程åºã€‚
+Comment[zh_TW]=產生一個簡單的 KDE 應用程å¼ï¼Œå…§å«ä¸€å€‹å…ƒä»¶
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=khello.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE9]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[FILE13]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE14]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE15]
+Type=install
+Source=%{src}/app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE16]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE17]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE18]
+Type=install
+Source=%{src}/app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[MSG]
+Type=message
+Comment=A KDE Hello world program was created in %{dest}
+Comment[ca]=Un programa de Hello world per al KDE ha estat creat en %{dest}
+Comment[da]=Et KDE Goddag verden program blev oprettet i %{dest}
+Comment[de]=Ein KDE-"Hello World"-Programm wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€ÏόγÏαμμα Γεια σου Κόσμε του KDE δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un programa «Hola mundo» para KDE ha sido creado en %{dest}
+Comment[et]=KDE "Tere, maailm" programm loodi asukohta %{dest}
+Comment[eu]=KDE-ren "Kaixo mundua" programa bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامۀ KDE Hello world در %{dest} ایجاد شد
+Comment[fr]=Un programme KDE « Bonjour monde » a été créé dans %{dest}
+Comment[ga]=Cruthaíodh ríomhchlár "Hello World" KDE i %{dest}
+Comment[gl]=Creouse un programa KDE Ola mundo en %{dest}
+Comment[hu]=Létrejött egy KDE Hello world program itt: %{dest}
+Comment[it]=È stato creato un semplice programma KDE di "Hello world" in %{dest}
+Comment[ja]=KDE Hello world プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en "Moin Welt"-Programm för KDE opstellt
+Comment[ne]=केडीई हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een KDE Hello World-programma is aangemaakt in %{dest}
+Comment[pl]=Program 'Witaj świecie' dla KDE został utworzony w %{dest}
+Comment[pt]=Foi criado um programa Olá Mundo do KDE em %{dest}
+Comment[pt_BR]=Foi criado um programa Olá Mundo do KDE em %{dest}
+Comment[ru]=Приложение KDE Hello world Ñоздано в %{dest}
+Comment[sk]=KDE Ahoj svet program bol vytvorený v %{dest}
+Comment[sl]=Program Hello World za KDE je bil ustvarjen v %{dest}
+Comment[sr]=KDE „Здраво Ñвете“ програм направљен је у %{dest}
+Comment[sr@Latn]=KDE „Zdravo svete“ program napravljen je u %{dest}
+Comment[sv]=Ett KDE Hello world-program skapades i %{dest}
+Comment[tr]=Bir KDE Merhaba Dünya programı %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了 KDE Hello world 程åº
+Comment[zh_TW]=一個 KDE Hello World 程å¼å·²å»ºç«‹æ–¼ %{dest}
+
diff --git a/languages/cpp/app_templates/khello/khello.png b/languages/cpp/app_templates/khello/khello.png
new file mode 100644
index 00000000..9fe493f5
--- /dev/null
+++ b/languages/cpp/app_templates/khello/khello.png
Binary files differ
diff --git a/languages/cpp/app_templates/khello/main.cpp b/languages/cpp/app_templates/khello/main.cpp
new file mode 100644
index 00000000..da7c5335
--- /dev/null
+++ b/languages/cpp/app_templates/khello/main.cpp
@@ -0,0 +1,51 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static const char description[] =
+ I18N_NOOP("A KDE KPart Application");
+
+static const char version[] = "%{VERSION}";
+
+static KCmdLineOptions options[] =
+{
+// { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", 0, 0, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions( options );
+ KApplication app;
+ %{APPNAME} *mainWin = 0;
+
+ if (app.isRestored())
+ {
+ RESTORE(%{APPNAME});
+ }
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ /// @todo do something with the command line args here
+
+ mainWin = new %{APPNAME}();
+ app.setMainWidget( mainWin );
+ mainWin->show();
+
+ args->clear();
+ }
+
+ // mainWin has WDestructiveClose flag by default, so it will delete itself.
+ return app.exec();
+}
+
diff --git a/languages/cpp/app_templates/khello/src-Makefile.am b/languages/cpp/app_templates/khello/src-Makefile.am
new file mode 100644
index 00000000..d9ac7c7a
--- /dev/null
+++ b/languages/cpp/app_templates/khello/src-Makefile.am
@@ -0,0 +1,35 @@
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = %{APPNAMELC}.h
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
+
+KDE_ICON = AUTO
+
+#########################################################################
+# APPLICATION SECTION
+#########################################################################
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# the application source, library search path, and link libraries
+%{APPNAMELC}_SOURCES = main.cpp %{APPNAMELC}.cpp
+%{APPNAMELC}_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+%{APPNAMELC}_LDADD = $(LIB_KDEUI)
+
+# this is where the desktop file will go
+shelldesktopdir = $(kde_appsdir)/Utilities
+shelldesktop_DATA = %{APPNAMELC}.desktop
+
+# this is where the shell's XML-GUI resource file goes
+shellrcdir = $(kde_datadir)/%{APPNAMELC}
+shellrc_DATA = %{APPNAMELC}ui.rc
+
diff --git a/languages/cpp/app_templates/khello/subdirs b/languages/cpp/app_templates/khello/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/khello/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/khello2/.kdev_ignore b/languages/cpp/app_templates/khello2/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/.kdev_ignore
diff --git a/languages/cpp/app_templates/khello2/Makefile.am b/languages/cpp/app_templates/khello2/Makefile.am
new file mode 100644
index 00000000..8ac1b18d
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = src-Makefile.am app.cpp app.h main.cpp appui.rc app.kdevelop \
+ subdirs app.desktop khello2.png widget.cpp widget.h widgetbase.ui
+
+templateName = khello2
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/khello2/app.cpp b/languages/cpp/app_templates/khello2/app.cpp
new file mode 100644
index 00000000..948a98fc
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/app.cpp
@@ -0,0 +1,19 @@
+%{CPP_TEMPLATE}
+
+#include <kmainwindow.h>
+#include <klocale.h>
+
+#include "%{APPNAMELC}.h"
+#include "%{APPNAMELC}widget.h"
+
+%{APPNAME}::%{APPNAME}()
+ : KMainWindow( 0, "%{APPNAME}" )
+{
+ setCentralWidget( new %{APPNAME}Widget( this ) );
+}
+
+%{APPNAME}::~%{APPNAME}()
+{
+}
+
+#include "%{APPNAMELC}.moc"
diff --git a/languages/cpp/app_templates/khello2/app.desktop b/languages/cpp/app_templates/khello2/app.desktop
new file mode 100644
index 00000000..8b36e6e0
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/app.desktop
@@ -0,0 +1,40 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+Icon=%{APPNAMELC}
+Type=Application
+Comment=A simple KDE Application
+Comment[br]=Ur meziant eeun evit KDE
+Comment[ca]=Una simple aplicació per al KDE
+Comment[da]=Et simpelt KDE program
+Comment[de]=Eine einfache KDE-Anwendung
+Comment[el]=Μια απλή εφαÏμογή του KDE
+Comment[es]=Una aplicación de KDE sencilla
+Comment[et]=Lihtne KDE rakendus
+Comment[eu]=KDE aplikazio simple bat
+Comment[fa]=یک کاربرد سادۀ KDE
+Comment[fr]=Une application simple pour KDE
+Comment[ga]=Feidhmchlár Simplí KDE
+Comment[gl]=Unha aplicación KDE sinxela
+Comment[hi]=à¤à¤• सादा केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=Egyszerű KDE-alkalmazás
+Comment[is]=Einfalt KDE forrit
+Comment[it]=Una semplice applicazione KDE
+Comment[ja]=ç°¡å˜ãª KDE アプリケーション
+Comment[nds]=En eenfach KDE-Programm
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een eenvoudige KDE-toepassing
+Comment[pl]=Prosty program KDE
+Comment[pt]=Uma aplicação simples do KDE
+Comment[pt_BR]=Um simples Aplicativo do KDE
+Comment[ru]=ПроÑтое приложение KDE
+Comment[sk]=Jednoduchá KDE aplikácia
+Comment[sl]=Preprost program za KDE
+Comment[sr]=ЈедноÑтаван KDE програм
+Comment[sr@Latn]=Jednostavan KDE program
+Comment[sv]=Ett enkelt KDE-program
+Comment[ta]=ஒர௠சாதாரண கெடிஇ பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Гузориши оддиKDE
+Comment[tr]=Basit bir KDE Uygulaması
+Comment[zh_CN]=一个简å•çš„ KDE 应用程åº
+Comment[zh_TW]=簡單的 KDE 應用程å¼
diff --git a/languages/cpp/app_templates/khello2/app.h b/languages/cpp/app_templates/khello2/app.h
new file mode 100644
index 00000000..678df7a3
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/app.h
@@ -0,0 +1,32 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kmainwindow.h>
+
+/**
+ * @short Application Main Window
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAME} : public KMainWindow
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ %{APPNAME}();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~%{APPNAME}();
+};
+
+#endif // _%{APPNAMEUC}_H_
diff --git a/languages/cpp/app_templates/khello2/app.kdevelop b/languages/cpp/app_templates/khello2/app.kdevelop
new file mode 100644
index 00000000..43425791
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/app.kdevelop
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>GccOptions</ccompiler>
+ <cxxcompiler>GppOptions</cxxcompiler>
+ <f77compiler>G77Options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>GccOptions</ccompiler>
+ <cxxcompiler>GppOptions</cxxcompiler>
+ <f77compiler>G77Options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/khello2/appui.rc b/languages/cpp/app_templates/khello2/appui.rc
new file mode 100644
index 00000000..ceb4f14e
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="custom"><text>C&amp;ustom</text>
+ <Action name="custom_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/khello2/khello2.kdevtemplate b/languages/cpp/app_templates/khello2/khello2.kdevtemplate
new file mode 100644
index 00000000..479d7496
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/khello2.kdevtemplate
@@ -0,0 +1,230 @@
+# KDE Config File
+[General]
+Name=Simple Designer based KDE Application
+Name[ca]=Simple aplicació per al KDE basada en el dissenyador
+Name[da]=Simpelt Designer-baseret KDE program
+Name[de]=Einfache, auf Designer basierende KDE-Anwendung
+Name[el]=Απλή εφαÏμογή KDE βασισμένη στο σχεδιαστή
+Name[es]=Aplicación para KDE sencilla basada en el diseñador
+Name[et]=Lihtne KDE rakendus Disaineri põhjal
+Name[eu]=Designer-en oinarritutako KDE aplikazio simple bat
+Name[fa]=کاربرد KDE بر مبنای طراح ساده
+Name[fr]=Application KDE simple basée sur Designer
+Name[gl]=Aplicación KDE sinxela baseada no deseñador
+Name[hu]=Egyszerű Qt Designer-alapú KDE-s alkalmazás
+Name[it]=Una semplice applicazione KDE basata su designer
+Name[ja]=Designer ベースã®ç°¡å˜ãª KDE アプリケーション
+Name[nds]=Eenfach, op "Designer" opbuut KDE-Programm
+Name[ne]=साधारण डिजाइनरमा आधारित केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Eenvoudige Designer-gebaseerde KDE-toepassing
+Name[pl]=Prosty program dla KDE wykonany w Designerze
+Name[pt]=Aplicação Simples do KDE baseada no Qt Designer
+Name[pt_BR]=Aplicação Simples do KDE baseada no Qt Designer
+Name[ru]=ПроÑтое приложение KDE Ñ Ñ„Ð¾Ñ€Ð¼Ð¾Ð¹
+Name[sk]=Jednoduchý dizajnér založený na KDE aplikácii
+Name[sr]=ЈедноÑтаван KDE програм на оÑнову Designer-а
+Name[sr@Latn]=Jednostavan KDE program na osnovu Designer-a
+Name[sv]=Enkelt KDE-program baserat på Designer
+Name[tr]=Basit Designer tabanlı KDE Uygulaması
+Name[zh_CN]=åŸºäºŽè®¾è®¡å¸ˆçš„ç®€å• KDE 应用程åº
+Name[zh_TW]=簡單的設計器 KDE 應用程å¼
+Category=C++/KDE
+Icon=khello2.png
+Comment=Generates a simple KDE application with one Qt-designer based widget.
+Comment[ca]=Genera una simple aplicació per al KDE basada en el dissenyador de Qt.
+Comment[da]=Genererer et simpelt KDE program med en Qt-designer baseret kontrol.
+Comment[de]=Erstellt eine einfache KDE-Anwendung mit einem auf Qt-Designer basierenden Widget.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή KDE με ένα γÏαφικό συστατικό βασισμένο στο σχεδιαστή Qt.
+Comment[es]=Genera una sencilla aplicación para KDE con una ventana basada en Qt-designer.
+Comment[et]=Lihtsa KDE rakenduse loomine ühe vidinaga Qt Disaineri põhjal.
+Comment[eu]=Qt Designer-en oinarritutako trepeta bat duen KDE aplikazio sinple bat sortzen du.
+Comment[fa]=یک کاربرد سادۀ KDE با یک عنصر مبنای طراح Qt تولید می‌کند.
+Comment[fr]=Génère une application KDE simple comprenant un seul élément graphique (widget) basé sur Qt-designer.
+Comment[ga]=Cruthaíonn sé seo feidhmchlár simplí KDE le giuirléid amháin bunaithe ar Qt-Designer
+Comment[gl]=Xera unha aplicación KDE sinxela cunha compoñente baseada en Qt-designer.
+Comment[hu]=Létrehoz egy egyszerű KDE-s alkalmazást, mely egy Qt Designerrel készített grafikus elemre épül.
+Comment[it]=Genera una semplice applicazione KDE con un elemento grafico basato su Qt-designer.
+Comment[nds]=Stellt en eenfach KDE-Programm mit een op Qt-Designer opbuut Element op.
+Comment[ne]=कà¥à¤¯à¥‚ टी डिजाइनरमा आधारित विगेटसà¤à¤— साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een eenvoudige KDE-toepassing met één Qt-Designer-gebaseerde widget.
+Comment[pl]=Generuje prosty program dla KDE z jednym widgetem pochodzÄ…cym z Qt Designera.
+Comment[pt]=Gera uma aplicação simples do KDE com uma interface baseada no Qt-designer.
+Comment[pt_BR]=Gera uma aplicação simples do KDE com uma interface baseada no Qt-designer.
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE Ñ Ñ„Ð¾Ñ€Ð¼Ð¾Ð¹, Ñозданной в Qt Designer.
+Comment[sk]=Vygeneruje jednoduchú KDE aplikáciu s jedným oknom Qt dizajnéra.
+Comment[sr]=Прави једноÑтаван KDE програма Ñа једном контролом на оÑнову Qt-Designer-а.
+Comment[sr@Latn]=Pravi jednostavan KDE programa sa jednom kontrolom na osnovu Qt-Designer-a.
+Comment[sv]=Skapar ett enkelt KDE-program med en grafisk komponent baserad på Qt-Designer.
+Comment[tr]=Qt-designer tabanlı bir parçacığı olan basit bir KDE uygulaması yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªå¸¦ä¸€ä¸ªåŸºäºŽ Qt è®¾è®¡å¸ˆéƒ¨ä»¶çš„ç®€å• KDE 应用程åºã€‚
+Comment[zh_TW]=產生一個簡單的 KDE 應用程å¼ï¼Œå…§å« Qt 設計器的元件
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=khello2.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE9]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[FILE13]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE14]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE15]
+Type=install
+Source=%{src}/app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE16]
+Type=install
+Source=%{src}/widget.cpp
+Dest=%{dest}/src/%{APPNAMELC}widget.cpp
+
+[FILE17]
+Type=install
+Source=%{src}/widget.h
+Dest=%{dest}/src/%{APPNAMELC}widget.h
+
+[FILE18]
+Type=install
+EscapeXML=true
+Source=%{src}/widgetbase.ui
+Dest=%{dest}/src/%{APPNAMELC}widgetbase.ui
+
+[FILE19]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE20]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE21]
+Type=install
+Source=%{src}/app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[MSG]
+Type=message
+Comment=A simple designer based KDE application was created in %{dest}
+Comment[ca]=A simple aplicació per al KDE basada en el dissenyador ha estat creada en %{dest}
+Comment[da]=Et simpelt designer-baseret KDE program blev oprettet i %{dest}
+Comment[de]=Eine einfache, auf Designer basierende KDE-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια απλή εφαÏμογή KDE βασισμένη στο σχεδιαστή δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una sencilla aplicación para KDE basada en el diseñador ha sido creada en %{dest}
+Comment[et]=Lihtne KDE rakendus Disaineri põhjal loodi asukohta %{dest}
+Comment[eu]=Designer-en oinarritutako KDE aplikazio simple bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد ساده‌ای بر مبنای طراح در %{dest} ایجاد شد
+Comment[fr]=Une application KDE simple basée sur Designer a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár simplí KDE bunaithe ar Qt-Designer i %{dest}
+Comment[gl]=Creouse unha aplicación KDE baseada no deseñador en %{dest}
+Comment[hu]=Létrejött egy egyszerű, Qt Designer-alapú KDE-s alkalmazás itt: %{dest}
+Comment[it]=È stata creata una semplice applicazione KDE basata su designer
+Comment[ja]=Designer ベースã®ç°¡å˜ãª KDE アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach op "Designer" opbuut KDE-Programm opstellt
+Comment[ne]=साधारण डिजाइनरमा आधारित केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudige Designer-gebaseerde KDE-toepassing is aangemaakt in %{dest}
+Comment[pl]=Prosty program wykorzystujący Qt Designera został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação simples do KDE em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação simples do KDE em %{dest}
+Comment[ru]=ПроÑтое приложение KDE Ñ Ñ„Ð¾Ñ€Ð¼Ð¾Ð¹ Ñоздано в %{dest}
+Comment[sk]=Jednoduchý dizajnér založený na KDE aplikácii bol vytvorený v %{dest}
+Comment[sr]=ЈедноÑтаван KDE програм на оÑнову Designer-а направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan KDE program na osnovu Designer-a napravljen je u %{dest}
+Comment[sv]=Ett enkelt KDE-program baserat på Designer skapades i %{dest}
+Comment[tr]=Designer tabanlı basit bir KDE uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} ä¸­åˆ›å»ºäº†ä¸€ä¸ªåŸºäºŽè®¾è®¡å¸ˆçš„ç®€å• KDE 应用程åº
+Comment[zh_TW]=一個簡單的設計器 KDE 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/khello2/khello2.png b/languages/cpp/app_templates/khello2/khello2.png
new file mode 100644
index 00000000..97422793
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/khello2.png
Binary files differ
diff --git a/languages/cpp/app_templates/khello2/main.cpp b/languages/cpp/app_templates/khello2/main.cpp
new file mode 100644
index 00000000..278eef46
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/main.cpp
@@ -0,0 +1,51 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static const char description[] =
+ I18N_NOOP("A KDE KPart Application");
+
+static const char version[] = "%{VERSION}";
+
+static KCmdLineOptions options[] =
+{
+// { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", 0, 0, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions( options );
+ KApplication app;
+ %{APPNAME} *mainWin = 0;
+
+ if (app.isRestored())
+ {
+ RESTORE(%{APPNAME});
+ }
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ /// @todo do something with the command line args here
+
+ mainWin = new %{APPNAME}();
+ app.setMainWidget( mainWin );
+ mainWin->show();
+
+ args->clear();
+ }
+
+ // mainWin has WDestructiveClose flag by default, so it will delete itself.
+ return app.exec();
+}
+
diff --git a/languages/cpp/app_templates/khello2/src-Makefile.am b/languages/cpp/app_templates/khello2/src-Makefile.am
new file mode 100644
index 00000000..4664fe84
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/src-Makefile.am
@@ -0,0 +1,35 @@
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = %{APPNAMELC}.h
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
+
+KDE_ICON = AUTO
+
+#########################################################################
+# APPLICATION SECTION
+#########################################################################
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# the application source, library search path, and link libraries
+%{APPNAMELC}_SOURCES = main.cpp %{APPNAMELC}.cpp %{APPNAMELC}widget.cpp %{APPNAMELC}widgetbase.ui
+%{APPNAMELC}_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+%{APPNAMELC}_LDADD = $(LIB_KDEUI)
+
+# this is where the desktop file will go
+shelldesktopdir = $(kde_appsdir)/Utilities
+shelldesktop_DATA = %{APPNAMELC}.desktop
+
+# this is where the shell's XML-GUI resource file goes
+shellrcdir = $(kde_datadir)/%{APPNAMELC}
+shellrc_DATA = %{APPNAMELC}ui.rc
+
diff --git a/languages/cpp/app_templates/khello2/subdirs b/languages/cpp/app_templates/khello2/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/khello2/widget.cpp b/languages/cpp/app_templates/khello2/widget.cpp
new file mode 100644
index 00000000..6775ac39
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/widget.cpp
@@ -0,0 +1,30 @@
+%{CPP_TEMPLATE}
+
+#include <qlabel.h>
+
+#include "%{APPNAMELC}widget.h"
+
+%{APPNAME}Widget::%{APPNAME}Widget(QWidget* parent, const char* name, WFlags fl)
+ : %{APPNAME}WidgetBase(parent,name,fl)
+{}
+
+%{APPNAME}Widget::~%{APPNAME}Widget()
+{}
+
+/*$SPECIALIZATION$*/
+void %{APPNAME}Widget::button_clicked()
+{
+ if ( label->text().isEmpty() )
+ {
+ label->setText( "Hello World!" );
+ }
+ else
+ {
+ label->clear();
+ }
+}
+
+
+
+#include "%{APPNAMELC}widget.moc"
+
diff --git a/languages/cpp/app_templates/khello2/widget.h b/languages/cpp/app_templates/khello2/widget.h
new file mode 100644
index 00000000..275e13c7
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/widget.h
@@ -0,0 +1,30 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}WIDGET_H_
+#define _%{APPNAMEUC}WIDGET_H_
+
+#include "%{APPNAMELC}widgetbase.h"
+
+class %{APPNAME}Widget : public %{APPNAME}WidgetBase
+{
+ Q_OBJECT
+
+public:
+ %{APPNAME}Widget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~%{APPNAME}Widget();
+ /*$PUBLIC_FUNCTIONS$*/
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ virtual void button_clicked();
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+
+};
+
+#endif
+
diff --git a/languages/cpp/app_templates/khello2/widgetbase.ui b/languages/cpp/app_templates/khello2/widgetbase.ui
new file mode 100644
index 00000000..e6f5be3d
--- /dev/null
+++ b/languages/cpp/app_templates/khello2/widgetbase.ui
@@ -0,0 +1,52 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>%{APPNAME}WidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>%{APPNAMELC}widgetbase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>220</width>
+ <height>133</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>button</cstring>
+ </property>
+ <property name="text">
+ <string>Click Me!</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>label</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>button</sender>
+ <signal>clicked()</signal>
+ <receiver>%{APPNAMELC}widgetbase</receiver>
+ <slot>button_clicked()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>button_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kicker/.kdev_ignore b/languages/cpp/app_templates/kicker/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/.kdev_ignore
diff --git a/languages/cpp/app_templates/kicker/Makefile.am b/languages/cpp/app_templates/kicker/Makefile.am
new file mode 100644
index 00000000..168a93c9
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = applet.cpp applet.h applet.desktop applet.kdevelop \
+ src-Makefile.am kicker.png subdirs
+templateName = kicker
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kicker/applet.cpp b/languages/cpp/app_templates/kicker/applet.cpp
new file mode 100644
index 00000000..5345ac0c
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/applet.cpp
@@ -0,0 +1,72 @@
+%{CPP_TEMPLATE}
+
+#include <qlcdnumber.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+
+#include "%{APPNAMELC}.h"
+
+
+%{APPNAME}::%{APPNAME}(const QString& configFile, Type type, int actions, QWidget *parent, const char *name)
+ : KPanelApplet(configFile, type, actions, parent, name)
+{
+ // Get the current application configuration handle
+ ksConfig = config();
+ QLCDNumber *w = new QLCDNumber(this);
+ w->display(42);
+
+ mainView = w;
+ mainView->show();
+}
+
+
+%{APPNAME}::~%{APPNAME}()
+{
+}
+
+
+void %{APPNAME}::about()
+{
+ KMessageBox::information(0, i18n("This is an about box"));
+}
+
+
+void %{APPNAME}::help()
+{
+ KMessageBox::information(0, i18n("This is a help box"));
+}
+
+
+void %{APPNAME}::preferences()
+{
+ KMessageBox::information(0, i18n("This is a preferences box"));
+}
+
+int %{APPNAME}::widthForHeight(int height) const
+{
+ return width();
+}
+
+int %{APPNAME}::heightForWidth(int width) const
+{
+ return height();
+}
+
+void %{APPNAME}::resizeEvent(QResizeEvent *e)
+{
+}
+
+
+extern "C"
+{
+ KPanelApplet* init( QWidget *parent, const QString& configFile)
+ {
+ KGlobal::locale()->insertCatalogue("%{APPNAMELC}");
+ return new %{APPNAME}(configFile, KPanelApplet::Normal,
+ KPanelApplet::About | KPanelApplet::Help | KPanelApplet::Preferences,
+ parent, "%{APPNAMELC}");
+ }
+}
diff --git a/languages/cpp/app_templates/kicker/applet.desktop b/languages/cpp/app_templates/kicker/applet.desktop
new file mode 100644
index 00000000..24e47c40
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/applet.desktop
@@ -0,0 +1,40 @@
+[Desktop Entry]
+Comment=A panel applet called $NAME$
+Comment[br]=Un arloadig panell a vez graet $NAME$
+Comment[ca]=Una miniaplicació del plafó anomenat $NAME$
+Comment[cy]=Rhaglennig panel o'r enw $NAME$
+Comment[da]=En panel-applet der hedder $NAME$
+Comment[de]=Ein Miniprogramm mit dem Namen $NAME$
+Comment[el]=Μία μικÏοεφαÏμογή πίνακα με όνομα $NAME$
+Comment[es]=Un applet del panel llamado $NAME$
+Comment[et]=Paneeliaplett nimega $NAME$
+Comment[eu]=$NAME$ izeneko panel applet bat
+Comment[fa]=برنامک تابلو، $NAME$ نامیده شد
+Comment[fr]=Un applet pour le tableau de bord nommé $NAME$
+Comment[ga]=Feidhmchláirín painéil darbh ainm $NAME$
+Comment[gl]=Un applet para o panel chamado $NAME$
+Comment[hi]=à¤à¤• फलक à¤à¤ªà¤²à¥‡à¤Ÿ जो कहलाता है- $NAME$
+Comment[hu]=$NAME$ nevű panel-kisalkalmazás
+Comment[is]=Spjaldforritlingur nefndur $NAME$
+Comment[it]=Un applet per il pannello chiamata $NAME$
+Comment[ja]=$NAME$ ã¨å‘¼ã°ã‚Œã‚‹ãƒ‘ãƒãƒ«ã‚¢ãƒ—レット
+Comment[nds]=En Paneel-Lüttprogramm nöömt $NAME$
+Comment[ne]= $NAME$ भनिने पà¥à¤¯à¤¾à¤¨à¤² à¤à¤ªà¥à¤²à¥‡à¤Ÿ
+Comment[nl]=Een paneel-applet met naam $NAME$
+Comment[pl]=Aplet panelu o nazwie $NAME$
+Comment[pt]=Um 'applet' para o painel chamado $NAME$
+Comment[pt_BR]=Uma applet de painel chamada $NAME$
+Comment[ru]=Ðплет панели $NAME$
+Comment[sk]=Applet panel s menom $NAME$
+Comment[sl]=Pultni vstavek z imenom $NAME$
+Comment[sr]=Панелни аплет по имену $NAME$
+Comment[sr@Latn]=Panelni aplet po imenu $NAME$
+Comment[sv]=Ett panelminiprogram som kallas $NAME$
+Comment[ta]=ஒர௠பானல௠ஆபà¯à®²à¯†à®Ÿà¯ $NAME$ எனà¯à®±à¯à®‰ அழைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯
+Comment[tg]=Пайраҳаи апплети $NAME$
+Comment[tr]=$NAME$ adında bir panel küçük uygulaması
+Comment[zh_CN]=一个称作 $NAME$ çš„é¢æ¿å°ç¨‹åº
+Comment[zh_TW]=一個å稱為 $NAME$ çš„é¢æ¿å°ç¨‹å¼
+Name=%{APPNAMELC}
+X-KDE-Library=%{APPNAMELC}_panelapplet
+X-KDE-UniqueApplet = false
diff --git a/languages/cpp/app_templates/kicker/applet.h b/languages/cpp/app_templates/kicker/applet.h
new file mode 100644
index 00000000..b078b2a4
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/applet.h
@@ -0,0 +1,107 @@
+%{H_TEMPLATE}
+
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kpanelapplet.h>
+#include <qstring.h>
+#include <kconfig.h>
+
+
+class %{APPNAME} : public KPanelApplet
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Construct a @ref KPanelApplet just like any other widget.
+ *
+ * @param configFile The configFile handed over in the factory function.
+ * @param Type The applet @ref type().
+ * @param actions Standard RMB menu actions supported by the applet (see @ref action() ).
+ * @param parent The pointer to the parent widget handed over in the factory function.
+ * @param name A Qt object name for your applet.
+ **/
+ %{APPNAME}(const QString& configFile, Type t = Normal, int actions = 0,
+ QWidget *parent = 0, const char *name = 0);
+ /** destructor */
+ ~%{APPNAME}();
+
+ /**
+ * Retrieve a suggested width for a given height.
+ *
+ * Every applet should reimplement this function.
+ *
+ * Depending on the panel orientation the height (horizontal panel) or the
+ * width (vertical panel) of the applets is fixed.
+ * The exact values of the fixed size component depend on the panel size.
+ *
+ * On a horizontal panel the applet height is fixed, the panel will
+ * call @ref widthForHeight(int height) with @p height
+ * equal to 'the fixed applet height'
+ * when laying out the applets.
+ *
+ * The applet can now choose the other size component (width)
+ * based on the given height.
+ *
+ * The width you return is granted.
+ **/
+ virtual int widthForHeight(int height) const;
+ /**
+ * @return A suggested height for a given width.
+ *
+ * Every applet should reimplement this function.
+ *
+ * Depending on the panel orientation the height (horizontal panel) or the
+ * width (vertical panel) of the applets is fixed.
+ * The exact values of the fixed size component depend on the panel size.
+ *
+ * On a vertical panel the applet width is fixed, the panel will
+ * call @ref heightForWidth(int width) with @p width
+ * equal to 'the fixed applet width'
+ * when laying out the applets.
+ *
+ * The applet can now choose the other size component (height)
+ * based on the given width.
+ *
+ * The height you return is granted.
+ **/
+ virtual int heightForWidth(int width) const;
+ /**
+ * Is called when the user selects "About" from the applets RMB menu.
+ * Reimplement this function to launch a about dialog.
+ *
+ * Note that this is called only when your applet supports the About action.
+ * See @ref Action and @ref KPanelApplet().
+ **/
+ virtual void about();
+ /**
+ * Is called when the user selects "Help" from the applets RMB menu.
+ * Reimplement this function to launch a manual or help page.
+ *
+ * Note that this is called only when your applet supports the Help action.
+ * See @ref Action and @ref KPanelApplet().
+ **/
+ virtual void help();
+ /**
+ * Is called when the user selects "Preferences" from the applets RMB menu.
+ * Reimplement this function to launch a preferences dialog or kcontrol module.
+ *
+ * Note that this is called only when your applet supports the preferences action.
+ * See @ref Action and @ref KPanelApplet().
+ **/
+ virtual void preferences();
+
+protected:
+ void resizeEvent(QResizeEvent *);
+
+private:
+ KConfig *ksConfig;
+ QWidget *mainView;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kicker/applet.kdevelop b/languages/cpp/app_templates/kicker/applet.kdevelop
new file mode 100644
index 00000000..8bb35326
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/applet.kdevelop
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>Kicker</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/lib%{APPNAMELC}.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kicker/kicker.kdevtemplate b/languages/cpp/app_templates/kicker/kicker.kdevtemplate
new file mode 100644
index 00000000..f6f87256
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/kicker.kdevtemplate
@@ -0,0 +1,194 @@
+# KDE Config File
+[General]
+Name=Kicker Applet
+Name[br]=Arloadig Kicker
+Name[ca]=Una miniaplicació per a Kicker
+Name[da]=Kicker-applet
+Name[de]=Kicker-Miniprogramm
+Name[el]=ΜικÏοεφαÏμογή Kicker
+Name[es]=Applet para Kicker
+Name[et]=Kickeri aplett
+Name[eu]=Kicker applet-a
+Name[fa]=برنامک Kicker
+Name[fr]=Applet Kicker
+Name[ga]=Feidhmchláirín Kicker
+Name[gl]=Applet para Kicker
+Name[hu]=Panel-kisalkalmazás
+Name[it]=Applet di kicker
+Name[ja]=Kicker アプレット
+Name[nds]=Kicker-Lüttprogramm
+Name[ne]=किकर à¤à¤ªà¥à¤²à¥‡à¤Ÿ
+Name[nl]=Kicker-applet
+Name[pl]=Aplet panelu
+Name[pt]='Applet' do Kicker
+Name[pt_BR]='Applet' do Kicker
+Name[ru]=Ðплет панели KDE
+Name[sk]=Kicker applet
+Name[sl]=Vstavek za Kicker
+Name[sr]=Ðплет за Kicker
+Name[sr@Latn]=Aplet za Kicker
+Name[sv]=Miniprogram för Kicker
+Name[tr]=Kicker Küçük Uygulaması
+Name[zh_CN]=Kicker å°ç¨‹åº
+Name[zh_TW]=Kicker å°ç¨‹å¼
+Icon=kicker.png
+Category=C++/KDE
+Comment=Generates a framework for an applet that embeds into the KDE panel
+Comment[ca]=Genera una infraestructura per a una miniaplicació encastada en el plafó de KDE
+Comment[da]=Genererer et skelet for en applet der indlejres i KDE's panel
+Comment[de]=Erstellt das Grundgerüst für ein Miniprogramm, das in die KDE-Kontrollleiste eingebettet wird.
+Comment[el]=ΔημιουÏγεί ένα πλαίσιο για μία μικÏοεφαÏμογή που ενσωματώνεται στον πίνακα του KDE
+Comment[es]=Genera una infraestructura para un applet empotrado en el panel de KDE
+Comment[et]=Apleti raamistiku loomine, mida saab põimida KDE paneelile
+Comment[eu]=KDE-ren panelean kapsulatzen den applet baten lan-marko bat sortzen du
+Comment[fa]=چارچوبی برای برنامک نهÙته‌شده در تابلوی KDEتولید می‌کند
+Comment[fr]=Génère une infrastructure pour un applet qui s'intègre dans le tableau de bord de KDE
+Comment[gl]=Xera un contorno de traballo para un applet que se incrusta no panel de KDE.
+Comment[hu]=Létrehoz egy keretprogramot KDE-s panel-kisalkalmazás készítéséhez
+Comment[it]=Genera l'infrastruttura per un'applet che si integra nel pannello di KDE
+Comment[nds]=Stellt dat Rahmenwark för en Lüttprogramm op, dat sik na dat KDE-Paneel inbett
+Comment[ne]=केडीई पà¥à¤¯à¤¾à¤¨à¤²à¤®à¤¾ समà¥à¤®à¤¿à¤²à¤¿à¤¤ à¤à¤ªà¥à¤²à¥‡à¤Ÿà¤•à¤¾ लागि फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een framework voor een applet die kan worden ingebed in het KDE-paneel
+Comment[pl]=Generuje szablon apletu, który można wstawić do panelu KDE
+Comment[pt]=Gera a plataforma para uma 'applet' que se incorpore no painel do KDE
+Comment[pt_BR]=Gera a plataforma para uma 'applet' que se incorpore no painel do KDE
+Comment[ru]=Создание аплета панели KDE
+Comment[sk]=Vygeneruje framework pre applet, ktorý sa bude dať vložiť do KDE panelu
+Comment[sr]=Прави радни оквир за аплет који Ñе уграђује у KDE-ов панел
+Comment[sr@Latn]=Pravi radni okvir za aplet koji se ugrađuje u KDE-ov panel
+Comment[sv]=Skapar ett ramverk för ett miniprogram som inbäddas i KDE:s panel
+Comment[tr]=KDE paneline gömülen bir küçük uygulama için bir çatı oluşturur.
+Comment[zh_CN]=生æˆä¸€ä¸ªå¯åµŒå…¥ KDE é¢æ¿çš„å°ç¨‹åºæ¡†æž¶
+Comment[zh_TW]=產生一個嵌入 KDE é¢æ¿çš„å°ç¨‹å¼æ¡†æž¶
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=kicker.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/applet.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/applet.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/applet.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE14]
+Type=install
+Source=%{src}/applet.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[MSG]
+Type=message
+Comment=A Kicker Applet was created in %{dest}
+Comment[ca]=Una miniaplicació per a Kicker ha estat creat en %{dest}
+Comment[da]=En Kicker applet blev oprettet i %{dest}
+Comment[de]=Ein Miniprogramm für Kicker wurde in %{dest} erstellt.
+Comment[el]=Μία μικÏοεφαÏμογή Kicker δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un applet para Kicker ha sido creado en %{dest}
+Comment[et]=Kickeri aplett loodi asukohta %{dest}
+Comment[eu]=Kicker Applet bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامک Kicker در %{dest} ایجاد شد
+Comment[fr]=Un applet Kicker a été créé dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchláirín Kicker i %{dest}
+Comment[gl]=Creouse un applet para Kicker en %{dest}
+Comment[hu]=Létrejött egy panel-kisalkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applet per kicker in %{dest}
+Comment[ja]=Kicker アプレットを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Kicker-Lüttprogramm opstellt
+Comment[ne]=किकर à¤à¤ªà¥à¤²à¥‡à¤Ÿ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Kicker-applet is aangemaakt in %{dest}
+Comment[pl]=Aplet panelu został utworzony w %{dest}
+Comment[pt]=Foi criada uma 'applet' do Kicker em %{dest}
+Comment[pt_BR]=Foi criada uma 'applet' do Kicker em %{dest}
+Comment[ru]=Ðплет панели KDE Ñоздан в %{dest}
+Comment[sk]=Kicker applet bol vytvorený v %{dest}
+Comment[sl]=Vstavek za Kicker je bil ustvarjen v %{dest}
+Comment[sr]=Ðплет за Kicker направљен је у %{dest}
+Comment[sr@Latn]=Aplet za Kicker napravljen je u %{dest}
+Comment[sv]=Ett miniprogram för Kicker skapades i %{dest}
+Comment[tr]=Bir Kicker küçük uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 Kicker å°ç¨‹åº
+Comment[zh_TW]=一個 Kicker å°ç¨‹å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kicker/kicker.png b/languages/cpp/app_templates/kicker/kicker.png
new file mode 100644
index 00000000..5e4f746f
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/kicker.png
Binary files differ
diff --git a/languages/cpp/app_templates/kicker/src-Makefile.am b/languages/cpp/app_templates/kicker/src-Makefile.am
new file mode 100644
index 00000000..424062d1
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/src-Makefile.am
@@ -0,0 +1,15 @@
+INCLUDES= $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = %{APPNAMELC}_panelapplet.la
+
+%{APPNAMELC}_panelapplet_la_SOURCES = %{APPNAMELC}.cpp
+%{APPNAMELC}_panelapplet_la_LDFLAGS = -module -avoid-version $(all_libraries)
+%{APPNAMELC}_panelapplet_la_LIBADD = $(LIB_KDEUI)
+
+%{APPNAMELC}_DATA = %{APPNAMELC}.desktop
+%{APPNAMELC}dir = $(kde_datadir)/kicker/applets
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/kicker/subdirs b/languages/cpp/app_templates/kicker/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kicker/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kioslave/.kdev_ignore b/languages/cpp/app_templates/kioslave/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/.kdev_ignore
diff --git a/languages/cpp/app_templates/kioslave/Makefile.am b/languages/cpp/app_templates/kioslave/Makefile.am
new file mode 100644
index 00000000..5aa5b88e
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = slave.cpp slave.h slave.protocol slave.kdevelop \
+ src-Makefile.am kioslave.png subdirs
+templateName = kioslave
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kioslave/kioslave.kdevtemplate b/languages/cpp/app_templates/kioslave/kioslave.kdevtemplate
new file mode 100644
index 00000000..0af80e7b
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/kioslave.kdevtemplate
@@ -0,0 +1,183 @@
+# KDE Config File
+[General]
+Name=KIO slave
+Name[br]=Sklav KIO
+Name[ca]=Esclau KIO
+Name[da]=KIO-slave
+Name[de]=Ein-/Ausgabemodul
+Name[el]=ΥπηÏέτης KIO
+Name[es]=Esclavo KIO
+Name[et]=KIO-moodul
+Name[eu]=KIO morroia
+Name[fr]=Esclave KIO
+Name[ga]=Sclábhaí KIO
+Name[gl]=Escravo KIO
+Name[hu]=KDE-protokoll (KIOslave)
+Name[it]=Slave KIO
+Name[nds]=In-/Utgaavmoduul
+Name[ne]=KIO सà¥à¤²à¥‡à¤­
+Name[nl]=KIO-slave
+Name[pt]=KIO Slave
+Name[sk]=KIO otrok
+Name[sv]=I/O-slav
+Icon=kioslave.png
+Category=C++/KDE
+Comment=Generates a framework for an IO slave
+Comment[ca]=Genera una infraestructura per a un esclau IO
+Comment[da]=Genererer et skelet for en IO-slave
+Comment[de]=Erstellt das Grundgerüst für ein Ein-/Ausgabemodul.
+Comment[el]=ΔημιουÏγεί ένα πλαίσιο για έναν υπηÏέτη IO
+Comment[es]=Genera una infraestructura para un esclavo de E/S
+Comment[et]=IO-mooduli raamistiku loomine
+Comment[eu]=IO morroi baterako lan-marko bat sortzen du
+Comment[fa]=چارچوبی برای یک IO slave تولید می‌کند
+Comment[fr]=Génère une infrastructure pour un esclave d'entrée / sortie
+Comment[ga]=Cruthaíonn sé seo creatlach le haghaidh sclábhaí IO
+Comment[gl]=Xera un contorno de traballo para un escravo IO
+Comment[hu]=Létrehoz egy kiindulási keretprogramot KIOslave készítéséhez
+Comment[it]=Genera l'infrastruttura per uno slave di I/O
+Comment[ja]=IO slave ã®ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã‚’作æˆã—ã¾ã™
+Comment[nds]=Stellt dat Rahmenwark för en In-/Utgaavmoduul op
+Comment[ne]=IO सà¥à¤²à¥‡à¤­à¤•à¤¾ लागि फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een framework voor een IO-slave
+Comment[pl]=Generuje szablon dla IO slave
+Comment[pt]=Gera a plataforma para um 'IO slave'
+Comment[pt_BR]=Gera a plataforma para um 'IO slave'
+Comment[ru]=Создание канала IO slave Ð´Ð»Ñ KDE
+Comment[sk]=Vygeneruje framework pre IO otroka
+Comment[sr]=Прави радни оквир за IO slave
+Comment[sr@Latn]=Pravi radni okvir za IO slave
+Comment[sv]=Skapar ett ramverk för en I/O-slav
+Comment[zh_CN]=生æˆä¸€ä¸ª IO slave 的框架
+Comment[zh_TW]=產生一個 IO slave 的框架
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=kioslave.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/slave.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/slave.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/slave.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE14]
+Type=install
+Source=%{src}/slave.protocol
+Dest=%{dest}/src/%{APPNAMELC}.protocol
+
+[MSG]
+Type=message
+Comment=A KIO slave was created in %{dest}
+Comment[ca]=Un esclau KIO ha estat creat en %{dest}
+Comment[da]=En KIO-slave blev oprettet i %{dest}
+Comment[de]=Ein Ein-/Ausgabemodul wurde in %{dest} erstellt.
+Comment[el]=Ένας υπηÏέτης KIO δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un esclavo KIO ha sido creado en %{dest}
+Comment[et]=KIO-moodul loodi asukohta %{dest}
+Comment[eu]=KIO morroi bat sortu da hemen: %{dest}
+Comment[fa]=یک KIO slave در %{dest} ایجاد شد
+Comment[fr]=Un esclave d'entrée / sortie a été créé dans %{dest}
+Comment[ga]=Cruthaíodh sclábhaí KIO i %{dest}
+Comment[gl]=Creouse un escravo KIO en %{dest}
+Comment[hu]=Létrejött egy KIOslave itt: %{dest}
+Comment[it]=È stato generato un slave KIO in %{dest}
+Comment[ja]=KIO slave ã‚’ %{dest} ã«ä½œæˆã—ã¾ã—ãŸã€‚
+Comment[nds]=In %{dest} wöör en In-/Utgaavmoduul opstellt
+Comment[ne]=KIO सà¥à¤²à¥‡à¤­ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een KIO-slave is aangemaakt in %{dest}
+Comment[pl]=KIO slave został utworzony w %{dest}
+Comment[pt]=Foi criado um 'KIO slave' em %{dest}
+Comment[pt_BR]=Foi criado um 'KIO slave' em %{dest}
+Comment[ru]=Канал KIO slave Ñоздан в %{dest}
+Comment[sk]=KIO otrok bol vytvorený v %{dest}
+Comment[sr]=KIO slave је направљен у %{dest}
+Comment[sr@Latn]=KIO slave je napravljen u %{dest}
+Comment[sv]=En I/O-slav skapades i %{dest}
+Comment[tr]=Bir KIO slave'i %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 KIO slave
+Comment[zh_TW]=一個 KIO slave 已建立於 %{dest}
diff --git a/languages/cpp/app_templates/kioslave/kioslave.png b/languages/cpp/app_templates/kioslave/kioslave.png
new file mode 100644
index 00000000..f0cd89a8
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/kioslave.png
Binary files differ
diff --git a/languages/cpp/app_templates/kioslave/slave.cpp b/languages/cpp/app_templates/kioslave/slave.cpp
new file mode 100644
index 00000000..df32aebf
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/slave.cpp
@@ -0,0 +1,88 @@
+
+#include <qcstring.h>
+#include <qsocket.h>
+#include <qdatetime.h>
+#include <qbitarray.h>
+
+#include <stdlib.h>
+#include <math.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kinstance.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <ksock.h>
+
+#include "%{APPNAMELC}.h"
+
+using namespace KIO;
+
+
+kio_%{APPNAMELC}Protocol::kio_%{APPNAMELC}Protocol(const QCString &pool_socket, const QCString &app_socket)
+ : SlaveBase("kio_%{APPNAMELC}", pool_socket, app_socket)
+{
+ kdDebug() << "kio_%{APPNAMELC}Protocol::kio_%{APPNAMELC}Protocol()" << endl;
+}
+
+
+kio_%{APPNAMELC}Protocol::~kio_%{APPNAMELC}Protocol()
+{
+ kdDebug() << "kio_%{APPNAMELC}Protocol::~kio_%{APPNAMELC}Protocol()" << endl;
+}
+
+
+void kio_%{APPNAMELC}Protocol::get(const KURL& url )
+{
+ kdDebug() << "kio_%{APPNAMELC}::get(const KURL& url)" << endl ;
+
+ kdDebug() << "Seconds: " << url.query() << endl;
+ QString remoteServer = url.host();
+ int remotePort = url.port();
+ kdDebug() << "myURL: " << url.prettyURL() << endl;
+
+ infoMessage(i18n("Looking for %1...").arg( remoteServer ) );
+ // Send the mimeType as soon as it is known
+ mimeType("text/plain");
+ // Send the data
+ QString theData = "This is a test of kio_%{APPNAMELC}";
+ data(QCString(theData.local8Bit()));
+ data(QByteArray()); // empty array means we're done sending the data
+ finished();
+}
+
+
+void kio_%{APPNAMELC}Protocol::mimetype(const KURL & /*url*/)
+{
+ mimeType("text/plain");
+ finished();
+}
+
+
+extern "C"
+{
+ int kdemain(int argc, char **argv)
+ {
+ KInstance instance( "kio_%{APPNAMELC}" );
+
+ kdDebug(7101) << "*** Starting kio_%{APPNAMELC} " << endl;
+
+ if (argc != 4) {
+ kdDebug(7101) << "Usage: kio_%{APPNAMELC} protocol domain-socket1 domain-socket2" << endl;
+ exit(-1);
+ }
+
+ kio_%{APPNAMELC}Protocol slave(argv[2], argv[3]);
+ slave.dispatchLoop();
+
+ kdDebug(7101) << "*** kio_%{APPNAMELC} Done" << endl;
+ return 0;
+ }
+}
diff --git a/languages/cpp/app_templates/kioslave/slave.h b/languages/cpp/app_templates/kioslave/slave.h
new file mode 100644
index 00000000..649ead8c
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/slave.h
@@ -0,0 +1,23 @@
+
+#ifndef _%{APPNAMELC}_H_
+#define _%{APPNAMELC}_H_
+
+#include <qstring.h>
+#include <qcstring.h>
+
+#include <kurl.h>
+#include <kio/global.h>
+#include <kio/slavebase.h>
+
+class QCString;
+
+class kio_%{APPNAMELC}Protocol : public KIO::SlaveBase
+{
+public:
+ kio_%{APPNAMELC}Protocol(const QCString &pool_socket, const QCString &app_socket);
+ virtual ~kio_%{APPNAMELC}Protocol();
+ virtual void mimetype(const KURL& url);
+ virtual void get(const KURL& url);
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kioslave/slave.kdevelop b/languages/cpp/app_templates/kioslave/slave.kdevelop
new file mode 100644
index 00000000..a2ca970a
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/slave.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>kioslave</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/lib%{APPNAMELC}.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kioslave/slave.protocol b/languages/cpp/app_templates/kioslave/slave.protocol
new file mode 100644
index 00000000..2e2cc076
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/slave.protocol
@@ -0,0 +1,39 @@
+[Protocol]
+exec=kio_%{APPNAMELC}
+protocol=%{APPNAMELC}
+input=none
+output=stream
+reading=true
+defaultMimetype=text/plain
+Icon=remote
+Description=A kioslave for %{APPNAMELC}
+Description[br]=Ur c'hioslave evit %{APPNAMELC}
+Description[ca]=Un kioslave per a %{APPNAMELC}
+Description[da]=En kioslave til %{APPNAMELC}
+Description[de]=Ein Ein-/Ausgabemodul für %{APPNAMELC}
+Description[el]=Ένα υπηÏέτης kio για %{APPNAMELC}
+Description[es]=Un kioslave para %{APPNAMELC}
+Description[et]=%{APPNAMELC} IO-moodul
+Description[eu]=kioslave bat honentzat: %{APPNAMELC}
+Description[fa]=یک kioslave برای %{APPNAMELC}
+Description[fr]=Un esclave d'E/S (kioslave) pour %{APPNAMELC}
+Description[ga]=kioslave le haghaidh %{APPNAMELC}
+Description[gl]=Un kioslave para %{APPNAMELC}
+Description[hu]=%{APPNAMELC}-támogató KIOslave
+Description[it]=Un kioslave per %{APPNAMELC}
+Description[ja]=%{APPNAMELC} ã®ãŸã‚ã® kioslave
+Description[nds]=En In-/Utgaavmoduul för %{APPNAMELC}
+Description[ne]= %{APPNAMELC} का लागि किवसà¥à¤²à¥‡à¤­
+Description[nl]=Kioslave voor %{APPNAMELC}
+Description[pl]=kioslave dla %{APPNAMELC}
+Description[pt]=Um 'kioslave' para %{APPNAMELC}
+Description[pt_BR]=Um kioslave para %{APPNAMELC}
+Description[ru]=Канал kioslave Ð´Ð»Ñ %{APPNAMELC}
+Description[sk]=kioslave pre %{APPNAMELC}
+Description[sl]=kioslave za %{APPNAMELC}
+Description[sr]=KIOSlave за %{APPNAMELC}
+Description[sr@Latn]=KIOSlave za %{APPNAMELC}
+Description[sv]=En I/O-slav för %{APPNAMELC}
+Description[tr]=%{APPNAMELC} için bir kioslave
+Description[zh_CN]=%{APPNAMELC} çš„ kioslave
+Description[zh_TW]=%{APPNAMELC} çš„ kioslave
diff --git a/languages/cpp/app_templates/kioslave/src-Makefile.am b/languages/cpp/app_templates/kioslave/src-Makefile.am
new file mode 100644
index 00000000..957ec330
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/src-Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = kio_%{APPNAMELC}.la
+
+kio_%{APPNAMELC}_la_SOURCES = %{APPNAMELC}.cpp
+kio_%{APPNAMELC}_la_LIBADD = -lkio
+kio_%{APPNAMELC}_la_LDFLAGS = -module -avoid-version $(all_libraries) $(KDE_PLUGIN)
+
+protocol_DATA = %{APPNAMELC}.protocol
+protocoldir = $(kde_servicesdir)
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kio_%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/kioslave/subdirs b/languages/cpp/app_templates/kioslave/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kioslave/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kmake/Makefile.am b/languages/cpp/app_templates/kmake/Makefile.am
new file mode 100644
index 00000000..87d660e0
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = appui.rc app.desktop app.cpp mainviewimp.cpp mainviewimp.h mainview.ui app.kdevelop app.pro src.pro
+templateName = kmake
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/kmake/app.cpp b/languages/cpp/app_templates/kmake/app.cpp
new file mode 100644
index 00000000..8920b2f0
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/app.cpp
@@ -0,0 +1,33 @@
+
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include "mainviewimp.h"
+
+static const char description[] = I18N_NOOP("A KDE Application");
+
+static const char version[] = "%{VERSION}";
+
+static KCmdLineOptions options[] =
+ {
+ { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+ };
+
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAME}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) 2004 %{AUTHOR}", 0, 0, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ KApplication app;
+ MainViewImp *widget = new MainViewImp;
+ app.setMainWidget(widget);
+ widget->show();
+ return app.exec();
+}
+
diff --git a/languages/cpp/app_templates/kmake/app.desktop b/languages/cpp/app_templates/kmake/app.desktop
new file mode 100644
index 00000000..7389904a
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/app.desktop
@@ -0,0 +1,44 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC} %i -caption "%c"
+Icon=%{APPNAMELC}
+Type=Application
+X-DocPath=%{APPNAMELC}/%{APPNAMELC}.html
+Comment=A KDE KPart Application
+Comment[br]=Ur meziant Kpart evit KDE
+Comment[ca]=Una aplicació KPart per al KDE
+Comment[cy]=Cymhwysiad KPart KDE
+Comment[da]=Et KDE KPart-program
+Comment[de]=Eine auf der Komponententechnik KPart basierende KDE-Anwendung
+Comment[el]=Μια εφαÏμογή KPart του KDE
+Comment[es]=Una aplicación KPart de KDE
+Comment[et]=KDE KPart rakendus
+Comment[eu]=KDE KPart aplikazio bat
+Comment[fa]=یک کاربرد KDE KPart
+Comment[fr]=Une application KPart pour KDE
+Comment[ga]=Feidhmchlár KPart KDE
+Comment[gl]=Unha aplicación KPart de KDE
+Comment[hi]=à¤à¤• केडीई के-पारà¥à¤Ÿ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=KPart-alapú KDE-alkalmazás
+Comment[is]=KDE KPart forrit
+Comment[it]=Applicazione KPart di KDE
+Comment[ja]=KDE KPart アプリケーション
+Comment[lt]=KDE KPart programa
+Comment[nds]=En KPart-Deelprogramm för KDE
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ केडीई KPart अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een KDE KPart-toepassing
+Comment[pl]=Osadzalny element KPart KDE
+Comment[pt]=Uma Aplicação KPart do KDE
+Comment[pt_BR]=Um Aplicativo KPart do KDE
+Comment[ru]=Приложение KPart Ð´Ð»Ñ KDE
+Comment[sk]=KDE KPart aplikácia
+Comment[sl]=Program KPart za KDE
+Comment[sr]=KDE KPart програм
+Comment[sr@Latn]=KDE KPart program
+Comment[sv]=Ett KDE Kpart-program
+Comment[ta]=கெடி கெபாரà¯à®Ÿà¯ பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Ба кор андохтани KPart барои KDE
+Comment[tr]=Bir KDE KPart Uygulaması
+Comment[zh_CN]=一个 KDE KPart 应用程åº
+Comment[zh_TW]=KDE KPart 應用程å¼
+Terminal=false
diff --git a/languages/cpp/app_templates/kmake/app.kdevelop b/languages/cpp/app_templates/kmake/app.kdevelop
new file mode 100644
index 00000000..aa290baa
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/app.kdevelop
@@ -0,0 +1,111 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ <breakpoints/>
+ <programargs></programargs>
+ <gdbpath>/usr/bin/</gdbpath>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ <breakpoints/>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <run>
+ <mainprogram>./bin/%{APPNAMELC}</mainprogram>
+ <programargs/>
+ </run>
+ </kdevtrollproject>
+ <workspace>
+ <openfiles/>
+ </workspace>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ <type ext="ts" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kmake/app.pro b/languages/cpp/app_templates/kmake/app.pro
new file mode 100644
index 00000000..7dc1cc78
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/app.pro
@@ -0,0 +1,7 @@
+# File generated by kdevelop's qmake manager.
+# -------------------------------------------
+# Subdir relative project main directory: .
+# Target is a subdirs project
+
+SUBDIRS += src
+TEMPLATE=subdirs
diff --git a/languages/cpp/app_templates/kmake/appui.rc b/languages/cpp/app_templates/kmake/appui.rc
new file mode 100644
index 00000000..25884e61
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/appui.rc
@@ -0,0 +1,3 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+</kpartgui>
diff --git a/languages/cpp/app_templates/kmake/kmake.kdevtemplate b/languages/cpp/app_templates/kmake/kmake.kdevtemplate
new file mode 100644
index 00000000..3797d8e9
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/kmake.kdevtemplate
@@ -0,0 +1,148 @@
+# KDE Config File
+[General]
+Name=QMake based KDE template
+Name[ca]=Plantilla per al KDE basada en QMake
+Name[da]=QMake baseret KDE-skabelon
+Name[de]=Auf QMake basierende KDE-Vorlage
+Name[el]=ΠÏότυπο KDE βασισμένο στο QMake
+Name[es]=Plantilla para KDE basada en QMake
+Name[et]=KDE mall QMake'i põhjal
+Name[eu]=QMake-en oinarritutatko KDE txantiloia
+Name[fa]=قالب KDE بر مبنای QMake
+Name[fr]=Modèle KDE basé sur QMake
+Name[ga]=Teimpléad KDE bunaithe ar QMake
+Name[gl]=Modelo de KDE baseado en QMake
+Name[hu]=QMake-alapú KDE-s sablon
+Name[it]=Modello KDE basato su QMake
+Name[ja]=QMake ベース㮠KDE テンプレート
+Name[nds]=Op QMake opbuut KDE-Vörlaag
+Name[ne]=QMake मा आधारित केडीई टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ
+Name[nl]=Qmake-gebaseerde KDE-jabloon
+Name[pl]=Oparty na QMake szablon dla KDE
+Name[pt]=Modelo do KDE baseado no QMake
+Name[pt_BR]=Modelo do KDE baseado no QMake
+Name[ru]=Приложение KDE как проект QMake
+Name[sk]=Šablóna KDE založená na QMake
+Name[sr]=KDE шаблон на оÑнови QMake-а
+Name[sr@Latn]=KDE Å¡ablon na osnovi QMake-a
+Name[sv]=QMake-baserad KDE-mall
+Name[tr]=QMake tabanlı KDE şablonu
+Name[zh_CN]=基于 QMake çš„ KDE 模æ¿
+Name[zh_TW]=QMake 為基礎的 KDE 樣本
+Icon=kmake.png
+Category=C++/QMake project
+Comment=Generates a simple KDE application using QMake based project manager
+Comment[ca]=Genera una simple aplicació per al KDE usant un gestor de projectes basat en QMake
+Comment[da]=Genererer et simpelt KDE program ved brug af QMake baseret projekthåndtering
+Comment[de]=Erstellt eine einfache KDE-Anwendung unter Verwendung der QMake-Projektverwaltung
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή KDE χÏησιμοποιώντας το διαχειÏιστή έÏγου βασισμένο στο QMake
+Comment[es]=Genera una sencilla aplicación para KDE que usa un gestor de proyecto basado en QMake
+Comment[et]=Lihtsa KDE rakenduse loomine projektihalduriga QMake'i põhjal
+Comment[eu]=KDE aplikazio sinple bat sortzen du QMake-en oinarritutako proiektu-kudeatzailea erabiliz
+Comment[fa]=یک کاربرد سادۀ KDEØŒ با استÙاده از مدیر پروژۀ بر مبنای QMake تولید می‌کند
+Comment[fr]=Génère une application KDE simple utilisant un gestionnaire de projet basé sur QMake
+Comment[gl]=Xera unha aplicación KDE sinxela usando un xestor de proxectos baseado en QMake
+Comment[hu]=Létrehoz egy egyszerű KDE-s alkalmazást Qmake-alapú projektkezelővel
+Comment[it]=Genera una semplice applicazione KDE che usa QMake basata sul gestore di progetto
+Comment[ja]=QMake ベースã®ãƒ—ロジェクトマãƒãƒ¼ã‚¸ãƒ£ã‚’使ã£ã¦ ç°¡å˜ãª KDE アプリケーションを作æˆã—ã¾ã™
+Comment[nds]=Stellt mit den op QMake opbuut Projektpleger en eenfach KDE-Programm op
+Comment[ne]=QMake आधारित परियोजना पà¥à¤°à¤¬à¤¨à¥à¤§à¤• पà¥à¤°à¤¯à¥‹à¤— गरेर à¤à¤‰à¤Ÿà¤¾ साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudige KDE-toepassing met behulp van Qmake-gebaseerde projectmanager
+Comment[pl]=Generuje prosty program KDE używający menedżera projektów QMake
+Comment[pt]=Gera uma aplicação simples do KDE, usando o QMake como gestor de projectos
+Comment[pt_BR]=Gera uma aplicação simples do KDE, usando o QMake como gestor de projectos
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE как проекта QMake
+Comment[sk]=Vygeneruje jednoduchú KDE aplikáciu založenú na QMake projektovom manažéri
+Comment[sr]=Прави једноÑтаван KDE програм помоћу менаџера пројекта на оÑнови QMake-а
+Comment[sr@Latn]=Pravi jednostavan KDE program pomoću menadžera projekta na osnovi QMake-a
+Comment[sv]=Skapar ett enkelt KDE-program baserat på QMake projekthantering
+Comment[tr]=QMake tabanlı proje yöneticisini kullanarak basit bir KDE uygulaması yaratır.
+Comment[zh_CN]=使用基于 QMake的工程管ç†å™¨ç”Ÿæˆä¸€ä¸ªç®€å•çš„ KDE 应用程åº
+Comment[zh_TW]=產生一個使用 QMake 專案管ç†å“¡çš„ç°¡å–® KDE 應用程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=kmake.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE3]
+Type=install
+Source=%{src}/src.pro
+Dest=%{dest}/src/src.pro
+
+[FILE4]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/mainviewimp.cpp
+Dest=%{dest}/src/mainviewimp.cpp
+
+[FILE7]
+Type=install
+Source=%{src}/mainviewimp.h
+Dest=%{dest}/src/mainviewimp.h
+
+[FILE8]
+Type=install
+EscapeXML=true
+Source=%{src}/mainview.ui
+Dest=%{dest}/src/mainview.ui
+
+[FILE9]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}.rc
+
+[FILE10]
+Type=install
+Source=%{src}/app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[MSG]
+Type=message
+Comment=A Qmake based KDE application was created in %{dest}
+Comment[ca]=Una aplicació per al KDE basada en QMake ha estat creada en %{dest}
+Comment[da]=Et Qmake baseret KDE program blev oprettet i %{dest}
+Comment[de]=Eine auf Qmake basierende KDE-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή KDE βασισμένη στο Qmake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación para KDE basada en QMake ha sido creada en %{dest}
+Comment[et]=KDE rakendus QMake'i põhjal loodi asukohta %{dest}
+Comment[eu]=Qmake-en oinarritutako KDE aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد KDE بر مبنای Qmake در %{dest} ایجاد شد
+Comment[fr]=Une application KDE basée sur QMake a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár KDE bunaithe ar Qmake i %{dest}
+Comment[gl]=Creouse unha aplicación KDE baseada en QMake en %{dest}
+Comment[hu]=Létrejött egy Qmake-alapú KDE-s alkalmazás itt: %{dest}
+Comment[it]=È stata creata una semplice applicazione KDE basata su Qmake in %{dest}
+Comment[ja]=QMake ベース㮠KDE アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op QMake opbuut KDE-Programm opstellt
+Comment[ne]=Qmake आधारित केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Qmake-gebaseerde KDE-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program KDE oparty na QMake został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do KDE baseada no Qmake em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do KDE baseada no Qmake em %{dest}
+Comment[ru]=Приложение KDE как проект QMake Ñоздано в %{dest}
+Comment[sk]=KDE aplikácia založená na QMake bola vytvorená v %{dest}
+Comment[sr]=KDE програм на оÑнову QMake-а направљен је у %{dest}
+Comment[sr@Latn]=KDE program na osnovu QMake-a napravljen je u %{dest}
+Comment[sv]=Ett Qmake-baserat KDE-program skapades i %{dest}
+Comment[tr]=Bir QMake tabanlı KDE uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了基于 QMake çš„ KDE 应用程åº
+Comment[zh_TW]=一個以 Qmake 為基礎的 KDE 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kmake/kmake.png b/languages/cpp/app_templates/kmake/kmake.png
new file mode 100644
index 00000000..913ebb87
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/kmake.png
Binary files differ
diff --git a/languages/cpp/app_templates/kmake/mainview.ui b/languages/cpp/app_templates/kmake/mainview.ui
new file mode 100644
index 00000000..fea02def
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/mainview.ui
@@ -0,0 +1,76 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>MainView</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Form1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>124</width>
+ <height>90</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Output</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>helloLabel</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>helloButton</cstring>
+ </property>
+ <property name="text">
+ <string>Hello</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>helloButton</sender>
+ <signal>clicked()</signal>
+ <receiver>Form1</receiver>
+ <slot>slotHelloButtonClicked()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>slotHelloButtonClicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kmake/mainviewimp.cpp b/languages/cpp/app_templates/kmake/mainviewimp.cpp
new file mode 100644
index 00000000..68cb262a
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/mainviewimp.cpp
@@ -0,0 +1,23 @@
+
+#include "mainviewimp.h"
+#include <qlabel.h>
+#include <klocale.h>
+
+MainViewImp::MainViewImp(QWidget* parent, const char* name, WFlags fl)
+: MainView(parent,name,fl)
+{
+}
+
+MainViewImp::~MainViewImp()
+{
+}
+
+void MainViewImp::slotHelloButtonClicked()
+{
+ helloLabel->setText(i18n("Hello there."));
+}
+
+
+
+
+
diff --git a/languages/cpp/app_templates/kmake/mainviewimp.h b/languages/cpp/app_templates/kmake/mainviewimp.h
new file mode 100644
index 00000000..51af1957
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/mainviewimp.h
@@ -0,0 +1,19 @@
+#ifndef MAINVIEWIMP_H
+#define MAINVIEWIMP_H
+
+#include "mainview.h"
+
+class MainViewImp : public MainView
+{
+ Q_OBJECT
+
+public:
+ MainViewImp(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~MainViewImp();
+
+public slots:
+ virtual void slotHelloButtonClicked();
+};
+
+#endif
+
diff --git a/languages/cpp/app_templates/kmake/src.pro b/languages/cpp/app_templates/kmake/src.pro
new file mode 100644
index 00000000..a27a6b13
--- /dev/null
+++ b/languages/cpp/app_templates/kmake/src.pro
@@ -0,0 +1,29 @@
+# File generated by kdevelop's qmake manager.
+# -------------------------------------------
+# Subdir relative project main directory: ./src
+# Target is an application: ../bin/%{APPNAMELC}
+KDELIB=$$system(kde-config --expandvars --install lib)
+KDEBIN=$$system(kde-config --expandvars --install exe)
+KDEAPPS=$$system(kde-config --expandvars --install apps)
+KDEPREFIX=$$system(kde-config --prefix)
+KDEINCLUDE=$$KDEPREFIX/include/kde $$KDEPREFIX/include
+
+TEMPLATE = app
+
+INSTALLS += %{APPNAMELC}_rc \
+ %{APPNAMELC}_desktop \
+ target
+target.path = $$KDEBIN
+%{APPNAMELC}_desktop.files += *.desktop
+%{APPNAMELC}_desktop.path = $$KDEAPPS/Utils
+%{APPNAMELC}_rc.files += *.rc
+%{APPNAMELC}_rc.path = $$KDEAPPDATA/%{APPNAMELC}
+FORMS += mainview.ui
+HEADERS += mainviewimp.h
+SOURCES += %{APPNAMELC}.cpp mainviewimp.cpp
+LIBS += -lkdeui -lkdecore
+INCLUDEPATH = $$KDEINCLUDE
+QMAKE_LIBDIR = $$KDELIB
+TARGET = %{APPNAMELC}
+DESTDIR = ../bin
+CONFIG += release warn_on
diff --git a/languages/cpp/app_templates/kmod/.kdev_ignore b/languages/cpp/app_templates/kmod/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kmod/.kdev_ignore
diff --git a/languages/cpp/app_templates/kmod/Makefile.am b/languages/cpp/app_templates/kmod/Makefile.am
new file mode 100644
index 00000000..76afcd5a
--- /dev/null
+++ b/languages/cpp/app_templates/kmod/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = src-Makefile kmod.kdevelop kmod-driver.c
+
+templateName = kmod
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kmod/kmod-driver.c b/languages/cpp/app_templates/kmod/kmod-driver.c
new file mode 100644
index 00000000..5ddc7ce6
--- /dev/null
+++ b/languages/cpp/app_templates/kmod/kmod-driver.c
@@ -0,0 +1,22 @@
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+
+MODULE_DESCRIPTION("My kernel module");
+MODULE_AUTHOR("%{AUTHOR} (%{EMAIL})");
+MODULE_LICENSE("$LICENSE$");
+
+static int %{APPNAMELC}_init_module(void)
+{
+ printk( KERN_DEBUG "Module %{APPNAME} init\n" );
+ return 0;
+}
+
+static void %{APPNAMELC}_exit_module(void)
+{
+ printk( KERN_DEBUG "Module %{APPNAME} exit\n" );
+}
+
+module_init(%{APPNAMELC}_init_module);
+module_exit(%{APPNAMELC}_exit_module);
diff --git a/languages/cpp/app_templates/kmod/kmod.kdevelop b/languages/cpp/app_templates/kmod/kmod.kdevelop
new file mode 100644
index 00000000..93c6c0f4
--- /dev/null
+++ b/languages/cpp/app_templates/kmod/kmod.kdevelop
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C</primarylanguage>
+ <ignoreparts>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ <keywords>
+ <keyword>C</keyword>
+ <keyword>Linux</keyword>
+ <keyword>Kernel</keyword>
+ </keywords>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="Makefile" name="Build" />
+ <group pattern="*.c" name="Source" />
+ </groups>
+ </kdevfileview>
+ <kdevcustomproject>
+ <envvars/>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir/>
+ </build>
+ <make>
+ <abortonerror>true</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ <envvars/>
+ </make>
+ <makeenvvars/>
+ </kdevcustomproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kmod/kmod.kdevtemplate b/languages/cpp/app_templates/kmod/kmod.kdevtemplate
new file mode 100644
index 00000000..03a335cd
--- /dev/null
+++ b/languages/cpp/app_templates/kmod/kmod.kdevtemplate
@@ -0,0 +1,89 @@
+# KDE Config File
+[General]
+Name=Linux Kernel module
+Name[br]=Mollad ar galon Linux
+Name[ca]=Mòdul del nucli Linux
+Name[da]=Linux kernemodul
+Name[de]=Linux-Kernelmodul
+Name[el]=ΆÏθÏωμα πυÏήνα Linux
+Name[es]=Módulo para el núcleo de Linux
+Name[et]=Linuxi kerneli moodul
+Name[eu]=Linux Kernel modulua
+Name[fa]=پیمانۀ هستۀ لینوکس
+Name[fr]=Module de noyau Linux
+Name[ga]=Modúl Eithne Linux
+Name[gl]=Módulo para o kernel Linux
+Name[hu]=Linuxos kernelmodul
+Name[it]=Modulo del kernel Linux
+Name[ja]=Linux カーãƒãƒ«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«
+Name[nds]=Linux-Kernelmoduul
+Name[ne]=लिनकà¥à¤¸ करà¥à¤¨à¥‡à¤² मोडà¥à¤¯à¥à¤²
+Name[nl]=Linux kernelmodule
+Name[pl]=Moduł jądra Linuksa
+Name[pt]=Módulo do 'kernel' do Linux
+Name[pt_BR]=Módulo do 'kernel' do Linux
+Name[ru]=Драйвер Ñдра Linux
+Name[sk]=Linux kernel modul
+Name[sr]=Модул језгра Linux-а
+Name[sr@Latn]=Modul jezgra Linux-a
+Name[sv]=Modul för Linux kärna
+Name[tr]=Linux Çekirdek Birimi
+Name[zh_CN]=Linux 内核模å—
+Name[zh_TW]=Linux 核心模組
+Icon=
+Category=C
+Comment=Generates a template for a Linux kernel module.
+Comment[ca]=Genera una plantilla per a un mòdul del nucli Linux.
+Comment[da]=Genererer en skabelon for en Linux kernemodul.
+Comment[de]=Erstellt eine Vorlage für ein Linux-Kernelmodul.
+Comment[el]=ΔημιουÏγεί ένα Ï€Ïότυπο για ένα άÏθÏωμα του πυÏήνα του Linux.
+Comment[es]=Genera una plantilla para un módulo del núcleo de Linux.
+Comment[et]=Linuxi kerneli mooduli malli loomine.
+Comment[eu]=Linux kernel modulu batentzat txantiloi bat sortzen du.
+Comment[fa]=قالبی برای پیمانۀ هستۀ لینوکس تولید می‌کند
+Comment[fr]=Génère un modèle pour un module de noyau Linux.
+Comment[gl]=Xera unha modelo dun módulo para o kernel Linux.
+Comment[hu]=Létrehoz egy sablont linuxos kernelmodul készítéséhez.
+Comment[it]=Genera un modello per un modulo del kernel Linux kernel.
+Comment[ja]=Linux カーãƒãƒ«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ç”¨ã®ãƒ†ãƒ³ãƒ—レートを作æˆã—ã¾ã™
+Comment[nds]=Stellt en Vörlaag för en Linux-Kernelmoduul op.
+Comment[ne]=लिनकà¥à¤¸ करà¥à¤¨à¥‡à¤² मोडà¥à¤¯à¥à¤²à¤•à¤¾ लागि टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een sjabloon voor een Linux kernelmodule
+Comment[pl]=Generuje szablon dla modułu jądra Linuksa.
+Comment[pt]=Gera um modelo para um módulo do 'kernel' do Linux.
+Comment[pt_BR]=Gera um modelo para um módulo do 'kernel' do Linux.
+Comment[ru]=Создание драйвера Ñдра Linux.
+Comment[sk]=Vygeneruje šablónu pre Linux kernel modul
+Comment[sr]=Прави шаблон за модул језгра Linux-а.
+Comment[sr@Latn]=Pravi Å¡ablon za modul jezgra Linux-a.
+Comment[sv]=Skapar en mall för en modul i Linux kärna.
+Comment[tr]=Bir Linux çekirdek birimi için bir şablon yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ª Linux 内核模å—的模æ¿ã€‚
+Comment[zh_TW]=產生一個 Linux 核心模組的樣本
+FileTemplates=h,CStyle,c,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}-driver.c
+Archive=kmod.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/kmod.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/src-Makefile
+Dest=%{dest}/Makefile
+
+[FILE3]
+Type=install
+Source=%{src}/kmod-driver.c
+Dest=%{dest}/%{APPNAMELC}-driver.c
+
+[MSG]
+Type=message
+Command=A linux kernel module was created in %{dest}
diff --git a/languages/cpp/app_templates/kmod/kmod.png b/languages/cpp/app_templates/kmod/kmod.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/kmod/kmod.png
Binary files differ
diff --git a/languages/cpp/app_templates/kmod/src-Makefile b/languages/cpp/app_templates/kmod/src-Makefile
new file mode 100644
index 00000000..92a2b461
--- /dev/null
+++ b/languages/cpp/app_templates/kmod/src-Makefile
@@ -0,0 +1,30 @@
+TARGET = %{APPNAMELC}-driver
+OBJS = %{APPNAMELC}-driver.o
+MDIR = drivers/misc
+
+EXTRA_CFLAGS = -DEXPORT_SYMTAB
+CURRENT = $(shell uname -r)
+KDIR = /lib/modules/$(CURRENT)/build
+PWD = $(shell pwd)
+DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR)
+
+obj-m := $(TARGET).o
+
+default:
+ make -C $(KDIR) SUBDIRS=$(PWD) modules
+
+$(TARGET).o: $(OBJS)
+ $(LD) $(LD_RFLAG) -r -o $@ $(OBJS)
+
+ifneq (,$(findstring 2.4.,$(CURRENT)))
+install:
+ su -c "cp -v $(TARGET).o $(DEST) && /sbin/depmod -a"
+else
+install:
+ su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a"
+endif
+
+clean:
+ -rm -f *.o *.ko .*.cmd .*.flags *.mod.c
+
+-include $(KDIR)/Rules.make
diff --git a/languages/cpp/app_templates/kofficepart/.kdev_ignore b/languages/cpp/app_templates/kofficepart/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/.kdev_ignore
diff --git a/languages/cpp/app_templates/kofficepart/Makefile.am b/languages/cpp/app_templates/kofficepart/Makefile.am
new file mode 100644
index 00000000..96280d88
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/Makefile.am
@@ -0,0 +1,21 @@
+dataFiles = kopart.kdevelop kopart_aboutdata.h kopart_part.cpp kopart_view.h \
+ src-Makefile.am kopart.png kopart_factory.cpp kopart_part.h \
+ subdirs kopart.desktop kopart.rc kopart_factory.h \
+ kopart_view.cpp x-kopart.desktop kde-configure.in.in \
+ main.cpp
+
+templateName = kopart
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kofficepart/kde-configure.in.in b/languages/cpp/app_templates/kofficepart/kde-configure.in.in
new file mode 100644
index 00000000..ec8e8bea
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kde-configure.in.in
@@ -0,0 +1,42 @@
+#MIN_CONFIG
+
+AM_INIT_AUTOMAKE(kotest, 0.1)
+
+AC_CHECK_HEADERS(unistd.h sys/param.h floatingpoint.h paths.h)
+KDE_CHECK_KIMGIO
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+dnl AC_DEFINE(USE_QFD, 1, [Define if you prefer the Qt provided file dialog])
+KWMF_INCLUDES='-I$(KDEDIR)/lib/kwmf -I$(KDEDIR)/lib/kwmf'
+AC_SUBST(KWMF_INCLUDES)
+
+KSTORE_INCLUDES='-I$(KDEDIR)/include'
+AC_SUBST(KSTORE_INCLUDES)
+
+KOFFICECORE_INCLUDES='-I$(KDEDIR)/include'
+AC_SUBST(KOFFICECORE_INCLUDES)
+
+KOFFICEUI_INCLUDES='-I$(KDEDIR)/include'
+AC_SUBST(KOFFICEUI_INCLUDES)
+
+LIB_KOFFICEUI='$(KDEDIR)/lib/libkofficeui.la'
+LIB_KOFFICECORE='$(KDEDIR)/lib/libkofficecore.la'
+LIB_KSTORE='$(KDEDIR)/lib/libkstore.la'
+LIB_KWMF='$(KDEDIR)/lib/libkwmf.la'
+AC_SUBST(LIB_KOFFICEUI)
+AC_SUBST(LIB_KOFFICECORE)
+AC_SUBST(LIB_KSTORE)
+AC_SUBST(LIB_KWMF)
+
+KOFFICE_LIBS='$(LIB_KOFFICEUI) $(LIB_KOFFICECORE) $(LIB_KSTORE)'
+AC_SUBST(KOFFICE_LIBS)
+
+KOFFICE_INCLUDES='$(KOFFICEUI_INCLUDES) $(KOFFICECORE_INCLUDES) $(KSTORE_INCLUDES) $(KWMF_INCLUDES)'
+AC_SUBST(KOFFICE_INCLUDES)
+
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+AC_CHECK_HEADERS(streambuf streambuf.h)
+AC_LANG_RESTORE
+
diff --git a/languages/cpp/app_templates/kofficepart/kopart.desktop b/languages/cpp/app_templates/kofficepart/kopart.desktop
new file mode 100644
index 00000000..8b2be99e
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+X-KDE-Library=lib%{APPNAMELC}part
+MimeType=application/x-%{APPNAMELC};
+Type=Application
+Icon=%{APPNAMELC}
+ServiceTypes=KOfficePart,KParts/ReadOnlyPart,KParts/ReadWritePart
+X-KDE-NativeMimeType=application/x-%{APPNAMELC}
diff --git a/languages/cpp/app_templates/kofficepart/kopart.kdevelop b/languages/cpp/app_templates/kofficepart/kopart.kdevelop
new file mode 100644
index 00000000..bf70fc63
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>kioslave</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/lib%{APPNAMELC}part.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kofficepart/kopart.kdevtemplate b/languages/cpp/app_templates/kofficepart/kopart.kdevtemplate
new file mode 100644
index 00000000..9d5ecba4
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart.kdevtemplate
@@ -0,0 +1,231 @@
+# KDE Config File
+[General]
+Name=KOffice Part
+Name[br]=Perzh KOffice
+Name[ca]=Part per a KOffice
+Name[da]=KOffice part
+Name[de]=KOffice-Komponente
+Name[el]=Τμήμα KOffice
+Name[es]=Part de KOffice
+Name[et]=KOffice'i komponent
+Name[eu]=KOffice zatia
+Name[fa]=جزء KOffice
+Name[fr]=Composant KOffice
+Name[ga]=Páirt KOffice
+Name[gl]='Part' para KOffice
+Name[hu]=KOffice-objektum
+Name[it]=Part di KOffice
+Name[nds]=KOffice-Komponent
+Name[ne]=केडीई अफिस भाग
+Name[nl]=Koffice-part
+Name[pt]=Componente do KOffice
+Name[pt_BR]=Componente do KOffice
+Name[ru]=Приложение KOffice
+Name[sr]=KOffice део
+Name[sr@Latn]=KOffice deo
+Name[sv]=Koffice-delprogram
+Name[tr]=KOffice BileÅŸeni
+Name[zh_CN]=KOffice 部件
+Name[zh_TW]=KOffice 元件
+Icon=kopart.png
+Category=C++/KDE
+Comment=Generates a framework for a full KOffice Application.
+Comment[ca]=Genera una infraestructura per a una completa aplicació de KOffice.
+Comment[da]=Genererer et skelet for et fuldstændigt KOffice-program.
+Comment[de]=Erstellt ein Grundgerüst für eine vollwertige KOffice-Anwendung
+Comment[el]=ΔημιουÏγεί ένα πλαίσιο για μια πλήÏης εφαÏμογή του KOffice.
+Comment[es]=Genera una infraestructura para una aplicación completa de KOffice.
+Comment[et]=KOffice'i rakenduse raamistiku loomine.
+Comment[eu]=KOffice-en aplikazio batentzat lan-marko oso bat sortzen du.
+Comment[fa]=چارچوبی را برای کاربرد کامل KOffice تولید می‌کند.
+Comment[fr]=Génère une infrastructure pour une application KOffice complète.
+Comment[gl]=Xera un contorno de traballo para unha aplicación KOffice completa.
+Comment[hu]=Létrehoz egy kiindulási keretprogramot teljes KOffice-alkalmazás készítéséhez.
+Comment[it]=Genera l'infrastruttura per un'applicazione completa di KOffice.
+Comment[nds]=Stellt dat Rahmenwark för en heel KOffice-Programm op.
+Comment[ne]=पूरà¥à¤£ केडीई अफिस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—का लागि फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een framework voor een volledige KOffice-toepassing
+Comment[pl]=Generuje szablon pełnego programu KOffice.
+Comment[pt]=Gera a plataforma para uma aplicação completa do KOffice.
+Comment[pt_BR]=Gera a plataforma para uma aplicação completa do KOffice.
+Comment[ru]=Создание Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KOffice.
+Comment[sk]=Vygeneruje framework pre kompletnú aplikáciu KOffice.
+Comment[sl]=Ustvari ogrodje za poln program KOffice
+Comment[sr]=Прави радни оквир за пуни KOffice програм.
+Comment[sr@Latn]=Pravi radni okvir za puni KOffice program.
+Comment[sv]=Skapar ett ramverk för ett fullständigt Koffice-program.
+Comment[tr]=Tam bir KOffice Uygulaması için bir çatı yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªå…¨åŠŸèƒ½çš„ KOffice 应用程åºæ¡†æž¶ã€‚
+Comment[zh_TW]=產生一個完整的 KOffice 應用程å¼çš„框架
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}_part.cpp
+Archive=kopart.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/kopart.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE9]
+Type=install
+Source=%{src}/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/kopart_view.cpp
+Dest=%{dest}/src/%{APPNAMELC}_view.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/kopart_view.h
+Dest=%{dest}/src/%{APPNAMELC}_view.h
+
+[FILE14]
+Type=install
+Source=%{src}/kopart_part.cpp
+Dest=%{dest}/src/%{APPNAMELC}_part.cpp
+
+[FILE15]
+Type=install
+Source=%{src}/kopart_part.h
+Dest=%{dest}/src/%{APPNAMELC}_part.h
+
+[FILE16]
+Type=install
+Source=%{src}/kopart_factory.cpp
+Dest=%{dest}/src/%{APPNAMELC}_factory.cpp
+
+[FILE17]
+Type=install
+Source=%{src}/kopart_factory.h
+Dest=%{dest}/src/%{APPNAMELC}_factory.h
+
+[FILE18]
+Type=install
+Source=%{src}/kopart_aboutdata.h
+Dest=%{dest}/src/%{APPNAMELC}_aboutdata.h
+
+[FILE19]
+Type=install
+EscapeXML=true
+Source=%{src}/kopart.rc
+Dest=%{dest}/src/%{APPNAMELC}.rc
+
+[FILE20]
+Type=install
+Source=%{src}/kopart.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE21]
+Type=install
+Source=%{src}/x-kopart.desktop
+Dest=%{dest}/src/x-%{APPNAMELC}.desktop
+
+[FILE22]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[MSG]
+Type=message
+Comment=A KOffice part was created in %{dest}
+Comment[ca]=Una part per a KOffice ha estat creada en %{dest}
+Comment[da]=En KOffice part blev oprettet i %{dest}
+Comment[de]=Eine KOffice-Komponente wurde in %{dest} erstellt.
+Comment[el]=Ένα τμήμα του KOffice δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un Part de KOffice ha sido creado en %{dest}
+Comment[et]=KOffice'i komponent loodi asukohta %{dest}
+Comment[eu]=KOffice zati bat sortu da hemen: %{dest}
+Comment[fa]=یک جزء KOffice در %{dest} ایجاد شد
+Comment[fr]=Un composant KOffice a été créé dans %{dest}
+Comment[ga]=Cruthaíodh páirt KDE i %{dest}
+Comment[gl]=Creouse unha 'part' para KOffice en %{dest}
+Comment[hu]=Létrejött egy KOffice-objektum itt: %{dest}
+Comment[it]=È stata creata una part di KOffice in %{dest}
+Comment[ja]=KOffice パートを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KOffice-Komponent opstellt
+Comment[ne]=केडीई अफिस भाग %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een KOffice-part is aangemaakt in %{dest}
+Comment[pl]=KOffice part została utworzona w %{dest}
+Comment[pt]=Foi criado um componente do KOffice em %{dest}
+Comment[pt_BR]=Foi criado um componente do KOffice em %{dest}
+Comment[ru]=Приложение KOffice Ñоздано в %{dest}
+Comment[sk]=KOffice Part bol vytvorený v %{dest}
+Comment[sr]=KOffice део је направљен у %{dest}
+Comment[sr@Latn]=KOffice deo je napravljen u %{dest}
+Comment[sv]=Ett Koffice-delprogram skapades i %{dest}
+Comment[tr]=Bir KOffice bileşeni %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 KOffice 部件
+Comment[zh_TW]=一個 KOffice 元件已建立於 %{dest}
diff --git a/languages/cpp/app_templates/kofficepart/kopart.png b/languages/cpp/app_templates/kofficepart/kopart.png
new file mode 100644
index 00000000..fa45e5c3
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart.png
Binary files differ
diff --git a/languages/cpp/app_templates/kofficepart/kopart.rc b/languages/cpp/app_templates/kofficepart/kopart.rc
new file mode 100644
index 00000000..d03230ec
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart.rc
@@ -0,0 +1,10 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd" ><kpartgui name="%{APPNAME}" version="1">
+<MenuBar>
+ <Menu name="Edit"><text>Edit</text>
+ <Action name="cut"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="editToolBar"><Text>Edit</Text>
+ <Action name="cut"/>
+</ToolBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kofficepart/kopart_aboutdata.h b/languages/cpp/app_templates/kofficepart/kopart_aboutdata.h
new file mode 100644
index 00000000..ab66d088
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart_aboutdata.h
@@ -0,0 +1,24 @@
+
+/* This template is based off of the KOffice example written by Torben Weis <weis@kde.org
+ It was converted to a KDevelop template by Ian Reinhart Geiser <geiseri@yahoo.com>
+*/
+
+#ifndef %{APPNAME}_ABOUTDATA
+#define %{APPNAME}_ABOUTDATA
+
+#include <kaboutdata.h>
+#include <klocale.h>
+
+static const char description[] = I18N_NOOP("%{APPNAME} KOffice Program");
+static const char version[] = "%{VERSION}";
+
+KAboutData * new%{APPNAME}AboutData()
+{
+ KAboutData * aboutData=new KAboutData( "%{APPNAMELC}", I18N_NOOP("%{APPNAME}"),
+ version, description, KAboutData::License_%{LICENSE},
+ "(c) %{YEAR}, %{AUTHOR}");
+ aboutData->addAuthor("%{AUTHOR}",0, "%{EMAIL}");
+ return aboutData;
+}
+
+#endif
diff --git a/languages/cpp/app_templates/kofficepart/kopart_factory.cpp b/languages/cpp/app_templates/kofficepart/kopart_factory.cpp
new file mode 100644
index 00000000..bd79c317
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart_factory.cpp
@@ -0,0 +1,76 @@
+
+/* This template is based off of the KOffice example written by Torben Weis <weis@kde.org
+ It was converted to a KDevelop template by Ian Reinhart Geiser <geiseri@yahoo.com>
+*/
+#include <%{APPNAMELC}_factory.h>
+#include <%{APPNAMELC}_part.h>
+#include <%{APPNAMELC}_aboutdata.h>
+#include <kinstance.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kglobal.h>
+
+extern "C"
+{
+ void* init_lib%{APPNAMELC}part()
+ {
+ KGlobal::locale()->insertCatalogue("%{APPNAMELC}");
+ return new %{APPNAME}Factory;
+ }
+};
+
+KInstance* %{APPNAME}Factory::s_global = 0L;
+KAboutData* %{APPNAME}Factory::s_aboutData = 0L;
+
+%{APPNAME}Factory::%{APPNAME}Factory( QObject* parent, const char* name )
+ : KoFactory( parent, name )
+{
+ global();
+}
+
+%{APPNAME}Factory::~%{APPNAME}Factory()
+{
+ delete s_aboutData;
+ s_aboutData = 0L;
+ delete s_global;
+ s_global = 0L;
+}
+
+KParts::Part* %{APPNAME}Factory::createPartObject( QWidget *parentWidget, const char *widgetName, QObject* parent, const char* name, const char* classname, const QStringList & )
+{
+ // If classname is "KoDocument", our host is a koffice application
+ // otherwise, the host wants us as a simple part, so switch to readonly and single view.
+ bool bWantKoDocument = ( strcmp( classname, "KoDocument" ) == 0 );
+
+ // parentWidget and widgetName are used by KoDocument for the "readonly+singleView" case.
+ %{APPNAME}Part *part = new %{APPNAME}Part( parentWidget, widgetName, parent, name, !bWantKoDocument );
+
+ if ( !bWantKoDocument )
+ part->setReadWrite( false );
+
+ return part;
+}
+
+KAboutData* %{APPNAME}Factory::aboutData()
+{
+ if ( !s_aboutData )
+ // Change this, of course
+ s_aboutData = new%{APPNAME}AboutData();
+ return s_aboutData;
+}
+
+KInstance* %{APPNAME}Factory::global()
+{
+ if ( !s_global )
+ {
+ s_global = new KInstance( aboutData() );
+ // Add any application-specific resource directories here
+
+ // Tell the iconloader about share/apps/koffice/icons
+ s_global->iconLoader()->addAppDir("koffice");
+ }
+ return s_global;
+}
+
+#include <%{APPNAMELC}_factory.moc>
diff --git a/languages/cpp/app_templates/kofficepart/kopart_factory.h b/languages/cpp/app_templates/kofficepart/kopart_factory.h
new file mode 100644
index 00000000..45f1f649
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart_factory.h
@@ -0,0 +1,33 @@
+
+/* This template is based off of the KOffice example written by Torben Weis <weis@kde.org
+ It was converted to a KDevelop template by Ian Reinhart Geiser <geiseri@yahoo.com>
+*/
+
+#ifndef %{APPNAME}_FACTORY_H
+#define %{APPNAME}_FACTORY_H
+
+#include <koFactory.h>
+
+class KInstance;
+class KAboutData;
+
+class %{APPNAME}Factory : public KoFactory
+{
+ Q_OBJECT
+public:
+ %{APPNAME}Factory( QObject* parent = 0, const char* name = 0 );
+ ~%{APPNAME}Factory();
+
+ virtual KParts::Part *createPartObject( QWidget *parentWidget = 0, const char *widgetName = 0, QObject *parent = 0, const char *name = 0, const char *classname = "KoDocument", const QStringList &args = QStringList() );
+
+ static KInstance* global();
+
+ // _Creates_ a KAboutData but doesn't keep ownership
+ static KAboutData* aboutData();
+
+private:
+ static KInstance* s_global;
+ static KAboutData* s_aboutData;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kofficepart/kopart_part.cpp b/languages/cpp/app_templates/kofficepart/kopart_part.cpp
new file mode 100644
index 00000000..500179f3
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart_part.cpp
@@ -0,0 +1,69 @@
+
+/* This template is based off of the KOffice example written by Torben Weis <weis@kde.org
+ It was converted to a KDevelop template by Ian Reinhart Geiser <geiseri@yahoo.com>
+*/
+
+#include "%{APPNAMELC}_part.h"
+#include "%{APPNAMELC}_view.h"
+
+#include <qpainter.h>
+
+%{APPNAME}Part::%{APPNAME}Part( QWidget *parentWidget, const char *widgetName, QObject* parent, const char* name, bool singleViewMode )
+ : KoDocument( parentWidget, widgetName, parent, name, singleViewMode )
+{
+}
+
+bool %{APPNAME}Part::initDoc( InitDocFlags flags, QWidget* parentWidget )
+{
+ // If nothing is loaded, do initialize here
+ return TRUE;
+}
+
+KoView* %{APPNAME}Part::createViewInstance( QWidget* parent, const char* name )
+{
+ return new %{APPNAME}View( this, parent, name );
+}
+
+bool %{APPNAME}Part::loadOasis( const QDomDocument & doc, KoOasisStyles& oasisStyles, const QDomDocument & settings, KoStore* store )
+{
+ /// @todo load the document using the OASIS format
+ return true;
+}
+
+bool %{APPNAME}Part::loadXML( QIODevice *, const QDomDocument & )
+{
+ /// @todo load the document from the QDomDocument
+ return true;
+}
+
+QDomDocument %{APPNAME}Part::saveXML()
+{
+ /// @todo save the document into a QDomDocument
+ return QDomDocument();
+}
+
+bool %{APPNAME}Part::saveOasis( KoStore* store, KoXmlWriter* manifestWriter )
+{
+ /// @todo save the document using the OASIS format
+ return true;
+}
+
+
+void %{APPNAME}Part::paintContent( QPainter& painter, const QRect& rect, bool /*transparent*/,
+ double /*zoomX*/, double /*zoomY*/ )
+{
+ // ####### handle transparency
+
+ // Need to draw only the document rectangle described in the parameter rect.
+ int left = rect.left() / 20;
+ int right = rect.right() / 20 + 1;
+ int top = rect.top() / 20;
+ int bottom = rect.bottom() / 20 + 1;
+
+ for( int x = left; x < right; ++x )
+ painter.drawLine( x * 20, top * 20, x * 20, bottom * 20 );
+ for( int y = left; y < right; ++y )
+ painter.drawLine( left * 20, y * 20, right * 20, y * 20 );
+}
+
+#include "%{APPNAMELC}_part.moc"
diff --git a/languages/cpp/app_templates/kofficepart/kopart_part.h b/languages/cpp/app_templates/kofficepart/kopart_part.h
new file mode 100644
index 00000000..03361ca7
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart_part.h
@@ -0,0 +1,30 @@
+
+/* This template is based off of the KOffice example written by Torben Weis <weis@kde.org
+ It was converted to a KDevelop template by Ian Reinhart Geiser <geiseri@yahoo.com>
+*/
+
+#ifndef %{APPNAME}_PART_H
+#define %{APPNAME}_PART_H
+
+#include <koDocument.h>
+
+class %{APPNAME}Part : public KoDocument
+{
+ Q_OBJECT
+public:
+ %{APPNAME}Part( QWidget *parentWidget = 0, const char *widgetName = 0, QObject* parent = 0, const char* name = 0, bool singleViewMode = false );
+
+ virtual void paintContent( QPainter& painter, const QRect& rect, bool transparent = FALSE, double zoomX = 1.0, double zoomY = 1.0 );
+
+ virtual bool initDoc( InitDocFlags flags, QWidget* parentWidget = 0 );
+
+ virtual bool loadOasis( const QDomDocument & doc, KoOasisStyles& oasisStyles, const QDomDocument & settings, KoStore* store );
+ virtual bool loadXML( QIODevice *, const QDomDocument & );
+ virtual QDomDocument saveXML();
+ virtual bool saveOasis( KoStore* store, KoXmlWriter* manifestWriter );
+
+protected:
+ virtual KoView* createViewInstance( QWidget* parent, const char* name );
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kofficepart/kopart_view.cpp b/languages/cpp/app_templates/kofficepart/kopart_view.cpp
new file mode 100644
index 00000000..28c0b42f
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart_view.cpp
@@ -0,0 +1,52 @@
+
+/* This template is based off of the KOffice example written by Torben Weis <weis@kde.org
+ It was converted to a KDevelop template by Ian Reinhart Geiser <geiseri@yahoo.com>
+*/
+#include "%{APPNAMELC}_view.h"
+#include "%{APPNAMELC}_factory.h"
+#include "%{APPNAMELC}_part.h"
+
+#include <qpainter.h>
+#include <qiconset.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+%{APPNAME}View::%{APPNAME}View( %{APPNAME}Part* part, QWidget* parent, const char* name )
+ : KoView( part, parent, name )
+{
+ setInstance( %{APPNAME}Factory::global() );
+ setXMLFile( "%{APPNAMELC}.rc" );
+ KStdAction::cut(this, SLOT( cut() ), actionCollection(), "cut" );
+ // Note: Prefer KStdAction::* to any custom action if possible.
+ //m_cut = new KAction( i18n("&Cut"), "editcut", 0, this, SLOT( cut() ),
+ // actionCollection(), "cut");
+}
+
+void %{APPNAME}View::paintEvent( QPaintEvent* ev )
+{
+ QPainter painter;
+ painter.begin( this );
+
+ /// @todo Scaling
+
+ // Let the document do the drawing
+ koDocument()->paintEverything( painter, ev->rect(), FALSE, this );
+
+ painter.end();
+}
+
+void %{APPNAME}View::updateReadWrite( bool /*readwrite*/ )
+{
+#ifdef __GNUC__
+#warning TODO
+#endif
+}
+
+void %{APPNAME}View::cut()
+{
+ kdDebug(31000) << "%{APPNAME}View::cut(): CUT called" << endl;
+}
+
+#include "%{APPNAMELC}_view.moc"
diff --git a/languages/cpp/app_templates/kofficepart/kopart_view.h b/languages/cpp/app_templates/kofficepart/kopart_view.h
new file mode 100644
index 00000000..eb14763f
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/kopart_view.h
@@ -0,0 +1,34 @@
+
+/* This template is based off of the KOffice example written by Torben Weis <weis@kde.org
+ It was converted to a KDevelop template by Ian Reinhart Geiser <geiseri@yahoo.com>
+*/
+
+#ifndef %{APPNAME}_VIEW
+#define %{APPNAME}_VIEW
+
+#include <koView.h>
+
+class KAction;
+class QPaintEvent;
+
+class %{APPNAME}Part;
+
+class %{APPNAME}View : public KoView
+{
+ Q_OBJECT
+public:
+ %{APPNAME}View( %{APPNAME}Part* part, QWidget* parent = 0, const char* name = 0 );
+
+protected slots:
+ void cut();
+
+protected:
+ void paintEvent( QPaintEvent* );
+
+ virtual void updateReadWrite( bool readwrite );
+
+private:
+ //KAction* m_cut;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kofficepart/main.cpp b/languages/cpp/app_templates/kofficepart/main.cpp
new file mode 100644
index 00000000..1561922a
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/main.cpp
@@ -0,0 +1,33 @@
+
+/* This template is based off of the KOffice example written by Torben Weis <weis@kde.org
+ It was converted to a KDevelop template by Ian Reinhart Geiser <geiseri@yahoo.com>
+*/
+
+#include <koApplication.h>
+#include <koDocument.h>
+#include <koMainWindow.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include <dcopclient.h>
+#include "%{APPNAMELC}_aboutdata.h"
+
+
+static const KCmdLineOptions options[]=
+{
+ {"+[file]", I18N_NOOP("File to open"),0},
+ KCmdLineLastOption
+};
+
+int main( int argc, char **argv )
+{
+ KCmdLineArgs::init( argc, argv, new%{APPNAME}AboutData() );
+ KCmdLineArgs::addCmdLineOptions( options );
+ KoApplication app;
+
+ app.dcopClient()->attach();
+ app.dcopClient()->registerAs( "%{APPNAMELC}" );
+
+ if (!app.start()) // parses command line args, create initial docs and shells
+ return 1;
+ return app.exec();
+}
diff --git a/languages/cpp/app_templates/kofficepart/src-Makefile.am b/languages/cpp/app_templates/kofficepart/src-Makefile.am
new file mode 100644
index 00000000..19d38267
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/src-Makefile.am
@@ -0,0 +1,41 @@
+
+INCLUDES = $(KOFFICE_INCLUDES) $(all_includes)
+
+## The part
+kde_module_LTLIBRARIES = lib%{APPNAMELC}part.la
+lib%{APPNAMELC}part_la_SOURCES = %{APPNAMELC}_part.cpp \
+ %{APPNAMELC}_view.cpp %{APPNAMELC}_factory.cpp
+lib%{APPNAMELC}part_la_LDFLAGS = $(KDE_PLUGIN)
+lib%{APPNAMELC}part_la_LIBADD = -lkofficeui
+
+## The kdeinit loadable module
+lib_LTLIBRARIES = %{APPNAMELC}.la
+%{APPNAMELC}_la_SOURCES = %{APPNAMELC}.cpp
+%{APPNAMELC}_la_LDFLAGS = -module -avoid-version -no-undefined $(all_libraries)
+%{APPNAMELC}_la_LIBADD = -lkofficecore
+
+## The executable
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = dummy.cpp
+%{APPNAMELC}_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+%{APPNAMELC}_LDADD = %{APPNAMELC}.la
+
+dummy.cpp:
+ echo > dummy.cpp
+
+METASOURCES = AUTO
+noinst_HEADERS = %{APPNAMELC}_part.h \
+ %{APPNAMELC}_view.h %{APPNAMELC}_factory.h %{APPNAMELC}_aboutdata.h
+
+kdelnk_DATA = %{APPNAMELC}.desktop
+kdelnkdir = $(kde_appsdir)/Office
+
+kdemime_DATA = x-%{APPNAMELC}.desktop
+kdemimedir = $(kde_mimedir)/application
+
+rc_DATA = %{APPNAMELC}.rc
+rcdir = $(kde_datadir)/%{APPNAMELC}
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp %{APPNAMELC}_aboutdata.h -o $(podir)/%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/kofficepart/subdirs b/languages/cpp/app_templates/kofficepart/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kofficepart/x-kopart.desktop b/languages/cpp/app_templates/kofficepart/x-kopart.desktop
new file mode 100644
index 00000000..f4e15e79
--- /dev/null
+++ b/languages/cpp/app_templates/kofficepart/x-kopart.desktop
@@ -0,0 +1,40 @@
+# KDE Config File
+[Desktop Entry]
+MimeType=application/x-%{APPNAMELC}
+Comment= A really awesome KOffice application
+Comment[ca]=Una aplicació de KOffice realment interessant
+Comment[da]=Et helt fantastisk KOffice program
+Comment[de]=Eine wirklich großartige KOffice-Anwendung
+Comment[el]= Μια Ï€Ïαγματικά όμοÏφη εφαÏμογή KOffice
+Comment[es]=Una aplicación de KOffice realmente intesesante
+Comment[et]=Tõesti imeline KOffice'i rakendus
+Comment[eu]=KOffice aplikazio harrigarri bat
+Comment[fa]=کاربرد واقعاً بیمناک KOffice
+Comment[fr]=Une application pour KOffice vraiment superbe
+Comment[ga]= Feidhmchlár sármhaith KOffice
+Comment[gl]=Unha aplicación de KOffice realmente impresionante
+Comment[hu]=Egy bámulatos KOffice-alkalmazás
+Comment[it]=Un'applicazione di KOffice veramente bella
+Comment[nds]=En redig deegt KOffice-Programm
+Comment[ne]= वासà¥à¤¤à¤µà¤®à¥ˆ पà¥à¤°à¤­à¤¾à¤µà¤•à¤¾à¤°à¥€ केडीई अफिस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een fantastische KOffice-toepassing
+Comment[pl]=Wspaniały program KOffice
+Comment[pt]=Uma aplicação fantástica para o KOffice
+Comment[pt_BR]=Um aplicativo realmente do tipo do KOffice
+Comment[ru]=Приложение KOffice
+Comment[sk]=Naozaj hrozná KOffice aplikácia
+Comment[sl]=Sijajen program za KOffice
+Comment[sr]=Стварно Ñјајан KOffice програм
+Comment[sr@Latn]=Stvarno sjajan KOffice program
+Comment[sv]=Ett riktigt suveränt Koffice-program
+Comment[tr]=Gerçekten harika bir KOffice uygulaması
+Comment[zh_CN]=一个éžå¸¸æ°å‡ºçš„ KOffice 应用程åº
+Comment[zh_TW]=一個å分完美的 KOffice 應用程å¼
+Type=MimeType
+#You need to change the mime type below to match what your application will handle...
+Patterns=*.xmpl;
+X-KDE-AutoEmbed=false
+[Property::X-KDE-NativeExtension]
+Type=QString
+#You need to change the mime type below to match what your application will handle...
+Value=.xmpl
diff --git a/languages/cpp/app_templates/konqnavpanel/.kdev_ignore b/languages/cpp/app_templates/konqnavpanel/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/.kdev_ignore
diff --git a/languages/cpp/app_templates/konqnavpanel/Makefile.am b/languages/cpp/app_templates/konqnavpanel/Makefile.am
new file mode 100644
index 00000000..7a3ae56b
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = konqnavpanel.cpp konqnavpanel.h konqnavpanel.desktop \
+ konqnavpanel.kdevelop src-Makefile.am \
+ konqnavpanel.png subdirs
+templateName = konqnavpanel
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/konqnavpanel/konqnavpanel.cpp b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.cpp
new file mode 100644
index 00000000..34515ce2
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.cpp
@@ -0,0 +1,34 @@
+
+#include <qlabel.h>
+#include <kinstance.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+#include "%{APPNAMELC}.h"
+#include "%{APPNAMELC}.moc"
+
+%{APPNAME}::%{APPNAME}(KInstance *inst,QObject *parent,QWidget *widgetParent, QString &desktopName, const char* name):
+ KonqSidebarPlugin(inst,parent,widgetParent,desktopName,name)
+{
+ widget=new QLabel("Init Value",widgetParent);
+}
+
+
+%{APPNAME}::~%{APPNAME}()
+{
+}
+
+void %{APPNAME}::handleURL(const KURL &url)
+{
+ widget->setText(QString("%{APPNAME}")+"::"+url.url());
+}
+
+
+
+extern "C"
+{
+ void* create_konqsidebar_%{APPNAME}(KInstance *instance,QObject *par,QWidget *widp,QString &desktopname,const char *name)
+ {
+ return new %{APPNAME}(instance,par,widp,desktopname,name);
+ }
+};
diff --git a/languages/cpp/app_templates/konqnavpanel/konqnavpanel.desktop b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.desktop
new file mode 100644
index 00000000..31e23a1a
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.desktop
@@ -0,0 +1,39 @@
+[Desktop Entry]
+Type=Link
+URL=
+Icon=wizard
+Comment=A konqueror navigation panel plugin called $NAME$
+Comment[ca]=Un connector per al plafó de navegació de Konqueror anomenat $NAME$
+Comment[da]=Et Konqueror navigationspanel plugin der hedder $NAME$
+Comment[de]=Ein Modul für den Navigationsbereich von Konqueror mit Namen $NAME$
+Comment[el]=Ένα Ï€Ïόσθετο του πίνακα πλοήγησης του konqueror με το όνομα $NAME$
+Comment[es]=Un complemento del panel de navegación de Konqueror llamado $NAME$
+Comment[et]=Konquerori liikumispaneeli plugin nimega $NAME$
+Comment[eu]=$NAME$ izeneko konqueror arakatze-paneleko plugin bat
+Comment[fa]=وصلۀ تابلوی ناوش konqueror، $NAME$ نامیده شد
+Comment[fr]=Un module externe pour le panneau de navigation de Konqueror appelé $NAME$
+Comment[ga]=Breiseán painéil nascleanúna konqueror darb ainm $NAME$
+Comment[gl]=Unha extensión para o panel de navegación de konqueror chamado $NAME$
+Comment[hu]=Bővítőmodul a Konqueror navigációs paneljéhez ($NAMES$)
+Comment[it]=Un plugin per il pannello di navigazione di Konqueror chiamato $NAME$
+Comment[ja]=$NAME$ ã¨å‘¼ã°ã‚Œã‚‹ konqueror ナビゲーションプラグイン
+Comment[nds]=En Sietpaneelmoduul för Konqueror, nöömt $NAME$
+Comment[ne]= $NAME$ भनिने कनà¥à¤•à¥à¤µà¥‡à¤°à¤° नेभिगेसन पà¥à¤¯à¤¾à¤¨à¤² पà¥à¤²à¤—इन
+Comment[nl]=Een konqueror navigatiepaneel-plugin met de naam $NAME$
+Comment[pl]=Wtyczka do panelu nawigacyjnego Konquerora o nazwie $NAME$
+Comment[pt]=Um 'plugin' do painel de navegação do konqueror chamado $NAME$
+Comment[pt_BR]=Um plug-in de painel de navegação do konqueror chamado $NAME$
+Comment[ru]=Модуль панели навигации Konqueror $NAME$
+Comment[sk]=Modul pre konqueror navigaÄný panel s menom $NAME$
+Comment[sl]=Konquerorjev vstavek pulta za navigacijo z imenom $NAME$
+Comment[sr]=Кonqueror-ов прикључак за навигациони панел по имену $NAME$
+Comment[sr@Latn]=Konqueror-ov prikljuÄak za navigacioni panel po imenu $NAME$
+Comment[sv]=Ett insticksprogram i Konquerors navigeringspanel som heter $NAME$
+Comment[tr]=$NAME$ adında bir konqueror gezinme paneli eklentisi
+Comment[zh_CN]=一个称作 $NAME$ çš„ konqueror 导航é¢æ¿æ’件
+Comment[zh_TW]=å稱為 $NAME$ çš„ Konqueror 導覽é¢æ¿å¤–掛程å¼
+Name=%{APPNAMELC}
+
+Open=false
+X-KDE-KonqSidebarModule=konqsidebar_%{APPNAMELC}
+
diff --git a/languages/cpp/app_templates/konqnavpanel/konqnavpanel.h b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.h
new file mode 100644
index 00000000..949c68d3
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.h
@@ -0,0 +1,43 @@
+
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <konqsidebarplugin.h>
+#include <qstring.h>
+#include <kconfig.h>
+
+
+class %{APPNAME} : public KonqSidebarPlugin
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Construct a @ref KonqSidebarPlugin.
+ *
+ * @param inst The sidebar's kinstance class.
+ * @param parent The sidebar internal button info class responsible for this plugin.
+ * @param widgetParent The container which will contain the plugins widget.
+ * @param desktopName The filename of the configuration file.
+ * @param name A Qt object name for your plugin.
+ **/
+ %{APPNAME}(KInstance *inst,QObject *parent,QWidget *widgetParent, QString &desktopName, const char* name=0);
+
+ /** destructor */
+ ~%{APPNAME}();
+
+ virtual QWidget *getWidget(){return widget;}
+ virtual void *provides(const QString &) {return 0;}
+
+protected:
+ /*Example widget only. You use whichever widget you want. You onl have to care that getWidget returns some kind of widget */
+ QLabel *widget;
+ virtual void handleURL(const KURL &url);
+
+};
+
+#endif
diff --git a/languages/cpp/app_templates/konqnavpanel/konqnavpanel.kdevelop b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.kdevelop
new file mode 100644
index 00000000..8bb35326
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.kdevelop
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>Kicker</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/lib%{APPNAMELC}.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/konqnavpanel/konqnavpanel.kdevtemplate b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.kdevtemplate
new file mode 100644
index 00000000..4cbc7d5d
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.kdevtemplate
@@ -0,0 +1,192 @@
+# KDE Config File
+[General]
+Name=Konqueror Navigation Panel Plugin
+Name[br]=Lugent panell furchal Konqueror
+Name[ca]=Un connector per al plafó de navegació de Konqueror
+Name[da]=Konqueror navigationspanel plugin
+Name[de]=Modul für den Navigationsbereich von Konqueror
+Name[el]=ΠÏόσθετο πίνακα πλοήγησης του Konqueror
+Name[es]=Un complemento para el panel de navegación de Konqueror
+Name[et]=Konquerori liikumispaneeli plugin
+Name[eu]=Konqueror arakatze-panel plugina
+Name[fa]=وصلۀ تابلوی ناوش Konqueror
+Name[fr]=Module externe pour le panneau de navigation de Konqueror
+Name[ga]=Breiseán Painéil Nascleanúna Konqueror
+Name[gl]=Extensión para o panel de navegación de Konqueror
+Name[hu]=Konqueroros navigációs bővítőmodul
+Name[it]=Plugin per il pannello di navigazione di Konqueror
+Name[ja]=Konqueror ナビゲーションプラグイン
+Name[nds]=En Sietpaneelmoduul för Konqueror
+Name[ne]=कनà¥à¤•à¥à¤µà¥‡à¤°à¤° नेभिगेसन पà¥à¤¯à¤¾à¤¨à¤² पà¥à¤²à¤—इन
+Name[nl]=Konqueror Navigatiepaneel-plugin
+Name[pl]=Wtyczka panelu nawigacji Konquerora
+Name[pt]='Plugin' do Painel de Navegação do Konqueror
+Name[pt_BR]='Plugin' do Painel de Navegação do Konqueror
+Name[ru]=Модуль панели навигации Konqueror
+Name[sk]=Modul pre konqueror navigaÄný panel
+Name[sr]=Кonqueror-ов прикључак за навигациони панел
+Name[sr@Latn]=Konqueror-ov prikljuÄak za navigacioni panel
+Name[sv]=Konqueror-insticksprogram för navigeringspanelen
+Name[tr]=Konqueror Gezinme Paneli Eklentisi
+Name[zh_CN]=Konqueror 导航é¢æ¿æ’件
+Name[zh_TW]=Konqueror 導覽é¢æ¿å¤–掛程å¼
+Icon=konqnavpanel.png
+Category=C++/KDE
+Comment=Generates a framework for a plugin that embeds into Konqueror's navigation panel
+Comment[ca]=Genera una infraestructura per a un connector que s'encasti al plafó de navegació de Konqueror
+Comment[da]=Genererer et skelet for et plugin der indlejres i Konqueror's navigationspanel
+Comment[de]=Erstellt das Gerüst für ein Modul, das in den Navigationsbereich von Konqueror eingebunden werden kann.
+Comment[el]=ΔημιουÏγεί ένα πλαίσιο για ένα Ï€Ïόσθετο που ενσωματώνεται στον πίνακα πλοήγησης του Konqueror
+Comment[es]=Genera una infraestructura para un complemento empotrado en el panel de navegación de Konqueror
+Comment[et]=Plugina raamistiku loomine, mida saab põimida Konquerori liikumispaneelile.
+Comment[eu]=Konqueror-en arakatze-panelean kapsulatzen den plugin batentzat lan-marko oso bat sortzen du
+Comment[fa]=چارچوبی را برای یک وصله Ú©Ù‡ در تابلوی ناوش Konqueror نهÙته بود، تولید می‌کند
+Comment[fr]=Génère une infrastructure pour un module externe qui s'intègre dans le panneau de navigation de Konqueror
+Comment[gl]=Xera un contorno de traballo para unha extensión que se incrusta no panel de navegación de Konqueror
+Comment[hu]=Létrehoz egy alapprogramot konqueroros navigációs panelmodul készítéséhez
+Comment[it]=Genera l'infrastruttura per un plugin che si integra nel pannello di navigazione di Konqueror
+Comment[nds]=Stellt dat Rahmenwark för en Moduul op, dat sik in't Sietpaneel vun Konqueror inbett
+Comment[ne]=कनà¥à¤•à¥à¤µà¥‡à¤°à¤°à¤•à¥‹ नेभिगेसन पà¥à¤¯à¤¾à¤¨à¤²à¤®à¤¾ समà¥à¤®à¤¿à¤²à¤¿à¤¤ हà¥à¤¨à¥‡ पà¥à¤²à¤—इनका लागि फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een framework voor een plugin die kan worden ingebed in Konqueror's navigatiepaneel.
+Comment[pl]=Generuje wtyczkę, którą można osadzić w panelu nawigacyjnym Konquerora
+Comment[pt]=Gera a plataforma para um 'plugin' que se incorpore no painel de navegação do Konqueror
+Comment[pt_BR]=Gera a plataforma para um 'plugin' que se incorpore no painel de navegação do Konqueror
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸ навигации Konqueror
+Comment[sk]=Vygeneruje framework pre modul, ktorý sa bude daÅ¥ vložiÅ¥ do konqueror navigaÄného panelu
+Comment[sr]=Прави радни оквир за прикључак који Ñе уграђује у Konqueror-ов навигациони панел
+Comment[sr@Latn]=Pravi radni okvir za prikljuÄak koji se ugraÄ‘uje u Konqueror-ov navigacioni panel
+Comment[sv]=Skapar ett ramverk för ett insticksprogram som inbäddas i Konquerors navigeringspanel
+Comment[tr]=Konqueror'un gezinme paneline gömülen bir eklenti için bir çatı oluşturur.
+Comment[zh_CN]=生æˆå¯åµŒå…¥åˆ° Konqueror 导航é¢æ¿çš„æ’件框架
+Comment[zh_TW]=產生一個嵌入 Konqueror 導覽é¢æ¿çš„外掛程å¼çš„框架
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=konqnavpanel.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/konqnavpanel.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/konqnavpanel.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/konqnavpanel.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE14]
+Type=install
+Source=%{src}/konqnavpanel.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[MSG]
+Type=message
+Comment=A konqueror navigation panel plugin was created in %{dest}
+Comment[ca]=Un connector per al plafó de navegació de Konqueror ha estat creada en %{dest}
+Comment[da]=Et Konqueror navigationspanel plugin blev oprettet i %{dest}
+Comment[de]=Ein Modul für den Navigationsbereich von Konqueror wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο του πίνακα πλοήγησης του konqueror δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento para el panel de navegación de Konqueror ha sido creado en %{dest}
+Comment[et]=Konquerori liikumispaneeli plugin loodi asukohta %{dest}
+Comment[eu]=Konqueror-en arakatze-paneleko plugin bat sortu da hemen: %{dest}
+Comment[fa]=یک وصلۀ تابلوی ناوش konqueror در %{dest} ایجاد شد
+Comment[fr]=Un module externe pour le panneau de navigation de Konqueror a été créé dans %{dest}
+Comment[ga]=Cruthaíodh breiseán painéil nascleanúna konqueror i %{dest}
+Comment[gl]=Creouse unha extensión para o panel de navegación en %{dest}
+Comment[hu]=Létrejött egy konqueroros navigációs modul itt: %{dest}
+Comment[it]=È stato creato un plugin per il pannello di navigazione di Konqueror in %{dest}
+Comment[ja]=Konqueror ナビゲーションプラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Sietpaneelmoduul för Konqueror opstellt
+Comment[ne]=कनà¥à¤•à¥à¤µà¥‡à¤°à¤° नेभिगेसन पà¥à¤¯à¤¾à¤¨à¤² पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Konqueror-navigatiepaneel-plugin is aangemaakt in %{dest}
+Comment[pl]=Wtyczka do panelu nawigacyjnego Konquerora została utworzona w %{dest}
+Comment[pt]=Um 'plugin' do painel de navegação do Konqueror foi criado em %{dest}
+Comment[pt_BR]=Um 'plugin' do painel de navegação do Konqueror foi criado em %{dest}
+Comment[ru]=Модуль панели навигации Konqueror Ñоздан в %{dest}
+Comment[sk]=Modul pre konqueror navigaÄný panel bol vytvorený v %{dest}
+Comment[sr]=Кonqueror-ов прикључак за навигациони панел направљен је у %{dest}
+Comment[sr@Latn]=Konqueror-ov prikljuÄak za navigacioni panel napravljen je u %{dest}
+Comment[sv]=Ett Konqueror-insticksprogram för navigeringspanelen skapades i %{dest}
+Comment[tr]=Bir konqueror gezinme paneli eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 konqueror 导航器é¢æ¿æ’件
+Comment[zh_TW]=一個 Konqueror 導覽é¢æ¿å¤–掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/konqnavpanel/konqnavpanel.png b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.png
new file mode 100644
index 00000000..dd0d89f3
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/konqnavpanel.png
Binary files differ
diff --git a/languages/cpp/app_templates/konqnavpanel/src-Makefile.am b/languages/cpp/app_templates/konqnavpanel/src-Makefile.am
new file mode 100644
index 00000000..5a9113c5
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/src-Makefile.am
@@ -0,0 +1,11 @@
+INCLUDES= $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES=konqsidebar_%{APPNAMELC}.la
+
+konqsidebar_%{APPNAMELC}_la_SOURCES = %{APPNAMELC}.cpp
+konqsidebar_%{APPNAMELC}_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -lkonqsidebarplugin
+konqsidebar_%{APPNAMELC}_la_LIBADD = $(LIB_KPARTS) $(LIB_KFILE)
+
+%{APPNAMELC}_entry_DATA = %{APPNAMELC}.desktop
+%{APPNAMELC}_entrydir = $(kde_datadir)/konqsidebartng/entries
diff --git a/languages/cpp/app_templates/konqnavpanel/subdirs b/languages/cpp/app_templates/konqnavpanel/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/konqnavpanel/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kpartapp/.kdev_ignore b/languages/cpp/app_templates/kpartapp/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/.kdev_ignore
diff --git a/languages/cpp/app_templates/kpartapp/Makefile.am b/languages/cpp/app_templates/kpartapp/Makefile.am
new file mode 100644
index 00000000..9b69f17d
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = src-Makefile.am app.cpp app.h app_part.cpp\
+ app_part.h main.cpp app_part.rc app_shell.rc \
+ kpartapp.png app.kdevelop subdirs
+templateName = kpartapp
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/kpartapp/app.cpp b/languages/cpp/app_templates/kpartapp/app.cpp
new file mode 100644
index 00000000..68c34ab3
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/app.cpp
@@ -0,0 +1,209 @@
+
+#include "%{APPNAMELC}.h"
+
+#include <kkeydialog.h>
+#include <kfiledialog.h>
+#include <kconfig.h>
+#include <kurl.h>
+
+#include <kedittoolbar.h>
+
+#include <kaction.h>
+#include <kstdaction.h>
+
+#include <klibloader.h>
+#include <kmessagebox.h>
+#include <kstatusbar.h>
+#include <klocale.h>
+
+%{APPNAME}::%{APPNAME}()
+ : KParts::MainWindow( 0L, "%{APPNAME}" )
+{
+ // set the shell's ui resource file
+ setXMLFile("%{APPNAMELC}_shell.rc");
+
+ // then, setup our actions
+ setupActions();
+
+ // and a status bar
+ statusBar()->show();
+
+ // this routine will find and load our Part. it finds the Part by
+ // name which is a bad idea usually.. but it's alright in this
+ // case since our Part is made for this Shell
+ KLibFactory *factory = KLibLoader::self()->factory("lib%{APPNAMELC}part");
+ if (factory)
+ {
+ // now that the Part is loaded, we cast it to a Part to get
+ // our hands on it
+ m_part = static_cast<KParts::ReadWritePart *>(factory->create(this,
+ "%{APPNAMELC}_part", "KParts::ReadWritePart" ));
+
+ if (m_part)
+ {
+ // tell the KParts::MainWindow that this is indeed the main widget
+ setCentralWidget(m_part->widget());
+
+ // and integrate the part's GUI with the shell's
+ createGUI(m_part);
+ }
+ }
+ else
+ {
+ // if we couldn't find our Part, we exit since the Shell by
+ // itself can't do anything useful
+ KMessageBox::error(this, i18n("Could not find our part."));
+ kapp->quit();
+ // we return here, cause kapp->quit() only means "exit the
+ // next time we enter the event loop...
+ return;
+ }
+
+ // apply the saved mainwindow settings, if any, and ask the mainwindow
+ // to automatically save settings if changed: window size, toolbar
+ // position, icon size, etc.
+ setAutoSaveSettings();
+}
+
+%{APPNAME}::~%{APPNAME}()
+{
+}
+
+void %{APPNAME}::load(const KURL& url)
+{
+ m_part->openURL( url );
+}
+
+void %{APPNAME}::setupActions()
+{
+ KStdAction::openNew(this, SLOT(fileNew()), actionCollection());
+ KStdAction::open(this, SLOT(fileOpen()), actionCollection());
+
+ KStdAction::quit(kapp, SLOT(quit()), actionCollection());
+
+ m_toolbarAction = KStdAction::showToolbar(this, SLOT(optionsShowToolbar()), actionCollection());
+ m_statusbarAction = KStdAction::showStatusbar(this, SLOT(optionsShowStatusbar()), actionCollection());
+
+ KStdAction::keyBindings(this, SLOT(optionsConfigureKeys()), actionCollection());
+ KStdAction::configureToolbars(this, SLOT(optionsConfigureToolbars()), actionCollection());
+}
+
+void %{APPNAME}::saveProperties(KConfig* /*config*/)
+{
+ // the 'config' object points to the session managed
+ // config file. anything you write here will be available
+ // later when this app is restored
+}
+
+void %{APPNAME}::readProperties(KConfig* /*config*/)
+{
+ // the 'config' object points to the session managed
+ // config file. this function is automatically called whenever
+ // the app is being restored. read in here whatever you wrote
+ // in 'saveProperties'
+}
+
+void %{APPNAME}::fileNew()
+{
+ // this slot is called whenever the File->New menu is selected,
+ // the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ // button is clicked
+
+ // About this function, the style guide (
+ // http://developer.kde.org/documentation/standards/kde/style/basics/index.html )
+ // says that it should open a new window if the document is _not_
+ // in its initial state. This is what we do here..
+ if ( ! m_part->url().isEmpty() || m_part->isModified() )
+ {
+ (new %{APPNAME})->show();
+ };
+}
+
+
+void %{APPNAME}::optionsShowToolbar()
+{
+ // this is all very cut and paste code for showing/hiding the
+ // toolbar
+ if (m_toolbarAction->isChecked())
+ toolBar()->show();
+ else
+ toolBar()->hide();
+}
+
+void %{APPNAME}::optionsShowStatusbar()
+{
+ // this is all very cut and paste code for showing/hiding the
+ // statusbar
+ if (m_statusbarAction->isChecked())
+ statusBar()->show();
+ else
+ statusBar()->hide();
+}
+
+void %{APPNAME}::optionsConfigureKeys()
+{
+ KKeyDialog::configure(actionCollection());
+}
+
+void %{APPNAME}::optionsConfigureToolbars()
+{
+#if defined(KDE_MAKE_VERSION)
+# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
+ saveMainWindowSettings(KGlobal::config(), autoSaveGroup());
+# else
+ saveMainWindowSettings(KGlobal::config() );
+# endif
+#else
+ saveMainWindowSettings(KGlobal::config() );
+#endif
+
+ // use the standard toolbar editor
+ KEditToolbar dlg(factory());
+ connect(&dlg, SIGNAL(newToolbarConfig()),
+ this, SLOT(applyNewToolbarConfig()));
+ dlg.exec();
+}
+
+void %{APPNAME}::applyNewToolbarConfig()
+{
+#if defined(KDE_MAKE_VERSION)
+# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
+ applyMainWindowSettings(KGlobal::config(), autoSaveGroup());
+# else
+ applyMainWindowSettings(KGlobal::config());
+# endif
+#else
+ applyMainWindowSettings(KGlobal::config());
+#endif
+}
+
+void %{APPNAME}::fileOpen()
+{
+ // this slot is called whenever the File->Open menu is selected,
+ // the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
+ // button is clicked
+ KURL url =
+ KFileDialog::getOpenURL( QString::null, QString::null, this );
+
+ if (url.isEmpty() == false)
+ {
+ // About this function, the style guide (
+ // http://developer.kde.org/documentation/standards/kde/style/basics/index.html )
+ // says that it should open a new window if the document is _not_
+ // in its initial state. This is what we do here..
+ if ( m_part->url().isEmpty() && ! m_part->isModified() )
+ {
+ // we open the file in this window...
+ load( url );
+ }
+ else
+ {
+ // we open the file in a new window...
+ %{APPNAME}* newWin = new %{APPNAME};
+ newWin->load( url );
+ newWin->show();
+ }
+ }
+}
+
+#include "%{APPNAMELC}.moc"
diff --git a/languages/cpp/app_templates/kpartapp/app.desktop b/languages/cpp/app_templates/kpartapp/app.desktop
new file mode 100644
index 00000000..01cc9d37
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/app.desktop
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Name=%{APPNAME}Part
+Name[br]=Perzh%{APPNAME}
+Name[ca]=Part per a %{APPNAME}
+Name[el]=Τμήμα%{APPNAME}
+Name[et]=%{APPNAME} komponent
+Name[fa]=جزء %{APPNAME}
+Name[gl]=%{APPNAME} Part
+Name[ja]=%{APPNAME} パート
+Name[ne]=%{APPNAME}भाग
+Name[pt_BR]=Parte %{APPNAME}
+Name[sv]=%{APPNAME}-del
+Name[ta]=%{APPNAME}பாகமà¯
+Name[tr]=%{APPNAME} BileÅŸeni
+MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
+ServiceTypes=KParts/ReadOnlyPart,KParts/ReadWritePart
+X-KDE-Library=lib%{APPNAMELC}part
+Type=Service
diff --git a/languages/cpp/app_templates/kpartapp/app.h b/languages/cpp/app_templates/kpartapp/app.h
new file mode 100644
index 00000000..25cd63bf
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/app.h
@@ -0,0 +1,76 @@
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <kparts/mainwindow.h>
+
+class KToggleAction;
+
+/**
+ * This is the application "Shell". It has a menubar, toolbar, and
+ * statusbar but relies on the "Part" to do all the real work.
+ *
+ * @short Application Shell
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAME} : public KParts::MainWindow
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ %{APPNAME}();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~%{APPNAME}();
+
+ /**
+ * Use this method to load whatever file/URL you have
+ */
+ void load(const KURL& url);
+
+protected:
+ /**
+ * This method is called when it is time for the app to save its
+ * properties for session management purposes.
+ */
+ void saveProperties(KConfig *);
+
+ /**
+ * This method is called when this app is restored. The KConfig
+ * object points to the session management config file that was saved
+ * with @ref saveProperties
+ */
+ void readProperties(KConfig *);
+
+private slots:
+ void fileNew();
+ void fileOpen();
+ void optionsShowToolbar();
+ void optionsShowStatusbar();
+ void optionsConfigureKeys();
+ void optionsConfigureToolbars();
+
+ void applyNewToolbarConfig();
+
+private:
+ void setupAccel();
+ void setupActions();
+
+private:
+ KParts::ReadWritePart *m_part;
+
+ KToggleAction *m_toolbarAction;
+ KToggleAction *m_statusbarAction;
+};
+
+#endif // _%{APPNAMEUC}_H_
diff --git a/languages/cpp/app_templates/kpartapp/app.kdevelop b/languages/cpp/app_templates/kpartapp/app.kdevelop
new file mode 100644
index 00000000..3adbae9e
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/app.kdevelop
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+</kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kpartapp/app_part.cpp b/languages/cpp/app_templates/kpartapp/app_part.cpp
new file mode 100644
index 00000000..bf63557f
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/app_part.cpp
@@ -0,0 +1,201 @@
+
+#include "%{APPNAMELC}_part.h"
+
+#include <kinstance.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qmultilineedit.h>
+
+%{APPNAME}Part::%{APPNAME}Part( QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name )
+ : KParts::ReadWritePart(parent, name)
+{
+ // we need an instance
+ setInstance( %{APPNAME}PartFactory::instance() );
+
+ // this should be your custom internal widget
+ m_widget = new QMultiLineEdit( parentWidget, widgetName );
+
+ // notify the part that this is our internal widget
+ setWidget(m_widget);
+
+ // create our actions
+ KStdAction::open(this, SLOT(fileOpen()), actionCollection());
+ KStdAction::saveAs(this, SLOT(fileSaveAs()), actionCollection());
+ KStdAction::save(this, SLOT(save()), actionCollection());
+
+ // set our XML-UI resource file
+ setXMLFile("%{APPNAMELC}_part.rc");
+
+ // we are read-write by default
+ setReadWrite(true);
+
+ // we are not modified since we haven't done anything yet
+ setModified(false);
+}
+
+%{APPNAME}Part::~%{APPNAME}Part()
+{
+}
+
+void %{APPNAME}Part::setReadWrite(bool rw)
+{
+ // notify your internal widget of the read-write state
+ m_widget->setReadOnly(!rw);
+ if (rw)
+ connect(m_widget, SIGNAL(textChanged()),
+ this, SLOT(setModified()));
+ else
+ {
+ disconnect(m_widget, SIGNAL(textChanged()),
+ this, SLOT(setModified()));
+ }
+
+ ReadWritePart::setReadWrite(rw);
+}
+
+void %{APPNAME}Part::setModified(bool modified)
+{
+ // get a handle on our Save action and make sure it is valid
+ KAction *save = actionCollection()->action(KStdAction::stdName(KStdAction::Save));
+ if (!save)
+ return;
+
+ // if so, we either enable or disable it based on the current
+ // state
+ if (modified)
+ save->setEnabled(true);
+ else
+ save->setEnabled(false);
+
+ // in any event, we want our parent to do it's thing
+ ReadWritePart::setModified(modified);
+}
+
+bool %{APPNAME}Part::openFile()
+{
+ // m_file is always local so we can use QFile on it
+ QFile file(m_file);
+ if (file.open(IO_ReadOnly) == false)
+ return false;
+
+ // our example widget is text-based, so we use QTextStream instead
+ // of a raw QDataStream
+ QTextStream stream(&file);
+ QString str;
+ while (!stream.eof())
+ str += stream.readLine() + "\n";
+
+ file.close();
+
+ // now that we have the entire file, display it
+ m_widget->setText(str);
+
+ // just for fun, set the status bar
+ emit setStatusBarText( m_url.prettyURL() );
+
+ return true;
+}
+
+bool %{APPNAME}Part::saveFile()
+{
+ // if we aren't read-write, return immediately
+ if (isReadWrite() == false)
+ return false;
+
+ // m_file is always local, so we use QFile
+ QFile file(m_file);
+ if (file.open(IO_WriteOnly) == false)
+ return false;
+
+ // use QTextStream to dump the text to the file
+ QTextStream stream(&file);
+ stream << m_widget->text();
+
+ file.close();
+
+ return true;
+}
+
+void %{APPNAME}Part::fileOpen()
+{
+ // this slot is called whenever the File->Open menu is selected,
+ // the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
+ // button is clicked
+ QString file_name = KFileDialog::getOpenFileName();
+
+ if (file_name.isEmpty() == false)
+ openURL(file_name);
+}
+
+void %{APPNAME}Part::fileSaveAs()
+{
+ // this slot is called whenever the File->Save As menu is selected,
+ QString file_name = KFileDialog::getSaveFileName();
+ if (file_name.isEmpty() == false)
+ saveAs(file_name);
+}
+
+
+// It's usually safe to leave the factory code alone.. with the
+// notable exception of the KAboutData data
+#include <kaboutdata.h>
+#include <klocale.h>
+
+KInstance* %{APPNAME}PartFactory::s_instance = 0L;
+KAboutData* %{APPNAME}PartFactory::s_about = 0L;
+
+%{APPNAME}PartFactory::%{APPNAME}PartFactory()
+ : KParts::Factory()
+{
+}
+
+%{APPNAME}PartFactory::~%{APPNAME}PartFactory()
+{
+ delete s_instance;
+ delete s_about;
+
+ s_instance = 0L;
+}
+
+KParts::Part* %{APPNAME}PartFactory::createPartObject( QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name,
+ const char *classname, const QStringList &args )
+{
+ // Create an instance of our Part
+ %{APPNAME}Part* obj = new %{APPNAME}Part( parentWidget, widgetName, parent, name );
+
+ // See if we are to be read-write or not
+ if (QCString(classname) == "KParts::ReadOnlyPart")
+ obj->setReadWrite(false);
+
+ return obj;
+}
+
+KInstance* %{APPNAME}PartFactory::instance()
+{
+ if( !s_instance )
+ {
+ s_about = new KAboutData("%{APPNAMELC}part", I18N_NOOP("%{APPNAME}Part"), "%{VERSION}");
+ s_about->addAuthor("%{AUTHOR}", 0, "%{EMAIL}");
+ s_instance = new KInstance(s_about);
+ }
+ return s_instance;
+}
+
+extern "C"
+{
+ void* init_lib%{APPNAMELC}part()
+ {
+ KGlobal::locale()->insertCatalogue("%{APPNAMELC}");
+ return new %{APPNAME}PartFactory;
+ }
+};
+
+#include "%{APPNAMELC}_part.moc"
diff --git a/languages/cpp/app_templates/kpartapp/app_part.h b/languages/cpp/app_templates/kpartapp/app_part.h
new file mode 100644
index 00000000..37c30189
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/app_part.h
@@ -0,0 +1,86 @@
+
+#ifndef _%{APPNAMEUC}PART_H_
+#define _%{APPNAMEUC}PART_H_
+
+#include <kparts/part.h>
+#include <kparts/factory.h>
+
+class QWidget;
+class QPainter;
+class KURL;
+class QMultiLineEdit;
+
+/**
+ * This is a "Part". It that does all the real work in a KPart
+ * application.
+ *
+ * @short Main Part
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAME}Part : public KParts::ReadWritePart
+{
+ Q_OBJECT
+public:
+ /**
+ * Default constructor
+ */
+ %{APPNAME}Part(QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name);
+
+ /**
+ * Destructor
+ */
+ virtual ~%{APPNAME}Part();
+
+ /**
+ * This is a virtual function inherited from KParts::ReadWritePart.
+ * A shell will use this to inform this Part if it should act
+ * read-only
+ */
+ virtual void setReadWrite(bool rw);
+
+ /**
+ * Reimplemented to disable and enable Save action
+ */
+ virtual void setModified(bool modified);
+
+protected:
+ /**
+ * This must be implemented by each part
+ */
+ virtual bool openFile();
+
+ /**
+ * This must be implemented by each read-write part
+ */
+ virtual bool saveFile();
+
+protected slots:
+ void fileOpen();
+ void fileSaveAs();
+
+private:
+ QMultiLineEdit *m_widget;
+};
+
+class KInstance;
+class KAboutData;
+
+class %{APPNAME}PartFactory : public KParts::Factory
+{
+ Q_OBJECT
+public:
+ %{APPNAME}PartFactory();
+ virtual ~%{APPNAME}PartFactory();
+ virtual KParts::Part* createPartObject( QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name,
+ const char *classname, const QStringList &args );
+ static KInstance* instance();
+
+private:
+ static KInstance* s_instance;
+ static KAboutData* s_about;
+};
+
+#endif // _%{APPNAMEUC}PART_H_
diff --git a/languages/cpp/app_templates/kpartapp/app_part.rc b/languages/cpp/app_templates/kpartapp/app_part.rc
new file mode 100644
index 00000000..cec8ec5c
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/app_part.rc
@@ -0,0 +1,17 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}_part" version="1">
+<MenuBar>
+ <Menu name="file">
+ <Action name="file_open"/>
+ <Separator/>
+ <Action name="file_save"/>
+ <Action name="file_save_as"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="mainToolBar">
+ <Action name="file_open"/>
+ <Action name="file_save"/>
+ <Action name="file_print"/>
+ <Separator/>
+</ToolBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kpartapp/app_shell.rc b/languages/cpp/app_templates/kpartapp/app_shell.rc
new file mode 100644
index 00000000..e0600cda
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/app_shell.rc
@@ -0,0 +1,28 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}_shell" version="1">
+<MenuBar>
+ <Menu noMerge="1" name="file"><text>&amp;File</text>
+ <Action name="file_new"/>
+ <Merge/>
+ <Separator/>
+ <Action name="file_quit"/>
+ </Menu>
+ <Menu noMerge="1" name="settings"><text>&amp;Settings</text>
+ <Action name="options_show_toolbar"/>
+ <Action name="options_show_statusbar"/>
+ <Merge name="show_merge"/>
+ <Separator/>
+ <Action name="options_configure_keybinding"/>
+ <Action name="options_configure_toolbars"/>
+ <Action name="options_configure"/>
+ <Merge name="configure_merge"/>
+ <Separator/>
+ <Merge/>
+ </Menu>
+</MenuBar>
+<ToolBar noMerge="1" name="mainToolBar"><text>Main Toolbar</text>
+ <Action name="file_new"/>
+ <Merge/>
+ <Action name="help"/>
+</ToolBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kpartapp/kpartapp.kdevtemplate b/languages/cpp/app_templates/kpartapp/kpartapp.kdevtemplate
new file mode 100644
index 00000000..03583faa
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/kpartapp.kdevtemplate
@@ -0,0 +1,237 @@
+# KDE Config File
+[General]
+Name=Application framework (KParts)
+Name[ca]=Infraestructura d'aplicació (KParts)
+Name[da]=Programskelet (KParts)
+Name[de]=Anwendungsgerüst (KParts)
+Name[el]=Πλαίσιο εφαÏμογής (KParts)
+Name[es]=Infraestructura de aplicación (KParts)
+Name[et]=Rakenduse raamistik (KParts)
+Name[eu]=Aplikazioen lan-markoa (KParts)
+Name[fa]=(KParts)چارچوب کاربرد
+Name[fr]=Infrastructure d'application (KParts)
+Name[ga]=Creatlach feidhmchláir (KParts)
+Name[gl]=Entorno de traballo de aplicación (KParts)
+Name[hu]=Alkalmazás-keretrendszer (objektumokkal)
+Name[it]=Infrastruttura applicativa (KParts)
+Name[ja]=アプリケーションフレームワーク (KParts)
+Name[nds]=Programmrahmenwark (KParts)
+Name[ne]=अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• (केडीई भाग)
+Name[nl]=Toepassingframework (KParts)
+Name[pl]=Szablon progamu (KParts)
+Name[pt]=Plataforma de aplicações (KParts)
+Name[pt_BR]=Plataforma de aplicações (KParts)
+Name[ru]=Приложение KPart
+Name[sk]=AplikaÄný framework (KParts)
+Name[sr]=Радни оквир програма (KParts)
+Name[sr@Latn]=Radni okvir programa (KParts)
+Name[sv]=Programramverk (KParts)
+Name[tr]=Uygulama Çatısı (KParts)
+Name[zh_CN]=应用程åºæ¡†æž¶(KParts)
+Name[zh_TW]=應用程å¼æ¡†æž¶ï¼ˆKParts)
+Icon=kpartapp.png
+Category=C++/KDE
+Comment=Generates a complex KDE application with a KParts shell and a KPart component.
+Comment[ca]=Genera una complexa aplicació per al KDE amb un intèrpret de comandaments KParts i un component KPart.
+Comment[da]=Genererer et komplekst KDE-program med en KParts-skal og en KPart-komponent.
+Comment[de]=Erstellt eine aufwändige KDE-Anwendung mit einer Shell für KParts und einer KPart-Komponente.
+Comment[el]=ΔημιουÏγεί μια πολÏπλοκη εφαÏμογή KDE με ένα κέλυφος KParts και ένα συστατικό KPart.
+Comment[es]=Genera una aplicación KDE compleja con un contenedor KParts y un componente KPart.
+Comment[et]=Keerulise KDE rakenduse loomine KParts-shelliga ja KPart-komponendiga.
+Comment[eu]=KDE aplikazio konplexu bat sortzen du KParts shellbat eta KPart osagai batekin.
+Comment[fa]=یک کاربرد پیچیدۀ KDE با یک پوستۀ KParts Ùˆ یک مؤلÙÛ€ KPart تولید می‌کند.
+Comment[fr]=Génère une application KDE évoluée comprenant un shell KParts et un composant KPart.
+Comment[ga]=Cruthaíonn sé seo feidhmchlár casta KDE le blaosc KParts agus comhpháirt KPart.
+Comment[gl]=Xera unha aplicación KDE complexa cun terminal KPart e unha compoñente KPart.
+Comment[hu]=Létrehoz egy komplex, objektumok használatát támogató KDE-s alkalmazást és egy KPart objektumot.
+Comment[it]=Genera un'applicazione complessa di KDE con una shell di KParts e un componente KPart.
+Comment[nds]=Stellt en vigeliensch KDE-Programm mit en Konsool för KPart un en KPart-Komponent op.
+Comment[ne]=केडीई भाग शेल र केडीई भाग अवयवसà¤à¤— जटिल केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een complexe KDE-toepassing met een KParts-shell en een KPart-component.
+Comment[pl]=Generuje złożony program z powłoką KParts i komponentem KPart.
+Comment[pt]=Gera uma aplicação complexa do KDE com uma infra-estrutura de KParts, bem como um componente KPart.
+Comment[pt_BR]=Gera uma aplicação complexa do KDE com uma infra-estrutura de KParts, bem como um componente KPart.
+Comment[ru]=Создание полноценного Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE на базе компонента KPart.
+Comment[sk]=Vygeneruje komplexnú KDE aplikáciu s KParts shell a s KPart komponentom.
+Comment[sr]=Прави Ñложени KDE програм Ñа KParts шкољком и KPart компонентом.
+Comment[sr@Latn]=Pravi složeni KDE program sa KParts školjkom i KPart komponentom.
+Comment[sv]=Skapar ett komplext KDE-program med ett KPart-skal och en KPart-komponent.
+Comment[tr]=Bir KParts kabuğu ve KParts bileşeni olan karmaşık bir KDE uygulaması yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªå¸¦ KParts 外壳和 KPart 组件的å¤æ‚ KDE 应用程åºã€‚
+Comment[zh_TW]=產生一個複雜的 KDE 應用程å¼ï¼Œå…§å« KParts shell 與 KPart 元件。
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}_part.cpp
+Archive=kpartapp.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-part.desktop
+Dest=%{dest}/src/%{APPNAMELC}_part.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE13]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE14]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE15]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE16]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE17]
+Type=install
+Source=%{src}/app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE18]
+Type=install
+Source=%{src}/app_part.cpp
+Dest=%{dest}/src/%{APPNAMELC}_part.cpp
+
+[FILE19]
+Type=install
+Source=%{src}/app_part.h
+Dest=%{dest}/src/%{APPNAMELC}_part.h
+
+[FILE20]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE21]
+Type=install
+EscapeXML=true
+Source=%{src}/app_part.rc
+Dest=%{dest}/src/%{APPNAMELC}_part.rc
+
+[FILE22]
+Type=install
+EscapeXML=true
+Source=%{src}/app_shell.rc
+Dest=%{dest}/src/%{APPNAMELC}_shell.rc
+
+[MSG]
+Type=message
+Comment=A complex KDE application using KParts was created in %{dest}
+Comment[ca]=Una complexa aplicació per al KDE usant KParts ha estat creada en %{dest}
+Comment[da]=Et komplekst KDE-program ved brug af KParts blev oprettet i %{dest}
+Comment[de]=Eine aufwändige KDE-Anwendung, die KParts verwendet, wurde in %{dest} erstellt.
+Comment[el]=Μια πολÏπλοκη εφαÏμογή KDE που χÏησιμοποιεί το KParts δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación compleja para KDE que usa KParts ha sido creada en %{dest}
+Comment[et]=KParts'i kasutav keeruline KDE rakendus loodi asukohta %{dest}
+Comment[eu]=KDE aplikazio konplexu bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد پیچیدۀ KDE با استÙاده از KParts در %{dest} ایجاد شد
+Comment[fr]=Une application KDE évoluée utilisant KParts a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár casta KDE a úsáideann KParts i %{dest}
+Comment[gl]=Creouse unha aplicación KDE complexa usando KParts en %{dest}
+Comment[hu]=Létrejött egy komplex, objektumok használatát támogató KDE-s alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione KDE complessa usando KParts in %{dest}
+Comment[ja]=KParts を使ã£ãŸè¤‡é›‘㪠KDE アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en vigeliensch KDE-Programm opstellt, dat "KParts" bruukt.
+Comment[ne]=केडीई भाग पà¥à¤°à¤¯à¥‹à¤— गरेर जटिल केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een complexe KDE-toepassing gebruik makend van KParts is aangemaakt in %{dest}
+Comment[pl]=Złożony program KDE używający KParts został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação complexa do KDE, que usa o KParts, em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação complexa do KDE, que usa o KParts, em %{dest}
+Comment[ru]=Приложение KDE на базе компонента KPart Ñоздано в %{dest}
+Comment[sk]=Komplexná KDE aplikácia používajúca KParts bola vytvorená v %{dest}
+Comment[sr]=Сложени KDE програм на оÑнову KParts направљен је у %{dest}
+Comment[sr@Latn]=Složeni KDE program na osnovu KParts napravljen je u %{dest}
+Comment[sv]=Ett komplext KDE-program som använder KParts skapades i %{dest}
+Comment[tr]=KParts kullanan karmaşık bir KDE uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个使用 KParts çš„å¤æ‚ KDE 应用程åº
+Comment[zh_TW]=一個使用 KParts 的複雜 KDE 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
+
diff --git a/languages/cpp/app_templates/kpartapp/kpartapp.png b/languages/cpp/app_templates/kpartapp/kpartapp.png
new file mode 100644
index 00000000..5834ac9f
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/kpartapp.png
Binary files differ
diff --git a/languages/cpp/app_templates/kpartapp/main.cpp b/languages/cpp/app_templates/kpartapp/main.cpp
new file mode 100644
index 00000000..a7c0d2c4
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/main.cpp
@@ -0,0 +1,57 @@
+
+#include "%{APPNAMELC}.h"
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static const char description[] =
+ I18N_NOOP("A KDE KPart Application");
+
+static const char version[] = "%{VERSION}";
+
+static KCmdLineOptions options[] =
+{
+ { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", 0, 0, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions( options );
+ KApplication app;
+
+ // see if we are starting with session management
+ if (app.isRestored())
+ {
+ RESTORE(%{APPNAME});
+ }
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if ( args->count() == 0 )
+ {
+ %{APPNAME} *widget = new %{APPNAME};
+ widget->show();
+ }
+ else
+ {
+ int i = 0;
+ for (; i < args->count(); i++ )
+ {
+ %{APPNAME} *widget = new %{APPNAME};
+ widget->show();
+ widget->load( args->url( i ) );
+ }
+ }
+ args->clear();
+ }
+
+ return app.exec();
+}
diff --git a/languages/cpp/app_templates/kpartapp/src-Makefile.am b/languages/cpp/app_templates/kpartapp/src-Makefile.am
new file mode 100644
index 00000000..357e2d0b
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/src-Makefile.am
@@ -0,0 +1,53 @@
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = %{APPNAMELC}.h %{APPNAMELC}_part.h
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
+
+KDE_ICON = AUTO
+
+# this Makefile creates both a KPart application and a KPart
+#########################################################################
+# APPLICATION SECTION
+#########################################################################
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# the application source, library search path, and link libraries
+%{APPNAMELC}_SOURCES = main.cpp %{APPNAMELC}.cpp
+%{APPNAMELC}_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+%{APPNAMELC}_LDADD = $(LIB_KPARTS)
+
+# this is where the desktop file will go
+shelldesktopdir = $(kde_appsdir)/Utilities
+shelldesktop_DATA = %{APPNAMELC}.desktop
+
+# this is where the shell's XML-GUI resource file goes
+shellrcdir = $(kde_datadir)/%{APPNAMELC}
+shellrc_DATA = %{APPNAMELC}_shell.rc
+
+#########################################################################
+# KPART SECTION
+#########################################################################
+kde_module_LTLIBRARIES = lib%{APPNAMELC}part.la
+
+# the Part's source, library search path, and link libraries
+lib%{APPNAMELC}part_la_SOURCES = %{APPNAMELC}_part.cpp
+lib%{APPNAMELC}part_la_LDFLAGS = -module -avoid-version -no-undefined $(KDE_PLUGIN) $(all_libraries)
+lib%{APPNAMELC}part_la_LIBADD = $(LIB_KPARTS) $(LIB_KFILE)
+
+# this is where the desktop file will go
+partdesktopdir = $(kde_servicesdir)
+partdesktop_DATA = %{APPNAMELC}_part.desktop
+
+# this is where the part's XML-GUI resource file goes
+partrcdir = $(kde_datadir)/%{APPNAMELC}part
+partrc_DATA = %{APPNAMELC}_part.rc
diff --git a/languages/cpp/app_templates/kpartapp/subdirs b/languages/cpp/app_templates/kpartapp/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kpartapp/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kpartplugin/.kdev_ignore b/languages/cpp/app_templates/kpartplugin/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/.kdev_ignore
diff --git a/languages/cpp/app_templates/kpartplugin/Makefile.am b/languages/cpp/app_templates/kpartplugin/Makefile.am
new file mode 100644
index 00000000..170bdd6d
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = src-Makefile.am plugin_app.cpp plugin_app.h \
+ plugin_app.rc hi16-action-plugin.png hi22-action-plugin.png \
+ kpartplugin.png plugin.kdevelop subdirs
+
+templateName = kpartplugin
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kpartplugin/hi16-action-plugin.png b/languages/cpp/app_templates/kpartplugin/hi16-action-plugin.png
new file mode 100644
index 00000000..e2d7bab8
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/hi16-action-plugin.png
Binary files differ
diff --git a/languages/cpp/app_templates/kpartplugin/hi22-action-plugin.png b/languages/cpp/app_templates/kpartplugin/hi22-action-plugin.png
new file mode 100644
index 00000000..4082bf10
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/hi22-action-plugin.png
Binary files differ
diff --git a/languages/cpp/app_templates/kpartplugin/kpartplugin.kdevtemplate b/languages/cpp/app_templates/kpartplugin/kpartplugin.kdevtemplate
new file mode 100644
index 00000000..f331c6cf
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/kpartplugin.kdevtemplate
@@ -0,0 +1,204 @@
+# KDE Config File
+[General]
+Name=KHTMLPart plugin
+Name[br]=Lugent KHTMLPart
+Name[ca]=Connector per a KHTMLPart
+Name[de]=KHTMLPart-Modul
+Name[el]=ΠÏόσθετο KHTMLPart
+Name[es]=Complemento para KHTMLPart
+Name[eu]=KHTMLPart plugina
+Name[fa]=وصلۀ KHTMLPart
+Name[fr]=Module externe pour le composant KHTML
+Name[ga]=Breiseán KHTMLPart
+Name[gl]=Extensión para KHTMLPart
+Name[hu]=KHTML-bővítőmodul
+Name[it]=Plugin KHTMLPart
+Name[ja]=KHTMLPart プラグイン
+Name[nds]=KHTMLPart-Moduul
+Name[ne]=KHTMLPart पà¥à¤²à¤—इन
+Name[nl]=KHTMLPart-plugin
+Name[pl]=Wtyczka do KHTMLPart
+Name[pt]='Plugin' do KHTMLPart
+Name[pt_BR]='Plugin' do KHTMLPart
+Name[ru]=Модуль KHTMLPart
+Name[sk]=KHTMLPart modul
+Name[sl]=Vstavek za KHTMLPart
+Name[sr]=Прикључак за део KHTML
+Name[sr@Latn]=PrikljuÄak za deo KHTML
+Name[sv]=Insticksprogram för KHTML-delprogram
+Name[tr]=KHTMLPart Eklentisi
+Name[zh_CN]=KHTMLPart æ’件
+Name[zh_TW]=KHTMLPart 外掛程å¼
+Icon=kpartplugin.png
+Category=C++/KDE
+Comment=Generates a plugin for the KHTML part.
+Comment[ca]=Genera un connector per a la part KHTML.
+Comment[da]=Genererer et plugin for KHTML parten.
+Comment[de]=Erstellt ein Modul für die Komponente KHTML
+Comment[el]=ΔημιουÏγεί ένα Ï€Ïόσθετο για το τμήμα KHTML.
+Comment[es]=Genera un complemento para KHTMLPart.
+Comment[et]=KHTML-komponendi plugina loomine.
+Comment[eu]=KHTML zatirako plugin bat sortzen du.
+Comment[fa]=یک وصله برای جزء KHTML تولید می‌کند
+Comment[fr]=Génère un module externe pour le composant KHTML.
+Comment[gl]=Xera unha extensión para o 'part' KHTML.
+Comment[hu]=Létrehoz egy KHTML-bővítőmodult.
+Comment[it]=Genera un plugin per la part KHTML.
+Comment[ja]=KHTML パートã®ãŸã‚ã®ãƒ—ラグインを作æˆã—ã¾ã™
+Comment[nds]=Stellt en Moduul för de Komponent KHTML op.
+Comment[ne]=KHTML भागका लागि पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een plugin voor de KHTML-part.
+Comment[pl]=Generuje wtyczkÄ™ do KHTML part.
+Comment[pt]=Gera um 'plugin' para a componente KHTML.
+Comment[pt_BR]=Gera um 'plugin' para a componente KHTML.
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° KHTML.
+Comment[sk]=Vygeneruje modul pre KHTML part.
+Comment[sr]=Прави прикључак за део KHTML.
+Comment[sr@Latn]=Pravi prikljuÄak za deo KHTML.
+Comment[sv]=Skapar ett insticksprogram för KHTML-delprogrammet
+Comment[zh_CN]=ç”Ÿæˆ KHTML 部件的æ’件。
+Comment[zh_TW]=產生一個 KHTML part 的外掛程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/plugin_%{APPNAMELC}.cpp
+Archive=kpartplugin.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/plugin.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/plugin_app.cpp
+Dest=%{dest}/src/plugin_%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/plugin_app.h
+Dest=%{dest}/src/plugin_%{APPNAMELC}.h
+
+[FILE14]
+Type=install
+EscapeXML=true
+Source=%{src}/plugin_app.rc
+Dest=%{dest}/src/plugin_%{APPNAMELC}.rc
+
+[FILE15]
+Type=install
+Source=%{src}/hi16-action-plugin.png
+Dest=%{dest}/src/hi16-action-plugin.png
+Process=false
+
+[FILE16]
+Type=install
+Source=%{src}/hi22-action-plugin.png
+Dest=%{dest}/src/hi32-action-plugin.png
+Process=false
+
+[MSG]
+Type=message
+Comment=A KHTMLPart plugin was created in %{dest}
+Comment[ca]=Un connector per a KHTMLPart ha estat creat en %{dest}
+Comment[da]=Et KHTMLPart plugin blev oprettet i %{dest}
+Comment[de]=Ein Modul für die Komponente KHTML wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο τμήμα KHTML δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento para KHTMLPart ha sido creado en %{dest}
+Comment[et]=KHTMLPart plugin loodi asukohta %{dest}
+Comment[eu]=KHTMLPart plugin bat sortu da hemen: %{dest}
+Comment[fa]=یک وصلۀ جزء KHTML در %{dest} ایجاد شد
+Comment[fr]=Un module externe pour KHTMLPart a été créé dans %{dest}
+Comment[ga]=Cruthaíodh breiseán KHTMLPart i %{dest}
+Comment[gl]=Creouse unha extensión para KHTMLPart en %{dest}
+Comment[hu]=Létrejött egy KHTML-bővítőmodul itt: %{dest}
+Comment[it]=È stato creato un plugin KHTMLPart in %{dest}
+Comment[ja]=KHTMLPart プラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KHTMLPart-Moduul opstellt
+Comment[ne]=KHTMLPart पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een KHTMLPart-plugin is aangemaakt in %{dest}
+Comment[pl]=Wtyczka do KHTMLPart została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' KHTMLPart em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' KHTMLPart em %{dest}
+Comment[ru]=Модуль Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° KHTML Ñоздан в %{dest}
+Comment[sk]=KHTML modul bol vytvorený v %{dest}
+Comment[sr]=Прикључак за део KHTML направљен је у %{dest}
+Comment[sr@Latn]=PrikljuÄak za deo KHTML napravljen je u %{dest}
+Comment[sv]=Ett insticksprogram för KHTML-delprogrammet skapades i %{dest}
+Comment[tr]=Bir KHTMLPart eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 KHTMLPart æ’件
+Comment[zh_TW]=一個 KHTML 外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kpartplugin/kpartplugin.png b/languages/cpp/app_templates/kpartplugin/kpartplugin.png
new file mode 100644
index 00000000..7d90241a
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/kpartplugin.png
Binary files differ
diff --git a/languages/cpp/app_templates/kpartplugin/plugin.kdevelop b/languages/cpp/app_templates/kpartplugin/plugin.kdevelop
new file mode 100644
index 00000000..dc1b3e25
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/plugin.kdevelop
@@ -0,0 +1,114 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+<kdevautoproject>
+ <general>
+ <activetarget>src/lib%{APPNAMELC}.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kpartplugin/plugin_app.cpp b/languages/cpp/app_templates/kpartplugin/plugin_app.cpp
new file mode 100644
index 00000000..a9ee55a3
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/plugin_app.cpp
@@ -0,0 +1,109 @@
+
+#include "plugin_%{APPNAMELC}.h"
+
+#include <khtml_part.h>
+#include <kaction.h>
+#include <kinstance.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kglobal.h>
+
+Plugin%{APPNAME}::Plugin%{APPNAME}( QObject* parent, const char* name )
+ : Plugin( parent, name )
+{
+ // Instantiate all of your actions here. These will appear in
+ // Konqueror's menu and toolbars.
+ (void) new KAction( i18n("&Plugin Action"), "%{APPNAMELC}", 0,
+ this, SLOT(slotAction()),
+ actionCollection(), "plugin_action" );
+}
+
+Plugin%{APPNAME}::~Plugin%{APPNAME}()
+{
+}
+
+void Plugin%{APPNAME}::slotAction()
+{
+ // This plugin assumes KHTMLPart. If your plugin can handle more
+ // than this or a different Part than this, simply delete or
+ // change the following block.
+ if ( !parent()->inherits("KHTMLPart") )
+ {
+ QString title( i18n( "Cannot Translate Source" ) );
+ QString text( i18n( "You cannot translate anything except web pages "
+ "with this plugin." ) );
+
+ KMessageBox::sorry( 0, text, title );
+ return;
+ }
+
+ // Get a handle on our parent so we may get the necessary data for
+ // processing
+ KHTMLPart *part = dynamic_cast<KHTMLPart *>(parent());
+
+ // This plugin only uses the URL. You may use whatever data you
+ // need.
+ KURL url( part->url() );
+
+ // This is a standard check to make sure we are dealing with a
+ // valid URL
+ if ( !url.isValid() )
+ {
+ QString title( i18n( "Malformed URL" ) );
+ QString text( i18n( "The URL you entered is not valid, please "
+ "correct it and try again" ) );
+
+ KMessageBox::sorry( 0, text, title );
+ return;
+ }
+
+// The following block is very plugin specific. In this example, we
+// translate the current page with AltaVista's BabelFish. You will
+// definitely want to change this.
+// BEGIN
+ KURL work( "http://babel.altavista.com/translate.dyn" );
+
+ QString query( "urltext=" );
+ query += KURL::encode_string( url.url() );
+ work.setQuery( query );
+// END
+
+ // Finally, execute the request
+ part->openURL( work );
+}
+
+%{APPNAME}Factory::%{APPNAME}Factory()
+ : KLibFactory()
+{
+}
+
+%{APPNAME}Factory::~%{APPNAME}Factory()
+{
+ delete s_instance;
+ s_instance = 0;
+}
+
+QObject* %{APPNAME}Factory::createObject( QObject* parent, const char* name, const char*, const QStringList & )
+{
+ return new Plugin%{APPNAME}( parent, name );
+}
+
+KInstance *%{APPNAME}Factory::instance()
+{
+ if ( !s_instance )
+ s_instance = new KInstance( "%{APPNAMELC}" );
+ return s_instance;
+}
+
+extern "C"
+{
+ void* init_lib%{APPNAMELC}plugin()
+ {
+ KGlobal::locale()->insertCatalogue("%{APPNAMELC}");
+ return new %{APPNAME}Factory;
+ }
+}
+
+KInstance* %{APPNAME}Factory::s_instance = 0L;
+
+#include "plugin_%{APPNAMELC}.moc"
diff --git a/languages/cpp/app_templates/kpartplugin/plugin_app.h b/languages/cpp/app_templates/kpartplugin/plugin_app.h
new file mode 100644
index 00000000..e70ad1c1
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/plugin_app.h
@@ -0,0 +1,34 @@
+
+#ifndef _PLUGIN_%{APPNAMEUC}_H_
+#define _PLUGIN_%{APPNAMEUC}_H_
+
+#include <kparts/plugin.h>
+#include <kparts/factory.h>
+
+class Plugin%{APPNAME} : public KParts::Plugin
+{
+ Q_OBJECT
+public:
+ Plugin%{APPNAME}( QObject* parent = 0, const char* name = 0 );
+ virtual ~Plugin%{APPNAME}();
+
+public slots:
+ void slotAction();
+};
+
+class %{APPNAME}Factory : public KLibFactory
+{
+ Q_OBJECT
+public:
+ %{APPNAME}Factory();
+ virtual ~%{APPNAME}Factory();
+
+ virtual QObject* createObject( QObject* parent = 0, const char* pname = 0, const char* name = "QObject", const QStringList &args = QStringList() );
+
+ static KInstance* instance();
+
+private:
+ static KInstance* s_instance;
+};
+
+#endif // _PLUGIN_%{APPNAMEUC}_H_
diff --git a/languages/cpp/app_templates/kpartplugin/plugin_app.rc b/languages/cpp/app_templates/kpartplugin/plugin_app.rc
new file mode 100644
index 00000000..a38ee14e
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/plugin_app.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="%{APPNAMELC}" library="lib%{APPNAMELC}plugin" version="1">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="plugin_action"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar">
+ <Action name="plugin_action"/>
+</ToolBar>
+</kpartplugin>
diff --git a/languages/cpp/app_templates/kpartplugin/src-Makefile.am b/languages/cpp/app_templates/kpartplugin/src-Makefile.am
new file mode 100644
index 00000000..52e29c09
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/src-Makefile.am
@@ -0,0 +1,22 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+KDE_ICON = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = lib%{APPNAMELC}plugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+lib%{APPNAMELC}plugin_la_SOURCES = plugin_%{APPNAMELC}.cpp
+lib%{APPNAMELC}plugin_la_LIBADD = $(LIB_KPARTS) $(LIB_KHTML)
+lib%{APPNAMELC}plugin_la_LDFLAGS = -module -avoid-version -no-undefined $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+plugins_DATA = plugin_%{APPNAMELC}.rc
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/kpartplugin/subdirs b/languages/cpp/app_templates/kpartplugin/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kpartplugin/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kscons_kmdi/INSTALL b/languages/cpp/app_templates/kscons_kmdi/INSTALL
new file mode 100644
index 00000000..edeed594
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/INSTALL
@@ -0,0 +1,83 @@
+REQUIREMENTS
+------------
+
+* KDE headers & libraries for kdelibs
+* A Python interpreter for the compilation
+
+scons v0.96.1 or newer is recommended, but it's not required since a
+minimum scons distribution is included in the package.
+
+BUILDING AND INSTALLING
+-----------------------
+
+For configuring, compiling and installing the application and
+if you do have Scons 0.96.1 or newer installed, just run:
+
+$ scons
+$ scons install (as root user)
+
+In case you don't have Scons installed, you can use
+the accompanying minimum scons by running:
+
+$ tar xjvf admin/scons-mini.tar.bz2
+$ ./scons
+$ ./scons install
+
+ADVANCED BUILD FEATURES & DEINSTALLING
+--------------------------------------
+
+In case you want to execute many compilation jobs in parallel (because you
+want to make use of a SMP system or a compile cluster, for instance),
+you can use ('N' is the number of jobs which should be run in parallel):
+
+$ scons -jN
+
+A debug build of the program can be created by running:
+
+$ scons configure debug=1
+$ scons
+
+Finally, the software can be removed from your system by running
+
+$ scons -c install
+
+CONFIGURATION NOTES
+-------------------
+
+The installation scripts are relying on the kde-config program.
+The programs kde-config, qmake, uic and moc must be accesssible
+through your PATH.
+
+Qt and kde may not be installed as expected (in QTDIR and KDEDIR)
+So until kde-config is able to give that information, you may
+have to give those paths. You may also want to tune the build.
+
+In these cases, you must first run "scons configure" with some options
+before running "scons" and "scons install"
+
+Here are some examples :
+On Fedora/Redhat
+$ scons configure kdeincludes=/usr/include/kde/
+On Debian
+$ scons configure qtincludes=/usr/include/qt/ kdeinclude=/usr/include/kde/
+To install in some particular location with additional include paths
+$ scons configure prefix=~/tmp extraincludes=/tmp/include:/usr/local/include
+For AMD64 and platforms where folders are like /usr/lib64
+$ scons configure libsuffix=64
+
+For more options, run
+scons --help
+
+The build system is based on bksys, a build system that replaces
+autoconf, automake and make in a row. Feel free to report your opinion
+about it to the bksys authors.
+
+PACKAGE CREATION
+----------------
+
+RPM packagers can use the DESTDIR environment variable
+$ DESTDIR=/tmp/build-rpm/ scons install
+
+To use checkinstall, pass the following option
+$ checkinstall --fstrans=no --nodoc scons install
+
diff --git a/languages/cpp/app_templates/kscons_kmdi/Makefile.am b/languages/cpp/app_templates/kscons_kmdi/Makefile.am
new file mode 100644
index 00000000..aa6d9b53
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/Makefile.am
@@ -0,0 +1,21 @@
+dataFiles = app.kcfg app.kdevelop appkmdi.cpp appkmdi.h appkmdiView.cpp \
+appkmdiView.h INSTALL kmdikonsole.cpp kmdikonsole.h main.cpp \
+messages.sh prefs.ui QUICKSTART README SConscript-doc SConscript-src \
+SConstruct settings.kcfgc tips VERSION \
+app_part.cpp app_part.h app_part.rc app_shell.rc
+
+templateName= kscons_kmdi
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles} ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/kscons_kmdi/QUICKSTART b/languages/cpp/app_templates/kscons_kmdi/QUICKSTART
new file mode 100644
index 00000000..ceaf1bda
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/QUICKSTART
@@ -0,0 +1,164 @@
+------------------------------------------
+SUMMARY :
+
+scons
+scons install
+
+
+The online documentation of bksys can be found at:
+http://freehackers.org/~tnagy/bksys_manual.html
+
+ ... and now for the quickstart:
+
+CONFIGURING AND COMPILING THE PROJECT(S)
+SCONS TIPS
+MOC PROCESSING
+SCONS MINIMUM DISTRIBUTION
+MORE TIPS
+
+------------------------------------------
+CONFIGURING AND COMPILING THE PROJECT(S)
+
+The program scons is usually launched as "scons"
+When it is not intalled globally, one can run
+"./scons" instead of "scons" (ie : to use the local scons
+that comes with bksys - see below SCONS MINIMUM DISTRIBUTION
+if you do not have scons already)
+
+To compile the project, you will then only need to launch
+scons on the top-level directory, the scripts find and
+cache the environment detected *automatically* :
+-> scons
+
+To clean the project -> scons -c
+
+To install the project -> scons install
+To install as root user -> su -c 'scons install'
+To uninstall the project -> scons -c install
+To uninstall (as root) -> su -c 'scons -c install'
+To consult the help -> scons -h
+
+To (re)configure the project and give particular arguments, use :
+ -> scons configure debug=1
+
+The variables are saved automatically after the first run
+in files named *.cache.py (look at kde.cache.py, ..)
+
+------------------------------------------
+SCONS TIPS
+
+In a subdirectory, it is necessary to launch scons with the -u flag :
+scons -u
+
+This is annoying and you probably want to add this to your .bashrc
+export SCONSFLAGS=-u
+and forget about it :)
+
+To make .deb or .rpm packages of your program, use :
+checkinstall --fstrans=no --nodoc scons install
+(if you have checkinstall on your system of course)
+
+To make scons run (much) faster, consult ./addons/README in bksys
+
+------------------------------------------
+MOC PROCESSING
+
+In qt programs, when a header 'foo.h' contains a class that has
+signals and slots, then 'foo.h' must contain the macro Q_OBJECT
+in order to compile. foo_moc.cpp is usually generated, and is
+used to produce foo_moc.o which is linked with the
+program or the library.
+
+In kde programs, 'foo.moc' is generated instead of foo_moc.cpp,
+and it must be included at the very end of foo.cpp
+(add #include "foo.moc" : this increases the speed of
+compilation a *lot* and makes less object files.
+
+Both modes are provided though, see test6-mocfiesta/
+
+------------------------------------------
+MINIMUM SCONS DISTRIBUTION
+
+A minimum scons distribution is included in the archive
+for convenience to those who do not have scons packages
+for their operating system or their linux
+distribution. For a full and more recent version of scons,
+please consult http://www.scons.org
+
+Including this scons distribution to your archive will add
+about 63kb (compressed) , while including the necessary
+kdescripts (admin/ directory, configure, autom4 cache stuff,
+Makefile.in) can add easily 500kb (compressed).
+
+To compile with the scons distribution :
+* unpack it with :
+ tar xjvf admin/scons-mini.tar.bz2
+* compile the program with :
+ ./scons (instead of just 'scons')
+* install the program with :
+ ./scons install (instead of just 'scons install')
+
+More options :
+* clean the object files with :
+ ./scons -c
+* uninstall the program with with :
+ ./scons -c install
+* create a package :
+ ./scons dist
+
+------------------------------------------
+MORE TIPS
+
+** static libraries **
+With Makefile.am, one had to make static libraries all the time
+because it did not allow having source code in other directories.
+This is not the case anymore with scons, so you can specify
+sources in other directories relative to the sconscript file, ie:
+ test1_sources = ['mainfiles/main.cpp', 'otherfile/program.cpp']
+ myenv.Program( target = "test1", source = test1_sources )
+To encourage you to switch to the new scheme, the static library
+helper has been omitted (look at the end of kde.py if you need one)
+
+** libtool **
+The LaFile build tool is a cheat that allows klibloader to load
+.so files without complaints. If you need real libtool support
+you can have a look to the libtool directory : it can work but
+remember that libtool is broken on many systems (invalid flags
+among others), so when you can work without libtool
+(small projects especially), just do it.
+
+** moc processing **
+As stated above, you should always add #include "foo.moc"
+for your qt classes (Q_OBJECT) to save precious compilation time.
+
+** using a cache **
+It is a good idea to enable the cache feature in SConstruct,
+especially if you are doing experiments (it saves your computer
+from recompiling the same files over and over again ..).
+
+** threading **
+myenv.AppendUnique( CPPFLAGS = ['-DQT_THREAD_SUPPORT', '-D_REENTRANT'] )
+
+** final notes ***
+A medium-sized project containing several targets, libraries and data
+files can be converted very quickly.
+Also, remember that SConscript files are actually python scripts ..
+you can use whatever python feature you want in them, ie: "for" loops,
+this is how the kde helpers work (KDEprogram, KDEshlib ..).
+
+If you are stuck, you can also have a look at more complicated
+bksys-based projects like kdissert or kshaderdesigner
+
+The scons man page and the wiki can be very useful, do not forget to
+consult them when you encounter an issue
+
+------------------------------------------
+
+I hope you will enjoy this alternative to the autotools
+scripts for kde programming, at least as much as I do :
+http://freehackers.org/~tnagy/kdissert/index.html
+
+Happy kde hacking,
+
+Thomas Nagy, 2004, 2005 <tnagyemail-mail@yahoo^fr>
+
diff --git a/languages/cpp/app_templates/kscons_kmdi/README b/languages/cpp/app_templates/kscons_kmdi/README
new file mode 100644
index 00000000..8085c7e7
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/README
@@ -0,0 +1,111 @@
+-----------------------------------------------
+Kde scons template quickstart
+Author: Thomas Nagy
+Date: 2005-04-04
+-----------------------------------------------
+
+This README file explains basic concepts necessary
+for starting with this application template.
+
+
+** Building and installing **
+
+* To configure the application run "scons configure"
+ In some rare cases you may need to add flags:
+ scons configure qtincludes=/usr/include/qt3/include kdeincludes=/usr/lib/kde3/include
+
+* After building, launch the application and test the dcop
+ interface by using the command (search a bit) :
+ dcop
+ dcop appname-...
+ dcop appname-... instancenumber
+ dcop appname-... instancenumber switch_colors
+ dcop appname switch_colors
+ Or launch kdcop and search in the menus for your program
+ name and double-click on 'switch_colors()'
+
+* The usual targets call the following scons commands :
+ make -> scons
+ make clean -> scons -c
+ make install -> scons install
+ make uninstall -> scons -c install
+ make dist -> scons dist
+
+* To build apps, use KDEprogram, KDEshlib, etc.
+ these functions are documented at the bottom of kde.py
+ More information can be found in the QUICKSTART
+
+* The scons scripts for building kde applications originate
+ from the 'bksys' distribution. It contains several other examples
+ that detail the kpart building and the dcop interface
+ processing :
+ http://www.kde-apps.org/content/show.php?content=19243
+
+* Extending the scons scripts for building the application :
+ The scons scripts are actually python scripts, so all the
+ usual tricks apply : 'for' and 'while' loops, 'if', 'else' ..
+ consult :
+ http://www.python.org for more information about python
+ http://www.scons.org for more informationabout scons
+
+* Simplify your life : install the project in your home directory for
+testing purposes.
+scons configure prefix=/home/user/dummyfolder/
+In the end when you finished the development you can
+rm -rf /home/user/dummyfolder/
+without fear.
+
+
+** Technologies **
+
+* Build the menus of your application easily
+kde applications now use an xml file (*ui.rc file) to build the menus.
+This allow a great customization of the application. However, when
+programming the menu is shown only after a "make install"
+
+For more details, consult :
+http://devel-home.kde.org/~larrosa/tutorial/p9.html
+http://developer.kde.org/documentation/tutorials/xmlui/preface.html
+
+* Use KConfig XT to create your configuration dialogs and make
+them more maintainable.
+
+For that, you will need to write two simple configuration files
+in the src directory : <myproject>.kcfg and a <settings>.kcfgc
+The configure.in.in will need to be modified : change the line #MIN_CONFIG(3.0.0)
+into #MIN_CONFIG(3.2.0)
+
+Take an example on the many apps found in the kdegames source package and consult :
+http://developer.kde.org/documentation/tutorials/kconfigxt/kconfigxt.html
+
+* With KParts, you can embed other kde components in your program, or make your program
+embeddable in other apps. For example, the kmplayer kpart can be called to play videos
+in your app.
+
+For more details, consult :
+http://www-106.ibm.com/developerworks/library/l-kparts/
+http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html
+
+* With dcop, you can control your app from other applications
+Make sure to include K_DCOP and a kdcop: section in your .h file
+http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html
+
+
+** Documentation **
+
+* For the translations :
+refer to the file po/SConscript and po/messages.sh
+
+1. Download a patched gettext which can be found at:
+ http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/
+2. Install that gettext in ~/bin/
+3. cd ~/yourproject, export PATH=~/bin:$PATH, export
+KDEDIR=/where_your_KDE3_is
+4. make -f admin/Makefile.common package-messages
+5. make package-messages
+6. Translate the po files (not the pot!!) with kbabel or xemacs
+
+* Do not forget to write the documentation for your kde app
+edit the documentation template index.docbook in doc/
+
diff --git a/languages/cpp/app_templates/kscons_kmdi/SConscript-doc b/languages/cpp/app_templates/kscons_kmdi/SConscript-doc
new file mode 100644
index 00000000..6769a359
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/SConscript-doc
@@ -0,0 +1,92 @@
+#! /usr/bin/env python
+## This script demonstrates to build and install
+## the documentation of a kde program with scons
+##
+## Thomas Nagy, 2005
+
+## This file can be reused freely for any project (see COPYING)
+
+## First load the environment set in the top-level SConstruct file
+Import( 'env' )
+myenv=env.Copy()
+
+## The following looks complicated but it is not
+## We first define a function to install all files as documentation
+## The documentation is of course lying in subfolders from here
+## * normal files are installed under KDEDOC/destination
+## * meinproc files are not installed, but processed into a single
+## index.cache.bz2 which is installed afterwards
+
+## This is far more maintainable to have *one* file than
+## having lots of almost empty SConscript in several folders
+
+###################################################################
+# COMMON PART FOR PROCESSING DOCUMENTATION FOLDERS
+###################################################################
+
+import os
+import sys
+import glob
+import SCons.Util
+
+## Define this to 1 if you are writing documentation else to 0 :)
+i_am_a_documentation_writer = 0
+
+## This function uses env imported above
+def processfolder(folder, lang, destination=""):
+ # folder is the folder to process
+ # lang is the language
+ # destination is the subdirectory in KDEDOC
+
+ docfiles = glob.glob(folder+"/???*.*") # file files that are at least 4 chars wide :)
+
+ # warn about errors
+ #if len(lang) != 2:
+ # print "error, lang must be a two-letter string, like 'en'"
+
+ # when the destination is not given, use the folder
+ if len(destination) == 0:
+ destination=folder
+
+ docbook_list = []
+ for file in docfiles:
+
+ # do not process folders
+ if not os.path.isfile(file):
+ continue
+ # do not process the cache file
+ if file == 'index.cache.bz2':
+ continue
+ # ignore invalid files (TODO??)
+ if len( SCons.Util.splitext( file ) ) <= 1 :
+ continue
+
+ ext = SCons.Util.splitext( file )[1]
+
+ # docbook files are processed by meinproc
+ if ext == '.docbook':
+ docbook_list.append( file )
+ continue
+
+ myenv.KDEinstall('KDEDOC', lang+'/'+destination, file)
+
+ # Now process the index.docbook files ..
+ if len(docbook_list) == 0:
+ return
+ if not os.path.isfile( folder+'/index.docbook' ):
+ print "Error, index.docbook was not found in "+folder+'/index.docbook'
+ return
+ if i_am_a_documentation_writer:
+ for file in docbook_list:
+ myenv.Depends( folder+'index.cache.bz2', file )
+ myenv.Meinproc( folder+'/index.cache.bz2', folder+'/index.docbook' )
+ myenv.KDEinstall( 'KDEDOC', lang+'/'+destination, folder+'/index.cache.bz2' )
+
+###################################################################
+# TELL WHICH FOLDERS TO PROCESS
+###################################################################
+
+## Use processfolder for each documentation directory
+processfolder('en/', 'en', '%{APPNAMELC}')
+processfolder('fr/', 'fr', '%{APPNAMELC}')
+
diff --git a/languages/cpp/app_templates/kscons_kmdi/SConscript-src b/languages/cpp/app_templates/kscons_kmdi/SConscript-src
new file mode 100644
index 00000000..746cdf98
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/SConscript-src
@@ -0,0 +1,60 @@
+#! /usr/bin/env python
+## This script is a quick test to demonstrate (and test)
+## the bksys moc handling '#include "file.moc"' can be added .. or not
+##
+## Thomas Nagy, 2005
+## This file can be reused freely for any project (see COPYING)
+
+Import('env')
+myenv=env.Copy()
+
+## First build : the shell
+## Each tab in it will hold an instance of the part ..
+
+%{APPNAMELC}_sources="""
+main.cpp
+%{APPNAMELC}kmdi.cpp
+%{APPNAMELC}kmdiView.cpp
+kmdikonsole.cpp
+settings.kcfgc
+prefs.ui
+"""
+# Now that we have our list of sources we can build the program
+myenv.KDEprogram( '%{APPNAMELC}', %{APPNAMELC}_sources ) # main program
+myenv.KDEaddpaths_includes( './ ../' ) # additional paths
+myenv.KDEaddlibs( 'qt-mt kdecore kio kparts kmdi' ) # additional libraries
+
+## Next, the kpart library
+## using KDEshlib, the .so and .la are installed automatically when needed
+
+myenv2=env.Copy()
+%{APPNAMELC}part_sources = '%{APPNAMELC}_part.cpp'
+myenv2.KDEshlib( 'lib%{APPNAMELC}part', %{APPNAMELC}part_sources)
+myenv2.KDEaddpaths_includes( './ #/' ) # the '#' means the top-level directory
+myenv2.KDEaddlibs( 'qt-mt kio kdecore kdeprint kparts' )
+# myenv2.KDEaddflags_link( '-DQT_THREAD_SUPPORT' )
+
+#############################
+## Data files to install
+
+## NOTE: KDEinstall( resource_type, subdir, list of files )
+
+## the .kcfg file
+myenv.KDEinstall( 'KDEKCFG', '', '%{APPNAMELC}.kcfg' )
+
+## the program .desktop file
+myenv.KDEinstall( 'KDEMENU', '/Utilities', '%{APPNAMELC}.desktop' )
+
+## the rc file - named *_shell.rc instead of *ui.rc for kpart apps
+myenv.KDEinstall( 'KDEDATA', '/%{APPNAMELC}', '%{APPNAMELC}_shell.rc' )
+
+## this servicetype desktop file goes in KDEXDG whether the other one goes in KDEMENU
+myenv.KDEinstall( 'KDEXDG', '', '%{APPNAMELC}_part.desktop' )
+
+## the kpart resource file
+myenv.KDEinstall( 'KDEDATA', '/%{APPNAMELC}part', '%{APPNAMELC}_part.rc' )
+
+## Installing icons is easy (hi-16-app-%{APPNAMELC}.png, hi-22-app-%{APPNAMELC}.png)
+#myenv.KDEicon()
+
+## do not forget that this is a python script so even loops are allowed... :)
diff --git a/languages/cpp/app_templates/kscons_kmdi/SConstruct b/languages/cpp/app_templates/kscons_kmdi/SConstruct
new file mode 100644
index 00000000..b82de4e1
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/SConstruct
@@ -0,0 +1,112 @@
+#! /usr/bin/env python
+
+"""
+help -> scons -h
+compile -> scons
+clean -> scons -c
+install -> scons install
+uninstall -> scons -c install
+configure -> scons configure prefix=/tmp/ita debug=full extraincludes=/usr/local/include:/tmp/include prefix=/usr/local
+
+Run from a subdirectory -> scons -u
+The variables are saved automatically after the first run (look at cache/kde.cache.py, ..)
+"""
+
+###################################################################
+# LOAD THE ENVIRONMENT AND SET UP THE TOOLS
+###################################################################
+
+## Load the builders in config
+env = Environment( tools=['default', 'generic', 'kde'], toolpath=['./', './admin'])
+#env = Environment( tools=['default', 'generic', 'kde', 'othertool'], toolpath=['./', './admin'])
+
+env.KDEuse("environ rpath")
+#env.KDEuse("environ rpath lang_qt thread nohelp")
+
+###################################################################
+# SCRIPTS FOR BUILDING THE TARGETS
+###################################################################
+
+dirs="""
+src
+doc
+"""
+env.subdirs(dirs)
+
+## Process the translations in the po/ directory
+env.KDElang('po/', '%{APPNAMELC}')
+
+###################################################################
+# CONVENIENCE FUNCTIONS TO EMULATE 'make dist' and 'make distclean'
+###################################################################
+
+### To make a tarball of your masterpiece, use 'scons dist'
+if 'dist' in COMMAND_LINE_TARGETS:
+
+ ## The target scons dist requires the python module shutil which is in 2.3
+ env.EnsurePythonVersion(2, 3)
+
+ import os
+ APPNAME = 'bksys'
+ VERSION = os.popen("cat VERSION").read().rstrip()
+ FOLDER = APPNAME+'-'+VERSION
+ ARCHIVE = FOLDER+'.tar.bz2'
+
+ ## If your app name and version number are defined in 'version.h', use this instead:
+ ## (contributed by Dennis Schridde devurandom@gmx@net)
+ #import re
+ #INFO = dict( re.findall( '(?m)^#define\s+(\w+)\s+(.*)(?<=\S)', open(r"version.h","rb").read() ) )
+ #APPNAME = INFO['APPNAME']
+ #VERSION = INFO['VERSION']
+
+ import shutil
+ import glob
+
+ ## check if the temporary directory already exists
+ if os.path.isdir(FOLDER):
+ shutil.rmtree(FOLDER)
+ if os.path.isfile(ARCHIVE):
+ os.remove(ARCHIVE)
+
+ ## create a temporary directory
+ startdir = os.getcwd()
+ shutil.copytree(startdir, FOLDER)
+
+ ## remove our object files first
+ os.popen("find "+FOLDER+" -name \"*cache*\" | xargs rm -rf")
+ os.popen("find "+FOLDER+" -name \"*.pyc\" | xargs rm -f")
+ #os.popen("pushd %s && scons -c " % FOLDER) # TODO
+
+ ## CVS cleanup
+ os.popen("find "+FOLDER+" -name \"CVS\" | xargs rm -rf")
+ os.popen("find "+FOLDER+" -name \".cvsignore\" | xargs rm -rf")
+
+ ## Subversion cleanup
+ os.popen("find %s -name .svn -type d | xargs rm -rf" % FOLDER)
+
+ ## GNU Arch cleanup
+ os.popen("find "+FOLDER+" -name \"{arch}\" | xargs rm -rf")
+ os.popen("find "+FOLDER+" -name \".arch-i*\" | xargs rm -rf")
+
+ ## Create the tarball (coloured output)
+ print "\033[92m"+"Writing archive "+ARCHIVE+"\033[0m"
+ os.popen("tar cjf "+ARCHIVE+" "+FOLDER)
+
+ ## Remove the temporary directory
+ if os.path.isdir(FOLDER):
+ shutil.rmtree(FOLDER)
+
+ env.Default(None)
+ env.Exit(0)
+
+### Emulate "make distclean"
+if 'distclean' in COMMAND_LINE_TARGETS:
+ ## Remove the cache directory
+ import os, shutil
+ if os.path.isdir(env['CACHEDIR']):
+ shutil.rmtree(env['CACHEDIR'])
+ os.popen("find . -name \"*.pyc\" | xargs rm -rf")
+
+ env.Default(None)
+ env.Exit(0)
+
diff --git a/languages/cpp/app_templates/kscons_kmdi/VERSION b/languages/cpp/app_templates/kscons_kmdi/VERSION
new file mode 100644
index 00000000..2e293c30
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/VERSION
@@ -0,0 +1 @@
+%{VERSION}
diff --git a/languages/cpp/app_templates/kscons_kmdi/app.kcfg b/languages/cpp/app_templates/kscons_kmdi/app.kcfg
new file mode 100644
index 00000000..f2c46b64
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/app.kcfg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="%{APPNAMELC}rc"/>
+ <group name="Preferences">
+ <entry name="showCloseTabsButton" type="Bool">
+ <default>true</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/languages/cpp/app_templates/kscons_kmdi/app.kdevelop b/languages/cpp/app_templates/kscons_kmdi/app.kdevelop
new file mode 100644
index 00000000..e6a14fff
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/app.kdevelop
@@ -0,0 +1,169 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <ignoreparts/>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>false</terminal>
+ </run>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ </make>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs/>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ <runappinappdirectory>true</runappinappdirectory>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions/>
+ <updateoptions>-dP</updateoptions>
+ <addoptions/>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions/>
+ <rshoptions/>
+ </kdevcvs>
+ <cppsupportpart>
+ <codecompletion/>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL/>
+ <implementationURL/>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kscons_kmdi/app_part.cpp b/languages/cpp/app_templates/kscons_kmdi/app_part.cpp
new file mode 100644
index 00000000..71155138
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/app_part.cpp
@@ -0,0 +1,159 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}_part.h"
+
+#include <kparts/genericfactory.h>
+#include <kinstance.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qmultilineedit.h>
+
+typedef KParts::GenericFactory<%{APPNAMELC}Part> %{APPNAMELC}PartFactory;
+K_EXPORT_COMPONENT_FACTORY( lib%{APPNAMELC}part, %{APPNAMELC}PartFactory );
+
+%{APPNAMELC}Part::%{APPNAMELC}Part( QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name, const QStringList & /*args*/)
+ : KParts::ReadWritePart(parent)
+{
+ // we need an instance
+ setInstance( %{APPNAMELC}PartFactory::instance() );
+
+ // this should be your custom internal widget
+ m_widget = new QMultiLineEdit( parentWidget, widgetName );
+
+ // notify the part that this is our internal widget
+ setWidget(m_widget);
+
+ // create our actions
+ KStdAction::open(this, SLOT(fileOpen()), actionCollection());
+ KStdAction::saveAs(this, SLOT(fileSaveAs()), actionCollection());
+ KStdAction::save(this, SLOT(save()), actionCollection());
+
+ // set our XML-UI resource file
+ setXMLFile("%{APPNAMELC}_part.rc");
+
+ // we are read-write by default
+ setReadWrite(true);
+
+ // we are not modified since we haven't done anything yet
+ setModified(false);
+}
+
+%{APPNAMELC}Part::~%{APPNAMELC}Part()
+{
+}
+
+KAboutData *%{APPNAMELC}Part::createAboutData()
+{
+ // The non-i18n name here must be the same as the directory in
+ // which the part's rc file is installed
+ KAboutData *aboutData = new KAboutData("%{APPNAMELC}part", I18N_NOOP("%{APPNAMELC}Part"), "0.0.1");
+ aboutData->addAuthor("%{AUTHOR}", 0, "%{EMAIL}");
+ return aboutData;
+}
+
+void %{APPNAMELC}Part::setReadWrite(bool rw)
+{
+ // notify your internal widget of the read-write state
+ m_widget->setReadOnly(!rw);
+ if (rw)
+ connect(m_widget, SIGNAL(textChanged()),
+ this, SLOT(setModified()));
+ else
+ {
+ disconnect(m_widget, SIGNAL(textChanged()),
+ this, SLOT(setModified()));
+ }
+
+ ReadWritePart::setReadWrite(rw);
+}
+
+void %{APPNAMELC}Part::setModified(bool modified)
+{
+ // get a handle on our Save action and make sure it is valid
+ KAction *save = actionCollection()->action(KStdAction::stdName(KStdAction::Save));
+ if (!save)
+ return;
+
+ // if so, we either enable or disable it based on the current
+ // state
+ if (modified)
+ save->setEnabled(true);
+ else
+ save->setEnabled(false);
+
+ // in any event, we want our parent to do it's thing
+ ReadWritePart::setModified(modified);
+}
+
+bool %{APPNAMELC}Part::openFile()
+{
+ // m_file is always local so we can use QFile on it
+ QFile file(m_file);
+ if (file.open(IO_ReadOnly) == false)
+ return false;
+
+ // our example widget is text-based, so we use QTextStream instead
+ // of a raw QDataStream
+ QTextStream stream(&file);
+ QString str;
+ while (!stream.eof())
+ str += stream.readLine() + "\n";
+
+ file.close();
+
+ // now that we have the entire file, display it
+ m_widget->setText(str);
+
+ // just for fun, set the status bar
+ emit setStatusBarText( m_url.prettyURL() );
+
+ return true;
+}
+
+bool %{APPNAMELC}Part::saveFile()
+{
+ // if we aren't read-write, return immediately
+ if (isReadWrite() == false)
+ return false;
+
+ // m_file is always local, so we use QFile
+ QFile file(m_file);
+ if (file.open(IO_WriteOnly) == false)
+ return false;
+
+ // use QTextStream to dump the text to the file
+ QTextStream stream(&file);
+ stream << m_widget->text();
+
+ file.close();
+
+ return true;
+}
+
+void %{APPNAMELC}Part::fileOpen()
+{
+ // this slot is called whenever the File->Open menu is selected,
+ // the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
+ // button is clicked
+ QString file_name = KFileDialog::getOpenFileName();
+
+ if (file_name.isEmpty() == false)
+ openURL(file_name);
+}
+
+void %{APPNAMELC}Part::fileSaveAs()
+{
+ // this slot is called whenever the File->Save As menu is selected,
+ QString file_name = KFileDialog::getSaveFileName();
+ if (file_name.isEmpty() == false)
+ saveAs(file_name);
+}
+
+#include "%{APPNAMELC}_part.moc"
diff --git a/languages/cpp/app_templates/kscons_kmdi/app_part.h b/languages/cpp/app_templates/kscons_kmdi/app_part.h
new file mode 100644
index 00000000..e1dd002b
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/app_part.h
@@ -0,0 +1,74 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}PART_H_
+#define _%{APPNAMEUC}PART_H_
+
+#include <kparts/part.h>
+#include <kparts/factory.h>
+
+class QMultiLineEdit;
+class QWidget;
+class QPainter;
+class KURL;
+class KAboutData;
+
+/**
+ * This is a "Part". It that does all the real work in a KPart
+ * application.
+ *
+ * @short Main Part
+ * @author %{AUTHOR}
+ * @version %{VERSION}
+ */
+class %{APPNAMELC}Part : public KParts::ReadWritePart
+{
+ Q_OBJECT
+public:
+ /**
+ * Default constructor
+ */
+ %{APPNAMELC}Part(QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name, const QStringList & /*args*/);
+
+ /**
+ * Destructor
+ */
+ virtual ~%{APPNAMELC}Part();
+
+ /**
+ * This is a virtual function inherited from KParts::ReadWritePart.
+ * A shell will use this to inform this Part if it should act
+ * read-only
+ */
+ virtual void setReadWrite(bool rw);
+
+ /**
+ * Reimplemented to disable and enable Save action
+ */
+ virtual void setModified(bool modified);
+
+ /**
+ * About data for the part
+ */
+ static KAboutData *createAboutData();
+
+protected:
+ /**
+ * This must be implemented by each part
+ */
+ virtual bool openFile();
+
+ /**
+ * This must be implemented by each read-write part
+ */
+ virtual bool saveFile();
+
+protected slots:
+ void fileOpen();
+ void fileSaveAs();
+
+private:
+ QMultiLineEdit *m_widget;
+};
+
+#endif // _%{APPNAMEUC}PART_H_
diff --git a/languages/cpp/app_templates/kscons_kmdi/app_part.rc b/languages/cpp/app_templates/kscons_kmdi/app_part.rc
new file mode 100644
index 00000000..cec8ec5c
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/app_part.rc
@@ -0,0 +1,17 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}_part" version="1">
+<MenuBar>
+ <Menu name="file">
+ <Action name="file_open"/>
+ <Separator/>
+ <Action name="file_save"/>
+ <Action name="file_save_as"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="mainToolBar">
+ <Action name="file_open"/>
+ <Action name="file_save"/>
+ <Action name="file_print"/>
+ <Separator/>
+</ToolBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kscons_kmdi/app_shell.rc b/languages/cpp/app_templates/kscons_kmdi/app_shell.rc
new file mode 100644
index 00000000..c8b2bb98
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/app_shell.rc
@@ -0,0 +1,33 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}_shell" version="1">
+<MenuBar>
+ <Menu noMerge="1" name="file"><text>&amp;File</text>
+ <Action name="file_new"/>
+ <Merge/>
+ <Separator/>
+ <Action name="file_close"/>
+ <Separator/>
+ <Action name="file_quit"/>
+ </Menu>
+ <Menu name="view" noMerge="1"><text>&amp;View</text>
+ </Menu>
+ <Menu noMerge="1" name="settings"><text>&amp;Settings</text>
+ <Action name="options_show_toolbar"/>
+ <Action name="options_show_statusbar"/>
+ <Merge name="show_merge"/>
+ <Separator/>
+ <Action name="options_configure_keybinding"/>
+ <Action name="options_configure_toolbars"/>
+ <Action name="options_configure"/>
+ <Merge name="configure_merge"/>
+ <Separator/>
+ <Merge/>
+ </Menu>
+</MenuBar>
+<ToolBar noMerge="1" name="mainToolBar"><text>Main Toolbar</text>
+ <Action name="file_new"/>
+ <Action name="file_close"/>
+ <Merge/>
+ <Action name="help"/>
+</ToolBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kscons_kmdi/appkmdi.cpp b/languages/cpp/app_templates/kscons_kmdi/appkmdi.cpp
new file mode 100644
index 00000000..be5d8862
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/appkmdi.cpp
@@ -0,0 +1,394 @@
+%{CPP_TEMPLATE}
+
+#include <qdragobject.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+#include <qdragobject.h>
+#include <qstatusbar.h>
+#include <qtoolbutton.h>
+
+#include <kdebug.h>
+#include <kglobal.h>
+#include <ktip.h>
+#include <kparts/part.h>
+#include <kparts/partmanager.h>
+
+#include <kio/netaccess.h>
+#include <kurl.h>
+#include <kurldrag.h>
+#include <kurlrequesterdlg.h>
+#include <kconfig.h>
+#include <kconfigdialog.h>
+#include <klibloader.h>
+#include <kaboutdata.h>
+#include <kfiledialog.h>
+#include <kactionclasses.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kdeversion.h>
+#include <kmenubar.h>
+#include <kstatusbar.h>
+#include <kkeydialog.h>
+#include <kmessagebox.h>
+#include <ktabwidget.h>
+#include <kedittoolbar.h>
+#include <kdeversion.h>
+#include <kstdaccel.h>
+#include <kaction.h>
+#include <kstdaction.h>
+
+#include "settings.h"
+#include "prefs.h"
+#include "%{APPNAMELC}kmdiView.h"
+#include "kmdikonsole.h"
+#include "%{APPNAMELC}kmdi.h"
+
+%{APPNAMELC}kmdi::%{APPNAMELC}kmdi(KMdi::MdiMode mode)
+ : KMdiMainFrm( 0, "%{APPNAMELC}", mode )
+{
+ resize( 800, 600 ); // start at 800x600 the first time
+
+ setManagedDockPositionModeEnabled(true);
+ setStandardMDIMenuEnabled(false);
+
+ m_manager = new KParts::PartManager(this);
+ connect(m_manager, SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(createGUI(KParts::Part*)) );
+
+#if KDE_IS_VERSION(3, 3, 0)
+ setToolviewStyle( KMdi::TextAndIcon );
+ tabWidget()->setHoverCloseButton( false );
+#endif
+
+ setMenuForSDIModeSysButtons( menuBar() );
+ setManagedDockPositionModeEnabled(true);
+
+ m_console = NULL;
+
+ // accept dnd
+ setAcceptDrops(true);
+
+ // then, setup our actions
+ setupActions();
+
+ //createShellGUI( true );
+
+ // and a status bar
+ statusBar()->show();
+
+ connect( this, SIGNAL( viewActivated( KMdiChildView * ) ), this, SLOT( currentChanged( KMdiChildView * ) ) );
+
+ m_console = new kmdikonsole(this, "konsole");
+ m_console->setIcon( SmallIcon("konsole") );
+ m_console->setCaption( i18n("Terminal") );
+ addToolWindow( m_console, KDockWidget::DockBottom, getMainDockWidget(), 20 );
+
+
+#if KDE_IS_VERSION(3, 3, 0)
+ if (Settings::showCloseTabsButton())
+ {
+ QToolButton *but = new QToolButton(tabWidget());
+ but->setIconSet(SmallIcon("tab_remove"));
+ but->adjustSize();
+ but->hide();
+ connect(but, SIGNAL(clicked()), actionCollection()->action( "file_close" ), SIGNAL(activated()));
+ tabWidget()->setCornerWidget(but, TopRight);
+ }
+#endif
+
+ // apply the saved mainwindow settings, if any, and ask the mainwindow
+ // to automatically save settings if changed: window size, toolbar
+ // position, icon size, etc.
+ setAutoSaveSettings();
+
+ // Read the dock config only if the app was started at least only once - kmdi is tricky
+ KConfig *cfg = new KConfig("%{APPNAMELC}_dockposrc");
+ if (cfg->readNumEntry("%{APPNAMELC}_main_dock_settings", 0) == 1) manager()->readConfig(cfg);
+ cfg->writeEntry("%{APPNAMELC}_main_dock_settings", 1);
+ delete cfg;
+
+ showTipOnStart();
+}
+
+%{APPNAMELC}kmdi::~%{APPNAMELC}kmdi()
+{
+ // Write the dock config on exit
+ KConfig *cfg = new KConfig("%{APPNAMELC}_dockposrc");
+ manager()->writeConfig(cfg);
+ delete cfg;
+ delete m_console;
+}
+
+void %{APPNAMELC}kmdi::setupActions()
+{
+ setXMLFile("%{APPNAMELC}_shell.rc");
+
+ KStdAction::openNew(this, SLOT(slotFileNew()), actionCollection());
+
+ KStdAction::tipOfDay( this, SLOT( showTip() ), actionCollection()
+ )->setWhatsThis(i18n("This shows useful tips on the use of this application."));
+
+ KStdAction::close(this, SLOT(slotFileClose()), actionCollection());
+ KStdAction::quit(this, SLOT(slotFileQuit()), actionCollection());
+
+ m_toolbarAction = KStdAction::showToolbar(this, SLOT(optionsShowToolbar()), actionCollection());
+ m_statusbarAction = KStdAction::showStatusbar(this, SLOT(optionsShowStatusbar()), actionCollection());
+
+ KStdAction::keyBindings(this, SLOT(optionsConfigureKeys()), actionCollection());
+ KStdAction::preferences(this, SLOT(optionsPreferences()), actionCollection());
+
+ KAction* action = KStdAction::configureToolbars(this,
+ SLOT(optionsConfigureToolbars()), actionCollection());
+
+ createGUI( NULL );
+}
+
+void %{APPNAMELC}kmdi::showTip()
+{
+ KTipDialog::showTip(this,QString::null,true);
+}
+
+void %{APPNAMELC}kmdi::showTipOnStart()
+{
+ KTipDialog::showTip(this);
+}
+
+void %{APPNAMELC}kmdi::slotFileNew()
+{
+ %{APPNAMELC}kmdiView *view = new %{APPNAMELC}kmdiView(this);
+ m_manager->addPart( view->part() );
+
+ addWindow( view );
+
+ // add the tree view to the widget stack
+ m_views += view;
+
+ currentChanged( view );
+}
+
+void %{APPNAMELC}kmdi::openURL(const KURL & url)
+{
+ // check if the url is not already opened first
+ QValueList<%{APPNAMELC}kmdiView*>::iterator it = m_views.begin();
+ QValueList<%{APPNAMELC}kmdiView*>::iterator end = m_views.end();
+ for (; it != end; ++it)
+ {
+ %{APPNAMELC}kmdiView *view = *it;
+ if (view->part()->url() == url)
+ {
+ activateView(view);
+ return;
+ }
+ }
+
+ %{APPNAMELC}kmdiView *view = new %{APPNAMELC}kmdiView(this);
+ m_manager->addPart( view->part() );
+
+ addWindow( view );
+
+ m_views += view;
+
+ view->part()->openURL(url);
+ currentChanged( view );
+}
+
+void %{APPNAMELC}kmdi::currentChanged( KMdiChildView *current )
+{
+ //kdWarning()<<"current view changed"<<endl;
+ if (!current)
+ {
+ m_manager->setActivePart(NULL);
+ //setCaption("()");
+ return;
+ }
+
+ // switch to the corresponding document
+ if ( m_views.contains( (%{APPNAMELC}kmdiView*) current ) )
+ {
+ %{APPNAMELC}kmdiView *view = (%{APPNAMELC}kmdiView*) current;
+ //view->updateCaption();
+ m_manager->setActivePart( view->part() );
+ }
+}
+
+void %{APPNAMELC}kmdi::slotFileClose()
+{
+ requestClose( activeWindow() );
+}
+
+bool %{APPNAMELC}kmdi::requestClose(KMdiChildView* v)
+{
+ // kdWarning()<<"closing view"<<v<<endl;
+ // if (view == NULL)
+ // return;
+
+ if (v == NULL)
+ {
+ if ( m_views.count() == 1)
+ {
+ %{APPNAMELC}kmdiView *view = m_views[0];
+ if (view->part()->queryClose())
+ {
+ m_manager->removePart( view->part() );
+
+ closeWindow( view );
+ m_views.clear();
+ setCaption("kdissert");
+ return true;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ %{APPNAMELC}kmdiView *view = (%{APPNAMELC}kmdiView*) v;
+ if ( m_views.contains( view ) )
+ {
+ m_views.remove( view );
+ if ( view->part()->queryClose() )
+ {
+ m_manager->removePart( view->part() );
+
+ closeWindow( view );
+ return true;
+ }
+ return false;
+ }
+ return true;
+}
+
+void %{APPNAMELC}kmdi::slotFileQuit()
+{
+ close();
+}
+
+void %{APPNAMELC}kmdi::optionsShowToolbar()
+{
+ if (m_toolbarAction->isChecked())
+ toolBar()->show();
+ else
+ toolBar()->hide();
+}
+
+void %{APPNAMELC}kmdi::optionsShowStatusbar()
+{
+ if (m_statusbarAction->isChecked())
+ statusBar()->show();
+ else
+ statusBar()->hide();
+}
+
+void %{APPNAMELC}kmdi::optionsConfigureKeys()
+{
+ //KKeyDialog::configure(actionCollection());
+ KKeyDialog dlg( false, this );
+ QPtrList<KXMLGUIClient> clients = guiFactory()->clients();
+
+ for( QPtrListIterator<KXMLGUIClient> it( clients ); it.current(); ++it )
+ dlg.insert ( (*it)->actionCollection(), (*it)->instance()->aboutData()->programName() );
+
+ dlg.configure();
+
+ for (int i=0; i<m_views.count(); i++)
+ {
+ m_views[i]->part()->reloadXML();
+ }
+}
+
+void %{APPNAMELC}kmdi::optionsConfigureToolbars()
+{
+ //saveMainWindowSettings(KGlobal::config(), autoSaveGroup());
+}
+
+void %{APPNAMELC}kmdi::newToolbarConfig()
+{
+ // This slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
+ // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
+ //createGUI();
+ //applyMainWindowSettings(KGlobal::config(), autoSaveGroup());
+}
+
+void %{APPNAMELC}kmdi::optionsPreferences()
+{
+ // The preference dialog is derived from prefs-base.ui which is subclassed into Prefs
+ //
+ // compare the names of the widgets in the .ui file
+ // to the names of the variables in the .kcfg file
+ if (KConfigDialog::showDialog("settings"))
+ return;
+
+ KConfigDialog *dialog = new KConfigDialog(this, "settings", Settings::self(), KDialogBase::Swallow);
+ dialog->addPage(new prefs(), i18n("General"), "package_settings");
+ connect(dialog, SIGNAL(settingsChanged()), this, SLOT(settingsChanged()));
+ dialog->show();
+}
+
+void %{APPNAMELC}kmdi::settingsChanged()
+{
+ // propagate the changes to our views
+ /*QValueList<%{APPNAMELC}kmdiView*>::iterator it = m_views.begin();
+ QValueList<%{APPNAMELC}kmdiView*>::iterator end = m_views.end();
+ for (; it != end; ++it)
+ {
+ %{APPNAMELC}kmdiView *view = *it;
+ view->settingsChanged();
+ }*/
+}
+
+void %{APPNAMELC}kmdi::changeStatusbar(const QString& text)
+{
+ // display the text on the statusbar
+ statusBar()->message(text, 2000);
+}
+
+void %{APPNAMELC}kmdi::dragEnterEvent(QDragEnterEvent *event)
+{
+ // accept uri drops only
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void %{APPNAMELC}kmdi::dropEvent(QDropEvent *event)
+{
+ KURL::List urls;
+
+ // see if we can decode a URI.. if not, just ignore it
+ if (KURLDrag::decode(event, urls) && !urls.isEmpty())
+ {
+ // okay, we have a URI.. process it
+ const KURL &url = urls.first();
+
+ // load in the file
+ openURL(url);
+ }
+}
+
+bool %{APPNAMELC}kmdi::queryClose()
+{
+ QValueList<%{APPNAMELC}kmdiView*>::iterator it;
+
+ // check if we can close all documents
+ for (it = m_views.begin(); it != m_views.end(); ++it)
+ {
+ // kdWarning()<<"searching for the part"<<endl;
+ %{APPNAMELC}kmdiView *view = *it;
+ if (!view->part()->queryClose())
+ {
+ return false;
+ }
+ }
+
+ // and now close the documents
+ for (it = m_views.begin(); it != m_views.end(); ++it)
+ {
+ // now close all views
+ %{APPNAMELC}kmdiView *view = *it;
+
+ m_manager->removePart( view->part() );
+ closeWindow( view );
+ }
+
+ return true;
+}
+
+#include "%{APPNAMELC}kmdi.moc"
diff --git a/languages/cpp/app_templates/kscons_kmdi/appkmdi.h b/languages/cpp/app_templates/kscons_kmdi/appkmdi.h
new file mode 100644
index 00000000..370a3034
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/appkmdi.h
@@ -0,0 +1,82 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}KMDI_H
+#define _%{APPNAMEUC}KMDI_H
+
+#include <qvaluelist.h>
+
+#include <kapplication.h>
+#include <kmdimainfrm.h>
+#include <kurl.h>
+
+class KToggleAction;
+class KRecentFilesAction;
+
+class kmdikonsole;
+class KMdiChildView;
+class QWidgetStack;
+class %{APPNAMELC}kmdiView;
+class TextProperties;
+class MiscProperties;
+
+/**
+ * This class serves as the main window for %{APPNAMELC}kmdi. It handles the
+ * menus, toolbars, and status bars.
+ *
+ * @short Main window class
+ */
+class %{APPNAMELC}kmdi : public KMdiMainFrm
+{
+ Q_OBJECT
+ public:
+ %{APPNAMELC}kmdi( KMdi::MdiMode mode );
+ virtual ~%{APPNAMELC}kmdi();
+ void showTipOnStart();
+
+ public slots:
+ void openURL( const KURL& );
+
+ protected:
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void dropEvent(QDropEvent *event);
+ virtual bool queryClose();
+
+ private slots:
+ void slotFileNew();
+ void slotFileClose();
+ void slotFileQuit();
+
+ /// this is called when a new file is saved
+ void showTip();
+
+ void optionsShowToolbar();
+ void optionsShowStatusbar();
+ void optionsConfigureKeys();
+ void optionsConfigureToolbars();
+ void optionsPreferences();
+ void newToolbarConfig();
+
+
+ void changeStatusbar(const QString& text);
+
+ void currentChanged( KMdiChildView *current );
+ bool requestClose(KMdiChildView* view);
+
+ void settingsChanged();
+
+ private:
+ void setupAccel();
+ void setupActions();
+
+ QValueList<%{APPNAMELC}kmdiView*> m_views;
+
+ KToggleAction *m_toolbarAction;
+ KToggleAction *m_statusbarAction;
+
+ KParts::PartManager *m_manager;
+
+ kmdikonsole *m_console;
+};
+
+#endif // _%{APPNAMEUC}KMDI_H
+
diff --git a/languages/cpp/app_templates/kscons_kmdi/appkmdiView.cpp b/languages/cpp/app_templates/kscons_kmdi/appkmdiView.cpp
new file mode 100644
index 00000000..c4cfbf65
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/appkmdiView.cpp
@@ -0,0 +1,63 @@
+%{CPP_TEMPLATE}
+
+#include <qpixmap.h>
+#include <qlayout.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmdichildview.h>
+#include <kdebug.h>
+#include <klibloader.h>
+#include <kmessagebox.h>
+
+#include "%{APPNAMELC}kmdiView.h"
+
+
+ %{APPNAMELC}kmdiView::%{APPNAMELC}kmdiView( QWidget *parentWidget, const char *name )
+: KMdiChildView( parentWidget, name )
+{
+ m_part = NULL;
+
+ // this routine will find and load our Part. it finds the Part by
+ // name which is a bad idea usually.. but it's alright in this
+ // case since our Part is made for this Shell
+ KLibFactory *factory = KLibLoader::self()->factory("lib%{APPNAMELC}part");
+ //KLibFactory *factory = KLibLoader::self()->factory("libkatepart");
+ if (factory)
+ {
+ // now that the Part is loaded, we cast it to a Part to get
+ // our hands on it
+ m_part = static_cast<KParts::ReadWritePart *>(factory->create(
+ this, "katepart", "KParts::ReadWritePart" ));
+
+ if (m_part)
+ {
+ part()->widget()->setFocus();
+ setFocusProxy(part()->widget());
+
+ QBoxLayout* layout = new QHBoxLayout(this, 0, -1, "kdissertviewlayout" );
+ part()->widget()->reparent( this, QPoint(0, 0) );
+ layout->addWidget( part()->widget() );
+
+ // connect( m_part, SIGNAL(stateChanged()), this, SLOT(updateCaption()) );
+ }
+ else
+ {
+ KMessageBox::error(this, i18n("Could not find our part."));
+ }
+ }
+ else
+ {
+ // if we couldn't find our Part, we exit since the Shell by
+ // itself can't do anything useful
+ KMessageBox::error(this, i18n("Could not find our part."));
+ return;
+ }
+}
+
+%{APPNAMELC}kmdiView::~%{APPNAMELC}kmdiView()
+{
+ delete m_part->widget();
+}
+
+#include "%{APPNAMELC}kmdiView.moc"
diff --git a/languages/cpp/app_templates/kscons_kmdi/appkmdiView.h b/languages/cpp/app_templates/kscons_kmdi/appkmdiView.h
new file mode 100644
index 00000000..66e5203b
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/appkmdiView.h
@@ -0,0 +1,29 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}KMDIVIEW_H
+#define _%{APPNAMEUC}KMDIVIEW_H
+
+#include <kparts/part.h>
+#include <kmdichildview.h>
+#include <kmdichildfrm.h>
+
+/**
+ * This class serves as the %{APPNAMELC}kmdi view.
+ *
+ * @short main view class
+ */
+class %{APPNAMELC}kmdiView : public KMdiChildView
+{
+ Q_OBJECT
+ public:
+ %{APPNAMELC}kmdiView( QWidget *parentWidget=0L, const char *name=0L );
+ virtual ~%{APPNAMELC}kmdiView();
+
+ KParts::ReadWritePart *part() { return m_part; }
+
+ private:
+ KParts::ReadWritePart *m_part;
+};
+
+#endif // _%{APPNAMEUC}KMDIVIEW_H
+
diff --git a/languages/cpp/app_templates/kscons_kmdi/kmdikonsole.cpp b/languages/cpp/app_templates/kscons_kmdi/kmdikonsole.cpp
new file mode 100644
index 00000000..da41685f
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/kmdikonsole.cpp
@@ -0,0 +1,76 @@
+%{CPP_TEMPLATE}
+
+#include <qfileinfo.h>
+#include <qframe.h>
+
+#include <kparts/part.h>
+#include <kate/document.h>
+#include <kate/view.h>
+#include <klocale.h>
+#include <klibloader.h>
+#include <kurl.h>
+
+#include "kmdikonsole.h"
+
+kmdikonsole::kmdikonsole(QWidget *parent, const char *name) : QVBox(parent, name)
+{
+ m_haskonsole = false;
+ respawn();
+}
+
+kmdikonsole::~kmdikonsole()
+{
+}
+
+void kmdikonsole::respawn()
+{
+ KLibFactory *factory = KLibLoader::self()->factory("libkonsolepart");
+
+ if (!factory) return;
+ m_part = (KParts::ReadOnlyPart *) factory->create(this);
+
+ if (!m_part) return;
+
+ if (m_part->widget()->inherits("QFrame"))
+ ((QFrame*)m_part->widget())->setFrameStyle(QFrame::Panel|QFrame::Sunken);
+
+ m_haskonsole=true;
+ connect( m_part, SIGNAL(destroyed()), this, SLOT(slotDestroyed()) );
+
+ m_part->widget()->show();
+ show();
+}
+
+void kmdikonsole::setDirectory(const QString &dirname)
+{
+ if (m_haskonsole)
+ {
+ KURL url(dirname);
+ if (m_part->url() != url)
+ m_part->openURL(url);
+ }
+}
+
+void kmdikonsole::showEvent(QShowEvent *ev)
+{
+ QWidget::showEvent(ev);
+ activate();
+}
+
+void kmdikonsole::activate()
+{
+ if (m_haskonsole)
+ {
+ m_part->widget()->show();
+ setFocusProxy(m_part->widget());
+ m_part->widget()->setFocus();
+ }
+}
+
+void kmdikonsole::slotDestroyed()
+{
+ m_haskonsole=false;
+ respawn();
+}
+
+#include "kmdikonsole.moc"
diff --git a/languages/cpp/app_templates/kscons_kmdi/kmdikonsole.h b/languages/cpp/app_templates/kscons_kmdi/kmdikonsole.h
new file mode 100644
index 00000000..83adb417
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/kmdikonsole.h
@@ -0,0 +1,32 @@
+%{H_TEMPLATE}
+
+#ifndef KMDIKONSOLE_H
+#define KMDIKONSOLE_H
+
+#include <qvbox.h>
+
+class kmdikonsole : public QVBox
+{
+ Q_OBJECT
+
+ public:
+ kmdikonsole( QWidget* parent, const char* name=0);
+ ~kmdikonsole();
+
+ public slots:
+ void setDirectory(const QString & dir);
+ void activate();
+
+ private slots:
+ void slotDestroyed();
+ void respawn();
+
+ protected:
+ void showEvent(QShowEvent *ev);
+
+ private:
+ KParts::ReadOnlyPart *m_part;
+ bool m_haskonsole;
+};
+
+#endif // KMDIKONSOLE_H
diff --git a/languages/cpp/app_templates/kscons_kmdi/kscons_kmdi.kdevtemplate b/languages/cpp/app_templates/kscons_kmdi/kscons_kmdi.kdevtemplate
new file mode 100644
index 00000000..4f0f8856
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/kscons_kmdi.kdevtemplate
@@ -0,0 +1,271 @@
+# KDE Config File
+[General]
+Name=Scons-based KMDI application
+Name[ca]=Aplicació per a KMDI basada en Scons
+Name[da]=Scons-baseret KMDI-program
+Name[de]=Auf Scons basierende KMDI-Anwendung
+Name[el]=Μια εφαÏμογή KMDI βασισμένης στο Scons
+Name[es]=Aplicación KMDI basada en Scons
+Name[et]=KMDI rakendus Sconsi põhjal
+Name[eu]=Scons-en oinarritutako KMDI aplikazioa
+Name[fa]=کاربرد KMDI بر مبنای Scons
+Name[fr]=Application KMDI basée sur Scons
+Name[ga]=Feidhmchlár KMDI bunaithe ar Scons
+Name[gl]=Aplicación KMDI baseada en Scons
+Name[hu]=Scons-alapú KMDI-alkalmazás
+Name[it]=Applicazione KMDI basata su scons
+Name[ja]=Scons ベース㮠KMDI アプリケーション
+Name[nds]=Op "scons" opbuut KMDI-Programm
+Name[ne]=सà¥à¤•à¥‹à¤¨-आधारित KMDI अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Scons gebaseerde KMDI-toepassing
+Name[pl]=Program KMDI wykorzystujÄ…cy Scons
+Name[pt]=Aplicação KMDI usando Scons
+Name[pt_BR]=Aplicação KMDI usando Scons
+Name[ru]=Многооконное приложение KDE на базе Scons
+Name[sk]=KMDI aplikácia založená na Scons
+Name[sr]=KMDI програм на оÑнову Scons-а
+Name[sr@Latn]=KMDI program na osnovu Scons-a
+Name[sv]=Scons-baserat KMDI-program
+Name[tr]=Scons tabanlı KMDI uygulaması
+Name[zh_CN]=基于 Scons çš„ KMDI 应用程åº
+Name[zh_TW]=Scons 為基礎的 KMDI 應用程å¼
+Category=C++/KDE
+Icon=kscons_kmdi.png
+Comment=Generates a complex KMDI application. Scons scripts are provided for compiling and installing the application.
+Comment[ca]=Genera una complexa aplicació per a KMDI. Els scripts en Scons són proveïts per a compilar i instal·lar l'aplicació.
+Comment[da]=Genererer et komplekst KDE-program. Der sørges for scons-scripter til at kompilere og installere programmet.
+Comment[de]=Erstellt eine aufwändige KMDI-Anwendung. Scons-Skripte zum Kompilieren und Installieren der Anwendung werden zur Verfügung gestellt.
+Comment[el]=ΔημιουÏγεί μια πολÏπλοκη εφαÏμογή KMDI. ΠÏοσφέÏονται σενάÏια Scons για τη μεταγλώττιση και εγκατάσταση της εφαÏμογής.
+Comment[es]=Genera una aplicación KMDI compleja. Se proporcionan guiones en Scons para compilar e instalar la aplicación.
+Comment[et]=Keerulise KMDI rakenduse loomine. Luuakse ka Sconsi skriptid rakenduse kompileerimiseks ja paigaldamiseks.
+Comment[eu]=KMDI aplikazio konplexu bat sortzen du. Aplikazioak konpilatu eta aplikazioa instalatzeko Scons script-ak sortzen ditu.
+Comment[fa]=یک کاربرد پیچیدۀ KMDI تولید می‌کند. دست‌نوشته‌های Scons برای ترجمه Ùˆ نصب کاربرد Ùراهم می‌شوند.
+Comment[fr]=Génère une application KMDI évoluée. Des scripts Scons sont fournis pour compiler et installer l'application.
+Comment[gl]=Xera unha aplicación complexa KMDI. Os scripts Scons proporciónanse para compilar e instalar a aplicación.
+Comment[hu]=Létrehoz egy komplex KMDI alkalmazást. Az alkalmazás lefordításához és telepítéséhez Scons-szkriptek állnak rendelkezésre.
+Comment[it]=Genera una applicazione KMDI complessa. Gli script scons sono forniti per compilare e istallare l'applicazione.
+Comment[nds]=Stellt en vigeliensch KMDI-Programm op. Stellt Scons-Skripten för't Kompileren un Installeren vun't Programm praat.
+Comment[ne]=जटिल KMDI अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । सà¥à¤•à¥‹à¤¨ सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤¹à¤°à¥‚ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ र कमà¥à¤ªà¤¾à¤‡à¤² गरà¥à¤¨à¤•à¤¾ लागि पà¥à¤°à¤¦à¤¾à¤¨ गरिनà¥à¤› ।
+Comment[nl]=Genereert een complexe KMDI-applicatie. Scons-scripts worden gebruikt voor compilatie en installatie.
+Comment[pl]=Generuje złożony program z powłoką KMDI. Do kompilacji i instalacji wykorzystywany jest skrypt Scons.
+Comment[pt]=Gera uma aplicação complexa com KMDI. Os ficheiros do Scons são fornecidos para compilar e instalar a aplicação.
+Comment[pt_BR]=Gera uma aplicação complexa com KMDI. Os ficheiros do Scons são fornecidos para compilar e instalar a aplicação.
+Comment[ru]=Создание полноценного многооконного Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE. Ð”Ð»Ñ Ñборки и уÑтановки Ñтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ иÑпользованы Ñкрипты Scons.
+Comment[sk]=Vygeneruje komplexnú KMDI aplikáciu. K dispozícii je Scons skriptna kompiláciu a inštaláciu aplikácie.
+Comment[sr]=Прави Ñложени KMDI програм. Дате Ñу Scons Ñкрипте за превођење и инÑталирање програма.
+Comment[sr@Latn]=Pravi složeni KMDI program. Date su Scons skripte za prevođenje i instaliranje programa.
+Comment[sv]=Skapar ett komplext KMDI-program. Scons-skript tillhandahålls för att kompilera och installera programmet.
+Comment[tr]=Karmaşık bir KMDI uygulaması yaratır. Uygulamayı derlemek ve kurmak için scons betikleri sağlanmıştır.
+Comment[zh_CN]=生æˆä¸€ä¸ªå¤æ‚çš„ KMDI 应用程åºã€‚此时会æä¾› Scons 脚本以供编译并安装应用程åºã€‚
+Comment[zh_TW]=產生一個複雜的 KMDI 應用程å¼ã€‚Scons 文稿是用於編譯與安è£æ‡‰ç”¨ç¨‹å¼ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/QUICKSTART
+Archive=kscons_kmdi.tar.gz
+
+[SCONS]
+Type=include
+File=%{kdevelop}/template-common/scons.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{src}/SConscript-doc
+Dest=%{dest}/doc/SConscript
+
+[FILE2]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE4]
+Type=install
+Source=%{src}/SConstruct
+Dest=%{dest}/SConstruct
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE10]
+Type=install
+Source=%{src}/SConscript-src
+Dest=%{dest}/src/SConscript
+
+[FILE11]
+Type=install
+Source=%{src}/appkmdi.cpp
+Dest=%{dest}/src/%{APPNAMELC}kmdi.cpp
+
+[FILE12]
+Type=install
+Source=%{src}/appkmdi.h
+Dest=%{dest}/src/%{APPNAMELC}kmdi.h
+
+[FILE13]
+Type=install
+EscapeXML=true
+Source=%{src}/prefs.ui
+Dest=%{dest}/src/prefs.ui
+
+[FILE14]
+Type=install
+Source=%{src}/appkmdiView.cpp
+Dest=%{dest}/src/%{APPNAMELC}kmdiView.cpp
+
+[FILE15]
+Type=install
+Source=%{src}/appkmdiView.h
+Dest=%{dest}/src/%{APPNAMELC}kmdiView.h
+
+[FILE19]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE20]
+Type=install
+EscapeXML=true
+Source=%{src}/app_shell.rc
+Dest=%{dest}/src/%{APPNAMELC}_shell.rc
+
+[FILE21]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/src/README
+
+[FILE22]
+Type=install
+Source=%{src}/app.kcfg
+Dest=%{dest}/src/%{APPNAMELC}.kcfg
+
+[FILE23]
+Type=install
+Source=%{src}/settings.kcfgc
+Dest=%{dest}/src/settings.kcfgc
+
+[FILE25]
+Type=install
+Source=%{src}/tips
+Dest=%{dest}/src/tips
+
+[FILE27]
+Type=install
+Source=%{src}/VERSION
+Dest=%{dest}/VERSION
+
+[FILE28]
+Type=install
+Source=%{src}/INSTALL
+Dest=%{dest}/INSTALL
+
+[FILE29]
+Type=install
+Source=%{src}/QUICKSTART
+Dest=%{dest}/QUICKSTART
+
+[FILE30]
+Type=install
+Source=%{src}/messages.sh
+Dest=%{dest}/po/messages.sh
+
+[FILE31]
+Type=install
+Source=%{src}/kmdikonsole.cpp
+Dest=%{dest}/src/kmdikonsole.cpp
+
+[FILE32]
+Type=install
+Source=%{src}/kmdikonsole.h
+Dest=%{dest}/src/kmdikonsole.h
+
+[FILE34]
+Type=install
+Source=%{src}/app_part.cpp
+Dest=%{dest}/src/%{APPNAMELC}_part.cpp
+
+[FILE35]
+Type=install
+Source=%{src}/app_part.h
+Dest=%{dest}/src/%{APPNAMELC}_part.h
+
+[FILE36]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE37]
+Type=install
+Source=%{kdevelop}/template-common/kde-part.desktop
+Dest=%{dest}/src/%{APPNAMELC}_part.desktop
+
+[FILE38]
+Type=install
+Source=%{src}/app_part.rc
+Dest=%{dest}/src/%{APPNAMELC}_part.rc
+
+[MSG]
+Type=message
+Comment=A KDE application with scons scripts was created in %{dest}
+Comment[ca]=Una aplicació per al KDE amb scripts en Scons ha estat creada e n %{dest}
+Comment[da]=Et KDE program med scons-scripter blev oprette i %{dest}
+Comment[de]=Eine KDE-Anwendung mit Scons-Skripten wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή KDE με σενάÏια scons δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación para KDE con guiones de Scons ha sido creada en %{dest}
+Comment[et]=KDE rakendus Sconsi skriptidega loodi asukohta %{dest}
+Comment[eu]=Scons script-dun KDE aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد KDE با دست‌نوشته‌های scons در %{dest} ایجاد شد
+Comment[fr]=Une application KDE comprenant des scripts Scons a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár KDE le scripteanna scons i %{dest}
+Comment[gl]=Creouse unha aplicación KDE con scripts scons en %{dest}
+Comment[hu]=Létrejött egy Scons-szkripteket használó KDE-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione KDE con gli script scons in %{dest}
+Comment[ja]=Scons スクリプトを使ã£ãŸ KDE アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KDE-Programm mit scons-Skripten opstellt
+Comment[ne]=सà¥à¤•à¥‹à¤¨ सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤¸à¤à¤— केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een KDE applicatie inclusief Scons-scripts is aangemaakt in %{dest}
+Comment[pl]=Program KDE ze skryptami scons utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do KDE com ficheiros do 'scons' em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do KDE com ficheiros do 'scons' em %{dest}
+Comment[ru]=Приложение KDE Ñо Ñкриптами Scons Ñоздано в %{dest}
+Comment[sk]=KDE aplikácia so scons skriptom bola vytvorená v %{dest}
+Comment[sr]=KDE програм Ñа scons Ñкриптама направљен је у %{dest}
+Comment[sr@Latn]=KDE program sa scons skriptama napravljen je u %{dest}
+Comment[sv]=Ett KDE-program med Scons-skript skapades i %{dest}
+Comment[tr]=Scons betikleri olan bir KDE uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了带 scons 脚本的 KDE 应用程åº
+Comment[zh_TW]=ä¸€å€‹å…§å« scons 文稿的 KDE 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kscons_kmdi/kscons_kmdi.png b/languages/cpp/app_templates/kscons_kmdi/kscons_kmdi.png
new file mode 100644
index 00000000..72a347ee
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/kscons_kmdi.png
Binary files differ
diff --git a/languages/cpp/app_templates/kscons_kmdi/main.cpp b/languages/cpp/app_templates/kscons_kmdi/main.cpp
new file mode 100644
index 00000000..7e43b0e7
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/main.cpp
@@ -0,0 +1,60 @@
+%{CPP_TEMPLATE}
+
+#include <kurl.h>
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+#include "%{APPNAMELC}kmdi.h"
+
+static const char description[] =
+I18N_NOOP("A simple kmdi app");
+
+static const char version[] = "0.0.1";
+
+static KCmdLineOptions options[] =
+{
+ { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", 0, 0, "%{EMAIL}" );
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+
+ // warning, utf-8 char
+ //about.addCredit( "bksys authors", "Thomas Nagy, Julien Antille" );
+
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions(options);
+
+ KApplication app;
+
+ // see if we are starting with session management
+ /*if (app.isRestored())
+ {
+ RESTORE((%{APPNAME});
+ } else */
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ %{APPNAMELC}kmdi *widget = new %{APPNAMELC}kmdi( KMdi::IDEAlMode );
+
+ if (args->count() != 0)
+ {
+ for (int i=0; i < args->count(); i++)
+ {
+ widget->openURL( args->url( i ) );
+ }
+ }
+ widget->show();
+ args->clear();
+ }
+
+ return app.exec();
+}
+
diff --git a/languages/cpp/app_templates/kscons_kmdi/messages.sh b/languages/cpp/app_templates/kscons_kmdi/messages.sh
new file mode 100755
index 00000000..a36f5c93
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/messages.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Inspired by Makefile.common from coolo
+# this script is used to update the .po files
+
+# To update the translations, you will need a specific gettext
+# patched for kde and a lot of patience, tenacity, luck, time ..
+
+
+# I guess one should only update the .po files when all .cpp files
+# are generated (after a make or scons)
+
+# If you have a better way to do this, do not keep that info
+# for yourself and help me to improve this script, thanks
+# (tnagyemail-mail tat yahoo d0tt fr)
+
+SRCDIR=../test1-kconfigxt # srcdir is the directory containing the source code
+TIPSDIR=$SRCDIR # tipsdir is the directory containing the tips
+
+KDEDIR=`kde-config --prefix`
+EXTRACTRC=extractrc
+KDEPOT=`kde-config --prefix`/include/kde.pot
+XGETTEXT="xgettext -C -ki18n -ktr2i18n -kI18N_NOOP -ktranslate -kaliasLocale -x $KDEPOT "
+
+## check that kde.pot is available
+if ! test -e $KDEPOT; then
+ echo "$KDEPOT does not exist, there is something wrong with your installation!"
+ XGETTEXT="xgettext -C -ki18n -ktr2i18n -kI18N_NOOP -ktranslate -kaliasLocale "
+fi
+
+> rc.cpp
+
+## extract the strings
+echo "extracting the strings"
+
+# process the .ui and .rc files
+$EXTRACTRC `find $SRCDIR -iname *.rc` >> rc.cpp
+$EXTRACTRC `find $SRCDIR -iname *.ui` >> rc.cpp
+echo -e 'i18n("_: NAME OF TRANSLATORS\\n"\n"Your names")\ni18n("_: EMAIL OF TRANSLATORS\\n"\n"Your emails")' > $SRCDIR/_translatorinfo.cpp
+
+# process the tips - $SRCDIR is supposed to be where the tips are living
+pushd $TIPSDIR; preparetips >tips.cpp; popd
+
+$XGETTEXT `find $SRCDIR -name "*.cpp"` -o kdissert.pot
+
+# remove the intermediate files
+rm -f $TIPSDIR/tips.cpp
+rm -f rc.cpp
+rm -f $SRCDIR/_translatorinfo.cpp
+
+## now merge the .po files ..
+echo "merging the .po files"
+
+for i in `ls *.po`; do
+ msgmerge $i kdissert.pot -o $i || exit 1
+done
+
+## finished
+echo "Done"
+
diff --git a/languages/cpp/app_templates/kscons_kmdi/prefs.ui b/languages/cpp/app_templates/kscons_kmdi/prefs.ui
new file mode 100644
index 00000000..5de638ef
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/prefs.ui
@@ -0,0 +1,30 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>prefs</class>
+<widget class="QWidget">
+<property name="name">
+<cstring>prefs</cstring>
+</property>
+<property name="geometry">
+<rect>
+<x>0</x>
+<y>0</y>
+<width>241</width>
+<height>47</height>
+</rect>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QCheckBox" row="0" column="0">
+<property name="name">
+<cstring>kcfg_showCloseTabsButton</cstring>
+</property>
+<property name="text">
+<string>Show close buttons on the right of tabs</string>
+</property>
+</widget>
+</grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kscons_kmdi/settings.kcfgc b/languages/cpp/app_templates/kscons_kmdi/settings.kcfgc
new file mode 100644
index 00000000..384510cd
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/settings.kcfgc
@@ -0,0 +1,6 @@
+# Code generation options for kconfig_compiler
+File=%{APPNAMELC}.kcfg
+ClassName=Settings
+Singleton=true
+Mutators=col_background,col_foreground
+# will create the necessary code for setting those variables
diff --git a/languages/cpp/app_templates/kscons_kmdi/tips b/languages/cpp/app_templates/kscons_kmdi/tips
new file mode 100644
index 00000000..56f29469
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kmdi/tips
@@ -0,0 +1,6 @@
+<tip category="help">
+<html>
+<p>... that automake was not involved in building this kde application ?</p>
+<p>The kdevelop template &quot;kscons_kxt&quot; was used instead.</p>
+</html>
+</tip>
diff --git a/languages/cpp/app_templates/kscons_kxt/INSTALL b/languages/cpp/app_templates/kscons_kxt/INSTALL
new file mode 100644
index 00000000..edeed594
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/INSTALL
@@ -0,0 +1,83 @@
+REQUIREMENTS
+------------
+
+* KDE headers & libraries for kdelibs
+* A Python interpreter for the compilation
+
+scons v0.96.1 or newer is recommended, but it's not required since a
+minimum scons distribution is included in the package.
+
+BUILDING AND INSTALLING
+-----------------------
+
+For configuring, compiling and installing the application and
+if you do have Scons 0.96.1 or newer installed, just run:
+
+$ scons
+$ scons install (as root user)
+
+In case you don't have Scons installed, you can use
+the accompanying minimum scons by running:
+
+$ tar xjvf admin/scons-mini.tar.bz2
+$ ./scons
+$ ./scons install
+
+ADVANCED BUILD FEATURES & DEINSTALLING
+--------------------------------------
+
+In case you want to execute many compilation jobs in parallel (because you
+want to make use of a SMP system or a compile cluster, for instance),
+you can use ('N' is the number of jobs which should be run in parallel):
+
+$ scons -jN
+
+A debug build of the program can be created by running:
+
+$ scons configure debug=1
+$ scons
+
+Finally, the software can be removed from your system by running
+
+$ scons -c install
+
+CONFIGURATION NOTES
+-------------------
+
+The installation scripts are relying on the kde-config program.
+The programs kde-config, qmake, uic and moc must be accesssible
+through your PATH.
+
+Qt and kde may not be installed as expected (in QTDIR and KDEDIR)
+So until kde-config is able to give that information, you may
+have to give those paths. You may also want to tune the build.
+
+In these cases, you must first run "scons configure" with some options
+before running "scons" and "scons install"
+
+Here are some examples :
+On Fedora/Redhat
+$ scons configure kdeincludes=/usr/include/kde/
+On Debian
+$ scons configure qtincludes=/usr/include/qt/ kdeinclude=/usr/include/kde/
+To install in some particular location with additional include paths
+$ scons configure prefix=~/tmp extraincludes=/tmp/include:/usr/local/include
+For AMD64 and platforms where folders are like /usr/lib64
+$ scons configure libsuffix=64
+
+For more options, run
+scons --help
+
+The build system is based on bksys, a build system that replaces
+autoconf, automake and make in a row. Feel free to report your opinion
+about it to the bksys authors.
+
+PACKAGE CREATION
+----------------
+
+RPM packagers can use the DESTDIR environment variable
+$ DESTDIR=/tmp/build-rpm/ scons install
+
+To use checkinstall, pass the following option
+$ checkinstall --fstrans=no --nodoc scons install
+
diff --git a/languages/cpp/app_templates/kscons_kxt/Makefile.am b/languages/cpp/app_templates/kscons_kxt/Makefile.am
new file mode 100644
index 00000000..8cce001c
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/Makefile.am
@@ -0,0 +1,21 @@
+dataFiles = app.cpp app.h main.cpp appui.rc app.kdevelop \
+appview.h appview.cpp appview_base.ui prefs-base.ui \
+prefs.cpp prefs.h app.kcfg settings.kcfgc messages.sh \
+SConstruct SConscript-doc SConscript-src tips VERSION \
+QUICKSTART INSTALL README
+
+templateName= kscons_kxt
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles} ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/kscons_kxt/QUICKSTART b/languages/cpp/app_templates/kscons_kxt/QUICKSTART
new file mode 100644
index 00000000..ceaf1bda
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/QUICKSTART
@@ -0,0 +1,164 @@
+------------------------------------------
+SUMMARY :
+
+scons
+scons install
+
+
+The online documentation of bksys can be found at:
+http://freehackers.org/~tnagy/bksys_manual.html
+
+ ... and now for the quickstart:
+
+CONFIGURING AND COMPILING THE PROJECT(S)
+SCONS TIPS
+MOC PROCESSING
+SCONS MINIMUM DISTRIBUTION
+MORE TIPS
+
+------------------------------------------
+CONFIGURING AND COMPILING THE PROJECT(S)
+
+The program scons is usually launched as "scons"
+When it is not intalled globally, one can run
+"./scons" instead of "scons" (ie : to use the local scons
+that comes with bksys - see below SCONS MINIMUM DISTRIBUTION
+if you do not have scons already)
+
+To compile the project, you will then only need to launch
+scons on the top-level directory, the scripts find and
+cache the environment detected *automatically* :
+-> scons
+
+To clean the project -> scons -c
+
+To install the project -> scons install
+To install as root user -> su -c 'scons install'
+To uninstall the project -> scons -c install
+To uninstall (as root) -> su -c 'scons -c install'
+To consult the help -> scons -h
+
+To (re)configure the project and give particular arguments, use :
+ -> scons configure debug=1
+
+The variables are saved automatically after the first run
+in files named *.cache.py (look at kde.cache.py, ..)
+
+------------------------------------------
+SCONS TIPS
+
+In a subdirectory, it is necessary to launch scons with the -u flag :
+scons -u
+
+This is annoying and you probably want to add this to your .bashrc
+export SCONSFLAGS=-u
+and forget about it :)
+
+To make .deb or .rpm packages of your program, use :
+checkinstall --fstrans=no --nodoc scons install
+(if you have checkinstall on your system of course)
+
+To make scons run (much) faster, consult ./addons/README in bksys
+
+------------------------------------------
+MOC PROCESSING
+
+In qt programs, when a header 'foo.h' contains a class that has
+signals and slots, then 'foo.h' must contain the macro Q_OBJECT
+in order to compile. foo_moc.cpp is usually generated, and is
+used to produce foo_moc.o which is linked with the
+program or the library.
+
+In kde programs, 'foo.moc' is generated instead of foo_moc.cpp,
+and it must be included at the very end of foo.cpp
+(add #include "foo.moc" : this increases the speed of
+compilation a *lot* and makes less object files.
+
+Both modes are provided though, see test6-mocfiesta/
+
+------------------------------------------
+MINIMUM SCONS DISTRIBUTION
+
+A minimum scons distribution is included in the archive
+for convenience to those who do not have scons packages
+for their operating system or their linux
+distribution. For a full and more recent version of scons,
+please consult http://www.scons.org
+
+Including this scons distribution to your archive will add
+about 63kb (compressed) , while including the necessary
+kdescripts (admin/ directory, configure, autom4 cache stuff,
+Makefile.in) can add easily 500kb (compressed).
+
+To compile with the scons distribution :
+* unpack it with :
+ tar xjvf admin/scons-mini.tar.bz2
+* compile the program with :
+ ./scons (instead of just 'scons')
+* install the program with :
+ ./scons install (instead of just 'scons install')
+
+More options :
+* clean the object files with :
+ ./scons -c
+* uninstall the program with with :
+ ./scons -c install
+* create a package :
+ ./scons dist
+
+------------------------------------------
+MORE TIPS
+
+** static libraries **
+With Makefile.am, one had to make static libraries all the time
+because it did not allow having source code in other directories.
+This is not the case anymore with scons, so you can specify
+sources in other directories relative to the sconscript file, ie:
+ test1_sources = ['mainfiles/main.cpp', 'otherfile/program.cpp']
+ myenv.Program( target = "test1", source = test1_sources )
+To encourage you to switch to the new scheme, the static library
+helper has been omitted (look at the end of kde.py if you need one)
+
+** libtool **
+The LaFile build tool is a cheat that allows klibloader to load
+.so files without complaints. If you need real libtool support
+you can have a look to the libtool directory : it can work but
+remember that libtool is broken on many systems (invalid flags
+among others), so when you can work without libtool
+(small projects especially), just do it.
+
+** moc processing **
+As stated above, you should always add #include "foo.moc"
+for your qt classes (Q_OBJECT) to save precious compilation time.
+
+** using a cache **
+It is a good idea to enable the cache feature in SConstruct,
+especially if you are doing experiments (it saves your computer
+from recompiling the same files over and over again ..).
+
+** threading **
+myenv.AppendUnique( CPPFLAGS = ['-DQT_THREAD_SUPPORT', '-D_REENTRANT'] )
+
+** final notes ***
+A medium-sized project containing several targets, libraries and data
+files can be converted very quickly.
+Also, remember that SConscript files are actually python scripts ..
+you can use whatever python feature you want in them, ie: "for" loops,
+this is how the kde helpers work (KDEprogram, KDEshlib ..).
+
+If you are stuck, you can also have a look at more complicated
+bksys-based projects like kdissert or kshaderdesigner
+
+The scons man page and the wiki can be very useful, do not forget to
+consult them when you encounter an issue
+
+------------------------------------------
+
+I hope you will enjoy this alternative to the autotools
+scripts for kde programming, at least as much as I do :
+http://freehackers.org/~tnagy/kdissert/index.html
+
+Happy kde hacking,
+
+Thomas Nagy, 2004, 2005 <tnagyemail-mail@yahoo^fr>
+
diff --git a/languages/cpp/app_templates/kscons_kxt/README b/languages/cpp/app_templates/kscons_kxt/README
new file mode 100644
index 00000000..8085c7e7
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/README
@@ -0,0 +1,111 @@
+-----------------------------------------------
+Kde scons template quickstart
+Author: Thomas Nagy
+Date: 2005-04-04
+-----------------------------------------------
+
+This README file explains basic concepts necessary
+for starting with this application template.
+
+
+** Building and installing **
+
+* To configure the application run "scons configure"
+ In some rare cases you may need to add flags:
+ scons configure qtincludes=/usr/include/qt3/include kdeincludes=/usr/lib/kde3/include
+
+* After building, launch the application and test the dcop
+ interface by using the command (search a bit) :
+ dcop
+ dcop appname-...
+ dcop appname-... instancenumber
+ dcop appname-... instancenumber switch_colors
+ dcop appname switch_colors
+ Or launch kdcop and search in the menus for your program
+ name and double-click on 'switch_colors()'
+
+* The usual targets call the following scons commands :
+ make -> scons
+ make clean -> scons -c
+ make install -> scons install
+ make uninstall -> scons -c install
+ make dist -> scons dist
+
+* To build apps, use KDEprogram, KDEshlib, etc.
+ these functions are documented at the bottom of kde.py
+ More information can be found in the QUICKSTART
+
+* The scons scripts for building kde applications originate
+ from the 'bksys' distribution. It contains several other examples
+ that detail the kpart building and the dcop interface
+ processing :
+ http://www.kde-apps.org/content/show.php?content=19243
+
+* Extending the scons scripts for building the application :
+ The scons scripts are actually python scripts, so all the
+ usual tricks apply : 'for' and 'while' loops, 'if', 'else' ..
+ consult :
+ http://www.python.org for more information about python
+ http://www.scons.org for more informationabout scons
+
+* Simplify your life : install the project in your home directory for
+testing purposes.
+scons configure prefix=/home/user/dummyfolder/
+In the end when you finished the development you can
+rm -rf /home/user/dummyfolder/
+without fear.
+
+
+** Technologies **
+
+* Build the menus of your application easily
+kde applications now use an xml file (*ui.rc file) to build the menus.
+This allow a great customization of the application. However, when
+programming the menu is shown only after a "make install"
+
+For more details, consult :
+http://devel-home.kde.org/~larrosa/tutorial/p9.html
+http://developer.kde.org/documentation/tutorials/xmlui/preface.html
+
+* Use KConfig XT to create your configuration dialogs and make
+them more maintainable.
+
+For that, you will need to write two simple configuration files
+in the src directory : <myproject>.kcfg and a <settings>.kcfgc
+The configure.in.in will need to be modified : change the line #MIN_CONFIG(3.0.0)
+into #MIN_CONFIG(3.2.0)
+
+Take an example on the many apps found in the kdegames source package and consult :
+http://developer.kde.org/documentation/tutorials/kconfigxt/kconfigxt.html
+
+* With KParts, you can embed other kde components in your program, or make your program
+embeddable in other apps. For example, the kmplayer kpart can be called to play videos
+in your app.
+
+For more details, consult :
+http://www-106.ibm.com/developerworks/library/l-kparts/
+http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html
+
+* With dcop, you can control your app from other applications
+Make sure to include K_DCOP and a kdcop: section in your .h file
+http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html
+
+
+** Documentation **
+
+* For the translations :
+refer to the file po/SConscript and po/messages.sh
+
+1. Download a patched gettext which can be found at:
+ http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/
+2. Install that gettext in ~/bin/
+3. cd ~/yourproject, export PATH=~/bin:$PATH, export
+KDEDIR=/where_your_KDE3_is
+4. make -f admin/Makefile.common package-messages
+5. make package-messages
+6. Translate the po files (not the pot!!) with kbabel or xemacs
+
+* Do not forget to write the documentation for your kde app
+edit the documentation template index.docbook in doc/
+
diff --git a/languages/cpp/app_templates/kscons_kxt/SConscript-doc b/languages/cpp/app_templates/kscons_kxt/SConscript-doc
new file mode 100644
index 00000000..6769a359
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/SConscript-doc
@@ -0,0 +1,92 @@
+#! /usr/bin/env python
+## This script demonstrates to build and install
+## the documentation of a kde program with scons
+##
+## Thomas Nagy, 2005
+
+## This file can be reused freely for any project (see COPYING)
+
+## First load the environment set in the top-level SConstruct file
+Import( 'env' )
+myenv=env.Copy()
+
+## The following looks complicated but it is not
+## We first define a function to install all files as documentation
+## The documentation is of course lying in subfolders from here
+## * normal files are installed under KDEDOC/destination
+## * meinproc files are not installed, but processed into a single
+## index.cache.bz2 which is installed afterwards
+
+## This is far more maintainable to have *one* file than
+## having lots of almost empty SConscript in several folders
+
+###################################################################
+# COMMON PART FOR PROCESSING DOCUMENTATION FOLDERS
+###################################################################
+
+import os
+import sys
+import glob
+import SCons.Util
+
+## Define this to 1 if you are writing documentation else to 0 :)
+i_am_a_documentation_writer = 0
+
+## This function uses env imported above
+def processfolder(folder, lang, destination=""):
+ # folder is the folder to process
+ # lang is the language
+ # destination is the subdirectory in KDEDOC
+
+ docfiles = glob.glob(folder+"/???*.*") # file files that are at least 4 chars wide :)
+
+ # warn about errors
+ #if len(lang) != 2:
+ # print "error, lang must be a two-letter string, like 'en'"
+
+ # when the destination is not given, use the folder
+ if len(destination) == 0:
+ destination=folder
+
+ docbook_list = []
+ for file in docfiles:
+
+ # do not process folders
+ if not os.path.isfile(file):
+ continue
+ # do not process the cache file
+ if file == 'index.cache.bz2':
+ continue
+ # ignore invalid files (TODO??)
+ if len( SCons.Util.splitext( file ) ) <= 1 :
+ continue
+
+ ext = SCons.Util.splitext( file )[1]
+
+ # docbook files are processed by meinproc
+ if ext == '.docbook':
+ docbook_list.append( file )
+ continue
+
+ myenv.KDEinstall('KDEDOC', lang+'/'+destination, file)
+
+ # Now process the index.docbook files ..
+ if len(docbook_list) == 0:
+ return
+ if not os.path.isfile( folder+'/index.docbook' ):
+ print "Error, index.docbook was not found in "+folder+'/index.docbook'
+ return
+ if i_am_a_documentation_writer:
+ for file in docbook_list:
+ myenv.Depends( folder+'index.cache.bz2', file )
+ myenv.Meinproc( folder+'/index.cache.bz2', folder+'/index.docbook' )
+ myenv.KDEinstall( 'KDEDOC', lang+'/'+destination, folder+'/index.cache.bz2' )
+
+###################################################################
+# TELL WHICH FOLDERS TO PROCESS
+###################################################################
+
+## Use processfolder for each documentation directory
+processfolder('en/', 'en', '%{APPNAMELC}')
+processfolder('fr/', 'fr', '%{APPNAMELC}')
+
diff --git a/languages/cpp/app_templates/kscons_kxt/SConscript-src b/languages/cpp/app_templates/kscons_kxt/SConscript-src
new file mode 100644
index 00000000..02432be5
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/SConscript-src
@@ -0,0 +1,72 @@
+#! /usr/bin/env python
+# SConscript for %{APPNAMELC} compilation and installation
+
+############################
+## Configuration
+
+## use the environment set in the top-level
+## SConstruct file
+
+Import('env')
+myenv=env.Copy()
+
+#############################
+## Programs to build
+
+%{APPNAMELC}_sources="""
+settings.kcfgc
+main.cpp
+prefs.cpp
+%{APPNAMELC}.skel
+%{APPNAMELC}.cpp
+%{APPNAMELC}view.cpp
+prefs-base.ui
+%{APPNAMELC}view_base.ui
+"""
+
+# Our main program
+# KDEprogram add the file to the install targets automatically,
+# so you do not need to write myenv.KDEinstall( env['KDEBIN'], %{APPNAMELC})
+myenv.KDEprogram( "%{APPNAMELC}", %{APPNAMELC}_sources )
+
+############################
+## Customization
+
+## Additional include paths for compiling the source files
+## Always add '../' (top-level directory) because moc makes code that needs it
+myenv.KDEaddpaths_includes( "./ ../" )
+
+## Necessary libraries to link against
+myenv.KDEaddlibs( "qt-mt kio kdecore kdeprint" )
+
+## This shows how to add other link flags to the program
+# myenv.KDEaddflags_link('-export-dynamic')
+
+## If you are using QThread, add this line
+# myenv.KDEaddflags_link( '-DQT_THREAD_SUPPORT' )
+
+#############################
+## Installation
+
+## NOTE 1: The program is installed automatically
+## NOTE 2: KDEinstall( resource_type, subdirectory, list_of_files )
+
+## The ui.rc file and the tips go into datadir/appname/
+myenv.KDEinstall( 'KDEDATA', '/%{APPNAMELC}', '%{APPNAMELC}ui.rc' )
+myenv.KDEinstall( 'KDEDATA', '/%{APPNAMELC}', 'tips' )
+
+## The kcfg file is installed in a global kcfg directory
+myenv.KDEinstall( 'KDEKCFG', '', '%{APPNAMELC}.kcfg' )
+
+## Warning : there is a difference between the normal destop file used for the menu
+## and the servicetype desktop file, so they go in different directories
+myenv.KDEinstall( 'KDEMENU', 'Utilities/', '%{APPNAMELC}.desktop' )
+
+## Use this when you need to install a mimetype file
+#myenv.KDEinstall( 'KDEMIME', 'application', 'x-%{APPNAMELC}.desktop' )
+
+## Installing icons is easy (hi-16-app-%{APPNAMELC}.png, hi-22-app-%{APPNAMELC}.png)
+#myenv.KDEicon()
+
+## do not forget that this is a python script so even loops are allowed... :)
+
diff --git a/languages/cpp/app_templates/kscons_kxt/SConstruct b/languages/cpp/app_templates/kscons_kxt/SConstruct
new file mode 100644
index 00000000..b82de4e1
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/SConstruct
@@ -0,0 +1,112 @@
+#! /usr/bin/env python
+
+"""
+help -> scons -h
+compile -> scons
+clean -> scons -c
+install -> scons install
+uninstall -> scons -c install
+configure -> scons configure prefix=/tmp/ita debug=full extraincludes=/usr/local/include:/tmp/include prefix=/usr/local
+
+Run from a subdirectory -> scons -u
+The variables are saved automatically after the first run (look at cache/kde.cache.py, ..)
+"""
+
+###################################################################
+# LOAD THE ENVIRONMENT AND SET UP THE TOOLS
+###################################################################
+
+## Load the builders in config
+env = Environment( tools=['default', 'generic', 'kde'], toolpath=['./', './admin'])
+#env = Environment( tools=['default', 'generic', 'kde', 'othertool'], toolpath=['./', './admin'])
+
+env.KDEuse("environ rpath")
+#env.KDEuse("environ rpath lang_qt thread nohelp")
+
+###################################################################
+# SCRIPTS FOR BUILDING THE TARGETS
+###################################################################
+
+dirs="""
+src
+doc
+"""
+env.subdirs(dirs)
+
+## Process the translations in the po/ directory
+env.KDElang('po/', '%{APPNAMELC}')
+
+###################################################################
+# CONVENIENCE FUNCTIONS TO EMULATE 'make dist' and 'make distclean'
+###################################################################
+
+### To make a tarball of your masterpiece, use 'scons dist'
+if 'dist' in COMMAND_LINE_TARGETS:
+
+ ## The target scons dist requires the python module shutil which is in 2.3
+ env.EnsurePythonVersion(2, 3)
+
+ import os
+ APPNAME = 'bksys'
+ VERSION = os.popen("cat VERSION").read().rstrip()
+ FOLDER = APPNAME+'-'+VERSION
+ ARCHIVE = FOLDER+'.tar.bz2'
+
+ ## If your app name and version number are defined in 'version.h', use this instead:
+ ## (contributed by Dennis Schridde devurandom@gmx@net)
+ #import re
+ #INFO = dict( re.findall( '(?m)^#define\s+(\w+)\s+(.*)(?<=\S)', open(r"version.h","rb").read() ) )
+ #APPNAME = INFO['APPNAME']
+ #VERSION = INFO['VERSION']
+
+ import shutil
+ import glob
+
+ ## check if the temporary directory already exists
+ if os.path.isdir(FOLDER):
+ shutil.rmtree(FOLDER)
+ if os.path.isfile(ARCHIVE):
+ os.remove(ARCHIVE)
+
+ ## create a temporary directory
+ startdir = os.getcwd()
+ shutil.copytree(startdir, FOLDER)
+
+ ## remove our object files first
+ os.popen("find "+FOLDER+" -name \"*cache*\" | xargs rm -rf")
+ os.popen("find "+FOLDER+" -name \"*.pyc\" | xargs rm -f")
+ #os.popen("pushd %s && scons -c " % FOLDER) # TODO
+
+ ## CVS cleanup
+ os.popen("find "+FOLDER+" -name \"CVS\" | xargs rm -rf")
+ os.popen("find "+FOLDER+" -name \".cvsignore\" | xargs rm -rf")
+
+ ## Subversion cleanup
+ os.popen("find %s -name .svn -type d | xargs rm -rf" % FOLDER)
+
+ ## GNU Arch cleanup
+ os.popen("find "+FOLDER+" -name \"{arch}\" | xargs rm -rf")
+ os.popen("find "+FOLDER+" -name \".arch-i*\" | xargs rm -rf")
+
+ ## Create the tarball (coloured output)
+ print "\033[92m"+"Writing archive "+ARCHIVE+"\033[0m"
+ os.popen("tar cjf "+ARCHIVE+" "+FOLDER)
+
+ ## Remove the temporary directory
+ if os.path.isdir(FOLDER):
+ shutil.rmtree(FOLDER)
+
+ env.Default(None)
+ env.Exit(0)
+
+### Emulate "make distclean"
+if 'distclean' in COMMAND_LINE_TARGETS:
+ ## Remove the cache directory
+ import os, shutil
+ if os.path.isdir(env['CACHEDIR']):
+ shutil.rmtree(env['CACHEDIR'])
+ os.popen("find . -name \"*.pyc\" | xargs rm -rf")
+
+ env.Default(None)
+ env.Exit(0)
+
diff --git a/languages/cpp/app_templates/kscons_kxt/VERSION b/languages/cpp/app_templates/kscons_kxt/VERSION
new file mode 100644
index 00000000..2e293c30
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/VERSION
@@ -0,0 +1 @@
+%{VERSION}
diff --git a/languages/cpp/app_templates/kscons_kxt/app.cpp b/languages/cpp/app_templates/kscons_kxt/app.cpp
new file mode 100644
index 00000000..bc343554
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/app.cpp
@@ -0,0 +1,177 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include "settings.h"
+#include "prefs.h"
+
+#include <qdragobject.h>
+#include <kprinter.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+
+#include <kconfigdialog.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kdeversion.h>
+#include <kmenubar.h>
+#include <kstatusbar.h>
+#include <kkeydialog.h>
+#include <ktip.h>
+
+#include <kedittoolbar.h>
+
+#include <kstdaccel.h>
+#include <kaction.h>
+#include <kstdaction.h>
+
+%{APPNAME}::%{APPNAME}()
+ : KMainWindow( 0, "%{APPNAME}" ),
+ m_view(new %{APPNAME}View(this)),
+ m_printer(0)
+{
+ // accept dnd
+ setAcceptDrops(true);
+
+ // tell the KMainWindow that this is indeed the main widget
+ setCentralWidget(m_view);
+
+ // then, setup our actions
+ setupActions();
+
+ // and a status bar
+ statusBar()->show();
+
+ // apply the saved mainwindow settings, if any, and ask the mainwindow
+ // to automatically save settings if changed: window size, toolbar
+ // position, icon size, etc.
+ setAutoSaveSettings();
+
+ // allow the view to change the statusbar and caption
+ connect(m_view, SIGNAL(signalChangeStatusbar(const QString&)),
+ this, SLOT(changeStatusbar(const QString&)));
+ connect(m_view, SIGNAL(signalChangeCaption(const QString&)),
+ this, SLOT(changeCaption(const QString&)));
+
+ showTipOnStart();
+}
+
+%{APPNAME}::~%{APPNAME}()
+{
+}
+
+void %{APPNAME}::setupActions()
+{
+ KStdAction::openNew(this, SLOT(fileNew()), actionCollection());
+ KStdAction::quit(kapp, SLOT(quit()), actionCollection());
+
+ m_toolbarAction = KStdAction::showToolbar(this, SLOT(optionsShowToolbar()), actionCollection());
+ m_statusbarAction = KStdAction::showStatusbar(this, SLOT(optionsShowStatusbar()), actionCollection());
+
+ KStdAction::tipOfDay( this, SLOT( showTip() ), actionCollection()
+ )->setWhatsThis(i18n("This shows useful tips on the use of this application."));
+
+ KStdAction::keyBindings(this, SLOT(optionsConfigureKeys()), actionCollection());
+ KStdAction::configureToolbars(this, SLOT(optionsConfigureToolbars()), actionCollection());
+ KStdAction::preferences(this, SLOT(optionsPreferences()), actionCollection());
+
+ // custom menu and menu item - the slot is in the class %{APPNAME}View
+ KAction *custom = new KAction(i18n("Swi&tch Colors"), 0,
+ m_view, SLOT(switchColors()),
+ actionCollection(), "switch_action");
+
+ createGUI();
+}
+
+void %{APPNAME}::fileNew()
+{
+ // this slot is called whenever the File->New menu is selected,
+ // the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ // button is clicked
+
+ // create a new window
+ (new %{APPNAME})->show();
+}
+
+void %{APPNAME}::optionsShowToolbar()
+{
+ // this is all very cut and paste code for showing/hiding the
+ // toolbar
+ if (m_toolbarAction->isChecked())
+ toolBar()->show();
+ else
+ toolBar()->hide();
+}
+
+void %{APPNAME}::optionsShowStatusbar()
+{
+ // show/hide the statusbar
+ if (m_statusbarAction->isChecked())
+ statusBar()->show();
+ else
+ statusBar()->hide();
+}
+
+void %{APPNAME}::optionsConfigureKeys()
+{
+ KKeyDialog::configure(actionCollection());
+}
+
+void %{APPNAME}::optionsConfigureToolbars()
+{
+ // use the standard toolbar editor
+ saveMainWindowSettings(KGlobal::config(), autoSaveGroup());
+}
+
+void %{APPNAME}::newToolbarConfig()
+{
+ // this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
+ // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
+ createGUI();
+
+ applyMainWindowSettings(KGlobal::config(), autoSaveGroup());
+}
+
+void %{APPNAME}::optionsPreferences()
+{
+ // The preference dialog is derived from prefs-base.ui which is subclassed into Prefs
+ //
+ // compare the names of the widgets in the .ui file
+ // to the names of the variables in the .kcfg file
+ KConfigDialog *dialog = new KConfigDialog(this, "settings", Settings::self(), KDialogBase::Swallow);
+ dialog->addPage(new Prefs(), i18n("General"), "package_settings");
+ connect(dialog, SIGNAL(settingsChanged()), m_view, SLOT(settingsChanged()));
+ dialog->show();
+}
+
+void %{APPNAME}::changeStatusbar(const QString& text)
+{
+ // display the text on the statusbar
+ statusBar()->message(text, 2000);
+}
+
+void %{APPNAME}::changeCaption(const QString& text)
+{
+ // display the text on the caption
+ setCaption(text);
+}
+
+void %{APPNAME}::showTip()
+{
+ KTipDialog::showTip(this,QString::null,true);
+}
+
+void %{APPNAME}::showTipOnStart()
+{
+ KTipDialog::showTip(this);
+}
+
+void %{APPNAME}::switch_colors()
+{
+ if (!m_view)
+ return;
+ m_view->switchColors();
+}
+
+#include "%{APPNAMELC}.moc"
+
diff --git a/languages/cpp/app_templates/kscons_kxt/app.h b/languages/cpp/app_templates/kscons_kxt/app.h
new file mode 100644
index 00000000..4f855793
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/app.h
@@ -0,0 +1,73 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <dcopobject.h>
+#include <kapplication.h>
+#include <kmainwindow.h>
+
+#include "%{APPNAMELC}view.h"
+
+class KPrinter;
+class KToggleAction;
+class KURL;
+
+/**
+ * This class serves as the main window for %{APPNAME}. It handles the
+ * menus, toolbars, and status bars.
+ *
+ * @short Main window class
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAME} : public KMainWindow, public DCOPObject
+{
+ K_DCOP
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ %{APPNAME}();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~%{APPNAME}();
+
+k_dcop:
+ virtual void switch_colors();
+
+private slots:
+ void fileNew();
+ void optionsShowToolbar();
+ void optionsShowStatusbar();
+ void optionsConfigureKeys();
+ void optionsConfigureToolbars();
+ void optionsPreferences();
+ void newToolbarConfig();
+ void showTip();
+
+ void changeStatusbar(const QString& text);
+ void changeCaption(const QString& text);
+
+private:
+ void setupAccel();
+ void setupActions();
+ void showTipOnStart();
+
+private:
+ %{APPNAME}View *m_view;
+
+ KPrinter *m_printer;
+ KToggleAction *m_toolbarAction;
+ KToggleAction *m_statusbarAction;
+};
+
+#endif // _%{APPNAMEUC}_H_
+
diff --git a/languages/cpp/app_templates/kscons_kxt/app.kcfg b/languages/cpp/app_templates/kscons_kxt/app.kcfg
new file mode 100644
index 00000000..d5325b92
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/app.kcfg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="%{APPNAME}rc"/>
+ <group name="Preferences">
+ <entry name="col_background" type="Color">
+ <label>color of the background</label>
+ <default>black</default>
+ </entry>
+ <entry name="col_foreground" type="Color">
+ <label>color of the foreground</label>
+ <default>yellow</default>
+ </entry>
+ <entry name="val_time" type="Int">
+ <label>size of a ball</label>
+ <default>2</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/languages/cpp/app_templates/kscons_kxt/app.kdevelop b/languages/cpp/app_templates/kscons_kxt/app.kdevelop
new file mode 100644
index 00000000..e6a14fff
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/app.kdevelop
@@ -0,0 +1,169 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <ignoreparts/>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>false</terminal>
+ </run>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ </make>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs/>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ <runappinappdirectory>true</runappinappdirectory>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions/>
+ <updateoptions>-dP</updateoptions>
+ <addoptions/>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions/>
+ <rshoptions/>
+ </kdevcvs>
+ <cppsupportpart>
+ <codecompletion/>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL/>
+ <implementationURL/>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kscons_kxt/appui.rc b/languages/cpp/app_templates/kscons_kxt/appui.rc
new file mode 100644
index 00000000..06549878
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="move"><text>&amp;Move</text>
+ <Action name="switch_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kscons_kxt/appview.cpp b/languages/cpp/app_templates/kscons_kxt/appview.cpp
new file mode 100644
index 00000000..7dc99f61
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/appview.cpp
@@ -0,0 +1,41 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}view.h"
+#include "settings.h"
+
+#include <klocale.h>
+#include <qlabel.h>
+
+%{APPNAME}View::%{APPNAME}View(QWidget *parent)
+ : %{APPNAME}view_base(parent)
+{
+ settingsChanged();
+}
+
+%{APPNAME}View::~%{APPNAME}View()
+{
+
+}
+
+void %{APPNAME}View::switchColors()
+{
+ // switch the foreground/background colors of the label
+ QColor color = Settings::col_background();
+ Settings::setCol_background( Settings::col_foreground() );
+ Settings::setCol_foreground( color );
+
+ settingsChanged();
+}
+
+void %{APPNAME}View::settingsChanged()
+{
+ sillyLabel->setPaletteBackgroundColor( Settings::col_background() );
+ sillyLabel->setPaletteForegroundColor( Settings::col_foreground() );
+
+ // i18n : internationalization
+ sillyLabel->setText( i18n("This project is %1 days old").arg(Settings::val_time()) );
+ emit signalChangeStatusbar( i18n("Settings changed") );
+}
+
+#include "%{APPNAMELC}view.moc"
+
diff --git a/languages/cpp/app_templates/kscons_kxt/appview.h b/languages/cpp/app_templates/kscons_kxt/appview.h
new file mode 100644
index 00000000..86d097a4
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/appview.h
@@ -0,0 +1,52 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}VIEW_H_
+#define _%{APPNAMEUC}VIEW_H_
+
+#include <qwidget.h>
+
+#include "%{APPNAMELC}view_base.h"
+
+class QPainter;
+class KURL;
+
+/**
+ * This is the main view class for %{APPNAME}. Most of the non-menu,
+ * non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ * here.
+ *
+ * @short Main view
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAME}View : public %{APPNAME}view_base
+{
+ Q_OBJECT
+public:
+ /**
+ * Default constructor
+ */
+ %{APPNAME}View(QWidget *parent);
+
+ /**
+ * Destructor
+ */
+ virtual ~%{APPNAME}View();
+
+signals:
+ /**
+ * Use this signal to change the content of the statusbar
+ */
+ void signalChangeStatusbar(const QString& text);
+
+ /**
+ * Use this signal to change the content of the caption
+ */
+ void signalChangeCaption(const QString& text);
+
+public slots:
+ void switchColors();
+ void settingsChanged();
+};
+
+#endif // _%{APPNAMEUC}VIEW_H_
diff --git a/languages/cpp/app_templates/kscons_kxt/appview_base.ui b/languages/cpp/app_templates/kscons_kxt/appview_base.ui
new file mode 100644
index 00000000..6cd36d2c
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/appview_base.ui
@@ -0,0 +1,35 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>%{APPNAME}view_base</class>
+<comment>%{CPP_TEMPLATE}</comment>
+<author>%{AUTHOR} &lt;%{EMAIL}&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>%{APPNAME}view_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>268</width>
+ <height>164</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>%{APPNAME}_base</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>sillyLabel</cstring>
+ </property>
+ <property name="text">
+ <string>hello, world</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kscons_kxt/kscons_kxt.kdevtemplate b/languages/cpp/app_templates/kscons_kxt/kscons_kxt.kdevtemplate
new file mode 100644
index 00000000..6236f905
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/kscons_kxt.kdevtemplate
@@ -0,0 +1,253 @@
+# KDE Config File
+[General]
+Name=Scons-based KDE application
+Name[ca]=Una aplicació per al KDE basada en Scons
+Name[da]=Scons-baseret KDE program
+Name[de]=Auf Scons basierende KDE-Anwendung
+Name[el]=Μια εφαÏμογή KMDI βασισμένης στο Scons
+Name[es]=Aplicación para KDE basada en Scons
+Name[et]=KDE rakendus Sconsi põhjal
+Name[eu]=Scons-en oinarritutako KDE aplikazioa
+Name[fa]=کاربرد KDE بر مبنای Scons
+Name[fr]=Application KDE basée sur Scons
+Name[ga]=Feidhmchlár KDE bunaithe ar Scons
+Name[gl]=Aplicación KDE baseada en Scons
+Name[hu]=Scons-alapú KDE-s alkalmazás
+Name[it]=Un'applicazione KDE basata su scons
+Name[ja]=Scons を使ã£ãŸ KDE アプリケーション
+Name[nds]=Op "Scons" opbuut KDE-Programm
+Name[ne]=सà¥à¤•à¥‹à¤¨-आधारित केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Scons gebaseerde KDE-toepassing
+Name[pl]=Program KDE wykorzystujÄ…cy Scons
+Name[pt]=Aplicação KDE usando Scons
+Name[pt_BR]=Aplicação KDE usando Scons
+Name[ru]=Приложение KDE на базе Scons
+Name[sk]=KDE aplikácia založená na Scons
+Name[sr]=KDE програм на оÑнову Scons-а
+Name[sr@Latn]=KDE program na osnovu Scons-a
+Name[sv]=Scons-baserat KDE-program
+Name[tr]=Scons-tabanlı KDE Uygulaması
+Name[zh_CN]=基于 Scons çš„ KDE 应用程åº
+Name[zh_TW]=Scons 為基礎的 KDE 應用程å¼
+Category=C++/KDE
+Icon=kscons_kxt.png
+Comment=Generates a simple KDE application with one widget, a configuration dialog and a dcop interface. Scons scripts are provided for compiling and installing the application.
+Comment[ca]=Genera una simple aplicació per al KDE amb un estri, un diàleg de configuració i una interfície dcop. Els scripts en Scons són proveïts per a compilar i instal·lar l'aplicació.
+Comment[da]=Genererer et simpelt KDE program med en kontrol, en indstillingsdialog og en dcop-grænseflade. Der sørges for scons-scripter til at kompilere og installere programmet.
+Comment[de]=Erstellt eine einfache KDE-Anwendung mit einem Widget, einem Einstellungsdialog und einer DCOP-Schnittstelle. Scons-Skripte zum Kompileren und Installieren der Anwendung werden zur Verfügung gestellt.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή KDE με ένα γÏαφικό συστατικό, ένα διάλογο ÏÏθμισης και μια διασÏνδεση dcop. ΠÏοσφέÏονται σενάÏια Scons για τη μεταγλώττιση και εγκατάσταση της εφαÏμογής.
+Comment[en_GB]=Generates a simple KDE application with one widget, a configuration dialogue and a dcop interface. Scons scripts are provided for compiling and installing the application.
+Comment[es]=Genera una sencilla aplicación para KDE con una ventana principal, un diálogo de configuración y una interfaz DCOP. Se proporcionan guiones en Scons para compilar e instalar la aplicación.
+Comment[et]=Lihtsa KDE rakenduse loomine ühe vidina, seadistusdialoogi ja DCOP-liidesega. Luuakse ka Sconsi skriptid rakenduse kompileerimiseks ja paigaldamiseks.
+Comment[eu]=KDE aplikazio sinple bat sortzen du trepeta bat, konfigurazio-elkarrizketa eta dcop interfaze batekin. Aplikazioa konpilatu eta instalatzeko Scons script-ak sortzen ditu.
+Comment[fa]=یک کاربرد سادۀ KDE با یک عنصر، یک محاورۀ پیکربندی Ùˆ یک واسط dcop تولید می‌کند. دست‌نوشته‌های Scons برای ترجمه Ùˆ نصب کاربرد Ùراهم شده‌اند.
+Comment[fr]=Génère une application KDE simple comprenant un seul élément graphique (widget), une boîte de dialogue de configuration et une interface DCOP. Des scripts Scons sont fournis pour compiler et installer l'application.
+Comment[gl]=Xera unha aplicación sinxela KDE cunha compoñente, un diálogo de configuración e unha interface dcop. Os scripts scons proporciónanse para compilar e intalar a aplicación.
+Comment[hu]=Létrehoz egy egyszerű KDE-alkalmazást egy főablakkal, beállítóablakkal és DCOP-felülettel. Az alkalmazás lefordításához és telepítéséhez Scons-szkriptek állnak rendelkezésre.
+Comment[it]=Genera una semplice applicazione KDE con un elemento grafico, una finestra di configurazione e un'interfaccia DCOP. Gli script scons sono forniti per compilare e installare l'applicazione.
+Comment[nds]=Stellt en eenfach KDE-Programm mit een Element, en Instelldialoog un en DCOP-Koppelsteed op. Stellt Scons-Skripten för't Kompileren un Installeren vun't Programm praat.
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ विगेट, कनà¥à¤«à¤¿à¤—रेसन संवाद र dcop इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤¸à¤à¤— à¤à¤‰à¤Ÿà¤¾ साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । सà¥à¤•à¥‹à¤¨ सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤¹à¤°à¥‚ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ र कमà¥à¤ªà¤¾à¤‡à¤² गरà¥à¤¨à¤•à¤¾ लागि पà¥à¤°à¤¦à¤¾à¤¨ गरिनà¥à¤› ।
+Comment[nl]=Genereert een eenvoudige KDE-toepassing met één toplevel widget, een configuratievenster en een DCOP-interface. Scons-scripts worden aangemaakt voor compilatie en installatie.
+Comment[pl]=Generuje prosty program dla KDE widgetem, oknem konfiguracyjnym i interfejsem dcop. Do kompilacji i instalacji programu wykorzystywane sÄ… skrypty Scons.
+Comment[pt]=Gera uma aplicação simples do KDE com uma janela principal, uma de configuração e uma interface de DCOP. Os ficheiros do 'scons' são oferecidos para compilar e instalar a aplicação.
+Comment[pt_BR]=Gera uma aplicação simples do KDE com uma janela principal, uma de configuração e uma interface de DCOP. Os ficheiros do 'scons' são oferecidos para compilar e instalar a aplicação.
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE Ñ Ð¾Ð´Ð½Ð¸Ð¼ виджетом, окном наÑтройки и интерфейÑом DCOP. Сборка и уÑтановка оÑущеÑтвлÑетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñкриптов Scons.
+Comment[sk]=Vygeneruje jednoduchú KDE aplikáciu s jedným oknom, konfiguraÄným dial=ogom a DCOP rozhraním. K dispozícii je Scons skriptna kompiláciu a inÅ¡taláciu aplikácie.
+Comment[sr]=Прави једноÑтаван KDE програм Ñа једном контролом, дијалогом за подешавање и DCOP интерфејÑом. Дате Ñу Scons Ñкрипте за превођење и инÑталирање програма.
+Comment[sr@Latn]=Pravi jednostavan KDE program sa jednom kontrolom, dijalogom za podešavanje i DCOP interfejsom. Date su Scons skripte za prevođenje i instaliranje programa.
+Comment[sv]=Skapar ett enkelt KDE-program med en grafisk komponent, en inställningsdialogruta och ett DCOP-gränssnitt. Scons-script tillhandahålls för att kompilera och installera programmet.
+Comment[tr]=Bir parçacıklı, ayar pencereli ve bir dcop arayüzü olan basit bir KDE uygulaması yaratır. Uygulamayı derlemek ve kurmak için scons betikleri sağlanmıştır.
+Comment[zh_CN]=生æˆä¸€ä¸ªå¸¦ä¸€ä¸ªéƒ¨ä»¶ã€ä¸€ä¸ªé…置对è¯æ¡†å’Œä¸€ä¸ª DCOP 接å£çš„ç®€å• KDE 应用程åºã€‚此时会æä¾› Scons 脚本以供编译并安装应用程åºã€‚
+Comment[zh_TW]=產生一個簡單的 KDE 應用程å¼ï¼Œå…§å«ä¸€å€‹å…ƒä»¶ï¼Œä¸€å€‹è¨­å®šå°è©±æ¡†èˆ‡ä¸€å€‹ DCOP 介é¢ã€‚Scons 文稿å¯ç”¨æ–¼ç·¨è­¯èˆ‡å®‰è£æ‡‰ç”¨ç¨‹å¼ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/QUICKSTART
+Archive=kscons_kxt.tar.gz
+
+[SCONS]
+Type=include
+File=%{kdevelop}/template-common/scons.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{src}/SConscript-doc
+Dest=%{dest}/doc/SConscript
+
+[FILE2]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE4]
+Type=install
+Source=%{src}/SConstruct
+Dest=%{dest}/SConstruct
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE10]
+Type=install
+Source=%{src}/SConscript-src
+Dest=%{dest}/src/SConscript
+
+[FILE11]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE12]
+Type=install
+Source=%{src}/app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE13]
+Type=install
+EscapeXML=true
+Source=%{src}/appview_base.ui
+Dest=%{dest}/src/%{APPNAMELC}view_base.ui
+
+[FILE14]
+Type=install
+Source=%{src}/appview.cpp
+Dest=%{dest}/src/%{APPNAMELC}view.cpp
+
+[FILE15]
+Type=install
+Source=%{src}/appview.h
+Dest=%{dest}/src/%{APPNAMELC}view.h
+
+[FILE16]
+Type=install
+EscapeXML=true
+Source=%{src}/prefs-base.ui
+Dest=%{dest}/src/prefs-base.ui
+
+[FILE17]
+Type=install
+Source=%{src}/prefs.cpp
+Dest=%{dest}/src/prefs.cpp
+
+[FILE18]
+Type=install
+Source=%{src}/prefs.h
+Dest=%{dest}/src/prefs.h
+
+[FILE19]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE20]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE21]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/src/README
+
+[FILE22]
+Type=install
+Source=%{src}/app.kcfg
+Dest=%{dest}/src/%{APPNAMELC}.kcfg
+
+[FILE23]
+Type=install
+Source=%{src}/settings.kcfgc
+Dest=%{dest}/src/settings.kcfgc
+
+[FILE24]
+Type=install
+Source=%{src}/tips
+Dest=%{dest}/src/tips
+
+[FILE26]
+Type=install
+Source=%{src}/VERSION
+Dest=%{dest}/VERSION
+
+[FILE29]
+Type=install
+Source=%{src}/INSTALL
+Dest=%{dest}/INSTALL
+
+[FILE30]
+Type=install
+Source=%{src}/QUICKSTART
+Dest=%{dest}/QUICKSTART
+
+[FILE31]
+Type=install
+Source=%{src}/messages.sh
+Dest=%{dest}/po/messages.sh
+
+[MSG]
+Type=message
+Comment=A KDE application with scons scripts was created in %{dest}
+Comment[ca]=Una aplicació per al KDE amb scripts en Scons ha estat creada e n %{dest}
+Comment[da]=Et KDE program med scons-scripter blev oprette i %{dest}
+Comment[de]=Eine KDE-Anwendung mit Scons-Skripten wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή KDE με σενάÏια scons δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación para KDE con guiones de Scons ha sido creada en %{dest}
+Comment[et]=KDE rakendus Sconsi skriptidega loodi asukohta %{dest}
+Comment[eu]=Scons script-dun KDE aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد KDE با دست‌نوشته‌های scons در %{dest} ایجاد شد
+Comment[fr]=Une application KDE comprenant des scripts Scons a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár KDE le scripteanna scons i %{dest}
+Comment[gl]=Creouse unha aplicación KDE con scripts scons en %{dest}
+Comment[hu]=Létrejött egy Scons-szkripteket használó KDE-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione KDE con gli script scons in %{dest}
+Comment[ja]=Scons スクリプトを使ã£ãŸ KDE アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KDE-Programm mit scons-Skripten opstellt
+Comment[ne]=सà¥à¤•à¥‹à¤¨ सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤¸à¤à¤— केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een KDE applicatie inclusief Scons-scripts is aangemaakt in %{dest}
+Comment[pl]=Program KDE ze skryptami scons utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do KDE com ficheiros do 'scons' em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do KDE com ficheiros do 'scons' em %{dest}
+Comment[ru]=Приложение KDE Ñо Ñкриптами Scons Ñоздано в %{dest}
+Comment[sk]=KDE aplikácia so scons skriptom bola vytvorená v %{dest}
+Comment[sr]=KDE програм Ñа scons Ñкриптама направљен је у %{dest}
+Comment[sr@Latn]=KDE program sa scons skriptama napravljen je u %{dest}
+Comment[sv]=Ett KDE-program med Scons-skript skapades i %{dest}
+Comment[tr]=Scons betikleri olan bir KDE uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了带 scons 脚本的 KDE 应用程åº
+Comment[zh_TW]=ä¸€å€‹å…§å« scons 文稿的 KDE 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kscons_kxt/kscons_kxt.png b/languages/cpp/app_templates/kscons_kxt/kscons_kxt.png
new file mode 100644
index 00000000..13e8eeff
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/kscons_kxt.png
Binary files differ
diff --git a/languages/cpp/app_templates/kscons_kxt/main.cpp b/languages/cpp/app_templates/kscons_kxt/main.cpp
new file mode 100644
index 00000000..95e54c47
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/main.cpp
@@ -0,0 +1,57 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static const char description[] =
+ I18N_NOOP("A KDE Application");
+
+static const char version[] = "%{VERSION}";
+
+static KCmdLineOptions options[] =
+{
+ { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", 0, 0, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KApplication app;
+
+ // see if we are starting with session management
+ if (app.isRestored())
+ {
+ RESTORE(%{APPNAME});
+ }
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->count() == 0)
+ {
+ %{APPNAME} *widget = new %{APPNAME};
+ widget->show();
+ }
+ else
+ {
+ int i = 0;
+ for (; i < args->count(); i++)
+ {
+ %{APPNAME} *widget = new %{APPNAME};
+ widget->show();
+ }
+ }
+ args->clear();
+ }
+
+ return app.exec();
+}
+
diff --git a/languages/cpp/app_templates/kscons_kxt/messages.sh b/languages/cpp/app_templates/kscons_kxt/messages.sh
new file mode 100755
index 00000000..a36f5c93
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/messages.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Inspired by Makefile.common from coolo
+# this script is used to update the .po files
+
+# To update the translations, you will need a specific gettext
+# patched for kde and a lot of patience, tenacity, luck, time ..
+
+
+# I guess one should only update the .po files when all .cpp files
+# are generated (after a make or scons)
+
+# If you have a better way to do this, do not keep that info
+# for yourself and help me to improve this script, thanks
+# (tnagyemail-mail tat yahoo d0tt fr)
+
+SRCDIR=../test1-kconfigxt # srcdir is the directory containing the source code
+TIPSDIR=$SRCDIR # tipsdir is the directory containing the tips
+
+KDEDIR=`kde-config --prefix`
+EXTRACTRC=extractrc
+KDEPOT=`kde-config --prefix`/include/kde.pot
+XGETTEXT="xgettext -C -ki18n -ktr2i18n -kI18N_NOOP -ktranslate -kaliasLocale -x $KDEPOT "
+
+## check that kde.pot is available
+if ! test -e $KDEPOT; then
+ echo "$KDEPOT does not exist, there is something wrong with your installation!"
+ XGETTEXT="xgettext -C -ki18n -ktr2i18n -kI18N_NOOP -ktranslate -kaliasLocale "
+fi
+
+> rc.cpp
+
+## extract the strings
+echo "extracting the strings"
+
+# process the .ui and .rc files
+$EXTRACTRC `find $SRCDIR -iname *.rc` >> rc.cpp
+$EXTRACTRC `find $SRCDIR -iname *.ui` >> rc.cpp
+echo -e 'i18n("_: NAME OF TRANSLATORS\\n"\n"Your names")\ni18n("_: EMAIL OF TRANSLATORS\\n"\n"Your emails")' > $SRCDIR/_translatorinfo.cpp
+
+# process the tips - $SRCDIR is supposed to be where the tips are living
+pushd $TIPSDIR; preparetips >tips.cpp; popd
+
+$XGETTEXT `find $SRCDIR -name "*.cpp"` -o kdissert.pot
+
+# remove the intermediate files
+rm -f $TIPSDIR/tips.cpp
+rm -f rc.cpp
+rm -f $SRCDIR/_translatorinfo.cpp
+
+## now merge the .po files ..
+echo "merging the .po files"
+
+for i in `ls *.po`; do
+ msgmerge $i kdissert.pot -o $i || exit 1
+done
+
+## finished
+echo "Done"
+
diff --git a/languages/cpp/app_templates/kscons_kxt/prefs-base.ui b/languages/cpp/app_templates/kscons_kxt/prefs-base.ui
new file mode 100644
index 00000000..43ef8a5f
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/prefs-base.ui
@@ -0,0 +1,129 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>Prefs_base</class>
+<comment>%{CPP_TEMPLATE}</comment>
+<author>%{AUTHOR} &lt;%{EMAIL}&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Prefs_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>282</width>
+ <height>156</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Background color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_col_background</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Project age:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Foreground color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="1" column="1">
+ <property name="name">
+ <cstring>kcfg_col_foreground</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox" row="2" column="1">
+ <property name="name">
+ <cstring>kcfg_val_time</cstring>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/app_templates/kscons_kxt/prefs.cpp b/languages/cpp/app_templates/kscons_kxt/prefs.cpp
new file mode 100644
index 00000000..e7a46ddf
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/prefs.cpp
@@ -0,0 +1,12 @@
+%{CPP_TEMPLATE}
+
+#include "prefs.h"
+#include <kdebug.h>
+
+Prefs::Prefs()
+ : Prefs_base()
+{
+// debugging :
+// kdWarning()<<"creating a pref dialog"<<endl;
+}
+
diff --git a/languages/cpp/app_templates/kscons_kxt/prefs.h b/languages/cpp/app_templates/kscons_kxt/prefs.h
new file mode 100644
index 00000000..9106fe59
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/prefs.h
@@ -0,0 +1,11 @@
+%{H_TEMPLATE}
+
+#include "prefs-base.h"
+
+
+class Prefs : public Prefs_base
+{
+ public:
+ Prefs();
+};
+
diff --git a/languages/cpp/app_templates/kscons_kxt/settings.kcfgc b/languages/cpp/app_templates/kscons_kxt/settings.kcfgc
new file mode 100644
index 00000000..384510cd
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/settings.kcfgc
@@ -0,0 +1,6 @@
+# Code generation options for kconfig_compiler
+File=%{APPNAMELC}.kcfg
+ClassName=Settings
+Singleton=true
+Mutators=col_background,col_foreground
+# will create the necessary code for setting those variables
diff --git a/languages/cpp/app_templates/kscons_kxt/tips b/languages/cpp/app_templates/kscons_kxt/tips
new file mode 100644
index 00000000..56f29469
--- /dev/null
+++ b/languages/cpp/app_templates/kscons_kxt/tips
@@ -0,0 +1,6 @@
+<tip category="help">
+<html>
+<p>... that automake was not involved in building this kde application ?</p>
+<p>The kdevelop template &quot;kscons_kxt&quot; was used instead.</p>
+</html>
+</tip>
diff --git a/languages/cpp/app_templates/kscreensaver/.kdev_ignore b/languages/cpp/app_templates/kscreensaver/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/.kdev_ignore
diff --git a/languages/cpp/app_templates/kscreensaver/Makefile.am b/languages/cpp/app_templates/kscreensaver/Makefile.am
new file mode 100644
index 00000000..28747ace
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = kscreensaver.desktop kscreensaver.png kscreensaver.h \
+ kscreensaverui.ui src-Makefile.am kscreensaver.cpp \
+ kscreensaver.kdevelop subdirs
+
+templateName= kscreensaver
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz $(templateName).png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/kscreensaver/kscreensaver.cpp b/languages/cpp/app_templates/kscreensaver/kscreensaver.cpp
new file mode 100644
index 00000000..f4418571
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/kscreensaver.cpp
@@ -0,0 +1,107 @@
+%{CPP_TEMPLATE}
+
+#include <stdlib.h>
+#include <qcheckbox.h>
+#include <qcolor.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kpushbutton.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include "%{APPNAMELC}.h"
+#include "%{APPNAMELC}ui.h"
+
+//! libkscreensaver interface
+extern "C"
+{
+ const char *kss_applicationName = "%{APPNAMELC}.kss";
+ const char *kss_description = I18N_NOOP( "%{APPNAME}" );
+ const char *kss_version = "2.2.0";
+
+ %{APPNAME} *kss_create( WId id )
+ {
+ KGlobal::locale()->insertCatalogue("%{APPNAMELC}");
+ return new %{APPNAME}( id );
+ }
+
+ QDialog *kss_setup()
+ {
+ KGlobal::locale()->insertCatalogue("%{APPNAMELC}");
+ return new %{APPNAME}Setup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+//! dialog to setup screen saver parameters
+%{APPNAME}Setup::%{APPNAME}Setup( QWidget *parent, const char *name )
+ : %{APPNAME}UI( parent, name, TRUE )
+{
+ /// @todo
+ //Connect your signals and slots here to configure the screen saver.
+ connect( OkayPushButton, SIGNAL( released() ),
+ SLOT( slotOkPressed() ) );
+ connect( CancelPushButton, SIGNAL( released() ),
+ SLOT( slotCancelPressed() ) );
+}
+
+
+//! read settings from config file
+void %{APPNAME}Setup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+ /// @todo
+ // Add your config options here...
+ CheckBox1->setChecked(config->readBoolEntry( "somesetting", false ));
+}
+
+
+//! Ok pressed - save settings and exit
+void %{APPNAME}Setup::slotOkPressed()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+ /// @todo
+ // Add your config options here.
+ config->writeEntry( "somesetting", CheckBox1->isChecked() );
+ config->sync();
+
+ accept();
+}
+
+void %{APPNAME}Setup::slotCancelPressed()
+{
+ reject();
+}
+//-----------------------------------------------------------------------------
+
+
+%{APPNAME}::%{APPNAME}( WId id ) : KScreenSaver( id )
+{
+ readSettings();
+ blank();
+}
+
+%{APPNAME}::~%{APPNAME}()
+{}
+
+
+//! read configuration settings from config file
+void %{APPNAME}::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+ /// @todo
+ // Add your config options here...
+ bool somesetting = config->readBoolEntry( "somesetting", false );
+}
+
+
+void %{APPNAME}::blank()
+{
+ /// @todo
+ //Add your code to render the screen.
+ setBackgroundColor( QColor(black) );
+ //
+ erase();
+}
diff --git a/languages/cpp/app_templates/kscreensaver/kscreensaver.desktop b/languages/cpp/app_templates/kscreensaver/kscreensaver.desktop
new file mode 100644
index 00000000..0743cc69
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/kscreensaver.desktop
@@ -0,0 +1,124 @@
+[Desktop Entry]
+Exec=%{APPNAMELC}.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Miscellaneous
+Name=%{APPNAME}
+
+[Desktop Action Setup]
+Exec=%{APPNAMELC}.kss -setup
+Name=Setup...
+Name[br]=Kefluniadur ...
+Name[ca]=Configuració...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=ΡÏθμιση...
+Name[es]=Configuración...
+Name[et]=Häälestus...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fr]=Configuration...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[hu]=Beállítások...
+Name[it]=Imposta...
+Name[ja]=設定...
+Name[lt]=Nustatymas...
+Name[ms]=Tetapan...
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellen...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ru]=ÐаÑтроить...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=ПоÑтављање...
+Name[sr@Latn]=Postavljanje...
+Name[sv]=Inställning...
+Name[tr]=Kurulum...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=%{APPNAMELC}.kss -window-id %w
+Name=Display in Specified Window
+Name[br]=Diskwel er prenestr spisaet
+Name[ca]=Mostra a la finestra especificada
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Vis i specificeret vindue
+Name[de]=Im angegebenen Fenster anzeigen
+Name[el]=ΠÏοβολή στο οÏισμένο παÏάθυÏο
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Kuva määratud aknas
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fr]=Afficher dans la fenêtre spécifiée
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na xanela especificada
+Name[hu]=Megjelenítés egy adott ablakban
+Name[it]=Mostra in una finestra specificata
+Name[ja]=指定ã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«è¡¨ç¤º
+Name[lt]=Rodyti nurodytame lange
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nds]=Binnen angeven Finster wiesen
+Name[ne]=निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ सञà¥à¤à¥à¤¯à¤¾à¤²à¤®à¤¾ पà¥à¤°à¤°à¥à¤¦à¤¶à¤¨
+Name[nl]=Weergave in aangegeven venster
+Name[pl]=Pokazywanie w podanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Exibir na Janela Especificada
+Name[ru]=Показать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v špecifickom okne
+Name[sl]=Prikaži v doloÄenem oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[tr]=Belirtilen Pencerede Göster
+Name[zh_CN]=在指定窗å£ä¸­æ˜¾ç¤º
+Name[zh_TW]=顯示在指定視窗
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=%{APPNAMELC}.kss -root
+Name=Display in Root Window
+Name[br]=Diskwel er prenestr gwrizienn
+Name[ca]=Mostra a la finestra arrel
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Vis i rod-vindue
+Name[de]=Im Root-Fenster anzeigen
+Name[el]=ΠÏοβολή στο βασικό παÏάθυÏο
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Kuva juuraknas
+Name[eu]=Bistaratu erro-lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fr]=Afficher dans la fenêtre racine
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na xanela raíz
+Name[hu]=Megjelenítés a gyökérablakban
+Name[it]=Mostra nella finestra radice
+Name[ja]=ルートウィンドウã«è¡¨ç¤º
+Name[lt]=Rodyti root lange
+Name[ms]=Papar dalam Tetingkap Root
+Name[nds]=Binnen Wörtelfinster wiesen
+Name[ne]=रूट सञà¥à¤à¥à¤¯à¤¾à¤²à¤®à¤¾ पà¥à¤°à¤°à¥à¤¦à¤¶à¤¨
+Name[nl]=Weergave in hoofdvenster
+Name[pl]=Pokazywanie w głównym oknie
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Exibir na Janela Raiz
+Name[ru]=Показать в главном окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaži v korenskem oknu
+Name[sr]=Прикажи у кореном прозору
+Name[sr@Latn]=Prikaži u korenom prozoru
+Name[sv]=Visa i rotfönster
+Name[tr]=Kök Pencerede Göster
+Name[zh_CN]=在根窗å£ä¸­æ˜¾ç¤º
+Name[zh_TW]=顯示在根視窗
+NoDisplay=true
diff --git a/languages/cpp/app_templates/kscreensaver/kscreensaver.h b/languages/cpp/app_templates/kscreensaver/kscreensaver.h
new file mode 100644
index 00000000..1301083d
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/kscreensaver.h
@@ -0,0 +1,35 @@
+%{CPP_TEMPLATE}
+
+#ifndef %{APPNAME}_H__
+#define %{APPNAME}_H__
+
+#include "kscreensaver.h"
+#include "%{APPNAMELC}ui.h"
+
+class %{APPNAME} : public KScreenSaver
+{
+ Q_OBJECT
+public:
+ %{APPNAME}( WId drawable );
+ virtual ~%{APPNAME}();
+private:
+ void readSettings();
+ void blank();
+};
+
+class %{APPNAME}Setup : public %{APPNAME}UI
+{
+ Q_OBJECT
+public:
+ %{APPNAME}Setup( QWidget *parent = NULL, const char *name = NULL );
+
+private slots:
+ void slotOkPressed();
+ void slotCancelPressed();
+
+private:
+ void readSettings();
+ %{APPNAME} *saver;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/kscreensaver/kscreensaver.kdevelop b/languages/cpp/app_templates/kscreensaver/kscreensaver.kdevelop
new file mode 100644
index 00000000..e912518f
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/kscreensaver.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>kioslave</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+<kdevautoproject>
+ <general>
+ <activetarget>src/lib%{APPNAMELC}.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kscreensaver/kscreensaver.kdevtemplate b/languages/cpp/app_templates/kscreensaver/kscreensaver.kdevtemplate
new file mode 100644
index 00000000..027ba4ea
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/kscreensaver.kdevtemplate
@@ -0,0 +1,203 @@
+# KDE Config File
+[General]
+Name=KDE Screen Saver
+Name[br]=Damanter skramm KDE
+Name[ca]=Salvapantalles per al KDE
+Name[da]=KDE pauseskærm
+Name[de]=KDE-Bildschirmschoner
+Name[el]=ΠÏοφÏλαξη οθόνης του KDE
+Name[es]=Salvapantallas para KDE
+Name[et]=KDE ekraanisäästja
+Name[eu]=KDE pantaila-babeslea
+Name[fa]=محاÙظ صÙØ­Û€ KDE
+Name[fr]=Écran de veille KDE
+Name[ga]=Spárálaí Scáileáin KDE
+Name[gl]=Salvapantallas KDE
+Name[hu]=KDE-s képernyővédő
+Name[it]=Salva schermo di KDE
+Name[ja]=KDE スクリーンセーãƒãƒ¼
+Name[nds]=KDE-Pausschirm
+Name[ne]=केडीई सà¥à¤•à¥à¤°à¤¿à¤¨ सरà¥à¤­à¤°
+Name[nl]=KDE-schermbeveiliging
+Name[pl]=Wygaszacz ekranu KDE
+Name[pt]=Protector de Ecrã do KDE
+Name[pt_BR]=Protetor de tela do KDE
+Name[ru]=Хранитель Ñкрана Ð´Ð»Ñ KDE
+Name[sk]=KDE Å¡etriÄ obrazovky
+Name[sl]=Ohranjevalnik zaslona za KDE
+Name[sr]=KDE чувар екрана
+Name[sr@Latn]=KDE Äuvar ekrana
+Name[sv]=KDE-skärmsläckare
+Name[tr]=KDE Ekran Koruyucusu
+Name[zh_CN]= KDE å±å¹•ä¿æŠ¤ç¨‹åº
+Name[zh_TW]=KDE 螢幕ä¿è­·ç¨‹å¼
+Icon=kscreensaver.png
+Category=C++/KDE
+Comment=Generates a framework for a KDE screensaver.
+Comment[ca]=Genera una infraestructura per a un salvapantalles de KDE.
+Comment[da]=Genererer et skelet for en KDE-pauseskærm.
+Comment[de]=Erstellt das Gerüst für einen KDE-Bildschirmschoner.
+Comment[el]=ΔημιουÏγεί ένα πλαίσιο για μια Ï€ÏοφÏλαξη οθόνης του KDE.
+Comment[es]=Genera una infraestructura para un salvapantallas de KDE
+Comment[et]=KDE ekraanisäästja raamistiku loomine.
+Comment[eu]=KDE-ren pantaila-babesle baten lan-marko bat sortzen du.
+Comment[fa]=چارچوبی برای محاÙظ صÙØ­Û€ KDE تولید می‌کند.
+Comment[fr]=Génère une infrastructure pour un écran de veille KDE.
+Comment[gl]=Xera un contorno de traballo para un salvapantallas KDE.
+Comment[hu]=Létrehoz egy alap KDE-s képernyővédőt.
+Comment[it]=Genera l'infrastruttura per un salvaschermo di KDE.
+Comment[ja]=KDE スクリーンセーãƒãƒ¼ã®ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã‚’作æˆã—ã¾ã™
+Comment[nds]=Stellt dat Rahmenwark för en KDE-Pausschirm op.
+Comment[ne]=केडीई सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¥‡à¤­à¤°à¤•à¤¾ लागि फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een framework voor een KDE-schermbeveiliging.
+Comment[pl]=Generuje szablon wygaszacza ekranu dla KDE.
+Comment[pt]=Gera a plataforma para um protector de ecrã do KDE.
+Comment[pt_BR]=Gera a plataforma para um protector de ecrã do KDE.
+Comment[ru]=Создание инфраÑтруктуры Ñ…Ñ€Ð°Ð½Ð¸Ñ‚ÐµÐ»Ñ Ñкрана Ð´Ð»Ñ KDE.
+Comment[sk]=Vygeneruje framework pre KDE Å¡etriÄ obrazovky.
+Comment[sl]=Ustvari ogrodje ohranjevalnika zaslona za KDE.
+Comment[sr]=Прави радни оквир за KDE чувар екрана.
+Comment[sr@Latn]=Pravi radni okvir za KDE Äuvar ekrana.
+Comment[sv]=Skapar ett ramverk för en KDE-skärmsläckare
+Comment[tr]=Bir KDE ekran koruyucusu için bir çatı oluşturulur.
+Comment[zh_CN]=ç”Ÿæˆ KDE å±å¹•ä¿æŠ¤ç¨‹åºæ¡†æž¶ã€‚
+Comment[zh_TW]=產生一個 KDE 螢幕ä¿è­·ç¨‹å¼çš„框架
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=kscreensaver.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/kscreensaver.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/kscreensaver.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/kscreensaver.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE14]
+Type=install
+Source=%{src}/kscreensaver.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE15]
+Type=install
+EscapeXML=true
+Source=%{src}/kscreensaverui.ui
+Dest=%{dest}/src/%{APPNAMELC}ui.ui
+
+[MSG]
+Type=message
+Comment=A screensaver application was created in %{dest}
+Comment[ca]=Una aplicació de salvapantalles ha estat creada en %{dest}
+Comment[da]=Et pauseskærmsprogram blev oprettet i %{dest}
+Comment[de]=Ein Bildschirmschoner wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή Ï€ÏοφÏλαξης οθόνης δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación salvapantallas ha sido creada en %{dest}
+Comment[et]=Ekraanisäästja rakendus loodi asukohta %{dest}
+Comment[eu]=Pantaila-babesle baten aplikazioa sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد محاÙظ صÙحه در %{dest} ایجاد شد
+Comment[fr]=Une application écran de veille a été créé dans %{dest}
+Comment[ga]=Cruthaíodh spárálaí scáileáin i %{dest}
+Comment[gl]=Creouse unha aplicación salvapantallas en %{dest}
+Comment[hu]=Létrejött egy alap képernyővédő program itt: %{dest}
+Comment[it]=È stata creata un'applicazione salvaschermo in %{dest}
+Comment[ja]=スクリーンセーãƒãƒ¼ã‚¢ãƒ—リケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Pausschirm opstellt
+Comment[ne]=सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¥‡à¤­à¤° अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een schermbeveiligingstoepassing is aangemaakt in %{dest}
+Comment[pl]=Program wygaszacza ekranu został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação protectora do ecrã em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação protectora do ecrã em %{dest}
+Comment[ru]=Приложение Ñ…Ñ€Ð°Ð½Ð¸Ñ‚ÐµÐ»Ñ Ñкрана Ñоздано в %{dest}
+Comment[sk]=Aplikácia Å¡etriÄa obrazovky bola vytvorená v %{dest}
+Comment[sl]=Program ohranjevalnika zaslona je bil ustvarjen v %{dest}
+Comment[sr]=Програм чувара екрана направљен је у %{dest}
+Comment[sr@Latn]=Program Äuvara ekrana napravljen je u %{dest}
+Comment[sv]=Ett skärmsläckarprogram skapades i %{dest}
+Comment[tr]=Bir ekran koruyucusu uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了å±å¹•ä¿æŠ¤åº”用程åº
+Comment[zh_TW]=一個螢幕ä¿è­·ç¨‹å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kscreensaver/kscreensaver.png b/languages/cpp/app_templates/kscreensaver/kscreensaver.png
new file mode 100644
index 00000000..e91ec2e2
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/kscreensaver.png
Binary files differ
diff --git a/languages/cpp/app_templates/kscreensaver/kscreensaverui.ui b/languages/cpp/app_templates/kscreensaver/kscreensaverui.ui
new file mode 100644
index 00000000..c4a843d0
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/kscreensaverui.ui
@@ -0,0 +1,79 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>%{APPNAME}UI</class>
+<comment>This is the main UI for setting up your screen saver.</comment>
+<author>Ian Reinhart Geiser</author>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>%{APPNAMELC}cfg</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>257</width>
+ <height>58</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Screen Saver Config</string>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>5</x>
+ <y>0</y>
+ <width>255</width>
+ <height>57</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>Set some setting</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>OkayPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>CancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/cpp/app_templates/kscreensaver/src-Makefile.am b/languages/cpp/app_templates/kscreensaver/src-Makefile.am
new file mode 100644
index 00000000..e19ffb77
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/src-Makefile.am
@@ -0,0 +1,24 @@
+# Makefile.am for %{APPNAMELC}.
+#
+
+AM_CPPFLAGS = -UQT_NO_ASCII_CAST
+METASOURCES = AUTO
+
+INCLUDES = $(all_includes)
+LDFLAGS = $(all_libraries) $(KDE_RPATH)
+LDADD = $(LIB_KDEUI) -lkscreensaver -lm
+bin_PROGRAMS = %{APPNAMELC}.kss
+
+%{APPNAMELC}_kss_SOURCES = %{APPNAMELC}ui.ui %{APPNAMELC}.cpp
+%{APPNAMELC}_kss_LDADD = $(LIB_QT) $(LIB_KDECORE) $(LDADD) $(LIB_KSYCOCA)
+
+#datadir = $(kde_datadir)/%{APPNAMELC}
+
+desktop_DATA = %{APPNAMELC}.desktop
+desktopdir = $(kde_appsdir)/System/ScreenSavers
+
+EXTRA_DIST = $(desktop_DATA)
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/kscreensaver/subdirs b/languages/cpp/app_templates/kscreensaver/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kscreensaver/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/kxt/.kdev_ignore b/languages/cpp/app_templates/kxt/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/.kdev_ignore
diff --git a/languages/cpp/app_templates/kxt/Makefile.am b/languages/cpp/app_templates/kxt/Makefile.am
new file mode 100644
index 00000000..07767961
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = src-Makefile.am app.cpp app.h main.cpp appui.rc app.kdevelop \
+ subdirs app.desktop preview.png appview.h appview.cpp appview_base.ui \
+ prefs-base.ui prefs.cpp prefs.h app.kcfg settings.kcfgc README \
+ src-configure.in.in
+templateName= kxt
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/kxt/README b/languages/cpp/app_templates/kxt/README
new file mode 100644
index 00000000..74e23296
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/README
@@ -0,0 +1,86 @@
+-----------------------------------------------
+Kde templates quickstart
+Author: Thomas Nagy
+Date: 2004-03-22
+-----------------------------------------------
+
+This README file explains you basic things for starting with
+this application template.
+
+
+** Building and installing **
+
+* Build the configure script by "make -f Makefile.cvs"
+
+* To clean, use "make clean", and to clean everything
+(remove the makefiles, etc), use "make distclean"
+
+* To distribute your program, try "make dist".
+This will make a compact tarball archive of your release with the
+necessary scripts inside.
+
+* Modifying the auto-tools scripts
+for automake scripts there is an excellent tutorial there :
+http://developer.kde.org/documentation/other/makefile_am_howto.html
+
+* Simplify your life : install the project in your home directory for
+testing purposes.
+./configure --prefix=/home/user/dummyfolder/
+In the end when you finished the development you can
+rm -rf /home/user/dummyfolder/
+without fear.
+
+
+** Technologies **
+
+* Build the menus of your application easily
+kde applications now use an xml file (*ui.rc file) to build the menus.
+This allow a great customization of the application. However, when
+programming the menu is shown only after a "make install"
+
+For more details, consult :
+http://devel-home.kde.org/~larrosa/tutorial/p9.html
+http://developer.kde.org/documentation/tutorials/xmlui/preface.html
+
+* Use KConfig XT to create your configuration dialogs and make
+them more maintainable.
+
+For that, you will need to write two simple configuration files
+in the src directory : <myproject>.kcfg and a <settings>.kcfgc
+The configure.in.in will need to be modified : change the line #MIN_CONFIG(3.0.0)
+into #MIN_CONFIG(3.2.0)
+
+Take an example on the many apps found in the kdegames source package and consult :
+http://developer.kde.org/documentation/tutorials/kconfigxt/kconfigxt.html
+
+* With KParts, you can embed other kde components in your program, or make your program
+embeddable in other apps. For example, the kmplayer kpart can be called to play videos
+in your app.
+
+For more details, consult :
+http://www-106.ibm.com/developerworks/library/l-kparts/
+http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html
+
+* With dcop, you can control your app from other applications
+Make sure to include K_DCOP and a kdcop: section in your .h file
+http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html
+
+
+** Documentation **
+
+* For the translations :
+1. Download a patched gettext which can be found at:
+ http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/
+2. Install that gettext in ~/bin/
+3. cd ~/yourproject, export PATH=~/bin:$PATH, export
+KDEDIR=/where_your_KDE3_is
+4. make -f admin/Makefile.common package-messages
+5. make package-messages
+6. Translate the po files (not the pot!!) with kbabel or xemacs
+
+* Do not forget to write the documentation for your kde app
+edit the documentation template index.docbook in doc/
+
+
+
diff --git a/languages/cpp/app_templates/kxt/app.cpp b/languages/cpp/app_templates/kxt/app.cpp
new file mode 100644
index 00000000..6e2ce524
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/app.cpp
@@ -0,0 +1,154 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include "settings.h"
+#include "prefs.h"
+
+#include <qdragobject.h>
+#include <kprinter.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+
+#include <kconfigdialog.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kdeversion.h>
+#include <kmenubar.h>
+#include <kstatusbar.h>
+#include <kkeydialog.h>
+
+#include <kedittoolbar.h>
+
+#include <kstdaccel.h>
+#include <kaction.h>
+#include <kstdaction.h>
+
+%{APPNAMELC}::%{APPNAMELC}()
+ : KMainWindow( 0, "%{APPNAMELC}" ),
+ m_view(new %{APPNAMELC}View(this)),
+ m_printer(0)
+{
+ // accept dnd
+ setAcceptDrops(true);
+
+ // tell the KMainWindow that this is indeed the main widget
+ setCentralWidget(m_view);
+
+ // then, setup our actions
+ setupActions();
+
+ // and a status bar
+ statusBar()->show();
+
+ // apply the saved mainwindow settings, if any, and ask the mainwindow
+ // to automatically save settings if changed: window size, toolbar
+ // position, icon size, etc.
+ setAutoSaveSettings();
+
+ // allow the view to change the statusbar and caption
+ connect(m_view, SIGNAL(signalChangeStatusbar(const QString&)),
+ this, SLOT(changeStatusbar(const QString&)));
+ connect(m_view, SIGNAL(signalChangeCaption(const QString&)),
+ this, SLOT(changeCaption(const QString&)));
+
+}
+
+%{APPNAMELC}::~%{APPNAMELC}()
+{
+}
+
+void %{APPNAMELC}::setupActions()
+{
+ KStdAction::openNew(this, SLOT(fileNew()), actionCollection());
+ KStdAction::quit(kapp, SLOT(quit()), actionCollection());
+
+ m_toolbarAction = KStdAction::showToolbar(this, SLOT(optionsShowToolbar()), actionCollection());
+ m_statusbarAction = KStdAction::showStatusbar(this, SLOT(optionsShowStatusbar()), actionCollection());
+
+ KStdAction::keyBindings(this, SLOT(optionsConfigureKeys()), actionCollection());
+ KStdAction::configureToolbars(this, SLOT(optionsConfigureToolbars()), actionCollection());
+ KStdAction::preferences(this, SLOT(optionsPreferences()), actionCollection());
+
+ // custom menu and menu item - the slot is in the class %{APPNAMELC}View
+ KAction *custom = new KAction(i18n("Swi&tch Colors"), 0,
+ m_view, SLOT(switchColors()),
+ actionCollection(), "switch_action");
+
+ createGUI();
+}
+
+void %{APPNAMELC}::fileNew()
+{
+ // this slot is called whenever the File->New menu is selected,
+ // the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ // button is clicked
+
+ // create a new window
+ (new %{APPNAMELC})->show();
+}
+
+void %{APPNAMELC}::optionsShowToolbar()
+{
+ // this is all very cut and paste code for showing/hiding the
+ // toolbar
+ if (m_toolbarAction->isChecked())
+ toolBar()->show();
+ else
+ toolBar()->hide();
+}
+
+void %{APPNAMELC}::optionsShowStatusbar()
+{
+ // show/hide the statusbar
+ if (m_statusbarAction->isChecked())
+ statusBar()->show();
+ else
+ statusBar()->hide();
+}
+
+void %{APPNAMELC}::optionsConfigureKeys()
+{
+ KKeyDialog::configure(actionCollection());
+}
+
+void %{APPNAMELC}::optionsConfigureToolbars()
+{
+ // use the standard toolbar editor
+ saveMainWindowSettings(KGlobal::config(), autoSaveGroup());
+}
+
+void %{APPNAMELC}::newToolbarConfig()
+{
+ // this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
+ // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
+ createGUI();
+
+ applyMainWindowSettings(KGlobal::config(), autoSaveGroup());
+}
+
+void %{APPNAMELC}::optionsPreferences()
+{
+ // The preference dialog is derived from prefs-base.ui which is subclassed into Prefs
+ //
+ // compare the names of the widgets in the .ui file
+ // to the names of the variables in the .kcfg file
+ KConfigDialog *dialog = new KConfigDialog(this, "settings", Settings::self(), KDialogBase::Swallow);
+ dialog->addPage(new Prefs(), i18n("General"), "package_settings");
+ connect(dialog, SIGNAL(settingsChanged()), m_view, SLOT(settingsChanged()));
+ dialog->show();
+}
+
+void %{APPNAMELC}::changeStatusbar(const QString& text)
+{
+ // display the text on the statusbar
+ statusBar()->message(text, 2000);
+}
+
+void %{APPNAMELC}::changeCaption(const QString& text)
+{
+ // display the text on the caption
+ setCaption(text);
+}
+#include "%{APPNAMELC}.moc"
+
diff --git a/languages/cpp/app_templates/kxt/app.desktop b/languages/cpp/app_templates/kxt/app.desktop
new file mode 100644
index 00000000..8b36e6e0
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/app.desktop
@@ -0,0 +1,40 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+Icon=%{APPNAMELC}
+Type=Application
+Comment=A simple KDE Application
+Comment[br]=Ur meziant eeun evit KDE
+Comment[ca]=Una simple aplicació per al KDE
+Comment[da]=Et simpelt KDE program
+Comment[de]=Eine einfache KDE-Anwendung
+Comment[el]=Μια απλή εφαÏμογή του KDE
+Comment[es]=Una aplicación de KDE sencilla
+Comment[et]=Lihtne KDE rakendus
+Comment[eu]=KDE aplikazio simple bat
+Comment[fa]=یک کاربرد سادۀ KDE
+Comment[fr]=Une application simple pour KDE
+Comment[ga]=Feidhmchlár Simplí KDE
+Comment[gl]=Unha aplicación KDE sinxela
+Comment[hi]=à¤à¤• सादा केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=Egyszerű KDE-alkalmazás
+Comment[is]=Einfalt KDE forrit
+Comment[it]=Una semplice applicazione KDE
+Comment[ja]=ç°¡å˜ãª KDE アプリケーション
+Comment[nds]=En eenfach KDE-Programm
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een eenvoudige KDE-toepassing
+Comment[pl]=Prosty program KDE
+Comment[pt]=Uma aplicação simples do KDE
+Comment[pt_BR]=Um simples Aplicativo do KDE
+Comment[ru]=ПроÑтое приложение KDE
+Comment[sk]=Jednoduchá KDE aplikácia
+Comment[sl]=Preprost program za KDE
+Comment[sr]=ЈедноÑтаван KDE програм
+Comment[sr@Latn]=Jednostavan KDE program
+Comment[sv]=Ett enkelt KDE-program
+Comment[ta]=ஒர௠சாதாரண கெடிஇ பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Гузориши оддиKDE
+Comment[tr]=Basit bir KDE Uygulaması
+Comment[zh_CN]=一个简å•çš„ KDE 应用程åº
+Comment[zh_TW]=簡單的 KDE 應用程å¼
diff --git a/languages/cpp/app_templates/kxt/app.h b/languages/cpp/app_templates/kxt/app.h
new file mode 100644
index 00000000..22037de2
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/app.h
@@ -0,0 +1,66 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <kmainwindow.h>
+
+#include "%{APPNAMELC}view.h"
+
+class KPrinter;
+class KToggleAction;
+class KURL;
+
+/**
+ * This class serves as the main window for %{APPNAME}. It handles the
+ * menus, toolbars, and status bars.
+ *
+ * @short Main window class
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAMELC} : public KMainWindow
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ %{APPNAMELC}();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~%{APPNAMELC}();
+
+private slots:
+ void fileNew();
+ void optionsShowToolbar();
+ void optionsShowStatusbar();
+ void optionsConfigureKeys();
+ void optionsConfigureToolbars();
+ void optionsPreferences();
+ void newToolbarConfig();
+
+ void changeStatusbar(const QString& text);
+ void changeCaption(const QString& text);
+
+private:
+ void setupAccel();
+ void setupActions();
+
+private:
+ %{APPNAMELC}View *m_view;
+
+ KPrinter *m_printer;
+ KToggleAction *m_toolbarAction;
+ KToggleAction *m_statusbarAction;
+};
+
+#endif // _%{APPNAMEUC}_H_
+
diff --git a/languages/cpp/app_templates/kxt/app.kcfg b/languages/cpp/app_templates/kxt/app.kcfg
new file mode 100644
index 00000000..686f25f2
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/app.kcfg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="%{APPNAMELC}rc"/>
+ <group name="Preferences">
+ <entry name="col_background" type="Color">
+ <label>color of the background</label>
+ <default>black</default>
+ </entry>
+ <entry name="col_foreground" type="Color">
+ <label>color of the foreground</label>
+ <default>yellow</default>
+ </entry>
+ <entry name="val_time" type="Int">
+ <label>size of a ball</label>
+ <default>2</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/languages/cpp/app_templates/kxt/app.kdevelop b/languages/cpp/app_templates/kxt/app.kdevelop
new file mode 100644
index 00000000..e6a14fff
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/app.kdevelop
@@ -0,0 +1,169 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <ignoreparts/>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>false</terminal>
+ </run>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ </make>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs/>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ <runappinappdirectory>true</runappinappdirectory>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions/>
+ <updateoptions>-dP</updateoptions>
+ <addoptions/>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions/>
+ <rshoptions/>
+ </kdevcvs>
+ <cppsupportpart>
+ <codecompletion/>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL/>
+ <implementationURL/>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/kxt/appui.rc b/languages/cpp/app_templates/kxt/appui.rc
new file mode 100644
index 00000000..06549878
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="move"><text>&amp;Move</text>
+ <Action name="switch_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/cpp/app_templates/kxt/appview.cpp b/languages/cpp/app_templates/kxt/appview.cpp
new file mode 100644
index 00000000..35e23682
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/appview.cpp
@@ -0,0 +1,41 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}view.h"
+#include "settings.h"
+
+#include <klocale.h>
+#include <qlabel.h>
+
+%{APPNAMELC}View::%{APPNAMELC}View(QWidget *parent)
+ : %{APPNAMELC}view_base(parent)
+{
+ settingsChanged();
+}
+
+%{APPNAMELC}View::~%{APPNAMELC}View()
+{
+
+}
+
+void %{APPNAMELC}View::switchColors()
+{
+ // switch the foreground/background colors of the label
+ QColor color = Settings::col_background();
+ Settings::setCol_background( Settings::col_foreground() );
+ Settings::setCol_foreground( color );
+
+ settingsChanged();
+}
+
+void %{APPNAMELC}View::settingsChanged()
+{
+ sillyLabel->setPaletteBackgroundColor( Settings::col_background() );
+ sillyLabel->setPaletteForegroundColor( Settings::col_foreground() );
+
+ // i18n : internationalization
+ sillyLabel->setText( i18n("This project is %1 days old").arg(Settings::val_time()) );
+ emit signalChangeStatusbar( i18n("Settings changed") );
+}
+
+#include "%{APPNAMELC}view.moc"
+
diff --git a/languages/cpp/app_templates/kxt/appview.h b/languages/cpp/app_templates/kxt/appview.h
new file mode 100644
index 00000000..45a10de7
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/appview.h
@@ -0,0 +1,52 @@
+%{H_TEMPLATE}
+
+#ifndef _%{APPNAMEUC}VIEW_H_
+#define _%{APPNAMEUC}VIEW_H_
+
+#include <qwidget.h>
+
+#include "%{APPNAMELC}view_base.h"
+
+class QPainter;
+class KURL;
+
+/**
+ * This is the main view class for %{APPNAME}. Most of the non-menu,
+ * non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ * here.
+ *
+ * @short Main view
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+class %{APPNAMELC}View : public %{APPNAMELC}view_base
+{
+ Q_OBJECT
+public:
+ /**
+ * Default constructor
+ */
+ %{APPNAMELC}View(QWidget *parent);
+
+ /**
+ * Destructor
+ */
+ virtual ~%{APPNAMELC}View();
+
+signals:
+ /**
+ * Use this signal to change the content of the statusbar
+ */
+ void signalChangeStatusbar(const QString& text);
+
+ /**
+ * Use this signal to change the content of the caption
+ */
+ void signalChangeCaption(const QString& text);
+
+private slots:
+ void switchColors();
+ void settingsChanged();
+};
+
+#endif // _%{APPNAMEUC}VIEW_H_
diff --git a/languages/cpp/app_templates/kxt/appview_base.ui b/languages/cpp/app_templates/kxt/appview_base.ui
new file mode 100644
index 00000000..626d95df
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/appview_base.ui
@@ -0,0 +1,33 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>%{APPNAMELC}view_base</class>
+<widget class="QWidget">
+<property name="name">
+<cstring>%{APPNAMELC}view_base</cstring>
+</property>
+<property name="geometry">
+<rect>
+<x>0</x>
+<y>0</y>
+<width>268</width>
+<height>164</height>
+</rect>
+</property>
+<property name="caption">
+<string>%{APPNAMELC}_base</string>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel" row="0" column="0">
+<property name="name">
+<cstring>sillyLabel</cstring>
+</property>
+<property name="text">
+<string>hello, world</string>
+</property>
+</widget>
+</grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/kxt/kxt.kdevtemplate b/languages/cpp/app_templates/kxt/kxt.kdevtemplate
new file mode 100644
index 00000000..a7a23298
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/kxt.kdevtemplate
@@ -0,0 +1,269 @@
+# KDE Config File
+[General]
+Name=KConfig XT application
+Name[ca]=Aplicació KConfig XT
+Name[da]=KConfig XT program
+Name[de]=KConfigXT-Anwendung
+Name[el]=ΕφαÏμογή KConfig XT
+Name[es]=Aplicación KConfig XT
+Name[et]=KConfig XT rakendus
+Name[eu]=KConfig XT aplikazioa
+Name[fa]=کاربرد KConfig XT
+Name[fr]=Application KConfig XT
+Name[ga]=Feidhmchlár XT KConfig
+Name[gl]=Aplicación KConfig XT
+Name[hu]=KConfig XT-alapú alkalmazás
+Name[it]=Applicazione KConfig XT
+Name[ja]=KConfig XT アプリケーション
+Name[nds]=KConfig-XT-Programm
+Name[ne]=KConfig XT अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=KConfig XT-toepassing
+Name[pl]=Program KConfig XT
+Name[pt]=Aplicação do KConfig XT
+Name[pt_BR]=Aplicação do KConfig XT
+Name[ru]=Приложение KDE Ñ KConfig XT
+Name[sk]=KConfig XT aplikácia
+Name[sr]=KConfig XT програм
+Name[sr@Latn]=KConfig XT program
+Name[sv]=KConfig XT-program
+Name[tr]=KConfig XT uygulaması
+Name[zh_CN]=KConfig XT 应用程åº
+Name[zh_TW]=KConfig XT 應用程å¼
+Category=C++/KDE
+Icon=kxt.png
+Comment=Generates a simple KDE application with one widget and a configuration dialog
+Comment[ca]=Genera una simple aplicació per al KDE amb un estri i un diàleg de configuració
+Comment[da]=Genererer et simpelt KDE-program med en kontrol og en indstillingsdialog
+Comment[de]=Erstellt eine einfache KDE-Anwendung mit einem Widget und einem Einstellungsdialog.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή KDE με ένα γÏαφικό συστατικό, ένα διάλογο ÏÏθμισης
+Comment[en_GB]=Generates a simple KDE application with one widget and a configuration dialogue
+Comment[es]=Genera una sencilla aplicación para KDE con una ventana y un diálogo de configuración
+Comment[et]=Lihtsa KDE rakenduse loomine ühe vidina ja seadistustedialoogiga.
+Comment[eu]=Trepeta bat eta konfigurazio elkarrizketa-koadro bat duen KDE aplikazio sinple bat sortzen du
+Comment[fa]=یک کاربرد سادۀ KDE، با یک عنصر و یک محاورۀ پیکربندی تولید می‌کند
+Comment[fr]=Génère une application KDE simple comprenant un seul élément graphique (widget) et une boîte de dialogue de configuration
+Comment[ga]=Cruthaíonn sé seo feidhmchlár simplí KDE le giuirléid amháin agus dialóg chumraíochta
+Comment[gl]=Xera unha aplicación KDE sinxela cunha compoñente e un diálogo de configuración
+Comment[hu]=Létrehoz egy egyszerű KDE-alkalmazást egy grafikus elemmel és egy beállítóablakkal
+Comment[it]=Genera una semplice applicazione KDE con un elemento grafico e una finestra di configurazione
+Comment[ja]=一ã¤ã®ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆã¨è¨­å®šãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’å«ã‚€ç°¡å˜ãª KDE アプリケーションを作æˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach KDE-Programm mit een Element un en Instelldialoog op
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ विगेट र कनà¥à¤«à¤¿à¤—रेसन संवादसà¤à¤— साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudige KDE-toepassing met één widget en een configuratiedialoog
+Comment[pl]=Generuje prosty program KDE z jednym widgetem i oknem konfiguracyjnym
+Comment[pt]=Gera uma aplicação simples do KDE com uma janela principal e outra para configuração
+Comment[pt_BR]=Gera uma aplicação simples do KDE com uma janela principal e outra para configuração
+Comment[ru]=Создание Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE Ñ Ð¾ÐºÐ½Ð¾Ð¼ конфигурации
+Comment[sk]=Vygeneruje jednoduchú KDE aplikáciu s jedným oknom a konfiguraÄným dialógom
+Comment[sr]=Прави једноÑтаван KDE програм Ñа једном контролом и дијалогом за подешавање
+Comment[sr@Latn]=Pravi jednostavan KDE program sa jednom kontrolom i dijalogom za podešavanje
+Comment[sv]=Skapar ett enkelt KDE-program med en grafisk komponent och en inställningsdialogruta
+Comment[tr]=Bir parçacığı ve ayar penceresi olan basit bir KDE uygulaması yaratır.
+Comment[zh_CN]=生æˆå¸¦ä¸€ä¸ªéƒ¨ä»¶å’Œä¸€ä¸ªé…置对è¯æ¡†çš„ç®€å• KDE 应用程åº
+Comment[zh_TW]=產生一個簡單的 KDE 應用程å¼ï¼Œå…§å«ä¸€å€‹å…ƒä»¶èˆ‡ä¸€å€‹è¨­å®šå°è©±æ¡†ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=kxt.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE13]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE14]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE16]
+Type=install
+Source=%{src}/app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE17]
+Type=install
+EscapeXML=true
+Source=%{src}/appview_base.ui
+Dest=%{dest}/src/%{APPNAMELC}view_base.ui
+
+[FILE18]
+Type=install
+Source=%{src}/appview.cpp
+Dest=%{dest}/src/%{APPNAMELC}view.cpp
+
+[FILE19]
+Type=install
+Source=%{src}/appview.h
+Dest=%{dest}/src/%{APPNAMELC}view.h
+
+[FILE20]
+Type=install
+EscapeXML=true
+Source=%{src}/prefs-base.ui
+Dest=%{dest}/src/prefs-base.ui
+
+[FILE21]
+Type=install
+Source=%{src}/prefs.cpp
+Dest=%{dest}/src/prefs.cpp
+
+[FILE22]
+Type=install
+Source=%{src}/prefs.h
+Dest=%{dest}/src/prefs.h
+
+[FILE23]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE24]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE25]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/src/README
+
+[FILE26]
+Type=install
+Source=%{src}/app.kcfg
+Dest=%{dest}/src/%{APPNAMELC}.kcfg
+
+[FILE27]
+Type=install
+Source=%{src}/settings.kcfgc
+Dest=%{dest}/src/settings.kcfgc
+
+[FILE28]
+Type=install
+Source=%{src}/src-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MSG]
+Type=message
+Comment=A KConfig XT application was created in %{dest}
+Comment[ca]=Una aplicació KConfig XT ha estat creada en %{dest}
+Comment[da]=Et KConfig XT-program blev oprettet i %{dest}
+Comment[de]=Eine KConfig-XT-Anwendung wurde in %{dest} erstellt
+Comment[el]=Μια εφαÏμογή KConfig XT δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación KConfig XT ha sido creada en %{dest}
+Comment[et]=A KConfig XT rakendus loodi asukohta %{dest}
+Comment[eu]=KConfig XT aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد KConfig XT در %{dest} ایجاد شد
+Comment[fr]=Une application KConfig XT a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár XT KConfig i %{dest}
+Comment[gl]=Creouse unha aplicación KConfig XT en %{dest}
+Comment[hu]=Létrejött egy KConfig XT-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione KConfig XT in %{dest}
+Comment[ja]=KConfig XT アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KConfig-XT-Programm opstellt
+Comment[ne]=KConfig XT अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een KConfig XT-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program KConfig XT został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do KConfig XT em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do KConfig XT em %{dest}
+Comment[ru]=Приложение KDE Ñ KConfig XT Ñоздано в %{dest}
+Comment[sk]=KConfig XT aplikácia bola vytvorená v %{dest}
+Comment[sr]=KConfig XT програм је направљен у %{dest}
+Comment[sr@Latn]=KConfig XT program je napravljen u %{dest}
+Comment[sv]=Ett KConfig XT-program skapades i %{dest}
+Comment[tr]=Bir KConfig XT uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了 KConfig XT 应用程åº
+Comment[zh_TW]=一個 KConfig XT 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/kxt/kxt.png b/languages/cpp/app_templates/kxt/kxt.png
new file mode 100644
index 00000000..5a4b6359
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/kxt.png
Binary files differ
diff --git a/languages/cpp/app_templates/kxt/main.cpp b/languages/cpp/app_templates/kxt/main.cpp
new file mode 100644
index 00000000..66f038c9
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/main.cpp
@@ -0,0 +1,57 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static const char description[] =
+ I18N_NOOP("A KDE Application");
+
+static const char version[] = "%{VERSION}";
+
+static KCmdLineOptions options[] =
+{
+ { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KAboutData::License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", 0, 0, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", 0, "%{EMAIL}" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KApplication app;
+
+ // see if we are starting with session management
+ if (app.isRestored())
+ {
+ RESTORE(%{APPNAMELC});
+ }
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->count() == 0)
+ {
+ %{APPNAMELC} *widget = new %{APPNAMELC};
+ widget->show();
+ }
+ else
+ {
+ int i = 0;
+ for (; i < args->count(); i++)
+ {
+ %{APPNAMELC} *widget = new %{APPNAMELC};
+ widget->show();
+ }
+ }
+ args->clear();
+ }
+
+ return app.exec();
+}
+
diff --git a/languages/cpp/app_templates/kxt/prefs-base.ui b/languages/cpp/app_templates/kxt/prefs-base.ui
new file mode 100644
index 00000000..5c0fc860
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/prefs-base.ui
@@ -0,0 +1,127 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>Prefs_base</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Prefs_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>282</width>
+ <height>156</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Background color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_col_background</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Project age:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Foreground color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="1" column="1">
+ <property name="name">
+ <cstring>kcfg_col_foreground</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox" row="2" column="1">
+ <property name="name">
+ <cstring>kcfg_val_time</cstring>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/app_templates/kxt/prefs.cpp b/languages/cpp/app_templates/kxt/prefs.cpp
new file mode 100644
index 00000000..e7a46ddf
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/prefs.cpp
@@ -0,0 +1,12 @@
+%{CPP_TEMPLATE}
+
+#include "prefs.h"
+#include <kdebug.h>
+
+Prefs::Prefs()
+ : Prefs_base()
+{
+// debugging :
+// kdWarning()<<"creating a pref dialog"<<endl;
+}
+
diff --git a/languages/cpp/app_templates/kxt/prefs.h b/languages/cpp/app_templates/kxt/prefs.h
new file mode 100644
index 00000000..9106fe59
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/prefs.h
@@ -0,0 +1,11 @@
+%{H_TEMPLATE}
+
+#include "prefs-base.h"
+
+
+class Prefs : public Prefs_base
+{
+ public:
+ Prefs();
+};
+
diff --git a/languages/cpp/app_templates/kxt/preview.png b/languages/cpp/app_templates/kxt/preview.png
new file mode 100644
index 00000000..e235c9cf
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/preview.png
Binary files differ
diff --git a/languages/cpp/app_templates/kxt/settings.kcfgc b/languages/cpp/app_templates/kxt/settings.kcfgc
new file mode 100644
index 00000000..384510cd
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/settings.kcfgc
@@ -0,0 +1,6 @@
+# Code generation options for kconfig_compiler
+File=%{APPNAMELC}.kcfg
+ClassName=Settings
+Singleton=true
+Mutators=col_background,col_foreground
+# will create the necessary code for setting those variables
diff --git a/languages/cpp/app_templates/kxt/src-Makefile.am b/languages/cpp/app_templates/kxt/src-Makefile.am
new file mode 100644
index 00000000..5f7936da
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/src-Makefile.am
@@ -0,0 +1,41 @@
+## Makefile.am for %{APPNAMELC}
+
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+
+# the libraries to link against.
+%{APPNAMELC}_LDADD = $(LIB_KFILE) $(LIB_KDEPRINT)
+
+# which sources should be compiled for %{APPNAMELC}
+%{APPNAMELC}_SOURCES = settings.kcfgc main.cpp %{APPNAMELC}.cpp %{APPNAMELC}view.cpp \
+ %{APPNAMELC}view_base.ui prefs-base.ui prefs.cpp
+
+xdg_apps_DATA = %{APPNAMELC}.desktop
+kde_kcfg_DATA = %{APPNAMELC}.kcfg
+
+# these are the headers for your project
+noinst_HEADERS = %{APPNAMELC}.h %{APPNAMELC}view.h prefs.h
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/%{APPNAMELC}.pot
+
+KDE_ICON = AUTO
+
+# this is where the kdelnk file will go
+kdelnkdir = $(kde_appsdir)/Utilities
+kdelnk_DATA = %{APPNAMELC}.desktop
+
+# this is where the XML-GUI resource file goes
+rcdir = $(kde_datadir)/%{APPNAMELC}
+rc_DATA = %{APPNAMELC}ui.rc
diff --git a/languages/cpp/app_templates/kxt/src-configure.in.in b/languages/cpp/app_templates/kxt/src-configure.in.in
new file mode 100644
index 00000000..61d4a7fd
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/src-configure.in.in
@@ -0,0 +1,7 @@
+
+#MIN_CONFIG(3.2.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
diff --git a/languages/cpp/app_templates/kxt/subdirs b/languages/cpp/app_templates/kxt/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/kxt/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/makefileempty/Makefile.am b/languages/cpp/app_templates/makefileempty/Makefile.am
new file mode 100644
index 00000000..87f1db69
--- /dev/null
+++ b/languages/cpp/app_templates/makefileempty/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = makefileempty-Makefile \
+ makefileempty.png app.kdevelop
+templateName = makefileempty
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/makefileempty/app.kdevelop b/languages/cpp/app_templates/makefileempty/app.kdevelop
new file mode 100644
index 00000000..a0b41f59
--- /dev/null
+++ b/languages/cpp/app_templates/makefileempty/app.kdevelop
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ </general>
+ <run>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="cpp"/>
+ <type ext="h"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.h" name="Header files" />
+ <group pattern="*.cpp" name="Source files" />
+ </groups>
+ </kdevfileview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/makefileempty/makefileempty-Makefile b/languages/cpp/app_templates/makefileempty/makefileempty-Makefile
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/makefileempty/makefileempty-Makefile
diff --git a/languages/cpp/app_templates/makefileempty/makefileempty.kdevtemplate b/languages/cpp/app_templates/makefileempty/makefileempty.kdevtemplate
new file mode 100644
index 00000000..bacfcae0
--- /dev/null
+++ b/languages/cpp/app_templates/makefileempty/makefileempty.kdevtemplate
@@ -0,0 +1,85 @@
+# KDE Config File
+[General]
+Name=Empty Custom Makefile Template
+Name[ca]=Plantilla Makefile personalitzada buida
+Name[da]=Tom brugertilpasset Makefile-skabelon
+Name[de]=Leere Vorlage für benutzerdefiniertes Makefile
+Name[el]=Κενό Ï€ÏοσαÏμοσμένο Ï€Ïότυπο Makefile
+Name[es]=Plantilla vacía para Makefile personalizado
+Name[et]=Tühi kohandatud makefile'i mall
+Name[hu]=Üres egyedi Makefile-ra épülő sablon
+Name[it]=Modello di makefile personalizzato vuoto
+Name[nds]=Egen leddig Makefile-Vörlaag
+Name[nl]=Leeg aangepast Makefile-sjabloon
+Name[pl]=Pusty własny szablon pliku Makefile
+Name[pt]=Modelo de Makefile Personalizada Vazio
+Name[pt_BR]=Modelo de Makefile Personalizada Vazio
+Name[ru]=ПуÑтой шаблон Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑким Makefile
+Name[sk]=Prázdna šablóna pre vlastný Makefile
+Name[sr]=Празан шаблон поÑебног Ñправифајла
+Name[sr@Latn]=Prazan Å¡ablon posebnog spravifajla
+Name[sv]=Tom mall för egen byggfil
+Name[zh_TW]=空的自訂 Makefile 樣æ¿
+Icon=makefileempty.png
+Category=C++
+Comment=Generate an empty Custom Makefile based application
+Comment[ca]=Genera una aplicació personalitzada buida basada en Makefile
+Comment[da]=Opretter et tomt brugertilpasset Makefile-baseret program
+Comment[de]=Erstellt eine auf einem benutzerdefinierten Makefile basierende Anwendung
+Comment[el]=ΔημιουÏγία μίας κενής εφαÏμογής βασισμένης σε Ï€ÏοσαÏμοσμένο Makefile
+Comment[es]=Genera una aplicación vacía basada en un Makefile personalizado
+Comment[et]=Tühja rakenduse loomine kohandatud makefile'i põhjal
+Comment[hu]=Létrehoz egy egyedi Makefile-ra épülő alkalmazást
+Comment[it]=Genera un'applicazione basata su makefile personalizzato
+Comment[nds]=Stellt en leddig Programm op, dat op en egen Makefile opbuut
+Comment[nl]=Genereer een leeg op een aangepast Makefile gebaseerd programma
+Comment[pl]=Generuje pusty program z własnym plikiem Makefile
+Comment[pt]=Gera uma aplicação baseada em Makefile's personalizadas
+Comment[pt_BR]=Gera uma aplicação baseada em Makefile's personalizadas
+Comment[ru]=Создание каркаÑа приложениÑ, иÑпользующего пользовательÑкий Makefile
+Comment[sk]=Vygeneruje prázdnu aplikáciu založenú na vlastnom Makefile
+Comment[sr]=Прави програм на оÑнову поÑебног Ñправифајла
+Comment[sr@Latn]=Pravi program na osnovu posebnog spravifajla
+Comment[sv]=Skapar ett tomt program baserat på en egen byggfil
+Comment[zh_TW]=產生一個空的使用自訂 Makefile 的應用程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+Archive=makefileempty.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE2]
+Type=install
+Source=%{src}/makefileempty-Makefile
+Dest=%{dest}/Makefile
+
+[MSG]
+Type=message
+Comment=A Custom Makefile based application was created in %{dest}
+Comment[ca]=S'ha creat una aplicació basada en Makefile en %{dest}
+Comment[da]=Et brugertilpasset Makefile-baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf einem benutzerdefinierten Makefile basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=ΔημιουÏγήθηκε μία εφαÏμογή βασισμένη σε Ï€ÏοσαÏμοσμένο Makefile στο %{dest}
+Comment[es]=Una aplicación basada en un Makefile personalizado ha sido creada en %{dest}
+Comment[et]=Rakendus kohandatud makefile'i põhjal loodi asukohta %{dest}
+Comment[hu]=Létrejött egy egyedi Makefile-ra épülő alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su un makefile personalizzato in %{dest}
+Comment[nds]=In %{dest} wöör en Programm opstellt, dat op en egen Makefile opbuut
+Comment[nl]=Een op een aangepast Makefile gebaseerd programma is aangemaakt in %{dest}
+Comment[pl]=Program używający własnego Makefile został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada em Makefile's personalizadas em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada em Makefile's personalizadas em %{dest}
+Comment[ru]=Приложение Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑким Makefile Ñоздано в %{dest}
+Comment[sk]=Aplikácia založená na vlastnom Makefile bola vytvorená v %{dest}
+Comment[sr]=Програм на оÑнову поÑебног Ñправифајла направљен је у %{dest}
+Comment[sr@Latn]=Program na osnovu posebnog spravifajla napravljen je u %{dest}
+Comment[sv]=Ett program baserat på en egen byggfil skapades i %{dest}
+Comment[zh_TW]=一個以自訂 Makefile 為基礎的應用程å¼å·²å»ºç«‹æ–¼ %{dest}
+
diff --git a/languages/cpp/app_templates/makefileempty/makefileempty.png b/languages/cpp/app_templates/makefileempty/makefileempty.png
new file mode 100644
index 00000000..519c007b
--- /dev/null
+++ b/languages/cpp/app_templates/makefileempty/makefileempty.png
Binary files differ
diff --git a/languages/cpp/app_templates/noatunui/.kdev_ignore b/languages/cpp/app_templates/noatunui/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/.kdev_ignore
diff --git a/languages/cpp/app_templates/noatunui/Makefile.am b/languages/cpp/app_templates/noatunui/Makefile.am
new file mode 100644
index 00000000..29358f2f
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = src-Makefile.am plugin_app.cpp plugin_impl.cpp plugin_impl.h \
+ noatunui.png plugin.plugin plugin.kdevelop subdirs
+templateName = noatunui
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/noatunui/noatunui b/languages/cpp/app_templates/noatunui/noatunui
new file mode 100644
index 00000000..631c4798
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/noatunui
@@ -0,0 +1,8 @@
+# KDE Config File
+[General]
+Name=Noatun UI plugin
+Icon=noatunui.png
+Category=C++/KDE
+Comment=Generates a simple user interface plugin for noatun.
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/plugin_APPNAMELC_impl.cpp
diff --git a/languages/cpp/app_templates/noatunui/noatunui.kdevtemplate b/languages/cpp/app_templates/noatunui/noatunui.kdevtemplate
new file mode 100644
index 00000000..394e71ed
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/noatunui.kdevtemplate
@@ -0,0 +1,195 @@
+# KDE Config File
+[General]
+Name=Noatun UI plugin
+Name[ca]=Connector d'interfície d'usuari per a Noatun
+Name[de]=Noatun-UI-Modul
+Name[el]=ΠÏόσθετο Noatun UI
+Name[es]=Complemento de interfaz de usuario para Noatun
+Name[et]=Noatuni kasutajaliidese plugin
+Name[eu]=Noatun UI plugina
+Name[fa]=وصلۀ Noatun UI
+Name[fr]=Module externe d'interface utilisateur pour Noatun
+Name[ga]=Breiseán Chomhéadan Noatun
+Name[gl]=Extensión para a IU de Noatun
+Name[hu]=Noatun UI-modul
+Name[it]=Plugin UI di noatun
+Name[ja]=Noatun UI プラグイン
+Name[nds]=Böversiet-Moduul för Noatun
+Name[ne]=नोअटन UI plugin
+Name[nl]=Noatun UI-plugin
+Name[pl]=Wtyczka do interfejsu użytkownika Noatun
+Name[pt]='Plugin' de UI do Noatun
+Name[pt_BR]='Plugin' de UI do Noatun
+Name[ru]=Модуль интерфейÑа Noatun
+Name[sk]=Noatun UI modul
+Name[sr]=UI прикључак за Noatun
+Name[sr@Latn]=UI prikljuÄak za Noatun
+Name[sv]=Noatun-insticksprogram för användargränssnitt
+Name[tr]=Noatun Arayüz eklentisi
+Name[zh_CN]=Noatun ç•Œé¢æ’件
+Name[zh_TW]=Noatun 使用者介é¢å¤–掛程å¼
+Icon=noatunui.png
+Category=C++/KDE
+Comment=Generates a simple user interface plugin for noatun.
+Comment[ca]=Genera un simple connector d'interfície d'usuari per a Noatun.
+Comment[da]=Genererer en simpel brugergrænseflade-plugin for noatun.
+Comment[de]=Erstellt ein einfaches Oberflächen-Modul für Noatun
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€Ïόσθετο γÏÎ±Ï†Î¹ÎºÎ¿Ï Ï€ÎµÏιβάλλοντος για το noatun.
+Comment[es]=Genera un complemento de interfaz de usuario para Noatun.
+Comment[et]=Noatuni lihtsa kasutajaliidese plugina loomine.
+Comment[eu]=Noatun-entzat erabiltzaile-interfazerako plugin sinple bat sortzen du.
+Comment[fa]=یک وصلۀ واسط کاربر ساده برای noatun تولید می‌کند.
+Comment[fr]=Génère un module externe d'interface utilisateur simple pour Noatun.
+Comment[gl]=Xera unha extensión sinxela para a interface de usuario de noatun.
+Comment[hu]=Létrehoz egy egyszerű felületbővítő modult a Noatun programhoz.
+Comment[it]=Genera un semplice plugin di interfaccia per noatun.
+Comment[nds]=Stellt en eenfach Böversietmoduul för Noatun op.
+Comment[ne]=नोअटनका लागि साधारण इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸ पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een eenvoudige gebruikersinterfaceplugin voor Noatun.
+Comment[pl]=Generuje prostą wtyczkę do interfejsu użytkownika programu Noatun.
+Comment[pt]=Gera um 'plugin' simples para a interface de utilizador do Noatun.
+Comment[pt_BR]=Gera um 'plugin' simples para a interface de utilizador do Noatun.
+Comment[ru]=Создание проÑтого интерфейÑа Ð´Ð»Ñ Noatun.
+Comment[sk]=Vygeneruje jednoduchý modul užívateľského rozhrania pre Noatun
+Comment[sr]=Прави једноÑтаван прикључак кориÑничког интерфејÑа за Noatun.
+Comment[sr@Latn]=Pravi jednostavan prikljuÄak korisniÄkog interfejsa za Noatun.
+Comment[sv]=Skapar ett enkelt insticksprogram för användargränssnitt till Noatun.
+Comment[tr]=Noatun için basit bir kullanıcı arayüzü eklentisi yaratır.
+Comment[zh_CN]=ç”Ÿæˆ noatun 的简å•ç”¨æˆ·ç•Œé¢æ’件。
+Comment[zh_TW]=產生一個簡單的 noatun 的使用者介é¢å¤–掛程å¼ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/plugin_%{APPNAMELC}_impl.cpp
+Archive=noatunui.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/plugin.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/plugin_app.cpp
+Dest=%{dest}/src/plugin_%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/plugin_impl.cpp
+Dest=%{dest}/src/plugin_%{APPNAMELC}_impl.cpp
+
+[FILE14]
+Type=install
+Source=%{src}/plugin_impl.h
+Dest=%{dest}/src/plugin_%{APPNAMELC}_impl.h
+
+[FILE15]
+Type=install
+Source=%{src}/plugin.plugin
+Dest=%{dest}/src/%{APPNAMELC}.plugin
+
+[MSG]
+Type=message
+Comment=A Noatun UI plugin was created in %{dest}
+Comment[ca]=Un connector d'interfície d'usuari per a Noatun ha estat creat en %{dest}
+Comment[da]=Et Noatun UI-plugin blev oprettet i %{dest}
+Comment[de]=Ein Oberflächen-Modul für Noatun wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο Noatun UI δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento de interfaz de usuario para Noatun ha sido creado en %{dest}
+Comment[et]=Noatuni kasutajaliidese plugin loodi asukohta %{dest}
+Comment[eu]=Noatun UI plugin bat sortu da hemen: %{dest}
+Comment[fa]=یک وصلۀ Noatun UI در %{dest} ایجاد شد
+Comment[fr]=Un module externe d'interface utilisateur pour Noatun a été créé dans %{dest}
+Comment[ga]=Cruthaíodh breiseán chomhéadan Noatun i %{dest}
+Comment[gl]=Creouse unha extensión para a IU de Noatun en %{dest}
+Comment[hu]=Létrejött egy Noatun UI-modul itt: %{dest}
+Comment[it]=È stato creato un plugin UI per noatun in %{dest}
+Comment[ja]=Noatun UI プラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Noatun-Böversietmoduul opstellt
+Comment[ne]=नोअटन UI पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Noatun UI-plugin is aangemaakt in %{dest}
+Comment[pl]=Wtyczka do interfejsu Noatun została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' da UI do Noatun em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' da UI do Noatun em %{dest}
+Comment[ru]=Модуль интерфейÑа Ð´Ð»Ñ Noatun Ñоздан в %{dest}
+Comment[sk]=Noatun UI modul bol vytvorený v %{dest}
+Comment[sr]=UI прикључак за Noatun направљен је у %{dest}
+Comment[sr@Latn]=UI prikljuÄak za Noatun napravljen je u %{dest}
+Comment[sv]=Ett Noatun-insticksprogram för användargränssnitt skapades i %{dest}
+Comment[tr]=Bir Noatun Arayüz eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 Noatun ç•Œé¢æ’件
+Comment[zh_TW]=一個 Noatun 使用者介é¢å¤–掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/noatunui/noatunui.png b/languages/cpp/app_templates/noatunui/noatunui.png
new file mode 100644
index 00000000..0d2c3e30
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/noatunui.png
Binary files differ
diff --git a/languages/cpp/app_templates/noatunui/plugin.kdevelop b/languages/cpp/app_templates/noatunui/plugin.kdevelop
new file mode 100644
index 00000000..f0cda142
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/plugin.kdevelop
@@ -0,0 +1,111 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+<kdevautoproject>
+ <general>
+ <activetarget>src/noatun_%{APPNAMELC}plugin.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/noatunui/plugin.plugin b/languages/cpp/app_templates/noatunui/plugin.plugin
new file mode 100644
index 00000000..a7bb9170
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/plugin.plugin
@@ -0,0 +1,8 @@
+Filename=noatun_%{APPNAMELC}plugin.la
+Author=%{AUTHOR}
+Site=http://noatun.kde.org/
+Email=%{EMAIL}
+Type=userinterface
+License=$LICENSE$
+Name=%{APPNAME}
+Comment=A UI for Noatun
diff --git a/languages/cpp/app_templates/noatunui/plugin_app.cpp b/languages/cpp/app_templates/noatunui/plugin_app.cpp
new file mode 100644
index 00000000..23067139
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/plugin_app.cpp
@@ -0,0 +1,15 @@
+
+#include "plugin_%{APPNAMELC}_impl.h"
+
+#include <kglobal.h>
+#include <klocale.h>
+
+extern "C"
+{
+ Plugin *create_plugin()
+ {
+ KGlobal::locale()->insertCatalogue("%{APPNAMELC}");
+ return new %{APPNAME}UI;
+ }
+}
+
diff --git a/languages/cpp/app_templates/noatunui/plugin_impl.cpp b/languages/cpp/app_templates/noatunui/plugin_impl.cpp
new file mode 100644
index 00000000..1b5eea45
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/plugin_impl.cpp
@@ -0,0 +1,301 @@
+
+#include "plugin_%{APPNAMELC}_impl.h"
+#include "plugin_%{APPNAMELC}_impl.moc"
+
+#include <noatun/playlist.h>
+#include <noatun/stdaction.h>
+#include <noatun/app.h>
+#include <noatun/player.h>
+#include <noatun/controls.h>
+#include <noatun/effects.h>
+
+#include <qpushbutton.h>
+#include <qdragobject.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qobjectlist.h>
+#include <qobjectdict.h>
+
+#include <kpopupmenu.h>
+#include <kstatusbar.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kurldrag.h>
+//#include <kfiledialog.h>
+//#include <kconfig.h>
+
+%{APPNAME}UI::%{APPNAME}UI() : QWidget(0,"%{APPNAME}UI"), UserInterface()
+{
+ setAcceptDrops(true);
+ static const int buttonSize=32;
+
+ mBack=new QPushButton(this);
+ mBack->setFixedSize(buttonSize,buttonSize);
+ mBack->setPixmap(BarIcon("noatunback"));
+ connect(mBack, SIGNAL(clicked()), napp->player(), SLOT(back()));
+ QToolTip::add(mBack,i18n("Back"));
+
+ mStop=new QPushButton(this);
+ mStop->setFixedSize(buttonSize,buttonSize);
+ mStop->setPixmap(BarIcon("noatunstop"));
+ connect(mStop, SIGNAL(clicked()), napp->player(), SLOT(stop()));
+ QToolTip::add(mStop, i18n("Stop"));
+
+ mPlay=new QPushButton(this);
+ mPlay->setToggleButton(true);
+ mPlay->setFixedSize(buttonSize,buttonSize);
+ mPlay->setPixmap(BarIcon("noatunplay"));
+ connect(mPlay, SIGNAL(clicked()), napp->player(), SLOT(playpause()));
+ QToolTip::add(mPlay, i18n("Play"));
+
+ mForward=new QPushButton(this);
+ mForward->setFixedSize(buttonSize,buttonSize);
+ mForward->setPixmap(BarIcon("noatunforward"));
+ connect(mForward, SIGNAL(clicked()), napp->player(), SLOT(forward()));
+ QToolTip::add(mForward, i18n("Forward"));
+
+ mPlaylist=new QPushButton(this);
+ mPlaylist->setToggleButton(true);
+ mPlaylist->setFixedSize(buttonSize,buttonSize);
+ mPlaylist->setPixmap(BarIcon("noatunplaylist"));
+ connect(mPlaylist, SIGNAL(clicked()), napp->player(), SLOT(toggleListView()));
+ QToolTip::add(mPlaylist, i18n("Playlist"));
+
+ mLoop=new QPushButton(this);
+ mLoop->setFixedSize(buttonSize,buttonSize);
+ mLoop->setPixmap(BarIcon("noatunloopnone"));
+ connect(mLoop, SIGNAL(clicked()), napp->player(), SLOT(loop()));
+ QToolTip::add(mLoop, i18n("Change loop style"));
+
+ mPopup=new QPushButton(this);
+ mPopup->setFixedSize(buttonSize,buttonSize);
+ mPopup->setPixmap(BarIcon("noatun"));
+ connect(mPopup, SIGNAL(clicked()), SLOT(popup()));
+
+
+ mVolume=new L33tSlider(0,100,10,0, Horizontal, this);
+ mVolume->setValue(napp->player()->volume());
+ mSeeker=new L33tSlider(0,1000,10,0, Horizontal, this);
+
+ mStatusBar=new KStatusBar(this);
+
+
+ QGridLayout *l=new QGridLayout(this);
+ l->addWidget(mBack,0,0);
+ l->addWidget(mStop,0,1);
+ l->addWidget(mPlay,0,2);
+ l->addWidget(mForward,0,3);
+ l->addWidget(mPlaylist,0,4, Qt::AlignLeft);
+ l->addWidget(mLoop,0,5);
+ l->addWidget(mPopup,0,6);
+ l->addColSpacing(4, buttonSize+8);
+
+ l->addMultiCellWidget(mVolume,1,1,0,6);
+ l->addMultiCellWidget(mSeeker,2,2,0,6);
+ l->addMultiCellWidget(mStatusBar,3,3,0,6);
+
+ statusBar()->message(i18n("No File Loaded"));
+ statusBar()->insertItem("--:--/--:--", 1, 0, true);
+
+ connect(napp, SIGNAL(hideYourself()), this, SLOT(hide()) );
+ connect(napp, SIGNAL(showYourself()), this, SLOT(show()) );
+
+ connect(napp->player(), SIGNAL(playing()), this, SLOT(slotPlaying()));
+ connect(napp->player(), SIGNAL(stopped()), this, SLOT(slotStopped()));
+ connect(napp->player(), SIGNAL(paused()), this, SLOT(slotPaused()));
+ napp->player()->handleButtons();
+
+ connect(napp->player(), SIGNAL(timeout()), this, SLOT(slotTimeout()));
+ connect(napp->player(), SIGNAL(loopTypeChange(int)), this, SLOT(changeLoopType(int)));
+
+ /* This skipToWrapper is needed to pass milliseconds to Player() as everybody
+ * below the GUI is based on milliseconds instead of some unprecise thingy
+ * like seconds or mille */
+ connect(seeker(), SIGNAL(userChanged(int)), this, SLOT(skipToWrapper(int)));
+ connect(this, SIGNAL(skipTo(int)), napp->player(), SLOT(skipTo(int)));
+ connect(seeker(), SIGNAL(sliderMoved(int)), SLOT(sliderMoved(int)));
+
+ connect(mVolume, SIGNAL(sliderMoved(int)), napp->player(), SLOT(setVolume(int)));
+ connect(mVolume, SIGNAL(userChanged(int)), napp->player(), SLOT(setVolume(int)));
+
+
+ connect(napp->player(), SIGNAL(playlistShown()), SLOT(playlistShown()));
+ connect(napp->player(), SIGNAL(playlistHidden()), SLOT(playlistHidden()));
+
+ // Event Filter for the RMB
+ for (QPtrListIterator<QObject> i(*children()); i.current(); ++i)
+ (*i)->installEventFilter(this);
+
+ setCaption("Noatun");
+ setIcon(BarIcon("noatun"));
+ show();
+
+ // What it is now, stay.
+ setFixedSize(minimumSize());
+}
+
+%{APPNAME}UI::~%{APPNAME}UI()
+{
+ /** save settings here */
+}
+
+void %{APPNAME}UI::closeEvent(QCloseEvent*)
+{
+ unload();
+}
+
+void %{APPNAME}UI::showEvent(QShowEvent*e)
+{
+ QWidget::showEvent(e);
+}
+
+void %{APPNAME}UI::dragEnterEvent(QDragEnterEvent *event)
+{
+ // accept uri drops only
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void %{APPNAME}UI::dropEvent(QDropEvent *event)
+{
+ KURL::List uri;
+ if (KURLDrag::decode(event, uri))
+ {
+ for (KURL::List::Iterator i = uri.begin(); i != uri.end(); ++i)
+ napp->player()->openFile(*i, false);
+ }
+}
+
+void %{APPNAME}UI::mouseReleaseEvent(QMouseEvent *e)
+{
+ QWidget::mouseReleaseEvent(e);
+ if (e->button()!=RightButton) return;
+ NoatunStdAction::ContextMenu::showContextMenu();
+}
+
+void %{APPNAME}UI::changeStatusbar(const QString& text, const QString &text2)
+{
+ if (!text2.isNull())
+ statusBar()->changeItem(text2, 1);
+
+ statusBar()->message(!text.isNull() ? text : napp->player()->current().title());
+}
+
+void %{APPNAME}UI::changeCaption(const QString& text)
+{
+ setCaption(text);
+}
+
+void %{APPNAME}UI::popup()
+{
+ NoatunStdAction::ContextMenu::showContextMenu(
+ mapToGlobal(mPopup->geometry().bottomLeft()) );
+}
+
+void %{APPNAME}UI::slotPlaying()
+{
+ changeStatusbar(napp->player()->current().title(), napp->player()->lengthString());
+ mPlay->setOn(true);
+ mStop->setEnabled(true);
+ mPlay->setPixmap(BarIcon("noatunpause"));
+}
+
+void %{APPNAME}UI::slotStopped()
+{
+ if (!napp->player()->current()) return;
+ changeStatusbar(i18n("No File Loaded"), napp->player()->lengthString());
+ mStop->setEnabled(false);
+ mPlay->setOn(false);
+ seeker()->setValue(0);
+ mPlay->setPixmap(BarIcon("noatunplay"));
+}
+
+void %{APPNAME}UI::slotPaused()
+{
+ mStop->setEnabled(true);
+ mPlay->setOn(false);
+ mPlay->setPixmap(BarIcon("noatunplay"));
+}
+
+void %{APPNAME}UI::slotTimeout()
+{
+ mVolume->setValue(napp->player()->volume());
+
+ if (!napp->player()->current()) return;
+ if (static_cast<L33tSlider*>(seeker())->currentlyPressed()) return;
+ if (seeker())
+ {
+ seeker()->setRange ( 0, (int)napp->player()->getLength()/1000 );
+ seeker()->setValue ( (int)napp->player()->getTime()/1000 );
+ }
+ changeStatusbar(0, napp->player()->lengthString());
+}
+
+void %{APPNAME}UI::sliderMoved(int seconds)
+{
+ if (napp->player()->current())
+ changeStatusbar(0, napp->player()->lengthString(seconds*1000));
+}
+
+void %{APPNAME}UI::skipToWrapper(int second)
+{
+ emit skipTo((long)(second*1000));
+}
+
+void %{APPNAME}UI::changeLoopType(int t)
+{
+ static const int time=2000;
+ switch (t)
+ {
+ case(Player::None):
+ statusBar()->message(i18n("No looping"), time);
+ mLoop->setPixmap(BarIcon("noatunloopnone"));
+ break;
+ case(Player::Song):
+ statusBar()->message(i18n("Song looping"), time);
+ mLoop->setPixmap(BarIcon("noatunloopsong"));
+ break;
+ case(Player::Playlist):
+ statusBar()->message(i18n("Playlist looping"), time);
+ mLoop->setPixmap(BarIcon("noatunloopplaylist"));
+ break;
+ case(Player::Random):
+ statusBar()->message(i18n("Random play"), time);
+ mLoop->setPixmap(BarIcon("noatunlooprandom"));
+ }
+}
+
+bool %{APPNAME}UI::eventFilter(QObject *o, QEvent *e)
+{
+ if ((e->type() == QEvent::MouseButtonRelease)
+ && ((static_cast<QMouseEvent*>(e))->button()==RightButton))
+ {
+ mouseReleaseEvent(static_cast<QMouseEvent*>(e));
+ return true;
+ }
+
+ if (e->type() == QEvent::Wheel)
+ {
+ wheelEvent(static_cast<QWheelEvent*>(e));
+ return true;
+ }
+ return QWidget::eventFilter(o, e);
+}
+
+void %{APPNAME}UI::playlistShown()
+{
+ mPlaylist->setOn(true);
+}
+
+void %{APPNAME}UI::playlistHidden()
+{
+ mPlaylist->setOn(false);
+}
+
+void %{APPNAME}UI::wheelEvent(QWheelEvent *e)
+{
+ int delta=e->delta();
+ mVolume->setValue(mVolume->value()+(delta/120));
+ napp->player()->setVolume(mVolume->value()+(delta/120));
+}
+
diff --git a/languages/cpp/app_templates/noatunui/plugin_impl.h b/languages/cpp/app_templates/noatunui/plugin_impl.h
new file mode 100644
index 00000000..970246d4
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/plugin_impl.h
@@ -0,0 +1,78 @@
+
+#ifndef %{APPNAMEUC}_IMPL_H
+#define %{APPNAMEUC}_IMPL_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <noatun/plugin.h>
+#include <noatun/app.h>
+
+// Pref dialog pointer global now for position saving
+#include <noatun/pref.h>
+
+class Player;
+class QSlider;
+class QPushButton;
+class KStatusBar;
+
+/**
+ * @short Main window class
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version 0.1
+ * Note: You can user _every_ widget for implementing your userinterface.
+ */
+class %{APPNAME}UI : public QWidget, public UserInterface
+{
+Q_OBJECT
+public:
+ %{APPNAME}UI();
+ virtual ~%{APPNAME}UI();
+ void load(const QString& url);
+
+protected:
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void dropEvent(QDropEvent *event);
+ virtual void closeEvent(QCloseEvent*);
+ virtual void showEvent(QShowEvent*e);
+ /** RMB -> context menu */
+ virtual void mouseReleaseEvent(QMouseEvent *);
+ virtual bool eventFilter(QObject*, QEvent*);
+ /** volume control */
+ virtual void wheelEvent(QWheelEvent *e);
+
+protected:
+ QSlider *seeker() const { return mSeeker; }
+ KStatusBar *statusBar() const { return mStatusBar; }
+
+public slots:
+ void slotPlaying();
+ void slotStopped();
+ void slotPaused();
+
+ /** "show/hide playlist" button */
+ void playlistShown();
+ void playlistHidden();
+
+ void slotTimeout();
+ void sliderMoved(int seconds);
+ void changeLoopType(int t);
+ void skipToWrapper(int second);
+
+signals:
+ void skipTo( int ); // emitted by skipToWrapper()
+
+private slots:
+ void changeStatusbar(const QString& text, const QString &text2=0);
+ void changeCaption(const QString& text);
+ void popup();
+
+private:
+ QPushButton *mBack, *mStop, *mPlay, *mForward, *mPlaylist, *mPopup, *mLoop;
+ QSlider *mSeeker, *mVolume;
+ KStatusBar *mStatusBar;
+};
+
+#endif // %{APPNAMEUC}_IMPL_H
+
diff --git a/languages/cpp/app_templates/noatunui/src-Makefile.am b/languages/cpp/app_templates/noatunui/src-Makefile.am
new file mode 100644
index 00000000..95506569
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/src-Makefile.am
@@ -0,0 +1,24 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = noatun_%{APPNAMELC}plugin.la
+
+noatun_%{APPNAMELC}plugin_la_SOURCES = plugin_%{APPNAMELC}.cpp plugin_%{APPNAMELC}_impl.cpp
+noatun_%{APPNAMELC}plugin_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatun_%{APPNAMELC}plugin_la_LIBADD = $(LIB_KFILE) -lnoatun -lnoatuncontrols \
+ -lqtmcop -lkmedia2_idl -lsoundserver_idl
+
+noinst_HEADERS = plugin_%{APPNAMELC}_impl.h
+
+# noatun_modules_uidir = $(kde_datadir)/noatun
+# noatun_modules_ui_DATA = %{APPNAMELC}.plugin
+
+pluginsdir = $(kde_datadir)/noatun
+plugins_DATA = %{APPNAMELC}.plugin
+
+# kde_services_DATA = %{APPNAMELC}.desktop
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/noatunui/subdirs b/languages/cpp/app_templates/noatunui/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/noatunui/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/noatunvisual/.kdev_ignore b/languages/cpp/app_templates/noatunvisual/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/.kdev_ignore
diff --git a/languages/cpp/app_templates/noatunvisual/Makefile.am b/languages/cpp/app_templates/noatunvisual/Makefile.am
new file mode 100644
index 00000000..0d6a43eb
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = src-Makefile.am plugin_app.cpp plugin_app.h plugin_impl.cpp \
+ plugin_impl.h noatunvisual.png plugin.plugin plugin.kdevelop \
+ subdirs noatunvisual-configure.in.in
+templateName = noatunvisual
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/noatunvisual/noatunvisual b/languages/cpp/app_templates/noatunvisual/noatunvisual
new file mode 100644
index 00000000..e0d0f7e0
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/noatunvisual
@@ -0,0 +1,8 @@
+# KDE Config File
+[General]
+Name=Noatun visualization plugin
+Icon=noatunvisual.png
+Category=C++/KDE
+Comment=Generates a visualization plugin for noatun using SDL
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/plugin_APPNAMELC_impl.cpp
diff --git a/languages/cpp/app_templates/noatunvisual/noatunvisual-configure.in.in b/languages/cpp/app_templates/noatunvisual/noatunvisual-configure.in.in
new file mode 100644
index 00000000..b973abe8
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/noatunvisual-configure.in.in
@@ -0,0 +1,36 @@
+#MIN_CONFIG(3.0.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+KDE_CHECK_HEADERS([noatun/plugin.h])
+KDE_CHECK_LIB([noatun],main,
+ [LIB_NOAUTUN="-lnoautun"])
+AC_SUBST(LIB_NOAUTUN)
+
+KDE_FIND_PATH(sdl-config, LIBSDL_CONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/local/bin /opt/local/bin], [
+ AC_MSG_WARN([Could not find libsdl anywhere, check http://www.sdl.org])
+])
+
+if test -n "$LIBSDL_CONFIG"; then
+ LIBSDL_LIBS="`$LIBSDL_CONFIG --libs`"
+ LIBSDL_RPATH=
+ for args in $LIBSDL_LIBS; do
+ case $args in
+ -L*)
+ LIBSDL_RPATH="$LIBSDL_RPATH $args"
+ ;;
+ esac
+ done
+ LIBSDL_RPATH=`echo $LIBSDL_RPATH | sed -e "s/-L/-R/g"`
+ LIBSDL_CFLAGS="`$LIBSDL_CONFIG --cflags`"
+
+ AC_DEFINE_UNQUOTED(HAVE_LIBSDL, 1, [Defines if your system has the LIBSDL library])
+fi
+
+
+AC_SUBST(LIBSDL_LIBS)
+AC_SUBST(LIBSDL_CFLAGS)
+AC_SUBST(LIBSDL_RPATH)
+
diff --git a/languages/cpp/app_templates/noatunvisual/noatunvisual.kdevtemplate b/languages/cpp/app_templates/noatunvisual/noatunvisual.kdevtemplate
new file mode 100644
index 00000000..4c726194
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/noatunvisual.kdevtemplate
@@ -0,0 +1,205 @@
+# KDE Config File
+[General]
+Name=Noatun visualization plugin
+Name[ca]=Connector de visualització per a Noatun
+Name[da]=Noatun visualiserings-plugin
+Name[de]=Noatun-Visualisierungs-Modul
+Name[el]=Οπτικό Ï€Ïόσθετο Noatun
+Name[en_GB]=Noatun visualisation plugin
+Name[es]=Complemento de visualización para Noatun
+Name[et]=Noatuni visualiseerimisplugin
+Name[eu]=Noatun bistaratze-plugina
+Name[fa]=وصلۀ تجسم Noatun
+Name[fr]=Module externe de visualisation pour Noatun
+Name[ga]=Breiseán amharcléirithe Noatun
+Name[gl]=Extensión de visualización para Noatun
+Name[hu]=Noatun vizualizációs modul
+Name[it]=Plugin di visualizzazione per noatun
+Name[ja]=Noatun ビジュアライゼーションプラグイン
+Name[nds]=Noatun-Filmmakermoduul
+Name[ne]=नोअटन भिजà¥à¤²à¤¾à¤‡à¤œà¥‡à¤¸à¤¨ पà¥à¤²à¤—इन
+Name[nl]=Noatun visualisatieplugin
+Name[pl]=Wtyczka wizualizacji do Noatun
+Name[pt]='Plugin' de visualização do Noatun
+Name[pt_BR]='Plugin' de visualização do Noatun
+Name[ru]=Модуль визуализации Noatun
+Name[sk]=Noatun vizualizaÄný modul
+Name[sr]=Визуелизациони прикључак за Noatun
+Name[sr@Latn]=Vizuelizacioni prikljuÄak za Noatun
+Name[sv]=Noatun-insticksprogram för visningar
+Name[tr]=Noatun görsellik eklentisi
+Name[zh_CN]=Noatun å¯è§†åŒ–æ’件
+Name[zh_TW]=Noatun 視覺化外掛程å¼
+Icon=noatunvisual.png
+Category=C++/KDE
+Comment=Generates a visualization plugin for noatun using SDL
+Comment[ca]=Genera un connector de visualització per a Noatun usant SDL
+Comment[da]=Generere et visualiserings-plugin for noatun ved brug af SDL
+Comment[de]=Erstellt ein Visualisierungs-Modul für Noatun unter Verwendung der SDL.
+Comment[el]=ΔημιουÏγεί ένα οπτικό Ï€Ïόσθετο για το noatun χÏησιμοποιώντας το SDL
+Comment[en_GB]=Generates a visualisation plugin for noatun using SDL
+Comment[es]=Genera un complemento de visualización para Noatun que usa SDL
+Comment[et]=Noatuni visualiseerimisplugina loomine SDL-i abil
+Comment[eu]=SDL erabiliz, bistaratze-plugin bat sortzen du noatun-entzat
+Comment[fa]=یک وصلۀ تجسم برای noatun با استÙاده از SDL تولید می‌کند
+Comment[fr]=Génère un module externe de visualisation pour Noatun utilisant SDL
+Comment[ga]=Cruthaíonn sé seo breiseán amharcléirithe noatun le SDL
+Comment[gl]=Xera unha extensión de visualización para noatun usando SDL
+Comment[hu]=Létrehoz egy vizualizációs modult a Noatunhoz, SDL-ben
+Comment[it]=Genera un plugin di visualizzazione per noatun usando SDL
+Comment[nds]=Stellt mit SDL en Filmmakermoduul för Noatun op
+Comment[ne]=SDL पà¥à¤°à¤¯à¥‹à¤— गरेर नोअटनका लागि भिजà¥à¤²à¤¾à¤‡à¤œà¥‡à¤¸à¤¨ पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een visualisatieplugin voor Noatun met behulp van SDL
+Comment[pl]=Generuje wtyczkę wizualizacji do Noatun. Używany jest SDL.
+Comment[pt]=Gera um 'plugin' de visualização para o Noatun, que usa o SDL
+Comment[pt_BR]=Gera um 'plugin' de visualização para o Noatun, que usa o SDL
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ Ð´Ð»Ñ Noatun на оÑнове SDL
+Comment[sk]=Vygeneruje vizualizaÄný modul pre Noatun s použitím SDL
+Comment[sr]=Прави визуелизациони прикључак за Noatun кориÑтећи SDL
+Comment[sr@Latn]=Pravi vizuelizacioni prikljuÄak za Noatun koristeći SDL
+Comment[sv]=Skapar ett Noatun-insticksprogram för visningar som använder SDL
+Comment[tr]=SDL kullanarak noatun için bir görsellik eklentisi yaratır.
+Comment[zh_CN]=使用 SDL ç”Ÿæˆ noatun çš„å¯è§†åŒ–æ’件
+Comment[zh_TW]=產生一個使用 SDL çš„ Noatun 視覺化外掛程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/plugin_%{APPNAMELC}_impl.cpp
+Archive=noatunvisual.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+Source=%{src}/plugin.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{src}/noatunvisual-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/plugin_app.cpp
+Dest=%{dest}/src/plugin_%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/plugin_app.h
+Dest=%{dest}/src/plugin_%{APPNAMELC}.h
+
+[FILE14]
+Type=install
+Source=%{src}/plugin_impl.cpp
+Dest=%{dest}/src/plugin_%{APPNAMELC}_impl.cpp
+
+[FILE15]
+Type=install
+Source=%{src}/plugin_impl.h
+Dest=%{dest}/src/plugin_%{APPNAMELC}_impl.h
+
+[FILE16]
+Type=install
+Source=%{src}/plugin.plugin
+Dest=%{dest}/src/%{APPNAMELC}.plugin
+
+[MSG]
+Type=message
+Comment=A Noatun visualization plugin was created in %{dest}
+Comment[ca]=Un connector de visualització per a Noatun ha estat creat en %{dest}
+Comment[da]=Et Noatun visualiserings-plugin blev oprettet i %{dest}
+Comment[de]=Ein Visualisierungs-Modul für Noatun wurde in %{dest} erstellt.
+Comment[el]=Ένα οπτικό Ï€Ïόσθετο Noatun δημιουÏγήθηκε στο %{dest}
+Comment[en_GB]=A Noatun visualisation plugin was created in %{dest}
+Comment[es]=Un complemento de visualización para Noatun ha sido creado en %{dest}
+Comment[et]=Noatuni visualiseerimisplugin loodi asukohta %{dest}
+Comment[eu]=Noatun-en bistaratze-plugin bat sortu da hemen: %{dest}
+Comment[fa]=یک وصلۀ تجسم Noatun در %{dest} ایجاد شد
+Comment[fr]=Un module externe de visualisation pour Noatun a été créé dans %{dest}
+Comment[ga]=Cruthaíodh breiseán amharcléirithe Noatun i %{dest}
+Comment[gl]=Creouse unha extensión de visualización para Noatun en %{dest}
+Comment[hu]=Létrejött egy Noatun vizualizációs modul itt: %{dest}
+Comment[it]=È stato creato un plugin di visualizzazione per noatun in %{dest}
+Comment[ja]=Noatun ビジュアライゼーションプラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Noatun-Filmmakermoduul opstellt
+Comment[ne]=नोअटन भिजà¥à¤²à¤¾à¤‡à¤œà¥‡à¤¸à¤¨ पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Noatun-visualisatieplugin is aangemaakt in %{dest}
+Comment[pl]=Wtyczka wizualizacji została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' de visualização do Noatun em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' de visualização do Noatun em %{dest}
+Comment[ru]=Модуль визуализации Noatun Ñоздан в %{dest}
+Comment[sk]=Noatun vizualizaÄný modul bol vytvorený v %{dest}
+Comment[sr]=Визуелизациони прикључак за Noatun направљен је у %{dest}
+Comment[sr@Latn]=Vizuelizacioni prikljuÄak za Noatun napravljen je u %{dest}
+Comment[sv]=Ett Noatun-insticksprogram för visningar skapades i %{dest}
+Comment[tr]=Bir Noatun görsellik eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了 Noatun å¯è§†åŒ–æ’件
+Comment[zh_TW]=一個 Noatun 視覺化外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/noatunvisual/noatunvisual.png b/languages/cpp/app_templates/noatunvisual/noatunvisual.png
new file mode 100644
index 00000000..4dcfce3d
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/noatunvisual.png
Binary files differ
diff --git a/languages/cpp/app_templates/noatunvisual/plugin.kdevelop b/languages/cpp/app_templates/noatunvisual/plugin.kdevelop
new file mode 100644
index 00000000..281d095e
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/plugin.kdevelop
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ </qt>
+ </kdevcppsupport>
+
+<kdevautoproject>
+ <general>
+ <activetarget>src/noatun_%{APPNAMELC}plugin.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ <configurations>
+ <default>
+ <ldflags>-lSDL</ldflags>
+ </default>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/noatunvisual/plugin.plugin b/languages/cpp/app_templates/noatunvisual/plugin.plugin
new file mode 100644
index 00000000..9dc32648
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/plugin.plugin
@@ -0,0 +1,8 @@
+Filename=noatun_%{APPNAMELC}plugin.la
+Author=%{AUTHOR}
+Site=http://noatun.kde.org/
+Email=%{EMAIL}
+Type=visualization
+License=$LICENSE$
+Name=%{APPNAME}
+Comment=My scope visualization plugin
diff --git a/languages/cpp/app_templates/noatunvisual/plugin_app.cpp b/languages/cpp/app_templates/noatunvisual/plugin_app.cpp
new file mode 100644
index 00000000..442bdefd
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/plugin_app.cpp
@@ -0,0 +1,58 @@
+
+#include <sys/wait.h>
+#include <sys/types.h>
+
+#include "plugin_%{APPNAMELC}.h"
+#include "plugin_%{APPNAMELC}_impl.h"
+
+#include <kglobal.h>
+#include <klocale.h>
+
+extern "C"
+{
+ Plugin *create_plugin()
+ {
+ KGlobal::locale()->insertCatalogue("%{APPNAMELC}");
+ return new %{APPNAME}Scope();
+ }
+}
+
+%{APPNAME}Scope::%{APPNAME}Scope()
+ : MonoScope(50), Plugin()
+{
+ setSamples(320);
+}
+
+%{APPNAME}Scope::~%{APPNAME}Scope()
+{
+ ::close(mOutFd);
+ wait(0);
+}
+
+void %{APPNAME}Scope::init()
+{
+ int pipes[2];
+ ::pipe(pipes);
+ mOutFd=pipes[1];
+ if (!fork())
+ {
+ ::close(pipes[1]);
+ new %{APPNAME}View(pipes[0]);
+ exit(0);
+ }
+ else
+ {
+ fcntl(mOutFd, F_SETFL, fcntl(mOutFd, F_GETFL) & ~O_NONBLOCK);
+ ::close(pipes[0]);
+ MonoScope::start();
+ }
+}
+
+void %{APPNAME}Scope::scopeEvent(float *d, int size)
+{
+ if (::write(mOutFd, (char *)d, size * sizeof(float))==-1)
+ {
+ MonoScope::stop();
+ unload();
+ }
+}
diff --git a/languages/cpp/app_templates/noatunvisual/plugin_app.h b/languages/cpp/app_templates/noatunvisual/plugin_app.h
new file mode 100644
index 00000000..a3cf91ea
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/plugin_app.h
@@ -0,0 +1,36 @@
+
+/** Note: You only have to change plugin_%{APPNAMELC}_impl.[h,cpp] */
+
+#ifndef _PLUGIN_%{APPNAMEUC}_H_
+#define _PLUGIN_%{APPNAMEUC}_H_
+
+#include <noatun/plugin.h>
+#include <string.h>
+
+extern "C"
+{
+ #include <SDL.h>
+ #include <fcntl.h>
+ #include <unistd.h>
+}
+
+class %{APPNAME}Scope : public MonoScope, public Plugin
+{
+NOATUNPLUGIND
+
+public:
+ %{APPNAME}Scope();
+ virtual ~%{APPNAME}Scope();
+
+ /** @short create a new child process (using fork) with %{APPNAME}View */
+ void init();
+
+protected:
+ virtual void scopeEvent(float *data, int bands);
+
+private:
+ int mOutFd;
+};
+
+#endif // _PLUGIN_%{APPNAMEUC}_H_
+
diff --git a/languages/cpp/app_templates/noatunvisual/plugin_impl.cpp b/languages/cpp/app_templates/noatunvisual/plugin_impl.cpp
new file mode 100644
index 00000000..a25f1fd2
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/plugin_impl.cpp
@@ -0,0 +1,276 @@
+
+#include "plugin_%{APPNAMELC}_impl.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+extern "C"
+{
+ #include <SDL.h>
+ #include <fcntl.h>
+ #include <unistd.h>
+}
+
+#if 0
+#define TEST() cout << "At line " << __LINE__ << endl
+#else
+#define TEST() if(0)
+#endif
+
+#define output ((unsigned char*)data)
+template <class Type>
+inline void Bitmap<Type>::addPixel(int x, int y, int br1, int br2)
+{
+ if (x < 0 || x >= width || y < 0 || y >= height) return;
+
+ register unsigned char *p = output+x*2+y*width*2;
+ if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+}
+
+template <class Type>
+void Bitmap<Type>::addVertLine(int x, int y1, int y2, int br1, int br2)
+{
+ if(y1 < y2)
+ {
+ for(int y = y1; y <= y2; y++)
+ addPixel(x,y, br1, br2);
+ }
+ else if(y2 < y1)
+ {
+ for(int y = y2; y <= y1; y++)
+ addPixel(x, y, br1, br2);
+ }
+ else
+ {
+ addPixel(x, y1, br1, br2);
+ }
+}
+
+template <class Type>
+void Bitmap<Type>::fadeStar()
+{
+ register unsigned long *ptr = (unsigned long*)output;
+ int i = width*height*2/4;
+ do
+ {
+ if (*ptr)
+ *(ptr++) -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5);
+ else
+ ptr++;
+ } while(--i > 0);
+}
+
+%{APPNAME}View::%{APPNAME}View(int in) : mFd(in), outputBmp(0), fullscreen(false)
+{
+ surface = 0;
+ width = 320;
+ height = width*6/8;
+ outputBmp.size(width, height);
+ TEST();
+
+ TEST();
+ fcntl(mFd, F_SETFL, fcntl(mFd, F_GETFL) & ~O_NONBLOCK);
+ TEST();
+
+
+ float *data = new float[width];
+ TEST();
+
+ startVideo();
+ setupPalette();
+ TEST();
+
+ while(true)
+ {
+ checkInput();
+
+ if(!surface) exit(0);
+
+ int bytestoread = width * sizeof(float);
+ int pos = 0;
+ while(pos < bytestoread)
+ {
+ char *d = (char *)data;
+ int r = read(mFd, d + pos, bytestoread - pos);
+ if(r > 0) pos += r;
+ else if (r==0) exit(0);
+ }
+
+ outputBmp.fadeStar();
+ outputBmp.fadeStar();
+
+ float *d = data;
+ float *end = data + width;
+ float heightHalf = height / 4.0;
+ int y = height / 2;
+ int x=0;
+ int oldy=(int)(*d * heightHalf);
+ while(d <= end)
+ {
+ int amp = (int)(*d * heightHalf);
+ amp+=y;
+
+ outputBmp.addVertLine(x, oldy, amp, 255, 255);
+ oldy=amp;
+
+ d++;
+ x++;
+ }
+ repaint();
+ }
+}
+
+static SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags)
+{
+ SDL_Surface *screen;
+
+ // Set the video mode
+ screen = SDL_SetVideoMode(w, h, bpp, flags);
+ return screen;
+}
+
+void %{APPNAME}View::startVideo()
+{
+ if(surface)
+ {
+ SDL_FreeSurface(surface);
+ surface = 0;
+ }
+
+ Uint32 videoflags;
+
+ /* Initialize SDL */
+ if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
+ exit(0);
+
+ SDL_WM_SetCaption("%{APPNAME}","%{APPNAMELC}");
+
+ /* See if we try to get a hardware colormap */
+ videoflags = SDL_SWSURFACE | (fullscreen?SDL_FULLSCREEN:0);
+
+ surface = CreateScreen(width, height, 8, videoflags);
+ if (!surface)
+ exit(0);
+
+ SDL_ShowCursor(0);
+
+ if(!surface)
+ SDL_Quit();
+
+ SDL_WM_SetCaption("%{APPNAME}", 0);
+ SDL_ShowCursor(0);
+
+}
+
+void %{APPNAME}View::setupPalette(double)
+{
+#define BOUND(x) ((x) > 255 ? 255 : (x))
+#define PEAKIFY(x) int(BOUND((x) - (x)*(255-(x))/255/2))
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+
+ int redMax=136;
+ int greenMax=136;
+ int blueMax=255;
+
+ SDL_Color sdlPalette[256];
+
+ for(int i=0;i<256;i++)
+ {
+ // i
+ // 255 136
+ sdlPalette[i].r = i*redMax/255;
+ sdlPalette[i].g = i*greenMax/255;
+ sdlPalette[i].b = i*blueMax/255;
+ }
+
+ SDL_SetColors(surface, sdlPalette, 0, 256);
+
+#undef BOUND
+#undef PEAKIFY
+#undef MAX
+}
+
+void %{APPNAME}View::checkInput()
+{
+ SDL_Event myEvent;
+
+ while(SDL_PollEvent(&myEvent))
+ {
+ switch(myEvent.type)
+ {
+ case SDL_KEYDOWN:
+ switch(myEvent.key.keysym.sym)
+ {
+ case SDLK_SPACE:
+// fullscreen ^= true;
+// startVideo();
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case SDL_QUIT:
+ exit(0);
+ break;
+ }
+ }
+}
+
+#define output2 ((unsigned char*)outputBmp.data)
+
+void %{APPNAME}View::repaint()
+{
+ SDL_LockSurface(surface);
+ TEST();
+
+ register unsigned long *ptr2 = (unsigned long*)output2;
+ unsigned long *ptr1 = (unsigned long*)( surface->pixels );
+ int i = width*height/4;
+ TEST();
+
+ do {
+ // Asger Alstrup Nielsen's (alstrup@diku.dk)
+ // optimized 32 bit screen loop
+ register unsigned int const r1 = *(ptr2++);
+ register unsigned int const r2 = *(ptr2++);
+
+ //if (r1 || r2) {
+#ifdef LITTLEENDIAN
+ register unsigned int const v =
+ ((r1 & 0x000000f0ul) >> 4)
+ | ((r1 & 0x0000f000ul) >> 8)
+ | ((r1 & 0x00f00000ul) >> 12)
+ | ((r1 & 0xf0000000ul) >> 16);
+ *(ptr1++) = v |
+ ( ((r2 & 0x000000f0ul) << 12)
+ | ((r2 & 0x0000f000ul) << 8)
+ | ((r2 & 0x00f00000ul) << 4)
+ | ((r2 & 0xf0000000ul)));
+#else
+ register unsigned int const v =
+ ((r2 & 0x000000f0ul) >> 4)
+ | ((r2 & 0x0000f000ul) >> 8)
+ | ((r2 & 0x00f00000ul) >> 12)
+ | ((r2 & 0xf0000000ul) >> 16);
+ *(ptr1++) = v |
+ ( ((r1 & 0x000000f0ul) << 12)
+ | ((r1 & 0x0000f000ul) << 8)
+ | ((r1 & 0x00f00000ul) << 4)
+ | ((r1 & 0xf0000000ul)));
+#endif
+ //} else ptr1++;
+ } while (--i);
+ TEST();
+
+ SDL_UnlockSurface(surface);
+ SDL_UpdateRect(surface, 0, 0, 0, 0);
+ TEST();
+
+}
+
+%{APPNAME}View::~%{APPNAME}View()
+{
+ ::close(mFd);
+}
diff --git a/languages/cpp/app_templates/noatunvisual/plugin_impl.h b/languages/cpp/app_templates/noatunvisual/plugin_impl.h
new file mode 100644
index 00000000..2a7de7b1
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/plugin_impl.h
@@ -0,0 +1,77 @@
+
+#ifndef %{APPNAMEUC}_IMPL_H
+#define %{APPNAMEUC}_IMPL_H
+
+struct SDL_Surface;
+
+/**
+ * @short This class is used for painting and supports some effects.
+ * Note: This is used in Blurscope. Feel free to remove this and
+ * implement your own drawing routines!
+ */
+template<class Pixel> class Bitmap
+{
+public:
+ int width, height, extra;
+ Pixel *data;
+
+ Bitmap(int e=0) : extra(e), data(0) { }
+ ~Bitmap() { delete[] data; }
+
+ inline void addPixel(int x, int y, int bright1, int bright2);
+ void addVertLine(int x, int y, int y2, int br1, int br2);
+
+ void fadeStar();
+
+ void size(int w,int h)
+ {
+ delete[] data;
+ width = w;
+ height = h;
+ data = new Pixel[w*h+extra];
+ clear();
+ }
+
+ void clear()
+ {
+ memset(data,0,sizeof(Pixel)*(width*height+extra));
+ }
+};
+
+/**
+ * @short This class does:
+ * o set up view
+ * o drawing routines.
+ */
+class %{APPNAME}View
+{
+public:
+ %{APPNAME}View(int in);
+ ~%{APPNAME}View();
+
+protected:
+ /** Screen initialization with SDL. Note, that you can initialize OpenGL with SDL! */
+ void startVideo();
+ /** SDL event queue */
+ void checkInput();
+ /** Used in Blurscope. Feel free to implement your own drawing routines! */
+ void setupPalette(double dummy=0.0);
+
+ /** Draw everything. */
+ void repaint();
+
+private:
+ /** used for pipelining */
+ int mFd;
+
+ /** SDL screen surface */
+ SDL_Surface *surface;
+ Bitmap<unsigned short> outputBmp;
+
+ bool fullscreen;
+ int width;
+ int height;
+};
+
+#endif // %{APPNAMEUC}_IMPL_H
+
diff --git a/languages/cpp/app_templates/noatunvisual/src-Makefile.am b/languages/cpp/app_templates/noatunvisual/src-Makefile.am
new file mode 100644
index 00000000..207fd8a8
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/src-Makefile.am
@@ -0,0 +1,19 @@
+INCLUDES= $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = noatun_%{APPNAMELC}plugin.la
+
+noatun_%{APPNAMELC}plugin_la_SOURCES = plugin_%{APPNAMELC}.cpp plugin_%{APPNAMELC}_impl.cpp
+noatun_%{APPNAMELC}plugin_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined $(LIBSDL_RPATH)
+noatun_%{APPNAMELC}plugin_la_CXXFLAGS = $(LIBSDL_CFLAGS)
+noatun_%{APPNAMELC}plugin_la_LIBADD = $(LIB_KFILE) $(LIBSDL_LIBS) -lnoatun -lm
+
+pluginsdir = $(kde_datadir)/noatun
+plugins_DATA = %{APPNAMELC}.plugin
+
+# kde_services_DATA = %{APPNAMELC}.desktop
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/%{APPNAMELC}.pot
diff --git a/languages/cpp/app_templates/noatunvisual/subdirs b/languages/cpp/app_templates/noatunvisual/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/cpp/app_templates/noatunvisual/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/cpp/app_templates/opieapp/.kdev_ignore b/languages/cpp/app_templates/opieapp/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/.kdev_ignore
diff --git a/languages/cpp/app_templates/opieapp/Example.png b/languages/cpp/app_templates/opieapp/Example.png
new file mode 100644
index 00000000..f63d0bc7
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/Example.png
Binary files differ
diff --git a/languages/cpp/app_templates/opieapp/Makefile.am b/languages/cpp/app_templates/opieapp/Makefile.am
new file mode 100644
index 00000000..643a1c29
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = Example.png app.kdevelop example.desktop Makefile.am \
+ app.pro example.cpp example.h examplebase.ui
+
+templateName = opieapp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/opieapp/app.kdevelop b/languages/cpp/app_templates/opieapp/app.kdevelop
new file mode 100644
index 00000000..69b6f2bc
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/app.kdevelop
@@ -0,0 +1,143 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>gtk</toc>
+ <toc>gnustep</toc>
+ <toc>python</toc>
+ <toc>php</toc>
+ <toc>perl</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>kdev3api</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>qmake User Guide</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Referrence Documentation</toc>
+ </ignoreqt_xml>
+ <ignoredevhelp>
+ <toc>bonobo-activation</toc>
+ <toc>gconf</toc>
+ <toc>gtksourceview</toc>
+ <toc>libbonobo</toc>
+ <toc>libbonoboui</toc>
+ </ignoredevhelp>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell></dbgshell>
+ <programargs>-qws</programargs>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <opie>
+ <quick_app>true</quick_app>
+ </opie>
+ <packaging>
+ <template>0</template>
+ <appcategory>Applications</appcategory>
+ <owner>
+ <package>%{APPNAMELC}</package>
+ <prio>0</prio>
+ <section>opie/application</section>
+ <maintainer>%{AUTHOR} %{EMAIL}</maintainer>
+ <arch>arm</arch>
+ <depends>task-opie-minimal</depends>
+ <version>%{VERSION}</version>
+ <desc>Empty</desc>
+ </owner>
+ </packaging>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram>./%{APPNAMELC}</mainprogram>
+ <programargs>-qws</programargs>
+ </run>
+ <envvars/>
+ </kdevtrollproject>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <codecompletion>
+ <codehinting outputview="1" enablech="0" selectview="0" />
+ </codecompletion>
+ <classstore>
+ <enablepcs>false</enablepcs>
+ <enablepp>false</enablepp>
+ <preparsing/>
+ </classstore>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL></interfaceURL>
+ <implementationURL></implementationURL>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions></commitoptions>
+ <updateoptions>-dP</updateoptions>
+ <addoptions></addoptions>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions></logoptions>
+ <rshoptions></rshoptions>
+ </kdevcvs>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/opieapp/app.pro b/languages/cpp/app_templates/opieapp/app.pro
new file mode 100644
index 00000000..f4111696
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/app.pro
@@ -0,0 +1,38 @@
+TEMPLATE = quick-template
+CONFIG = qt qtopia warn_on release zecke-libqpe zecke-libopie
+HEADERS = %{APPNAMELC}.h
+SOURCES = %{APPNAMELC}.cpp
+INTERFACES = %{APPNAMELC}base.ui
+TARGET = %{APPNAMELC}
+
+QMAKE_LIBDIR = $(OPIEDIR)/lib
+OPIE-SPEC=6
+
+QUICK_SPEC_FOO = $$(OPIE_BUILD_QUICK_APP)
+contains( TEMPLATE, quick-template ){
+ contains( QUICK_SPEC_FOO, quick-app-lib ){
+ message( "foo" )
+ system( rm $$TARGET )
+ system( ln -s $$(OPIEDIR)/bin/quicklauncher $$TARGET)
+ DEFINES += OPIE_APP_INTERFACE
+ TEMPLATE = lib
+ CONFIG += dll
+ }else{
+ LI = $$join( TARGET, "lib", "lib", ".so*" )
+ system( rm $$LI )
+ TEMPLATE = app
+ }
+}
+
+
+zecke-libqpe {
+ INCLUDEPATH += $(OPIEDIR)/include
+ LIBS += -lqpe
+ DEPENDPATH += $(OPIEDIR)/include
+}
+
+zecke-libopie {
+ INCLUDEPATH += $(OPIEDIR)/include
+ DEPENDPATH += $(OPIEDIR)/include
+ LIBS += -lopie
+}
diff --git a/languages/cpp/app_templates/opieapp/example.cpp b/languages/cpp/app_templates/opieapp/example.cpp
new file mode 100644
index 00000000..84f3f9d5
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/example.cpp
@@ -0,0 +1,32 @@
+#include "%{APPNAMELC}.h"
+#include <qpushbutton.h>
+#include <opie/oapplicationfactory.h>
+
+typedef OApplicationFactory<%{APPNAME}> %{APPNAME}Factory;
+OPIE_EXPORT_APP( %{APPNAME}Factory )
+
+/*
+ * Constructs a %{APPNAME} which is a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'
+ */
+%{APPNAME}::%{APPNAME}( QWidget* parent, const char* name, WFlags fl )
+ : %{APPNAME}Base( parent, name, fl )
+{
+ connect(quit, SIGNAL(clicked()), this, SLOT(goodBye()));
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+%{APPNAME}::~%{APPNAME}()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+/*
+ * A simple slot... not very interesting.
+ */
+void %{APPNAME}::goodBye()
+{
+ close();
+}
diff --git a/languages/cpp/app_templates/opieapp/example.desktop b/languages/cpp/app_templates/opieapp/example.desktop
new file mode 100644
index 00000000..f6f04194
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/example.desktop
@@ -0,0 +1,37 @@
+[Desktop Entry]
+Comment=An %{APPNAME} Program
+Comment[ca]=Un programa per a %{APPNAME}
+Comment[da]=Et %{APPNAME} program
+Comment[de]=Ein %{APPNAME}-Program
+Comment[el]=Ένα Ï€ÏόγÏαμμα %{APPNAME}
+Comment[es]=Un programa %{APPNAME}
+Comment[et]=%{APPNAME} programm
+Comment[eu]=%{APPNAME} programa bat
+Comment[fa]=برنامۀ %{APPNAME}
+Comment[fr]=Un programme %{APPNAME}
+Comment[ga]=Clár %{APPNAME}
+Comment[gl]=Un programa %{APPNAME}
+Comment[hu]=%{APPNAME} program
+Comment[it]=Un programma per %{APPNAME}
+Comment[ja]=%{APPNAME} プログラム
+Comment[nds]=En %{APPNAME}-Programm
+Comment[ne]= %{APPNAME} कारà¥à¤¯à¤•à¥à¤°à¤®
+Comment[nl]=Een %{APPNAME} programma
+Comment[pl]=Program %{APPNAME}
+Comment[pt]=Um Programa %{APPNAME}
+Comment[pt_BR]=Um Programa %{APPNAME}
+Comment[ru]=Программа %{APPNAME}
+Comment[sk]=%{APPNAME} program
+Comment[sl]=Program %{APPNAME}
+Comment[sr]=%{APPNAME} програм
+Comment[sr@Latn]=%{APPNAME} program
+Comment[sv]=Ett %{APPNAME}-program
+Comment[ta]=ஒர௠%{APPNAME} நிரலà¯
+Comment[tg]=Барномаи %{APPNAME}
+Comment[tr]=Bir %{APPNAME} Programı
+Comment[zh_CN]=一个 %{APPNAME} 程åº
+Comment[zh_TW]=一個 %{APPNAME} 程å¼
+Exec=%{APPNAMELC}
+Icon=%{APPNAME}
+Type=Application
+Name=%{APPNAME}
diff --git a/languages/cpp/app_templates/opieapp/example.h b/languages/cpp/app_templates/opieapp/example.h
new file mode 100644
index 00000000..1ba8ead7
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/example.h
@@ -0,0 +1,20 @@
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+#include "%{APPNAMELC}base.h"
+
+class %{APPNAME} : public %{APPNAME}Base
+{
+ Q_OBJECT
+
+public:
+ static QString appName() {
+ return QString::fromLatin1("%{APPNAMELC}" );
+ }
+ %{APPNAME}( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~%{APPNAME}();
+
+private slots:
+ void goodBye();
+};
+
+#endif // %{APPNAMEUC}_H
diff --git a/languages/cpp/app_templates/opieapp/examplebase.ui b/languages/cpp/app_templates/opieapp/examplebase.ui
new file mode 100644
index 00000000..b6b81b11
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/examplebase.ui
@@ -0,0 +1,49 @@
+<!DOCTYPE UI><UI>
+<class>%{APPNAME}Base</class>
+<widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>%{APPNAME}Base</cstring>
+ </property>
+ <property stdset="1">
+ <name>geometry</name>
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>196</width>
+ <height>245</height>
+ </rect>
+ </property>
+ <property stdset="1">
+ <name>caption</name>
+ <string>%{APPNAME}</string>
+ </property>
+ <vbox>
+
+ <widget>
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&lt;p&gt;This is just an &lt;i&gt;%{APPNAMELC}&lt;/i&gt;; it does not do anything interesting at all.</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>quit</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Quit</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/opieapp/opieapp.kdevtemplate b/languages/cpp/app_templates/opieapp/opieapp.kdevtemplate
new file mode 100644
index 00000000..622ec9a6
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/opieapp.kdevtemplate
@@ -0,0 +1,149 @@
+# KDE Config File
+[General]
+Name=Opie Application
+Name[br]=Meziant Opie
+Name[ca]=Aplicació per a Opie
+Name[da]=Opie-program
+Name[de]=Opie-Anwendung
+Name[el]=ΕφαÏμογή Opie
+Name[es]=Aplicación para Opie
+Name[et]=Opie rakendus
+Name[eu]=Opie aplikazioa
+Name[fa]=کاربرد Opie
+Name[fr]=Application Opie
+Name[ga]=Feidhmchlár Opie
+Name[gl]=Aplicación Opie
+Name[hu]=Opie-alkalmazás
+Name[it]=Applicazione Opie
+Name[ja]=Opie アプリケーション
+Name[nds]=Opie-Programm
+Name[ne]=ओपिइ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Opie-toepassing
+Name[pl]=Program Opie
+Name[pt]=Aplicação do Opie
+Name[pt_BR]=Aplicação do Opie
+Name[ru]=Приложение Opie
+Name[sk]=Apie aplikácia
+Name[sl]=Program za Opie
+Name[sr]=Opie програм
+Name[sr@Latn]=Opie program
+Name[sv]=Opie-program
+Name[tr]=Opie Uygulaması
+Name[zh_CN]=Opie 应用程åº
+Name[zh_TW]=Opie 應用程å¼
+Icon=qmakeapp.png
+Category=C++/Embedded
+Comment=Generate an Opie application.
+Comment[ca]=Genera una aplicació per a Opie.
+Comment[da]=Generér et Opie-program.
+Comment[de]=Erstellt eine Opie-Anwendung
+Comment[el]=ΔημιουÏγία μιας εφαÏμογής Opie.
+Comment[es]=Genera una aplicación para Opie.
+Comment[et]=Opie rakenduse loomine.
+Comment[eu]=Sortu Opie aplikazio bat.
+Comment[fa]=یک کاربرد Opie تولید می‌کند.
+Comment[fr]=Génère une application Opie.
+Comment[ga]=Cruthaigh feidhmchlár Opie.
+Comment[hu]=Létrehoz egy Opie-alkalmazást.
+Comment[it]=Genera un'applicazione Opie.
+Comment[ja]=Opie アプリケーションを作æˆ
+Comment[nds]=Stellt en Opie-Programm op.
+Comment[ne]=ओपिइ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Genereert een Opie-toepassing
+Comment[pl]=Generuje program Opie.
+Comment[pt]=Gera uma aplicação do Opie.
+Comment[pt_BR]=Gera uma aplicação do Opie.
+Comment[ru]=Создание приложение Opie.
+Comment[sk]=Vygeneruje Opie aplikáciu.
+Comment[sl]=Ustvari program za Opie
+Comment[sr]=Прави Opie програм.
+Comment[sr@Latn]=Pravi Opie program.
+Comment[sv]=Skapa ett Opie-program.
+Comment[tr]=Bir Opie uygulaması yarat
+Comment[zh_CN]=生æˆä¸€ä¸ª Opie 应用程åºã€‚
+Comment[zh_TW]=產生一個 Opie 應用程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.cpp
+Archive=opieapp.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir0]
+Type=mkdir
+Dir=%{dest}/pics
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/pics/%{APPNAMELC}
+
+[FILE2]
+Type=install
+Source=%{src}/Example.png
+Dest=%{dest}/pics/%{APPNAMELC}/%{APPNAMELC}.png
+Process=false
+
+[FILE3]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[FILE4]
+Type=install
+Source=%{src}/example.cpp
+Dest=%{dest}/%{APPNAMELC}.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/example.h
+Dest=%{dest}/%{APPNAMELC}.h
+
+[FILE6]
+Type=install
+Source=%{src}/examplebase.ui
+Dest=%{dest}/%{APPNAMELC}base.ui
+
+[MkDir2]
+Type=mkdir
+Dir=%{dest}/apps
+
+[FILE7]
+Type=install
+Source=%{src}/example.desktop
+Dest=%{dest}/apps/%{APPNAMELC}.desktop
+
+[MSG]
+Type=message
+Comment=An opie application was created in %{dest}
+Comment[ca]=Una aplicació per a Opie ha estat creada en %{dest}
+Comment[da]=Et opie-program blev oprettet i %{dest}
+Comment[de]=Eine Opie-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή opie δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación para Opie ha sido creada en %{dest}
+Comment[et]=Opie rakendus loodi asukohta %{dest}
+Comment[eu]=Opie aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد opie در %{dest} ایجاد شد
+Comment[fr]=Une application Opie a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár opie i %{dest}
+Comment[gl]=Creouse unha aplicación opie en %{dest}
+Comment[hu]=Létrejött egy Opie-alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Opie in %{dest}
+Comment[ja]=Opie アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Opie-Programm opstellt
+Comment[ne]=ओपिइ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Opie-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program Opie został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do Opie em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do Opie em %{dest}
+Comment[ru]=Приложение Opie Ñоздано в %{dest}
+Comment[sk]=Opie aplikácia bola vytvorená v %{dest}
+Comment[sl]=Program za opie je bil ustvarjen v %{dest}
+Comment[sr]=Opie програм је направљен у %{dest}
+Comment[sr@Latn]=Opie program je napravljen u %{dest}
+Comment[sv]=Ett Opie-program skapades i %{dest}
+Comment[tr]=Bir opie uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 opie 应用程åº
+Comment[zh_TW]=一個 opie 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/opieapp/opieapp.png b/languages/cpp/app_templates/opieapp/opieapp.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/opieapp/opieapp.png
Binary files differ
diff --git a/languages/cpp/app_templates/opieapplet/.kdev_ignore b/languages/cpp/app_templates/opieapplet/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/opieapplet/.kdev_ignore
diff --git a/languages/cpp/app_templates/opieapplet/Example.png b/languages/cpp/app_templates/opieapplet/Example.png
new file mode 100644
index 00000000..f63d0bc7
--- /dev/null
+++ b/languages/cpp/app_templates/opieapplet/Example.png
Binary files differ
diff --git a/languages/cpp/app_templates/opieapplet/Makefile.am b/languages/cpp/app_templates/opieapplet/Makefile.am
new file mode 100644
index 00000000..8faf4e32
--- /dev/null
+++ b/languages/cpp/app_templates/opieapplet/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = Makefile.am Example.png app.kdevelop app.pro \
+ simpleimpl.cpp simpleimpl.h
+
+templateName = opieapplet
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/opieapplet/app.kdevelop b/languages/cpp/app_templates/opieapplet/app.kdevelop
new file mode 100644
index 00000000..eee2c55a
--- /dev/null
+++ b/languages/cpp/app_templates/opieapplet/app.kdevelop
@@ -0,0 +1,158 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>gtk</toc>
+ <toc>gnustep</toc>
+ <toc>python</toc>
+ <toc>php</toc>
+ <toc>perl</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>kdev3api</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>qmake User Guide</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Referrence Documentation</toc>
+ </ignoreqt_xml>
+ <ignoredevhelp>
+ <toc>bonobo-activation</toc>
+ <toc>gconf</toc>
+ <toc>gtksourceview</toc>
+ <toc>libbonobo</toc>
+ <toc>libbonoboui</toc>
+ </ignoredevhelp>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell></dbgshell>
+ <programargs>-qws</programargs>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <opie>
+ <quick_app>true</quick_app>
+ </opie>
+ <packaging>
+ <template>2</template>
+ <owner>
+ <package>%{APPNAMELC}</package>
+ <prio>0</prio>
+ <section>opie/applets</section>
+ <maintainer>%{AUTHOR} %{EMAIL}</maintainer>
+ <arch>arm</arch>
+ <depends>task-opie-minimal</depends>
+ <version>%{VERSION}</version>
+ <desc>Empty</desc>
+ </owner>
+ <scripts>
+ <post>#!/bin/sh
+if pidof -s qpe >/dev/null; then
+ /opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadApplets()"
+else
+ exit 0
+fi
+</post>
+ <post_rem>#!/bin/sh
+if pidof -s qpe >/dev/null; then
+ /opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadApplets()"
+else
+ exit 0
+fi
+</post_rem>
+ </scripts>
+ </packaging>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram>./%{APPNAMELC}</mainprogram>
+ <programargs>-qws</programargs>
+ </run>
+ <envvars/>
+ </kdevtrollproject>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <codecompletion>
+ <codehinting outputview="1" enablech="0" selectview="0" />
+ </codecompletion>
+ <classstore>
+ <enablepcs>false</enablepcs>
+ <enablepp>false</enablepp>
+ <preparsing/>
+ </classstore>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL></interfaceURL>
+ <implementationURL></implementationURL>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions></commitoptions>
+ <updateoptions>-dP</updateoptions>
+ <addoptions></addoptions>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions></logoptions>
+ <rshoptions></rshoptions>
+ </kdevcvs>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/opieapplet/app.pro b/languages/cpp/app_templates/opieapplet/app.pro
new file mode 100644
index 00000000..e1cc1e3b
--- /dev/null
+++ b/languages/cpp/app_templates/opieapplet/app.pro
@@ -0,0 +1,38 @@
+TEMPLATE = lib
+CONFIG = qt dll qtopia warn_on release zecke-libqpe zecke-libopie opie-applet
+HEADERS = %{APPNAMELC}.h
+SOURCES = %{APPNAMELC}.cpp
+TARGET = %{APPNAMELC}
+
+
+QUICK_SPEC_FOO = $$(OPIE_BUILD_QUICK_APP)
+contains( TEMPLATE, quick-template ){
+ contains( QUICK_SPEC_FOO, quick-app-lib ){
+ message( "foo" )
+ system( rm $$TARGET )
+ system( ln -s $$(OPIEDIR)/bin/quicklauncher $$TARGET)
+ DEFINES += OPIE_APP_INTERFACE
+ TEMPLATE = lib
+ CONFIG += dll
+ }else{
+ LI = $$join( TARGET, "lib", "lib", ".so*" )
+ system( rm $$LI )
+ TEMPLATE = app
+ }
+}
+
+
+QMAKE_LIBDIR= $$(OPIEDIR)/lib
+OPIE-SPEC=6
+
+zecke-libqpe {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ LIBS += -lqpe
+ DEPENDPATH += $$(OPIEDIR)/include
+}
+
+zecke-libopie {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ DEPENDPATH += $$(OPIEDIR)/include
+ LIBS += -lopie
+}
diff --git a/languages/cpp/app_templates/opieapplet/opieapplet.kdevtemplate b/languages/cpp/app_templates/opieapplet/opieapplet.kdevtemplate
new file mode 100644
index 00000000..7be33a95
--- /dev/null
+++ b/languages/cpp/app_templates/opieapplet/opieapplet.kdevtemplate
@@ -0,0 +1,135 @@
+# KDE Config File
+[General]
+Name=Opie Applet
+Name[br]=Arloadig Opie
+Name[ca]=Miniaplicació per a Opie
+Name[da]=Opie-applet
+Name[de]=Opie-Miniprogramm (Applet)
+Name[el]=ΜικÏοεφαÏμογή Opie
+Name[es]=Applet para Opie
+Name[et]=Opie aplett
+Name[eu]=Opie applet-a
+Name[fa]=برنامک Opie
+Name[fr]=Applet Opie
+Name[ga]=Feidhmchláirín Opie
+Name[gl]=Applet Opie
+Name[hu]=Opie-s kisalkalmazás
+Name[it]=Applet Opie
+Name[ja]=Opie アプレット
+Name[nds]=Opie-Lüttprogramm
+Name[ne]=ओपिइ à¤à¤ªà¥à¤²à¥‡à¤Ÿ
+Name[nl]=Opie-applet
+Name[pl]=Aplet Opie
+Name[pt]='Applet' do Opie
+Name[pt_BR]='Applet' do Opie
+Name[ru]=Ðплет Opie
+Name[sk]=Opie applet
+Name[sl]=Vstavek za Opie
+Name[sr]=Opie аплет
+Name[sr@Latn]=Opie aplet
+Name[sv]=Opie-miniprogram
+Name[tr]=Opie Küçük Uygulaması
+Name[zh_CN]=Opie å°ç¨‹åº
+Name[zh_TW]=Opie å°ç¨‹å¼
+Icon=qmakeapp.png
+Category=C++/Embedded
+Comment=Generate an Opie applet.
+Comment[ca]=Genera una miniaplicació per a Opie.
+Comment[da]=Generér en Opie-applet.
+Comment[de]=Erstellt ein Opie-Miniprogramm (Applet).
+Comment[el]=ΔημιουÏγία μίας μικÏοεφαÏμογής Opie.
+Comment[es]=Genera un applet para Opie.
+Comment[et]=Opie apleti loomine.
+Comment[eu]=Sortu Opie applet bat.
+Comment[fa]=یک برنامک Opie تولید می‌کند.
+Comment[fr]=Génère un applet Opie.
+Comment[ga]=Cruthaigh feidhmchláirín Opie.
+Comment[gl]=Xera un applet Opie.
+Comment[hu]=Létrehoz egy Opie-s kisalkalmazást.
+Comment[it]=Genera un'applet Opie.
+Comment[ja]=Opie アプレットを作æˆ
+Comment[nds]=Stellt en Opie-Lüttprogramm op.
+Comment[ne]=ओपिइ à¤à¤ªà¥à¤²à¥‡à¤Ÿ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een Opie-applet.
+Comment[pl]=Generuje aplet Opie
+Comment[pt]=Gera uma 'applet' do Opie.
+Comment[pt_BR]=Gera uma 'applet' do Opie.
+Comment[ru]=Создание аплета Opie.
+Comment[sk]=Vygeneruje Opie applet.
+Comment[sl]=Ustvari vstavek za Opie.
+Comment[sr]=Прави Opie аплет.
+Comment[sr@Latn]=Pravi Opie aplet.
+Comment[sv]=Skapa ett Opie-miniprogram.
+Comment[zh_CN]=生æˆä¸€ä¸ª Opie å°ç¨‹åºã€‚
+Comment[zh_TW]=產生一個 Opie å°ç¨‹å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.cpp
+Archive=opieapplet.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir0]
+Type=mkdir
+Dir=%{dest}/pics
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/pics/%{APPNAMELC}
+
+[FILE2]
+Type=install
+Source=%{src}/Example.png
+Dest=%{dest}/pics/%{APPNAMELC}/%{APPNAMELC}.png
+Process=false
+
+[FILE3]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[FILE4]
+Type=install
+Source=%{src}/simpleimpl.cpp
+Dest=%{dest}/%{APPNAMELC}.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/simpleimpl.h
+Dest=%{dest}/%{APPNAMELC}.h
+
+[MSG]
+Type=message
+Comment=An opie applet was created in %{dest}
+Comment[ca]=Una miniaplicació per a Opie ha estat creat en %{dest}
+Comment[da]=En opie-applet blev oprettet i %{dest}
+Comment[de]=Ein Opie-Miniprogramm (Applet) wurde in %{dest} erstellt.
+Comment[el]=Μία μικÏοεφαÏμογή opie δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un applet para Opie ha sido creado en %{dest}
+Comment[et]=Opie aplett loodi asukohta %{dest}
+Comment[eu]=Opie applet bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامک opie در %{dest} ایجاد شد
+Comment[fr]=Un applet Opie a été créé dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchláirín opie i %{dest}
+Comment[gl]=Creouse un applet opie en %{dset}
+Comment[hu]=Létrejött egy Opie-s kisalkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applet Opie in %{dest}
+Comment[ja]=Opie アプレットを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Opie-Lüttprogramm opstellt
+Comment[ne]=ओपिइ à¤à¤ªà¥à¤²à¥‡à¤Ÿ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Opie-applet is aangemaakt in %{dest}
+Comment[pl]=Aplet Opie został utworzony w %{dest}
+Comment[pt]=Foi criada uma 'applet' do Opie em %{dest}
+Comment[pt_BR]=Foi criada uma 'applet' do Opie em %{dest}
+Comment[ru]=Ðплет Opie Ñоздан в %{dest}
+Comment[sk]=Opie applet bol vytvorený v %{dest}
+Comment[sl]=Vstavek za opie je bil ustvarjen v %{dest}
+Comment[sr]=Opie аплет је направљен у %{dest}
+Comment[sr@Latn]=Opie aplet je napravljen u %{dest}
+Comment[sv]=Ett Opie-miniprogram skapades i %{dest}
+Comment[tr]=Bir Opie küçük uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 opie å°ç¨‹åº
+Comment[zh_TW]=一個 Opie å°ç¨‹å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/opieapplet/opieapplet.png b/languages/cpp/app_templates/opieapplet/opieapplet.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/opieapplet/opieapplet.png
Binary files differ
diff --git a/languages/cpp/app_templates/opieapplet/simpleimpl.cpp b/languages/cpp/app_templates/opieapplet/simpleimpl.cpp
new file mode 100644
index 00000000..1474a0e4
--- /dev/null
+++ b/languages/cpp/app_templates/opieapplet/simpleimpl.cpp
@@ -0,0 +1,162 @@
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qmessagebox.h>
+
+#include <qpe/applnk.h> // for AppLnk
+#include <qpe/resource.h> // for Resource loading
+
+#include "%{APPNAMELC}.h"
+
+
+%{APPNAME}::%{APPNAME}(QWidget *parent)
+ : QWidget( parent, "%{APPNAME} Applet" ) {
+/*
+ * we will load an Image, scale it for the right usage
+ * remember your applet might be used by different
+ * resolutions.
+ * Then we will convert the image back to an Pixmap
+ * and draw this Pimxap. We need to use Image because its
+ * the only class that allows scaling.
+ */
+
+ QImage image = Resource::loadImage("%{APPNAMELC}/%{APPNAMELC}");
+ /*
+ * smooth scale to AppLnk smallIconSize for applest
+ * smallIconSize gets adjusted to the resolution
+ * so on some displays like SIMpad and a C-750 the smallIconSize
+ * is greater than on a iPAQ h3870
+ */
+ image = image.smoothScale(AppLnk::smallIconSize(), AppLnk::smallIconSize() );
+
+ /*
+ * now we need to convert the Image to a Pixmap cause these
+ * can be drawn more easily
+ */
+ m_pix = new QPixmap();
+ m_pix->convertFromImage( image );
+
+ /*
+ * Now we will say that we don't want to be bigger than our
+ * Pixmap
+ */
+ setFixedHeight(AppLnk::smallIconSize() );
+ setFixedWidth( AppLnk::smallIconSize() );
+
+}
+
+%{APPNAME}::~%{APPNAME}() {
+ delete m_pix;
+}
+
+
+/*
+ * here you would normal show or do something
+ * useful. If you want to show a widget at the top left
+ * of your icon you need to map your rect().topLeft() to
+ * global with mapToGlobal(). Then you might also need to
+ * move the widgets so it is visible
+ */
+void %{APPNAME}::mousePressEvent(QMouseEvent* ) {
+ QMessageBox::information(this, tr("No action taken"),
+ tr("<qt>This Plugin does not yet support anything usefule aye.</qt>"),
+ QMessageBox::Ok );
+
+}
+
+void %{APPNAME}::paintEvent( QPaintEvent* ) {
+ QPainter p(this);
+
+ /* simpy draw the pixmap from the start of this widget */
+ p.drawPixmap(0, 0, *m_pix );
+}
+
+/*
+ * Here comes the implementation of the interface
+ */
+%{APPNAME}Impl::%{APPNAME}Impl() {
+}
+/* needed cause until it is only pure virtual */
+%{APPNAME}Impl::~%{APPNAME}Impl() {
+ /*
+ * we will delete our applets as well
+ * setAUtoDelete makes the QList free
+ * the objects behind the pointers
+ */
+ m_applets.setAutoDelete( true );
+ m_applets.clear();
+}
+
+/*
+ * For the taskbar interface return a Widget
+ */
+QWidget* %{APPNAME}Impl::applet( QWidget* parent ) {
+ /*
+ * There are problems with ownership. So we add
+ * our ownlist and clear this;
+ */
+ %{APPNAME}* ap = new %{APPNAME}( parent );
+ m_applets.append( ap );
+
+ return ap;
+}
+
+/*
+ * A small hint where the Applet Should be displayed
+ */
+int %{APPNAME}Impl::position()const {
+ return 1;
+}
+
+
+/*
+ * Now the important QUnkownInterface method without
+ * this one your applet won't load
+ * @param uuid The uuid of the interface
+ * @param iface The pointer to the interface ptr
+ */
+QRESULT %{APPNAME}Impl::queryInterface( const QUuid& uuid, QUnknownInterface** iface) {
+ /* set the pointer to the interface to 0 */
+ *iface = 0;
+
+ /*
+ * we check if we support the requested interface
+ * and then assign to the pointer.
+ * You may alos create another interface here so
+ * *iface = this is only in this simple case true you
+ * could also support more interfaces.
+ * But this example below is the most common use.
+ * Now the caller knows that the Interface Pointer
+ * is valid and the interface supported
+ */
+ if ( uuid == IID_QUnknown )
+ *iface = this;
+ else if ( uuid == IID_TaskbarApplet )
+ *iface = this;
+ else
+ return QS_FALSE;
+
+ if ( *iface )
+ (*iface)->addRef();
+
+ return QS_OK;
+}
+
+
+/*
+ * Finally we need to export the Interface.
+ * CREATE_INSTANCE creates a interface and calls
+ * queryInterface for the QUnknownInterface once
+ * With out this function the applet can't be loaded.
+ *
+ * NOTE: If your applet does not load it's likely you've an
+ * unresolved symbol. Change the .pro TEMPLATE = lib to TEMPLATE= app
+ * and recompile. If the linker only complains about a missing
+ * main method the problem is more complex. In most cases it'll say
+ * you which symbols are missing and you can implement them.
+ * The main(int argc, char* argv[] ) does not need to be
+ * included in a library so it's ok that the linker complains
+ */
+Q_EXPORT_INTERFACE() {
+ Q_CREATE_INSTANCE( %{APPNAME}Impl )
+}
+
diff --git a/languages/cpp/app_templates/opieapplet/simpleimpl.h b/languages/cpp/app_templates/opieapplet/simpleimpl.h
new file mode 100644
index 00000000..19475367
--- /dev/null
+++ b/languages/cpp/app_templates/opieapplet/simpleimpl.h
@@ -0,0 +1,75 @@
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+
+
+/**
+ * Opie and Qtopia uses a component system called QCOM
+ * which was first part of the Qt 3.0 API but was made
+ * prviate during the betas. Opie and Qtopia still use it
+ * and we're happy with it.
+ * Every starts with the QUnknownInterface. It supports functions
+ * for reference counting and the most important one
+ * is for a query. Every QCOM interface got a global unique id ( GUID,UUID )
+ * query is used to see if a interface is supported by
+ * a dynamic shared object ( dso / plugin )
+ * For tasks like loading Applications, InputMethods, Today, MenuButton,
+ * Taskbar, Style, Email Client there are specefic Interfaces you
+ * need to implement. The interfaces inherits from QUnknownInterface and
+ * you'll need inherit from the interface.
+ * As example we will use the Taskbar interface
+ */
+
+
+/*
+ * The taskbar applet interfaces wants us to implement position() and applet()
+ * additionally we need to implement add(), release() and queryInterface for QUnknownInterface
+ * luckiy there is a macro for the reference counting
+ * We provide an Implementation of the interface.
+ */
+#include <qwidget.h>
+#include <qptrlist.h>
+
+#include <qpe/taskbarappletinterface.h>
+
+
+/*
+ * Because we only draw an Icon in a fixed width and height
+ * we declare and define %{APPNAME} here and you could use QLabel
+ * setPixmap or use QWidget and draw yourself.
+ * You might also want to reimplement mouse*Event to use some simple actions
+ */
+class %{APPNAME} : public QWidget {
+ Q_OBJECT
+public:
+ %{APPNAME}(QWidget *parent);
+ ~%{APPNAME}();
+private:
+ void mousePressEvent( QMouseEvent* );
+ void paintEvent( QPaintEvent* );
+ QPixmap *m_pix;
+};
+
+class %{APPNAME}Impl : public TaskbarAppletInterface {
+public:
+
+ %{APPNAME}Impl();
+ virtual ~%{APPNAME}Impl();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+
+ QWidget *applet( QWidget* parent );
+ int position()const;
+
+ /*
+ * macro for reference countint
+ * if reference drops to zero
+ * delete this is called
+ */
+ Q_REFCOUNT
+
+private:
+ QList<%{APPNAME}> m_applets;
+};
+
+
+#endif
diff --git a/languages/cpp/app_templates/opieinput/.kdev_ignore b/languages/cpp/app_templates/opieinput/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/opieinput/.kdev_ignore
diff --git a/languages/cpp/app_templates/opieinput/Example.png b/languages/cpp/app_templates/opieinput/Example.png
new file mode 100644
index 00000000..f63d0bc7
--- /dev/null
+++ b/languages/cpp/app_templates/opieinput/Example.png
Binary files differ
diff --git a/languages/cpp/app_templates/opieinput/Makefile.am b/languages/cpp/app_templates/opieinput/Makefile.am
new file mode 100644
index 00000000..d748092c
--- /dev/null
+++ b/languages/cpp/app_templates/opieinput/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = Makefile.am Example.png app.kdevelop app.pro \
+ simpleimpl.cpp simpleimpl.h
+templateName = opieinput
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/opieinput/app.kdevelop b/languages/cpp/app_templates/opieinput/app.kdevelop
new file mode 100644
index 00000000..639a3215
--- /dev/null
+++ b/languages/cpp/app_templates/opieinput/app.kdevelop
@@ -0,0 +1,159 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>gtk</toc>
+ <toc>gnustep</toc>
+ <toc>python</toc>
+ <toc>php</toc>
+ <toc>perl</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>kdev3api</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>qmake User Guide</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Referrence Documentation</toc>
+ </ignoreqt_xml>
+ <ignoredevhelp>
+ <toc>bonobo-activation</toc>
+ <toc>gconf</toc>
+ <toc>gtksourceview</toc>
+ <toc>libbonobo</toc>
+ <toc>libbonoboui</toc>
+ </ignoredevhelp>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell></dbgshell>
+ <programargs>-qws</programargs>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <opie>
+ <quick_app>false</quick_app>
+ </opie>
+ <packaging>
+ <template>3</template>
+ <custom_dest>plugins/inputmethods</custom_dest>
+ <owner>
+ <package>%{APPNAMELC}</package>
+ <prio>0</prio>
+ <section>opie/inputmethods</section>
+ <maintainer>%{AUTHOR} %{EMAIL}</maintainer>
+ <arch>arm</arch>
+ <depends>task-opie-minimal</depends>
+ <version>%{VERSION}</version>
+ <desc>Empty</desc>
+ </owner>
+ <scripts>
+ <post>#!/bin/sh
+if pidof -s qpe >/dev/null; then
+ /opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadInputMethods()"
+else
+ exit 0
+fi
+</post>
+ <post_rem>#!/bin/sh
+if pidof -s qpe >/dev/null; then
+ /opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadInputMethods()"
+else
+ exit 0
+fi
+</post_rem>
+ </scripts>
+ </packaging>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram>qpe</mainprogram>
+ <programargs>-qws</programargs>
+ </run>
+ <envvars/>
+ </kdevtrollproject>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <codecompletion>
+ <codehinting outputview="1" enablech="0" selectview="0" />
+ </codecompletion>
+ <classstore>
+ <enablepcs>false</enablepcs>
+ <enablepp>false</enablepp>
+ <preparsing/>
+ </classstore>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL></interfaceURL>
+ <implementationURL></implementationURL>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions></commitoptions>
+ <updateoptions>-dP</updateoptions>
+ <addoptions></addoptions>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions></logoptions>
+ <rshoptions></rshoptions>
+ </kdevcvs>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/opieinput/app.pro b/languages/cpp/app_templates/opieinput/app.pro
new file mode 100644
index 00000000..1711c78f
--- /dev/null
+++ b/languages/cpp/app_templates/opieinput/app.pro
@@ -0,0 +1,38 @@
+TEMPLATE = lib
+CONFIG = qt dll qtopia warn_on release zecke-libqpe zecke-libopie opie-input
+HEADERS = %{APPNAMELC}.h
+SOURCES = %{APPNAMELC}.cpp
+TARGET = %{APPNAMELC}
+
+
+QUICK_SPEC_FOO = $$(OPIE_BUILD_QUICK_APP)
+contains( TEMPLATE, quick-template ){
+ contains( QUICK_SPEC_FOO, quick-app-lib ){
+ message( "foo" )
+ system( rm $$TARGET )
+ system( ln -s $$(OPIEDIR)/bin/quicklauncher $$TARGET)
+ DEFINES += OPIE_APP_INTERFACE
+ TEMPLATE = lib
+ CONFIG += dll
+ }else{
+ LI = $$join( TARGET, "lib", "lib", ".so*" )
+ system( rm $$LI )
+ TEMPLATE = app
+ }
+}
+
+
+QMAKE_LIBDIR= $$(OPIEDIR)/lib
+OPIE-SPEC=6
+
+zecke-libqpe {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ LIBS += -lqpe
+ DEPENDPATH += $$(OPIEDIR)/include
+}
+
+zecke-libopie {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ DEPENDPATH += $$(OPIEDIR)/include
+ LIBS += -lopie
+}
diff --git a/languages/cpp/app_templates/opieinput/opieinput.kdevtemplate b/languages/cpp/app_templates/opieinput/opieinput.kdevtemplate
new file mode 100644
index 00000000..39250370
--- /dev/null
+++ b/languages/cpp/app_templates/opieinput/opieinput.kdevtemplate
@@ -0,0 +1,129 @@
+# KDE Config File
+[General]
+Name=Opie Input
+Name[ca]=Entrada per a Opie
+Name[da]=Opie-input
+Name[de]=Opie-Eingabe
+Name[el]=Μέθοδος εισαγωγής Opie
+Name[es]=Entrada para Opie
+Name[et]=Opie sisestus
+Name[eu]=Opie sarrera
+Name[fa]=ورودی Opie
+Name[fr]=Entrée Opie
+Name[ga]=Ionchur Opie
+Name[gl]=Entrada Opie
+Name[hu]=Opie-s bemeneti modul
+Name[it]=Input di Opie
+Name[ja]=Opie 入力
+Name[nds]=Opie-Ingaav
+Name[ne]=ओपिइ आगत
+Name[nl]=Opie-invoer
+Name[pl]=Wejście Opie
+Name[pt]=Introdução de Dados do Opie
+Name[pt_BR]=Introdução de Dados do Opie
+Name[ru]=Модуль ввода Opie
+Name[sk]=Opie vstup
+Name[sr]=Opie уноÑ
+Name[sr@Latn]=Opie unos
+Name[sv]=Opie-inmatning
+Name[tr]=Opie Girdisi
+Name[zh_CN]=Opie 输入法
+Name[zh_TW]=Opie 輸入
+Icon=qmakeapp.png
+Category=C++/Embedded
+Comment=Generate an Opie input method plugin.
+Comment[ca]=Genera un connector de mètode d'entrada per a Opie.
+Comment[da]=Generér en Opie input-metode-plugin.
+Comment[de]=Erstellt ein Eingabemethode-Modul für Opie.
+Comment[el]=ΔημιουÏγία ενός Ï€Ïόσθετου μεθόδου εισαγωγής.
+Comment[es]=Genera un complemento de método de entrada para Opie.
+Comment[et]=Opie sisestusmeetodi plugina loomine.
+Comment[eu]=Sortu Opie-ren sarrera-metodoaren plugin bat.
+Comment[fa]=یک وصلۀ روش ورودی Opie تولید می‌کند.
+Comment[fr]=Génère un module externe de méthode d'entrée Opie.
+Comment[gl]=Xera unha extensión de método de entrada para Opie.
+Comment[hu]=Létrehoz egy Opie-s bemeneti modult.
+Comment[it]=Genera un plugin per il metodo di input Opie.
+Comment[nds]=Stellt en Ingaavmetood-Moduul för Opie op.
+Comment[ne]=ओपिइ आगत विधि पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Genereert een Opie-invoermethode-plugin.
+Comment[pl]=Generuje wtyczkę z metodą wejściową dla Opie.
+Comment[pt]=Gera um 'plugin' de introdução de dados do Opie.
+Comment[pt_BR]=Gera um 'plugin' de introdução de dados do Opie.
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ð²Ð¾Ð´Ð° данных Ð´Ð»Ñ Ñреды Opie.
+Comment[sk]=Vygeneruje Opie vstupný modul.
+Comment[sr]=Прави прикључак за Opie метод уноÑа.
+Comment[sr@Latn]=Pravi prikljuÄak za Opie metod unosa.
+Comment[sv]=Skapa ett insticksprogram för Opie-inmatning.
+Comment[tr]=Bir Opie girdi yöntemi eklentisi yarat
+Comment[zh_CN]=生æˆä¸€ä¸ª Opie 输入法æ’件。
+Comment[zh_TW]=產生一個 Opie 輸入法外掛程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.cpp
+Archive=opieinput.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir0]
+Type=mkdir
+Dir=%{dest}/pics
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/pics/%{APPNAMELC}
+
+[FILE2]
+Type=install
+Source=%{src}/Example.png
+Dest=%{dest}/pics/%{APPNAMELC}/%{APPNAMELC}.png
+Process=false
+
+[FILE3]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[FILE4]
+Type=install
+Source=%{src}/simpleimpl.cpp
+Dest=%{dest}/%{APPNAMELC}.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/simpleimpl.h
+Dest=%{dest}/%{APPNAMELC}.h
+
+[MSG]
+Type=message
+Comment=An opie input method plugin was created in %{dest}
+Comment[ca]=Un connector de mètode d'entrada per a Opie ha estat creat en %{dest}
+Comment[da]=At opie input-metode-plugin blev oprettet i %{dest}
+Comment[de]=Ein Eingabemethode-Modul für Opie wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο μεθόδου εισαγωγής opie δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento de método de entrada para Opie ha sido creado en %{dest}
+Comment[et]=Opie sisestusmeetodi plugin loodi asukohta %{dest}
+Comment[eu]=Opie-ren sarrera-metodoaren plugin bat sortu da hemen: %{dest}
+Comment[fa]=یک وصلۀ روش ورودی opie در %{dest} ایجاد شد
+Comment[fr]=Un module externe de méthode d'entrée Opie a été créé dans %{dest}
+Comment[gl]=Creouse unha extensión de método de entrada para opie en %{dest}
+Comment[hu]=Létrejött egy Opie-s bemeneti modul itt: %{dest}
+Comment[it]=È stato creato un plugin per il metodo di input Opie in %{dest}
+Comment[nds]=In %{dest} wöör en Opie-Ingaavmetoodmoduul opstellt
+Comment[ne]=ओपिइ आगत विधि पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Opie-invoermethode-plugins is aangemaakt in %{dest}
+Comment[pl]=Wtyczka z metodą wejściową dla Opie została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' de introdução de dados em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' de introdução de dados em %{dest}
+Comment[ru]=Модуль ввода Opie Ñоздан в %{dest}
+Comment[sk]=Opie vstupný modul bol vytvorený v %{dest}
+Comment[sr]=Прикључак за Opie метод уноÑа направљен је у %{dest}
+Comment[sr@Latn]=PrikljuÄak za Opie metod unosa napravljen je u %{dest}
+Comment[sv]=Ett insticksprogram för Opie-inmatning skapades i %{dest}
+Comment[tr]=Bir opie girdi yöntemi eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 opie 输入法
+Comment[zh_TW]=一個 Opie 輸入法外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
+
diff --git a/languages/cpp/app_templates/opieinput/opieinput.png b/languages/cpp/app_templates/opieinput/opieinput.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/opieinput/opieinput.png
Binary files differ
diff --git a/languages/cpp/app_templates/opieinput/simpleimpl.cpp b/languages/cpp/app_templates/opieinput/simpleimpl.cpp
new file mode 100644
index 00000000..6da986eb
--- /dev/null
+++ b/languages/cpp/app_templates/opieinput/simpleimpl.cpp
@@ -0,0 +1,157 @@
+#include <qwidget.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qsignalmapper.h>
+#include <qpushbutton.h>
+#include <qpe/resource.h>
+
+#include "%{APPNAMELC}.h"
+
+%{APPNAME}::%{APPNAME}(QWidget* par, WFlags fl )
+ : QHBox(par, "name", fl )
+{
+ QCheckBox *box1 = new QCheckBox(tr("Alt"),this);
+ connect(box1,SIGNAL(toggled(bool)),
+ this,SLOT(slotAlt(bool)));
+ m_alt = box1;
+ box1 = new QCheckBox(tr("Shift"),this );
+ connect(box1,SIGNAL(toggled(bool)),
+ this,SLOT(slotShift(bool)));
+ m_shi = box1;
+ box1 = new QCheckBox(tr("Ctrl","Control Shortcut on keyboard"),this );
+ connect(box1,SIGNAL(toggled(bool)),
+ this,SLOT(slotCtrl(bool)));
+ m_ctrl = box1;
+
+ QSignalMapper *map = new QSignalMapper(this);
+ QPushButton *btn = new QPushButton("a",this);
+ map->setMapping(btn,0);
+ connect(btn,SIGNAL(clicked()),map,SLOT(map()));
+
+ btn = new QPushButton("b",this);
+ map->setMapping(btn,1);
+ connect(btn,SIGNAL(clicked()),map,SLOT(map()));
+
+ btn = new QPushButton("c",this);
+ map->setMapping(btn,2);
+ connect(btn,SIGNAL(clicked()),map,SLOT(map()));
+
+ connect(map,SIGNAL(mapped(int)),
+ this,SLOT(slotKey(int)));
+ resetState();
+}
+
+%{APPNAME}::~%{APPNAME}(){
+}
+
+void %{APPNAME}::resetState(){
+ m_state = 0;
+ m_shi->setChecked(false);
+ m_ctrl->setChecked(false);
+ m_alt->setChecked(false);
+}
+
+void %{APPNAME}::slotKey(int _ke){
+ int ke = _ke + 0x61; // 0 + 65 = 0x41 == A
+ if(m_state & ShiftButton )
+ ke -= 0x20;
+
+ /*
+ * Send the key
+ * ke is the unicode
+ * _ke + 0x41 is the keycode
+ * m_state Normally the state
+ * down/up
+ * auto repeat
+ */
+ emit key(ke, _ke +0x41,m_state,true,false);
+ emit key(ke, _ke + 0x41,m_state,false,false);
+}
+
+void %{APPNAME}::slotShift(bool b){
+ if(b)
+ m_state |= ShiftButton;
+ else
+ m_state &= ~ShiftButton;
+}
+
+void %{APPNAME}::slotAlt(bool b){
+ if(b)
+ m_state |= AltButton;
+ else
+ m_state &= ~AltButton;
+}
+
+void %{APPNAME}::slotCtrl(bool b){
+ if(b)
+ m_state |= ControlButton;
+ else
+ m_state &= ~ControlButton;
+}
+
+
+
+%{APPNAME}Impl::%{APPNAME}Impl()
+ : m_pickboard(0), m_icn(0)
+{
+}
+
+%{APPNAME}Impl::~%{APPNAME}Impl()
+{
+ delete m_pickboard;
+ delete m_icn;
+}
+
+QWidget *%{APPNAME}Impl::inputMethod( QWidget *parent, Qt::WFlags f )
+{
+ if ( !m_pickboard )
+ m_pickboard = new %{APPNAME}( parent, f );
+ return m_pickboard;
+}
+
+void %{APPNAME}Impl::resetState()
+{
+ if ( m_pickboard )
+ m_pickboard->resetState();
+}
+
+QPixmap *%{APPNAME}Impl::icon()
+{
+ if ( !m_icn )
+ m_icn = new QPixmap(Resource::loadPixmap("Tux"));
+ return m_icn;
+}
+
+QString %{APPNAME}Impl::name()
+{
+ return QObject::tr("Example Input");
+}
+
+void %{APPNAME}Impl::onKeyPress( QObject *receiver, const char *slot )
+{
+ if ( m_pickboard )
+ QObject::connect( m_pickboard, SIGNAL(key(ushort,ushort,ushort,bool,bool)), receiver, slot );
+}
+
+#ifndef QT_NO_COMPONENT
+QRESULT %{APPNAME}Impl::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = this;
+ else if ( uuid == IID_InputMethod )
+ *iface = this;
+ else
+ return QS_FALSE;
+
+ if ( *iface )
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+Q_EXPORT_INTERFACE()
+{
+ Q_CREATE_INSTANCE( %{APPNAME}Impl )
+}
+#endif
+
diff --git a/languages/cpp/app_templates/opieinput/simpleimpl.h b/languages/cpp/app_templates/opieinput/simpleimpl.h
new file mode 100644
index 00000000..362e59b3
--- /dev/null
+++ b/languages/cpp/app_templates/opieinput/simpleimpl.h
@@ -0,0 +1,50 @@
+#ifndef %{APPNAME}IMPL_H
+#define %{APPNAME}IMPL_H
+
+#include <qhbox.h>
+
+#include <qpe/inputmethodinterface.h>
+
+class QPixmap;
+class QCheckBox;
+class %{APPNAME} : public QHBox {
+ Q_OBJECT
+public:
+ %{APPNAME}( QWidget *par, WFlags f );
+ ~%{APPNAME}();
+ void resetState();
+private slots:
+ void slotKey(int);
+ void slotShift(bool);
+ void slotAlt(bool);
+ void slotCtrl(bool);
+signals:
+ void key(ushort,ushort,ushort,bool,bool);
+private:
+ int m_state;
+ QCheckBox *m_alt,*m_shi,*m_ctrl;
+};
+
+class %{APPNAME}Impl : public InputMethodInterface
+{
+public:
+ %{APPNAME}Impl();
+ virtual ~%{APPNAME}Impl();
+
+#ifndef QT_NO_COMPONENT
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+ Q_REFCOUNT
+#endif
+
+ virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f );
+ virtual void resetState();
+ virtual QPixmap *icon();
+ virtual QString name();
+ virtual void onKeyPress( QObject *receiver, const char *slot );
+
+private:
+ %{APPNAME} *m_pickboard;
+ QPixmap *m_icn;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/opiemenu/.kdev_ignore b/languages/cpp/app_templates/opiemenu/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/opiemenu/.kdev_ignore
diff --git a/languages/cpp/app_templates/opiemenu/Example.png b/languages/cpp/app_templates/opiemenu/Example.png
new file mode 100644
index 00000000..f63d0bc7
--- /dev/null
+++ b/languages/cpp/app_templates/opiemenu/Example.png
Binary files differ
diff --git a/languages/cpp/app_templates/opiemenu/Makefile.am b/languages/cpp/app_templates/opiemenu/Makefile.am
new file mode 100644
index 00000000..c44b3f96
--- /dev/null
+++ b/languages/cpp/app_templates/opiemenu/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = Makefile.am Example.png app.kdevelop app.pro \
+ simpleimpl.cpp simpleimpl.h
+
+templateName = opiemenu
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/opiemenu/app.kdevelop b/languages/cpp/app_templates/opiemenu/app.kdevelop
new file mode 100644
index 00000000..eee2c55a
--- /dev/null
+++ b/languages/cpp/app_templates/opiemenu/app.kdevelop
@@ -0,0 +1,158 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>gtk</toc>
+ <toc>gnustep</toc>
+ <toc>python</toc>
+ <toc>php</toc>
+ <toc>perl</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>kdev3api</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>qmake User Guide</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Referrence Documentation</toc>
+ </ignoreqt_xml>
+ <ignoredevhelp>
+ <toc>bonobo-activation</toc>
+ <toc>gconf</toc>
+ <toc>gtksourceview</toc>
+ <toc>libbonobo</toc>
+ <toc>libbonoboui</toc>
+ </ignoredevhelp>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell></dbgshell>
+ <programargs>-qws</programargs>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <opie>
+ <quick_app>true</quick_app>
+ </opie>
+ <packaging>
+ <template>2</template>
+ <owner>
+ <package>%{APPNAMELC}</package>
+ <prio>0</prio>
+ <section>opie/applets</section>
+ <maintainer>%{AUTHOR} %{EMAIL}</maintainer>
+ <arch>arm</arch>
+ <depends>task-opie-minimal</depends>
+ <version>%{VERSION}</version>
+ <desc>Empty</desc>
+ </owner>
+ <scripts>
+ <post>#!/bin/sh
+if pidof -s qpe >/dev/null; then
+ /opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadApplets()"
+else
+ exit 0
+fi
+</post>
+ <post_rem>#!/bin/sh
+if pidof -s qpe >/dev/null; then
+ /opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadApplets()"
+else
+ exit 0
+fi
+</post_rem>
+ </scripts>
+ </packaging>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram>./%{APPNAMELC}</mainprogram>
+ <programargs>-qws</programargs>
+ </run>
+ <envvars/>
+ </kdevtrollproject>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <codecompletion>
+ <codehinting outputview="1" enablech="0" selectview="0" />
+ </codecompletion>
+ <classstore>
+ <enablepcs>false</enablepcs>
+ <enablepp>false</enablepp>
+ <preparsing/>
+ </classstore>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL></interfaceURL>
+ <implementationURL></implementationURL>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions></commitoptions>
+ <updateoptions>-dP</updateoptions>
+ <addoptions></addoptions>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions></logoptions>
+ <rshoptions></rshoptions>
+ </kdevcvs>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/opiemenu/app.pro b/languages/cpp/app_templates/opiemenu/app.pro
new file mode 100644
index 00000000..71bc208c
--- /dev/null
+++ b/languages/cpp/app_templates/opiemenu/app.pro
@@ -0,0 +1,38 @@
+TEMPLATE = lib
+CONFIG = qt dll qtopia warn_on release zecke-libqpe zecke-libopie opie-menuapplet
+HEADERS = %{APPNAMELC}.h
+SOURCES = %{APPNAMELC}.cpp
+TARGET = %{APPNAMELC}
+
+
+QUICK_SPEC_FOO = $$(OPIE_BUILD_QUICK_APP)
+contains( TEMPLATE, quick-template ){
+ contains( QUICK_SPEC_FOO, quick-app-lib ){
+ message( "foo" )
+ system( rm $$TARGET )
+ system( ln -s $$(OPIEDIR)/bin/quicklauncher $$TARGET)
+ DEFINES += OPIE_APP_INTERFACE
+ TEMPLATE = lib
+ CONFIG += dll
+ }else{
+ LI = $$join( TARGET, "lib", "lib", ".so*" )
+ system( rm $$LI )
+ TEMPLATE = app
+ }
+}
+
+
+QMAKE_LIBDIR= $$(OPIEDIR)/lib
+OPIE-SPEC=6
+
+zecke-libqpe {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ LIBS += -lqpe
+ DEPENDPATH += $$(OPIEDIR)/include
+}
+
+zecke-libopie {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ DEPENDPATH += $$(OPIEDIR)/include
+ LIBS += -lopie
+}
diff --git a/languages/cpp/app_templates/opiemenu/opiemenu.kdevtemplate b/languages/cpp/app_templates/opiemenu/opiemenu.kdevtemplate
new file mode 100644
index 00000000..b32b13ed
--- /dev/null
+++ b/languages/cpp/app_templates/opiemenu/opiemenu.kdevtemplate
@@ -0,0 +1,132 @@
+# KDE Config File
+[General]
+Name=Opie Menu Applet
+Name[ca]=Una miniaplicació de menú per a Opie
+Name[da]=Opie menu-applet
+Name[de]=Opie-Menü-Miniprogramm (Applet)
+Name[el]=ΜικÏοεφαÏμογή Î¼ÎµÎ½Î¿Ï Opie
+Name[es]=Applet de menú para Opie
+Name[et]=Opie menüüaplett
+Name[eu]=Opie-ren menu applet-a
+Name[fa]=برنامک گزینگان Opie
+Name[fr]=Applet de menu Opie
+Name[ga]=Feidhmchláirín Roghchláir Opie
+Name[gl]=Applet de menú Opie
+Name[hu]=Opie-s menü-kisalkalmazás
+Name[it]=Applet di menu Opie
+Name[ja]=Opie メニューアプレット
+Name[nds]=Menü-Lüttprogramm för Opie
+Name[ne]=ओपिइ मेनॠà¤à¤ªà¥à¤²à¥‡à¤Ÿ
+Name[nl]=Opie-menuapplet
+Name[pl]=Aplet menu Opie
+Name[pt]='Applet' do Menu do Opie
+Name[pt_BR]='Applet' do Menu do Opie
+Name[ru]=Ðплет меню Opie
+Name[sk]=Opie menu pplet
+Name[sr]=Opie аплет менија
+Name[sr@Latn]=Opie aplet menija
+Name[sv]=Opie-menyminiprogram
+Name[tr]=Opie Menü Küçük Uygulaması
+Name[zh_CN]=Opie èœå•å°ç¨‹åº
+Name[zh_TW]=Opie é¸å–®å°ç¨‹å¼
+Icon=qmakeapp.png
+Category=C++/Embedded
+Comment=Generate an Opie menu applet.
+Comment[ca]=Genera una miniaplicació de menú per a Opie.
+Comment[da]=Generér en Opie menu-applet.
+Comment[de]=Erstellt ein Opie-Menü-Miniprogramm (Applet).
+Comment[el]=ΔημιουÏγία μίας μικÏοεφαÏμογής Î¼ÎµÎ½Î¿Ï Opie.
+Comment[es]=Genera un applet de menú para Opie.
+Comment[et]=Opie menüüapleti loomine.
+Comment[eu]=Sortu Opie-ren menu applet bat.
+Comment[fa]=یک برنامک گزینگان Opie تولید می‌کند.
+Comment[fr]=Génère un applet de menu Opie.
+Comment[gl]=Xera un applet de menu para Opie.
+Comment[hu]=Létrehoz egy Opie-s menü-kisalkalmazást.
+Comment[it]=Genera un'applet di menu Opie.
+Comment[ja]=Opie メニューアプレットを作æˆ
+Comment[nds]=Stellt en Menü-Lüttprogramm för Opie op.
+Comment[ne]=ओपिइ मेनॠà¤à¤ªà¥à¤²à¥‡à¤Ÿ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Genereert een Opie-menuapplet.
+Comment[pl]=Generuje aplet menu Opie
+Comment[pt]=Gera uma 'applet' do menu do Opie.
+Comment[pt_BR]=Gera uma 'applet' do menu do Opie.
+Comment[ru]=Создание аплета меню Opie.
+Comment[sk]=Vygeneruje Opie menu applet.
+Comment[sr]=Прави Opie аплет менија.
+Comment[sr@Latn]=Pravi Opie aplet menija.
+Comment[sv]=Skapa ett Opie-menyminiprogram.
+Comment[tr]=Bir Opie menü küçük uygulaması yarat
+Comment[zh_CN]=生æˆä¸€ä¸ª Opie èœå•å°ç¨‹åºã€‚
+Comment[zh_TW]=產生一個 Opie é¸å–®å°ç¨‹å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.cpp
+Archive=opiemenu.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir0]
+Type=mkdir
+Dir=%{dest}/pics
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/pics/%{APPNAMELC}
+
+[FILE2]
+Type=install
+Source=%{src}/Example.png
+Dest=%{dest}/pics/%{APPNAMELC}/%{APPNAMELC}.png
+Process=false
+
+[FILE3]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[FILE4]
+Type=install
+Source=%{src}/simpleimpl.cpp
+Dest=%{dest}/%{APPNAMELC}.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/simpleimpl.h
+Dest=%{dest}/%{APPNAMELC}.h
+
+[MSG]
+Type=message
+Comment=An opie menu applet was created in %{dest}
+Comment[ca]=Una miniaplicació de menú per a Opie ha estat creat en %{dest}
+Comment[da]=En opie menu-applet blev oprettet i %{dest}
+Comment[de]=Ein Opie-Menü-Miniprogramm (Applet) wurde in %{dest} erstellt.
+Comment[el]=Μία μικÏοεφαÏμογή Î¼ÎµÎ½Î¿Ï opie δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un applet de menú para Opie ha sido creado en %{dest}
+Comment[et]=Opie menüüaplett loodi asukohta %{dest}
+Comment[eu]= Opie-ren menu applet bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامک گزینگان opie در %{dest} ایجاد شد
+Comment[fr]=Un applet de menu Opie a été créé dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchláirín roghchláir opie i %{dest}
+Comment[gl]=Creouse un applet de menu para opie en %{dest}
+Comment[hu]=Létrejött egy Opie-s menü-kisalkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applet di menu Opie in %{dest}
+Comment[ja]=Opie メニューアプレットを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Menü-Lüttprogramm för Opie opstellt
+Comment[ne]=ओपिइ मेनॠà¤à¤ªà¥à¤²à¥‡à¤Ÿ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Opie-menuapplet is aangemaakt in %{dest}
+Comment[pl]=Aplet menu Opie został utworzony w %{dest}
+Comment[pt]=Foi criada uma 'applet' do menu do Opie em %{dest}
+Comment[pt_BR]=Foi criada uma 'applet' do menu do Opie em %{dest}
+Comment[ru]=Ðплет меню Opie Ñоздан в %{dest}
+Comment[sk]=Opie menu applet bol vytvorený v %{dest}
+Comment[sr]=Opie аплет менија направљен је у %{dest}
+Comment[sr@Latn]=Opie aplet menija napravljen je u %{dest}
+Comment[sv]=Ett Opie-menyprogram skapades i %{dest}
+Comment[tr]=Bir opie menü küçük uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 opie èœå•å°ç¨‹åº
+Comment[zh_TW]=一個 Opie é¸å–®å°ç¨‹å¼å·²å»ºç«‹æ–¼ %{dest}
+
diff --git a/languages/cpp/app_templates/opiemenu/opiemenu.png b/languages/cpp/app_templates/opiemenu/opiemenu.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/opiemenu/opiemenu.png
Binary files differ
diff --git a/languages/cpp/app_templates/opiemenu/simpleimpl.cpp b/languages/cpp/app_templates/opiemenu/simpleimpl.cpp
new file mode 100644
index 00000000..95245661
--- /dev/null
+++ b/languages/cpp/app_templates/opiemenu/simpleimpl.cpp
@@ -0,0 +1,78 @@
+#include "%{APPNAMELC}.h"
+
+#include <qpe/applnk.h>
+#include <qpe/resource.h>
+
+/* QT */
+#include <qiconset.h>
+#include <qpopupmenu.h>
+#include <qmessagebox.h>
+
+
+%{APPNAME}::%{APPNAME}()
+ :QObject( 0, "%{APPNAME}" )
+{
+}
+
+%{APPNAME}::~%{APPNAME} ( )
+{}
+
+int %{APPNAME}::position() const
+{
+ return 3;
+}
+
+QString %{APPNAME}::name() const
+{
+ return tr( "MenuApplet Example Name" );
+}
+
+QString %{APPNAME}::text() const
+{
+ return tr( "Click the white rabbit" );
+}
+
+
+QIconSet %{APPNAME}::icon() const
+{
+ QPixmap pix;
+ QImage img = Resource::loadImage( "Tux" );
+ if ( !img.isNull() )
+ pix.convertFromImage( img.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ) );
+ return pix;
+}
+
+QPopupMenu* %{APPNAME}::popup(QWidget*) const
+{
+ /* no subdir */
+ return 0;
+}
+
+void %{APPNAME}::activated()
+{
+ QMessageBox::information(0,tr("No white rabbit found"),
+ tr("<qt>No white rabbit was seen near Opie."
+ "Only the beautiful OpieZilla is available"
+ "for your pleassure</qt>"));
+}
+
+
+QRESULT %{APPNAME}::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = this;
+ else if ( uuid == IID_MenuApplet )
+ *iface = this;
+ else
+ return QS_FALSE;
+
+ if ( *iface )
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+Q_EXPORT_INTERFACE()
+{
+ Q_CREATE_INSTANCE( %{APPNAME} )
+}
diff --git a/languages/cpp/app_templates/opiemenu/simpleimpl.h b/languages/cpp/app_templates/opiemenu/simpleimpl.h
new file mode 100644
index 00000000..3961e3c4
--- /dev/null
+++ b/languages/cpp/app_templates/opiemenu/simpleimpl.h
@@ -0,0 +1,32 @@
+#ifndef %{APPNAME}_MENU_APPLET_H
+#define %{APPNAME}_MENU_APPLET_H
+
+#include <qpe/menuappletinterface.h>
+
+#include <qobject.h>
+
+class %{APPNAME} : public QObject, public MenuAppletInterface
+{
+
+ Q_OBJECT
+
+public:
+ %{APPNAME} ( );
+ virtual ~%{APPNAME} ( );
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+ Q_REFCOUNT
+
+ virtual int position() const;
+
+ virtual QString name ( ) const;
+ virtual QIconSet icon ( ) const;
+ virtual QString text ( ) const;
+ /* virtual QString tr( const char* ) const;
+ virtual QString tr( const char*, const char* ) const;
+ */
+ virtual QPopupMenu *popup ( QWidget *parent ) const;
+ virtual void activated ( );
+};
+
+#endif
diff --git a/languages/cpp/app_templates/opienet/.kdev_ignore b/languages/cpp/app_templates/opienet/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/.kdev_ignore
diff --git a/languages/cpp/app_templates/opienet/Example.png b/languages/cpp/app_templates/opienet/Example.png
new file mode 100644
index 00000000..f63d0bc7
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/Example.png
Binary files differ
diff --git a/languages/cpp/app_templates/opienet/Makefile.am b/languages/cpp/app_templates/opienet/Makefile.am
new file mode 100644
index 00000000..47dc4231
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = Makefile.am Example.png app.kdevelop app.pro \
+ simpleiface.cpp simpleiface.h simplemodule.h \
+ simplemodule.cpp
+
+templateName = opienet
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/opienet/app.kdevelop b/languages/cpp/app_templates/opienet/app.kdevelop
new file mode 100644
index 00000000..660b7bee
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/app.kdevelop
@@ -0,0 +1,143 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>gtk</toc>
+ <toc>gnustep</toc>
+ <toc>python</toc>
+ <toc>php</toc>
+ <toc>perl</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>kdev3api</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>qmake User Guide</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Referrence Documentation</toc>
+ </ignoreqt_xml>
+ <ignoredevhelp>
+ <toc>bonobo-activation</toc>
+ <toc>gconf</toc>
+ <toc>gtksourceview</toc>
+ <toc>libbonobo</toc>
+ <toc>libbonoboui</toc>
+ </ignoredevhelp>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell></dbgshell>
+ <programargs>-qws</programargs>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <opie>
+ <quick_app>false</quick_app>
+ </opie>
+ <packaging>
+ <template>3</template>
+ <custom_dest>plugins/networksettings</custom_dest>
+ <owner>
+ <package>%{APPNAMELC}</package>
+ <prio>0</prio>
+ <section>opie/settings</section>
+ <maintainer>%{AUTHOR} %{EMAIL}</maintainer>
+ <arch>arm</arch>
+ <depends>opie-networksettings</depends>
+ <version>%{VERSION}</version>
+ <desc>Empty</desc>
+ </owner>
+ </packaging>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram>qpe</mainprogram>
+ <programargs>-qws</programargs>
+ </run>
+ <envvars/>
+ </kdevtrollproject>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <codecompletion>
+ <codehinting outputview="1" enablech="0" selectview="0" />
+ </codecompletion>
+ <classstore>
+ <enablepcs>false</enablepcs>
+ <enablepp>false</enablepp>
+ <preparsing/>
+ </classstore>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL></interfaceURL>
+ <implementationURL></implementationURL>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions></commitoptions>
+ <updateoptions>-dP</updateoptions>
+ <addoptions></addoptions>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions></logoptions>
+ <rshoptions></rshoptions>
+ </kdevcvs>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/opienet/app.pro b/languages/cpp/app_templates/opienet/app.pro
new file mode 100644
index 00000000..53fb6eea
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/app.pro
@@ -0,0 +1,39 @@
+TEMPLATE = lib
+CONFIG = qt dll qtopia warn_on release zecke-libqpe zecke-libopie opie-network
+HEADERS = %{APPNAMELC}module.h %{APPNAMELC}iface.h
+SOURCES = %{APPNAMELC}module.cpp %{APPNAMELC}iface.cpp
+TARGET = %{APPNAMELC}
+LIBS += -linterfaces
+
+
+QUICK_SPEC_FOO = $$(OPIE_BUILD_QUICK_APP)
+contains( TEMPLATE, quick-template ){
+ contains( QUICK_SPEC_FOO, quick-app-lib ){
+ message( "foo" )
+ system( rm $$TARGET )
+ system( ln -s $$(OPIEDIR)/bin/quicklauncher $$TARGET)
+ DEFINES += OPIE_APP_INTERFACE
+ TEMPLATE = lib
+ CONFIG += dll
+ }else{
+ LI = $$join( TARGET, "lib", "lib", ".so*" )
+ system( rm $$LI )
+ TEMPLATE = app
+ }
+}
+
+
+QMAKE_LIBDIR= $$(OPIEDIR)/lib
+OPIE-SPEC=6
+
+zecke-libqpe {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ LIBS += -lqpe
+ DEPENDPATH += $$(OPIEDIR)/include
+}
+
+zecke-libopie {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ DEPENDPATH += $$(OPIEDIR)/include
+ LIBS += -lopie
+}
diff --git a/languages/cpp/app_templates/opienet/opienet.kdevtemplate b/languages/cpp/app_templates/opienet/opienet.kdevtemplate
new file mode 100644
index 00000000..4ab9ebbe
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/opienet.kdevtemplate
@@ -0,0 +1,142 @@
+# KDE Config File
+[General]
+Name=Opie Networksettings
+Name[br]=Kefluniadur rouedad Opie
+Name[ca]=Connector de preferències de xarxa per a Opie
+Name[da]=Opie netværksopsætning
+Name[de]=Opie-Netzwerkeinstellungen
+Name[el]=Ρυθμίσεις δικτÏου Opie
+Name[es]=Preferencias de red para Opie
+Name[et]=Opie võrguseadustused
+Name[eu]=Opie-ren sare-ezarpenak
+Name[fa]=تنظیمات شبکۀ Opie
+Name[fr]=Paramètres réseau pour Opie
+Name[ga]=Socruithe Líonra Opie
+Name[hu]=Opie-s hálózati beállítómodul
+Name[it]=Impostazioni di rete di Opie
+Name[ja]=Opie ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®š
+Name[nds]=Opie-Nettwarkinstellen
+Name[ne]=ओपिइ सञà¥à¤œà¤¾à¤² सेटिङ
+Name[nl]=Opie-netwerkinstellingen
+Name[pl]=Ustawienia sieciowe Opie
+Name[pt]=Configuração de rede do Opie
+Name[pt_BR]=Configuração de rede do Opie
+Name[ru]=Параметры Ñети Opie
+Name[sk]=Opie sieťové nastavenia
+Name[sr]=Opie мрежна подешавања
+Name[sr@Latn]=Opie mrežna podešavanja
+Name[sv]=Opie nätverksinställningar
+Name[tr]=Opie Ağ Ayarları
+Name[zh_CN]=Opie 网络设置
+Name[zh_TW]=Opie 網路設定
+Icon=qmakeapp.png
+Category=C++/Embedded
+Comment=Generate an Opie network config plugin.
+Comment[ca]=Genera un connector de preferències de xarxa per a Opie.
+Comment[da]=Generér en Opie netværks-config-plugin.
+Comment[de]=Erstellt ein Modul für Opie-Netzwerkeinstellungen.
+Comment[el]=ΔημιουÏγία ενός Ï€Ïόσθετου ÏÏθμισης δικτÏου Opie.
+Comment[es]=Genera un complemento de configuración de red para Opie.
+Comment[et]=Opie võrguseadistuste plugina loomine.
+Comment[eu]=Sortu Opie-ren sare-ezarpenetarako plugin bat.
+Comment[fa]=یک وصلۀ پیکربندی شبکۀ Opie تولید می‌کند.
+Comment[fr]=Génère un module externe de configuration réseau pour Opie.
+Comment[ga]=Cruthaigh breiseán cumraíochta líonra Opie.
+Comment[gl]=Xera unha extensión de configuración da rede para Opie.
+Comment[hu]=Létrehoz egy Opie-s hálózati beállítómodult.
+Comment[it]=Genera un plugin di configurazione di rete Opie.
+Comment[ja]=Opie ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®šãƒ—ラグインを作æˆ
+Comment[nds]=Stellt en Moduul för Opie-Nettwarkinstellen op.
+Comment[ne]=ओपिइ सञà¥à¤œà¤¾à¤² कनà¥à¤«à¤¿à¤— पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Genereert een Opie netwerkconfiguratieplugin.
+Comment[pl]=Generuje wtyczkę do ustawień sieciowych Opie
+Comment[pt]=Gera um 'plugin' de configuração da rede do Opie.
+Comment[pt_BR]=Gera um 'plugin' de configuração da rede do Opie.
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð½Ð°Ñтройки Ñети Opie.
+Comment[sk]=Vygeneruje Opie modul pre sieťovú konfiguráciu.
+Comment[sr]=Прави прикључак за Opie мрежна подешавања.
+Comment[sr@Latn]=Pravi prikljuÄak za Opie mrežna podeÅ¡avanja.
+Comment[sv]=Skapa ett Opie-insticksprogram för nätverksinställning.
+Comment[tr]=Opie aÄŸ ayar eklentisi yarat.
+Comment[zh_CN]=生æˆä¸€ä¸ª Opie 网络é…ç½®æ’件。
+Comment[zh_TW]=產生一個 Opie 網路設定外掛程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.cpp
+Archive=opienet.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir0]
+Type=mkdir
+Dir=%{dest}/pics
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/pics/%{APPNAMELC}
+
+[FILE2]
+Type=install
+Source=%{src}/Example.png
+Dest=%{dest}/pics/%{APPNAMELC}/%{APPNAMELC}.png
+Process=false
+
+[FILE3]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[FILE4]
+Type=install
+Source=%{src}/simplemodule.cpp
+Dest=%{dest}/%{APPNAMELC}module.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/simpleiface.cpp
+Dest=%{dest}/%{APPNAMELC}iface.cpp
+
+[FILE6]
+Type=install
+Source=%{src}/simplemodule.h
+Dest=%{dest}/%{APPNAMELC}module.h
+
+[FILE7]
+Type=install
+Source=%{src}/simpleiface.h
+Dest=%{dest}/%{APPNAMELC}iface.h
+
+[MSG]
+Type=message
+Comment=An opie network settings plugin was created in %{dest}
+Comment[ca]=Un connector de preferències de xarxa per a Opie ha estat creat en %{dest}
+Comment[da]=En opie netværksopsætning-plugin blev oprettet i %{dest}
+Comment[de]=Ein Modul für Opie-Netzwerkeinstellungen wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο ÏÏθμισης δικτÏου του opie δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento de preferencias de red para Opie ha sido creado en %{dest}
+Comment[et]=Opie võrguseadistuste plugin loodi asukohta %{dest}
+Comment[eu]=Opie-ren sare-ezarpenetarako plugin bat sortu da hemen: %{dest}
+Comment[fa]=یک وصلۀ تنظیمات شبکۀ opie در %{dest} ایجاد شد
+Comment[fr]=Un module externe de configuration réseau pour Opie a été créé dans %{dest}
+Comment[gl]=Creouse unha extensión de configuración da rede para opie en %{dest}
+Comment[hu]=Létrejött egy Opie-s hálózati beállítómodul itt: %{dest}
+Comment[it]=È stato creato un plugin per le impostazioni di rete di Opie in %{dest}
+Comment[ja]=Opie ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®šãƒ—ラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Nettwarkinstellenmoduul för Opie opstellt
+Comment[ne]=ओपिइ सञà¥à¤œà¤¾à¤² सेटिङ पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Opie netwerkconfiguratieplugin is aangemaakt in %{dest}
+Comment[pl]=Wtyczka ustawień sieciowych Opie została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' de configuração da rede do Opie em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' de configuração da rede do Opie em %{dest}
+Comment[ru]=Модуль наÑтройки Ñети Opie Ñоздан в %{dest}
+Comment[sk]=Opie module pre sieťové nastavenia bol vytvorený v %{dest}
+Comment[sr]=Прикључак за Opie мрежна подешавања направљен је у %{dest}
+Comment[sr@Latn]=PrikljuÄak za Opie mrežna podeÅ¡avanja napravljen je u %{dest}
+Comment[sv]=Ett Opie-insticksprogram för nätverksinställning skapades i %{dest}
+Comment[tr]=Bir opie ağ ayar eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 opie 网络设置æ’件
+Comment[zh_TW]=一個 Opie 網路設定外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
+
diff --git a/languages/cpp/app_templates/opienet/opienet.png b/languages/cpp/app_templates/opienet/opienet.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/opienet.png
Binary files differ
diff --git a/languages/cpp/app_templates/opienet/simmplemodule.h b/languages/cpp/app_templates/opienet/simmplemodule.h
new file mode 100644
index 00000000..9158a7c8
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/simmplemodule.h
@@ -0,0 +1,36 @@
+#ifndef %{APPNAME}_NETWORK_MODULE_H
+#define %{APPNAME}_NETWORK_MODULE_H
+
+#include <module.h>
+
+class VirtualModule : Module {
+
+signals:
+ void updateInterface(Interface* i );
+
+public:
+ VirtualModule();
+ ~VirtualModule();
+
+ const QString type() {return QString::fromLatin1("vpn" );}
+ void setProfile( const QString& ) {}
+ bool isOwner( Interface* );
+ QWidget *configure( Interface* );
+ QWidget *information( Interface* );
+ QList<Interface> getInterfaces();
+ void possibleNewInterfaces( QMap<QString, QString>& );
+ Interface *addNewInterface( const QString& );
+ bool remove( Interface* iface );
+ QString getPixmapName( Interface* ) {return QString::fromLatin1("Tux"); }
+ void receive( const QCString&, const QByteArray& ar ) {} // don't listen
+private:
+ QList<Interface> m_interfaces;
+};
+
+extern "C" {
+ void* create_plugin() {
+ return new VirtualModule();
+ }
+};
+
+#endif
diff --git a/languages/cpp/app_templates/opienet/simpleiface.cpp b/languages/cpp/app_templates/opienet/simpleiface.cpp
new file mode 100644
index 00000000..9182a2f9
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/simpleiface.cpp
@@ -0,0 +1,43 @@
+#include "%{APPNAMELC}iface.h"
+
+%{APPNAME}Interface::%{APPNAME}Interface( QObject* parent,
+ const char* name,
+ bool status )
+ : Interface(parent, name, status )
+{
+}
+
+%{APPNAME}Interface::~%{APPNAME}Interface() {
+}
+
+bool %{APPNAME}Interface::refresh() {
+/* we do VPN over ppp
+ * so replace the interfaceName with
+ * something actual existing
+ * I take wlan0 in my case
+ */
+ QString old = getInterfaceName();
+ qWarning("Interface name was " + old );
+ setInterfaceName( "wlan0" );
+
+ bool b =Interface::refresh();
+ setInterfaceName( old );
+
+/* new and old interface name */
+ emit updateInterface(this);
+ return b;
+}
+
+
+void %{APPNAME}Interface::start() {
+// call pptp
+ setStatus(true);
+ refresh();
+ emit updateMessage("VPN started");
+}
+
+void %{APPNAME}Interface::stop() {
+ setStatus(false );
+ refresh();
+ emit updateMessage("VPN halted");
+}
diff --git a/languages/cpp/app_templates/opienet/simpleiface.h b/languages/cpp/app_templates/opienet/simpleiface.h
new file mode 100644
index 00000000..f235c160
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/simpleiface.h
@@ -0,0 +1,22 @@
+#ifndef EXAMPLE_IFACE_VPN_H
+#define EXAMPLE_IFACE_VPN_H
+
+#include <interfaces/interface.h>
+
+class %{APPNAME}Interface : public Interface {
+ Q_OBJECT
+
+public:
+ %{APPNAME}Interface(QObject* parent, const char* name = "vpn", bool up = false );
+ ~%{APPNAME}Interface();
+
+public slots:
+ bool refresh(); // refresh information
+ void start();
+ void stop();
+
+private:
+ bool m_isUp : 1;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/opienet/simplemodule.cpp b/languages/cpp/app_templates/opienet/simplemodule.cpp
new file mode 100644
index 00000000..a67974a8
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/simplemodule.cpp
@@ -0,0 +1,71 @@
+#include <qwidget.h>
+
+#include <interfaces/interfaceinformationimp.h>
+
+#include "%{APPNAMELC}iface.h"
+#include "%{APPNAMELC}module.h"
+
+%{APPNAME}Module::%{APPNAME}Module() {
+ Interface* iface = new %{APPNAME}Interface( 0 );
+ iface->setHardwareName( "vpn" );
+ iface->setInterfaceName( "Test VPN" );
+ m_interfaces.append( iface );
+
+// If we set up VPN via pptp
+// and networksettins was closed and now opened
+// we need to hide the ppp device behind us
+// One can do this by calling setHandledInterfaceNames
+// setHandledInterfaceNames();
+}
+
+%{APPNAME}Module::~%{APPNAME}Module() {
+ m_interfaces.setAutoDelete( true );
+ m_interfaces.clear();
+}
+
+
+/*
+ * We're a VPN module
+ */
+bool %{APPNAME}Module::isOwner( Interface* iface ) {
+ /* check if it is our device */
+ return m_interfaces.find( iface ) != -1;
+}
+
+QWidget* %{APPNAME}Module::configure( Interface* ) {
+/* We don't have any Config for now */
+ return 0l;
+}
+
+QWidget* %{APPNAME}Module::information( Interface* iface ) {
+ return new InterfaceInformationImp(0, "Interface info", iface );
+}
+
+QList<Interface> %{APPNAME}Module::getInterfaces() {
+ return m_interfaces;
+}
+
+void %{APPNAME}Module::possibleNewInterfaces( QMap<QString, QString>& map) {
+ map.insert( QObject::tr("VPN PPTP"),
+ QObject::tr("Add new Point to Point Tunnel Protocol connection" ) );
+}
+
+
+Interface* %{APPNAME}Module::addNewInterface( const QString& ) {
+ /* check the str if we support more interfaces */
+/*
+ Interface* iface = new %{APPNAME}Interface( 0 );
+ iface->setModuleOwner( this );
+ return iface;*/
+
+// if we would support saving interfaces we could add
+// them here
+
+ return 0;
+}
+
+
+bool %{APPNAME}Module::remove( Interface* ) {
+/* we do not support removing our interface */
+ return false;
+}
diff --git a/languages/cpp/app_templates/opienet/simplemodule.h b/languages/cpp/app_templates/opienet/simplemodule.h
new file mode 100644
index 00000000..1b02b688
--- /dev/null
+++ b/languages/cpp/app_templates/opienet/simplemodule.h
@@ -0,0 +1,36 @@
+#ifndef %{APPNAME}_NETWORK_MODULE_H
+#define %{APPNAME}_NETWORK_MODULE_H
+
+#include <module.h>
+
+class %{APPNAME}Module : Module {
+
+signals:
+ void updateInterface(Interface* i );
+
+public:
+ %{APPNAME}Module();
+ ~%{APPNAME}Module();
+
+ const QString type() {return QString::fromLatin1("vpn" );}
+ void setProfile( const QString& ) {}
+ bool isOwner( Interface* );
+ QWidget *configure( Interface* );
+ QWidget *information( Interface* );
+ QList<Interface> getInterfaces();
+ void possibleNewInterfaces( QMap<QString, QString>& );
+ Interface *addNewInterface( const QString& );
+ bool remove( Interface* iface );
+ QString getPixmapName( Interface* ) {return QString::fromLatin1("Tux"); }
+ void receive( const QCString&, const QByteArray& ar ) {} // don't listen
+private:
+ QList<Interface> m_interfaces;
+};
+
+extern "C" {
+ void* create_plugin() {
+ return new %{APPNAME}Module();
+ }
+};
+
+#endif
diff --git a/languages/cpp/app_templates/opietoday/.kdev_ignore b/languages/cpp/app_templates/opietoday/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/.kdev_ignore
diff --git a/languages/cpp/app_templates/opietoday/Example.png b/languages/cpp/app_templates/opietoday/Example.png
new file mode 100644
index 00000000..f63d0bc7
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/Example.png
Binary files differ
diff --git a/languages/cpp/app_templates/opietoday/Makefile.am b/languages/cpp/app_templates/opietoday/Makefile.am
new file mode 100644
index 00000000..8854404d
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = Makefile.am Example.png app.kdevelop app.pro exampleplugin.cpp \
+ examplepluginimpl.cpp examplepluginwidget.cpp exampleplugin.h \
+ examplepluginimpl.h examplepluginwidget.h
+
+templateName = opietoday
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/opietoday/app.kdevelop b/languages/cpp/app_templates/opietoday/app.kdevelop
new file mode 100644
index 00000000..f6e57207
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/app.kdevelop
@@ -0,0 +1,143 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>gtk</toc>
+ <toc>gnustep</toc>
+ <toc>python</toc>
+ <toc>php</toc>
+ <toc>perl</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>kdev3api</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>qmake User Guide</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Referrence Documentation</toc>
+ </ignoreqt_xml>
+ <ignoredevhelp>
+ <toc>bonobo-activation</toc>
+ <toc>gconf</toc>
+ <toc>gtksourceview</toc>
+ <toc>libbonobo</toc>
+ <toc>libbonoboui</toc>
+ </ignoredevhelp>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell></dbgshell>
+ <programargs>-qws</programargs>
+ <gdbpath/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <opie>
+ <quick_app>false</quick_app>
+ </opie>
+ <packaging>
+ <template>3</template>
+ <custom_dest>plugins/today</custom_dest>
+ <owner>
+ <package>%{APPNAMELC}</package>
+ <prio>0</prio>
+ <section>opie/plugins</section>
+ <maintainer>%{AUTHOR} %{EMAIL}</maintainer>
+ <arch>arm</arch>
+ <depends>opie-today</depends>
+ <version>%{VERSION}</version>
+ <desc>Empty</desc>
+ </owner>
+ </packaging>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram></mainprogram>
+ <programargs>-qws</programargs>
+ </run>
+ <envvars/>
+ </kdevtrollproject>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <codecompletion>
+ <codehinting outputview="1" enablech="0" selectview="0" />
+ </codecompletion>
+ <classstore>
+ <enablepcs>false</enablepcs>
+ <enablepp>false</enablepp>
+ <preparsing/>
+ </classstore>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL></interfaceURL>
+ <implementationURL></implementationURL>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions></commitoptions>
+ <updateoptions>-dP</updateoptions>
+ <addoptions></addoptions>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions></logoptions>
+ <rshoptions></rshoptions>
+ </kdevcvs>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/opietoday/app.pro b/languages/cpp/app_templates/opietoday/app.pro
new file mode 100644
index 00000000..152dc6f6
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/app.pro
@@ -0,0 +1,38 @@
+TEMPLATE = lib
+CONFIG = qt dll qtopia warn_on release zecke-libqpe zecke-libopie opie-todayplugin
+HEADERS = %{APPNAMELC}.h %{APPNAMELC}widget.h %{APPNAMELC}impl.h
+SOURCES = %{APPNAMELC}.cpp %{APPNAMELC}widget.cpp %{APPNAMELC}impl.cpp
+TARGET = %{APPNAMELC}
+
+
+QUICK_SPEC_FOO = $$(OPIE_BUILD_QUICK_APP)
+contains( TEMPLATE, quick-template ){
+ contains( QUICK_SPEC_FOO, quick-app-lib ){
+ message( "foo" )
+ system( rm $$TARGET )
+ system( ln -s $$(OPIEDIR)/bin/quicklauncher $$TARGET)
+ DEFINES += OPIE_APP_INTERFACE
+ TEMPLATE = lib
+ CONFIG += dll
+ }else{
+ LI = $$join( TARGET, "lib", "lib", ".so*" )
+ system( rm $$LI )
+ TEMPLATE = app
+ }
+}
+
+
+QMAKE_LIBDIR= $$(OPIEDIR)/lib
+OPIE-SPEC=6
+
+zecke-libqpe {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ LIBS += -lqpe
+ DEPENDPATH += $$(OPIEDIR)/include
+}
+
+zecke-libopie {
+ INCLUDEPATH += $$(OPIEDIR)/include
+ DEPENDPATH += $$(OPIEDIR)/include
+ LIBS += -lopie
+}
diff --git a/languages/cpp/app_templates/opietoday/exampleplugin.cpp b/languages/cpp/app_templates/opietoday/exampleplugin.cpp
new file mode 100644
index 00000000..3d32b274
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/exampleplugin.cpp
@@ -0,0 +1,60 @@
+
+#include "%{APPNAMELC}.h"
+
+%{APPNAME}::%{APPNAME}() {
+ m_widget = 0l;
+}
+
+%{APPNAME}::~%{APPNAME}() {
+ delete (%{APPNAME}Widget*)m_widget;
+}
+
+QString %{APPNAME}::pluginName() const {
+ return QObject::tr( "%{APPNAME}" );
+}
+
+double %{APPNAME}::versionNumber() const {
+ return 0.1;
+}
+
+// this sets the image that will be shown on the left side of the plugin
+QString %{APPNAME}::pixmapNameWidget() const {
+ return QString::fromLatin1("%{APPNAMELC}/%{APPNAMELC}");
+}
+
+QWidget* %{APPNAME}::widget( QWidget * wid ) {
+ if(!m_widget) {
+ m_widget = new %{APPNAME}Widget( wid, "%{APPNAME}" );
+ }
+ return m_widget;
+}
+
+
+// that would be the icon of the config widget in todays config view
+QString %{APPNAME}::pixmapNameConfig() const {
+ return 0l;
+}
+
+// No config widget yet, look at the datebook plugin for an example of that
+TodayConfigWidget* %{APPNAME}::configWidget( QWidget* /*parent*/ ) {
+ return 0l;
+}
+
+// add the binary name of the app to launch here
+QString %{APPNAME}::appName() const {
+ return QString::null;
+}
+
+// if the plugin should be excluded form the refresh cycles that can be set in the today app
+bool %{APPNAME}::excludeFromRefresh() const {
+ return false;
+}
+
+void %{APPNAME}::refresh() {
+ if ( m_widget ) {
+ m_widget->refresh();
+ }
+}
+
+void %{APPNAME}::reinitialize() {
+}
diff --git a/languages/cpp/app_templates/opietoday/exampleplugin.h b/languages/cpp/app_templates/opietoday/exampleplugin.h
new file mode 100644
index 00000000..b321f434
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/exampleplugin.h
@@ -0,0 +1,34 @@
+#ifndef %{APPNAME}_PLUGIN_H
+#define %{APPNAME}_PLUGIN_H
+
+#include <qwidget.h>
+#include <qguardedptr.h>
+
+#include <opie/todayplugininterface.h>
+#include <opie/todayconfigwidget.h>
+
+#include "%{APPNAMELC}widget.h"
+
+// implementation of the today plugin interface
+class %{APPNAME} : public TodayPluginObject {
+
+public:
+ %{APPNAME}();
+ ~%{APPNAME}();
+
+ QString pluginName() const;
+ double versionNumber() const;
+ QString pixmapNameWidget() const;
+ QWidget* widget(QWidget *);
+ QString pixmapNameConfig() const;
+ TodayConfigWidget* configWidget(QWidget *);
+ QString appName() const;
+ bool excludeFromRefresh() const;
+ void refresh();
+ void reinitialize();
+
+ private:
+ QGuardedPtr<%{APPNAME}Widget> m_widget;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/opietoday/examplepluginimpl.cpp b/languages/cpp/app_templates/opietoday/examplepluginimpl.cpp
new file mode 100644
index 00000000..3a9481f1
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/examplepluginimpl.cpp
@@ -0,0 +1,30 @@
+#include "%{APPNAMELC}.h"
+#include "%{APPNAMELC}impl.h"
+
+%{APPNAME}Impl::%{APPNAME}Impl() {
+ examplePlugin = new %{APPNAME}();
+}
+
+%{APPNAME}Impl::~%{APPNAME}Impl() {
+ delete examplePlugin;
+}
+
+
+TodayPluginObject* %{APPNAME}Impl::guiPart() {
+ return examplePlugin;
+}
+
+QRESULT %{APPNAME}Impl::queryInterface( const QUuid & uuid, QUnknownInterface **iface ) {
+ *iface = 0;
+ if ( ( uuid == IID_QUnknown ) || ( uuid == IID_TodayPluginInterface ) ) {
+ *iface = this, (*iface)->addRef();
+ }else
+ return QS_FALSE;
+
+ return QS_OK;
+
+}
+
+Q_EXPORT_INTERFACE() {
+ Q_CREATE_INSTANCE( %{APPNAME}Impl );
+}
diff --git a/languages/cpp/app_templates/opietoday/examplepluginimpl.h b/languages/cpp/app_templates/opietoday/examplepluginimpl.h
new file mode 100644
index 00000000..ccb7c3b3
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/examplepluginimpl.h
@@ -0,0 +1,23 @@
+#ifndef %{APPNAME}_PLUGIN_IMPL_H
+#define %{APPNAME}_PLUGIN_IMPL_H
+
+#include <opie/todayplugininterface.h>
+
+class %{APPNAME};
+
+class %{APPNAME}Impl : public TodayPluginInterface{
+
+public:
+ %{APPNAME}Impl();
+ virtual ~%{APPNAME}Impl();
+
+ QRESULT queryInterface( const QUuid &, QUnknownInterface** );
+ Q_REFCOUNT
+
+ virtual TodayPluginObject *guiPart();
+
+private:
+ %{APPNAME} *examplePlugin;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/opietoday/examplepluginwidget.cpp b/languages/cpp/app_templates/opietoday/examplepluginwidget.cpp
new file mode 100644
index 00000000..b0cb0dcc
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/examplepluginwidget.cpp
@@ -0,0 +1,55 @@
+#include <qpe/config.h>
+#include <qpe/qcopenvelope_qws.h>
+
+#include "%{APPNAMELC}widget.h"
+
+%{APPNAME}Widget::%{APPNAME}Widget( QWidget *parent, const char* name)
+ : QWidget(parent, name ) {
+
+ m_exampleLabel = 0l;
+ m_layout = 0l;
+
+ if ( m_exampleLabel ) {
+ delete m_exampleLabel;
+ }
+
+ // since here a OClickableLabel is used, the plugin part will be clickable, and the actions
+ // that should be triggered when clicked are defined in slotClicked()
+ // of course also normal widgets can be used.
+ m_exampleLabel = new OClickableLabel( this );
+ connect( m_exampleLabel, SIGNAL( clicked() ), this, SLOT( slotClicked() ) );
+
+ if ( m_layout ) {
+ delete m_layout;
+ }
+ m_layout = new QHBoxLayout( this );
+ m_layout->setAutoAdd( true );
+
+ readConfig();
+ getInfo();
+}
+
+
+%{APPNAME}Widget::~%{APPNAME}Widget() {
+ delete m_exampleLabel;
+ delete m_layout;
+}
+
+
+void %{APPNAME}Widget::readConfig() {
+// we dont have any config entries in this plugin
+// normally this method is used after today config was used
+}
+
+
+void %{APPNAME}Widget::refresh() {
+
+}
+
+void %{APPNAME}Widget::getInfo() {
+ m_exampleLabel->setText( tr("%{APPNAME} text") );
+}
+
+void %{APPNAME}Widget::slotClicked() {
+ getInfo();
+}
diff --git a/languages/cpp/app_templates/opietoday/examplepluginwidget.h b/languages/cpp/app_templates/opietoday/examplepluginwidget.h
new file mode 100644
index 00000000..26a72128
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/examplepluginwidget.h
@@ -0,0 +1,28 @@
+#ifndef %{APPNAME}_PLUGIN_WIDGET_H
+#define %{APPNAME}_PLUGIN_WIDGET_H
+
+#include <qlayout.h>
+
+#include <opie/oclickablelabel.h>
+
+class %{APPNAME}Widget : public QWidget {
+
+ Q_OBJECT
+
+public:
+ %{APPNAME}Widget( QWidget *parent, const char *name );
+ ~%{APPNAME}Widget();
+
+ void refresh();
+
+private slots:
+ void slotClicked();
+
+private:
+ OClickableLabel* m_exampleLabel;
+ QHBoxLayout* m_layout;
+ void readConfig();
+ void getInfo();
+};
+
+#endif
diff --git a/languages/cpp/app_templates/opietoday/opietoday.kdevtemplate b/languages/cpp/app_templates/opietoday/opietoday.kdevtemplate
new file mode 100644
index 00000000..25d8f42d
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/opietoday.kdevtemplate
@@ -0,0 +1,151 @@
+# KDE Config File
+[General]
+Name=Opie Today Plugin
+Name[ca]=Connector de tasques pendents per a Opie
+Name[da]=Opie Today-plugin
+Name[de]=Opie-Today-Modul
+Name[el]=ΠÏόσθετο ΣήμεÏα του Opie
+Name[es]=Complemento de tareas pendientes para Opie
+Name[et]=Opie Today plugin
+Name[eu]=Opie-ren gaur-plugina
+Name[fa]=وصلۀ Opie Today
+Name[fr]=Module externe Opie « Today »
+Name[ga]=Breiseán Inniu Opie
+Name[gl]=Extensión 'today' para Opie
+Name[hu]=Opie Today-modul
+Name[it]=Plugin today di Opie
+Name[ja]=Opie Today プラグイン
+Name[nds]=Moduul för Opie-Today
+Name[ne]=ओपिइ टà¥à¤¡à¥‡ पà¥à¤²à¤—इन
+Name[nl]=Opie Today-plugin
+Name[pl]=Wtyczka Opie Dzisiaj
+Name[pt]='Plugin' de Dados de Hoje do Opie
+Name[pt_BR]='Plugin' de Dados de Hoje do Opie
+Name[ru]=Модуль задач Opie
+Name[sk]=Opie dnešný modul
+Name[sr]=Прикључак за Opie данаÑ
+Name[sr@Latn]=PrikljuÄak za Opie danas
+Name[sv]=Opie Idag-insticksprogram
+Name[tr]=Opie Bugün Eklentisi
+Name[zh_CN]=Opie 今日æ’件
+Name[zh_TW]=Opie 今天外掛程å¼
+Icon=qmakeapp.png
+Category=C++/Embedded
+Comment=Generate an Opie today plugin.
+Comment[ca]=Genera un connector de tasques pendents per a Opie.
+Comment[da]=Generér et Opie today-plugin.
+Comment[de]=Erstellt ein Opie-Today-Modul
+Comment[el]=ΔημιουÏγία ενός Ï€Ïόσθετου ΣήμεÏα του Opie.
+Comment[es]=Genera un complemento de tareas pendientes para Opie.
+Comment[et]=Opie Today plugina loomine.
+Comment[eu]=Sortu Opie-ren gaur plugin bat.
+Comment[fa]=یک وصلۀ Opie today تولید می‌کند.
+Comment[fr]=Génère un module externe Opie « Today ».
+Comment[gl]=Xera unha extensión 'today' para Opie
+Comment[hu]=Létrehoz egy Opie Today-modult.
+Comment[it]=Genera un plugin today di Opie.
+Comment[ja]=Opie today プラグインを作æˆ
+Comment[nds]=Stellt en Moduul för Opie-Today op.
+Comment[ne]=ओपिइ टà¥à¤¡à¥‡ पà¥à¤²à¤—इन उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Genereert een Opie today-plugin.
+Comment[pl]=Generuje wtyczkÄ™ Opie "Dzisiaj".
+Comment[pt]=Gera um 'plugin' para dados de hoje do Opie.
+Comment[pt_BR]=Gera um 'plugin' para dados de hoje do Opie.
+Comment[ru]=Создание Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð·Ð°Ð´Ð°Ñ‡ Opie.
+Comment[sk]=Vygeneruje Opie dnešný modul.
+Comment[sr]=Прави прикључак за Opie данаÑ.
+Comment[sr@Latn]=Pravi prikljuÄak za Opie danas.
+Comment[sv]=Skapar ett Opie Idag-insticksprogram.
+Comment[tr]=Bir Opie bugün eklentisi yarat
+Comment[zh_CN]=生æˆä¸€ä¸ª Opie 今日æ’件。
+Comment[zh_TW]=產生一個 Opie 今天外掛程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.cpp
+Archive=opietoday.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir0]
+Type=mkdir
+Dir=%{dest}/pics
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/pics/%{APPNAMELC}
+
+[FILE2]
+Type=install
+Source=%{src}/Example.png
+Dest=%{dest}/pics/%{APPNAMELC}/%{APPNAMELC}.png
+Process=false
+
+[FILE3]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[FILE4]
+Type=install
+Source=%{src}/exampleplugin.cpp
+Dest=%{dest}/%{APPNAMELC}.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/examplepluginwidget.cpp
+Dest=%{dest}/%{APPNAMELC}widget.cpp
+
+[FILE6]
+Type=install
+Source=%{src}/examplepluginimpl.cpp
+Dest=%{dest}/%{APPNAMELC}impl.cpp
+
+[FILE7]
+Type=install
+Source=%{src}/exampleplugin.h
+Dest=%{dest}/%{APPNAMELC}.h
+
+[FILE8]
+Type=install
+Source=%{src}/examplepluginwidget.h
+Dest=%{dest}/%{APPNAMELC}widget.h
+
+[FILE9]
+Type=install
+Source=%{src}/examplepluginimpl.h
+Dest=%{dest}/%{APPNAMELC}impl.h
+
+[MSG]
+Type=message
+Comment=An opie today plugin was created in %{dest}
+Comment[ca]=Un connector de tasques pendents per a Opie ha estat creat en %{dest}
+Comment[da]=Et opie today-plugin blev oprettet i %{dest}
+Comment[de]=Ein Opie-Today-Modul wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€Ïόσθετο ΣήμεÏα του opie δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un complemento de tareas pendientes para Opie ha sido creado en %{dest}
+Comment[et]=Opie Today plugin loodi asukohta %{dest}
+Comment[eu]=Opie-ren gaur plugin bat sortu da hemen %{dest}
+Comment[fa]=یک وصلۀ opie today در %{dest} ایجاد شد
+Comment[fr]=Un module externe Opie « Today » a été créé dans %{dest}
+Comment[ga]=Cruthaíodh breiseán inniu opie i %{dest}
+Comment[gl]=Creouse unha extensión 'today' para opie en %{dest}
+Comment[hu]=Létrejött egy Opie Today-modul itt: %{dest}
+Comment[it]=È stato creato un plugin today di Opie in %{dest}
+Comment[ja]=Opie today プラグインを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Moduul för Opie-Today opstellt
+Comment[ne]=ओपिइ टà¥à¤¡à¥‡ पà¥à¤²à¤—इन %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Opie today-plugins is aangemaakt in %{dest}
+Comment[pl]=Wtyczka Opie Dzisiaj została utworzona w %{dest}
+Comment[pt]=Foi criado um 'plugin' para dados de hoje do Opie em %{dest}
+Comment[pt_BR]=Foi criado um 'plugin' para dados de hoje do Opie em %{dest}
+Comment[ru]=Модуль задач Opie Ñоздан в %{dest}
+Comment[sk]=Opie dnešný modul bol vytvorený v %{dest}
+Comment[sr]=Прикључак за opie Ð´Ð°Ð½Ð°Ñ Ð½Ð°Ð¿Ñ€Ð°Ð²Ñ™ÐµÐ½ је у %{dest}
+Comment[sr@Latn]=PrikljuÄak za opie danas napravljen je u %{dest}
+Comment[sv]=Ett Opie Idag-insticksprogram skapades i %{dest}
+Comment[tr]=Bir Opie bugün eklentisi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了一个 opie 今日æ’件
+Comment[zh_TW]=一個 Opie 今天外掛程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/opietoday/opietoday.png b/languages/cpp/app_templates/opietoday/opietoday.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/opietoday/opietoday.png
Binary files differ
diff --git a/languages/cpp/app_templates/prc-tool/.kdev_ignore b/languages/cpp/app_templates/prc-tool/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/.kdev_ignore
diff --git a/languages/cpp/app_templates/prc-tool/Makefile.am b/languages/cpp/app_templates/prc-tool/Makefile.am
new file mode 100644
index 00000000..3d4b5610
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = prc-tool.png src-Makefile prc-tool.kdevelop callback.h \
+ palmhello.c palmhello.pbitm palmhello.rcp palmhelloRsc.h
+templateName = prc-tool
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/prc-tool/callback.h b/languages/cpp/app_templates/prc-tool/callback.h
new file mode 100644
index 00000000..bf0ead45
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/callback.h
@@ -0,0 +1,24 @@
+#ifndef __CALLBACK_H__
+#define __CALLBACK_H__
+
+/* This is a workaround for a bug in the current version of gcc:
+
+ gcc assumes that no one will touch %a4 after it is set up in crt0.o.
+ This isn't true if a function is called as a callback by something
+ that wasn't compiled by gcc (like FrmCloseAllForms()). It may also
+ not be true if it is used as a callback by something in a different
+ shared library.
+
+ We really want a function attribute "callback" which will insert this
+ progloue and epilogoue automatically.
+
+ - Ian */
+
+register void *reg_a4 asm("%a4");
+
+#define CALLBACK_PROLOGUE \
+ void *save_a4 = reg_a4; asm("move.l %%a5,%%a4; sub.l #edata,%%a4" : :);
+
+#define CALLBACK_EPILOGUE reg_a4 = save_a4;
+
+#endif
diff --git a/languages/cpp/app_templates/prc-tool/palmhello.c b/languages/cpp/app_templates/prc-tool/palmhello.c
new file mode 100644
index 00000000..0a34b6c4
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/palmhello.c
@@ -0,0 +1,117 @@
+
+/* Main code for PalmHello */
+
+#include <PalmOS.h>
+#include <PalmCompatibility.h>
+#include "callback.h"
+
+#include "palmhelloRsc.h"
+
+static Boolean MainFormHandleEvent (EventPtr e)
+{
+ Boolean handled = false;
+ FormPtr frm;
+
+ CALLBACK_PROLOGUE
+
+ switch (e->eType) {
+ case frmOpenEvent:
+ frm = FrmGetActiveForm();
+ FrmDrawForm(frm);
+ handled = true;
+ break;
+
+ case menuEvent:
+ MenuEraseStatus(NULL);
+
+ switch(e->data.menu.itemID) {
+ }
+
+ handled = true;
+ break;
+
+ case ctlSelectEvent:
+ switch(e->data.ctlSelect.controlID) {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ CALLBACK_EPILOGUE
+
+ return handled;
+}
+
+static Boolean ApplicationHandleEvent(EventPtr e)
+{
+ FormPtr frm;
+ Word formId;
+ Boolean handled = false;
+
+ if (e->eType == frmLoadEvent) {
+ formId = e->data.frmLoad.formID;
+ frm = FrmInitForm(formId);
+ FrmSetActiveForm(frm);
+
+ switch(formId) {
+ case MainForm:
+ FrmSetEventHandler(frm, MainFormHandleEvent);
+ break;
+ }
+ handled = true;
+ }
+
+ return handled;
+}
+
+/* Get preferences, open (or create) app database */
+static Word StartApplication(void)
+{
+ FrmGotoForm(MainForm);
+ return 0;
+}
+
+/* Save preferences, close forms, close app database */
+static void StopApplication(void)
+{
+ FrmSaveAllForms();
+ FrmCloseAllForms();
+}
+
+/* The main event loop */
+static void EventLoop(void)
+{
+ Word err;
+ EventType e;
+
+ do {
+ EvtGetEvent(&e, evtWaitForever);
+ if (! SysHandleEvent (&e))
+ if (! MenuHandleEvent (NULL, &e, &err))
+ if (! ApplicationHandleEvent (&e))
+ FrmDispatchEvent (&e);
+ } while (e.eType != appStopEvent);
+}
+
+/* Main entry point; it is unlikely you will need to change this except to
+ handle other launch command codes */
+DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
+{
+ Word err;
+
+ if (cmd == sysAppLaunchCmdNormalLaunch) {
+
+ err = StartApplication();
+ if (err) return err;
+
+ EventLoop();
+ StopApplication();
+
+ } else {
+ return sysErrParamErr;
+ }
+
+ return 0;
+}
diff --git a/languages/cpp/app_templates/prc-tool/palmhello.pbitm b/languages/cpp/app_templates/prc-tool/palmhello.pbitm
new file mode 100644
index 00000000..5291d5a4
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/palmhello.pbitm
@@ -0,0 +1,32 @@
+------------#######-------------
+----------###########-----------
+---------#############----------
+--------###############---------
+-------#################--------
+------###################-------
+------###################-------
+-----#####################------
+-----#####################------
+-----#####################------
+-----#####################------
+-----#####################------
+-----#####################------
+-----#####################------
+------###################-------
+------###################-------
+-------#################--------
+--------###############---------
+---------#############----------
+----------###########-----------
+------------#######-------------
+--------------------------------
+--------------------------------
+--------------------------------
+--------------------------------
+--------------------------------
+--------------------------------
+--------------------------------
+--------------------------------
+--------------------------------
+--------------------------------
+--------------------------------
diff --git a/languages/cpp/app_templates/prc-tool/palmhello.rcp b/languages/cpp/app_templates/prc-tool/palmhello.rcp
new file mode 100644
index 00000000..0b37e81d
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/palmhello.rcp
@@ -0,0 +1,11 @@
+#include "palmhelloRsc.h"
+
+FORM MainForm 1 1 158 158
+BEGIN
+ TITLE "PalmHello"
+END
+
+APPLICATIONICONNAME 1000 "palmhello"
+ICON "palmhello.pbitm"
+
+VERSION 1 "0.0.1"
diff --git a/languages/cpp/app_templates/prc-tool/palmhelloRsc.h b/languages/cpp/app_templates/prc-tool/palmhelloRsc.h
new file mode 100644
index 00000000..6dde2ec7
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/palmhelloRsc.h
@@ -0,0 +1 @@
+#define MainForm 1000
diff --git a/languages/cpp/app_templates/prc-tool/prc-tool b/languages/cpp/app_templates/prc-tool/prc-tool
new file mode 100644
index 00000000..d856c80b
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/prc-tool
@@ -0,0 +1,11 @@
+# KDE Config File
+[General]
+Name=Hello world program
+Name[fr]=Un simple programme de test « Hello world
+Icon=chellogba.png
+Category=C/PalmOS
+Comment=Generates a template for palm application
+Comment[fr]=Génère un modèle d'application pour l'environnement PALM.
+#tShowFileAfterGeneration=README.devel
+FileTemplates=h,CStyle,c,CStyle
+ShowFilesAfterGeneration=APPNAME.c
diff --git a/languages/cpp/app_templates/prc-tool/prc-tool.kdevelop b/languages/cpp/app_templates/prc-tool/prc-tool.kdevelop
new file mode 100644
index 00000000..2c5a6c0a
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/prc-tool.kdevelop
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C</primarylanguage>
+ <ignoreparts>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ <keywords>
+ <keyword>C</keyword>
+ <keyword>PalmOS</keyword>
+ </keywords>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="Makefile" name="Build" />
+ <group pattern="*.c" name="Source" />
+ </groups>
+ </kdevfileview>
+<kdevcustomproject>
+ <run>
+ <mainprogram>make test</mainprogram>
+ <programargs/>
+ <terminal>true</terminal>
+ <envvars/>
+ </run>
+ <envvars/>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir/>
+ </build>
+ <make>
+ <abortonerror>true</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ <envvars/>
+ </make>
+ <makeenvvars/>
+ </kdevcustomproject>
+
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/prc-tool/prc-tool.kdevtemplate b/languages/cpp/app_templates/prc-tool/prc-tool.kdevtemplate
new file mode 100644
index 00000000..4216c466
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/prc-tool.kdevtemplate
@@ -0,0 +1,136 @@
+# KDE Config File
+[General]
+Name=Hello world program
+Name[ca]=Programa Hello world
+Name[da]=Goddag verden program
+Name[de]="Hello World"-Programm
+Name[el]=ΠÏόγÏαμμα Γεια σου Κόσμε
+Name[es]=Programa «Hola mundo»
+Name[et]="Tere,maailm" programm
+Name[eu]="Kaixo mundua" programa
+Name[fa]=برنامۀ Hello world
+Name[fr]=Programme « Bonjour monde »
+Name[ga]=Ríomhchlár "Hello world"
+Name[gl]=Programa Ola mundo
+Name[it]=Programma di "Hello world"
+Name[ja]=Hello world プログラム
+Name[nds]="Moin Welt"-Programm
+Name[ne]=हेलà¥à¤¡à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Hello World-programma
+Name[pl]=Program 'Witaj świecie'
+Name[pt]=Programa 'Olá mundo'
+Name[pt_BR]=Programa 'Olá mundo'
+Name[ru]=Программа Hello world
+Name[sk]=Ahoj svet program
+Name[sl]=Program Hello world
+Name[sr]=Програм „Здраво Ñвете“
+Name[sr@Latn]=Program „Zdravo svete“
+Name[sv]=Hello world-program
+Name[tr]=Merhaba Dünya Programı
+Name[zh_CN]=Hello world 程åº
+Name[zh_TW]=Hello world 程å¼
+Icon= # got none
+Category=C/PalmOS
+Comment=Generates a template for palm application
+Comment[ca]=Genera una plantilla d'aplicació per a Palm
+Comment[da]=Genererer en skabelon for et palm-program
+Comment[de]=Erstellt das Gerüst für eine Palm-Anwendung
+Comment[el]=ΔημιουÏγία ενός Ï€ÏοτÏπου εφαÏμογής για palm
+Comment[es]=Genera una plantilla para una aplicación Palm
+Comment[et]=Palmi rakenduse malli loomine.
+Comment[eu]=Palm aplikazio baten txantiloi bat sortzen du
+Comment[fa]=قالبی برای کاربرد palm تولید می‌کند
+Comment[fr]=Génère un modèle pour une application Palm
+Comment[gl]=Xera un modelo para aplicación palm
+Comment[hu]=Létrehoz egy Palm-os alkalmazássablont
+Comment[it]=Genera un modello per un'applicazione palm
+Comment[ja]=Palm アプリケーションã®ãŸã‚ã®ãƒ†ãƒ³ãƒ—レートを作æˆã—ã¾ã™
+Comment[nds]=Stellt dat Rahmenwark för en Palm-Programm op
+Comment[ne]=पाम अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—का लागि टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een sjabloon voor een Palm-toepassing
+Comment[pl]=Generuje szablon programu dla Palma
+Comment[pt]=Gera um modelo para aplicações do Palm
+Comment[pt_BR]=Gera um modelo para aplicações do Palm
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Palm
+Comment[sk]=Vygeneruje šablónu pre Palm aplikáciu
+Comment[sr]=Прави шаблон за palm програм
+Comment[sr@Latn]=Pravi Å¡ablon za palm program
+Comment[sv]=Skapar en mall för ett Palm-program
+Comment[tr]=Bir avuçiçi uygulaması için bir şablon yaratır
+Comment[zh_CN]=生æˆä¸€ä¸ª Palm 应用程åºçš„模æ¿
+Comment[zh_TW]=產生一個 palm 應用程å¼æ¨£æœ¬
+FileTemplates=h,CStyle,c,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAME}.c
+Archive=prc-tool.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/prc-tool.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/src-Makefile
+Dest=%{dest}/Makefile
+
+[FILE3]
+Type=install
+Source=%{src}/palmhello.c
+Dest=%{dest}/%{APPNAME}.c
+
+[FILE4]
+Type=install
+Source=%{src}/palmhello.pbitm
+Dest=%{dest}/%{APPNAME}.pbitm
+
+[FILE5]
+Type=install
+Source=%{src}/palmhello.rcp
+Dest=%{dest}/%{APPNAME}.rcp
+
+[FILE6]
+Type=install
+Source=%{src}/palmhelloRsc.h
+Dest=%{dest}/%{APPNAME}Rsc.h
+
+[FILE7]
+Type=install
+Source=%{src}/callback.h
+Dest=%{dest}/callback.h
+
+[MSG]
+Type=message
+Comment=A palm application was created in %{dest}
+Comment[ca]=Una aplicació per a Palm ha estat creada en %{dest}
+Comment[da]=Et palm-program blev oprettet i %{dest}
+Comment[de]=Eine Palm-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή palm δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación Palm ha sido creada en %{dest}
+Comment[et]=Palmi rakendus loodi asukohta %{dest}
+Comment[eu]=Palm aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد palm در %{dest} ایجاد شد
+Comment[fr]=Une application Palm a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár Palm i %{dest}
+Comment[gl]=Creouse unha aplicación palm en %{dest}
+Comment[hu]=Létrejött egy Palmos alkalmazássablon itt: %{dest}
+Comment[it]=È stata creata un'applicazione palm in %{dest}
+Comment[ja]=Palm アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Palm-Programm opstellt
+Comment[ne]=पाम अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Palm-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program dla Palma został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do Palm em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do Palm em %{dest}
+Comment[ru]=Приложение Palm Ñоздано в %{dest}
+Comment[sk]=Palm aplikácia bola vytvorená v %{dest}
+Comment[sr]=Palm програм је направљен у %{dest}
+Comment[sr@Latn]=Palm program je napravljen u %{dest}
+Comment[sv]=Ett Palm-program skapades i %{dest}
+Comment[tr]=Bir avuçiçi uygulaması %{dest} içinde yaratıldı
+Comment[zh_CN]=在 %{dest} 中创建了一个 Palme 应用程åº
+Comment[zh_TW]=一個 palm 應用程å¼æ¨£æœ¬å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/prc-tool/src-Makefile b/languages/cpp/app_templates/prc-tool/src-Makefile
new file mode 100644
index 00000000..a64d5cfa
--- /dev/null
+++ b/languages/cpp/app_templates/prc-tool/src-Makefile
@@ -0,0 +1,63 @@
+## Makefile for PalmHello
+
+TARGET = palmhello
+APPNAME = "PalmHello"
+APPID = "0000"
+
+OBJS = $(TARGET).o
+LIBS =
+
+target=m68k-palmos-
+
+CC = $(target)gcc
+
+CFLAGS = -Wall -g -O2
+
+PILRC = pilrc
+OBJRES = $(target)obj-res
+NM = $(target)nm
+BUILDPRC = build-prc
+PILOTXFER = pilot-xfer
+
+all: $(TARGET).prc
+
+.S.o:
+ $(CC) $(TARGETFLAGS) -c $<
+
+.c.s:
+ $(CC) $(CSFLAGS) $<
+
+$(TARGET).prc: code0000.$(TARGET).grc code0001.$(TARGET).grc data0000.$(TARGET).grc pref0000.$(TARGET).grc rloc0000.$(TARGET).grc bin.res
+ $(BUILDPRC) $(TARGET).prc $(APPNAME) $(APPID) code0001.$(TARGET).grc code0000.$(TARGET).grc data0000.$(TARGET).grc *.bin pref0000.$(TARGET).grc rloc0000.$(TARGET).grc
+
+code0000.$(TARGET).grc: $(TARGET)
+ $(OBJRES) $(TARGET)
+
+code0001.$(TARGET).grc: code0000.$(TARGET).grc
+
+data0000.$(TARGET).grc: code0000.$(TARGET).grc
+
+pref0000.$(TARGET).grc: code0000.$(TARGET).grc
+
+rloc0000.$(TARGET).grc: code0000.$(TARGET).grc
+
+bin.res: $(TARGET).rcp $(TARGET).pbitm
+ $(PILRC) $(TARGET).rcp .
+ touch bin.res
+
+$(TARGET): $(OBJS)
+ $(CC) $(CFLAGS) $(OBJS) -o $(TARGET) $(LIBS)
+ ! $(NM) -u $(TARGET) | grep .
+
+send: $(TARGET).prc
+ $(PILOTXFER) -i $(TARGET).prc
+
+depend:
+ makedepend -Y -I. *.c
+
+clean:
+ -rm -f *.[oa] $(TARGET) *.bin bin.res *.grc Makefile.bak
+
+veryclean: clean
+ -rm -f $(TARGET).prc pilot.ram pilot.scratch
+
diff --git a/languages/cpp/app_templates/qmakeapp/.kdev_ignore b/languages/cpp/app_templates/qmakeapp/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/.kdev_ignore
diff --git a/languages/cpp/app_templates/qmakeapp/Makefile.am b/languages/cpp/app_templates/qmakeapp/Makefile.am
new file mode 100644
index 00000000..c70050fa
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = main.cpp qmakeapp.cpp qmakeapp.h qmakeapp.png qmakeapp.kdevelop \
+ qmakeapp.pro src.pro filesave.xpm fileopen.xpm fileprint.xpm
+
+templateName = qmakeapp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/qmakeapp/fileopen.xpm b/languages/cpp/app_templates/qmakeapp/fileopen.xpm
new file mode 100644
index 00000000..880417ee
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/languages/cpp/app_templates/qmakeapp/fileprint.xpm b/languages/cpp/app_templates/qmakeapp/fileprint.xpm
new file mode 100644
index 00000000..6ada912f
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/fileprint.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *fileprint[] = {
+" 16 14 6 1",
+". c #000000",
+"# c #848284",
+"a c #c6c3c6",
+"b c #ffff00",
+"c c #ffffff",
+"d c None",
+"ddddd.........dd",
+"dddd.cccccccc.dd",
+"dddd.c.....c.ddd",
+"ddd.cccccccc.ddd",
+"ddd.c.....c....d",
+"dd.cccccccc.a.a.",
+"d..........a.a..",
+".aaaaaaaaaa.a.a.",
+".............aa.",
+".aaaaaa###aa.a.d",
+".aaaaaabbbaa...d",
+".............a.d",
+"d.aaaaaaaaa.a.dd",
+"dd...........ddd"
+};
diff --git a/languages/cpp/app_templates/qmakeapp/filesave.xpm b/languages/cpp/app_templates/qmakeapp/filesave.xpm
new file mode 100644
index 00000000..bd6870f4
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/filesave.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *filesave[] = {
+" 14 14 4 1",
+". c #040404",
+"# c #808304",
+"a c #bfc2bf",
+"b c None",
+"..............",
+".#.aaaaaaaa.a.",
+".#.aaaaaaaa...",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".##........##.",
+".############.",
+".##.........#.",
+".##......aa.#.",
+".##......aa.#.",
+".##......aa.#.",
+"b............."
+};
diff --git a/languages/cpp/app_templates/qmakeapp/main.cpp b/languages/cpp/app_templates/qmakeapp/main.cpp
new file mode 100644
index 00000000..bd26f19a
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/main.cpp
@@ -0,0 +1,13 @@
+%{CPP_TEMPLATE}
+
+#include <qapplication.h>
+#include "%{APPNAMELC}.h"
+
+int main( int argc, char ** argv ) {
+ QApplication a( argc, argv );
+ %{APPNAME} * mw = new %{APPNAME}();
+ mw->setCaption( "%{APPNAME}" );
+ mw->show();
+ a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
+ return a.exec();
+}
diff --git a/languages/cpp/app_templates/qmakeapp/qmakeapp b/languages/cpp/app_templates/qmakeapp/qmakeapp
new file mode 100644
index 00000000..51d73e69
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/qmakeapp
@@ -0,0 +1,11 @@
+# QMake application
+[General]
+Name=Application
+Name[fr]=Une Application Qt / QMake
+Icon=qmakeapp.png
+Category=C++/QMake project
+Category[fr]=C++/QMake
+Comment=Generate a QMake/Qt based application (crossplatform compatible)
+Comment[fr]=Génère une application basée sur Qt / QMake. Ce programme est multi platte-forme.
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/qmakeapp/qmakeapp.cpp b/languages/cpp/app_templates/qmakeapp/qmakeapp.cpp
new file mode 100644
index 00000000..841f88d4
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/qmakeapp.cpp
@@ -0,0 +1,283 @@
+%{CPP_TEMPLATE}
+
+#include "%{APPNAMELC}.h"
+
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qtextedit.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qstatusbar.h>
+#include <qmessagebox.h>
+#include <qprinter.h>
+#include <qapplication.h>
+#include <qaccel.h>
+#include <qtextstream.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+#include <qwhatsthis.h>
+
+#include "filesave.xpm"
+#include "fileopen.xpm"
+#include "fileprint.xpm"
+
+%{APPNAME}::%{APPNAME}()
+ : QMainWindow( 0, "%{APPNAME}", WDestructiveClose )
+{
+ printer = new QPrinter;
+ QPixmap openIcon, saveIcon, printIcon;
+
+ QToolBar * fileTools = new QToolBar( this, "file operations" );
+ fileTools->setLabel( tr("File Operations") );
+
+ openIcon = QPixmap( fileopen );
+ QToolButton * fileOpen
+ = new QToolButton( openIcon, tr("Open File"), QString::null,
+ this, SLOT(choose()), fileTools, "open file" );
+
+ saveIcon = QPixmap( filesave );
+ QToolButton * fileSave
+ = new QToolButton( saveIcon, tr("Save File"), QString::null,
+ this, SLOT(save()), fileTools, "save file" );
+
+ printIcon = QPixmap( fileprint );
+ QToolButton * filePrint
+ = new QToolButton( printIcon, tr("Print File"), QString::null,
+ this, SLOT(print()), fileTools, "print file" );
+
+
+ (void)QWhatsThis::whatsThisButton( fileTools );
+
+ QString fileOpenText = tr("<p><img source=\"fileopen\"> "
+ "Click this button to open a <em>new file</em>. <br>"
+ "You can also select the <b>Open</b> command "
+ "from the <b>File</b> menu.</p>");
+
+ QWhatsThis::add( fileOpen, fileOpenText );
+
+ QMimeSourceFactory::defaultFactory()->setPixmap( "fileopen", openIcon );
+
+ QString fileSaveText = tr("<p>Click this button to save the file you "
+ "are editing. You will be prompted for a file name.\n"
+ "You can also select the <b>Save</b> command "
+ "from the <b>File</b> menu.</p>");
+
+ QWhatsThis::add( fileSave, fileSaveText );
+
+ QString filePrintText = tr("Click this button to print the file you "
+ "are editing.\n You can also select the Print "
+ "command from the File menu.");
+
+ QWhatsThis::add( filePrint, filePrintText );
+
+
+ QPopupMenu * file = new QPopupMenu( this );
+ menuBar()->insertItem( tr("&File"), file );
+
+
+ file->insertItem( tr("&New"), this, SLOT(newDoc()), CTRL+Key_N );
+
+ int id;
+ id = file->insertItem( openIcon, tr("&Open..."),
+ this, SLOT(choose()), CTRL+Key_O );
+ file->setWhatsThis( id, fileOpenText );
+
+ id = file->insertItem( saveIcon, tr("&Save"),
+ this, SLOT(save()), CTRL+Key_S );
+ file->setWhatsThis( id, fileSaveText );
+
+ id = file->insertItem( tr("Save &As..."), this, SLOT(saveAs()) );
+ file->setWhatsThis( id, fileSaveText );
+
+ file->insertSeparator();
+
+ id = file->insertItem( printIcon, tr("&Print..."),
+ this, SLOT(print()), CTRL+Key_P );
+ file->setWhatsThis( id, filePrintText );
+
+ file->insertSeparator();
+
+ file->insertItem( tr("&Close"), this, SLOT(close()), CTRL+Key_W );
+
+ file->insertItem( tr("&Quit"), qApp, SLOT( closeAllWindows() ), CTRL+Key_Q );
+
+ menuBar()->insertSeparator();
+
+ QPopupMenu * help = new QPopupMenu( this );
+ menuBar()->insertItem( tr("&Help"), help );
+
+ help->insertItem( tr("&About"), this, SLOT(about()), Key_F1 );
+ help->insertItem( tr("About &Qt"), this, SLOT(aboutQt()) );
+ help->insertSeparator();
+ help->insertItem( tr("What's &This"), this, SLOT(whatsThis()), SHIFT+Key_F1 );
+
+ e = new QTextEdit( this, "editor" );
+ e->setFocus();
+ setCentralWidget( e );
+ statusBar()->message( tr("Ready"), 2000 );
+
+ resize( 450, 600 );
+}
+
+
+%{APPNAME}::~%{APPNAME}()
+{
+ delete printer;
+}
+
+
+
+void %{APPNAME}::newDoc()
+{
+ %{APPNAME} *ed = new %{APPNAME};
+ ed->setCaption(tr("Qt Example - Application"));
+ ed->show();
+}
+
+void %{APPNAME}::choose()
+{
+ QString fn = QFileDialog::getOpenFileName( QString::null, QString::null,
+ this);
+ if ( !fn.isEmpty() )
+ load( fn );
+ else
+ statusBar()->message( tr("Loading aborted"), 2000 );
+}
+
+
+void %{APPNAME}::load( const QString &fileName )
+{
+ QFile f( fileName );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+
+ QTextStream ts( &f );
+ e->setText( ts.read() );
+ e->setModified( FALSE );
+ setCaption( fileName );
+ statusBar()->message( tr("Loaded document %1").arg(fileName), 2000 );
+}
+
+
+void %{APPNAME}::save()
+{
+ if ( filename.isEmpty() ) {
+ saveAs();
+ return;
+ }
+
+ QString text = e->text();
+ QFile f( filename );
+ if ( !f.open( IO_WriteOnly ) ) {
+ statusBar()->message( tr("Could not write to %1").arg(filename),
+ 2000 );
+ return;
+ }
+
+ QTextStream t( &f );
+ t << text;
+ f.close();
+
+ e->setModified( FALSE );
+
+ setCaption( filename );
+
+ statusBar()->message( tr( "File %1 saved" ).arg( filename ), 2000 );
+}
+
+
+void %{APPNAME}::saveAs()
+{
+ QString fn = QFileDialog::getSaveFileName( QString::null, QString::null,
+ this );
+ if ( !fn.isEmpty() ) {
+ filename = fn;
+ save();
+ } else {
+ statusBar()->message( tr("Saving aborted"), 2000 );
+ }
+}
+
+
+void %{APPNAME}::print()
+{
+ // ###### Rewrite to use QSimpleRichText to print here as well
+ const int Margin = 10;
+ int pageNo = 1;
+
+ if ( printer->setup(this) ) { // printer dialog
+ statusBar()->message( tr("Printing...") );
+ QPainter p;
+ if( !p.begin( printer ) ) // paint on printer
+ return;
+
+ p.setFont( e->font() );
+ int yPos = 0; // y-position for each line
+ QFontMetrics fm = p.fontMetrics();
+ QPaintDeviceMetrics metrics( printer ); // need width/height
+ // of printer surface
+ for( int i = 0 ; i < e->lines() ; i++ ) {
+ if ( Margin + yPos > metrics.height() - Margin ) {
+ QString msg( "Printing (page " );
+ msg += QString::number( ++pageNo );
+ msg += ")...";
+ statusBar()->message( msg );
+ printer->newPage(); // no more room on this page
+ yPos = 0; // back to top of page
+ }
+ p.drawText( Margin, Margin + yPos,
+ metrics.width(), fm.lineSpacing(),
+ ExpandTabs | DontClip,
+ e->text( i ) );
+ yPos = yPos + fm.lineSpacing();
+ }
+ p.end(); // send job to printer
+ statusBar()->message( tr("Printing completed"), 2000 );
+ } else {
+ statusBar()->message( tr("Printing aborted"), 2000 );
+ }
+}
+
+void %{APPNAME}::closeEvent( QCloseEvent* ce )
+{
+ if ( !e->isModified() ) {
+ ce->accept();
+ return;
+ }
+
+ switch( QMessageBox::information( this, tr("Qt Application Example"),
+ tr("Do you want to save the changes"
+ " to the document?"),
+ tr("Yes"), tr("No"), tr("Cancel"),
+ 0, 1 ) ) {
+ case 0:
+ save();
+ ce->accept();
+ break;
+ case 1:
+ ce->accept();
+ break;
+ case 2:
+ default: // just for sanity
+ ce->ignore();
+ break;
+ }
+}
+
+
+void %{APPNAME}::about()
+{
+ QMessageBox::about( this, tr("Qt Application Example"),
+ tr("This example demonstrates simple use of "
+ "QMainWindow,\nQMenuBar and QToolBar."));
+}
+
+
+void %{APPNAME}::aboutQt()
+{
+ QMessageBox::aboutQt( this, tr("Qt Application Example") );
+}
diff --git a/languages/cpp/app_templates/qmakeapp/qmakeapp.h b/languages/cpp/app_templates/qmakeapp/qmakeapp.h
new file mode 100644
index 00000000..2d372da9
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/qmakeapp.h
@@ -0,0 +1,39 @@
+%{H_TEMPLATE}
+
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+
+#include <qmainwindow.h>
+
+class QTextEdit;
+
+class %{APPNAME}: public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ %{APPNAME}();
+ ~%{APPNAME}();
+
+protected:
+ void closeEvent( QCloseEvent* );
+
+private slots:
+ void newDoc();
+ void choose();
+ void load( const QString &fileName );
+ void save();
+ void saveAs();
+ void print();
+
+ void about();
+ void aboutQt();
+
+private:
+ QPrinter *printer;
+ QTextEdit *e;
+ QString filename;
+};
+
+
+#endif
diff --git a/languages/cpp/app_templates/qmakeapp/qmakeapp.kdevelop b/languages/cpp/app_templates/qmakeapp/qmakeapp.kdevelop
new file mode 100644
index 00000000..ef24a34b
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/qmakeapp.kdevelop
@@ -0,0 +1,112 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevcppsupport>
+ <qt>
+ <used>true</used>
+ <version>3</version>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ <root>%{QTDIR}</root>
+ <qmake>%{QMAKE}</qmake>
+ </qt>
+ </kdevcppsupport>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ <breakpoints/>
+ <programargs></programargs>
+ <gdbpath>/usr/bin/gdb</gdbpath>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ <breakpoints/>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <run>
+ <mainprogram>./bin/%{APPNAMELC}</mainprogram>
+ <programargs/>
+ </run>
+ </kdevtrollproject>
+ <workspace>
+ <openfiles/>
+ </workspace>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ <type ext="ts" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/qmakeapp/qmakeapp.kdevtemplate b/languages/cpp/app_templates/qmakeapp/qmakeapp.kdevtemplate
new file mode 100644
index 00000000..2fab0758
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/qmakeapp.kdevtemplate
@@ -0,0 +1,182 @@
+# KDE Config File
+[General]
+Name=Qt3 Application
+Name[br]=Meziant Qt3
+Name[ca]=Aplicació Qt3
+Name[da]=Qt3-Program
+Name[de]=Qt3-Anwendung
+Name[el]=ΕφαÏμογή Qt3
+Name[es]=Aplicación Qt3
+Name[et]=Qt3 rakendus
+Name[fr]=Application Qt3
+Name[hu]=Qt3-alapú alkalmazások
+Name[it]=Applicazione Qt3
+Name[ja]=Qt3 アプリケーション
+Name[nds]=Qt3-Programm
+Name[nl]=Qt3-toepassing
+Name[pl]=Program Qt3
+Name[pt]=Aplicação do Qt3
+Name[pt_BR]=Aplicação do Qt3
+Name[ru]=Приложение Qt 3
+Name[sk]=Qt3 aplikácia
+Name[sr]=Qt3 програм
+Name[sr@Latn]=Qt3 program
+Name[sv]=Qt3-program
+Name[zh_TW]=Qt3 應用程å¼
+Icon=qmakeapp.png
+Category=C++/QMake project
+Category[fr]=C++/QMake
+Comment=Generate a QMake/Qt3 based application (crossplatform compatible)
+Comment[ca]=Genera una aplicació basada en QMake/Qt3 (multi plataforma)
+Comment[da]=Generér et QMake/Qt3 baseret program (krydsplatform kompatibel)
+Comment[de]=Erstellt eine auf QMake/Qt3 basierende Anwendung (plattformunabhängig)
+Comment[el]=ΔημιουÏγία μια εφαÏμογής βασισμένης στα QMake/Qt3 (συμβατή με πολλαπλές πλατφόÏμες)
+Comment[es]=Genera una aplicación basada en QMake/Qt3 (con compatibilidad multiplataforma)
+Comment[et]=Rakenduse loomine QMake'i/Qt3 põhjal (multiplatvormne)
+Comment[fr]=Génère une application basée sur QMake / Qt3 (compatible multi-plateforme)
+Comment[hu]=Létrehoz egy QMake/Qt3-alapú, keresztfordításra is alkalmas alkalmazást
+Comment[it]=Genera un'applicazione basata su QMake/Qt3 (compatibile multipiattaforma)
+Comment[ja]=QMake/Qt3 ベースã®ã‚¢ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ä½œæˆ (クロスプラットフォーム)
+Comment[nds]=Stellt en op QMake/Qt3 opbuut Programm op (över Bedriefümgeven weg kompatibel)
+Comment[nl]=Genereert een Qmake/Qt3-gebaseerde toepassing (crossplatform compatible)
+Comment[pl]=Generuje program używający QMake i Qt3 (wieloplatformowy)
+Comment[pt]=Gera uma aplicação baseada no QMake/Qt3 (compatível com várias plataformas)
+Comment[pt_BR]=Gera uma aplicação baseada no QMake/Qt3 (compatível com várias plataformas)
+Comment[ru]=Создание иÑпользующее QMake кроÑÑплатформенное приложение Qt 3
+Comment[sk]=Vygeneruje aplikáciu založenú na QMake/Qt3 (multiplatformovo kompatibilnú)
+Comment[sr]=Прави програм на оÑнови QMake/Qt3 (прекоплатформÑки компатибилан)
+Comment[sr@Latn]=Pravi program na osnovi QMake/Qt3 (prekoplatformski kompatibilan)
+Comment[sv]=Skapar ett Qmake/Qt3-baserat program (fungerar på andra plattformar)
+Comment[zh_TW]=產生一個 QMake/Qt3 為基礎的應用程å¼ï¼ˆè·¨å¹³å°ç›¸å®¹ï¼‰
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=qmakeapp.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/qmakeapp.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/qmakeapp.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE3]
+Type=install
+Source=%{src}/src.pro
+Dest=%{dest}/src/src.pro
+
+[FILE4]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/qmakeapp.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE6]
+Type=install
+Source=%{src}/qmakeapp.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE7]
+Type=install
+Source=%{src}/fileopen.xpm
+Dest=%{dest}/src/fileopen.xpm
+
+[FILE8]
+Type=install
+Source=%{src}/filesave.xpm
+Dest=%{dest}/src/filesave.xpm
+
+[FILE9]
+Type=install
+Source=%{src}/fileprint.xpm
+Dest=%{dest}/src/fileprint.xpm
+
+[MSG]
+Type=message
+Comment=A Qt3/Qmake based application was created in %{dest}
+Comment[ca]=Una aplicació basada en Qt3/Qmake ha estat creada en %{dest}
+Comment[da]=Et Qt3/Qmake baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf QMake/Qt3 basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή βασισμένη στα Qt3/Qmake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación basada en Qt3/Qmake ha sido creada en %{dest}
+Comment[et]=Rakendus QMake'i põhjal loodi asukohta %{dest}
+Comment[fr]=Une application basée sur Qt3 / Qmake a été créée dans %{dest}
+Comment[hu]=Létrejött egy Qt3/Qmake-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su Qt3/Qmake in %{dest}
+Comment[ja]=Qt3/QMake ベースã®ã‚¢ãƒ—リケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op Qt3/Qmake opbuut Programm opstellt
+Comment[nl]=Een Qt3/Qmake-gebaseerde toepassing is aangemaakt in %{dest}
+Comment[pl]=Program używający QMake i Qt3 został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada no Qt3/Qmake em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada no Qt3/Qmake em %{dest}
+Comment[ru]=ИÑпользующее QMake приложение Qt 3 Ñоздано в %{dest}
+Comment[sk]=Aplikácia založená na Qt3/Qmake bola vytvorená v %{dest}
+Comment[sr]=Програм на оÑнови Qt3/Qmake направљен је у %{dest}
+Comment[sr@Latn]=Program na osnovi Qt3/Qmake napravljen je u %{dest}
+Comment[sv]=Ett Qmake/Qt3-baserat program skapades i %{dest}
+Comment[zh_TW]=一個 QMake/Qt3 為基礎的應用程å¼å·²å»ºç«‹æ–¼ %{dest}
+
+[QTDIR]
+Type=value
+ValueType=QString
+Value=QTDIR
+Comment=Directory where Qt3 is installed.
+Comment[ca]=Directori a on està instal·lat Qt3.
+Comment[da]=Katalog hvor Qt3 er installeret.
+Comment[de]=Qt3-Verzeichnis
+Comment[el]=Κατάλογος εγκατάστασης του Qt3.
+Comment[es]=Carpeta donde se ha instalado Qt3.
+Comment[et]=Kataloog, kuhu on paigaldatud Qt3.
+Comment[fr]=Dossier où Qt3 est installé.
+Comment[hu]=A Qt3 telepítési könyvtára
+Comment[it]=Cartella in cui è installato Qt3.
+Comment[ja]=Qt3 ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„るディレクトリ
+Comment[nds]=Orner, woneem Qt3 installeert is.
+Comment[nl]=Map waarin Qt3 is geïnstalleerd.
+Comment[pl]=Katalog, w którym zainstalowane jest Qt3.
+Comment[pt]=A pasta onde está instalado o Qt3.
+Comment[pt_BR]=A pasta onde está instalado o Qt3.
+Comment[ru]=Каталог Ñ ÑƒÑтановленным Qt 3
+Comment[sk]=PrieÄinok kde je nainÅ¡talované Qt3.
+Comment[sr]=Директоријум у коме је Qt3 инÑталиран.
+Comment[sr@Latn]=Direktorijum u kome je Qt3 instaliran.
+Comment[sv]=Katalog där Qt3 är installerat.
+Comment[zh_TW]=Qt3 的安è£ç›®éŒ„
+Default=
+[QMAKE]
+Type=value
+ValueType=QString
+Value=QMAKE
+Comment=Absolute Path for QMake (Qt3).
+Comment[ca]=Ruta absoluta per a QMake (Qt3).
+Comment[da]=Absolut søgesti til QMake (Qt3).
+Comment[de]=Absoluter Pfad für QMake (Qt3).
+Comment[el]=Απόλυτη διαδÏομή για το QMake (Qt3).
+Comment[es]=Ruta completa para QMake (Qt3).
+Comment[et]=QMake'i (Qt3) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour QMake (Qt3).
+Comment[hu]=A QMake (Qt3) teljes elérési útja.
+Comment[it]=Percorso assoluto per QMake (Qt3).
+Comment[ja]= QMake (Qt3) ã®çµ¶å¯¾ãƒ‘ス
+Comment[nds]=Afsluut Padd för QMake (Qt3)
+Comment[nl]=Absoluut pad naar QMake (Qt3)
+Comment[pl]=Ścieżka bezwzględna do QMake (Qt3).
+Comment[pt]=Localização Absoluta do QMake (Qt3).
+Comment[pt_BR]=Localização Absoluta do QMake (Qt3).
+Comment[ru]=ÐбÑолютный путь к QMake (Qt 3)
+Comment[sk]=Absolútna cesta ku QMake (Qt3).
+Comment[sr]=ÐпÑолутна путања до QMake-ва (Qt3).
+Comment[sr@Latn]=Apsolutna putanja do QMake-va (Qt3).
+Comment[sv]=Absolut sökväg till Qmake (Qt3).
+Comment[zh_TW]=QMake (Qt3) 的絕å°è·¯å¾‘
+Default=
diff --git a/languages/cpp/app_templates/qmakeapp/qmakeapp.png b/languages/cpp/app_templates/qmakeapp/qmakeapp.png
new file mode 100644
index 00000000..dda0a10b
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/qmakeapp.png
Binary files differ
diff --git a/languages/cpp/app_templates/qmakeapp/qmakeapp.pro b/languages/cpp/app_templates/qmakeapp/qmakeapp.pro
new file mode 100644
index 00000000..20f1cba4
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/qmakeapp.pro
@@ -0,0 +1,6 @@
+SUBDIRS += src
+TEMPLATE = subdirs
+CONFIG += release \
+ warn_on \
+ qt \
+ thread
diff --git a/languages/cpp/app_templates/qmakeapp/src.pro b/languages/cpp/app_templates/qmakeapp/src.pro
new file mode 100644
index 00000000..d72522f9
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeapp/src.pro
@@ -0,0 +1,10 @@
+SOURCES += %{APPNAMELC}.cpp \
+ main.cpp
+HEADERS += %{APPNAMELC}.h
+TEMPLATE = app
+CONFIG += release \
+ warn_on \
+ thread \
+ qt
+TARGET = %{APPNAMELC}
+DESTDIR = ../bin
diff --git a/languages/cpp/app_templates/qmakeempty/Makefile.am b/languages/cpp/app_templates/qmakeempty/Makefile.am
new file mode 100644
index 00000000..57677d88
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeempty/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = qmakeempty.kdevelop \
+ qmakeempty.pro qmakeempty.png
+
+templateName = qmakeempty
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/qmakeempty/qmakeempty.kdevelop b/languages/cpp/app_templates/qmakeempty/qmakeempty.kdevelop
new file mode 100644
index 00000000..cd633ede
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeempty/qmakeempty.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevcppsupport>
+ <qt>
+ <used>true</used>
+ <version>4</version>
+ <includestyle>4</includestyle>
+ <designerintegration>ExternalDesigner</designerintegration>
+ <qmake>%{QMAKE}</qmake>
+ <designer>%{DESIGNER}</designer>
+ </qt>
+ </kdevcppsupport>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ <breakpoints/>
+ <programargs></programargs>
+ <gdbpath>/usr/bin/gdb</gdbpath>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ <breakpoints/>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <run>
+ <mainprogram>./bin/%{APPNAMELC}</mainprogram>
+ <programargs/>
+ </run>
+ </kdevtrollproject>
+ <workspace>
+ <openfiles/>
+ </workspace>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ <type ext="ts" />
+ <type ext="qrc" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/qmakeempty/qmakeempty.kdevtemplate b/languages/cpp/app_templates/qmakeempty/qmakeempty.kdevtemplate
new file mode 100644
index 00000000..cb108705
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeempty/qmakeempty.kdevtemplate
@@ -0,0 +1,131 @@
+# KDE Config File
+[General]
+Name=Empty QMake Template
+Name[ca]=Plantilla QMake buida
+Name[da]=Tom QMake-skabelon
+Name[de]=Leere QMake-Vorlage
+Name[el]=Κενό Ï€Ïότυπο του QMake
+Name[es]=Plantilla QMake vacía
+Name[et]=Tühi QMake'i mall
+Name[hu]=Üres QMake-alapú sablon
+Name[it]=Modello di QMake vuoto
+Name[nds]=Leddig QMake-Vörlaag
+Name[nl]=Leeg QMake-sjabloon
+Name[pl]=Pusty szablon QMake
+Name[pt]=Modelo do QMake Vazio
+Name[pt_BR]=Modelo do QMake Vazio
+Name[ru]=ПуÑтой шаблон QMake
+Name[sk]=Prázdna šablóna založená na QMake
+Name[sr]=Празан шаблон QMake-а
+Name[sr@Latn]=Prazan Å¡ablon QMake-a
+Name[sv]=Tom Qmake-mall
+Name[zh_TW]=空的 QMake 樣本
+Icon=qmakeempty.png
+Category=C++/QMake project
+Comment=Generate an empty QMake based application (crossplatform compatible) - Needs Qt
+Comment[ca]=Genera una aplicació buida basada en QMake (compatible plataforma creuada) - Necessita Qt
+Comment[da]=Genererer et tomt QMake-baseret program (krydsplatformskompatibelt) - kræver Qt
+Comment[de]=Erstellt eine leere auf QMake basierende Anwendung (plattformunabhängig). - Benötigt Qt
+Comment[el]=ΔημιουÏγία μιας κενής εφαÏμογής βασισμένης στο QMake (crossplatform) - Βασίζεται στην Qt
+Comment[es]=Genera una aplicación vacía basada en QMake (con compatibilidad multiplataforma) - Necesita Qt
+Comment[et]=Tühja rakenduse loomine QMake'i põhjal (multiplatvormne) - vajalik on Qt
+Comment[hu]=Létrehoz egy üres QMake-alapú, keresztfordításra is alkalmas alkalmazást - Qt-t igényel
+Comment[it]=Genera un'applicazione basata su QMake vuoto (compatibile multipiattaforma) - serve Qt
+Comment[nds]=Stellt en op QMake opbuut Programm op (över Bedriefümgeven weg kompatibel) - Qt deit noot
+Comment[nl]=Genereer een leeg QMake-gebaseerd programma (crossplatform-compatible) - Heeft Qt nodig
+Comment[pl]=Generuje program używający QMake (wieloplatformowy) - wymaga biblioteki Qt
+Comment[pt]=Gera uma aplicação vazia baseada no QMake (compatível com várias plataformas) - Necessita do Qt4
+Comment[pt_BR]=Gera uma aplicação vazia baseada no QMake (compatível com várias plataformas) - Necessita do Qt4
+Comment[ru]=Создание каркаÑа кроÑÑплатформенного Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Qt, иÑпользующего QMake.
+Comment[sk]=Vygeneruje aplikáciu založenú na QMake (multiplatformovo kompatibilnú) - vyžaduje Qt
+Comment[sr]=Прави празан шаблон на оÑнови QMake-а (прекоплатформÑки компатибилан) — захтева Qt
+Comment[sr@Latn]=Pravi prazan šablon na osnovi QMake-a (prekoplatformski kompatibilan) — zahteva Qt
+Comment[sv]=Skapar ett tomt Qmake-baserat program (fungerar på andra plattformar). Kräver Qt.
+Comment[zh_TW]=產生一個空的以 QMake 為基礎的(跨平å°ç›¸å®¹ï¼‰æ‡‰ç”¨ç¨‹å¼â”€éœ€è¦ Qt
+FileTemplates=h,CStyle,cpp,CStyle
+Archive=qmakeempty.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/qmakeempty.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/qmakeempty.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[MSG]
+Type=message
+Comment=A Qmake based application was created in %{dest}
+Comment[ca]=Una aplicació basada en QMake ha estat creada en %{dest}
+Comment[da]=Et Qmake-baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf Qmake basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=ΔημιουÏγήθηκε μια εφαÏμογή βασισμένη σε Qmake στο %{dest}
+Comment[es]=Una aplicación basada en QMake ha sido creada en %{dest}
+Comment[et]=Rakendus QMake'i põhjal loodi asukohta %{dest}
+Comment[hu]=Létrejött egy Qmake-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su Qmake in %{dest}
+Comment[nds]=In %{dest} wöör en op QMake opbuut Programm opstellt
+Comment[nl]=Een Qmake-gebaseerd programma is aangemaakt in %{dest}
+Comment[pl]=Program oparty na QMake został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada no Qmake em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada no Qmake em %{dest}
+Comment[ru]=ИÑпользующее QMake приложение Ñоздано в %{dest}
+Comment[sk]=Aplikácia založená na QMake bola vytvorená v %{dest}
+Comment[sr]=Програм на оÑнову QMake-а направљен је у %{dest}
+Comment[sr@Latn]=Program na osnovu QMake-a napravljen je u %{dest}
+Comment[sv]=Ett Qmake-baserat program skapades i %{dest}
+Comment[zh_TW]=一個以 Qmake 為基礎的應用程å¼å·²å»ºç«‹æ–¼ %{dest}
+
+[QMAKE]
+Type=value
+ValueType=QString
+Value=QMAKE
+Comment=Absolute Path for QMake.
+Comment[ca]=Ruta absoluta per a QMake.
+Comment[da]=Absolut søgesti til QMake.
+Comment[de]=Absoluter Pfad für QMake.
+Comment[el]=Απόλυτη διαδÏομή του QMake.
+Comment[es]=Ruta completa para QMake.
+Comment[et]=QMake absoluutne asukoht.
+Comment[hu]=A QMake teljes elérési útja.
+Comment[it]=Percorso assoluto per QMake.
+Comment[nds]=Afsluut Padd för QMake
+Comment[nl]=Absoluut pad voor Qmake.
+Comment[pl]=Ścieżka bezwzględna do QMake.
+Comment[pt]=Localização Absoluta do QMake.
+Comment[pt_BR]=Localização Absoluta do QMake.
+Comment[ru]=Полный путь к QMake.
+Comment[sk]=Absolútna cesta ku QMake.
+Comment[sr]=ÐпÑолутна путања до QMake-а.
+Comment[sr@Latn]=Apsolutna putanja do QMake-a.
+Comment[sv]=Absolut sökväg till Qmake.
+Comment[zh_TW]=QMake 的絕å°è·¯å¾‘
+Default=
+
+[DESIGNER]
+Type=value
+ValueType=QString
+Value=DESIGNER
+Comment=Absolute Path for Designer.
+Comment[ca]=Ruta absoluta per a Designer.
+Comment[da]=Absolut søgesti til Designer
+Comment[de]=Absoluter Pfad für Designer.
+Comment[el]=Απόλυτη διαδÏομή του Designer.
+Comment[es]=Ruta completa para Designer.
+Comment[et]=Disaineri absoluutne asukoht.
+Comment[hu]=A Designer teljes elérési útja.
+Comment[it]=Percorso assoluto per Designer.
+Comment[nds]=Afsluut Padd för Designer
+Comment[nl]=Absoluut pad voor Designer.
+Comment[pl]=Ścieżka bezwzględna do Projektanta.
+Comment[pt]=Localização Absoluta do Designer.
+Comment[pt_BR]=Localização Absoluta do Designer.
+Comment[ru]=Полный путь к Designer.
+Comment[sk]=Absolútna cesta ku Designer.
+Comment[sr]=ÐпÑолутна путања до Designer-а.
+Comment[sr@Latn]=Apsolutna putanja do Designer-a.
+Comment[sv]=Absolut sökväg till Designer.
+Comment[zh_TW]=設計家(Designer)的絕å°è·¯å¾‘
+Default=
diff --git a/languages/cpp/app_templates/qmakeempty/qmakeempty.png b/languages/cpp/app_templates/qmakeempty/qmakeempty.png
new file mode 100644
index 00000000..332ea1c0
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeempty/qmakeempty.png
Binary files differ
diff --git a/languages/cpp/app_templates/qmakeempty/qmakeempty.pro b/languages/cpp/app_templates/qmakeempty/qmakeempty.pro
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/qmakeempty/qmakeempty.pro
diff --git a/languages/cpp/app_templates/qmakesimple/.kdev_ignore b/languages/cpp/app_templates/qmakesimple/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/qmakesimple/.kdev_ignore
diff --git a/languages/cpp/app_templates/qmakesimple/Makefile.am b/languages/cpp/app_templates/qmakesimple/Makefile.am
new file mode 100644
index 00000000..a187172f
--- /dev/null
+++ b/languages/cpp/app_templates/qmakesimple/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = main.cpp qmakesimple.png app.kdevelop app.pro src.pro
+templateName = qmakesimple
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/qmakesimple/app.kdevelop b/languages/cpp/app_templates/qmakesimple/app.kdevelop
new file mode 100644
index 00000000..a77f86f3
--- /dev/null
+++ b/languages/cpp/app_templates/qmakesimple/app.kdevelop
@@ -0,0 +1,100 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevcppsupport>
+ <qt>
+ <version>3</version>
+ <used>true</used>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ <root>%{QTDIR}</root>
+ <qmake>%{QMAKE}</qmake>
+ </qt>
+ </kdevcppsupport>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <programargs></programargs>
+ <gdbpath>/usr/bin/gdb</gdbpath>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ <dbgshell/>
+ </general>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <run>
+ <mainprogram>./bin/%{APPNAMELC}</mainprogram>
+ <programargs/>
+ </run>
+ </kdevtrollproject>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ <type ext="ts" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/qmakesimple/app.pro b/languages/cpp/app_templates/qmakesimple/app.pro
new file mode 100644
index 00000000..8feb4aa4
--- /dev/null
+++ b/languages/cpp/app_templates/qmakesimple/app.pro
@@ -0,0 +1,2 @@
+TEMPLATE=subdirs
+SUBDIRS=src
diff --git a/languages/cpp/app_templates/qmakesimple/main.cpp b/languages/cpp/app_templates/qmakesimple/main.cpp
new file mode 100644
index 00000000..e91f9f22
--- /dev/null
+++ b/languages/cpp/app_templates/qmakesimple/main.cpp
@@ -0,0 +1,15 @@
+%{CPP_TEMPLATE}
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+ printf("Hello, world!\n");
+
+ return EXIT_SUCCESS;
+}
diff --git a/languages/cpp/app_templates/qmakesimple/qmakesimple b/languages/cpp/app_templates/qmakesimple/qmakesimple
new file mode 100644
index 00000000..e476a7bf
--- /dev/null
+++ b/languages/cpp/app_templates/qmakesimple/qmakesimple
@@ -0,0 +1,11 @@
+# KDE Config File
+[General]
+Name=Hello world program
+Name[fr]=Un simple programme de test « Hello world »
+Icon=qmakesimple.png
+Category=C++/QMake project
+Category[fr]=C++/QMake
+Comment=Generates a simple Hello world program in C++ using QMake based project manager
+Comment[fr]=Génère un simple programme de test du type « Hello world » en utilisant QMake.
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/qmakesimple/qmakesimple.kdevtemplate b/languages/cpp/app_templates/qmakesimple/qmakesimple.kdevtemplate
new file mode 100644
index 00000000..1d7cc7b1
--- /dev/null
+++ b/languages/cpp/app_templates/qmakesimple/qmakesimple.kdevtemplate
@@ -0,0 +1,158 @@
+# KDE Config File
+[General]
+Name=Qt3 Hello world program
+Name[ca]=Programa Hello world per a Qt3
+Name[da]=Qt3 Goddag verden program
+Name[de]="Hello World"-Programm (Qt3)
+Name[el]=ΠÏόγÏαμμα 'Γεια σου Κόσμε' για το Qt3
+Name[es]=Programa Qt3 «Hola mundo»
+Name[et]=Qt3 "Tere,maailm" programm
+Name[fr]=Programme « Bonjour monde » en Qt3
+Name[hu]=Qt3-alapú 'Hello world' program
+Name[it]=Programma di "Hello world" fatto in Qt3
+Name[ja]=Qt3 Hello world プログラム
+Name[nds]=Qt3-"Moin Welt"-Programm
+Name[nl]=Qt3 Hello world-programma
+Name[pl]=Program 'Witaj świecie' w Qt3
+Name[pt]=Programa 'Olá mundo' em Qt3
+Name[pt_BR]=Programa 'Olá mundo' em Qt3
+Name[ru]=Программа Qt 3
+Name[sk]=Qt3 Ahoj svet program
+Name[sr]=Програм „Здраво Ñвете“ за Qt3
+Name[sr@Latn]=Program „Zdravo svete“ za Qt3
+Name[sv]=Qt3 Hello world-program
+Name[zh_TW]=Qt3 çš„ Hello world 程å¼
+Icon=qmakesimple.png
+Category=C++/QMake project
+Category[fr]=C++/QMake
+Comment=Generates a simple Hello world program in C++ using QMake/Qt3 based project manager
+Comment[ca]=Genera un simple programa de Hello world en C++ usant el gestor de projectes basat en QMake/Qt3
+Comment[da]=Genererer et simpelt Goddag verden program in C++ ved brug af QMake/Qt3 baseret projekthåndtering
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in C++ basierend auf dem QMake-Projektmanager und Qt3.
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα 'Γεια σου Κόσμε' σε C++ χÏησιμοποιώντας διαχειÏιστή έÏγου βασισμένο στο QMake/Qt3
+Comment[es]=Genera un sencillo programa «Hola mundo» en C++ que usa un gestor de proyecto basado en QMake/Qt3
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine C++-s projektihalduriga QMake'i/Qt3 põhjal
+Comment[fr]=Génère un programme « Bonjour monde » simple en C++ utilisant un gestionnaire de projet basé sur QMake / Qt3
+Comment[hu]=Létrehoz egy egyszerű 'Hello world' programot C++-ban, QMake/Qt3-alapú projektkezelővel
+Comment[it]=Genera un semplice programma di "Hello world" in C++ usando il gestore di progetto QMake/Qt3
+Comment[ja]=QMake/Qt3 ベースã®ãƒ—ロジェクトマãƒãƒ¼ã‚¸ãƒ£ã‚’使ã£ã¦ç°¡å˜ãª Hello World プログラムを C++ ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt mit den op Qt3 un QMake opbuut Projektpleger en eenfach "Moin Welt"-Programm in C++ op
+Comment[nl]=Genereert een eenvoudig Hello World-programma in C++ met behulp van de QMake/Qt3-gebaseerde projectbeheerder
+Comment[pl]=Generuje prosty program "Witaj świecie" w C++ używając menedżera projektów QMake i Qt3
+Comment[pt]=Gera um programa simples Olá Mundo em C++, usando o gestor de projectos QMake/Qt3
+Comment[pt_BR]=Gera um programa simples Olá Mundo em C++, usando o gestor de projectos QMake/Qt3
+Comment[ru]=Создание проÑтой программы на C++ Ñ Ð¸Ñпользованием QMake (Qt 3)
+Comment[sk]=Vygeneruje jednoduchý Ahoj svet program v C++ s použitím QMake/Qt3 projektového manažéra
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм у C++-у помоћу менаџера пројекта на оÑнову QMake/Qt3
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program u C++-u pomoću menadžera projekta na osnovu QMake/Qt3
+Comment[sv]=Skapar ett enkelt Hello world-program i C++ baserat på QMake/Qt3 projekthantering
+Comment[zh_TW]=產生一個使用 QMake/Qt3 專案管ç†å“¡çš„ç°¡å–® C++ Hello world 程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=qmakesimple.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE3]
+Type=install
+Source=%{src}/src.pro
+Dest=%{dest}/src/src.pro
+
+[FILE4]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[MSG]
+Type=message
+Comment=A Qmake/Qt3 based hello world program was created in %{dest}
+Comment[ca]=Una programa de hello world basat en QMake/Qt3 ha estat creat en %{dest}
+Comment[da]=et Qmake/Qt3 baseret Goddag verden program blev oprettet i %{dest}
+Comment[de]=Ein auf QMake basierendes "Hello World"-Programm wurde in %{dest} erstellt.
+Comment[el]=Ένα Ï€ÏόγÏαμμα 'Γεια σου Κόσμε' βασισμένο στο Qmake/Qt3 δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un programa «Hola mundo» basado en QMake/Qt3 ha sido creado en %{dest}
+Comment[et]="Tere, maailm" programm QMake'i/Qt3 põhjal loodi asukohta %{dest}
+Comment[fr]=Un programme « Bonjour monde » basé sur QMake / Qt3 a été créé dans %{dest}
+Comment[hu]=Létrejött egy Qmake/Qt3-alapú 'Hello world' program itt: %{dest}
+Comment[it]=È stato creato un programma di "hello world" basato su Qmake/Qt3 in %{dest}
+Comment[ja]=QMake/Qt3 ベース㮠hello world プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op Qt3 un QMake opbuut "Moin Welt"-Programm opstellt
+Comment[nl]=Een Qmake/Qt3-gebaseerd Hello World-programma is aangemaakt in %{dest}
+Comment[pl]=Prosty program używający Qmake/Qt3 został utworzony w %{dest}
+Comment[pt]=Foi criado um programa Olá Mundo, baseado no Qmake/Qt3, em %{dest}
+Comment[pt_BR]=Foi criado um programa Olá Mundo, baseado no Qmake/Qt3, em %{dest}
+Comment[ru]=Программа на Qt 3, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑŽÑ‰Ð°Ñ QMake, Ñоздана в %{dest}
+Comment[sk]=Ahoj svet program založený na Qmake/Qt3 bol vytvorený v %{dest}
+Comment[sr]=„Здраво Ñвете“ на оÑнову Qmake/Qt3 направљен је у %{dest}
+Comment[sr@Latn]=„Zdravo svete“ na osnovu Qmake/Qt3 napravljen je u %{dest}
+Comment[sv]=Ett Qmake/Qt3-baserat Hello world-program skapades i %{dest}
+Comment[zh_TW]=一個 Qmake/Qt3 為基礎的 hello world 程å¼å·²å»ºç«‹æ–¼ %{dest}
+
+
+[QTDIR]
+Type=value
+ValueType=QString
+Value=QTDIR
+Comment=Directory where Qt3 is installed.
+Comment[ca]=Directori a on està instal·lat Qt3.
+Comment[da]=Katalog hvor Qt3 er installeret.
+Comment[de]=Qt3-Verzeichnis
+Comment[el]=Κατάλογος εγκατάστασης του Qt3.
+Comment[es]=Carpeta donde se ha instalado Qt3.
+Comment[et]=Kataloog, kuhu on paigaldatud Qt3.
+Comment[fr]=Dossier où Qt3 est installé.
+Comment[hu]=A Qt3 telepítési könyvtára
+Comment[it]=Cartella in cui è installato Qt3.
+Comment[ja]=Qt3 ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„るディレクトリ
+Comment[nds]=Orner, woneem Qt3 installeert is.
+Comment[nl]=Map waarin Qt3 is geïnstalleerd.
+Comment[pl]=Katalog, w którym zainstalowane jest Qt3.
+Comment[pt]=A pasta onde está instalado o Qt3.
+Comment[pt_BR]=A pasta onde está instalado o Qt3.
+Comment[ru]=Каталог Ñ ÑƒÑтановленным Qt 3
+Comment[sk]=PrieÄinok kde je nainÅ¡talované Qt3.
+Comment[sr]=Директоријум у коме је Qt3 инÑталиран.
+Comment[sr@Latn]=Direktorijum u kome je Qt3 instaliran.
+Comment[sv]=Katalog där Qt3 är installerat.
+Comment[zh_TW]=Qt3 的安è£ç›®éŒ„
+Default=
+[QMAKE]
+Type=value
+ValueType=QString
+Value=QMAKE
+Comment=Absolute Path for QMake (Qt3).
+Comment[ca]=Ruta absoluta per a QMake (Qt3).
+Comment[da]=Absolut søgesti til QMake (Qt3).
+Comment[de]=Absoluter Pfad für QMake (Qt3).
+Comment[el]=Απόλυτη διαδÏομή για το QMake (Qt3).
+Comment[es]=Ruta completa para QMake (Qt3).
+Comment[et]=QMake'i (Qt3) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour QMake (Qt3).
+Comment[hu]=A QMake (Qt3) teljes elérési útja.
+Comment[it]=Percorso assoluto per QMake (Qt3).
+Comment[ja]= QMake (Qt3) ã®çµ¶å¯¾ãƒ‘ス
+Comment[nds]=Afsluut Padd för QMake (Qt3)
+Comment[nl]=Absoluut pad naar QMake (Qt3)
+Comment[pl]=Ścieżka bezwzględna do QMake (Qt3).
+Comment[pt]=Localização Absoluta do QMake (Qt3).
+Comment[pt_BR]=Localização Absoluta do QMake (Qt3).
+Comment[ru]=ÐбÑолютный путь к QMake (Qt 3)
+Comment[sk]=Absolútna cesta ku QMake (Qt3).
+Comment[sr]=ÐпÑолутна путања до QMake-ва (Qt3).
+Comment[sr@Latn]=Apsolutna putanja do QMake-va (Qt3).
+Comment[sv]=Absolut sökväg till Qmake (Qt3).
+Comment[zh_TW]=QMake (Qt3) 的絕å°è·¯å¾‘
+Default=
diff --git a/languages/cpp/app_templates/qmakesimple/qmakesimple.png b/languages/cpp/app_templates/qmakesimple/qmakesimple.png
new file mode 100644
index 00000000..494d83da
--- /dev/null
+++ b/languages/cpp/app_templates/qmakesimple/qmakesimple.png
Binary files differ
diff --git a/languages/cpp/app_templates/qmakesimple/src.pro b/languages/cpp/app_templates/qmakesimple/src.pro
new file mode 100644
index 00000000..e7a46a76
--- /dev/null
+++ b/languages/cpp/app_templates/qmakesimple/src.pro
@@ -0,0 +1,4 @@
+SOURCES=%{APPNAMELC}.cpp
+TARGET=%{APPNAMELC}
+DESTDIR=../bin
+TEMPLATE = app
diff --git a/languages/cpp/app_templates/qt4hello/Makefile.am b/languages/cpp/app_templates/qt4hello/Makefile.am
new file mode 100644
index 00000000..b285f781
--- /dev/null
+++ b/languages/cpp/app_templates/qt4hello/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = main.cpp qt4hello.png qt4hello.kdevelop \
+ qt4hello.pro src.pro ReadMe
+
+templateName = qt4hello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/qt4hello/ReadMe b/languages/cpp/app_templates/qt4hello/ReadMe
new file mode 100644
index 00000000..87d23f71
--- /dev/null
+++ b/languages/cpp/app_templates/qt4hello/ReadMe
@@ -0,0 +1,11 @@
+READ THIS IN ORDER TO COMPILE THE Qt4 TEMPLATE
+----------------------------------------------
+
+Before compiling, check the Qt Options, go to
+Project->Project Options->C++ Support and open the Qt Options tab.
+
+Check that the Qt installation directory is correct for the Qt version you've chosen.
+
+------------------
+Andreas Pakulat
+July 2006
diff --git a/languages/cpp/app_templates/qt4hello/main.cpp b/languages/cpp/app_templates/qt4hello/main.cpp
new file mode 100644
index 00000000..cbff1d3c
--- /dev/null
+++ b/languages/cpp/app_templates/qt4hello/main.cpp
@@ -0,0 +1,11 @@
+%{CPP_TEMPLATE}
+
+#include <QCoreApplication>
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication app(argc, argv);
+ qDebug("Hello from Qt 4!");
+ return 0;
+}
+
diff --git a/languages/cpp/app_templates/qt4hello/qt4hello.kdevelop b/languages/cpp/app_templates/qt4hello/qt4hello.kdevelop
new file mode 100644
index 00000000..cd633ede
--- /dev/null
+++ b/languages/cpp/app_templates/qt4hello/qt4hello.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevcppsupport>
+ <qt>
+ <used>true</used>
+ <version>4</version>
+ <includestyle>4</includestyle>
+ <designerintegration>ExternalDesigner</designerintegration>
+ <qmake>%{QMAKE}</qmake>
+ <designer>%{DESIGNER}</designer>
+ </qt>
+ </kdevcppsupport>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ <breakpoints/>
+ <programargs></programargs>
+ <gdbpath>/usr/bin/gdb</gdbpath>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ <breakpoints/>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <run>
+ <mainprogram>./bin/%{APPNAMELC}</mainprogram>
+ <programargs/>
+ </run>
+ </kdevtrollproject>
+ <workspace>
+ <openfiles/>
+ </workspace>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ <type ext="ts" />
+ <type ext="qrc" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/qt4hello/qt4hello.kdevtemplate b/languages/cpp/app_templates/qt4hello/qt4hello.kdevtemplate
new file mode 100644
index 00000000..d1796a14
--- /dev/null
+++ b/languages/cpp/app_templates/qt4hello/qt4hello.kdevtemplate
@@ -0,0 +1,160 @@
+# KDE Config File
+[General]
+Name=Basic Qt4 Application
+Name[ca]=Aplicació en Qt4 bàsica
+Name[da]=Basalt Qt4-program
+Name[de]=Einfache Qt4-Anwendung
+Name[el]=Βασική εφαÏμογή Qt4
+Name[es]=Aplicación Qt4 básica
+Name[et]=Elementaarne Qt4 rakendus
+Name[fr]=Application Qt4 de base
+Name[hu]=Egyszerű Qt4-alapú alkalmazás
+Name[it]=Applicazione Qt4 base
+Name[ja]=基本的㪠Qt4 アプリケーション
+Name[nds]=Eenfach Qt4-Programm
+Name[nl]=Basis Qt4-toepassing
+Name[pl]=Prosty program w Qt4
+Name[pt]=Aplicação Básica em Qt4
+Name[pt_BR]=Aplicação Básica em Qt4
+Name[ru]=ПроÑтое приложение Qt 4
+Name[sk]=Základná Qt4 aplikácia
+Name[sr]=ОÑновни Qt4 програм
+Name[sr@Latn]=Osnovni Qt4 program
+Name[sv]=Grundläggande Qt4-program
+Name[zh_TW]=基本 Qt4 應用程å¼
+Icon=qt4hello.png
+Category=C++/QMake project
+Comment=Generate a very simple QMake/Qt4 based application (crossplatform compatible) - Needs Qt4
+Comment[ca]=Genera una aplicació molt simple basada en QMake/Qt4 (multi plataforma) -requereix Qt4-
+Comment[da]=Generér et meget enkelt QMake/Qt4 baseret program (krydsplatform kompatibel) - behøver Qt4
+Comment[de]=Erstellt eine sehr einfache, auf QMake/Qt4 basierende Anwendung (plattformunabhängig). - Benötigt Qt4.
+Comment[el]=ΔημιουÏγία μια εφαÏμογής βασισμένης στα QMake/Qt4 (συμβατή με πολλαπλές πλατφόÏμες) -Απαιτεί το Qt4
+Comment[es]=Genera una aplicación muy sencilla basada en QMake/Qt4 (con compatibilidad multiplataforma) - Necesita Qt4
+Comment[et]=Väga lihtsa rakenduse loomine QMake'i/Qt4 põhjal (multiplatvormne) - vajalik on Qt4
+Comment[fr]=Génère une application basée sur QMake / Qt4 très simple (compatible multi-plateforme) - Nécessite Qt4
+Comment[hu]=Létrehoz egy QMake/Qt4-alapú, keresztfordításra is alkalmas alkalmazást - Qt4-et igényel
+Comment[it]=Genera una semplice applicazione basata su QMake/Qt4 (compatibile multipiattaforma) - serve Qt4
+Comment[nds]=Stellt en op QMake un Qt4 opbuut Programm op (över Bedriefümgeven weg kompatibel) - Qt4 deit noot
+Comment[nl]=Genereert een heel eenvoudig Qmake/Qt4-gebaseerde toepassing (crossplatform compatible) - heeft Qt4 nodig
+Comment[pl]=Generuje program używający QMake i Qt4 (wieloplatformowy)
+Comment[pt]=Gera uma aplicação baseada no QMake/Qt4 (compatível com várias plataformas) - Necessita do Qt4
+Comment[pt_BR]=Gera uma aplicação baseada no QMake/Qt4 (compatível com várias plataformas) - Necessita do Qt4
+Comment[ru]=Создание проÑтого кроÑÑплатформенного Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Qt 4, иÑпользующего QMake.
+Comment[sk]=Vygeneruje veľmi jednoduchú aplikáciu založenú na QMake/Qt4 (multiplatformovo kompatibilnú) - vyžaduje Qt4
+Comment[sr]=Прави једноÑтаван програм на оÑнови QMake/Qt4 (прекоплатформÑки компатибилан) — захтева Qt4
+Comment[sr@Latn]=Pravi jednostavan program na osnovi QMake/Qt4 (prekoplatformski kompatibilan) — zahteva Qt4
+Comment[sv]=Skapar ett mycket enkelt QMake/Qt4-baserat program (fungerar på andra plattformar). Kräver Qt4.
+Comment[zh_TW]=產生一個以 QMake/Qt4 為基礎的簡單應用程å¼ï¼ˆè·¨å¹³å°ç›¸å®¹ï¼‰â”€éœ€è¦ä½¿ç”¨ Qt4
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/main.cpp,%{dest}/src/ReadMe
+Archive=qt4hello.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/qt4hello.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/qt4hello.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE3]
+Type=install
+Source=%{src}/src.pro
+Dest=%{dest}/src/src.pro
+
+[FILE4]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/ReadMe
+Dest=%{dest}/src/ReadMe
+
+[MSG]
+Type=message
+Comment=A Qt4/Qmake based application was created in %{dest}
+Comment[ca]=Una aplicació basada en Qt4/Qmake ha estat creada en %{dest}
+Comment[da]=Et Qt4/Qmake baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf QMake/Qt4 basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή βασισμένη στα Qt4/Qmake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación basada en Qt4/Qmake ha sido creada en %{dest}
+Comment[et]=Rakendus Qt4/QMake'i põhjal loodi asukohta %{dest}
+Comment[fr]=Une application basée sur Qt4 / Qmake a été créée dans %{dest}
+Comment[hu]=Létrejött egy Qt4/Qmake-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su Qt4/Qmake in %{dest}
+Comment[ja]=Qt4/QMake ベースã®ã‚¢ãƒ—リケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op Qt4 un Qmake opbuut Programm opstellt
+Comment[nl]=Een Qt4/Qmake gebaseerde toepassing is aangemaakt in %{dest}
+Comment[pl]=Program używający QMake i Qt4 został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada no Qt4/Qmake em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada no Qt4/Qmake em %{dest}
+Comment[ru]=Приложение Qt 4, иÑпользующее Qmake, Ñоздано в %{dest}
+Comment[sk]=Aplikácia založená na Qt4/Qmake bola vytvorená v %{dest}
+Comment[sr]=Програм на оÑнову Qt4/Qmake направљен је у %{dest}
+Comment[sr@Latn]=Program na osnovu Qt4/Qmake napravljen je u %{dest}
+Comment[sv]=Ett QMake/Qt4-baserat program skapades i %{dest}
+Comment[zh_TW]=一個 QMake/Qt4 為基礎的應用程å¼å·²å»ºç«‹æ–¼ %{dest}
+
+[QMAKE]
+Type=value
+ValueType=QString
+Value=QMAKE
+Comment=Absolute Path for QMake (Qt4).
+Comment[ca]=Ruta absoluta per a QMake (Qt4).
+Comment[da]=Absolut søgesti til QMake (Qt4).
+Comment[de]=Absoluter Pfad für QMake (Qt4).
+Comment[el]=Απόλυτη διαδÏομή για το QMake (Qt4).
+Comment[es]=Ruta completa para QMake (Qt4).
+Comment[et]=QMake (Qt4) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour QMake (Qt4).
+Comment[hu]=A QMake (Qt4) teljes elérési útja.
+Comment[it]=Percorso assoluto per QMake (Qt4).
+Comment[ja]=QMake (Qt4) ã®çµ¶å¯¾ãƒ‘ス
+Comment[nds]=Afsluut Padd för QMake (Qt4)
+Comment[nl]=Absoluut pad naar QMake (Qt4).
+Comment[pl]=Ścieżka bezwzględna do QMake (Qt4).
+Comment[pt]=Localização Absoluta do QMake (Qt4).
+Comment[pt_BR]=Localização Absoluta do QMake (Qt4).
+Comment[ru]=Полный путь к QMake (Qt 4).
+Comment[sk]=Absolútna cesta ku QMake (Qt4).
+Comment[sr]=ÐпÑолутна путања до QMake-а (Qt4).
+Comment[sr@Latn]=Apsolutna putanja do QMake-a (Qt4).
+Comment[sv]=Absolut sökväg till QMake (Qt4).
+Comment[zh_TW]=QMake(Qt4)的絕å°è·¯å¾‘
+Default=
+
+[DESIGNER]
+Type=value
+ValueType=QString
+Value=DESIGNER
+Comment=Absolute Path for Designer (Qt4).
+Comment[ca]=Ruta absoluta per a Designer (Qt4).
+Comment[da]=Absolut søgesti til Designer (Qt4).
+Comment[de]=Absoluter Pfad für Designer (Qt4).
+Comment[el]=Απόλυτη διαδÏομή για τον Σχεδιαστή (Qt4).
+Comment[es]=Ruta completa para Designer (Qt4).
+Comment[et]=Disaineri (Qt4) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour Designer (Qt4).
+Comment[hu]=A Designer (Qt4) teljes elérési útja
+Comment[it]=Percorso assoluto del Designer (Qt4).
+Comment[ja]=Designer (Qt4) ã®çµ¶å¯¾ãƒ‘ス
+Comment[nds]=Afsluut Padd för Designer (Qt4)
+Comment[nl]=Absoluut pad naar Designer (Qt4).
+Comment[pl]=Ścieżka bezwzględna do Designera (Qt4).
+Comment[pt]=Localização Absoluta do Designer (Qt4).
+Comment[pt_BR]=Localização Absoluta do Designer (Qt4).
+Comment[ru]=Полный путь к Designer (Qt 4).
+Comment[sk]=Absolútna cesta ku Designer (Qt4).
+Comment[sr]=ÐпÑолутна путања до Designer-а (Qt4).
+Comment[sr@Latn]=Apsolutna putanja do Designer-a (Qt4).
+Comment[sv]=Absolut sökväg till Designer (Qt4).
+Comment[zh_TW]=設計家(Qt4)的絕å°è·¯å¾‘
+Default=
diff --git a/languages/cpp/app_templates/qt4hello/qt4hello.png b/languages/cpp/app_templates/qt4hello/qt4hello.png
new file mode 100644
index 00000000..332ea1c0
--- /dev/null
+++ b/languages/cpp/app_templates/qt4hello/qt4hello.png
Binary files differ
diff --git a/languages/cpp/app_templates/qt4hello/qt4hello.pro b/languages/cpp/app_templates/qt4hello/qt4hello.pro
new file mode 100644
index 00000000..7177d225
--- /dev/null
+++ b/languages/cpp/app_templates/qt4hello/qt4hello.pro
@@ -0,0 +1,5 @@
+SUBDIRS += src
+TEMPLATE = subdirs
+CONFIG += warn_on \
+ qt \
+ thread \ No newline at end of file
diff --git a/languages/cpp/app_templates/qt4hello/src.pro b/languages/cpp/app_templates/qt4hello/src.pro
new file mode 100644
index 00000000..ae5bac37
--- /dev/null
+++ b/languages/cpp/app_templates/qt4hello/src.pro
@@ -0,0 +1,8 @@
+SOURCES += main.cpp
+TEMPLATE = app
+CONFIG += warn_on \
+ thread \
+ qt
+TARGET = %{APPNAMELC}
+DESTDIR = ../bin
+QT -= gui
diff --git a/languages/cpp/app_templates/qt4makeapp/Makefile.am b/languages/cpp/app_templates/qt4makeapp/Makefile.am
new file mode 100644
index 00000000..62c4c120
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = main.cpp qt4makeapp.cpp qt4makeapp.h qt4makeapp.png qt4makeapp.kdevelop \
+ qt4makeapp.pro src.pro application.qrc ReadMe filesave.xpm fileopen.xpm filenew.xpm \
+ editcopy.xpm editpaste.xpm editcut.xpm
+
+templateName = qt4makeapp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/qt4makeapp/ReadMe b/languages/cpp/app_templates/qt4makeapp/ReadMe
new file mode 100644
index 00000000..87d23f71
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/ReadMe
@@ -0,0 +1,11 @@
+READ THIS IN ORDER TO COMPILE THE Qt4 TEMPLATE
+----------------------------------------------
+
+Before compiling, check the Qt Options, go to
+Project->Project Options->C++ Support and open the Qt Options tab.
+
+Check that the Qt installation directory is correct for the Qt version you've chosen.
+
+------------------
+Andreas Pakulat
+July 2006
diff --git a/languages/cpp/app_templates/qt4makeapp/application.qrc b/languages/cpp/app_templates/qt4makeapp/application.qrc
new file mode 100644
index 00000000..c35b0695
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/application.qrc
@@ -0,0 +1,10 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>editcopy.xpm</file>
+ <file>editcut.xpm</file>
+ <file>filenew.xpm</file>
+ <file>fileopen.xpm</file>
+ <file>editpaste.xpm</file>
+ <file>filesave.xpm</file>
+</qresource>
+</RCC> \ No newline at end of file
diff --git a/languages/cpp/app_templates/qt4makeapp/editcopy.xpm b/languages/cpp/app_templates/qt4makeapp/editcopy.xpm
new file mode 100644
index 00000000..8350ed0e
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/editcopy.xpm
@@ -0,0 +1,193 @@
+/* XPM */
+static char *editcopy[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 155 2",
+" c black",
+". c #191000",
+"X c #221700",
+"o c #2E2300",
+"O c #452E00",
+"+ c #433200",
+"@ c #493000",
+"# c #553800",
+"$ c #5D4600",
+"% c #6B5000",
+"& c #724B00",
+"* c #7D5E00",
+"= c #6E694F",
+"- c #7E795F",
+"; c #865900",
+": c #8A5C00",
+"> c #8B6800",
+", c #936200",
+"< c #926D00",
+"1 c #926B1A",
+"2 c #967000",
+"3 c #9B721D",
+"4 c #9B7625",
+"5 c #9E792A",
+"6 c #A47C00",
+"7 c #AA7D00",
+"8 c #A1761A",
+"9 c #A57816",
+"0 c #A4791D",
+"q c #AD8200",
+"w c #B28500",
+"e c #AE8530",
+"r c #B99626",
+"t c #97906D",
+"y c #B18D48",
+"u c #B49049",
+"i c #B89542",
+"p c #BA9C4D",
+"a c #BD9E52",
+"s c #BFA053",
+"d c #B8AE78",
+"f c #BEB47E",
+"g c #C49300",
+"h c #C89600",
+"j c #C19D2C",
+"k c #C1A43F",
+"l c #C09E4E",
+"z c #CFB457",
+"x c #C9B159",
+"c c #CAB573",
+"v c #D4BF7C",
+"b c #FFDF62",
+"n c #FFE064",
+"m c #FFE16D",
+"M c #FFE372",
+"N c #FFE479",
+"B c #A19D8E",
+"V c #ABA89A",
+"C c #BEB580",
+"Z c #BDB488",
+"A c #B8B496",
+"S c #AEADAA",
+"D c #B3AFA1",
+"F c #BCBBB6",
+"G c #BFBFB9",
+"H c #C0B680",
+"J c #C4BA85",
+"K c #C6BD8B",
+"L c #CBB589",
+"P c #C8BE88",
+"I c #C3BC90",
+"U c #CBC18C",
+"Y c #CCC493",
+"T c #D7CB8C",
+"R c #DAC786",
+"E c #D8C789",
+"W c #DAC98B",
+"Q c #D0C690",
+"! c #D4CA94",
+"~ c #D4CC9B",
+"^ c #D8CE98",
+"/ c #DCD29C",
+"( c #C6C3B7",
+") c #C8C6BE",
+"_ c #D5C5A5",
+"` c #DBC8A1",
+"' c #DBD4A2",
+"] c #DED9AE",
+"[ c #D9D5B1",
+"{ c #E0CC82",
+"} c #E8D98B",
+"| c #E8D991",
+" . c #E1D7A1",
+".. c #E5DBA5",
+"X. c #E4DCAB",
+"o. c #E8DDAA",
+"O. c #E1DCB2",
+"+. c #E1DCB8",
+"@. c #FFE683",
+"#. c #FFE78A",
+"$. c #FFE885",
+"%. c #FFE88D",
+"&. c #FFE992",
+"*. c #FFEC9D",
+"=. c #FFF09F",
+"-. c #ECE2AC",
+";. c #E5E0B6",
+":. c #E5E1B8",
+">. c #EBE4B6",
+",. c #EAE5BC",
+"<. c #F0E5A8",
+"1. c #FFEDA3",
+"2. c #FFEDA9",
+"3. c #F1E8B8",
+"4. c #FFEFB1",
+"5. c #FFF1A5",
+"6. c #FFF2AD",
+"7. c #FFF2B4",
+"8. c #FFF2BC",
+"9. c #CAC8C2",
+"0. c #D6D4CB",
+"q. c #DFDAC5",
+"w. c #D4D2D0",
+"e. c #E0D7C5",
+"r. c #E4DAC3",
+"t. c #E8DEC7",
+"y. c #E0DFD3",
+"u. c #E6E2C2",
+"i. c #E8E1C5",
+"p. c #EBE3CB",
+"a. c #EEE9C2",
+"s. c #E8E6DC",
+"d. c #F3EDC3",
+"f. c #F2EDCB",
+"g. c #F7F2CD",
+"h. c #FFF3C3",
+"j. c #FFF4CA",
+"k. c #FFF8C5",
+"l. c #FFF8CD",
+"z. c #FDF5D2",
+"x. c #FFF7D8",
+"c. c #FFF9D4",
+"v. c #FFF9DC",
+"b. c #E9E8E7",
+"n. c #F3EFE3",
+"m. c #F2F0E3",
+"M. c #F4F2EA",
+"N. c #FBF7E6",
+"B. c #FEF9E3",
+"V. c #FFFBEC",
+"C. c #F4F4F3",
+"Z. c #F8F7F6",
+"A. c #FEFCF4",
+"S. c #FEFEFC",
+"D. c None",
+/* pixels */
+"D.D.D.D.D.D.D.D.D.D.D.D.h g g g g g g g g g g w * D.D.D.D.D.",
+"D.D.D.D.D.D.D.D.D.D.D.D.g z.z.g.g.g.g.g.g.z.g.R 2 D.D.D.D.D.",
+"D.D.D.D.D.D.D.D.D.D.D.D.g z.d.3.3.3.3.3.3.>.f.g.z < D.D.D.D.",
+"D.D.D.D.D., : ; , : : : 7 a i a R -.-.-.-.' m.u.g.j > D.D.D.",
+"D.D.D.D., u y y L L L L ` t.t.e.e v -.-.-.Y b.S.+.d.q D.D.D.",
+"D.D.D.D., S.S.S.S.S.S.S.S.Z.b.S.e.i W o.o.K w.S.A.u.q D.D.D.",
+"D.D.D.D., S.S.S.A.S.S.S.S.M.w.S.S._ a E ..K 0.S.S.q.7 D.D.D.",
+"D.D.D.D., S.A.V.A.A.A.V.A.n.9.S.S.C._ a ..Y t = - A 6 D.D.D.",
+"D.D.D.D., A.A.V.A.V.V.V.A.n.9.S.S.S.Z.3 ' ' K Z A ] 7 D.D.D.",
+"D.D.D.D., A.V.B.V.V.B.V.V.n.( F S S G 5 ' | / / X.f.q D.D.D.",
+"D.D.D.D., A.V.x.B.x.V.B.N.B.e.D B V ) 3 / / ^ ^ ' a.q D.D.D.",
+"D.D.D.D., V.N.N.B.B.B.v.v.N.z.p.i.p.n.8 ^ / ! Q ' a.q D.D.D.",
+"D.D.D.D., B.B.x.v.x.z.j.j.x.z.z.c.B.B.0 ! ! ! ^ ' ,.q D.D.D.",
+"D.D.D.D., B.h.h.z.z.x.x.z.z.z.h.j.x.v.0 ! Q Y ! ~ ,.q D.D.D.",
+"D.D.D.D., v.c.k.x.h.j.j.j.z.8.h.k.j.v.0 U T U U ~ ,.q D.D.D.",
+"D.D.D.D., v.k.z.h.h.h.j.8.j.h.h.j.k.v.0 U U U U Y ;.q D.D.D.",
+"D.D.D.D., x.h.8.8.h.j.8.8.4.h.4.8.h.x.8 P H P P ~ ;.q D.D.D.",
+"D.D.D.D., v.h.4.4.8.8.4.1.z.h.8.4.h.c.8 H J H J Y ;.q D.D.D.",
+"D.D.D.D., c.2.z.j.4.*.1.1.8.2.2.*.2.l.8 J J H J U ] q D.D.D.",
+"D.D.D.D., l.h.2.4.4.1.%.1.&.2.4.8.7.k.8 f d f H U ] q D.D.D.",
+"D.D.D.D., z.8.#.1.4.1.*.1.1.1.*.N 4.l.8 f f C K ~ :.q D.D.D.",
+"D.D.D.D., 8.&.4.#.%.4.&.@.#.%.%.&.2.l.8 K K Y ~ ] ,.6 D.D.D.",
+"D.D.D.D., h.&.#.*.1.1.%.N N #.&.*.1.l.0 ' ] T x r 6 % D.D.D.",
+"D.D.D.D., 4.4.%.*.#.b &.N M b M 2.1.k.9 k 7 > $ o D.D.D.",
+"D.D.D.D., 7.&.N 5.&.N @.*.b N M N =.k., + D.D.D.",
+"D.D.D.D., 6.N N M M &.#.N 2.$.%.8.6.<.& D.D.D.D.D.",
+"D.D.D.D., 5.&.7.n $.m M 1.7.7.o.c 5 & @ D.D.D.D.D.D.D.D.D.",
+"D.D.D.D., 7.*.m %.=.&.7.} p 1 % # X D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D., 6.5.5.5.| a 1 & + . D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D., 6.-.a 1 & O . D.D.D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D.; : % O . D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D. D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D."
+};
diff --git a/languages/cpp/app_templates/qt4makeapp/editcut.xpm b/languages/cpp/app_templates/qt4makeapp/editcut.xpm
new file mode 100644
index 00000000..9a118931
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/editcut.xpm
@@ -0,0 +1,252 @@
+/* XPM */
+static char *editcut[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 214 2",
+" c #000000",
+". c #0B0B0B",
+"X c #181300",
+"o c #1D190B",
+"O c #131313",
+"+ c #1B1B1B",
+"@ c #211E11",
+"# c #26231A",
+"$ c #2A2513",
+"% c #2E2912",
+"& c #2E2A19",
+"* c #372E0B",
+"= c #302A12",
+"- c #312C1B",
+"; c #3A320F",
+": c #3C3415",
+"> c #3C351B",
+", c #232323",
+"< c #2B2922",
+"1 c #2C2C2C",
+"2 c #302E26",
+"3 c #353120",
+"4 c #3F3B2D",
+"5 c #313131",
+"6 c #3A3A3A",
+"7 c #423814",
+"8 c #493E17",
+"9 c #413D2F",
+"0 c #423F32",
+"q c #4F4319",
+"w c #5C4A00",
+"e c #5F4F0D",
+"r c #514410",
+"t c #554813",
+"y c #4E472C",
+"u c #444136",
+"i c #4A483F",
+"p c #534B2B",
+"a c #504B37",
+"s c #514C3A",
+"d c #654F04",
+"f c #604F0B",
+"g c #665200",
+"h c #675509",
+"j c #6B5405",
+"k c #6C5807",
+"l c #6C590B",
+"z c #745B04",
+"x c #715D0A",
+"c c #7B5B02",
+"v c #625B3B",
+"b c #7E6815",
+"n c #6C643E",
+"m c #4D4B42",
+"M c #494949",
+"N c #504D43",
+"B c #54534C",
+"V c #515151",
+"C c #5D5B54",
+"Z c #656048",
+"A c #736A44",
+"S c #726C54",
+"D c #77725B",
+"F c #696968",
+"G c gray50",
+"H c #826203",
+"J c #806609",
+"K c #836907",
+"L c #8D6A03",
+"P c #9A6F00",
+"I c #9B7005",
+"U c #9E730E",
+"Y c #9C7511",
+"T c #85732C",
+"R c #88783B",
+"E c #AE7C00",
+"W c #A87B13",
+"Q c #847B53",
+"! c #827D64",
+"~ c #9C862E",
+"^ c #A98A1F",
+"/ c #B28D0A",
+"( c #B88D00",
+") c #B2821A",
+"_ c #B18E1B",
+"` c #B3941C",
+"' c #A88E2C",
+"] c #A28C36",
+"[ c #AE9224",
+"{ c #89815E",
+"} c #87826D",
+"| c #858174",
+" . c #888370",
+".. c #8E8A7D",
+"X. c #928C71",
+"o. c #A28E44",
+"O. c #AA9F74",
+"+. c #B9A456",
+"@. c #BDA85B",
+"#. c #B2A068",
+"$. c #C28700",
+"%. c #CC8E00",
+"&. c #C29A00",
+"*. c #C4962F",
+"=. c #CCA100",
+"-. c #D6A800",
+";. c #D1AC1B",
+":. c #DDB31A",
+">. c #D2A922",
+",. c #D4AE2B",
+"<. c #DBA12E",
+"1. c #DBA433",
+"2. c #DDB428",
+"3. c #D2B23B",
+"4. c #E6A200",
+"5. c #E8A509",
+"6. c #EAAF00",
+"7. c #EFAC1E",
+"8. c #F5A100",
+"9. c #FFAD02",
+"0. c #FCAF0D",
+"q. c #FCB005",
+"w. c #FFB60C",
+"e. c #FFBD00",
+"r. c #FFBD16",
+"t. c #E3B432",
+"y. c #E8BF3C",
+"u. c #F6BE2F",
+"i. c #C6A949",
+"p. c #D9A948",
+"a. c #D8AB52",
+"s. c #DBBA45",
+"d. c #C5B162",
+"f. c #ECB74D",
+"g. c #EFB841",
+"h. c #EFBE4A",
+"j. c #EABA55",
+"k. c #FDC006",
+"l. c #FFC10B",
+"z. c #FFC800",
+"x. c #FFC90D",
+"c. c #FAC113",
+"v. c #FBC11C",
+"b. c #FDC910",
+"n. c #EDC233",
+"m. c #F5C32D",
+"M. c #FFC728",
+"N. c #F4C537",
+"B. c #F6C63A",
+"V. c #F5CB36",
+"C. c #FFD73D",
+"Z. c #E9C659",
+"A. c #EAC85A",
+"S. c #FFDA4B",
+"D. c #FFDD5D",
+"F. c #E9CD6B",
+"G. c #FFD560",
+"H. c #FFE06C",
+"J. c gray56",
+"K. c #959595",
+"L. c gray62",
+"P. c #A6A18A",
+"I. c #A8A69E",
+"U. c #AEA895",
+"Y. c #B3AC8F",
+"T. c #B8AF8B",
+"R. c #B4AD96",
+"E. c #B8B199",
+"W. c #A4A4A4",
+"Q. c #AAAAAA",
+"!. c #B0ADA3",
+"~. c #BBB6A3",
+"^. c #B1B1B1",
+"/. c #B9B9B6",
+"(. c #BBBBBA",
+"). c #C5BC9D",
+"_. c #C2BCA2",
+"`. c #C1BEB5",
+"'. c #D2C38E",
+"]. c #DCC78C",
+"[. c #C7C0A7",
+"{. c #C7C2AE",
+"}. c #C7C3B2",
+"|. c #C5C2B8",
+" X c #CAC6B6",
+".X c #CBC9BE",
+"XX c #D9D3BB",
+"oX c #E6D08A",
+"OX c #E7DEBD",
+"+X c #ECDEB3",
+"@X c #FFF0B9",
+"#X c #C5C5C5",
+"$X c #CECCC7",
+"%X c #D0CEC5",
+"&X c #D0CFC8",
+"*X c #D2D1CB",
+"=X c #DBD6C5",
+"-X c #DBD7C9",
+";X c #D3D3D1",
+":X c #DBDBDB",
+">X c #E5E1D6",
+",X c #E5E3DA",
+"<X c #E8E5D9",
+"1X c #EDEADC",
+"2X c #FEF6DE",
+"3X c #E6E6E6",
+"4X c #E9E7E2",
+"5X c #E9E8E4",
+"6X c #EDECEA",
+"7X c #F2F1EB",
+"8X c #F1F1F1",
+"9X c #F8F7F4",
+"0X c #F9F8F8",
+"qX c None",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqX5 5 5 1 , qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 V /.&XQ.F 1 , qXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 _.D.S.H.@X&X6 . qXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 S.=.w g &.C...+ qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 -.' + o t z.d., qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX5 C V.@.+ 3 :.3., qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX5 '.b.F.6 , 1 s.,., qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX1 b ( n.OXE.E.F.^ + qXqXqXqXqXqXqXqX5 5 1 , ",
+"qXqXqXqXqXqXqX l x K A.oXoXZ.i., qXqXqXqXqXqX5 V &X0X6X, ",
+"qXqXqXqXqXqXqX 8 ( c.v.k.N.1 qXqXqXqX5 V $X0X0X9XXX, ",
+"qXqXqXqXqXqXqXqX O t 6.e.e.k.S O 5 5 V $X8X8X8X1XD : O ",
+"qXqXqXqXqXqXqXqXqXqX 3 J e.G.7X#.+ . 5 C |.3X3X5X4X_.4 % ",
+"qXqXqXqXqXqXqXqXqXqX q ].0X0X+X, B }.:X:X:X:X=XS & o ",
+"qXqXqXqXqXqXqXqXqXqXqX + M 8X8X7XU.Q.#X*X*X*XR.< % qX",
+"qXqXqXqXqXqXqXqXqXqXqXqX, 1 X6XW.G Q.L.^.{.Z @ . qXqX",
+"qXqXqXqXqXqXqXqXqXqX5 5 m P.W.:X6 . 3X/.X., @ qXqXqXqX",
+"qXqXqXqXqXqXqX5 5 5 n +.R.W.J.K.W.^.:X:X1Xm + qXqXqXqXqX",
+"qXqXqXqXqX5 5 i o.y.v.q./ P.I.} | R.&X*X;X8X ., qXqXqXqXqXqX",
+"qXqX5 5 5 R 3.M.5.E L 7.4._ 0 + O + i ).#X#X5X~., O qXqXqXqX",
+"qX5 u ] m.r.%.H r : , t.0.P 7 $ , { `.(.;X-X, + qXqXqX",
+"5 u 2.w.$.k t o , ~ h.P l , u T.^.#X<XN , qXqX",
+"5 >.9.U r . . , T B.*.x qX + , Q !.Q.<XC , qX",
+"p q.1.> . + 1 [ m.p.k . qXqXqXqX , u O.W.;X! + ",
+"4 8.j.` p 5 y ;.u.a.d % qXqXqXqXqXqX O , A P._., ",
+"1 x <.f.m.x.b.y.a.g ; qXqXqXqXqXqXqXqX + 0 v O ",
+" - h c W W W W z : qXqXqXqXqXqXqXqXqXqX . . ",
+" * e l l f X qXqXqXqXqXqXqXqXqXqXqXqXqX ",
+"qX qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX qX",
+"qXqXqX qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
diff --git a/languages/cpp/app_templates/qt4makeapp/editpaste.xpm b/languages/cpp/app_templates/qt4makeapp/editpaste.xpm
new file mode 100644
index 00000000..c29ad36b
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/editpaste.xpm
@@ -0,0 +1,295 @@
+/* XPM */
+static char *editpaste[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c black",
+". c #0D0900",
+"X c #191000",
+"o c #221700",
+"O c #2A1B00",
+"+ c #332200",
+"@ c #3E2900",
+"# c #3A2804",
+"$ c #4D3300",
+"% c #4B3E15",
+"& c #44391B",
+"* c #543800",
+"= c #5A3B00",
+"- c #4D4015",
+"; c #524E25",
+": c #5A4F2C",
+"> c #524E3D",
+", c #58562F",
+"< c #53503E",
+"1 c #5E623B",
+"2 c #634100",
+"3 c #684500",
+"4 c #6E4900",
+"5 c #614F11",
+"6 c #685416",
+"7 c #734C00",
+"8 c #784F00",
+"9 c #755B00",
+"0 c #7C5200",
+"q c #7C5A00",
+"w c #7B570F",
+"e c #69562F",
+"r c #786600",
+"t c #7F6A00",
+"y c #766300",
+"u c #60613F",
+"i c #7C6422",
+"p c #545143",
+"a c #54524B",
+"s c gray32",
+"d c #5D5D57",
+"f c #616641",
+"g c #67695D",
+"h c #6B734D",
+"j c #6C7553",
+"k c #616261",
+"l c #686A64",
+"z c #6B7162",
+"x c #727272",
+"c c #003DFF",
+"v c #0043FF",
+"b c #004BFF",
+"n c #0053FF",
+"m c #015AFF",
+"M c #0063FF",
+"N c #046DFF",
+"B c #0865FF",
+"V c #0378FF",
+"C c #1663FF",
+"Z c #1576FF",
+"A c #2678FF",
+"S c #6F7B84",
+"D c #77856D",
+"F c #7B8B75",
+"G c #0083FF",
+"H c #0197FF",
+"J c #0B92FF",
+"K c #1385FF",
+"L c #01A5FF",
+"P c #0DB5FF",
+"I c #3096FF",
+"U c #2DADFF",
+"Y c #2FBCFF",
+"T c #22C6FF",
+"R c #2AC5FF",
+"E c #30D0FF",
+"W c #38D5FF",
+"Q c #4493F1",
+"! c #5F83FF",
+"~ c #5F8AFF",
+"^ c #5290E4",
+"/ c #5F92FF",
+"( c #4CAAFE",
+") c #40B8FF",
+"_ c #779DCB",
+"` c #6693E2",
+"' c #6290FF",
+"] c #649DFF",
+"[ c #71A6E5",
+"{ c #79A4FF",
+"} c #7FB3FF",
+"| c #68B8F3",
+" . c #42DCFF",
+".. c #47E0FF",
+"X. c #58E9FF",
+"o. c #64C0EB",
+"O. c #6ADFEF",
+"+. c #825600",
+"@. c #845A00",
+"#. c #8B5C00",
+"$. c #905F00",
+"%. c #8C6103",
+"&. c #876807",
+"*. c #8A6111",
+"=. c #886E1B",
+"-. c #887600",
+";. c #8C7A00",
+":. c #936200",
+">. c #986800",
+",. c #926C22",
+"<. c #987A3F",
+"1. c #A07200",
+"2. c #A27511",
+"3. c #A97D15",
+"4. c #A77B14",
+"5. c #998712",
+"6. c #A68000",
+"7. c #A78F00",
+"8. c #AD8016",
+"9. c #AC9600",
+"0. c #BB8F00",
+"q. c #A99B2A",
+"w. c #B9A000",
+"e. c #B3A63C",
+"r. c #958D43",
+"t. c #988F44",
+"y. c #9A9346",
+"u. c #9F9948",
+"i. c #8B897C",
+"p. c #958F6F",
+"a. c #98937B",
+"s. c #A68443",
+"d. c #B08C41",
+"f. c #AF9462",
+"g. c #B39864",
+"h. c #B2A850",
+"j. c #BDB355",
+"k. c #C3972F",
+"l. c #C5A400",
+"z. c #CCAC00",
+"x. c #D7BB00",
+"c. c #CCA030",
+"v. c #CBB43E",
+"b. c #E4AD0C",
+"n. c #ECB600",
+"m. c #EDB900",
+"M. c #F2BB00",
+"N. c #C1B84C",
+"B. c #C1B757",
+"V. c #C5BB58",
+"C. c #C9BE5A",
+"Z. c #C2A978",
+"A. c #DFC000",
+"S. c #FDCB00",
+"D. c #F6C300",
+"F. c #FFD100",
+"G. c #FEDB00",
+"H. c #FFDF0E",
+"J. c #F5D500",
+"K. c #FBCD39",
+"L. c #FFE832",
+"P. c #FFE432",
+"I. c #CEC25C",
+"U. c #D7C648",
+"Y. c #DDC74B",
+"T. c #D0C55E",
+"R. c #D3C85F",
+"E. c #D5C960",
+"W. c #DDD264",
+"Q. c #E0CA4C",
+"!. c #E7D14E",
+"~. c #EFDA51",
+"^. c #F4D050",
+"/. c #F9D452",
+"(. c #FEDD53",
+"). c #E2D765",
+"_. c #E9DD69",
+"`. c #E6DD68",
+"'. c #FDDB6E",
+"]. c #FFEE4F",
+"[. c #FEE354",
+"{. c #FEEA55",
+"}. c #F7E153",
+"|. c #FFF056",
+" X c #ECE16A",
+".X c #F1E56D",
+"XX c #F7EA6F",
+"oX c #F7EB70",
+"OX c #F9EC70",
+"+X c #FEF372",
+"@X c #979486",
+"#X c gray60",
+"$X c #969596",
+"%X c #8AA193",
+"&X c #82A89B",
+"*X c #8CAEA3",
+"=X c #86A7A9",
+"-X c #8BA2B1",
+";X c #ACA580",
+":X c #A5A291",
+">X c #B3AF98",
+",X c #B8B7AF",
+"<X c #B3B2AB",
+"1X c #B1B1B1",
+"2X c #A6B8FF",
+"3X c #88DEE0",
+"4X c #8BF0FE",
+"5X c #A4CFC6",
+"6X c #BFD5FF",
+"7X c #BFDCFF",
+"8X c #C2AD82",
+"9X c #CBB489",
+"0X c #D2BF9B",
+"qX c #D1C19F",
+"wX c #C8C4AA",
+"eX c #CFCBB7",
+"rX c #D8C7A6",
+"tX c #D2C2A3",
+"yX c #D5CCB3",
+"uX c #DAD1A1",
+"iX c #DDD5BB",
+"pX c #D7D1B3",
+"aX c #ECE5BB",
+"sX c #F5EBB5",
+"dX c #F5ECBC",
+"fX c #F8EEB8",
+"gX c #FCF2BC",
+"hX c #CBCBCB",
+"jX c #D8D6C7",
+"kX c #DDDDDD",
+"lX c #E4DAC2",
+"zX c #ECE6C7",
+"xX c #EBE6D9",
+"cX c #E9E3D0",
+"vX c #F5EDC4",
+"bX c #F6EFC9",
+"nX c #F0EBD5",
+"mX c #F3EFDB",
+"MX c #FCF3C5",
+"NX c #FCF4CA",
+"BX c #F7F0CA",
+"VX c #F6F0D2",
+"CX c #F9F3D3",
+"ZX c #F9F4DC",
+"AX c #FFF8D4",
+"SX c #FFF9DB",
+"DX c #E7E7E4",
+"FX c #EBEBE9",
+"GX c #F1EDE1",
+"HX c #F9F6E5",
+"JX c #FDF9E4",
+"KX c #FEFBEB",
+"LX c #F6F2E6",
+"PX c #FEFCF3",
+"IX c #FEFDFD",
+"UX c #F4F4F3",
+"YX c None",
+/* pixels */
+"YXYXYXYXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYX:.:.+ IXIXIXIXIXIXIXIXFX# +.7 YXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX>.k.c.6 FXkXkXkXDXkXkXkXx i b.>.+ YXYXYXYXYXYXYXYXYXYX",
+"YXYXYX:.'.K.=.hX1X1X1X1X1X1X1Xd &.0.%.* 7 #.#.:.$.#.2 YXYXYX",
+"YXYXYX:./.M.%.$Xk k d s s s e w >.2.d.s.Z.9XrXlXxX0X7 YXYXYX",
+"YXYXYX:.^.M.1.: % % - % 5 6 &.GXIXIXPXPXPXPXPXLXIXIXg.3 YXYX",
+"YXYX#X:.^.m.v.y.r.r.r.r.h.h.2.IXPXPXKXKXPXKXHXxXUXIXIXf.4 YX",
+"YXYX#X:.^.m.Y.I.B.j.j.j.V.I.4.PXKXJXKXJXKXKXmXjXFXIXIXUX+. YX",
+"YXYX#X:.^.m.Y.E.I.j.j.j.I.R.8.PXKXSXJXJXJXSXnXeXDXIXIXUX<. YX",
+"YXYXYX:./.M.!.W.R.I.T.R.E.W.8.UXJXJXSXSXSXSXnXeX:X@Xi.<X7 ",
+"YXYXYX:./.D.~._.`.W.W.W.W. X8.PXJXSXAXSXSXSXVXjX>X@X@X,X4 ",
+"YXYXYX:.(.S.}..X X X X X X X8.PXSXAXAXAXAXAXNXzXpXwXwXjX7 ",
+"YXYXYX:.(.S.[.OXOXOXoXoXt.; O s a p p p p a.AXMXvXaXzXGX+. ",
+"YXYXYX:.(.S.[.+X+X+XOX+X; 7X2X] / / ~ ! 2Xp MXNXNXNXSXKX+. YX",
+"YXYXYX:.(.F.|.+X+X+X+X+Xy., _ A m b v c ! p MXMXgXMXAXKX+. YX",
+"YXYXYX:.(.F.|.+X+X+X+X+X+Xj.& ^ B n b v ' < gXMXgXgXNXKX+. YX",
+"YXYXYX:.(.F.U.W.+X+X+X+X).y.g Q N m n b ~ < gXgXgXgXAXJXq YX",
+"YXYXYX:.[.l.j j y.I.j.r.1 =X( K N M m b ~ < gXgXgXgXNXKX+. YX",
+"YXYXYX:.[.t 5X4X&XD F =X| U J G V Z A C / < fXgXgXgXMXHX+. YX",
+"YXYXYX:.[.l.h 3XX...W T P L H K I [ S ` { < fXfXfXfXMXKX+. YX",
+"YXYXYX:.[.G.e.1 *XO...E R Y Y | -Xd Z.k 6X> fXfXfXfXBXJX+. YX",
+"YXYXYX:.[.G.{.`.u.1 F &X*X%Xz l a.uXfXp.> p.sXsXsXfXBXJX+. YX",
+"YXYXYX:.{.G.|.+X+X XN.q.5.7.q cXvXsXsXsXsXsXsXsXsXsXBXKX+. YX",
+"YXYXYX:.|.G.].|.L.H.G.G.G.A.1.JXvXsXsXsXsXsXsXsXfXdXCXPX+. YX",
+"YXYXYX:.{.G.G.G.G.G.x.w.;.t :.HXdXsXsXsXsXsXdXvXBXZXLXtX= YX",
+"YXYXYX:.{.G.J.x.9.;.r 9 q 0 #.KXvXsXaXsXvXBXCXHXiXg.*.= O YX",
+"YXYXYX:.L.9.-.y 9 q 0 = + #.HXbXdXbXVXZXcX8X,.3 $ . YX",
+"YXYXYX%.z.9 q 7 * o $.PXZXmXmX0Xs.0 $ X YX",
+"YXYXYX8 0 = o :.IXpXg.*.= O YXYXYXYX",
+"YXYXYX YXYX@.#.2 @ . YXYXYXYXYXYX",
+"YXYXYX YXYXYXYXYX YXYXYXYXYXYXYXYXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX YXYXYXYXYXYXYXYXYXYXYXYX"
+};
diff --git a/languages/cpp/app_templates/qt4makeapp/filenew.xpm b/languages/cpp/app_templates/qt4makeapp/filenew.xpm
new file mode 100644
index 00000000..85efceb2
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/filenew.xpm
@@ -0,0 +1,216 @@
+/* XPM */
+static char *filenew[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 178 2",
+" c black",
+". c #191000",
+"X c #221700",
+"o c #452E00",
+"O c #4A3100",
+"+ c #4E3400",
+"@ c #553800",
+"# c #604000",
+"$ c #6A4600",
+"% c #6D4800",
+"& c #704A00",
+"* c #724C00",
+"= c #744C00",
+"- c #764E00",
+"; c #785000",
+": c #805500",
+"> c #815500",
+", c #835700",
+"< c #865900",
+"1 c #875A00",
+"2 c #8A5B00",
+"3 c #8A5C00",
+"4 c #8B5C00",
+"5 c #8C5D00",
+"6 c #8D5D00",
+"7 c #8F5E00",
+"8 c #805911",
+"9 c #905F00",
+"0 c #906000",
+"q c #926000",
+"w c #946200",
+"e c #956300",
+"r c #966400",
+"t c #976400",
+"y c #956913",
+"u c #926C22",
+"i c #9B7732",
+"p c #B18D48",
+"a c #B28E49",
+"s c #B4904A",
+"d c #BAA373",
+"f c #A1A195",
+"g c #ABAB9F",
+"h c #ADADAB",
+"j c #AFAFAB",
+"k c #B3B3A6",
+"l c #BCBCB8",
+"z c #BFBFBC",
+"x c #CBB489",
+"c c #CBB58A",
+"v c #CDB78B",
+"b c #CAB891",
+"n c #C9BB9E",
+"m c #CEBEA2",
+"M c #C6C6BC",
+"N c #D9C8A8",
+"B c #E8E1BA",
+"V c #E8E1BB",
+"C c #FEFFA1",
+"Z c #FFFFA0",
+"A c #FEFFA3",
+"S c #FEFFA4",
+"D c #FEFFA6",
+"F c #FEFFA8",
+"G c #FEFFA9",
+"H c #FFFFA8",
+"J c #FEFFAA",
+"K c #FEFFAB",
+"L c #FFFFAB",
+"P c #FEFFAC",
+"I c #FFFFAC",
+"U c #FEFFAE",
+"Y c #FEFFAF",
+"T c #FEFFB0",
+"R c #FEFFB1",
+"E c #FFFFB0",
+"W c #FEFFB4",
+"Q c #FEFFB5",
+"! c #FFFFB4",
+"~ c #FEFFB8",
+"^ c #FEFFB9",
+"/ c #FFFFB8",
+"( c #FFFFB9",
+") c #FEFFBB",
+"_ c #FFFFBA",
+"` c #FEFFBD",
+"' c #FFFFBD",
+"] c #FEFFBE",
+"[ c #FFFFBE",
+"{ c #C8C8C1",
+"} c #CACAC4",
+"| c #CBCBC6",
+" . c #DBD2C1",
+".. c #DEDFCF",
+"X. c #D4D4D1",
+"o. c #E1D5C1",
+"O. c #E3D9C3",
+"+. c #E5DCCC",
+"@. c #E8E8D3",
+"#. c #ECECD7",
+"$. c #F0EBDA",
+"%. c #FEFFC2",
+"&. c #FEFFC3",
+"*. c #FFFFC2",
+"=. c #FEFFC7",
+"-. c #FFFFC7",
+";. c #FEFFCB",
+":. c #FEFFCC",
+">. c #FFFFCC",
+",. c #FEFFCE",
+"<. c #FEFFD0",
+"1. c #FEFFD1",
+"2. c #FFFFD0",
+"3. c #FFFFD1",
+"4. c #FFFFD3",
+"5. c #FEFFD5",
+"6. c #FFFFD5",
+"7. c #FEFFD6",
+"8. c #FEFFD7",
+"9. c #FFFFD6",
+"0. c #FFFFD8",
+"q. c #FEFFDA",
+"w. c #FFFFDA",
+"e. c #FFFFDB",
+"r. c #FFFFDC",
+"t. c #FEFFDE",
+"y. c #FEFFDF",
+"u. c #FFFFDE",
+"i. c #FFFFDF",
+"p. c #E9E9E7",
+"a. c #F3F3E9",
+"s. c #F3F3EB",
+"d. c #F5F5E8",
+"f. c #F8F8E3",
+"g. c #FEFFE0",
+"h. c LightYellow",
+"j. c #FFFFE1",
+"k. c #FEFFE3",
+"l. c #FFFFE3",
+"z. c #FDFEE7",
+"x. c #FEFFE4",
+"c. c #FEFFE5",
+"v. c #FFFFE4",
+"b. c #FBFBE9",
+"n. c #FEFFE8",
+"m. c #FFFFE8",
+"M. c #FFFFE9",
+"N. c #FFFFEA",
+"B. c #FEFFEC",
+"V. c #FEFFED",
+"C. c #FFFFEC",
+"Z. c #FFFFED",
+"A. c #FEFFEF",
+"S. c #F4F4F0",
+"D. c #F4F4F3",
+"F. c #F5F5F4",
+"G. c #F8F8F6",
+"H. c ivory",
+"J. c #FFFFF1",
+"K. c #FEFFF3",
+"L. c #FFFFF3",
+"P. c #FEFFF4",
+"I. c #FFFFF4",
+"U. c #FEFFF7",
+"Y. c #FFFFF6",
+"T. c #FFFFF7",
+"R. c #FBFBFB",
+"E. c #FFFFF8",
+"W. c #FFFFF9",
+"Q. c #FFFFFA",
+"!. c #FFFFFB",
+"~. c gray99",
+"^. c #FEFFFD",
+"/. c #FFFFFC",
+"(. c #FFFFFD",
+"). c #FFFFFE",
+"_. c gray100",
+"`. c None",
+/* pixels */
+"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.`.w 2 1 w 4 4 4 6 w 9 6 - `.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.r s p p c c c c N O.+.o.y # `.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.r ).).).).).).).).F.p.). .& o `.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w ).E.).E.).E.E.E.S.X.).R.n $ + `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w E.Y.Y.E.Y.E.E.E.a.| ).).D.m % `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w E.Y.Y.J.Y.J.Y.Y.a.| ).).).D.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w Y.J.J.J.J.J.J.J.a.M l h h { ; `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w Y.B.B.B.N.N.B.B.b...k f h } ; `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w J.N.N.N.N.N.N.N.l.f.#.@.#.a.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w J.l.l.l.l.l.l.l.l.l.l.l.l.J.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w J.r.l.l.r.l.r.l.r.l.r.l.r.J.1 `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w B.r.r.q.q.q.q.q.q.r.q.q.r.B.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w N.5.5.5.5.q.5.5.5.5.5.5.5.B., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w N.<.<.<.<.<.<.<.5.<.<.<.<.N., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w l.,.;.;.;.,.;.,.;.,.;.;.;.l., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w l.-.-.-.-.-.-.;.-.-.-.-.;.l.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w l.-.%.%.%.%.%.%.%.%.%.%.%.l., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w r.' ' ' ' ' ) ' ' ' ' ' ' r., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w r.) ) W ) ) ) ) ) ) W ) ) q., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w q.W W W W W W W W W W W W q., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w 5.Y Y W Y Y Y Y Y Y Y Y Y 5., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w 5.J J J Y J Y Y J Y J J Y q., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w 5.J J D J J D J D J W ) ,.$.- `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w <.Z D D Z D J Y ' ,.B b i - O `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w <.Z Z Z Y ) <.B d u & @ X `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w ,.J ) ,.B d y & o . `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w Y.V d u & o . `.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.1 4 & o . `.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`. `.`.`.`.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`. `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`."
+};
diff --git a/languages/cpp/app_templates/qt4makeapp/fileopen.xpm b/languages/cpp/app_templates/qt4makeapp/fileopen.xpm
new file mode 100644
index 00000000..a6c33b62
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/fileopen.xpm
@@ -0,0 +1,295 @@
+/* XPM */
+static char *fileopen[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c black",
+". c #0B0900",
+"X c #130E00",
+"o c #161100",
+"O c #231A00",
+"+ c #352600",
+"@ c #3B311C",
+"# c #433100",
+"$ c #4F3B00",
+"% c #4A3E16",
+"& c #4A3D22",
+"* c #4D421A",
+"= c #54420D",
+"- c #4E4529",
+"; c #484338",
+": c #484233",
+"> c #5B4B24",
+", c #624500",
+"< c #674D00",
+"1 c #6D4D00",
+"2 c #6E4F17",
+"3 c #6D5200",
+"4 c #775500",
+"5 c #745B0F",
+"6 c #795200",
+"7 c #7A5A00",
+"8 c #715C18",
+"9 c #764B0A",
+"0 c #6C5423",
+"q c #6D592E",
+"w c #785E27",
+"e c #735626",
+"r c #665736",
+"t c #7A631D",
+"y c #7A672E",
+"u c #776535",
+"i c #5C5956",
+"p c #78704F",
+"a c #75726E",
+"s c #8D4F00",
+"d c #815700",
+"f c #835A00",
+"g c #8A5C00",
+"h c #866400",
+"j c #966100",
+"k c #956F00",
+"l c #9C6100",
+"z c #9D7500",
+"x c #856B2A",
+"c c #8C752A",
+"v c #8C723B",
+"b c #977939",
+"n c #A45D00",
+"m c #A26100",
+"M c #AA680D",
+"N c #AB6700",
+"B c #A07700",
+"V c #A57B00",
+"C c #AB7A00",
+"Z c #AA7300",
+"A c #AF721A",
+"S c #B87E00",
+"D c #B57B00",
+"F c #B0731A",
+"G c #B47C26",
+"H c #B77E28",
+"J c #897F59",
+"K c #977C40",
+"L c #927F58",
+"P c #807A6C",
+"I c #9C821D",
+"U c #9F8A35",
+"Y c #AC8000",
+"T c #B28500",
+"R c #B68800",
+"E c #BB8B00",
+"W c #A78337",
+"Q c #A28B31",
+"! c #AF9535",
+"~ c #B58E3A",
+"^ c #B88633",
+"/ c #B49936",
+"( c #BCA039",
+") c #998445",
+"_ c #978657",
+"` c #8B8264",
+"' c #8E8572",
+"] c #978864",
+"[ c #978C75",
+"{ c #9F9072",
+"} c #A38845",
+"| c #A48952",
+" . c #AA965C",
+".. c #A89156",
+"X. c #B5934D",
+"o. c #B39D45",
+"O. c #B49755",
+"+. c #AB984A",
+"@. c #AD9A65",
+"#. c #A79778",
+"$. c #A59874",
+"%. c #A29B7A",
+"&. c #A79775",
+"*. c #BDA959",
+"=. c #B3A46C",
+"-. c #B1A07F",
+";. c #B5A97A",
+":. c #BEB37B",
+">. c #C49200",
+",. c #C89500",
+"<. c #CC9800",
+"1. c #C69812",
+"2. c #D2A31C",
+"3. c #C2A63E",
+"4. c #D7AE37",
+"5. c #C29840",
+"6. c #C29B4E",
+"7. c #C2A641",
+"8. c #C6AA43",
+"9. c #C8AC45",
+"0. c #CBAF49",
+"q. c #CAA746",
+"w. c #C4A158",
+"e. c #CAA65D",
+"r. c #CEA857",
+"t. c #CFA95A",
+"y. c #C5AC50",
+"u. c #CDB14B",
+"i. c #CBB358",
+"p. c #CAB152",
+"a. c #D2AB59",
+"s. c #D1B54D",
+"d. c #D4B951",
+"f. c #D6BC5B",
+"g. c #DDB45E",
+"h. c #D9BD56",
+"j. c #D2B753",
+"k. c #DAAB48",
+"l. c #CEAE69",
+"z. c #CCAD67",
+"x. c #CCB662",
+"c. c #CAB26B",
+"v. c #C8B66B",
+"b. c #CEB775",
+"n. c #CEBE7F",
+"m. c #D3AD66",
+"M. c #D5BE64",
+"N. c #D4BF6D",
+"B. c #E4B34B",
+"V. c #E0B75F",
+"C. c #E1B85F",
+"Z. c #E4BA61",
+"A. c #E9BE63",
+"S. c #DDC159",
+"D. c #DAC269",
+"F. c #D4C176",
+"G. c #D8C67F",
+"H. c #E1C55D",
+"J. c #EFC05D",
+"K. c #F1C15E",
+"L. c #E0C264",
+"P. c #E5C961",
+"I. c #EDC164",
+"U. c #E9CD65",
+"Y. c #EFD36B",
+"T. c #F2C564",
+"R. c #F6C868",
+"E. c #F8C760",
+"W. c #FBCC6A",
+"Q. c #FDCB63",
+"!. c #F1D56D",
+"~. c #FFD06C",
+"^. c #F5D972",
+"/. c #FED175",
+"(. c #FADE77",
+"). c #E4C87A",
+"_. c #FEE27C",
+"`. c #8F9192",
+"'. c #9A9A96",
+"]. c #A79F83",
+"[. c #ADA583",
+"{. c #A7A399",
+"}. c #BBAC86",
+"|. c #BDB088",
+" X c #BBB298",
+".X c #A7A8A6",
+"XX c #ADAEB0",
+"oX c #B5B6B4",
+"OX c #BABCBC",
+"+X c #C6B38E",
+"@X c #D3BE80",
+"#X c #D0BC95",
+"$X c #C6BFA6",
+"%X c #C5C29D",
+"&X c #D2C283",
+"*X c #DAC789",
+"=X c #DBCA8B",
+"-X c #D5C489",
+";X c #DBCD94",
+":X c #D6C699",
+">X c #CFC8B1",
+",X c #C8C6B7",
+"<X c #D1C9A6",
+"1X c #DBD3BA",
+"2X c #E1C981",
+"3X c #E0CD91",
+"4X c #ECD686",
+"5X c #EBD69E",
+"6X c #FED682",
+"7X c #FED88B",
+"8X c #FEDC95",
+"9X c #E3CEA3",
+"0X c #EED9A9",
+"qX c #E7DCB9",
+"wX c #F4DDAF",
+"eX c #FFE68A",
+"rX c #FFE893",
+"tX c #FFEA9F",
+"yX c #FFE2A5",
+"uX c #FFE3AC",
+"iX c #FFECA7",
+"pX c #FFEDAE",
+"aX c #F1E0B6",
+"sX c #FDE5B4",
+"dX c #FFEEB4",
+"fX c #F8E5BB",
+"gX c #FFF0BC",
+"hX c #C5C7C8",
+"jX c #C7C8CA",
+"kX c #CCCECF",
+"lX c #CCCAC0",
+"zX c #CDCED0",
+"xX c #D1D1CF",
+"cX c #D1D3D4",
+"vX c #D6D8DA",
+"bX c #DADCDE",
+"nX c #DCDEE0",
+"mX c #DEE0E2",
+"MX c #E7DEC2",
+"NX c #EBE1C5",
+"BX c #F4E9C3",
+"VX c #F7EACE",
+"CX c #FEEAC3",
+"ZX c #FAEBCA",
+"AX c #FFF1C1",
+"SX c #FFF3CC",
+"DX c #FFF6DA",
+"FX c #E1E3E5",
+"GX c #E4E6E8",
+"HX c #E7E9EA",
+"JX c #E8E6E0",
+"KX c #E9EAEC",
+"LX c #ECEEF0",
+"PX c #EEF0F2",
+"IX c #F8F4E8",
+"UX c #F1F3F5",
+"YX c None",
+/* pixels */
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX V E <.,.T YXYXYXYXYXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX< E 2.aXCXVXE 3 E <.E YXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX R ,.5XCX8XQ.wX<.1.$.OX<. YXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX R >.L.ZXyXT.K.E.wX ..XKXKXR YXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYX V E 4.ZXsXW.K.I.Z.O.{.KXUXUXMXk YXYX",
+"YXYXYXYXYXYX R E 7 YX< E 2.aXsX6XC.T.Z.w.[ xXUXUXUXUX2X3 YXYX",
+"YXYXYXYX R >.).5X,.T ,.5XCX8XK.T.A.a.] OXUXUXUXUXUXUX2.O YXYX",
+"YXYX Y E Z.ZXsX7XsX0XCXyXR.K.I.V._ .XUXUXUXUXUXLXKXJXV D N S 7 ",
+" z E 4.fXsX/.K.~./.6X~.I.I.C...'.KXUXPXPXPXLXKXGXbXl.N m.SXm.D ",
+" E 0XgX7XE.W.W.~.~.R.I.Z.w.' bXUXUXUXPXPXLXmXbX$X) ~ aXSXpXBXn ",
+" <.CXT.Q.~.W.W.R.I.A.t._ hXUXUXUXUXPXLXGXnX,X .t XAXSXeX4Xl.Z ",
+" <.sXB.W.W.W.T.A.g._ oXUXUXUXUXUXLXLXmXcX=.5 $.BXgXeX!.D.3Xm + ",
+" <.sXB.R.R.A.V.| {.KXUXUXUXUXLXKXGXvX|.c u qXdXgX^.U.f.3XH f ",
+" <.sXB.T.Z.m.[ nXUXUXUXUXPXKXHXbX,X) e <XdXiX_.S.u.P.F.t.h ",
+" <.sXk.Z.r.K jXUXUXUXPXLXKXmXcX@.5 %.DXiX_.Y.S.d.h.D.*Xl X ",
+" <.wXq.r.X.r UXUXPXPXKXmXvX|.y _ NXdXrX!.S.d.h.d.f.=XF 4 YX",
+" ,.0X5.X.) a PXPXKXGXnX>X) y >XAXAX_.S.h.h.u.s.d.F.6.g YX",
+" >.9X~ } u '.LXKXmXxX .5 [.IXAX_.!.S.h.h.d.8.s.D.n.j YXYX",
+" >.:XW v & kXmXvX;.t ] BXAXrX!.U.u.S.9.u.3.7.i.;XM 1 YXYXYX",
+" E #Xb u : nXcX_ u 1XSXgX^.U.H.S.d.8.s.d.u.b.-XG g YXYXYXYX",
+" R +Xc r a zX[.= -XdX_.U.d.P.h.d.u.3.8.N.=Xw.l 1 YXYXYXYX",
+" T }.x > `.oX> %.*.S.S.h.S.7.d.h.0.p.n.c.M d . YXYXYXYXYX",
+" C ].w @ XXu p *.( h.S.s.u.u.u.p.N.*X^ g + YXYXYXYXYXYX",
+" Z &.e ; ` * :.o.S.S.S.u.( 9.x.&XX.j , YXYXYXYXYXYX",
+" B { 0 i % [.o.u.S.d.h.9.M.&Xz.M 6 YXYXYXYXYXYXYXYX",
+" z { 0 - J *./ S.9.d.i.G.&XF g O YXYXYXYXYXYXYXYXYXYX",
+" z $.2 w =.! s.d.p.N.;X^ l , YXYXYXYXYXYXYXYXYXYXYX",
+" B &.9 ;.Q / j.x.@Xl.m 6 YXYXYXYXYXYXYXYXYXYXYXYXYX",
+" h W @.+.I y.&Xb.F 7 O YXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+" $ s %XU F.=X^ j # YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+" g O.<Xe.l 1 YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+" o f n d . YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX"
+};
diff --git a/languages/cpp/app_templates/qt4makeapp/filesave.xpm b/languages/cpp/app_templates/qt4makeapp/filesave.xpm
new file mode 100644
index 00000000..86ea7d63
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/filesave.xpm
@@ -0,0 +1,295 @@
+/* XPM */
+static char *filesave[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c #000000",
+". c #06060A",
+"X c #09090D",
+"o c #0B0B16",
+"O c #101022",
+"+ c #1E1E28",
+"@ c #181829",
+"# c #151F3A",
+"$ c #1A263F",
+"% c #1D2A3F",
+"& c #272730",
+"* c #2E2E3F",
+"= c #212140",
+"- c #212E41",
+"; c #2F2F41",
+": c #292A4A",
+"> c #23224B",
+", c #262353",
+"< c #292655",
+"1 c #2B2C54",
+"2 c #2C2C5B",
+"3 c #293746",
+"4 c #2D304F",
+"5 c #243243",
+"6 c #2E315D",
+"7 c #363647",
+"8 c #303E4A",
+"9 c #30325E",
+"0 c #3C3C53",
+"q c #2E2E60",
+"w c #2F3160",
+"e c #302E63",
+"r c #313164",
+"t c #363861",
+"y c #353868",
+"u c #384650",
+"i c #284F6B",
+"p c #2D547B",
+"a c #3B486A",
+"s c #36597D",
+"d c #3D5D7C",
+"f c #4C4C4C",
+"g c #40405A",
+"h c #414E56",
+"j c #4B585E",
+"k c #49545E",
+"l c #555555",
+"z c #4D4D6B",
+"x c #434675",
+"c c #4B5660",
+"v c #4F5962",
+"b c #41517E",
+"n c #4B507D",
+"m c #515C67",
+"M c #505D6E",
+"N c #5C5D7D",
+"B c #546066",
+"V c #54626D",
+"C c #5B646D",
+"Z c #55677A",
+"A c #556B78",
+"S c #5D6772",
+"D c #6B6B6B",
+"F c #646464",
+"G c #616C73",
+"H c #63707D",
+"J c #6B7679",
+"K c gray45",
+"L c #00418E",
+"P c #004494",
+"I c #004894",
+"U c #044F98",
+"Y c #03509B",
+"T c #0A5198",
+"R c #13579C",
+"E c #185DA1",
+"W c #285888",
+"Q c #2B6094",
+"! c #396D9A",
+"~ c #336A96",
+"^ c #3D719B",
+"/ c #226EB8",
+"( c #326EA8",
+") c #326BA3",
+"_ c #3673AE",
+"` c #3A76B4",
+"' c #0B6FD1",
+"] c #0F75D8",
+"[ c #1479DA",
+"{ c #1B7CDC",
+"} c #466481",
+"| c #42749C",
+" . c #4A799E",
+".. c #506A84",
+"X. c #5F678D",
+"o. c #576391",
+"O. c #5A6592",
+"+. c #5F6893",
+"@. c #5B738B",
+"#. c #507DA1",
+"$. c #626283",
+"%. c #636A94",
+"&. c #656F98",
+"*. c #657A8F",
+"=. c #6B7299",
+"-. c #717191",
+";. c #797998",
+":. c #687BA6",
+">. c #2281DC",
+",. c #3F81C0",
+"<. c #3988D7",
+"1. c #2785E1",
+"2. c #2E8AE3",
+"3. c #368FE5",
+"4. c #3690E6",
+"5. c #3D93E7",
+"6. c #3D94E9",
+"7. c #57839E",
+"8. c #4787BC",
+"9. c #5480A1",
+"0. c #5B84A3",
+"q. c #6E8496",
+"w. c #6E8B9A",
+"e. c #7D848E",
+"r. c #728597",
+"t. c #738598",
+"y. c #768899",
+"u. c #7B8B9B",
+"i. c #6489A5",
+"p. c #698EA7",
+"a. c #6D8FA9",
+"s. c #6E81AB",
+"d. c #7683A6",
+"f. c #768CB7",
+"g. c #7395AD",
+"h. c #7C96B0",
+"j. c #4086CA",
+"k. c #4986C3",
+"l. c #4284C3",
+"z. c #498ED2",
+"x. c #4D95DB",
+"c. c #548DC5",
+"v. c #5D92C8",
+"b. c #5593C9",
+"n. c #5097DE",
+"m. c #5198DE",
+"M. c #4296E7",
+"N. c #4895E2",
+"B. c #4B99E5",
+"V. c #4A9CEB",
+"C. c #4599EB",
+"Z. c #529DE6",
+"A. c #589EE2",
+"S. c #54A1EB",
+"D. c #5AA1E6",
+"F. c #5AA5EB",
+"G. c #5EA8EF",
+"H. c #53A3F1",
+"J. c #5EAAF2",
+"K. c #6699CB",
+"L. c #799BC8",
+"P. c #7EA6C9",
+"I. c #60A2E5",
+"U. c #65A7E8",
+"Y. c #6BABE9",
+"T. c #68ADF2",
+"R. c #67B0F5",
+"E. c #6DB3F6",
+"W. c #70ADEA",
+"Q. c #75B0E9",
+"!. c #7CB5EB",
+"~. c #73B9F8",
+"^. c #7BBDFB",
+"/. c #7CBAF6",
+"(. c gray55",
+"). c #828899",
+"_. c #84949E",
+"`. c #918E8A",
+"'. c #949494",
+"]. c #8F8FA9",
+"[. c #8997A5",
+"{. c #8A9AA9",
+"}. c #9A9BAF",
+"|. c #9399A9",
+" X c #9FAAB5",
+".X c #A29E9B",
+"XX c #A7A7A7",
+"oX c #ABABAB",
+"OX c #A3A3B4",
+"+X c #A8A8B7",
+"@X c #A3ABB3",
+"#X c #B4B5B5",
+"$X c #B0B0BC",
+"%X c #B7B9BC",
+"&X c #BBB7B3",
+"*X c #BBBBBB",
+"=X c #82B1DB",
+"-X c #81B7EC",
+";X c #88BBED",
+":X c #86BAED",
+">X c #AEBBC8",
+",X c #A6BDCD",
+"<X c #BBBCC3",
+"1X c #81C1F6",
+"2X c #83C2FA",
+"3X c #89C4FA",
+"4X c #8CC8FC",
+"5X c #95C2EF",
+"6X c #93CBFD",
+"7X c #9BCFFF",
+"8X c #97D0FC",
+"9X c #9CD3FE",
+"0X c #BEC0C1",
+"qX c #A3C7E7",
+"wX c #A2CAF1",
+"eX c #A1D4FF",
+"rX c #A3D8FF",
+"tX c #AADBFF",
+"yX c #B0D1F2",
+"uX c #BDD9F4",
+"iX c #AAE0FF",
+"pX c #B3E1FF",
+"aX c #B9E6FF",
+"sX c #BEE9FF",
+"dX c #C4C4C4",
+"fX c #C6C5CD",
+"gX c #C6C8CB",
+"hX c #CAC7C4",
+"jX c #CAC8C6",
+"kX c #CBCCCB",
+"lX c #D1D0CE",
+"zX c #D3D3D3",
+"xX c #D4D7D9",
+"cX c #D8D8D7",
+"vX c #DBDBDB",
+"bX c #C4ECFF",
+"nX c #C9E0F6",
+"mX c #C4F5FF",
+"MX c #CCF2FF",
+"NX c #D5E6F7",
+"BX c #DDEBF9",
+"VX c #DCFDFF",
+"CX c #D3F1F5",
+"ZX c #E1E0DE",
+"AX c #E4E3E3",
+"SX c #E4E7EA",
+"DX c #E7E8E9",
+"FX c #E8E6E4",
+"GX c #EDE9E5",
+"HX c #EBEBEB",
+"JX c #E7EEF5",
+"KX c #EAF2FA",
+"LX c #F1EEEA",
+"PX c #F3F3F3",
+"IX c #F4F8FC",
+"UX c #FDFDFC",
+"YX c None",
+/* pixels */
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXy y e 6 6 2 < < , , 1 YXYX",
+"YXYXYX2 < , , q w 2 e r r r w e w r e 2 6 1 6 s :.f.L.y YXYX",
+"YXYXYXx d.s.:.a # $ $ % - 5 3 8 u h k B S J ).,XF.b.7.r YXYX",
+"YXYXYX&.mX~.8.V #X#X%XdXfXzXxXvXZXZXDXFXFXDXLXDX>.U i 9 YXYX",
+"YXYXYXo.2X] L C UXDXcXzXkXkXkXjXjXdXdX%X%X&X%X*XN.' ~ 6 YXYX",
+"YXYXYXo.1X] P k hXoXXXXXoXoX#X#X*X%X&X%X%XdXkXxXx.[ ~ 6 YXYX",
+"YXYXYXO.3X[ I m FXkXjXjXkXkXkXkXkXkXzXzXzXcXZXSXx.{ ! 6 YXYX",
+"YXYXYXo.3X{ I S UXvXxXzXkXkXkXkXkXjXdX*X%X#X&X%XZ.1.^ 9 YXYX",
+"YXYXYXO.4X>.U j jX#X#X#X%XdXdXkXzXkXzXzXcXvXDXJXA.1.| 6 YXYX",
+"YXYXYXO.6X>.T V PXZXZXZXAXSXDXDXFXHXDXHXHXHXHXSXI.2.| 9 YXYX",
+"YXYXYXO.6X2.T G UXLXDXDXAXZXZXAXZXvXcXzXkXkXkXgXY.3. .6 YXYX",
+"YXYXYXO.9X4.R m zXdXdXkXzXvXAXDXHXLXPXPXIXUXUXUXQ.6. .9 YXYX",
+"YXYXYXO.9X5.R H UXIXUXUXUXUXUXUXUXUXUXUXIXKXJXBX-XC.#.9 YXYX",
+"YXYXYXO.eXM./ h.UXUXIXKXBXNXnXuXyXwX5X:X!.Y.Y.Y.D.H.9.6 YXYX",
+"YXYXYX+.rXB.<.x.Q.;X-XQ.Y.U.U.D.Z.Z.B.B.C.V.V.B.B.T.0.9 YXYX",
+"YXYXYX+.tXB.N.B.B.B.B.C.V.V.H.H.H.D.N.z.8._ ( <.D.R.0.9 YXYX",
+"YXYXYX+.tXS.Z.F.D.m.z.l.` ) Q W p s } @.r.[. X>XG.E.0.9 YXYX",
+"YXYXYX+.pXU.m.) p d ..*.u.|.+X<XzXZXGXLXGXZXzXjX/.~.p.r YXYX",
+"YXYXYX%.aXT.k.*.GXlX&X.X`..XhXlXzXvXvXvXvXxXkXgX2X^.a.w YXYX",
+"YXYXYX%.aXE.k.r.LXoXl f l F *XlXzXvXvXvXvXcXzXgX4X:Xa.w YXYX",
+"YXYXYX%.bX~.c.y.LX'.f D K D 0XkXzXvXvXvXvXvXzXfX6X4Xg.9 YXYX",
+"YXYXYX%.bX^.c.y.LX'.l D K D 0XlXzXcXvXvXvXxXkXkX9X6Xw.r YXYX",
+"YXYXYX%.bX2Xv.u.LX'.l K K K 0XlXzXcXvXvXvXvXkXfX9XP.M = YXYX",
+"YXYXYX%.bX2XK.u.LX'.l K K D 0XlXxXcXvXZXvXxXzXkXqXZ : . YXYX",
+"YXYXYX%.MX6XK.u.LX'.f F D D 0XkXzXcXvXvXvXvXcXkX_.: o YXYX",
+"YXYXYX%.MX6XK.u.LXXX(.XX&XdXkXzXvXZXDXAXzX<X+X}.N O YXYX",
+"YXYXYX%.VXiX=X{.FXzXkXkXjXdX<X$XOX].;.$.z 0 7 & X YXYXYX",
+"YXYXYX=.CXq.A ).fX+X|.).-.N z 0 * + o YXYXYXYX",
+"YXYXYXn $.t 6 , 4 0 * + . YXYXYXYXYXYX",
+"YXYXYX> @ o YXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX"
+};
diff --git a/languages/cpp/app_templates/qt4makeapp/main.cpp b/languages/cpp/app_templates/qt4makeapp/main.cpp
new file mode 100644
index 00000000..3416347e
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/main.cpp
@@ -0,0 +1,14 @@
+%{CPP_TEMPLATE}
+
+#include <QApplication>
+#include "%{APPNAMELC}.h"
+
+int main(int argc, char *argv[])
+{
+ Q_INIT_RESOURCE(application);
+ QApplication app(argc, argv);
+ %{APPNAME} * mw = new %{APPNAME}();
+ mw->show();
+ return app.exec();
+}
+
diff --git a/languages/cpp/app_templates/qt4makeapp/qt4makeapp b/languages/cpp/app_templates/qt4makeapp/qt4makeapp
new file mode 100644
index 00000000..9c856e8e
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/qt4makeapp
@@ -0,0 +1,11 @@
+# QMake application
+[General]
+Name=Qt4/QMake Application
+Name[fr]=Une Application Qt4 / QMake
+Icon=qt4makeapp.png
+Category=C++/QMake project
+Category[fr]=C++/QMake
+Comment=Generate a QMake/Qt4 based application (crossplatform compatible)- Needs Qt4
+Comment[fr]=G��e une application bas� sur Qt / QMake. Ce programme est multi platte-forme. Nécessite Qt4.
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/qt4makeapp/qt4makeapp.cpp b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.cpp
new file mode 100644
index 00000000..af16391f
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.cpp
@@ -0,0 +1,285 @@
+%{CPP_TEMPLATE}
+
+#include <QtGui>
+#include "%{APPNAMELC}.h"
+
+#include <QTextEdit>
+#include <QTextStream>
+#include <QCloseEvent>
+#include <QFileDialog>
+
+%{APPNAME}::%{APPNAME}()
+{
+ textEdit = new QTextEdit;
+ setCentralWidget(textEdit);
+
+ createActions();
+ createMenus();
+ createToolBars();
+ createStatusBar();
+
+ readSettings();
+
+ connect(textEdit->document(), SIGNAL(contentsChanged()),
+ this, SLOT(documentWasModified()));
+
+ setCurrentFile("");
+}
+
+void %{APPNAME}::closeEvent(QCloseEvent *event)
+{
+ if (maybeSave()) {
+ writeSettings();
+ event->accept();
+ } else {
+ event->ignore();
+ }
+}
+
+void %{APPNAME}::newFile()
+{
+ if (maybeSave()) {
+ textEdit->clear();
+ setCurrentFile("");
+ }
+}
+
+void %{APPNAME}::open()
+{
+ if (maybeSave()) {
+ QString fileName = QFileDialog::getOpenFileName(this);
+ if (!fileName.isEmpty())
+ loadFile(fileName);
+ }
+}
+
+bool %{APPNAME}::save()
+{
+ if (curFile.isEmpty()) {
+ return saveAs();
+ } else {
+ return saveFile(curFile);
+ }
+}
+
+bool %{APPNAME}::saveAs()
+{
+ QString fileName = QFileDialog::getSaveFileName(this);
+ if (fileName.isEmpty())
+ return false;
+
+ return saveFile(fileName);
+}
+
+void %{APPNAME}::about()
+{
+ QMessageBox::about(this, tr("About Application"),
+ tr("The <b>Application</b> example demonstrates how to "
+ "write modern GUI applications using Qt, with a menu bar, "
+ "toolbars, and a status bar."));
+}
+
+void %{APPNAME}::documentWasModified()
+{
+ setWindowModified(true);
+}
+
+void %{APPNAME}::createActions()
+{
+ newAct = new QAction(QIcon(":/filenew.xpm"), tr("&New"), this);
+ newAct->setShortcut(tr("Ctrl+N"));
+ newAct->setStatusTip(tr("Create a new file"));
+ connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
+
+ openAct = new QAction(QIcon(":/fileopen.xpm"), tr("&Open..."), this);
+ openAct->setShortcut(tr("Ctrl+O"));
+ openAct->setStatusTip(tr("Open an existing file"));
+ connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
+
+ saveAct = new QAction(QIcon(":/filesave.xpm"), tr("&Save"), this);
+ saveAct->setShortcut(tr("Ctrl+S"));
+ saveAct->setStatusTip(tr("Save the document to disk"));
+ connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));
+
+ saveAsAct = new QAction(tr("Save &As..."), this);
+ saveAsAct->setStatusTip(tr("Save the document under a new name"));
+ connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));
+
+ exitAct = new QAction(tr("E&xit"), this);
+ exitAct->setShortcut(tr("Ctrl+Q"));
+ exitAct->setStatusTip(tr("Exit the application"));
+ connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
+
+ cutAct = new QAction(QIcon(":/editcut.xpm"), tr("Cu&t"), this);
+ cutAct->setShortcut(tr("Ctrl+X"));
+ cutAct->setStatusTip(tr("Cut the current selection's contents to the "
+ "clipboard"));
+ connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut()));
+
+ copyAct = new QAction(QIcon(":/editcopy.xpm"), tr("&Copy"), this);
+ copyAct->setShortcut(tr("Ctrl+C"));
+ copyAct->setStatusTip(tr("Copy the current selection's contents to the "
+ "clipboard"));
+ connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy()));
+
+ pasteAct = new QAction(QIcon(":/editpaste.xpm"), tr("&Paste"), this);
+ pasteAct->setShortcut(tr("Ctrl+V"));
+ pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current "
+ "selection"));
+ connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste()));
+
+ aboutAct = new QAction(tr("&About"), this);
+ aboutAct->setStatusTip(tr("Show the application's About box"));
+ connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
+
+ aboutQtAct = new QAction(tr("About &Qt"), this);
+ aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));
+ connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+
+ cutAct->setEnabled(false);
+ copyAct->setEnabled(false);
+ connect(textEdit, SIGNAL(copyAvailable(bool)),
+ cutAct, SLOT(setEnabled(bool)));
+ connect(textEdit, SIGNAL(copyAvailable(bool)),
+ copyAct, SLOT(setEnabled(bool)));
+}
+
+void %{APPNAME}::createMenus()
+{
+ fileMenu = menuBar()->addMenu(tr("&File"));
+ fileMenu->addAction(newAct);
+ fileMenu->addAction(openAct);
+ fileMenu->addAction(saveAct);
+ fileMenu->addAction(saveAsAct);
+ fileMenu->addSeparator();
+ fileMenu->addAction(exitAct);
+
+ editMenu = menuBar()->addMenu(tr("&Edit"));
+ editMenu->addAction(cutAct);
+ editMenu->addAction(copyAct);
+ editMenu->addAction(pasteAct);
+
+ menuBar()->addSeparator();
+
+ helpMenu = menuBar()->addMenu(tr("&Help"));
+ helpMenu->addAction(aboutAct);
+ helpMenu->addAction(aboutQtAct);
+}
+
+void %{APPNAME}::createToolBars()
+{
+ fileToolBar = addToolBar(tr("File"));
+ fileToolBar->addAction(newAct);
+ fileToolBar->addAction(openAct);
+ fileToolBar->addAction(saveAct);
+
+ editToolBar = addToolBar(tr("Edit"));
+ editToolBar->addAction(cutAct);
+ editToolBar->addAction(copyAct);
+ editToolBar->addAction(pasteAct);
+}
+
+void %{APPNAME}::createStatusBar()
+{
+ statusBar()->showMessage(tr("Ready"));
+}
+
+void %{APPNAME}::readSettings()
+{
+ QSettings settings("Trolltech", "Application Example");
+ QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
+ QSize size = settings.value("size", QSize(400, 400)).toSize();
+ resize(size);
+ move(pos);
+}
+
+void %{APPNAME}::writeSettings()
+{
+ QSettings settings("Trolltech", "Application Example");
+ settings.setValue("pos", pos());
+ settings.setValue("size", size());
+}
+
+bool %{APPNAME}::maybeSave()
+{
+ if (textEdit->document()->isModified()) {
+ int ret = QMessageBox::warning(this, tr("Application"),
+ tr("The document has been modified.\n"
+ "Do you want to save your changes?"),
+ QMessageBox::Yes | QMessageBox::Default,
+ QMessageBox::No,
+ QMessageBox::Cancel | QMessageBox::Escape);
+ if (ret == QMessageBox::Yes)
+ return save();
+ else if (ret == QMessageBox::Cancel)
+ return false;
+ }
+ return true;
+}
+
+void %{APPNAME}::loadFile(const QString &fileName)
+{
+ QFile file(fileName);
+ if (!file.open(QFile::ReadOnly | QFile::Text)) {
+ QMessageBox::warning(this, tr("Application"),
+ tr("Cannot read file %1:\n%2.")
+ .arg(fileName)
+ .arg(file.errorString()));
+ return;
+ }
+
+ QTextStream in(&file);
+ QApplication::setOverrideCursor(Qt::WaitCursor);
+ textEdit->setPlainText(in.readAll());
+ QApplication::restoreOverrideCursor();
+
+ setCurrentFile(fileName);
+ statusBar()->showMessage(tr("File loaded"), 2000);
+}
+
+bool %{APPNAME}::saveFile(const QString &fileName)
+{
+ QFile file(fileName);
+ if (!file.open(QFile::WriteOnly | QFile::Text)) {
+ QMessageBox::warning(this, tr("Application"),
+ tr("Cannot write file %1:\n%2.")
+ .arg(fileName)
+ .arg(file.errorString()));
+ return false;
+ }
+
+ QTextStream out(&file);
+ QApplication::setOverrideCursor(Qt::WaitCursor);
+ out << textEdit->toPlainText();
+ QApplication::restoreOverrideCursor();
+
+ setCurrentFile(fileName);
+ statusBar()->showMessage(tr("File saved"), 2000);
+ return true;
+}
+
+void %{APPNAME}::setCurrentFile(const QString &fileName)
+{
+ curFile = fileName;
+ textEdit->document()->setModified(false);
+ setWindowModified(false);
+
+ QString shownName;
+ if (curFile.isEmpty())
+ shownName = "untitled.txt";
+ else
+ shownName = strippedName(curFile);
+
+ setWindowTitle(tr("%1[*] - %2").arg(shownName).arg(tr("Application")));
+}
+
+QString %{APPNAME}::strippedName(const QString &fullFileName)
+{
+ return QFileInfo(fullFileName).fileName();
+}
+
+%{APPNAME}::~%{APPNAME}()
+{
+
+}
+
diff --git a/languages/cpp/app_templates/qt4makeapp/qt4makeapp.h b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.h
new file mode 100644
index 00000000..cd470d00
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.h
@@ -0,0 +1,65 @@
+%{H_TEMPLATE}
+
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+
+#include <QMainWindow>
+#include <QCloseEvent>
+
+class QAction;
+class QMenu;
+class QTextEdit;
+
+class %{APPNAME}:public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ %{APPNAME}();
+ ~%{APPNAME}();
+
+protected:
+ void closeEvent(QCloseEvent *event);
+
+private slots:
+ void newFile();
+ void open();
+ bool save();
+ bool saveAs();
+ void about();
+ void documentWasModified();
+
+private:
+ void createActions();
+ void createMenus();
+ void createToolBars();
+ void createStatusBar();
+ void readSettings();
+ void writeSettings();
+ bool maybeSave();
+ void loadFile(const QString &fileName);
+ bool saveFile(const QString &fileName);
+ void setCurrentFile(const QString &fileName);
+ QString strippedName(const QString &fullFileName);
+
+ QTextEdit *textEdit;
+ QString curFile;
+
+ QMenu *fileMenu;
+ QMenu *editMenu;
+ QMenu *helpMenu;
+ QToolBar *fileToolBar;
+ QToolBar *editToolBar;
+ QAction *newAct;
+ QAction *openAct;
+ QAction *saveAct;
+ QAction *saveAsAct;
+ QAction *exitAct;
+ QAction *cutAct;
+ QAction *copyAct;
+ QAction *pasteAct;
+ QAction *aboutAct;
+ QAction *aboutQtAct;
+};
+
+#endif
diff --git a/languages/cpp/app_templates/qt4makeapp/qt4makeapp.kdevelop b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.kdevelop
new file mode 100644
index 00000000..cd633ede
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevcppsupport>
+ <qt>
+ <used>true</used>
+ <version>4</version>
+ <includestyle>4</includestyle>
+ <designerintegration>ExternalDesigner</designerintegration>
+ <qmake>%{QMAKE}</qmake>
+ <designer>%{DESIGNER}</designer>
+ </qt>
+ </kdevcppsupport>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ <breakpoints/>
+ <programargs></programargs>
+ <gdbpath>/usr/bin/gdb</gdbpath>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ <breakpoints/>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <run>
+ <mainprogram>./bin/%{APPNAMELC}</mainprogram>
+ <programargs/>
+ </run>
+ </kdevtrollproject>
+ <workspace>
+ <openfiles/>
+ </workspace>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ <type ext="ts" />
+ <type ext="qrc" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/qt4makeapp/qt4makeapp.kdevtemplate b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.kdevtemplate
new file mode 100644
index 00000000..ff91d477
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.kdevtemplate
@@ -0,0 +1,207 @@
+# KDE Config File
+[General]
+Name=Qt4 Application
+Name[br]=Meziant Qt4
+Name[ca]=Aplicació Qt4
+Name[da]=Qt4-Program
+Name[de]=Qt4-Anwendung
+Name[el]=ΕφαÏμογή Qt4
+Name[es]=Aplicación Qt4
+Name[et]=Qt4 rakendus
+Name[fr]=Application Qt4
+Name[hu]=Qt4-alapú alkalmazás
+Name[it]=Applicazione Qt4
+Name[ja]=Qt4 アプリケーション
+Name[nds]=Qt4-Programm
+Name[nl]=Qt4-toepassing
+Name[pl]=Program Qt4
+Name[pt]=Aplicação do Qt4
+Name[pt_BR]=Aplicação do Qt4
+Name[ru]=Приложение Qt 4
+Name[sk]=Qt4 aplikácia
+Name[sr]=Qt4 програм
+Name[sr@Latn]=Qt4 program
+Name[sv]=Qt4-program
+Name[zh_TW]=Qt4 應用程å¼
+Icon=qt4makeapp.png
+Category=C++/QMake project
+Category[fr]=C++/QMake
+Comment=Generate a QMake/Qt4 based application (crossplatform compatible) - Needs Qt4
+Comment[ca]=Genera una aplicació basada en QMake/Qt4 (multi plataforma) -Necessita Qt4-
+Comment[da]=Generér et QMake/Qt4 baseret program (krydsplatform kompatibel) - behøver Qt4
+Comment[de]=Erstellt eine auf QMake/Qt4 basierende Anwendung (plattformunabhängig). - Benötigt Qt4.
+Comment[el]=ΔημιουÏγία μια εφαÏμογής βασισμένης στα QMake/Qt4 (συμβατή με πολλαπλές πλατφόÏμες)
+Comment[es]=Genera una aplicación basada en QMake/Qt4 (con compatibilidad multiplataforma) - Necesita Qt4
+Comment[et]=Rakenduse loomine QMake'i/Qt4 põhjal (multiplatvormne)
+Comment[fr]=Génère une application basée sur QMake / Qt4 (compatible multi-plateforme) - Nécessite Qt4
+Comment[hu]=Létrehoz egy QMake/Qt4-alapú, keresztfordításra is alkalmas alkalmazást - Qt4-et igényel
+Comment[it]=Genera un'applicazione basata su QMake/Qt4 (compatibile multipiattaforma) - serve Qt4
+Comment[nds]=Stellt en op QMake un Qt4 opbuut Programm op (över Bedriefümgeven weg kompatibel) - Qt4 deit noot
+Comment[nl]=Genereer een Qmake/Qt4-gebaseerde toepassing (crossplatform compatible) - heeft Qt4 nodig
+Comment[pl]=Generuje program używający QMake i Qt4 (wieloplatformowy) - wymaga biblioteki Qt4
+Comment[pt]=Gera uma aplicação baseada no QMake/Qt4 (compatível com várias plataformas) - Necessita do Qt4
+Comment[pt_BR]=Gera uma aplicação baseada no QMake/Qt4 (compatível com várias plataformas) - Necessita do Qt4
+Comment[ru]=Создание кроÑÑплатформенного Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Qt 4, иÑпользующего QMake
+Comment[sk]=Vygeneruje aplikáciu založenú na QMake/Qt4 (multiplatformovo kompatibilnú) - vyžaduje Qt4
+Comment[sr]=Прави програм на оÑнови QMake/Qt4 (прекоплатформÑки компатибилан) — захтева Qt4
+Comment[sr@Latn]=Pravi program na osnovi QMake/Qt4 (prekoplatformski kompatibilan) — zahteva Qt4
+Comment[sv]=Skapar ett QMake/Qt4-baserat program (fungerar på andra plattformar). Kräver Qt4.
+Comment[zh_TW]=產生一個 QMake/Qt4 為基礎的應用程å¼ï¼ˆè·¨å¹³å°ç›¸å®¹ï¼‰â”€éœ€è¦ Qt4
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp,%{dest}/src/ReadMe
+Archive=qt4makeapp.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/qt4makeapp.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/qt4makeapp.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE3]
+Type=install
+Source=%{src}/src.pro
+Dest=%{dest}/src/src.pro
+
+[FILE4]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/src/main.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/qt4makeapp.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE6]
+Type=install
+Source=%{src}/qt4makeapp.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE7]
+Type=install
+Source=%{src}/fileopen.xpm
+Dest=%{dest}/src/fileopen.xpm
+
+[FILE8]
+Type=install
+Source=%{src}/filesave.xpm
+Dest=%{dest}/src/filesave.xpm
+
+[FILE9]
+Type=install
+Source=%{src}/filenew.xpm
+Dest=%{dest}/src/filenew.xpm
+
+[FILE10]
+Type=install
+Source=%{src}/editcopy.xpm
+Dest=%{dest}/src/editcopy.xpm
+
+[FILE11]
+Type=install
+Source=%{src}/editpaste.xpm
+Dest=%{dest}/src/editpaste.xpm
+
+[FILE12]
+Type=install
+Source=%{src}/editcut.xpm
+Dest=%{dest}/src/editcut.xpm
+
+[FILE13]
+Type=install
+Source=%{src}/application.qrc
+Dest=%{dest}/src/application.qrc
+
+[FILE14]
+Type=install
+Source=%{src}/ReadMe
+Dest=%{dest}/src/ReadMe
+
+[MSG]
+Type=message
+Comment=A Qt4/Qmake based application was created in %{dest}
+Comment[ca]=Una aplicació basada en Qt4/Qmake ha estat creada en %{dest}
+Comment[da]=Et Qt4/Qmake baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf QMake/Qt4 basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή βασισμένη στα Qt4/Qmake δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación basada en Qt4/Qmake ha sido creada en %{dest}
+Comment[et]=Rakendus Qt4/QMake'i põhjal loodi asukohta %{dest}
+Comment[fr]=Une application basée sur Qt4 / Qmake a été créée dans %{dest}
+Comment[hu]=Létrejött egy Qt4/Qmake-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su Qt4/Qmake in %{dest}
+Comment[ja]=Qt4/QMake ベースã®ã‚¢ãƒ—リケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op Qt4 un Qmake opbuut Programm opstellt
+Comment[nl]=Een Qt4/Qmake gebaseerde toepassing is aangemaakt in %{dest}
+Comment[pl]=Program używający QMake i Qt4 został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada no Qt4/Qmake em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada no Qt4/Qmake em %{dest}
+Comment[ru]=Приложение Qt 4, иÑпользующее Qmake, Ñоздано в %{dest}
+Comment[sk]=Aplikácia založená na Qt4/Qmake bola vytvorená v %{dest}
+Comment[sr]=Програм на оÑнову Qt4/Qmake направљен је у %{dest}
+Comment[sr@Latn]=Program na osnovu Qt4/Qmake napravljen je u %{dest}
+Comment[sv]=Ett QMake/Qt4-baserat program skapades i %{dest}
+Comment[zh_TW]=一個 QMake/Qt4 為基礎的應用程å¼å·²å»ºç«‹æ–¼ %{dest}
+
+Comment=
+[QMAKE]
+Type=value
+ValueType=QString
+Value=QMAKE
+Comment=Absolute Path for QMake (Qt4).
+Comment[ca]=Ruta absoluta per a QMake (Qt4).
+Comment[da]=Absolut søgesti til QMake (Qt4).
+Comment[de]=Absoluter Pfad für QMake (Qt4).
+Comment[el]=Απόλυτη διαδÏομή για το QMake (Qt4).
+Comment[es]=Ruta completa para QMake (Qt4).
+Comment[et]=QMake (Qt4) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour QMake (Qt4).
+Comment[hu]=A QMake (Qt4) teljes elérési útja.
+Comment[it]=Percorso assoluto per QMake (Qt4).
+Comment[ja]=QMake (Qt4) ã®çµ¶å¯¾ãƒ‘ス
+Comment[nds]=Afsluut Padd för QMake (Qt4)
+Comment[nl]=Absoluut pad naar QMake (Qt4).
+Comment[pl]=Ścieżka bezwzględna do QMake (Qt4).
+Comment[pt]=Localização Absoluta do QMake (Qt4).
+Comment[pt_BR]=Localização Absoluta do QMake (Qt4).
+Comment[ru]=Полный путь к QMake (Qt 4).
+Comment[sk]=Absolútna cesta ku QMake (Qt4).
+Comment[sr]=ÐпÑолутна путања до QMake-а (Qt4).
+Comment[sr@Latn]=Apsolutna putanja do QMake-a (Qt4).
+Comment[sv]=Absolut sökväg till QMake (Qt4).
+Comment[zh_TW]=QMake(Qt4)的絕å°è·¯å¾‘
+Default=
+[DESIGNER]
+Type=value
+ValueType=QString
+Value=DESIGNER
+Comment=Absolute Path for Designer (Qt4).
+Comment[ca]=Ruta absoluta per a Designer (Qt4).
+Comment[da]=Absolut søgesti til Designer (Qt4).
+Comment[de]=Absoluter Pfad für Designer (Qt4).
+Comment[el]=Απόλυτη διαδÏομή για τον Σχεδιαστή (Qt4).
+Comment[es]=Ruta completa para Designer (Qt4).
+Comment[et]=Disaineri (Qt4) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour Designer (Qt4).
+Comment[hu]=A Designer (Qt4) teljes elérési útja
+Comment[it]=Percorso assoluto del Designer (Qt4).
+Comment[ja]=Designer (Qt4) ã®çµ¶å¯¾ãƒ‘ス
+Comment[nds]=Afsluut Padd för Designer (Qt4)
+Comment[nl]=Absoluut pad naar Designer (Qt4).
+Comment[pl]=Ścieżka bezwzględna do Designera (Qt4).
+Comment[pt]=Localização Absoluta do Designer (Qt4).
+Comment[pt_BR]=Localização Absoluta do Designer (Qt4).
+Comment[ru]=Полный путь к Designer (Qt 4).
+Comment[sk]=Absolútna cesta ku Designer (Qt4).
+Comment[sr]=ÐпÑолутна путања до Designer-а (Qt4).
+Comment[sr@Latn]=Apsolutna putanja do Designer-a (Qt4).
+Comment[sv]=Absolut sökväg till Designer (Qt4).
+Comment[zh_TW]=設計家(Qt4)的絕å°è·¯å¾‘
+Default=
diff --git a/languages/cpp/app_templates/qt4makeapp/qt4makeapp.png b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.png
new file mode 100644
index 00000000..96a7e0bf
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.png
Binary files differ
diff --git a/languages/cpp/app_templates/qt4makeapp/qt4makeapp.pro b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.pro
new file mode 100644
index 00000000..7177d225
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/qt4makeapp.pro
@@ -0,0 +1,5 @@
+SUBDIRS += src
+TEMPLATE = subdirs
+CONFIG += warn_on \
+ qt \
+ thread \ No newline at end of file
diff --git a/languages/cpp/app_templates/qt4makeapp/src.pro b/languages/cpp/app_templates/qt4makeapp/src.pro
new file mode 100644
index 00000000..fa8baae6
--- /dev/null
+++ b/languages/cpp/app_templates/qt4makeapp/src.pro
@@ -0,0 +1,10 @@
+SOURCES += %{APPNAMELC}.cpp \
+ main.cpp
+HEADERS += %{APPNAMELC}.h
+TEMPLATE = app
+CONFIG += warn_on \
+ thread \
+ qt
+TARGET = %{APPNAMELC}
+DESTDIR = ../bin
+RESOURCES = application.qrc
diff --git a/languages/cpp/app_templates/qtopia4app/Example.png b/languages/cpp/app_templates/qtopia4app/Example.png
new file mode 100644
index 00000000..f63d0bc7
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/Example.png
Binary files differ
diff --git a/languages/cpp/app_templates/qtopia4app/Makefile.am b/languages/cpp/app_templates/qtopia4app/Makefile.am
new file mode 100644
index 00000000..57785690
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = Example.png app.kdevelop example.desktop \
+ example.html main.cpp Makefile.am app.pro example.cpp \
+ example.h examplebase.ui
+
+templateName = qtopia4app
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ gzip -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/qtopia4app/app.kdevelop b/languages/cpp/app_templates/qtopia4app/app.kdevelop
new file mode 100644
index 00000000..465fd677
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/app.kdevelop
@@ -0,0 +1,163 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTrollProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs></programargs>
+ <gdbpath></gdbpath>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram>./%{APPNAMELC}</mainprogram>
+ <programargs>-qws</programargs>
+ <envvars>
+ <envvar value="/opt/Qtopia/SDK/4.2.4/x86" name="QPEDIR" />
+ <envvar value="$QPEDIR/qtopiacore/target" name="QTDIR" />
+ <envvar value="/opt/Qtopia/SDK/4.2.4/x86/lib:/opt/Qtopia/SDK/4.2.4/x86/qtopiacore/target/lib:$LD_LIBRARY_PATH" name="LD_LIBRARY_PATH" />
+ <envvar value="$PATH:/opt/Qtopia/SDK/scripts:/opt/Qtopia/SDK/4.2.4/x86/bin:/opt/Qtopia/SDK/4.2.4/x86/scripts" name="PATH" />
+
+ </envvars>
+ </run>
+ <envvars/>
+ <make>
+ <abortonerror>true</abortonerror>
+ <runmultiplejobs>false</runmultiplejobs>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin></makebin>
+ <prio>0</prio>
+ <envvars>
+ <envvar value="/opt/Qtopia/SDK/4.2.4/x86" name="QPEDIR" />
+ <envvar value="/opt/Qtopia/SDK/4.2.4/x86/qtopiacore/target" name="QTDIR" />
+ <envvar value="$PATH:/opt/Qtopia/SDK/scripts:/opt/Qtopia/SDK/4.2.4/x86/bin:/opt/Qtopia/SDK/4.2.4/x86/scripts" name="PATH" />
+ </envvars>
+ </make>
+ </kdevtrollproject>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes/>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <codecompletion>
+ <codehinting outputview="1" enablech="0" selectview="0" />
+ </codecompletion>
+ <classstore>
+ <enablepcs>false</enablepcs>
+ <enablepp>false</enablepp>
+ <preparsing/>
+ </classstore>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL></interfaceURL>
+ <implementationURL></implementationURL>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions></commitoptions>
+ <updateoptions>-dP</updateoptions>
+ <addoptions></addoptions>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions></logoptions>
+ <rshoptions></rshoptions>
+ </kdevcvs>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+ <kdevcppsupport>
+ <qt>
+ <used>true</used>
+ <version>4</version>
+ <includestyle>4</includestyle>
+ <root>/usr/lib/qt3</root>
+ <designerintegration>ExternalDesigner</designerintegration>
+ <qmake>/opt/Qtopia/SDK/4.2.4/x86/bin/qtopiamake</qmake>
+ <designer>/opt/Qtopia/SDK/4.2.4/x86/bin/designer</designer>
+ <designerpluginpaths/>
+ </qt>
+ </kdevcppsupport>
+</kdevelop>
diff --git a/languages/cpp/app_templates/qtopia4app/app.pro b/languages/cpp/app_templates/qtopia4app/app.pro
new file mode 100644
index 00000000..05a0bb9c
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/app.pro
@@ -0,0 +1,31 @@
+qtopia_project(qtopia app) # see buildsystem.html for more project keywords
+TARGET=%{APPNAMELC}
+CONFIG+=qtopia_main
+CONFIG+=no_singleexec
+CONFIG+=no_quicklaunch
+CONFIG+=no_tr
+
+FORMS=%{APPNAMELC}base.ui
+HEADERS=%{APPNAMELC}.h
+SOURCES=main.cpp %{APPNAMELC}.cpp
+
+desktop.files=%{APPNAMELC}.desktop
+desktop.path=/apps/Applications
+desktop.hint=desktop
+
+pics.files=pics/*
+pics.path=/pics/%{APPNAMELC}
+pics.hint=pics
+
+help.source=help
+help.files=%{APPNAME}.html
+help.hint=help
+
+INSTALLS+=desktop pics help
+
+pkg.name=%{APPNAME}
+pkg.desc=%{APPNAME} Application
+pkg.version=1.0.0-1
+pkg.maintainer=%{AUTHOR} %{EMAIL}
+pkg.license=GPL
+pkg.domain=window
diff --git a/languages/cpp/app_templates/qtopia4app/example.cpp b/languages/cpp/app_templates/qtopia4app/example.cpp
new file mode 100644
index 00000000..a35d57cb
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/example.cpp
@@ -0,0 +1,40 @@
+
+#include "%{APPNAMELC}.h"
+#include <qpushbutton.h>
+
+%{APPNAME}Base::%{APPNAME}Base( QWidget *parent, Qt::WFlags f )
+ : QWidget( parent, f )
+{
+ setupUi( this );
+}
+
+%{APPNAME}Base::~%{APPNAME}Base()
+{
+}
+
+/*
+ * Constructs a %{APPNAME} which is a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'
+ */
+%{APPNAME}::%{APPNAME}( QWidget *parent, Qt::WFlags f )
+ : %{APPNAME}Base( parent, f )
+{
+ connect(quit, SIGNAL(clicked()), this, SLOT(goodBye()));
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+%{APPNAME}::~%{APPNAME}()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+/*
+ * A simple slot... not very interesting.
+ */
+void %{APPNAME}::goodBye()
+{
+ close();
+}
+
diff --git a/languages/cpp/app_templates/qtopia4app/example.desktop b/languages/cpp/app_templates/qtopia4app/example.desktop
new file mode 100644
index 00000000..f6f04194
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/example.desktop
@@ -0,0 +1,37 @@
+[Desktop Entry]
+Comment=An %{APPNAME} Program
+Comment[ca]=Un programa per a %{APPNAME}
+Comment[da]=Et %{APPNAME} program
+Comment[de]=Ein %{APPNAME}-Program
+Comment[el]=Ένα Ï€ÏόγÏαμμα %{APPNAME}
+Comment[es]=Un programa %{APPNAME}
+Comment[et]=%{APPNAME} programm
+Comment[eu]=%{APPNAME} programa bat
+Comment[fa]=برنامۀ %{APPNAME}
+Comment[fr]=Un programme %{APPNAME}
+Comment[ga]=Clár %{APPNAME}
+Comment[gl]=Un programa %{APPNAME}
+Comment[hu]=%{APPNAME} program
+Comment[it]=Un programma per %{APPNAME}
+Comment[ja]=%{APPNAME} プログラム
+Comment[nds]=En %{APPNAME}-Programm
+Comment[ne]= %{APPNAME} कारà¥à¤¯à¤•à¥à¤°à¤®
+Comment[nl]=Een %{APPNAME} programma
+Comment[pl]=Program %{APPNAME}
+Comment[pt]=Um Programa %{APPNAME}
+Comment[pt_BR]=Um Programa %{APPNAME}
+Comment[ru]=Программа %{APPNAME}
+Comment[sk]=%{APPNAME} program
+Comment[sl]=Program %{APPNAME}
+Comment[sr]=%{APPNAME} програм
+Comment[sr@Latn]=%{APPNAME} program
+Comment[sv]=Ett %{APPNAME}-program
+Comment[ta]=ஒர௠%{APPNAME} நிரலà¯
+Comment[tg]=Барномаи %{APPNAME}
+Comment[tr]=Bir %{APPNAME} Programı
+Comment[zh_CN]=一个 %{APPNAME} 程åº
+Comment[zh_TW]=一個 %{APPNAME} 程å¼
+Exec=%{APPNAMELC}
+Icon=%{APPNAME}
+Type=Application
+Name=%{APPNAME}
diff --git a/languages/cpp/app_templates/qtopia4app/example.h b/languages/cpp/app_templates/qtopia4app/example.h
new file mode 100644
index 00000000..7d58c7d8
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/example.h
@@ -0,0 +1,24 @@
+
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+#include "ui_%{APPNAMELC}base.h"
+
+class %{APPNAME}Base : public QWidget, public Ui_%{APPNAME}Base
+{
+public:
+ %{APPNAME}Base( QWidget *parent = 0, Qt::WFlags f = 0 );
+ virtual ~%{APPNAME}Base();
+};
+
+class %{APPNAME} : public %{APPNAME}Base
+{
+ Q_OBJECT
+public:
+ %{APPNAME}( QWidget *parent = 0, Qt::WFlags f = 0 );
+ virtual ~%{APPNAME}();
+
+private slots:
+ void goodBye();
+};
+
+#endif // %{APPNAMEUC}_H
diff --git a/languages/cpp/app_templates/qtopia4app/example.html b/languages/cpp/app_templates/qtopia4app/example.html
new file mode 100644
index 00000000..279a6106
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/example.html
@@ -0,0 +1,15 @@
+<html>
+<h1>%{APPNAME}</h1>
+
+<p>This is the help for the %{APPNAME} program.
+
+<p>To user this application:
+
+<ol>
+ <li>Press the <img width=12 height=12 src=%{APPNAME}.png> icon in the Qtopia launcher.
+ <li>Read the label.
+ <li>Press the button.
+ <li>Read the source code provided.
+</ol>
+
+Now you know how to make a Qtopia application!
diff --git a/languages/cpp/app_templates/qtopia4app/examplebase.ui b/languages/cpp/app_templates/qtopia4app/examplebase.ui
new file mode 100644
index 00000000..17d6bc20
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/examplebase.ui
@@ -0,0 +1,44 @@
+<ui version="4.0" stdsetdef="1" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>%{APPNAME}Base</class>
+ <widget class="QWidget" name="%{APPNAME}Base" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>196</width>
+ <height>245</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>%{APPNAME}</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>This is just an %{APPNAME}. It doesn't do anything interesting at all.</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="quit" >
+ <property name="text" >
+ <string>Quit</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+</ui>
diff --git a/languages/cpp/app_templates/qtopia4app/main.cpp b/languages/cpp/app_templates/qtopia4app/main.cpp
new file mode 100644
index 00000000..43dbb4ac
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/main.cpp
@@ -0,0 +1,7 @@
+
+#include "%{APPNAMELC}.h"
+#include <qtopia/qtopiaapplication.h>
+
+QTOPIA_ADD_APPLICATION("%{APPNAMELC}", %{APPNAME})
+QTOPIA_MAIN
+
diff --git a/languages/cpp/app_templates/qtopia4app/qtopia4app.kdevtemplate b/languages/cpp/app_templates/qtopia4app/qtopia4app.kdevtemplate
new file mode 100644
index 00000000..298407f5
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/qtopia4app.kdevtemplate
@@ -0,0 +1,193 @@
+# KDE Config File
+[General]
+Name=Qtopia 4 Application
+Name[ca]=Aplicació per a Qtopia 4
+Name[da]=Qtopia4-program
+Name[de]=Qtopia 4-Anwendung
+Name[el]=ΕφαÏμογή Qtopia 4
+Name[es]=Aplicación para Qtopia 4
+Name[et]=Qtopia 4 rakendus
+Name[hu]=Qtopia 4-alapú alkalmazás
+Name[it]=Applicazione Qtopia 4
+Name[nds]=Qtopia 4-Programm
+Name[nl]=Qtopia4-programma
+Name[pl]=Program wykorzystujÄ…cy QtopiÄ™ 4
+Name[pt]=Aplicação do Qtopia 4
+Name[pt_BR]=Aplicação do Qtopia 4
+Name[ru]=Приложение Qtopia 4
+Name[sk]=Qtopia 4 aplikácia
+Name[sr]=Qtopia 4 програм
+Name[sr@Latn]=Qtopia 4 program
+Name[sv]=Qtopia 4-program
+Name[zh_TW]=Qtopia 4 應用程å¼
+Icon=qmakeapp4.png
+Category=C++/Embedded
+Comment=Generate a Qmake/Qt based application for Qtopia 4.x
+Comment[ca]=Genera una aplicació basada en Qmake/Qt per a Qtopia 4.x
+Comment[da]=Genererer et QMake-/Qt-baseret program til Qtopia 4.x
+Comment[de]=Erstellt eine auf QMake/Qt basierende Anwendung für Qtopia 4.x
+Comment[el]=ΔημιουÏγία μιας εφαÏμογής βασισμένης στο Qmake/Qt για το Qtopia 4.x
+Comment[es]=Genera una aplicación basada en Qmake/Qt para Qtopia 4.x
+Comment[et]=Qtopia 4.x rakenduse loomine QMake'i/Qt põhjal
+Comment[hu]=Létrehoz egy QMake/Qt-alapú alkalmazást a Qtopia 4.x rendszerhez
+Comment[it]=Genera un'applicazione basata su QMake/Qt per Qtopia 4.x
+Comment[nds]=Stellt en op QMake/Qt opbuut Programm för Qtopia 4.x op
+Comment[nl]=Genereer een Qmake/Qt-gebaseerd programma voor Qtopia 4.x
+Comment[pl]=Generuje program wykorzystujÄ…cy QMake/Qt dla Qtopii 4.x
+Comment[pt]=Gera uma aplicação, baseada no QMake/Qt, para o Qtopia 4.x
+Comment[pt_BR]=Gera uma aplicação, baseada no QMake/Qt, para o Qtopia 4.x
+Comment[ru]=Создание Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Qt, иÑпользующего QMake, Ð´Ð»Ñ Qtopia 4.x
+Comment[sk]=Vygeneruje aplikáciu založenú na QMake/Qt pre Qtopia 4.x
+Comment[sr]=Прави програм за Qtopia-у 4.x на оÑнову QMake-а/Qt-а
+Comment[sr@Latn]=Pravi program za Qtopia-u 4.x na osnovu QMake-a/Qt-a
+Comment[sv]=Skapa ett Qmake/Qt-baserat program för Qtopia 4.x
+Comment[zh_TW]=產生一個以 Qmake/Qt 為基礎的 Qtopia 4.x 應用程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.cpp
+Archive=qtopia4app.tar.gz
+
+[MkDir0]
+Type=mkdir
+Dir=%{dest}/help
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/help/html
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/Example.png
+Dest=%{dest}/%{APPNAME}.png
+Process=false
+
+[FILE3]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[FILE4]
+Type=install
+Source=%{src}/example.cpp
+Dest=%{dest}/%{APPNAMELC}.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/example.h
+Dest=%{dest}/%{APPNAMELC}.h
+
+[FILE6]
+Type=install
+EscapeXML=true
+Source=%{src}/examplebase.ui
+Dest=%{dest}/%{APPNAMELC}base.ui
+
+[FILE7]
+Type=install
+Source=%{src}/example.desktop
+Dest=%{dest}/%{APPNAMELC}.desktop
+
+[FILE8]
+Type=install
+EscapeXML=true
+Source=%{src}/example.html
+Dest=%{dest}/%{APPNAMELC}.html
+
+[FILE9]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/main.cpp
+
+[MSG]
+Type=message
+Comment=A Qtopia application was created in %{dest}
+Comment[ca]=Una aplicació basada en Qtopia ha estat creada en %{dest}
+Comment[da]=Et Qtopia program blev oprettet i %{dest}
+Comment[de]=Eine Qtopia-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή Qtopia δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación para Qtopia ha sido creada en %{dest}
+Comment[et]=Qtopia rakendus loodi asukohta %{dest}
+Comment[eu]=Qtopia aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد Qtopia در %{dest} ایجاد شد
+Comment[fr]=Une application Qtopia a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár Qtopia i %{dest}
+Comment[gl]=Creouse unha aplicación Qtopia en %{dest}
+Comment[hu]=Létrejött egy Qtopia-alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Qtopia in %{dest}
+Comment[ja]=Qtopia アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Qtopia-Programm opstellt
+Comment[ne]=Qtopia अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Qtopia-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program wykorzystujący Qtopię został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do Qtopia em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do Qtopia em %{dest}
+Comment[ru]=Приложение Qtopia Ñоздано в %{dest}
+Comment[sk]=Qtopia aplikácia bola vytvorená v %{dest}
+Comment[sr]=Qtopia програм је направљен у %{dest}
+Comment[sr@Latn]=Qtopia program je napravljen u %{dest}
+Comment[sv]=Ett Qtopia-program skapades i %{dest}
+Comment[tr]=Bir Qtopia uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了 Qtopia 应用程åº
+Comment[zh_TW]=一個 Qtopia 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
+
+[QMAKE]
+Type=value
+ValueType=QString
+Value=QMAKE
+Comment=Absolute Path for QMake (Qt4).
+Comment[ca]=Ruta absoluta per a QMake (Qt4).
+Comment[da]=Absolut søgesti til QMake (Qt4).
+Comment[de]=Absoluter Pfad für QMake (Qt4).
+Comment[el]=Απόλυτη διαδÏομή για το QMake (Qt4).
+Comment[es]=Ruta completa para QMake (Qt4).
+Comment[et]=QMake (Qt4) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour QMake (Qt4).
+Comment[hu]=A QMake (Qt4) teljes elérési útja.
+Comment[it]=Percorso assoluto per QMake (Qt4).
+Comment[ja]=QMake (Qt4) ã®çµ¶å¯¾ãƒ‘ス
+Comment[nds]=Afsluut Padd för QMake (Qt4)
+Comment[nl]=Absoluut pad naar QMake (Qt4).
+Comment[pl]=Ścieżka bezwzględna do QMake (Qt4).
+Comment[pt]=Localização Absoluta do QMake (Qt4).
+Comment[pt_BR]=Localização Absoluta do QMake (Qt4).
+Comment[ru]=Полный путь к QMake (Qt 4).
+Comment[sk]=Absolútna cesta ku QMake (Qt4).
+Comment[sr]=ÐпÑолутна путања до QMake-а (Qt4).
+Comment[sr@Latn]=Apsolutna putanja do QMake-a (Qt4).
+Comment[sv]=Absolut sökväg till QMake (Qt4).
+Comment[zh_TW]=QMake(Qt4)的絕å°è·¯å¾‘
+Default=/opt/Qtopia/SDK/4.2.4/x86/bin/qtopiamake
+[DESIGNER]
+Type=value
+ValueType=QString
+Value=DESIGNER
+Comment=Absolute Path for Designer (Qt4).
+Comment[ca]=Ruta absoluta per a Designer (Qt4).
+Comment[da]=Absolut søgesti til Designer (Qt4).
+Comment[de]=Absoluter Pfad für Designer (Qt4).
+Comment[el]=Απόλυτη διαδÏομή για τον Σχεδιαστή (Qt4).
+Comment[es]=Ruta completa para Designer (Qt4).
+Comment[et]=Disaineri (Qt4) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour Designer (Qt4).
+Comment[hu]=A Designer (Qt4) teljes elérési útja
+Comment[it]=Percorso assoluto del Designer (Qt4).
+Comment[ja]=Designer (Qt4) ã®çµ¶å¯¾ãƒ‘ス
+Comment[nds]=Afsluut Padd för Designer (Qt4)
+Comment[nl]=Absoluut pad naar Designer (Qt4).
+Comment[pl]=Ścieżka bezwzględna do Designera (Qt4).
+Comment[pt]=Localização Absoluta do Designer (Qt4).
+Comment[pt_BR]=Localização Absoluta do Designer (Qt4).
+Comment[ru]=Полный путь к Designer (Qt 4).
+Comment[sk]=Absolútna cesta ku Designer (Qt4).
+Comment[sr]=ÐпÑолутна путања до Designer-а (Qt4).
+Comment[sr@Latn]=Apsolutna putanja do Designer-a (Qt4).
+Comment[sv]=Absolut sökväg till Designer (Qt4).
+Comment[zh_TW]=設計家(Qt4)的絕å°è·¯å¾‘
+Default=/opt/Qtopia/SDK/4.2.4/x86/bin/designer
+
+
diff --git a/languages/cpp/app_templates/qtopia4app/qtopia4app.png b/languages/cpp/app_templates/qtopia4app/qtopia4app.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/qtopia4app/qtopia4app.png
Binary files differ
diff --git a/languages/cpp/app_templates/qtopiaapp/.kdev_ignore b/languages/cpp/app_templates/qtopiaapp/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/.kdev_ignore
diff --git a/languages/cpp/app_templates/qtopiaapp/Example.png b/languages/cpp/app_templates/qtopiaapp/Example.png
new file mode 100644
index 00000000..f63d0bc7
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/Example.png
Binary files differ
diff --git a/languages/cpp/app_templates/qtopiaapp/Makefile.am b/languages/cpp/app_templates/qtopiaapp/Makefile.am
new file mode 100644
index 00000000..c250d5fa
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = Example.png app.kdevelop example.control example.desktop \
+ example.html main.cpp Makefile.am app.pro example.cpp \
+ example.h examplebase.ui qtopiaapp
+
+templateName = qtopiaapp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/qtopiaapp/app.kdevelop b/languages/cpp/app_templates/qtopiaapp/app.kdevelop
new file mode 100644
index 00000000..9db37db3
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/app.kdevelop
@@ -0,0 +1,131 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevTMakeProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>Qt</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs></programargs>
+ <gdbpath></gdbpath>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevtrollproject>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram>./%{APPNAMELC}</mainprogram>
+ <programargs>-qws</programargs>
+ </run>
+ <envvars/>
+ </kdevtrollproject>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes/>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <codecompletion>
+ <codehinting outputview="1" enablech="0" selectview="0" />
+ </codecompletion>
+ <classstore>
+ <enablepcs>false</enablepcs>
+ <enablepp>false</enablepp>
+ <preparsing/>
+ </classstore>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL></interfaceURL>
+ <implementationURL></implementationURL>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions></commitoptions>
+ <updateoptions>-dP</updateoptions>
+ <addoptions></addoptions>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions></logoptions>
+ <rshoptions></rshoptions>
+ </kdevcvs>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/qtopiaapp/app.pro b/languages/cpp/app_templates/qtopiaapp/app.pro
new file mode 100644
index 00000000..c625020d
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/app.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+CONFIG = qt warn_on release
+HEADERS = %{APPNAMELC}.h
+SOURCES = main.cpp %{APPNAMELC}.cpp
+INTERFACES = %{APPNAMELC}base.ui
+TARGET = %{APPNAMELC}
+INCLUDEPATH += $(QPEDIR)/include
+DEPENDPATH += $(QPEDIR)/include
+LIBS += -lqpe
+
diff --git a/languages/cpp/app_templates/qtopiaapp/example.control b/languages/cpp/app_templates/qtopiaapp/example.control
new file mode 100644
index 00000000..d04f87ec
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/example.control
@@ -0,0 +1,11 @@
+Files: bin/%{APPNAMELC} apps/Applications/%{APPNAMELC}.desktop pics/%{APPNAME}.png help/html/%{APPNAMELC}.html
+Priority: optional
+Section: qpe/applications
+Maintainer: Your Name <you@your.domain.com>
+Architecture: $CPU_ARCH
+Arch: $DEVICE_ARCH
+Version: 1.0.0
+License: Public Domain
+Description: %{APPNAME} program
+ An %{APPNAMELC} program for the Qtopia environment.
+ Does nothing interesting.
diff --git a/languages/cpp/app_templates/qtopiaapp/example.cpp b/languages/cpp/app_templates/qtopiaapp/example.cpp
new file mode 100644
index 00000000..939f708e
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/example.cpp
@@ -0,0 +1,29 @@
+
+#include "%{APPNAMELC}.h"
+#include <qpushbutton.h>
+
+/*
+ * Constructs a %{APPNAME} which is a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'
+ */
+%{APPNAME}::%{APPNAME}( QWidget* parent, const char* name, WFlags fl )
+ : %{APPNAME}Base( parent, name, fl )
+{
+ connect(quit, SIGNAL(clicked()), this, SLOT(goodBye()));
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+%{APPNAME}::~%{APPNAME}()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+/*
+ * A simple slot... not very interesting.
+ */
+void %{APPNAME}::goodBye()
+{
+ close();
+}
diff --git a/languages/cpp/app_templates/qtopiaapp/example.desktop b/languages/cpp/app_templates/qtopiaapp/example.desktop
new file mode 100644
index 00000000..f6f04194
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/example.desktop
@@ -0,0 +1,37 @@
+[Desktop Entry]
+Comment=An %{APPNAME} Program
+Comment[ca]=Un programa per a %{APPNAME}
+Comment[da]=Et %{APPNAME} program
+Comment[de]=Ein %{APPNAME}-Program
+Comment[el]=Ένα Ï€ÏόγÏαμμα %{APPNAME}
+Comment[es]=Un programa %{APPNAME}
+Comment[et]=%{APPNAME} programm
+Comment[eu]=%{APPNAME} programa bat
+Comment[fa]=برنامۀ %{APPNAME}
+Comment[fr]=Un programme %{APPNAME}
+Comment[ga]=Clár %{APPNAME}
+Comment[gl]=Un programa %{APPNAME}
+Comment[hu]=%{APPNAME} program
+Comment[it]=Un programma per %{APPNAME}
+Comment[ja]=%{APPNAME} プログラム
+Comment[nds]=En %{APPNAME}-Programm
+Comment[ne]= %{APPNAME} कारà¥à¤¯à¤•à¥à¤°à¤®
+Comment[nl]=Een %{APPNAME} programma
+Comment[pl]=Program %{APPNAME}
+Comment[pt]=Um Programa %{APPNAME}
+Comment[pt_BR]=Um Programa %{APPNAME}
+Comment[ru]=Программа %{APPNAME}
+Comment[sk]=%{APPNAME} program
+Comment[sl]=Program %{APPNAME}
+Comment[sr]=%{APPNAME} програм
+Comment[sr@Latn]=%{APPNAME} program
+Comment[sv]=Ett %{APPNAME}-program
+Comment[ta]=ஒர௠%{APPNAME} நிரலà¯
+Comment[tg]=Барномаи %{APPNAME}
+Comment[tr]=Bir %{APPNAME} Programı
+Comment[zh_CN]=一个 %{APPNAME} 程åº
+Comment[zh_TW]=一個 %{APPNAME} 程å¼
+Exec=%{APPNAMELC}
+Icon=%{APPNAME}
+Type=Application
+Name=%{APPNAME}
diff --git a/languages/cpp/app_templates/qtopiaapp/example.h b/languages/cpp/app_templates/qtopiaapp/example.h
new file mode 100644
index 00000000..883cb27d
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/example.h
@@ -0,0 +1,18 @@
+
+#ifndef %{APPNAMEUC}_H
+#define %{APPNAMEUC}_H
+#include "%{APPNAMELC}base.h"
+
+class %{APPNAME} : public %{APPNAME}Base
+{
+ Q_OBJECT
+
+public:
+ %{APPNAME}( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~%{APPNAME}();
+
+private slots:
+ void goodBye();
+};
+
+#endif // %{APPNAMEUC}_H
diff --git a/languages/cpp/app_templates/qtopiaapp/example.html b/languages/cpp/app_templates/qtopiaapp/example.html
new file mode 100644
index 00000000..279a6106
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/example.html
@@ -0,0 +1,15 @@
+<html>
+<h1>%{APPNAME}</h1>
+
+<p>This is the help for the %{APPNAME} program.
+
+<p>To user this application:
+
+<ol>
+ <li>Press the <img width=12 height=12 src=%{APPNAME}.png> icon in the Qtopia launcher.
+ <li>Read the label.
+ <li>Press the button.
+ <li>Read the source code provided.
+</ol>
+
+Now you know how to make a Qtopia application!
diff --git a/languages/cpp/app_templates/qtopiaapp/examplebase.ui b/languages/cpp/app_templates/qtopiaapp/examplebase.ui
new file mode 100644
index 00000000..b6b81b11
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/examplebase.ui
@@ -0,0 +1,49 @@
+<!DOCTYPE UI><UI>
+<class>%{APPNAME}Base</class>
+<widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>%{APPNAME}Base</cstring>
+ </property>
+ <property stdset="1">
+ <name>geometry</name>
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>196</width>
+ <height>245</height>
+ </rect>
+ </property>
+ <property stdset="1">
+ <name>caption</name>
+ <string>%{APPNAME}</string>
+ </property>
+ <vbox>
+
+ <widget>
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&lt;p&gt;This is just an &lt;i&gt;%{APPNAMELC}&lt;/i&gt;; it does not do anything interesting at all.</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>quit</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Quit</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/app_templates/qtopiaapp/main.cpp b/languages/cpp/app_templates/qtopiaapp/main.cpp
new file mode 100644
index 00000000..0311a32e
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/main.cpp
@@ -0,0 +1,13 @@
+
+#include "%{APPNAMELC}.h"
+#include <qpe/qpeapplication.h>
+
+int main( int argc, char ** argv )
+{
+ QPEApplication a( argc, argv );
+
+ %{APPNAME} mw;
+ a.showMainWidget( &mw );
+
+ return a.exec();
+}
diff --git a/languages/cpp/app_templates/qtopiaapp/qtopiaapp b/languages/cpp/app_templates/qtopiaapp/qtopiaapp
new file mode 100644
index 00000000..e07d8627
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/qtopiaapp
@@ -0,0 +1,11 @@
+# TMake application
+[General]
+Name=Qtopia Application
+Name[fr]=Une Application Qtopia
+Icon=qmakeapp.png
+Category=C++/Embedded
+Category[fr]=C++/Environnement embarqué
+Comment=Generate a TMake/Qt based application for Qtopia 1.x
+Comment[fr]=Génère une application basée sur Qt / TMake pour l'environnement Qtopia 1.x.
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=APPNAMELC.cpp
diff --git a/languages/cpp/app_templates/qtopiaapp/qtopiaapp.kdevtemplate b/languages/cpp/app_templates/qtopiaapp/qtopiaapp.kdevtemplate
new file mode 100644
index 00000000..45479b04
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/qtopiaapp.kdevtemplate
@@ -0,0 +1,153 @@
+# KDE Config File
+[General]
+Name=Qtopia Application
+Name[ca]=Aplicació per a Qtopia
+Name[da]=Qtopia-program
+Name[de]=Qtopia-Anwendung
+Name[el]=ΕφαÏμογή Qtopia
+Name[es]=Aplicación para Qtopia
+Name[et]=Qtopia rakendus
+Name[eu]=Qtopia aplikazioa
+Name[fa]=کاربرد Qtopia
+Name[fr]=Application Qtopia
+Name[ga]=Feidhmchlár Qtopia
+Name[gl]=Aplicación Qtopia
+Name[hu]=Qtopia-alkalmazás
+Name[it]=Applicazione Qtopia
+Name[ja]=Qtopia アプリケーション
+Name[nds]=Qtopia-Programm
+Name[ne]=Qtopia अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Qtopia-toepassing
+Name[pl]=Program wykorzystujÄ…cy QtopiÄ™
+Name[pt]=Aplicação do Qtopia
+Name[pt_BR]=Aplicação do Qtopia
+Name[ru]=Приложение Qtopia
+Name[sk]=Qtopia aplikácia
+Name[sl]=Program za Qtopio
+Name[sr]=Qtopia програм
+Name[sr@Latn]=Qtopia program
+Name[sv]=Qtopia-program
+Name[tr]=Qtopia Uygulaması
+Name[zh_CN]=Qtopia 应用程åº
+Name[zh_TW]=Qtopia 應用程å¼
+Icon=qmakeapp.png
+Category=C++/Embedded
+Category[fr]=C++/Environnement embarqué
+Comment=Generate a TMake/Qt based application for Qtopia 1.x
+Comment[ca]=Genera una aplicació basada en TMake/Qt per a Qtopia 1.x
+Comment[da]=Generér et TMake/Qt baseret program for Qtopia 1.x
+Comment[de]=Erstellt eine auf TMake/Qt basierende Anwendung für Qtopia 1.x
+Comment[el]=ΔημιουÏγία μιας εφαÏμογής βασισμένης στα TMake/Qt για το Qtopia 1.x
+Comment[es]=Genera una aplicación basada en TMake/Qt para Qtopia 1.x
+Comment[et]=Qtopia 1.x rakenduse loomine TMake'i/Qt põhjal
+Comment[eu]= Sortu TMake/Qt software-ean oinarritutako Qtopia 1.x aplikazio bat
+Comment[fa]=یک کاربرد بر مبنای TMake/Qt برای Qtopia 1.x تولید می‌کند
+Comment[fr]=Génère une application basée sur TMake / Qt pour Qtopia 1.x
+Comment[ga]=Cruthaigh feidhmchlár bunaithe ar TMake/Qt le haghaidh Qtopia 1.x
+Comment[gl]=Xera unha aplicación baseada en TMake/Qt para Qtopia 1.x
+Comment[hu]=Létrehoz egy TMake/Qt-alapú alkalmazást a Qtopia 1.x rendszerhez
+Comment[it]=Genera un'applicazione basata su TMake/Qt per Qtopia 1.x
+Comment[ja]=Qtopia 1.x 用㮠TMake/Qt ベースã®ã‚¢ãƒ—リケーションを作æˆ
+Comment[nds]=Stellt en op TMake/Qt opbuut Programm för Qtopia 1.x op
+Comment[ne]= Qtopia 1.x का लागि TMake/Qt आधारित अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Genereert een Tmake/Qt-gebaseerde toepassing voor Qtopie 1.x
+Comment[pl]=Generuje program wykorzystujÄ…cy TMake i Qt dla Qtopii 1.x
+Comment[pt]=Gera uma aplicação, baseada no TMake/Qt, para o Qtopia 1.x
+Comment[pt_BR]=Gera uma aplicação, baseada no TMake/Qt, para o Qtopia 1.x
+Comment[ru]=Создание Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Qt Ñо Ñборкой поÑредÑтвом TMake Ð´Ð»Ñ Qtopia 1.x
+Comment[sk]=Vygeneruje aplikáciu založenú na TMake/Qt pre Qtopia 1.x
+Comment[sr]=Прави програм за Qtopia-у 1.x на оÑновуTMake-а/Qt-а
+Comment[sr@Latn]=Pravi program za Qtopia-u 1.x na osnovuTMake-a/Qt-a
+Comment[sv]=Skapa ett TMake/Qt-baserat program för Qtopia 1.x
+Comment[tr]=Qtopia 1.x için TMake/Qt tabanlı bir uygulama yarat
+Comment[zh_CN]=生æˆé€‚用于 Qtopia 1.x 基于 TMake/Qt 的应用程åº
+Comment[zh_TW]=產生一個 Qtopia 1.x çš„ TMake/Qt 應用程å¼
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.cpp
+Archive=qtopiaapp.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/Example.png
+Dest=%{dest}/%{APPNAME}.png
+Process=false
+
+[FILE3]
+Type=install
+Source=%{src}/app.pro
+Dest=%{dest}/%{APPNAMELC}.pro
+
+[FILE4]
+Type=install
+Source=%{src}/example.cpp
+Dest=%{dest}/%{APPNAMELC}.cpp
+
+[FILE5]
+Type=install
+Source=%{src}/example.h
+Dest=%{dest}/%{APPNAMELC}.h
+
+[FILE6]
+Type=install
+EscapeXML=true
+Source=%{src}/examplebase.ui
+Dest=%{dest}/%{APPNAMELC}base.ui
+
+[FILE7]
+Type=install
+Source=%{src}/example.control
+Dest=%{dest}/%{APPNAMELC}.control
+
+[FILE8]
+Type=install
+Source=%{src}/example.desktop
+Dest=%{dest}/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+EscapeXML=true
+Source=%{src}/example.html
+Dest=%{dest}/%{APPNAMELC}.html
+
+[FILE10]
+Type=install
+Source=%{src}/main.cpp
+Dest=%{dest}/main.cpp
+
+[MSG]
+Type=message
+Comment=A Qtopia application was created in %{dest}
+Comment[ca]=Una aplicació basada en Qtopia ha estat creada en %{dest}
+Comment[da]=Et Qtopia program blev oprettet i %{dest}
+Comment[de]=Eine Qtopia-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή Qtopia δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación para Qtopia ha sido creada en %{dest}
+Comment[et]=Qtopia rakendus loodi asukohta %{dest}
+Comment[eu]=Qtopia aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد Qtopia در %{dest} ایجاد شد
+Comment[fr]=Une application Qtopia a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár Qtopia i %{dest}
+Comment[gl]=Creouse unha aplicación Qtopia en %{dest}
+Comment[hu]=Létrejött egy Qtopia-alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Qtopia in %{dest}
+Comment[ja]=Qtopia アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Qtopia-Programm opstellt
+Comment[ne]=Qtopia अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Qtopia-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program wykorzystujący Qtopię został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação do Qtopia em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação do Qtopia em %{dest}
+Comment[ru]=Приложение Qtopia Ñоздано в %{dest}
+Comment[sk]=Qtopia aplikácia bola vytvorená v %{dest}
+Comment[sr]=Qtopia програм је направљен у %{dest}
+Comment[sr@Latn]=Qtopia program je napravljen u %{dest}
+Comment[sv]=Ett Qtopia-program skapades i %{dest}
+Comment[tr]=Bir Qtopia uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了 Qtopia 应用程åº
+Comment[zh_TW]=一個 Qtopia 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/qtopiaapp/qtopiaapp.png b/languages/cpp/app_templates/qtopiaapp/qtopiaapp.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/cpp/app_templates/qtopiaapp/qtopiaapp.png
Binary files differ
diff --git a/languages/cpp/app_templates/win32gui/.kdev_ignore b/languages/cpp/app_templates/win32gui/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/.kdev_ignore
diff --git a/languages/cpp/app_templates/win32gui/Makefile.am b/languages/cpp/app_templates/win32gui/Makefile.am
new file mode 100644
index 00000000..66931bfd
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = app.cpp src-Makefile.am win32gui-Makefile.am win32gui-Makefile.cvs \
+ win32gui-configure.in win32gui.png app.kdevelop
+
+templateName = win32gui
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/win32gui/app.cpp b/languages/cpp/app_templates/win32gui/app.cpp
new file mode 100644
index 00000000..a875b28b
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/app.cpp
@@ -0,0 +1,12 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <windows.h>
+
+int STDCALL
+WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
+{
+ MessageBox (NULL, "Hello, Windows!", "Hello", MB_OK);
+ return 0;
+}
+
diff --git a/languages/cpp/app_templates/win32gui/app.kdevelop b/languages/cpp/app_templates/win32gui/app.kdevelop
new file mode 100644
index 00000000..f9dc8145
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/app.kdevelop
@@ -0,0 +1,192 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description></description>
+ <ignoreparts/>
+ <secondaryLanguages/>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}.exe</mainprogram>
+ <terminal>false</terminal>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <programargs></programargs>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ <envvars>
+ <envvar value="i586-mingw32msvc-c" name="CC" />
+ <envvar value="i586-mingw32msvc-c++" name="CXX" />
+ <envvar value="i586-mingw32msvc-ld" name="LD" />
+ </envvars>
+ <configargs></configargs>
+ <topsourcedir></topsourcedir>
+ <cppflags></cppflags>
+ <ccompilerbinary></ccompilerbinary>
+ <cxxcompilerbinary></cxxcompilerbinary>
+ <f77compilerbinary></f77compilerbinary>
+ <cflags></cflags>
+ <f77flags></f77flags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ <envvars>
+ <envvar value="i586-mingw32msvc-c" name="CC" />
+ <envvar value="i586-mingw32msvc-c++" name="CXX" />
+ <envvar value="i586-mingw32msvc-ld" name="LD" />
+ </envvars>
+ <topsourcedir></topsourcedir>
+ <cppflags></cppflags>
+ <ccompilerbinary></ccompilerbinary>
+ <cxxcompilerbinary></cxxcompilerbinary>
+ <f77compilerbinary></f77compilerbinary>
+ <cflags></cflags>
+ <f77flags></f77flags>
+ </debug>
+ <default>
+ <envvars>
+ <envvar value="i586-mingw32msvc-c" name="CC" />
+ <envvar value="i586-mingw32msvc-c++" name="CXX" />
+ <envvar value="i586-mingw32msvc-ld" name="LD" />
+ </envvars>
+ <configargs></configargs>
+ <builddir></builddir>
+ <topsourcedir></topsourcedir>
+ <cppflags></cppflags>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevpgf77options</f77compiler>
+ <ccompilerbinary></ccompilerbinary>
+ <cxxcompilerbinary></cxxcompilerbinary>
+ <f77compilerbinary></f77compilerbinary>
+ <cflags></cflags>
+ <cxxflags></cxxflags>
+ <f77flags></f77flags>
+ </default>
+ </configurations>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>true</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ <prio>0</prio>
+ </make>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>clanlib</toc>
+ <toc>opengl</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.h" name="Header files" />
+ <group pattern="*.cpp" name="Source files" />
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevcppsupport>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ <references>
+ <pcs>Qt</pcs>
+ <pcs>KDElibs</pcs>
+ <pcs>ksjembed</pcs>
+ </references>
+ </kdevcppsupport>
+ <kdevdebugger>
+ <general>
+ <programargs></programargs>
+ <gdbpath></gdbpath>
+ <dbgshell></dbgshell>
+ <configGdbScript></configGdbScript>
+ <runShellScript></runShellScript>
+ <runGdbScript></runGdbScript>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/win32gui/src-Makefile.am b/languages/cpp/app_templates/win32gui/src-Makefile.am
new file mode 100644
index 00000000..21f6d7c8
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/src-Makefile.am
@@ -0,0 +1,8 @@
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+# set the include path found by configure
+INCLUDES= $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = -mwindows $(all_libraries)
diff --git a/languages/cpp/app_templates/win32gui/win32gui-Makefile.am b/languages/cpp/app_templates/win32gui/win32gui-Makefile.am
new file mode 100644
index 00000000..02520f20
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/win32gui-Makefile.am
@@ -0,0 +1,5 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = src
diff --git a/languages/cpp/app_templates/win32gui/win32gui-Makefile.cvs b/languages/cpp/app_templates/win32gui/win32gui-Makefile.cvs
new file mode 100644
index 00000000..d1607023
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/win32gui-Makefile.cvs
@@ -0,0 +1,8 @@
+default: all
+
+all:
+ aclocal
+ autoheader
+ automake
+ autoconf
+
diff --git a/languages/cpp/app_templates/win32gui/win32gui-configure.in b/languages/cpp/app_templates/win32gui/win32gui-configure.in
new file mode 100644
index 00000000..612ce0d5
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/win32gui-configure.in
@@ -0,0 +1,10 @@
+AC_INIT(configure.in)
+
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+
+AC_LANG_CPLUSPLUS
+AC_PROG_CXX
+AM_PROG_LIBTOOL
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/cpp/app_templates/win32gui/win32gui.kdevtemplate b/languages/cpp/app_templates/win32gui/win32gui.kdevtemplate
new file mode 100644
index 00000000..0a600294
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/win32gui.kdevtemplate
@@ -0,0 +1,137 @@
+# KDE Config File
+[General]
+Name=Simple Win32 GUI App.
+Name[ca]=Simple aplicació per a Win32.
+Name[da]=Simpelt Win32 GUI-program.
+Name[de]=Einfache Win32-GUI-Anwendung
+Name[el]=Απλή εφαÏμογή γÏÎ±Ï†Î¹ÎºÎ¿Ï Ï€ÎµÏιβάλλοντος Win32.
+Name[es]=Aplicación sencilla para Win32
+Name[et]=Lihtne Win32 graafilise kasutajaliidese rakendus
+Name[eu]=Win32 GUI aplikazio sinplea.
+Name[fa]=کاربرد سادۀ ونک Win32
+Name[fr]=Interface graphique Win32 simple.
+Name[ga]=Feidhmchlár Simplí Win32 le Comhéadan Grafach
+Name[gl]=Aplicación sinxela Win32.
+Name[hu]=Egyszerű Win32-alapú, grafikus felületű alkalmazás
+Name[it]=Semplice applicazione GUI Win32.
+Name[ja]=ç°¡å˜ãª Win32 GUI アプリケーション
+Name[nds]=Eenfach Win32-Böversietprogramm.
+Name[ne]=साधारण Win32 GUI अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Eenvoudige Win32 GUI-toepassing
+Name[pl]=Prosty program Win32
+Name[pt]=Aplicação gráfica simples em Win32.
+Name[pt_BR]=Aplicação gráfica simples em Win32.
+Name[ru]=ПроÑтое графичеÑкое приложение Windows
+Name[sk]=Jednoduchá Win32 GUI aplikácia
+Name[sr]=ЈедноÑтаван Win32 програм Ñа GUI-јем.
+Name[sr@Latn]=Jednostavan Win32 program sa GUI-jem.
+Name[sv]=Enkelt Win32-program med grafiskt gränssnitt
+Name[tr]=Basit Win32 Grafik Arayüz Uygulaması
+Name[zh_CN]=简å•çš„ Win32 GUI 应用程åº
+Name[zh_TW]=簡單的 Win32 使用者介é¢æ‡‰ç”¨ç¨‹å¼
+Icon=win32gui.png
+Category=C++
+Comment=Generates a shell project for crosscompiling Win32 projects.
+Comment[ca]=Genera un projecte d'intèrpret de comandaments per a la compilació multi plataforma de projectes per a Win32.
+Comment[da]=Genererer et skalprojekt for krydskompilering af Win32-projekter.
+Comment[de]=Erstellt ein Shell-Projekt für plattformunabhängige Win32-Projekte.
+Comment[el]=ΔημιουÏγία ενός έÏγου κελÏφους για μεταγλώττιση έÏγων Win32 σε διαφοÏετικές πλατφόÏμες.
+Comment[es]=Genera un proyecto de intérprete de órdenes para compilación multiplataforma de proyectos Win32.
+Comment[et]=Shelliprojekti loomine Win32 projektide kompileerimiseks.
+Comment[eu]=Win32 proiektuak konpilazio gurutzaturako shell proiektu bat sortzen du.
+Comment[fa]=یک پروژۀ پوسته برای پروژه‌های Win32 ترجمۀ بین سکویی تولید می‌کند.
+Comment[fr]=Génère un projet shell pour la compilation croisée de projets Win32.
+Comment[gl]=Xera un proxecto shell para a compilación cruzada de proxectos Win32.
+Comment[hu]=Létrehoz egy konzolos projektet Win32-projektek keresztfordításához.
+Comment[it]=Genera un progetto di shell per progetti Win32 multi compilanti.
+Comment[nds]=Stellt en Konsoolprojekt för't Krüüzkompileren vun Win32-Projekten op.
+Comment[ne]=कà¥à¤°à¤¸à¤•à¤®à¥à¤ªà¤¾à¤‡à¤²à¤¿à¤™ Win32 परियोजनाका लागि शेल परियोजना उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een shellproject voor crosscompilerende Win32-projecten.
+Comment[pl]=Generuje powłokę do kompilacji projektów dla Win32.
+Comment[pt]=Gera um projecto para poder compilar projectos em Win32.
+Comment[pt_BR]=Gera um projecto para poder compilar projectos em Win32.
+Comment[ru]=Создание проекта Ð´Ð»Ñ ÐºÑ€Ð¾ÑÑ-компилÑции проектов Win32.
+Comment[sk]=Vygenruje shell projekt pre kompiláciu Win32 projektov.
+Comment[sr]=Прави пројекат за прекопревођење Win32 пројеката.
+Comment[sr@Latn]=Pravi projekat za prekoprevođenje Win32 projekata.
+Comment[sv]=Skapar ett skalprojekt för korskompilering av Win32-projekt.
+Comment[tr]=Win32 projelerini karşıderlemek için bir kabul projesi yarat.
+Comment[zh_CN]=生æˆè·¨å¹³å°ç¼–译的 Win32 工程的外壳工程。
+Comment[zh_TW]=產生一個 shell 專案,å¯åœ¨ Win32 跨平å°ç·¨è­¯ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/%{APPNAMELC}.cpp
+Archive=win32gui.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/win32gui-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/win32gui-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE4]
+Type=install
+Source=%{src}/win32gui-configure.in
+Dest=%{dest}/configure.in
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[MSG]
+Type=message
+Comment=For this project to compile and run you need both Wine and MinGW installed.
+Comment[ca]=Per a compilar i executar aquest projecte us caldrà instal·lar Wine i MinGW.
+Comment[da]=For at dette projekt skal kompilere og køre har du brug for at have både Wine og MinGW installeret.
+Comment[de]=Um dieses Projekt kompilieren und ausführen zu können, muss sowohl Wine als auch MinGW installiert sein.
+Comment[el]=Για να μεταγλωττιστεί και να εκτελεστεί αυτό το έÏγο χÏειάζεστε τόσο το Wine όσο και το MinGW εγκατεστημένα.
+Comment[es]=Para compilar y ejecutar este proyecto necesitará tener instalados Wine y MinGW.
+Comment[et]=Selle projekti kompileerimiseks ja käivitamiseks peab olema paigaldatud nii Wine kui MinGW.
+Comment[eu]=Proiektu hau konpilatzeko eta exekutatzeko Wine eta MinGw instalatuta izan behar dituzu.
+Comment[fa]=برای ترجمه و اجرای این پروژه، هم نیاز به نصب Wine و هم نیاز به MinGW دارید.
+Comment[fr]=Pour que ce projet compile et s'exécute, vous devez installer Wine et MinGW.
+Comment[gl]=Para poder compilar e executar este proxecto necesita ter instalados Wine e MinGW.
+Comment[hu]=A projekt lefordításához és futtatásához szükség van a Wine és a MinGW telepítésére.
+Comment[it]=Per compilare ed eseguire questo progetto dei avere sia Wine che MinGW installati.
+Comment[nds]=Wine un MinGW mööt installeert wesen, wenn Du dit Projekt kompileren un utföhren wullt.
+Comment[ne]=यो परियोजनाका लागि कमà¥à¤ªà¤¾à¤‡à¤² गरà¥à¤¨ र चलाउन तपाईà¤à¤²à¥‡ वाइन र MinGW सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरेको हà¥à¤¨à¥à¤ªà¤°à¥à¤¦à¤› ।
+Comment[nl]=Om dit project te kunnen compileren en uitvoeren hebt u Wine en MinGW nodig.
+Comment[pl]=Do kompilacji takiego projektu potrzebne sÄ… Wine oraz MinGW.
+Comment[pt]=Para este projecto poder ser compilado e executado é necessário ter tanto o Wine como o MinGW instalados.
+Comment[pt_BR]=Para este projecto poder ser compilado e executado é necessário ter tanto o Wine como o MinGW instalados.
+Comment[ru]=Ð”Ð»Ñ Ñборки и запуÑка Ñтого проекта вам необходимо уÑтановить Wine и MinGW .
+Comment[sk]=Na kompiláciu tohoto projektu potrebujete mať nainštalované Wine a MinGW.
+Comment[sr]=Да би Ñе овај пројекат превео и покренуо, и Wine и MinGW морају бити инÑталирани.
+Comment[sr@Latn]=Da bi se ovaj projekat preveo i pokrenuo, i Wine i MinGW moraju biti instalirani.
+Comment[sv]=För att projektet ska kompileras och köras behöver du ha installerat både Wine och MinGW.
+Comment[tr]=Bu projenin derlenmesi için Wine ve MinGW'nin kurulu olması lazım.
+Comment[zh_CN]=è¦è®©æ­¤å·¥ç¨‹èƒ½å¤Ÿç¼–译并è¿è¡Œï¼Œæ‚¨éœ€è¦åŒæ—¶å®‰è£… Wine å’Œ MinGW。
+Comment[zh_TW]=這個專案è¦ç·¨è­¯ï¼Œæ‚¨éœ€è¦å®‰è£ Wine 與 MinGW。
+
diff --git a/languages/cpp/app_templates/win32gui/win32gui.png b/languages/cpp/app_templates/win32gui/win32gui.png
new file mode 100644
index 00000000..901ee474
--- /dev/null
+++ b/languages/cpp/app_templates/win32gui/win32gui.png
Binary files differ
diff --git a/languages/cpp/app_templates/win32hello/.kdev_ignore b/languages/cpp/app_templates/win32hello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/.kdev_ignore
diff --git a/languages/cpp/app_templates/win32hello/Makefile.am b/languages/cpp/app_templates/win32hello/Makefile.am
new file mode 100644
index 00000000..d6c7dfad
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = app.cpp src-Makefile.am win32-Makefile.am win32-Makefile.cvs \
+ win32-configure.in win32hello.png app.kdevelop
+
+templateName = win32hello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/cpp/app_templates/win32hello/app.cpp b/languages/cpp/app_templates/win32hello/app.cpp
new file mode 100644
index 00000000..10b02750
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/app.cpp
@@ -0,0 +1,16 @@
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+#include <cstdlib>
+
+using namespace std;
+
+int main(int argc, char *argv[])
+{
+ cout << "Hello, from Win32!" << endl;
+
+ return EXIT_SUCCESS;
+}
diff --git a/languages/cpp/app_templates/win32hello/app.kdevelop b/languages/cpp/app_templates/win32hello/app.kdevelop
new file mode 100644
index 00000000..33c1e97e
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/app.kdevelop
@@ -0,0 +1,164 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description></description>
+ <ignoreparts/>
+ <secondaryLanguages/>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>default</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}.exe</mainprogram>
+ <terminal>true</terminal>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <programargs/>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ <envvars>
+ <envvar value="i586-mingw32msvc-c" name="CC" />
+ <envvar value="i586-mingw32msvc-c++" name="CXX" />
+ <envvar value="i586-mingw32msvc-ld" name="LD" />
+ </envvars>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ <envvars>
+ <envvar value="i586-mingw32msvc-c" name="CC" />
+ <envvar value="i586-mingw32msvc-c++" name="CXX" />
+ <envvar value="i586-mingw32msvc-ld" name="LD" />
+ </envvars>
+ </debug>
+ <default>
+ <envvars>
+ <envvar value="i586-mingw32msvc-c" name="CC" />
+ <envvar value="i586-mingw32msvc-c++" name="CXX" />
+ <envvar value="i586-mingw32msvc-ld" name="LD" />
+ </envvars>
+ </default>
+ </configurations>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>true</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ <prio>0</prio>
+ </make>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>clanlib</toc>
+ <toc>opengl</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.h" name="Header files" />
+ <group pattern="*.cpp" name="Source files" />
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevcppsupport>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ <references>
+ <pcs>Qt</pcs>
+ <pcs>KDElibs</pcs>
+ <pcs>ksjembed</pcs>
+ </references>
+ </kdevcppsupport>
+ <kdevdebugger>
+ <general>
+ <programargs></programargs>
+ <gdbpath></gdbpath>
+ <dbgshell></dbgshell>
+ <configGdbScript></configGdbScript>
+ <runShellScript></runShellScript>
+ <runGdbScript></runGdbScript>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/win32hello/src-Makefile.am b/languages/cpp/app_templates/win32hello/src-Makefile.am
new file mode 100644
index 00000000..21f6d7c8
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/src-Makefile.am
@@ -0,0 +1,8 @@
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+# set the include path found by configure
+INCLUDES= $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = -mwindows $(all_libraries)
diff --git a/languages/cpp/app_templates/win32hello/win32-Makefile.am b/languages/cpp/app_templates/win32hello/win32-Makefile.am
new file mode 100644
index 00000000..02520f20
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/win32-Makefile.am
@@ -0,0 +1,5 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = src
diff --git a/languages/cpp/app_templates/win32hello/win32-Makefile.cvs b/languages/cpp/app_templates/win32hello/win32-Makefile.cvs
new file mode 100644
index 00000000..d1607023
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/win32-Makefile.cvs
@@ -0,0 +1,8 @@
+default: all
+
+all:
+ aclocal
+ autoheader
+ automake
+ autoconf
+
diff --git a/languages/cpp/app_templates/win32hello/win32-configure.in b/languages/cpp/app_templates/win32hello/win32-configure.in
new file mode 100644
index 00000000..612ce0d5
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/win32-configure.in
@@ -0,0 +1,10 @@
+AC_INIT(configure.in)
+
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+
+AC_LANG_CPLUSPLUS
+AC_PROG_CXX
+AM_PROG_LIBTOOL
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/cpp/app_templates/win32hello/win32hello.kdevtemplate b/languages/cpp/app_templates/win32hello/win32hello.kdevtemplate
new file mode 100644
index 00000000..b6fb54d2
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/win32hello.kdevtemplate
@@ -0,0 +1,136 @@
+# KDE Config File
+[General]
+Name=Simple Win32 Hello World
+Name[ca]=Simple Hello World per a Win32
+Name[da]=Simpelt Win32 Goddag verden
+Name[de]=Einfaches Win32-"Hello World"-Programm
+Name[el]=Απλό Γεια σου Κόσμε Win32
+Name[es]=Sencillo programa «Hola mundo» para Win32
+Name[et]=Lihtne Win32 "Tere, maailm"
+Name[eu]=Win32 "Kaixo mundua" aplikazio sinple bat
+Name[fa]=Hello World سادۀ Win32
+Name[fr]=« Bonjour monde » Win32 simple
+Name[ga]=Ríomhchlár simplí "Hello World" le haghaidh Win32
+Name[gl]=Aplicación Win32 sinxela Ola mundo
+Name[hu]=Win32-alapú Hello world program
+Name[it]=Semplice "Hello World" Win32
+Name[nds]=Eenfach Win32-"Moin Welt"-Programm
+Name[ne]=साधारण Win32 हेलà¥à¤²à¥‹ वोलà¥à¤¡
+Name[nl]=Eenvoudige Win32 Hello World
+Name[pl]=Prosty program Witaj świecie dla Win32
+Name[pt]=Olá Mundo Simples em Win32
+Name[pt_BR]=Olá Mundo Simples em Win32
+Name[ru]=ПроÑтое приложение Hello World Ð´Ð»Ñ Windows
+Name[sk]=Jenoduchý Ahoj svet Win32 program
+Name[sr]=ЈедноÑтаван Win32 „Здраво Ñвете“
+Name[sr@Latn]=Jednostavan Win32 „Zdravo svete“
+Name[sv]=Enkelt Win32 Hello World
+Name[tr]=Basit Win32 Merhaba Dünya
+Name[zh_CN]=简å•çš„ Win32 Hello World
+Name[zh_TW]=簡單的 Win32 Hello World
+Icon=win32hello.png
+Category=C++
+Comment=Generates a shell project for crosscompiling Win32 projects.
+Comment[ca]=Genera un projecte d'intèrpret de comandaments per a la compilació multi plataforma de projectes per a Win32.
+Comment[da]=Genererer et skalprojekt for krydskompilering af Win32-projekter.
+Comment[de]=Erstellt ein Shell-Projekt für plattformunabhängige Win32-Projekte.
+Comment[el]=ΔημιουÏγία ενός έÏγου κελÏφους για μεταγλώττιση έÏγων Win32 σε διαφοÏετικές πλατφόÏμες.
+Comment[es]=Genera un proyecto de intérprete de órdenes para compilación multiplataforma de proyectos Win32.
+Comment[et]=Shelliprojekti loomine Win32 projektide kompileerimiseks.
+Comment[eu]=Win32 proiektuak konpilazio gurutzaturako shell proiektu bat sortzen du.
+Comment[fa]=یک پروژۀ پوسته برای پروژه‌های Win32 ترجمۀ بین سکویی تولید می‌کند.
+Comment[fr]=Génère un projet shell pour la compilation croisée de projets Win32.
+Comment[gl]=Xera un proxecto shell para a compilación cruzada de proxectos Win32.
+Comment[hu]=Létrehoz egy konzolos projektet Win32-projektek keresztfordításához.
+Comment[it]=Genera un progetto di shell per progetti Win32 multi compilanti.
+Comment[nds]=Stellt en Konsoolprojekt för't Krüüzkompileren vun Win32-Projekten op.
+Comment[ne]=कà¥à¤°à¤¸à¤•à¤®à¥à¤ªà¤¾à¤‡à¤²à¤¿à¤™ Win32 परियोजनाका लागि शेल परियोजना उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een shellproject voor crosscompilerende Win32-projecten.
+Comment[pl]=Generuje powłokę do kompilacji projektów dla Win32.
+Comment[pt]=Gera um projecto para poder compilar projectos em Win32.
+Comment[pt_BR]=Gera um projecto para poder compilar projectos em Win32.
+Comment[ru]=Создание проекта Ð´Ð»Ñ ÐºÑ€Ð¾ÑÑ-компилÑции проектов Win32.
+Comment[sk]=Vygenruje shell projekt pre kompiláciu Win32 projektov.
+Comment[sr]=Прави пројекат за прекопревођење Win32 пројеката.
+Comment[sr@Latn]=Pravi projekat za prekoprevođenje Win32 projekata.
+Comment[sv]=Skapar ett skalprojekt för korskompilering av Win32-projekt.
+Comment[tr]=Win32 projelerini karşıderlemek için bir kabul projesi yarat.
+Comment[zh_CN]=生æˆè·¨å¹³å°ç¼–译的 Win32 工程的外壳工程。
+Comment[zh_TW]=產生一個 shell 專案,å¯åœ¨ Win32 跨平å°ç·¨è­¯ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+ShowFilesAfterGeneration=src/%{APPNAMELC}.cpp
+Archive=win32hello.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/win32-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/win32-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE4]
+Type=install
+Source=%{src}/win32-configure.in
+Dest=%{dest}/configure.in
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[MSG]
+Type=message
+Comment=For this project to compile and run you need both Wine and MinGW installed.
+Comment[ca]=Per a compilar i executar aquest projecte us caldrà instal·lar Wine i MinGW.
+Comment[da]=For at dette projekt skal kompilere og køre har du brug for at have både Wine og MinGW installeret.
+Comment[de]=Um dieses Projekt kompilieren und ausführen zu können, muss sowohl Wine als auch MinGW installiert sein.
+Comment[el]=Για να μεταγλωττιστεί και να εκτελεστεί αυτό το έÏγο χÏειάζεστε τόσο το Wine όσο και το MinGW εγκατεστημένα.
+Comment[es]=Para compilar y ejecutar este proyecto necesitará tener instalados Wine y MinGW.
+Comment[et]=Selle projekti kompileerimiseks ja käivitamiseks peab olema paigaldatud nii Wine kui MinGW.
+Comment[eu]=Proiektu hau konpilatzeko eta exekutatzeko Wine eta MinGw instalatuta izan behar dituzu.
+Comment[fa]=برای ترجمه و اجرای این پروژه، هم نیاز به نصب Wine و هم نیاز به MinGW دارید.
+Comment[fr]=Pour que ce projet compile et s'exécute, vous devez installer Wine et MinGW.
+Comment[gl]=Para poder compilar e executar este proxecto necesita ter instalados Wine e MinGW.
+Comment[hu]=A projekt lefordításához és futtatásához szükség van a Wine és a MinGW telepítésére.
+Comment[it]=Per compilare ed eseguire questo progetto dei avere sia Wine che MinGW installati.
+Comment[nds]=Wine un MinGW mööt installeert wesen, wenn Du dit Projekt kompileren un utföhren wullt.
+Comment[ne]=यो परियोजनाका लागि कमà¥à¤ªà¤¾à¤‡à¤² गरà¥à¤¨ र चलाउन तपाईà¤à¤²à¥‡ वाइन र MinGW सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरेको हà¥à¤¨à¥à¤ªà¤°à¥à¤¦à¤› ।
+Comment[nl]=Om dit project te kunnen compileren en uitvoeren hebt u Wine en MinGW nodig.
+Comment[pl]=Do kompilacji takiego projektu potrzebne sÄ… Wine oraz MinGW.
+Comment[pt]=Para este projecto poder ser compilado e executado é necessário ter tanto o Wine como o MinGW instalados.
+Comment[pt_BR]=Para este projecto poder ser compilado e executado é necessário ter tanto o Wine como o MinGW instalados.
+Comment[ru]=Ð”Ð»Ñ Ñборки и запуÑка Ñтого проекта вам необходимо уÑтановить Wine и MinGW .
+Comment[sk]=Na kompiláciu tohoto projektu potrebujete mať nainštalované Wine a MinGW.
+Comment[sr]=Да би Ñе овај пројекат превео и покренуо, и Wine и MinGW морају бити инÑталирани.
+Comment[sr@Latn]=Da bi se ovaj projekat preveo i pokrenuo, i Wine i MinGW moraju biti instalirani.
+Comment[sv]=För att projektet ska kompileras och köras behöver du ha installerat både Wine och MinGW.
+Comment[tr]=Bu projenin derlenmesi için Wine ve MinGW'nin kurulu olması lazım.
+Comment[zh_CN]=è¦è®©æ­¤å·¥ç¨‹èƒ½å¤Ÿç¼–译并è¿è¡Œï¼Œæ‚¨éœ€è¦åŒæ—¶å®‰è£… Wine å’Œ MinGW。
+Comment[zh_TW]=這個專案è¦ç·¨è­¯ï¼Œæ‚¨éœ€è¦å®‰è£ Wine 與 MinGW。
+
diff --git a/languages/cpp/app_templates/win32hello/win32hello.png b/languages/cpp/app_templates/win32hello/win32hello.png
new file mode 100644
index 00000000..3f33a1b5
--- /dev/null
+++ b/languages/cpp/app_templates/win32hello/win32hello.png
Binary files differ
diff --git a/languages/cpp/app_templates/wxhello/.kdev_ignore b/languages/cpp/app_templates/wxhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/.kdev_ignore
diff --git a/languages/cpp/app_templates/wxhello/Makefile.am b/languages/cpp/app_templates/wxhello/Makefile.am
new file mode 100644
index 00000000..5f1a213a
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = src-Makefile.am app.cpp app.h app.kdevelop subdirs \
+ app.desktop wxhello.png
+
+templateName = wxhello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/cpp/app_templates/wxhello/app.cpp b/languages/cpp/app_templates/wxhello/app.cpp
new file mode 100644
index 00000000..6bcb3d47
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/app.cpp
@@ -0,0 +1,52 @@
+#include <wx/wx.h>
+#include "%{APPNAMELC}.h"
+
+BEGIN_EVENT_TABLE( %{APPNAME}Frame, wxFrame )
+ EVT_MENU( Menu_File_Quit, %{APPNAME}Frame::OnQuit )
+ EVT_MENU( Menu_File_About, %{APPNAME}Frame::OnAbout )
+END_EVENT_TABLE()
+
+IMPLEMENT_APP(%{APPNAME}app)
+
+
+bool
+%{APPNAME}app::OnInit()
+{
+ %{APPNAME}Frame *frame = new %{APPNAME}Frame( wxT( "Hello World" ), wxPoint(50,50), wxSize(450,340) );
+
+ frame->Show(TRUE);
+ SetTopWindow(frame);
+ return TRUE;
+}
+
+%{APPNAME}Frame::%{APPNAME}Frame( const wxString& title, const wxPoint& pos, const wxSize& size )
+ : wxFrame((wxFrame *)NULL, -1, title, pos, size)
+{
+ wxMenu *menuFile = new wxMenu;
+
+ menuFile->Append( Menu_File_About, wxT( "&About..." ) );
+ menuFile->AppendSeparator();
+ menuFile->Append( Menu_File_Quit, wxT( "E&xit" ) );
+
+ wxMenuBar *menuBar = new wxMenuBar;
+ menuBar->Append( menuFile, wxT( "&File" ) );
+
+ SetMenuBar( menuBar );
+
+ CreateStatusBar();
+ SetStatusText( wxT( "Welcome to Kdevelop wxWidgets app!" ) );
+}
+
+void
+%{APPNAME}Frame::OnQuit( wxCommandEvent& WXUNUSED( event ) )
+{
+ Close(TRUE);
+}
+
+void
+%{APPNAME}Frame::OnAbout( wxCommandEvent& WXUNUSED( event ) )
+{
+ wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ),
+ wxT( "About Hello World" ), wxOK | wxICON_INFORMATION, this );
+}
+
diff --git a/languages/cpp/app_templates/wxhello/app.desktop b/languages/cpp/app_templates/wxhello/app.desktop
new file mode 100644
index 00000000..e87774fa
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/app.desktop
@@ -0,0 +1,39 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+Icon=%{APPNAMELC}
+Type=Application
+Comment=A simple wxWidgets Application
+Comment[ca]=Una simple aplicació per a wxWidgets
+Comment[da]=Et simpelt wxWidgets program
+Comment[de]=Eine einfache wxWidgets-Anwendung
+Comment[el]=Μια απλή εφαÏμογή wxWidgets
+Comment[es]=Una aplicación wxWidgets sencilla
+Comment[et]=Lihtne wxWidgets rakendus
+Comment[eu]=wxWidgets aplikazio sinple bat
+Comment[fa]=یک کاربرد سادۀ wxWidgets
+Comment[fr]=Une application avec wxWidgets simple
+Comment[ga]=Feidhmchlár Simplí wxWidgets
+Comment[gl]=Unha aplicación sinxela wxWidgets
+Comment[hi]=à¤à¤• सादा डबà¥à¤²à¥à¤¯à¥‚à¤à¤•à¥à¤¸-विज़ेटà¥à¤¸ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=Egyszerű wxWidgets-alkalmazás
+Comment[is]=Einfalt wxWidgets forrit
+Comment[it]=Semplice applicazione wxWidgets
+Comment[ja]=シンプル㪠wxWidget アプリケーション
+Comment[nds]=En eenfach wxWidgets-Programm
+Comment[ne]=साधारण wxWidgets अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een eenvoudige wxWidgets-toepassing
+Comment[pl]=Prosty program wxWidgets
+Comment[pt]=Uma aplicação simples de wxWidgets
+Comment[pt_BR]=Um simples Aplicativo wxWidgets
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ wxWidgets
+Comment[sk]=Jednoduchá wxWidgets aplikácia
+Comment[sl]=Preprost program za wxWidgets
+Comment[sr]=ЈедноÑтаван wxWindows програм
+Comment[sr@Latn]=Jednostavan wxWindows program
+Comment[sv]=Ett enkelt wxWidgets-program
+Comment[ta]=சாதாரண wxசாளரஙà¯à®•à®³à¯ பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Гузориши оддии wxWidgets
+Comment[tr]=Basit bir Merhaba wmWidgets Uygulaması
+Comment[zh_CN]=一个简å•çš„ wxWidgets 应用程åº
+Comment[zh_TW]=簡單的 wxWidgets 應用程å¼
diff --git a/languages/cpp/app_templates/wxhello/app.h b/languages/cpp/app_templates/wxhello/app.h
new file mode 100644
index 00000000..cb4be988
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/app.h
@@ -0,0 +1,36 @@
+
+#ifndef _%{APPNAMEUC}_H_
+#define _%{APPNAMEUC}_H_
+
+/**
+ * @short Application Main Window
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+
+class
+%{APPNAME}app : public wxApp
+{
+ public:
+ virtual bool OnInit();
+};
+
+class
+%{APPNAME}Frame : public wxFrame
+{
+ public:
+ %{APPNAME}Frame( const wxString& title, const wxPoint& pos, const wxSize& size );
+ void OnQuit( wxCommandEvent& event );
+ void OnAbout( wxCommandEvent& event );
+
+ private:
+ DECLARE_EVENT_TABLE()
+};
+
+enum
+{
+ Menu_File_Quit = 100,
+ Menu_File_About
+};
+
+#endif // _%{APPNAMEUC}_H_
diff --git a/languages/cpp/app_templates/wxhello/app.kdevelop b/languages/cpp/app_templates/wxhello/app.kdevelop
new file mode 100644
index 00000000..77835163
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/app.kdevelop
@@ -0,0 +1,114 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>wxWidgets</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ </debug>
+ </configurations>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.rc" name="Resource file" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="rc" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/cpp/app_templates/wxhello/src-Makefile.am b/languages/cpp/app_templates/wxhello/src-Makefile.am
new file mode 100644
index 00000000..f93393e6
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/src-Makefile.am
@@ -0,0 +1,14 @@
+# these are the headers for your project
+noinst_HEADERS = %{APPNAMELC}.h
+
+#########################################################################
+# APPLICATION SECTION
+#########################################################################
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# the application source, library search path, and link libraries
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+%{APPNAMELC}_LDFLAGS = $(WX_LIBS)
+
diff --git a/languages/cpp/app_templates/wxhello/subdirs b/languages/cpp/app_templates/wxhello/subdirs
new file mode 100644
index 00000000..85de9cf9
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/subdirs
@@ -0,0 +1 @@
+src
diff --git a/languages/cpp/app_templates/wxhello/wxhello b/languages/cpp/app_templates/wxhello/wxhello
new file mode 100644
index 00000000..2e0d224f
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/wxhello
@@ -0,0 +1,105 @@
+# wxWidgets Config File
+[General]
+Name=Simple Hello wxWidgets Application
+Name[fr]=Un simple programme de test « Hello world »
+Category=C++/wxWidgets
+Comment=Generates a simple wxWidgets Hello application.
+Comment[fr]=Génère un simple programme de test du type « Hello world » en utilisant la bibliothéque wxWidgets.
+FileTemplates=h,CStyle,cpp,CStyle
+Icon=wxhello.png
+ShowFilesAfterGeneration=src/APPNAMELC.cpp
+
+[LICENSE]
+Type=install
+Source=%{src}/template-common/%{LICENSEFILE}
+Dest=%{dest}/%{LICENSEFILE}
+
+[GNU]
+Type=install archive
+Source=%{src}/template-common/gnu.tar.gz
+Dest=%{dest}
+
+[SRC]
+Type= mkdir
+Dir=%{dest}/src
+
+[DOCSDIR]
+Type=mkdir
+Dir=%{dest}/doc
+
+[DOCSDIREN]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[DOCSMAKEFILE.AM1]
+Type=install
+Source=%{src}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+Option=INSTALL_DOCS
+
+[DOCSMAKEFILE.AM2]
+Type=install
+Source=%{src}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+Option=INSTALL_DOCS
+
+[DOCS]
+Type=install
+Source=%{src}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+Option=INSTALL_DOCS
+
+[PROJECT]
+Type=install
+Source=%{src}/template-wxhello/app.kdevelop
+Dest=%{dest}/${APPNAMELC}.kdevelop
+
+[WXMAKEFILE.AM]
+Type=install
+Source=%${src}/template-common/wx-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[WXMAKEFILE.CVS]
+Type=install
+Source=%${src}/template-common/wx-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[WXCONFIGURE.IN]
+Type=install
+Source=%${src}/template-common/wx-configure.in
+Dest=%{dest}/configure.in
+
+[APPICON.16]
+Type=install
+Source=%${src}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-${APPNAMELC}.png
+
+[APPICON.32]
+Type=install
+Source=%${src}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-${APPNAMELC}.png
+
+[SUBDIRS]
+Type=install
+Source=%${src}/template-wxhello/subdirs
+Dest=%{dest}/subdirs
+
+[SRC.MAKEFILE.AM]
+Type=install
+Source=%${src}/template-wxhello/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[APP.CPP]
+Type=install
+Source=%${src}/template-wxhello/app.cpp
+Dest=%{dest}/src/${APPNAMELC}.cpp
+
+[APP.H]
+Type=install
+Source=%${src}/template-wxhello/app.h
+Dest=%{dest}/src/${APPNAMELC}.h
+
+[APP.DESKTOP]
+Type=install
+Source=%${src}/template-wxhello/app.desktop
+Dest=%{dest}/src/${APPNAMELC}.desktop \ No newline at end of file
diff --git a/languages/cpp/app_templates/wxhello/wxhello.kdevtemplate b/languages/cpp/app_templates/wxhello/wxhello.kdevtemplate
new file mode 100644
index 00000000..48e605e1
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/wxhello.kdevtemplate
@@ -0,0 +1,192 @@
+# KDE Config File
+[General]
+Name=Simple Hello wxWidgets Application
+Name[ca]=Simple aplicació de Hello per a wxWidgets
+Name[da]=Simpelt Goddag wxWidgets program
+Name[de]=Einfache wxWidgets-Anwendung
+Name[el]=Απλή εφαÏμογή Γεια σου wxWidgets
+Name[es]=Una sencilla aplicación «Hola mundo» con wxWidgets
+Name[et]=Lihtne wxWidgets'i tervitusrakendus
+Name[eu]=wxWidgets-en "Kaixo mundua" aplikazio sinple bat
+Name[fa]=کاربرد سادۀ Hello wxWidgets
+Name[fr]=Application « Bonjour monde » simple avec wxWidgets
+Name[gl]=Aplicación sinxela Ola en wxWidgets
+Name[hu]=wxWidgets-alapú Hello world program
+Name[it]=Semplice applicazione wxWidgets di "Hello"
+Name[ja]=ç°¡å˜ãª wxWidget アプリケーション
+Name[nds]=Eenfach wxWidgets-Programm "Moin"
+Name[ne]=साधारण हेलà¥à¤²à¥‹ wxWidgets अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Eenvoudige Hello wxWidgets-toepassing
+Name[pl]=Prosty program Witaj używający wxWidgets
+Name[pt]=Aplicação Olá Mundo Simples do wxWidgets
+Name[pt_BR]=Aplicação Olá Mundo Simples do wxWidgets
+Name[ru]=ПроÑтое приложение wxWidgets
+Name[sk]=Jednoduchá wxWidgets Ahoj svet aplikácia
+Name[sr]=ЈедноÑтаван „Здраво“ wxWidgets програм
+Name[sr@Latn]=Jednostavan „Zdravo“ wxWidgets program
+Name[sv]=Enkelt Hello-program för wxWidgets
+Name[tr]=Basit Merhaba wxWidgets Uygulaması
+Name[zh_CN]=一个简å•çš„ wxWidgets 应用程åº
+Name[zh_TW]=簡單的 Hello wxWidgets 應用程å¼
+Category=C++/wxWidgets
+Comment=Generates a simple wxWidgets Hello application.
+Comment[ca]=Genera una simple aplicació de Hello per a wxWidgets.
+Comment[da]=Genererer et simpelt wxWidgets Goddag-program.
+Comment[de]=Erstellt eine einfache wxWidgets-Anwendung
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή Γεια σου wxWidgets.
+Comment[es]=Genera una sencilla aplicación «Hola mundo» con wxWidgets
+Comment[et]=Lihtsa wxWidgets'i tervitusrakenduse loomine.
+Comment[eu]=wxWidgets-en "Kaixo mundua"aplikazio sinple bat sortzen du.
+Comment[fa]=یک کاربرد سادۀ wxWidgets Hello تولید می‌کند.
+Comment[fr]=Une application « Bonjour monde » simple avec wxWidgets.
+Comment[gl]=Xera unha aplicación sinxela Ola en wxWidgets.
+Comment[hu]=Létrehoz egy egyszerű wxWidgets-alkalmazást.
+Comment[it]=Genera una semplice applicazione wxWidgets di "Hello".
+Comment[ja]=ç°¡å˜ãª wxWidget アプリケーションを作æˆã—ã¾ã™
+Comment[nds]=Stellt mit wxWidgets en eenfach "Moin"-Programm op.
+Comment[ne]=साधारण wxWidgets हेलà¥à¤²à¥‹ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudige wxWidget Hello-toepassing.
+Comment[pl]=Generuje prosty program Witaj wykorzystujÄ…cy wxWidgets
+Comment[pt]=Gera uma aplicação simples de Olá Mundo do wxWidgets.
+Comment[pt_BR]=Gera uma aplicação simples de Olá Mundo do wxWidgets.
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ wxWidgets.
+Comment[sk]=Vygeneruje jednoduchú wxWidgets Ahoj svet aplikáciu.
+Comment[sr]=Прави једноÑтаван „Здраво“ wxWidgets програм.
+Comment[sr@Latn]=Pravi jednostavan „Zdravo“ wxWidgets program.
+Comment[sv]=Skapar ett enkelt Hello-program för wxWidgets.
+Comment[tr]=Basit bir wxWidgets Merhaba uygulaması yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªç®€å•çš„ wxWidgets Hello 应用程åºã€‚
+Comment[zh_TW]=產生一個簡單的 wxWidgets Hello 應用程å¼ã€‚
+FileTemplates=h,CStyle,cpp,CStyle
+Icon=wxhello.png
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.cpp
+Archive=wxhello.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[WXARCH]
+Type=install archive
+Source=%{kdevelop}/template-common/wxwidgets.tar.gz
+Dest=%{dest}
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[WX]
+Type=include
+File=%{kdevelop}/template-common/wx.kdevtemplate
+
+[FILE4]
+Type=install
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/wx-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/wx-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/wx-configure.in
+Dest=%{dest}/configure.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+#[FILE10]
+#Type=install
+#Source=%{src}/subdirs
+#Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE13]
+Type=install
+Source=%{src}/app.h
+Dest=%{dest}/src/%{APPNAMELC}.h
+
+[FILE14]
+Type=install
+Source=%{src}/app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[MSG]
+Type=message
+Comment=Simple hello wxWidgets application was created in %{dest}
+Comment[ca]=Simple aplicació de Hello per a wxWidgets ha estat creada en %{dest}
+Comment[da]=Simpelt Goddag wxWidgets program blev oprettet i %{dest}
+Comment[de]=Eine einfache wxWidgets-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια απλή εφαÏμογή Γεια σου wxWidgets δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una sencilla aplicación «Hola mundo» con wxWidgets ha sido creada en %{dest}
+Comment[et]=Lihtne wxWidgets'i tervitusrakendus loodi asukohta %{dest}
+Comment[eu]=wxWidgets "Kaixo mundua" aplikazio sinple bat sortu da hemen: %{dest}
+Comment[fa]=کاربرد سادۀ hello wxWidgets در %{dest} ایجاد شد
+Comment[fr]=Une application « Bonjour monde » simple en wxWidgets a été créée dans %{dest}
+Comment[gl]=Creouse unha aplicación sinxela Ola en wxWidgets en %{dest}
+Comment[hu]=Létrejött egy egyszerű wxWidgets-alkalmazás itt: %{dest}
+Comment[it]=È stata creata una semplice applicazione wxWidgets di "hello" in %{dest}
+Comment[ja]=ç°¡å˜ãª wxWidget アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach wxWidgets-Programm opstellt
+Comment[ne]=साधारण हेलà¥à¤²à¥‹ wxWidgets अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Eenvoudige hello wxWidget-toepassing is aangemaakt in %{dest}
+Comment[pl]=Prosty program Witaj wykorzystujący wxWidgets został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação simples de wxWidgets em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação simples de wxWidgets em %{dest}
+Comment[ru]=ПроÑтое приложение wxWidgets Ñоздано в %{dest}
+Comment[sk]=Jedniduchá wxWidgets Ahoj svet aplikácia bola vytvorená v %{dest}
+Comment[sr]=ЈедноÑтаван „Здраво“ wxWidgets програм направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan „Zdravo“ wxWidgets program napravljen je u %{dest}
+Comment[sv]=Ett enkelt Hello-program för wxWidgets.skapades i %{dest}
+Comment[tr]=Basit merhaba wxWidgets uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简å•çš„ wxWidgets Hello 应用程åº
+Comment[zh_TW]=一個簡單的 hello wxWidgets 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/cpp/app_templates/wxhello/wxhello.png b/languages/cpp/app_templates/wxhello/wxhello.png
new file mode 100644
index 00000000..fbe48423
--- /dev/null
+++ b/languages/cpp/app_templates/wxhello/wxhello.png
Binary files differ
diff --git a/languages/cpp/ast_utils.cpp b/languages/cpp/ast_utils.cpp
new file mode 100644
index 00000000..d21f4782
--- /dev/null
+++ b/languages/cpp/ast_utils.cpp
@@ -0,0 +1,190 @@
+/***************************************************************************
+* Copyright (C) 2002 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include "ast_utils.h"
+#include "ast.h"
+
+#include <qstringlist.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kapplication.h>
+
+#include <ktexteditor/editinterface.h>
+
+#include "cppsupport_utils.h"
+
+AST* findNodeAt( AST* node, int line, int column )
+{
+ // kdDebug(9007) << "findNodeAt(" << node << ")" << endl;
+
+ if ( !node )
+ return 0;
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+
+ node->getStartPosition( &startLine, &startColumn );
+ node->getEndPosition( &endLine, &endColumn );
+
+ if ( ( line > startLine || ( line == startLine && column >= startColumn ) ) &&
+ ( line < endLine || ( line == endLine && column < endColumn ) ) )
+ {
+
+ QPtrList<AST> children = node->children();
+ QPtrListIterator<AST> it( children );
+ while ( it.current() )
+ {
+ AST * a = it.current();
+ ++it;
+
+ AST* r = findNodeAt( a, line, column );
+ if ( r )
+ return r;
+ }
+
+ return node;
+ }
+
+ return 0;
+}
+
+void scopeOfNode( AST* ast, QStringList& scope )
+{
+ if ( !ast )
+ return ;
+
+ if ( ast->parent() )
+ scopeOfNode( ast->parent(), scope );
+
+ QString s;
+ switch ( ast->nodeType() )
+ {
+ case NodeType_ClassSpecifier:
+ if ( ( ( ClassSpecifierAST* ) ast ) ->name() )
+ {
+ s = ( ( ClassSpecifierAST* ) ast ) ->name() ->text();
+ s = s.isEmpty() ? QString::fromLatin1( "<unnamed>" ) : s;
+ scope.push_back( s );
+ }
+ break;
+
+ case NodeType_Namespace:
+ {
+ AST* namespaceName = ( ( NamespaceAST* ) ast ) ->namespaceName();
+ s = namespaceName ? namespaceName->text() : QString::fromLatin1( "<unnamed>" );
+ scope.push_back( s );
+ }
+ break;
+
+ case NodeType_FunctionDefinition:
+ {
+ FunctionDefinitionAST* funDef = static_cast<FunctionDefinitionAST*>( ast );
+ DeclaratorAST* d = funDef->initDeclarator() ->declarator();
+
+ // hotfix for bug #68726
+ if ( !d->declaratorId() )
+ break;
+
+ QPtrList<ClassOrNamespaceNameAST> l = d->declaratorId() ->classOrNamespaceNameList();
+ QPtrListIterator<ClassOrNamespaceNameAST> nameIt( l );
+ while ( nameIt.current() )
+ {
+ AST * name = nameIt.current() ->name();
+ scope.push_back( name->text() );
+
+ ++nameIt;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+QString typeSpecToString( TypeSpecifierAST* typeSpec ) /// @todo remove
+{
+ if ( !typeSpec )
+ return QString::null;
+
+ return typeSpec->text().replace( QRegExp( " :: " ), "::" );
+}
+
+QString declaratorToString( DeclaratorAST* declarator, const QString& scope, bool skipPtrOp )
+{
+ if ( !declarator )
+ return QString::null;
+
+ QString text;
+
+ if ( !skipPtrOp )
+ {
+ QPtrList<AST> ptrOpList = declarator->ptrOpList();
+ for ( QPtrListIterator<AST> it( ptrOpList ); it.current(); ++it )
+ {
+ text += it.current() ->text();
+ }
+ text += " ";
+ }
+
+ text += scope;
+
+ if ( declarator->subDeclarator() )
+ text += QString::fromLatin1( "(" ) + declaratorToString( declarator->subDeclarator() ) + QString::fromLatin1( ")" );
+
+ if ( declarator->declaratorId() )
+ text += declarator->declaratorId() ->text();
+
+ QPtrList<AST> arrays = declarator->arrayDimensionList();
+ QPtrListIterator<AST> it( arrays );
+ while ( it.current() )
+ {
+ text += "[]";
+ ++it;
+ }
+
+ if ( declarator->parameterDeclarationClause() )
+ {
+ text += formattedOpeningParenthesis();
+
+ ParameterDeclarationListAST* l = declarator->parameterDeclarationClause() ->parameterDeclarationList();
+ if ( l != 0 )
+ {
+ QPtrList<ParameterDeclarationAST> params = l->parameterList();
+ QPtrListIterator<ParameterDeclarationAST> it( params );
+
+ while ( it.current() )
+ {
+ QString type = typeSpecToString( it.current() ->typeSpec() );
+ text += type;
+ if ( !type.isEmpty() )
+ text += " ";
+ text += declaratorToString( it.current() ->declarator() );
+
+ ++it;
+
+ if ( it.current() )
+ text += ", ";
+ }
+ }
+
+ text += formattedClosingParenthesis();
+
+ if ( declarator->constant() != 0 )
+ text += " const";
+ }
+
+ return text.replace( QRegExp( " :: " ), "::" ).simplifyWhiteSpace();
+}
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/ast_utils.h b/languages/cpp/ast_utils.h
new file mode 100644
index 00000000..ce9ec99f
--- /dev/null
+++ b/languages/cpp/ast_utils.h
@@ -0,0 +1,34 @@
+/***************************************************************************
+* Copyright (C) 2002 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef __ast_utils_h
+#define __ast_utils_h
+
+#include <qstring.h>
+
+class AST;
+class DeclaratorAST;
+class TypeSpecifierAST;
+class QStringList;
+
+namespace KTextEditor
+{
+ class EditInterface;
+}
+
+AST* findNodeAt( AST* unit, int line, int column );
+void scopeOfNode( AST* ast, QStringList& );
+QString typeSpecToString( TypeSpecifierAST* typeSpec );
+QString declaratorToString( DeclaratorAST* declarator, const QString& scope = QString::null, bool skipPtrOp = false );
+
+#endif // __ast_utils_h
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/backgroundparser.cpp b/languages/cpp/backgroundparser.cpp
new file mode 100644
index 00000000..ed51d0c6
--- /dev/null
+++ b/languages/cpp/backgroundparser.cpp
@@ -0,0 +1,552 @@
+/***************************************************************************
+* Copyright (C) 2002 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include "backgroundparser.h"
+#include "cppsupportpart.h"
+#include "cppsupport_events.h"
+#include "codeinformationrepository.h"
+#include "cppcodecompletion.h"
+#include "ast_utils.h"
+#include "kdevdeepcopy.h"
+#include "kdevdriver.h"
+
+#include <qmutex.h>
+
+#include <kparts/part.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/document.h>
+#include <ktexteditor/view.h>
+
+#include <kdevpartcontroller.h>
+#include <kdevproject.h>
+
+#include <kurl.h>
+#include <kdebug.h>
+#include <kapplication.h>
+
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+#include <list>
+#include <qdatastream.h>
+
+
+class BackgroundKDevDriver : public KDevDriver {
+public:
+ BackgroundKDevDriver( CppSupportPart* cppSupport, BackgroundParser* bp ) : KDevDriver( cppSupport, false ), m_backgroundParser(bp) {
+ }
+ virtual void fileParsed( ParsedFile& fileName );
+ virtual void addDependence( const QString& fileName, const Dependence& dep );
+private:
+ BackgroundParser* m_backgroundParser;
+};
+
+
+class KDevSourceProvider: public SourceProvider
+{
+public:
+ //Deadlock is a mutex that is locked when KDevSourceProvider::contents(..) is used, and that should be unlocked before QApplication is locked(that way a deadlock where the thread that holds the QApplication-mutex and tries to lock the given mutex, while the thread that calls contents(..) and holds the given mutex and tries to lock the QApplication-mutex, cannot happen)
+ KDevSourceProvider( CppSupportPart* cppSupport, QMutex& deadlock )
+ : m_cppSupport( cppSupport ),
+ m_readFromDisk( false ),
+ m_deadlock(deadlock)
+ {}
+
+ void setReadFromDisk( bool b )
+ {
+ m_readFromDisk = b;
+ }
+ bool readFromDisk() const
+ {
+ return m_readFromDisk;
+ }
+
+ virtual QString contents( const QString& fileName )
+ {
+ QString contents = QString::null;
+
+ if ( !m_readFromDisk )
+ {
+ m_deadlock.unlock();
+ // GET LOCK
+ kapp->lock ();
+
+ //kdDebug(9007) << "-------> kapp locked" << endl;
+
+ QPtrList<KParts::Part> parts( *m_cppSupport->partController() ->parts() );
+ QPtrListIterator<KParts::Part> it( parts );
+ while ( it.current() )
+ {
+ KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( it.current() );
+ ++it;
+
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( doc );
+ if ( !doc || !editIface || doc->url().path() != fileName )
+ continue;
+
+ contents = QString( editIface->text().ascii() ); // deep copy
+
+ //kdDebug(9007) << "-------> kapp unlocked" << endl;
+
+ break;
+ }
+
+ // RELEASE LOCK
+ kapp->unlock();
+ m_deadlock.lock();
+ //kdDebug(9007) << "-------> kapp unlocked" << endl;
+ }
+
+ if( m_readFromDisk || contents == QString::null )
+ {
+ QFile f( fileName );
+ if ( f.open( IO_ReadOnly ) )
+ {
+ QTextStream stream( &f );
+ contents = stream.read();
+ f.close();
+ }
+ }
+
+ return contents;
+ }
+
+ virtual bool isModified( const QString& fileName )
+ {
+ bool ret = false;
+ m_deadlock.unlock();
+ kapp->lock ();
+
+ KParts::ReadOnlyPart *part = m_cppSupport->partController()->partForURL( KURL(fileName) );
+ KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( part );
+
+ if ( doc )
+ ret = doc->isModified();
+
+ kapp->unlock();
+ m_deadlock.lock();
+ return ret;
+ }
+
+private:
+ CppSupportPart* m_cppSupport;
+ bool m_readFromDisk;
+ QMutex& m_deadlock;
+private:
+ KDevSourceProvider( const KDevSourceProvider& source );
+ void operator = ( const KDevSourceProvider& source );
+};
+
+typedef std::string SafeString;
+
+class SynchronizedFileList
+{
+ typedef std::list< QPair<SafeString, bool> > ListType;
+public:
+ SynchronizedFileList()
+ {}
+
+ bool isEmpty() const
+ {
+ QMutexLocker locker( &m_mutex );
+ return m_fileList.empty();
+ }
+
+ uint count() const
+ {
+ QMutexLocker locker( &m_mutex );
+ return m_fileList.size();
+ }
+
+ QPair<SafeString, bool> front() const
+ {
+ QMutexLocker locker( &m_mutex );
+ return m_fileList.front();
+ }
+
+ void clear()
+ {
+ QMutexLocker locker( &m_mutex );
+ m_fileList.clear();
+ }
+
+ void push_front( const QString& fileName, bool readFromDisk = false )
+ {
+ SafeString s( fileName.ascii() );
+ QMutexLocker locker( &m_mutex );
+ m_fileList.push_front( qMakePair( s, readFromDisk ) );
+ }
+
+ void push_back( const QString& fileName, bool readFromDisk = false )
+ {
+ SafeString s( fileName.ascii() );
+ QMutexLocker locker( &m_mutex );
+ m_fileList.push_back( qMakePair( s, readFromDisk ) );
+ }
+
+ void pop_front()
+ {
+ QMutexLocker locker( &m_mutex );
+ m_fileList.pop_front();
+ }
+
+ int count( const QString& fileName ) const {
+ int c = 0;
+
+ QMutexLocker locker( &m_mutex );
+ ListType::const_iterator it = m_fileList.begin();
+ while ( it != m_fileList.end() )
+ {
+ if ( ( *it ).first.compare( fileName.ascii() ) == 0 )
+ ++c;
+ ++it;
+ }
+ return c;
+ }
+
+ QPair<SafeString, bool> takeFront()
+ {
+ QMutexLocker locker( &m_mutex );
+ QPair<SafeString, bool> ret = m_fileList.front();
+ m_fileList.pop_front();
+ return ret;
+ }
+
+ bool contains( const QString& fileName ) const
+ {
+ QMutexLocker locker( &m_mutex );
+ ListType::const_iterator it = m_fileList.begin();
+ while ( it != m_fileList.end() )
+ {
+ if ( ( *it ).first.compare( fileName.ascii() ) == 0 )
+ return true;
+ ++it;
+ }
+ return false;
+ }
+
+ void remove( const QString& fileName )
+ {
+ QMutexLocker locker( &m_mutex );
+ ListType::iterator it = m_fileList.begin();
+ while ( it != m_fileList.end() )
+ {
+ if ( ( *it ).first.compare(fileName.ascii() ) == 0 )
+ m_fileList.erase( it++ );
+ else
+ ++it;
+ }
+ }
+
+private:
+ mutable QMutex m_mutex;
+ ListType m_fileList;
+};
+
+BackgroundParser::BackgroundParser( CppSupportPart* part, QWaitCondition* consumed )
+: m_consumed( consumed ), m_cppSupport( part ), m_close( false ), m_saveMemory( false )
+{
+ m_fileList = new SynchronizedFileList();
+ m_driver = new BackgroundKDevDriver( m_cppSupport, this );
+ m_driver->setSourceProvider( new KDevSourceProvider( m_cppSupport, m_mutex ) );
+
+ QString conf_file_name = m_cppSupport->specialHeaderName();
+ m_mutex.lock();
+ if ( QFile::exists( conf_file_name ) )
+ m_driver->parseFile( conf_file_name, true, true, true );
+ m_mutex.unlock();
+
+ //disabled for now m_driver->setResolveDependencesEnabled( true );
+}
+
+BackgroundParser::~BackgroundParser()
+{
+ removeAllFiles();
+
+ delete( m_driver );
+ m_driver = 0;
+
+ delete m_fileList;
+ m_fileList = 0;
+}
+
+void BackgroundParser::addFile( const QString& fileName, bool readFromDisk )
+{
+ QString fn = deepCopy( fileName );
+
+ //bool added = false;
+ /*if ( !m_fileList->contains( fn ) )
+ {
+ m_fileList->push_back( fn, readFromDisk );
+ added = true;
+ }*/
+ m_fileList->push_back( fn, readFromDisk );
+
+ //if ( added )
+ m_canParse.wakeAll();
+}
+
+void BackgroundParser::addFileFront( const QString& fileName, bool readFromDisk )
+{
+ QString fn = deepCopy( fileName );
+
+ bool added = false;
+ /*if ( m_fileList->contains( fn ) )
+ m_fileList->remove( fn );*/
+
+ m_fileList->push_front( fn, readFromDisk );
+ added = true;
+
+ if ( added )
+ m_canParse.wakeAll();
+}
+
+void BackgroundParser::removeAllFiles()
+{
+ kdDebug( 9007 ) << "BackgroundParser::removeAllFiles()" << endl;
+ QMutexLocker locker( &m_mutex );
+
+ QMap<QString, Unit*>::Iterator it = m_unitDict.begin();
+ while ( it != m_unitDict.end() )
+ {
+ Unit * unit = it.data();
+ ++it;
+ delete( unit );
+ unit = 0;
+ }
+ m_unitDict.clear();
+ m_driver->reset();
+ m_fileList->clear();
+
+ m_isEmpty.wakeAll();
+}
+
+void BackgroundParser::removeFile( const QString& fileName )
+{
+ QMutexLocker locker( &m_mutex );
+
+ Unit* unit = findUnit( fileName );
+ if ( unit )
+ {
+ m_driver->remove
+ ( fileName );
+ m_unitDict.remove( fileName );
+ delete( unit );
+ unit = 0;
+ }
+
+ if ( m_fileList->isEmpty() )
+ m_isEmpty.wakeAll();
+}
+
+void BackgroundKDevDriver::addDependence( const QString& fileName, const Dependence& dep ) {
+ //give waiting threads a chance to perform their actions
+ m_backgroundParser->m_mutex.unlock();
+ m_backgroundParser->m_mutex.lock();
+ KDevDriver::addDependence( fileName, dep );
+}
+
+void BackgroundKDevDriver::fileParsed( ParsedFile& fileName ) {
+ m_backgroundParser->fileParsed( fileName );
+}
+
+void BackgroundParser::parseFile( const QString& fileName, bool readFromDisk, bool lock )
+{
+ if( lock )
+ m_mutex.lock();
+ m_readFromDisk = readFromDisk;
+ static_cast<KDevSourceProvider*>( m_driver->sourceProvider() ) ->setReadFromDisk( readFromDisk );
+
+ m_driver->remove( fileName );
+ m_driver->parseFile( fileName , false, true );
+ if( !m_driver->isResolveDependencesEnabled() )
+ m_driver->removeAllMacrosInFile( fileName ); // romove all macros defined by this
+ // translation unit.
+ if ( lock )
+ m_mutex.unlock();
+}
+
+QValueList<Problem> cloneProblemList( const QValueList<Problem>& list ) {
+ QValueList<Problem> ret;
+ for( QValueList<Problem>::const_iterator it = list.begin(); it != list.end(); ++it ) {
+ ret << Problem( *it, true );
+ }
+ return ret;
+}
+
+void BackgroundParser::fileParsed( ParsedFile& file ) {
+
+ ParsedFilePointer translationUnitUnsafe = m_driver->takeTranslationUnit( file.fileName() );
+ //now file and translationUnitUnsafe are the same
+ ParsedFilePointer translationUnit;
+ //Since the lexer-cache keeps many QStrings like macro-names used in the background, everything must be copied here. The safest solution is just
+ //serializing and deserializing the whole thing(the serialization does not respect the AST, but that can be copied later because that's safe)
+ QMemArray<char> data;
+ {
+ QDataStream stream( data, IO_WriteOnly );
+ translationUnitUnsafe->write( stream );
+ }
+ {
+ QDataStream stream( data, IO_ReadOnly );
+ translationUnit = new ParsedFile( stream );
+ }
+
+ translationUnit->setTranslationUnit( translationUnitUnsafe->operator TranslationUnitAST *() ); //Copy the AST, doing that is thread-safe
+ translationUnitUnsafe->setTranslationUnit( 0 ); //Move the AST completely out of this thread's scope. Else it might crash on dual-core machines
+ file.setTranslationUnit(0); //just to be sure, set to zero on both
+
+ Unit* unit = new Unit;
+ unit->fileName = file.fileName();
+ unit->translationUnit = translationUnit;
+ unit->problems = cloneProblemList( m_driver->problems( file.fileName() ) );
+
+ static_cast<KDevSourceProvider*>( m_driver->sourceProvider() ) ->setReadFromDisk( false );
+
+ if ( m_unitDict.find( file.fileName() ) != m_unitDict.end() )
+ {
+ Unit * u = m_unitDict[ file.fileName() ];
+ m_unitDict.remove( file.fileName() );
+ delete( u );
+ u = 0;
+ }
+
+ m_unitDict.insert( file.fileName(), unit );
+
+ KApplication::postEvent( m_cppSupport, new FileParsedEvent( file.fileName(), unit->problems, m_readFromDisk ) );
+
+ m_currentFile = QString::null;
+
+ if ( m_fileList->isEmpty() )
+ m_isEmpty.wakeAll();
+}
+
+Unit* BackgroundParser::findUnit( const QString& fileName )
+{
+ QMap<QString, Unit*>::Iterator it = m_unitDict.find( fileName );
+ return it != m_unitDict.end() ? *it : 0;
+}
+
+bool BackgroundParser::hasTranslationUnit( const QString& fileName ) {
+ QMap<QString, Unit*>::Iterator it = m_unitDict.find( fileName );
+ return it != m_unitDict.end();
+}
+
+ParsedFilePointer BackgroundParser::translationUnit( const QString& fileName )
+{
+ Unit * u = findUnit( fileName );
+ if ( u == 0 )
+ {
+ return 0;
+ /*m_fileList->remove
+ ( fileName );
+ u = parseFile( fileName, false );*/
+ }
+
+ return u->translationUnit;
+}
+
+QValueList<Problem> BackgroundParser::problems( const QString& fileName, bool readFromDisk, bool forceParse )
+{
+ Q_UNUSED(readFromDisk);
+ Unit * u = findUnit( fileName );
+ if ( u == 0 || forceParse )
+ {
+ /*
+ m_fileList->remove
+ ( fileName );
+ u = parseFile( fileName, readFromDisk ); */
+ }
+
+ return u ? u->problems : QValueList<Problem>();
+}
+
+void BackgroundParser::close()
+{
+ {
+ QMutexLocker locker( &m_mutex );
+ m_close = true;
+ m_canParse.wakeAll();
+ }
+ kapp->unlock();
+
+ while ( running() )
+ sleep( 1 );
+ kapp->lock();
+}
+
+bool BackgroundParser::filesInQueue()
+{
+ QMutexLocker locker( &m_mutex );
+
+ return m_fileList->count() || !m_currentFile.isEmpty();
+}
+
+int BackgroundParser::countInQueue( const QString& file ) const {
+ return m_fileList->count( file );
+}
+
+void BackgroundParser::updateParserConfiguration()
+{
+ QMutexLocker locker( &m_mutex );
+
+ m_driver->setup();
+ QString conf_file_name = m_cppSupport->specialHeaderName();
+ m_driver->removeAllMacrosInFile( conf_file_name );
+ m_driver->parseFile( conf_file_name, true, true, true );
+}
+
+void BackgroundParser::run()
+{
+ // (void) m_cppSupport->codeCompletion()->repository()->getEntriesInScope( QStringList(), false );
+
+ while ( !m_close )
+ {
+
+ while ( m_fileList->isEmpty() )
+ {
+ if( m_saveMemory ) {
+ m_saveMemory = false;
+ m_driver->lexerCache()->saveMemory();
+ }
+
+ m_canParse.wait();
+
+ if ( m_close )
+ break;
+ }
+
+ if ( m_close )
+ break;
+
+ QPair<SafeString, bool> entry = m_fileList->takeFront();
+ QString fileName = entry.first.c_str();
+ bool readFromDisk = entry.second;
+ m_currentFile = deepCopy(fileName);
+
+ ( void ) parseFile( fileName, readFromDisk, true );
+
+
+ m_currentFile = QString::null;
+ }
+
+ kdDebug( 9007 ) << "!!!!!!!!!!!!!!!!!! BG PARSER DESTROYED !!!!!!!!!!!!" << endl;
+
+// adymo: commented to fix #88091
+// QThread::exit();
+}
+
+void BackgroundParser::saveMemory() {
+ m_saveMemory = true; //Delay the operation
+ m_canParse.wakeAll();
+}
+
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/backgroundparser.h b/languages/cpp/backgroundparser.h
new file mode 100644
index 00000000..2bbf1173
--- /dev/null
+++ b/languages/cpp/backgroundparser.h
@@ -0,0 +1,122 @@
+/***************************************************************************
+* Copyright (C) 2002 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef BACKGROUNDPARSER_H
+#define BACKGROUNDPARSER_H
+
+#include "ast.h"
+#include "driver.h"
+
+#include <qthread.h>
+#include <qwaitcondition.h>
+#include <qmutex.h>
+#include <qmap.h>
+#include <kdebug.h>
+
+class CppSupportPart;
+class TranslationUnitAST;
+class SynchronizedFileList;
+class BackgroundKDevDriver;
+class Unit
+{
+public:
+ Unit() : translationUnit( 0 )
+ {}
+ ~Unit()
+ {
+ translationUnit = 0;
+ }
+
+ QString fileName;
+ QValueList<Problem> problems;
+ ParsedFilePointer translationUnit;
+
+protected:
+ Unit( const Unit& source );
+ void operator = ( const Unit& source );
+};
+
+class BackgroundParser: public QThread
+{
+public:
+ BackgroundParser( CppSupportPart*, QWaitCondition* consumed );
+ virtual ~BackgroundParser();
+
+ QMutex& mutex()
+ {
+ return m_mutex;
+ }
+ void lock ()
+ {
+ m_mutex.lock();
+ }
+ void unlock()
+ {
+ m_mutex.unlock();
+ }
+
+ QWaitCondition& canParse()
+ {
+ return m_canParse;
+ }
+ QWaitCondition& isEmpty()
+ {
+ return m_isEmpty;
+ }
+
+ bool filesInQueue();
+
+ int countInQueue( const QString& file ) const;
+
+ void addFile( const QString& fileName, bool readFromDisk = false );
+ void addFileFront( const QString& fileName, bool readFromDisk = false );
+ void removeFile( const QString& fileName );
+ void removeAllFiles();
+
+ bool hasTranslationUnit( const QString& fileName );
+ ParsedFilePointer translationUnit( const QString& fileName );
+ QValueList<Problem> problems( const QString& fileName , bool readFromDisk = false, bool forceParse = false );
+ void updateParserConfiguration();
+
+ ///Should be run on a regular basis(every X minutes). It reduces some caches etc. BackgroundParser must be locked before.
+ void saveMemory();
+
+ void close();
+
+ virtual void run();
+
+protected:
+ friend class BackgroundKDevDriver;
+ void fileParsed( ParsedFile& fileName );
+ Unit* findUnit( const QString& fileName );
+ void parseFile( const QString& fileName, bool readFromDisk, bool lock = false )
+ ;
+
+private:
+ class KDevDriver* m_driver;
+ QString m_currentFile;
+ QWaitCondition m_canParse;
+ QWaitCondition m_isEmpty;
+ QWaitCondition* m_consumed;
+ QMutex m_mutex;
+ SynchronizedFileList* m_fileList;
+ CppSupportPart* m_cppSupport;
+ bool m_close;
+ QMap<QString, Unit*> m_unitDict;
+ bool m_saveMemory; //used to prevent blocking
+
+ //State of parseFile(..):
+ bool m_readFromDisk;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/bithelpers.h b/languages/cpp/bithelpers.h
new file mode 100644
index 00000000..3cb74420
--- /dev/null
+++ b/languages/cpp/bithelpers.h
@@ -0,0 +1,37 @@
+
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __BITHELPERS_H__
+#define __BITHELPERS_H__
+
+namespace BitHelpers {
+template <class Type>
+inline Type addFlag( Type loc, Type add ) {
+ return (Type)( loc | add );
+}
+
+template <class Type>
+inline Type remFlag( Type loc, Type rem ) {
+ return (Type)( loc & (rem ^ 0xffffffff) );
+}
+
+template <class Type>
+inline Type bitInvert( Type val ) {
+ return (Type)(0xffffffff - (unsigned int)val);
+}
+}
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/ccconfigwidget.cpp b/languages/cpp/ccconfigwidget.cpp
new file mode 100644
index 00000000..09b13938
--- /dev/null
+++ b/languages/cpp/ccconfigwidget.cpp
@@ -0,0 +1,590 @@
+/***************************************************************************
+* Copyright (C) 2001 by Daniel Engelschalt *
+* daniel.engelschalt@gmx.net *
+* Copyright (C) 2004 Jonas Jacobi<j.jacobi@gmx.de> *
+* *
+* 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. *
+* *
+***************************************************************************/
+// qt includes
+#include <qtabwidget.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qradiobutton.h>
+#include <qcombobox.h>
+#include <qmultilineedit.h>
+#include <qslider.h>
+#include <qheader.h>
+#include <qcolor.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+// kde includes
+#include <kdevproject.h>
+#include <kfiledialog.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <kfileitem.h>
+#include <kurlrequester.h>
+#include <keditlistbox.h>
+#include <klistview.h>
+#include <knuminput.h>
+#include <kmainwindow.h>
+#include <klineedit.h>
+#include <kdeversion.h>
+// kdevelop includes
+#include <domutil.h>
+#include <kdevcoderepository.h>
+#include <kdevmainwindow.h>
+#include <kdevcoderepository.h>
+#include <catalog.h>
+// std includes
+#include <stdlib.h>
+
+#include "cppsupportfactory.h"
+#include "ccconfigwidget.h"
+#include "qtbuildconfig.h"
+#include "cppsupportpart.h"
+#include "cppcodecompletionconfig.h"
+#include "cppsplitheadersourceconfig.h"
+#include "createpcsdialog.h"
+#include "creategettersetterconfiguration.h"
+
+using namespace std;
+
+
+CCConfigWidget::CCConfigWidget( CppSupportPart* part, QWidget* parent, const char* name )
+ : CCConfigWidgetBase( parent, name )
+{
+ m_pPart = part;
+ connect( m_pPart->codeRepository(), SIGNAL( catalogRegistered( Catalog* ) ),
+ this, SLOT( catalogRegistered( Catalog* ) ) );
+ connect( m_pPart->codeRepository(), SIGNAL( catalogUnregistered( Catalog* ) ),
+ this, SLOT( catalogUnregistered( Catalog* ) ) );
+
+ connect( m_qtDir, SIGNAL(urlSelected(const QString &)),
+ this, SLOT(isValidQtDir(const QString &)));
+ connect( m_qtDir, SIGNAL(textChanged(const QString &)),
+ this, SLOT(isValidQtDir(const QString &)));
+
+ initGeneralTab( );
+ initQtTab();
+ initCodeCompletionTab( );
+ initGetterSetterTab( );
+ initSplitTab();
+ inputCodeCompletion->setRange( 0, 2000, 100, false );
+ inputArgumentsHint->setRange( 0, 2000, 100, false );
+}
+
+void CCConfigWidget::initGeneralTab( )
+{
+ QDomDocument dom = *m_pPart->projectDom();
+ interface_suffix->setText( DomUtil::readEntry( dom, "/cppsupportpart/filetemplates/interfacesuffix", ".h" ) );
+ implementation_suffix->setText( DomUtil::readEntry( dom, "/cppsupportpart/filetemplates/implementationsuffix", ".cpp" ) );
+
+ KConfig *config = CppSupportFactory::instance() ->config();
+ if ( config )
+ {
+ config->setGroup( "General" );
+ m_switchShouldMatch->setChecked( config->readBoolEntry( "SwitchShouldMatch", true ) );
+ m_showContextMenuExplosion->setChecked( config->readBoolEntry( "ShowContextMenuExplosion", false ) );
+ }
+}
+
+CCConfigWidget::~CCConfigWidget( )
+{}
+
+void CCConfigWidget::accept( )
+{
+ saveFileTemplatesTab();
+ saveQtTab();
+ saveCodeCompletionTab();
+ saveGetterSetterTab();
+ saveSplitTab();
+}
+
+void CCConfigWidget::saveFileTemplatesTab( )
+{
+ QDomDocument dom = *m_pPart->projectDom();
+ DomUtil::writeEntry( dom, "/cppsupportpart/filetemplates/interfacesuffix", interface_suffix->text() );
+ DomUtil::writeEntry( dom, "/cppsupportpart/filetemplates/implementationsuffix", implementation_suffix->text() );
+
+ KConfig *config = CppSupportFactory::instance() ->config();
+ if ( config )
+ {
+ config->setGroup( "General" );
+ config->writeEntry( "SwitchShouldMatch", m_switchShouldMatch->isChecked() );
+ config->writeEntry( "ShowContextMenuExplosion", m_showContextMenuExplosion->isChecked() );
+ }
+}
+
+void CCConfigWidget::initCodeCompletionTab( )
+{
+ advancedOptions->header() ->hide();
+
+ CppCodeCompletionConfig* c = m_pPart->codeCompletionConfig();
+
+ inputCodeCompletion->setValue( c->codeCompletionDelay() );
+ inputArgumentsHint->setValue( c->argumentsHintDelay() );
+ checkAutomaticCodeCompletion->setChecked( c->automaticCodeCompletion() );
+ checkAutomaticArgumentsHint->setChecked( c->automaticArgumentsHint() );
+
+ checkCompleteArgumentType->setChecked( c->processFunctionArguments() );
+ checkCompleteReturnType->setChecked( c->processPrimaryTypes() );
+ //checkShowOnlyAccessible->setChecked( c->showOnlyAccessibleItems() );
+
+ editNamespaceAlias->setText( c->namespaceAliases() );
+ checkBox18->setChecked( c->showEvaluationContextMenu() );
+ checkShowTypeEvaluationInStatusBar->setChecked( c->statusBarTypeEvaluation() );
+ checkShowCommentInArgumentHint->setChecked( c->showCommentWithArgumentHint() );
+ /*
+ switch( c->completionBoxItemOrder() ) {
+ case CppCodeCompletionConfig::ByAccessLevel:
+ radioGroupByAccess->setChecked( true );
+ break;
+ case CppCodeCompletionConfig::ByClass:
+ radioGroupByClass->setChecked( true );
+ break;
+ case CppCodeCompletionConfig::ByAlphabet:
+ radioGroupByAlphabet->setChecked( true );
+ break;
+ }*/
+
+ QValueList<Catalog*> catalogs = m_pPart->codeRepository() ->registeredCatalogs();
+ for ( QValueList<Catalog*>::Iterator it = catalogs.begin(); it != catalogs.end(); ++it )
+ {
+ Catalog* c = *it;
+ QFileInfo dbInfo( c->dbName() );
+ QCheckListItem* item = new QCheckListItem( advancedOptions, KURL::decode_string( dbInfo.baseName(true) ), QCheckListItem::CheckBox );
+ item->setOn( c->enabled() );
+
+ m_catalogs[ item ] = c;
+ }
+
+ checkPreprocessIncludedHeaders->setChecked( c->preProcessAllHeaders() && !c->parseMissingHeaders() );
+ checkParseMissingHeaders->setChecked( c->parseMissingHeaders() );
+ checkListGlobalItems->setChecked( c->alwaysIncludeNamespaces() );
+ checkResolveIncludePaths->setChecked( c->resolveIncludePaths() );
+ editIncludePaths->setText( c->customIncludePaths() );
+}
+
+void CCConfigWidget::saveCodeCompletionTab( )
+{
+ CppCodeCompletionConfig * c = m_pPart->codeCompletionConfig();
+
+ c->setCodeCompletionDelay( inputCodeCompletion->value() );
+ c->setArgumentsHintDelay( inputArgumentsHint->value() );
+
+ c->setAutomaticCodeCompletion( checkAutomaticCodeCompletion->isChecked() );
+ c->setAutomaticArgumentsHint( checkAutomaticArgumentsHint->isChecked() );
+
+ c->setProcessFunctionArguments( checkCompleteArgumentType->isChecked() );
+ c->setProcessPrimaryTypes( checkCompleteReturnType->isChecked() );
+ //c->setShowOnlyAccessibleItems( checkShowOnlyAccessible->isChecked() );
+
+ c->setNamespaceAliases( editNamespaceAlias->text() );
+ c->setShowEvaluationContextMenu( checkBox18->isChecked() );
+ c->setStatusBarTypeEvaluation( checkShowTypeEvaluationInStatusBar->isChecked() );
+ c->setShowCommentWithArgumentHint( checkShowCommentInArgumentHint->isChecked() );
+
+ /*if( radioGroupByAccess->isChecked() )
+ c->setCompletionBoxItemOrder( CppCodeCompletionConfig::ByAccessLevel );
+
+ if( radioGroupByClass->isChecked() )
+ c->setCompletionBoxItemOrder( CppCodeCompletionConfig::ByClass );
+
+ if( radioGroupByAlphabet->isChecked() )
+ c->setCompletionBoxItemOrder( CppCodeCompletionConfig::ByAlphabet );*/
+
+ for ( QMap<QCheckListItem*, Catalog*>::Iterator it = m_catalogs.begin(); it != m_catalogs.end(); ++it )
+ {
+ it.data() ->setEnabled( it.key() ->isOn() );
+ }
+
+ c->setPreProcessAllHeaders( checkPreprocessIncludedHeaders->isChecked() || checkParseMissingHeaders->isChecked() );
+ c->setParseMissingHeaders( checkParseMissingHeaders->isChecked() );
+ c->setAlwaysIncludeNamespaces( checkListGlobalItems->isChecked() );
+ c->setResolveIncludePaths( checkResolveIncludePaths->isChecked() );
+ c->setCustomIncludePaths( editIncludePaths->text() );
+
+ c->store();
+}
+
+void CCConfigWidget::slotNewPCS( )
+{
+ CreatePCSDialog dlg( m_pPart, m_pPart->mainWindow() ->main() );
+ dlg.importerListView->setFocus();
+ dlg.exec();
+}
+
+void CCConfigWidget::slotRemovePCS()
+{
+ if ( !advancedOptions->selectedItem() )
+ return ;
+
+ QString db = advancedOptions->selectedItem() ->text( 0 );
+ QString question = i18n( "Are you sure you want to delete the \"%1\" database?" ).arg( db );
+
+ KStandardDirs *dirs = m_pPart->instance() ->dirs();
+ QString dbName = dirs->saveLocation( "data", "kdevcppsupport/pcs" ) + KURL::encode_string_no_slash( db ) + ".db";
+
+ if ( KMessageBox::Continue == KMessageBox::warningContinueCancel( 0, question, i18n( "Delete Database" ), KStdGuiItem::del() ) )
+ {
+ m_pPart->removeCatalog( dbName );
+ }
+}
+
+void CCConfigWidget::catalogRegistered( Catalog * c )
+{
+ QFileInfo dbInfo( c->dbName() );
+ QCheckListItem* item = new QCheckListItem( advancedOptions, KURL::decode_string( dbInfo.baseName(true) ), QCheckListItem::CheckBox );
+ item->setOn( c->enabled() );
+
+ m_catalogs[ item ] = c;
+}
+
+void CCConfigWidget::catalogUnregistered( Catalog * c )
+{
+ for ( QMap<QCheckListItem*, Catalog*>::Iterator it = m_catalogs.begin(); it != m_catalogs.end(); ++it )
+ {
+ if ( it.data() == c )
+ {
+ QCheckListItem * item = it.key();
+ delete( item );
+ m_catalogs.remove( it );
+ break;
+ }
+ }
+}
+
+void CCConfigWidget::initGetterSetterTab( )
+{
+ CreateGetterSetterConfiguration * config = m_pPart->createGetterSetterConfiguration();
+
+ if ( config == 0 )
+ return ;
+
+ m_edtGet->setText( config->prefixGet() );
+ m_edtSet->setText( config->prefixSet() );
+ m_edtRemovePrefix->setText( config->prefixVariable().join( "," ) );
+ m_edtParameterName->setText( config->parameterName() );
+
+ slotGetterSetterValuesChanged();
+}
+
+void CCConfigWidget::slotGetterSetterValuesChanged( )
+{
+ bool hasError = false;
+ if ( m_edtParameterName->text().isEmpty() )
+ {
+ m_lblParameterName->setPaletteForegroundColor( QColor( "red" ) );
+ m_edtExampleGet->setText( "error, missing parametername" );
+ m_edtExampleSet->setText( "error, missing parametername" );
+ hasError = true;
+ }
+
+ QString name = m_edtVariableName->text();
+ if ( name.isEmpty() )
+ {
+ m_lblVariableName->setPaletteForegroundColor( QColor( "red" ) );
+ m_edtExampleGet->setText( "error, missing variablename" );
+ m_edtExampleSet->setText( "error, missing variablename" );
+ hasError = true;
+ }
+
+ if ( hasError )
+ {
+ m_edtExampleGet->setPaletteForegroundColor( QColor( "red" ) );
+ m_edtExampleSet->setPaletteForegroundColor( QColor( "red" ) );
+
+ return ;
+ }
+ else
+ {
+ m_lblVariableName->setPaletteForegroundColor( QColor( "black" ) );
+ m_lblParameterName->setPaletteForegroundColor( QColor( "black" ) );
+ m_edtExampleGet->setPaletteForegroundColor( QColor( "black" ) );
+ m_edtExampleSet->setPaletteForegroundColor( QColor( "black" ) );
+ }
+
+ QStringList prefixes = QStringList::split( ",", m_edtRemovePrefix->text().replace( " ", "" ) );
+ unsigned int len = 0;
+ QStringList::ConstIterator theend = prefixes.end();
+ for ( QStringList::ConstIterator ci = prefixes.begin(); ci != theend; ++ci )
+ {
+ if ( name.startsWith( *ci ) && ( *ci ).length() > len )
+ len = ( *ci ).length();
+ }
+
+ if ( len > 0 )
+ name.remove( 0, len );
+
+ QString getName = name;
+ if ( !m_edtGet->text().isEmpty() )
+ {
+ getName[ 0 ] = getName[ 0 ].upper();
+ getName.prepend( m_edtGet->text() );
+ }
+
+ QString setName = name;
+ if ( !m_edtSet->text().isEmpty() )
+ {
+ setName[ 0 ] = setName[ 0 ].upper();
+ setName.prepend( m_edtSet->text() );
+ }
+
+ m_edtExampleGet->setText( "string " + getName + "() const;" );
+ m_edtExampleSet->setText( "void " + setName + "(const string& " + m_edtParameterName->text() + ");" );
+}
+
+void CCConfigWidget::saveGetterSetterTab( )
+{
+ if ( m_edtParameterName->text().isEmpty() || m_edtGet->text() == m_edtSet->text() )
+ return ;
+
+ CreateGetterSetterConfiguration* config = m_pPart->createGetterSetterConfiguration();
+ if ( config == 0 )
+ return ;
+
+ config->setPrefixGet( m_edtGet->text() );
+ config->setPrefixSet( m_edtSet->text() );
+ config->setPrefixVariable( QStringList::split( ",", m_edtRemovePrefix->text().replace( " ", "" ) ) );
+ config->setParameterName( m_edtParameterName->text() );
+ config->store();
+}
+
+void CCConfigWidget::initSplitTab( )
+{
+ CppSplitHeaderSourceConfig * config = m_pPart->splitHeaderSourceConfig();
+
+ if ( config == 0 )
+ return ;
+
+ m_splitEnable->setChecked( config->splitEnabled() );
+ m_splitSync->setChecked( config->autoSync() );
+
+ QString o = config->orientation();
+ m_splitVertical->setChecked( o == "Vertical" );
+ m_splitHorizontal->setChecked( o == "Horizontal" );
+}
+
+void CCConfigWidget::saveSplitTab( )
+{
+ CppSplitHeaderSourceConfig * config = m_pPart->splitHeaderSourceConfig();
+
+ if ( config == 0 )
+ return ;
+
+ config->setSplitEnable( m_splitEnable->isChecked() );
+ config->setAutoSync( m_splitSync->isChecked() );
+
+ if ( m_splitVertical->isChecked() )
+ config->setOrientation( "Vertical" );
+ else if ( m_splitHorizontal->isChecked() )
+ config->setOrientation( "Horizontal" );
+
+ config->store();
+}
+
+void CCConfigWidget::initQtTab()
+{
+ m_qtDir->setMode(KFile::Directory|KFile::ExistingOnly|KFile::LocalOnly);
+
+ QtBuildConfig* c = m_pPart->qtBuildConfig();
+ c->init();
+
+ m_qtUsed->setChecked( c->isUsed() );
+ if( c->version() == 4 )
+ {
+ m_versionQt4->setChecked( true );
+ m_kdevembedded->setEnabled( false );
+ m_kdevexternal->setEnabled( false );
+ m_qtStyleVersion4->setEnabled( true );
+ m_designerPath->setEnabled( true );
+ m_qmakePath->setEnabled( true );
+ m_qtDir->setEnabled( false );
+ m_txtQtDir->setEnabled( false );
+ m_txtDesigner->setEnabled( true );
+ pluginPaths->setEnabled( true );
+ }
+ else
+ {
+ m_versionQt3->setChecked( true );
+ m_kdevembedded->setEnabled( true );
+ m_kdevexternal->setEnabled( true );
+ m_qtStyleVersion4->setEnabled( false );
+ m_designerPath->setEnabled( true );
+ m_qmakePath->setEnabled( true );
+ m_qtDir->setEnabled( true );
+ m_txtQtDir->setEnabled( true );
+ m_txtDesigner->setEnabled( true );
+ pluginPaths->setEnabled( false );
+ }
+ if( c->includeStyle() == 4 )
+ {
+ m_qtStyleVersion4->setChecked( true );
+ }else
+ {
+ m_qtStyleVersion3->setChecked( true );
+ }
+ m_qtDir->setURL( c->root() );
+ isValidQtDir(m_qtDir->url());
+ m_qmakePath->setURL( c->qmakePath() );
+ isExecutable( m_qmakePath->url() );
+ m_designerPath->setURL( c->designerPath() );
+ isExecutable( m_designerPath->url() );
+ if ( c->designerIntegration() == "EmbeddedKDevDesigner" )
+ {
+ m_kdevembedded->setChecked( true );
+ }
+ else if ( c->designerIntegration() == "ExternalKDevDesigner" )
+ {
+ m_kdevexternal->setChecked( true );
+ }else
+ {
+ m_qtdesigner->setChecked( true );
+ }
+}
+
+bool CCConfigWidget::isExecutable( const QString& path )
+{
+ QFileInfo fi(path);
+
+ return ( fi.exists() && fi.isExecutable() );
+}
+
+void CCConfigWidget::isQMakeExecutable( const QString& path )
+{
+ if( !isExecutable( path ) )
+ {
+ m_qmakePath->lineEdit()->setPaletteForegroundColor(QColor("#ff0000"));
+ }else
+ {
+ m_qmakePath->lineEdit()->unsetPalette();
+ }
+}
+
+void CCConfigWidget::isDesignerExecutable( const QString& path )
+{
+ if( !isExecutable( path ) )
+ {
+ m_designerPath->lineEdit()->setPaletteForegroundColor(QColor("#ff0000"));
+ }else
+ {
+ m_designerPath->lineEdit()->unsetPalette();
+ }
+}
+
+void CCConfigWidget::saveQtTab()
+{
+ QtBuildConfig* c = m_pPart->qtBuildConfig();
+
+ c->setUsed( m_qtUsed->isChecked() );
+ if( m_versionQt4->isChecked() )
+ {
+ c->setVersion( 4 );
+ }
+ else
+ {
+ c->setVersion( 3 );
+ }
+ if( m_qtStyleVersion4->isChecked() )
+ {
+ c->setIncludeStyle( 4 );
+ }else
+ {
+ c->setIncludeStyle( 3 );
+ }
+ c->setRoot( m_qtDir->url() );
+ c->setQMakePath( m_qmakePath->url() );
+ c->setDesignerPath( m_designerPath->url() );
+ if( m_kdevembedded->isChecked() )
+ {
+ c->setDesignerIntegration( "EmbeddedKDevDesigner" );
+ }
+ else if ( m_kdevexternal->isChecked() )
+ {
+ c->setDesignerIntegration( "ExternalKDevDesigner" );
+ }else
+ {
+ c->setDesignerIntegration( "ExternalDesigner" );
+ }
+ c->store();
+}
+
+void CCConfigWidget::isValidQtDir( const QString &dir )
+{
+ QFileInfo inc( dir + QString( QChar( QDir::separator() ) )+
+ "include"+QString( QChar( QDir::separator() ) )+
+ "qt.h" );
+ if ( !m_versionQt4->isChecked() && !inc.exists() )
+ {
+ m_qtDir->lineEdit()->setPaletteForegroundColor(QColor("#ff0000"));
+ }else
+ {
+ m_qtDir->lineEdit()->unsetPalette();
+ }
+}
+
+void CCConfigWidget::toggleQtVersion( bool )
+{
+ if ( m_versionQt3->isChecked() )
+ {
+ m_qtStyleVersion4->setEnabled( false );
+ m_qtStyleVersion3->setChecked( true );
+ m_kdevembedded->setEnabled( true );
+ m_kdevexternal->setEnabled( true );
+ pluginPaths->setEnabled( false );
+ }
+ if ( m_versionQt4->isChecked() )
+ {
+ m_qtStyleVersion4->setEnabled( true );
+ m_qtdesigner->setChecked( true );
+ m_kdevembedded->setEnabled( false );
+ m_kdevexternal->setEnabled( false );
+ pluginPaths->setEnabled( true );
+ }
+ isValidQtDir( m_qtDir->url() );
+ isQMakeExecutable( m_qmakePath->url() );
+ isDesignerExecutable( m_designerPath->url() );
+}
+
+void CCConfigWidget::openPluginPaths()
+{
+ kdDebug(9024) << "Plugin paths opened" << endl;
+ QtBuildConfig* c = m_pPart->qtBuildConfig();
+ KDialog d( this );
+ QVBoxLayout* mainlayout = new QVBoxLayout( &d );
+ KPushButton* ok = new KPushButton( KStdGuiItem::ok(), &d );
+ connect( ok, SIGNAL(clicked()), &d, SLOT(accept()));
+ KPushButton* cancel = new KPushButton( KStdGuiItem::cancel(), &d );
+ connect( cancel, SIGNAL(clicked()), &d, SLOT(reject()));
+ QHBoxLayout* btns = new QHBoxLayout( &d );
+ btns->addItem( new QSpacerItem(10,10,QSizePolicy::Expanding) );
+ btns->addWidget(ok);
+ btns->addWidget(cancel);
+
+ d.setCaption( i18n( "Edit Qt4 Designer Plugin Paths" ) );
+ KURLRequester * req = new KURLRequester( &d );
+ req->setMode( KFile::Directory );
+ KEditListBox* p = new KEditListBox( i18n( "Plugin Paths" ), req->customEditor(), &d );
+ p->insertStringList( c->designerPluginPaths() );
+ mainlayout->addWidget( p );
+ mainlayout->addLayout( btns );
+ d.resize( 450, 250 );
+ if( d.exec() == QDialog::Accepted)
+ {
+ c->setDesignerPluginPaths( p->items() );
+ }
+}
+
+#include "ccconfigwidget.moc"
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/ccconfigwidget.h b/languages/cpp/ccconfigwidget.h
new file mode 100644
index 00000000..b8874ed2
--- /dev/null
+++ b/languages/cpp/ccconfigwidget.h
@@ -0,0 +1,74 @@
+/***************************************************************************
+* Copyright (C) 2001 by Daniel Engelschalt *
+* daniel.engelschalt@gmx.net *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef _CCCONFIGWIDGET_H_
+#define _CCCONFIGWIDGET_H_
+
+#include "ccconfigwidgetbase.h"
+#include <qmap.h>
+
+class CppSupportPart;
+class Catalog;
+class QCheckListItem;
+class KEditListBox;
+
+class CCConfigWidget : public CCConfigWidgetBase
+{
+ Q_OBJECT
+
+public:
+ CCConfigWidget( CppSupportPart* part, QWidget* parent = 0, const char* name = 0 );
+ virtual ~CCConfigWidget( );
+
+public slots:
+ void accept( );
+ void slotNewPCS();
+
+protected slots:
+ void slotGetterSetterValuesChanged();
+ virtual void slotRemovePCS();
+
+private slots:
+ void catalogRegistered( Catalog* c );
+ void catalogUnregistered( Catalog* c );
+ void isValidQtDir( const QString & );
+ void isDesignerExecutable( const QString& );
+ void isQMakeExecutable( const QString& );
+ void toggleQtVersion( bool );
+ void openPluginPaths( );
+
+private:
+ bool isExecutable( const QString & );
+
+ void initGeneralTab();
+ void saveFileTemplatesTab();
+
+ void initQtTab();
+ void saveQtTab();
+
+ void initCodeCompletionTab();
+ void saveCodeCompletionTab();
+
+ void initGetterSetterTab();
+ void saveGetterSetterTab();
+
+ void initSplitTab();
+ void saveSplitTab();
+
+private:
+ CppSupportPart* m_pPart;
+ QMap<QCheckListItem*, Catalog*> m_catalogs;
+ KEditListBox* m_designerPluginPaths;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/ccconfigwidgetbase.ui b/languages/cpp/ccconfigwidgetbase.ui
new file mode 100644
index 00000000..b7efc7d0
--- /dev/null
+++ b/languages/cpp/ccconfigwidgetbase.ui
@@ -0,0 +1,1798 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>CCConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>CCConfigWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>839</width>
+ <height>622</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>C++ Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>cpp_options</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>codeCompletionPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Code Completion</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>Code Completion Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkAutomaticCodeCompletion</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>A&amp;utomatic code completion:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Offer options to complete what you are typing.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>inputCodeCompletion</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>How long after a key press to offer suggestions</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>msec</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkListGlobalItems</cstring>
+ </property>
+ <property name="text">
+ <string>List &amp;global items when
+performing automatic completion</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>When this is checked, members of all
+higher namespaces will be included in
+the completion-list while performing
+automatic completion.
+
+This may bloat the completion-list
+and create a significant delay.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this is checked, members of all
+higher namespaces will be included in
+the completion-list while performing
+automatic completion.
+
+This may bloat the completion-list
+and create a significant delay.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkCompleteReturnType</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Do complete member-type-evaluation</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Completely evaluate member-types of
+template-classes (this includes types
+of member-variables and return-types
+of member-functions) in the
+completion-box.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Completely evaluate member-types of
+template-classes (this includes types
+of member-variables and return-types
+of member-functions) in the
+completion-box.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkCompleteArgumentType</cstring>
+ </property>
+ <property name="text">
+ <string>Do complete argument-type-e&amp;valuation</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Completely evaluate the function-argument-types
+of template-class member-functions in the
+completion-box.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Completely evaluate the function-argument-types
+of template-class member-functions in the
+completion-box.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox8_2</cstring>
+ </property>
+ <property name="title">
+ <string>Argument Hint Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkAutomaticArgumentsHint</cstring>
+ </property>
+ <property name="text">
+ <string>Auto&amp;matic arguments hint:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer15</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>inputArgumentsHint</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>msec</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkShowCommentInArgumentHint</cstring>
+ </property>
+ <property name="text">
+ <string>Show comment with
+argument hint</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout12</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup6</cstring>
+ </property>
+ <property name="title">
+ <string>Incremental Parsing</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>radioButton13</cstring>
+ </property>
+ <property name="text">
+ <string>Do not process included headers</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>checkParseMissingHeaders</cstring>
+ </property>
+ <property name="text">
+ <string>Preprocess and parse included
+headers into a database(experimental)</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Parse preprocessed headers that are not part of this project
+into a special completion-database. To reparse the headers delete
+the database and reopen the project.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>checkPreprocessIncludedHeaders</cstring>
+ </property>
+ <property name="text">
+ <string>Preprocess included headers
+(collect macros and visibility-information)</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Try to locate all included files and preprocess them.
+This makes macros and imported namespaces work correctly, and allows KDevelop
+to know what code-items are visible from within which file.
+Note: Parsing may become very slow when this is enabled
+(It will become faster after some time).</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox5</cstring>
+ </property>
+ <property name="title">
+ <string>Code Completion Databases</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Code Completion Databases&lt;/b&gt; are used to store the parsed headers for external libraries, to allow code completion for non-project classes and methods.</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Column 1</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>advancedOptions</cstring>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>newPCSButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click to start the Code Completion database creation wizard.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>removePCSButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox9_2</cstring>
+ </property>
+ <property name="title">
+ <string>Misc</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>checkResolveIncludePaths</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Advanced include-path resolution using make(e&amp;xperimental)</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Try to resolve the include-path by getting the command that would be used
+for compiling the file and parsing the gcc-options. The build-system needs to be working,
+test for problems by running "make -n -W myfile.cpp myfile.o" in the directory.
+This also works with cmake, and maybe some other build-systems that build on make.
+The project needs to be compiled or at least configured before this system may work.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>checkShowTypeEvaluationInStatusBar</cstring>
+ </property>
+ <property name="text">
+ <string>Show t&amp;ype evaluation in status bar</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>editIncludePaths</cstring>
+ </property>
+ <property name="text">
+ <string>src;</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A semicolon-separated list of include-paths to be used while searching for headers.
+Paths not starting with '/' will be interpreted as relative to the project-folder.</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>editNamespaceAlias</cstring>
+ </property>
+ <property name="text">
+ <string>std=_GLIBCXX_STD</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>This line may contain a semicolon-separated list of namespace-aliases and namespace-imports.
+example: "std&lt;&lt;_GLIBCXX_STD;NewNamespaceName=OldNamespaceName; &lt;&lt; SomeGloballyImportedNamespace" (without paratheses).
+"&lt;&lt;" means that the right namespace is imported into the left, while "=" means that both namespaces are treated as
+if they were one("a=b" is equivalent to "a&lt;&lt;b;b&lt;&lt;a")</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1_6</cstring>
+ </property>
+ <property name="text">
+ <string>Custom include paths:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Namespace alias list:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer15_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>navigationTab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Navigation</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox12</cstring>
+ </property>
+ <property name="title">
+ <string>Header/Source split (Highly Experimental)</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_splitEnable</cstring>
+ </property>
+ <property name="text">
+ <string>Enable split of Header/So&amp;urce files</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Check to have header and source appear in the same page.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check to have header and source appear in the same page.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_splitSync</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Automatic S&amp;ynchronize</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Check to have the source file scroll as you
+navigate the header and vice versa</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check to have the source file scroll as you
+navigate the header and vice versa</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>m_splitOrientationBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Orientation</string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select which Qt version your project is using.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_splitVertical</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Vertical</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select this if your project is using Qt version 3.x.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_splitHorizontal</cstring>
+ </property>
+ <property name="text">
+ <string>Hori&amp;zontal</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select this if your project is using Qt version 4.x.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer12_2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>400</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>groupBox21</cstring>
+ </property>
+ <property name="title">
+ <string>Context Menu</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_switchShouldMatch</cstring>
+ </property>
+ <property name="text">
+ <string>Switch Header/Implementation &amp;matches current function</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Check to have the &lt;b&gt;Switch Header/Implementation&lt;/b&gt;
+feature attempt to match the function under the
+cursor with the matching declaration/definition.
+</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check to have the &lt;b&gt;Switch Header/Implementation&lt;/b&gt;
+feature attempt to match the function under the
+cursor with the matching declaration/definition.
+</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_showContextMenuExplosion</cstring>
+ </property>
+ <property name="text">
+ <string>Show Go To &amp;Declaration/Definition submenus</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Check to show two additional submenus
+in the editor context menu containing
+all the declarations and definitions
+for the current file and its matching
+header/implementation file.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check to show two additional submenus
+in the editor context menu containing
+all the declarations and definitions
+for the current file and its matching
+header/implementation file.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBox18</cstring>
+ </property>
+ <property name="text">
+ <string>Show type evaluation &amp;based navigation menus</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Menus appear on the right mouse click context menu,
+hows menu items to navigate. Needs the "Class View"
+plugin enabled to have use all options.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Menus appear on the right mouse click context menu,
+hows menu items to navigate. Needs the "Class View"
+plugin enabled to have use all options.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>classWizardPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Class Wi&amp;zard</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>options</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Filename options</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>These are the suffixes used by the Class Wizard when creating new classes.&lt;br&gt;Should be in the format: ".suffix"</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>interface_suffix</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>implementation_suffix</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Interface suffix:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>interface_suffix</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>I&amp;mplementation suffix:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>implementation_suffix</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer12_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>337</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>qtPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Qt Options</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_qtUsed</cstring>
+ </property>
+ <property name="text">
+ <string>Enable Qt opt&amp;ions</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>m_qtVersionDirectoryBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Qt Version, Directory and QMake Binary</string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select which Qt version your project is using and where that Qt version is installed to.
+
+This option only applies to QMake projects.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_versionQt3</cstring>
+ </property>
+ <property name="text">
+ <string>Qt 3</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Use Qt version 3 (When this is changed the project needs to be closed and re-opened.)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select this if your project is using Qt version 3.x.&lt;br&gt;When this is changed the project needs to be closed and re-opened.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_versionQt4</cstring>
+ </property>
+ <property name="text">
+ <string>Qt 4</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Use Qt version 4 (When this is changed the project needs to be closed and re-opened.)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select this if your project is using Qt version 4.x.&lt;br&gt;When this is changed the project needs to be closed and re-opened.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_5</cstring>
+ </property>
+ <property name="text">
+ <string>(After changing the project needs to be re-opened)</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer13_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>470</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_txtQtDir</cstring>
+ </property>
+ <property name="text">
+ <string>Qt3 Directory:</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>This setting is only needed for Qt3 programs, for Qt4 just make sure the QMake Binary is set properly</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>m_qtDir</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>The Qt directory, will be red if it is not a valid Qt directory. This setting is only needed for Qt3 programs.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the directory that Qt was installed to. If this is shown in red the directory is not a valid Qt directory.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_txtQMake</cstring>
+ </property>
+ <property name="text">
+ <string>QMake Binary:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>m_qmakePath</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>The full path to the QMake executable to be used</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>m_qtStyleBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Qt include syntax</string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select which include style your project is using.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_qtStyleVersion3</cstring>
+ </property>
+ <property name="text">
+ <string>Qt &amp;3 style (#include &lt;qwidget.h&gt;)</string>
+ </property>
+ <property name="accel">
+ <string>Alt+3</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select this if your project is using include style as known from Qt version 3.x.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_qtStyleVersion4</cstring>
+ </property>
+ <property name="text">
+ <string>Qt &amp;4 style (#include &lt;QWidget&gt;)</string>
+ </property>
+ <property name="accel">
+ <string>Alt+4</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select this if your project is using include style as known from Qt version 4.x.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>m_designerBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>UI Designer Integration</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_kdevembedded</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use KDevelop's embedded designer</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Start KDevelop's own designer embedded within KDevelop</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>KDevelop comes with its own UI designer that can either be embedded or be run as a separate program. Check this button if you wish to integrate the UI designer into KDevelop.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_kdevexternal</cstring>
+ </property>
+ <property name="text">
+ <string>Run &amp;KDevelop's designer as a separate application</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Start KDevelop's own designer externally</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>KDevelop comes with its own UI designer that can either be embedded or be run as a separate program. Check this button if you wish to run KDevelop's UI designer as a separate program.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_qtdesigner</cstring>
+ </property>
+ <property name="text">
+ <string>Run Qt &amp;Designer</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Use Qt Designer externally</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this button if you wish to use Qt Designer rather than KDevelop's integrated designer.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_txtDesigner</cstring>
+ </property>
+ <property name="text">
+ <string>Designer Binary:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_designerPath</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>m_designerPath</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>The full path to the Designer executable to be used</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>Extra Plugin Paths for Qt4 Designer:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_designerPrefix</cstring>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>pluginPaths</cstring>
+ </property>
+ <property name="text">
+ <string>Change Plugin Paths</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer14_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>70</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>accessorPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Accessors</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>groupBox8</cstring>
+ </property>
+ <property name="title">
+ <string>E&amp;xample for Member Variable of Type String</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout5_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lblVariableName</cstring>
+ </property>
+ <property name="text">
+ <string>Variable name:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>m_edtVariableName</cstring>
+ </property>
+ <property name="text">
+ <string>m_x</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>61</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>m_edtExampleGet</cstring>
+ </property>
+ <property name="text">
+ <string>int x() const;</string>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>m_edtExampleSet</cstring>
+ </property>
+ <property name="text">
+ <string>void setX(const string&amp; theValue);</string>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>Get method:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>Set method:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox9</cstring>
+ </property>
+ <property name="title">
+ <string>Settings</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Will show as "Create Accessor Methods" in the
+right mouse button context menu only when
+you right click on a variable in a header file.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Will show as "Create Accessor Methods" in the
+right mouse button context menu only when
+you right click on a variable in a header file.</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit" row="1" column="0">
+ <property name="name">
+ <cstring>m_edtGet</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Will show as "Create Accessor Methods" in the
+right mouse button context menu only when
+you right click on a variable in a header file.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Will show as "Create Accessor Methods" in the
+right mouse button context menu only when
+you right click on a variable in a header file.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_lblGet</cstring>
+ </property>
+ <property name="text">
+ <string>Prefix for &lt;b&gt;get&lt;/b&gt; methods:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="2">
+ <property name="name">
+ <cstring>m_edtSet</cstring>
+ </property>
+ <property name="text">
+ <string>set</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Will show as "Create Accessor Methods" in the
+right mouse button context menu only when
+you right click on a variable in a header file.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Will show as "Create Accessor Methods" in the
+right mouse button context menu only when
+you right click on a variable in a header file.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_lblSet</cstring>
+ </property>
+ <property name="text">
+ <string>Prefix for &lt;b&gt;set&lt;/b&gt; methods:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="3" column="0">
+ <property name="name">
+ <cstring>m_edtRemovePrefix</cstring>
+ </property>
+ <property name="text">
+ <string>m_</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_lblRemovePrefix</cstring>
+ </property>
+ <property name="text">
+ <string>Member &lt;b&gt;variable&lt;/b&gt; prefix to remove:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="3" column="2">
+ <property name="name">
+ <cstring>m_edtParameterName</cstring>
+ </property>
+ <property name="text">
+ <string>theValue</string>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer5_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>87</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="2" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_lblParameterName</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Parametername&lt;/b&gt; in set method:</string>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>87</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="3" column="3">
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>92</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="3">
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>92</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer36</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>91</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>newPCSButton</sender>
+ <signal>clicked()</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>slotNewPCS()</slot>
+ </connection>
+ <connection>
+ <sender>m_edtVariableName</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>slotGetterSetterValuesChanged()</slot>
+ </connection>
+ <connection>
+ <sender>m_edtRemovePrefix</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>slotGetterSetterValuesChanged()</slot>
+ </connection>
+ <connection>
+ <sender>m_edtGet</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>slotGetterSetterValuesChanged()</slot>
+ </connection>
+ <connection>
+ <sender>m_edtSet</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>slotGetterSetterValuesChanged()</slot>
+ </connection>
+ <connection>
+ <sender>m_edtParameterName</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>slotGetterSetterValuesChanged()</slot>
+ </connection>
+ <connection>
+ <sender>checkAutomaticCodeCompletion</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>inputCodeCompletion</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkAutomaticArgumentsHint</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>inputArgumentsHint</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>removePCSButton</sender>
+ <signal>clicked()</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>slotRemovePCS()</slot>
+ </connection>
+ <connection>
+ <sender>m_splitEnable</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>slotEnableSplit(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_splitEnable</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_splitSync</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_qtUsed</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_qtStyleBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_qtUsed</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_qtVersionDirectoryBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_qtUsed</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_designerBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_splitEnable</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_splitOrientationBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_versionQt3</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>toggleQtVersion(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_versionQt4</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>toggleQtVersion(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_qtdesigner</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_txtDesigner</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_qtdesigner</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_designerPath</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_kdevexternal</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_txtDesigner</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_kdevembedded</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_txtDesigner</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_kdevexternal</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_designerPath</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_kdevembedded</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_designerPath</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_versionQt4</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_qtDir</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_versionQt4</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_txtQtDir</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_versionQt3</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_txtQtDir</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_versionQt3</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_qtDir</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_qtDir</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>isValidQtDir(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>m_qmakePath</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>isQMakeExecutable(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>m_qmakePath</sender>
+ <signal>urlSelected(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>isQMakeExecutable(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>m_qtDir</sender>
+ <signal>urlSelected(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>isValidQtDir(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>m_designerPath</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>isDesignerExecutable(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>m_designerPath</sender>
+ <signal>urlSelected(const QString&amp;)</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>isDesignerExecutable(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>m_versionQt4</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel1_4</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>pluginPaths</sender>
+ <signal>clicked()</signal>
+ <receiver>CCConfigWidgetBase</receiver>
+ <slot>openPluginPaths()</slot>
+ </connection>
+ <connection>
+ <sender>m_versionQt4</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>pluginPaths</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>cpp_options</tabstop>
+ <tabstop>checkAutomaticCodeCompletion</tabstop>
+ <tabstop>inputCodeCompletion</tabstop>
+ <tabstop>checkAutomaticArgumentsHint</tabstop>
+ <tabstop>inputArgumentsHint</tabstop>
+ <tabstop>newPCSButton</tabstop>
+ <tabstop>advancedOptions</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kurlrequester.h</include>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected">implementationFile()</slot>
+ <slot access="protected">interfaceFile()</slot>
+ <slot access="protected">slotAddPPPath()</slot>
+ <slot access="protected">slotEnableCC()</slot>
+ <slot access="protected">slotEnableCH()</slot>
+ <slot access="protected">slotEnableChooseFiles( bool )</slot>
+ <slot access="protected">slotEnablePCS()</slot>
+ <slot access="protected">slotEnablePP()</slot>
+ <slot access="protected">slotRemovePPPath()</slot>
+ <slot access="protected">slotSelectTemplateGroup( const QString &amp; )</slot>
+ <slot access="protected">slotSetCHWindow()</slot>
+ <slot>slotNewPCS()</slot>
+ <slot access="protected">slotGetterSetterValuesChanged()</slot>
+ <slot access="protected">slotRemovePCS()</slot>
+ <slot access="protected">slotEnableSplit( bool )</slot>
+ <slot>toggleQtVersion(bool)</slot>
+ <slot>isDesignerExecutable(const QString&amp;)</slot>
+ <slot>isQMakeExecutable(const QString&amp;)</slot>
+ <slot>isValidQtDir(const QString&amp;)</slot>
+ <slot>openPluginPaths()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/classgeneratorconfig.cpp b/languages/cpp/classgeneratorconfig.cpp
new file mode 100644
index 00000000..c6049801
--- /dev/null
+++ b/languages/cpp/classgeneratorconfig.cpp
@@ -0,0 +1,236 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* cloudtemple@mksat.net *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qtextedit.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+
+#include <kstandarddirs.h>
+#include <kconfig.h>
+
+#include "cppsupportfactory.h"
+#include "classgeneratorconfig.h"
+
+ClassGeneratorConfig::ClassGeneratorConfig( QWidget* parent, const char* name, WFlags fl )
+ : ClassGeneratorConfigBase( parent, name, fl )
+{
+ readConfig();
+ currTemplate = &cppHeaderText;
+ template_edit->setText( *currTemplate );
+}
+
+ClassGeneratorConfig::ClassGeneratorConfig( QString v_cppHeaderText, QString v_cppSourceText,
+ QString v_objcHeaderText, QString v_objcSourceText,
+ QString v_gtkHeaderText, QString v_gtkSourceText,
+ NameCase v_fileCase, NameCase v_defCase, NameCase v_superCase,
+ bool v_showAuthor, bool v_genDoc, bool v_reformat,
+ QWidget* parent, const char* name, WFlags fl )
+ : ClassGeneratorConfigBase( parent, name, fl ),
+ cppHeaderText( v_cppHeaderText ), cppSourceText( v_cppSourceText ),
+ objcHeaderText( v_objcHeaderText ), objcSourceText( v_objcSourceText ),
+ gtkHeaderText( v_gtkHeaderText ), gtkSourceText( v_gtkSourceText )
+{
+ filecase_box->setCurrentItem( ( int ) v_fileCase );
+ defcase_box->setCurrentItem( ( int ) v_defCase );
+ supercase_box->setCurrentItem( ( int ) v_superCase );
+ author_box->setChecked( v_showAuthor );
+ doc_box->setChecked( v_genDoc );
+ reformat_box->setChecked( v_reformat );
+
+ currTemplate = &cppHeaderText;
+}
+
+ClassGeneratorConfig::~ClassGeneratorConfig()
+{}
+
+/*$SPECIALIZATION$*/
+void ClassGeneratorConfig::templateTypeChanged( int type )
+{
+ *currTemplate = template_edit->text();
+
+ currTemplate = identifyTemplate( type );
+ template_edit->setText( *currTemplate );
+}
+
+QString ClassGeneratorConfig::cppHeader()
+{
+ if ( currTemplate == &cppHeaderText )
+ * currTemplate = template_edit->text();
+ return cppHeaderText;
+}
+
+QString ClassGeneratorConfig::cppSource()
+{
+ if ( currTemplate == &cppSourceText )
+ * currTemplate = template_edit->text();
+ return cppSourceText;
+}
+
+QString ClassGeneratorConfig::objcHeader()
+{
+ if ( currTemplate == &objcHeaderText )
+ * currTemplate = template_edit->text();
+ return objcHeaderText;
+}
+
+QString ClassGeneratorConfig::objcSource()
+{
+ if ( currTemplate == &objcSourceText )
+ * currTemplate = template_edit->text();
+ return objcSourceText;
+}
+
+QString ClassGeneratorConfig::gtkHeader()
+{
+ if ( currTemplate == &gtkHeaderText )
+ * currTemplate = template_edit->text();
+ return gtkHeaderText;
+}
+
+QString ClassGeneratorConfig::gtkSource()
+{
+ if ( currTemplate == &gtkSourceText )
+ * currTemplate = template_edit->text();
+ return gtkSourceText;
+}
+
+ClassGeneratorConfig::NameCase ClassGeneratorConfig::fileCase()
+{
+ return ( NameCase ) filecase_box->currentItem();
+}
+
+ClassGeneratorConfig::NameCase ClassGeneratorConfig::defCase()
+{
+ return ( NameCase ) defcase_box->currentItem();
+}
+
+ClassGeneratorConfig::NameCase ClassGeneratorConfig::superCase()
+{
+ return ( NameCase ) supercase_box->currentItem();
+}
+
+bool ClassGeneratorConfig::showAuthor()
+{
+ return author_box->isChecked();
+}
+
+bool ClassGeneratorConfig::genDoc()
+{
+ return doc_box->isChecked();
+}
+
+QString *ClassGeneratorConfig::identifyTemplate( int value )
+{
+ switch ( value )
+ {
+ case 0:
+ return & cppHeaderText;
+ case 1:
+ return &cppSourceText;
+ case 2:
+ return &objcHeaderText;
+ case 3:
+ return &objcSourceText;
+ case 4:
+ return &gtkHeaderText;
+ case 5:
+ return &gtkSourceText;
+ }
+ return 0;
+}
+
+void ClassGeneratorConfig::readConfig()
+{
+ KConfig * config = CppSupportFactory::instance() ->config();
+ if ( config )
+ {
+ config->setGroup( "Class Generator" );
+
+ filecase_box->setCurrentItem( config->readNumEntry( "File Name Case", 0 ) );
+ defcase_box->setCurrentItem( config->readNumEntry( "Defines Case", 1 ) );
+ supercase_box->setCurrentItem( config->readNumEntry( "Superclasss Name Case", 0 ) );
+
+ author_box->setChecked( config->readBoolEntry( "Show Author Name", 1 ) );
+ doc_box->setChecked( config->readBoolEntry( "Generate Empty Documentation", 1 ) );
+
+ reformat_box->setChecked( config->readBoolEntry( "Reformat Source", 0 ) );
+
+ KStandardDirs *dirs = CppSupportFactory::instance() ->dirs();
+
+ cppHeaderText = templateText( dirs->findResource( "newclasstemplates", "cpp_header" ) );
+ cppSourceText = templateText( dirs->findResource( "newclasstemplates", "cpp_source" ) );
+ objcHeaderText = templateText( dirs->findResource( "newclasstemplates", "objc_header" ) );
+ objcSourceText = templateText( dirs->findResource( "newclasstemplates", "objc_source" ) );
+ gtkHeaderText = templateText( dirs->findResource( "newclasstemplates", "gtk_header" ) );
+ gtkSourceText = templateText( dirs->findResource( "newclasstemplates", "gtk_source" ) );
+ }
+}
+
+
+QString ClassGeneratorConfig::templateText( QString path )
+{
+ QFileInfo f( path );
+ if ( f.exists() )
+ {
+ QFile file( path );
+ if ( file.open( IO_ReadOnly ) )
+ {
+ QTextStream stream( &file );
+ return stream.read();
+ }
+ else
+ return "";
+ }
+ else
+ return "";
+}
+
+void ClassGeneratorConfig::storeConfig()
+{
+ KConfig * config = CppSupportFactory::instance() ->config();
+ if ( config )
+ {
+ config->setGroup( "Class Generator" );
+
+ config->writeEntry( "File Name Case", filecase_box->currentItem() );
+ config->writeEntry( "Defines Case", defcase_box->currentItem() );
+ config->writeEntry( "Superclasss Name Case", supercase_box->currentItem() );
+
+ config->writeEntry( "Show Author Name", author_box->isChecked() );
+ config->writeEntry( "Generate Empty Documentation", doc_box->isChecked() );
+
+ config->writeEntry( "Reformat Source", reformat_box->isChecked() );
+
+ KStandardDirs *dirs = CppSupportFactory::instance() ->dirs();
+
+ saveTemplateText( dirs->saveLocation( "newclasstemplates" ) + "cpp_header", cppHeader() );
+ saveTemplateText( dirs->saveLocation( "newclasstemplates" ) + "cpp_source", cppSource() );
+ saveTemplateText( dirs->saveLocation( "newclasstemplates" ) + "objc_header", objcHeader() );
+ saveTemplateText( dirs->saveLocation( "newclasstemplates" ) + "objc_source", objcSource() );
+ saveTemplateText( dirs->saveLocation( "newclasstemplates" ) + "gtk_header", gtkHeader() );
+ saveTemplateText( dirs->saveLocation( "newclasstemplates" ) + "gtk_source", gtkSource() );
+ }
+}
+
+void ClassGeneratorConfig::saveTemplateText( QString path, QString content )
+{
+ QFile f( path );
+ if ( f.open( IO_WriteOnly ) )
+ {
+ QTextStream stream( &f );
+ stream << content;
+ f.close();
+ }
+}
+
+#include "classgeneratorconfig.moc"
diff --git a/languages/cpp/classgeneratorconfig.h b/languages/cpp/classgeneratorconfig.h
new file mode 100644
index 00000000..b9cb08a3
--- /dev/null
+++ b/languages/cpp/classgeneratorconfig.h
@@ -0,0 +1,81 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* cloudtemple@mksat.net *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef CLASSGENERATORCONFIG_H
+#define CLASSGENERATORCONFIG_H
+
+#include "classgeneratorconfigbase.h"
+
+class ClassGeneratorConfig : public ClassGeneratorConfigBase
+{
+ Q_OBJECT
+
+public:
+ enum NameCase { LowerCase, UpperCase, SameAsClassCase, SameAsFileCase };
+
+ ClassGeneratorConfig( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+
+ ClassGeneratorConfig( QString v_cppHeaderText, QString v_cppSourceText,
+ QString v_objcHeaderText, QString v_objcSourceText,
+ QString v_gtkHeaderText, QString v_gtkSourceText,
+ NameCase v_fileCase, NameCase v_defCase, NameCase v_superCase,
+ bool v_showAuthor, bool v_genDoc, bool v_reformat,
+ QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+
+ ~ClassGeneratorConfig();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ void readConfig();
+
+ QString cppHeader();
+ QString cppSource();
+ QString objcHeader();
+ QString objcSource();
+ QString gtkHeader();
+ QString gtkSource();
+
+ NameCase fileCase();
+ NameCase defCase();
+ NameCase superCase();
+
+ bool showAuthor();
+ bool genDoc();
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ void storeConfig();
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ virtual void templateTypeChanged( int type );
+
+private:
+ QString *identifyTemplate( int value );
+ QString templateText( QString path );
+ void saveTemplateText( QString path, QString content );
+
+ QString cppHeaderText;
+ QString cppSourceText;
+ QString objcHeaderText;
+ QString objcSourceText;
+ QString gtkHeaderText;
+ QString gtkSourceText;
+
+ QString *currTemplate;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
+
diff --git a/languages/cpp/classgeneratorconfigbase.ui b/languages/cpp/classgeneratorconfigbase.ui
new file mode 100644
index 00000000..566e9eb2
--- /dev/null
+++ b/languages/cpp/classgeneratorconfigbase.ui
@@ -0,0 +1,261 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ClassGeneratorConfigBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ClassGeneratorConfigBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>576</width>
+ <height>528</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox7_2</cstring>
+ </property>
+ <property name="title">
+ <string>Class &amp;Templates</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="0">
+ <item>
+ <property name="text">
+ <string>Cpp Header</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Cpp Source</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Objective-C Header</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Objective-C Source</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>GTK C Header</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>GTK C Source</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>templatename_box</cstring>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="1" column="0">
+ <property name="name">
+ <cstring>template_edit</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>groupBox10</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Names</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>#ifndef - #&amp;define names:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>defcase_box</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;File names:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>filecase_box</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="0">
+ <item>
+ <property name="text">
+ <string>Lowercase</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Uppercase</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Same as Class Names</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>filecase_box</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <item>
+ <property name="text">
+ <string>Lowercase</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Uppercase</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Same as Class Names</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Same as File Names</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>defcase_box</cstring>
+ </property>
+ <property name="currentItem">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="2">
+ <item>
+ <property name="text">
+ <string>Lowercase</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Uppercase</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Same as Class Names</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>supercase_box</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>textLabel3_3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Superclass file names:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>supercase_box</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>groupBox9</cstring>
+ </property>
+ <property name="title">
+ <string>Class Documentation</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>author_box</cstring>
+ </property>
+ <property name="text">
+ <string>Include &amp;author name in class documentation</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>doc_box</cstring>
+ </property>
+ <property name="text">
+ <string>Generate &amp;empty documentation strings</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>reformat_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Reformat source before creating files</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>templatename_box</sender>
+ <signal>activated(int)</signal>
+ <receiver>ClassGeneratorConfigBase</receiver>
+ <slot>templateTypeChanged(int)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>templatename_box</tabstop>
+ <tabstop>template_edit</tabstop>
+ <tabstop>filecase_box</tabstop>
+ <tabstop>defcase_box</tabstop>
+ <tabstop>supercase_box</tabstop>
+ <tabstop>author_box</tabstop>
+ <tabstop>doc_box</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected">templateTypeChanged(int type)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/cpp/codecompletionentry.h b/languages/cpp/codecompletionentry.h
new file mode 100644
index 00000000..60042004
--- /dev/null
+++ b/languages/cpp/codecompletionentry.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+ cppcodecompletion.cpp - description
+ -------------------
+ begin : Sat Jul 21 2001
+ copyright : (C) 2001 by Victor R�er
+ email : victor_roeder@gmx.de
+ copyright : (C) 2002,2003 by Roberto Raggi
+ email : roberto@kdevelop.org
+ copyright : (C) 2005 by Adam Treat
+ email : manyoso@yahoo.com
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __CODECOMPLETIONENTRY_H__
+#define __CODECOMPLETIONENTRY_H__
+
+#include <ktexteditor/codecompletioninterface.h>
+
+//this is just a little helper-class to allow custom sorting, it must stay binary compatible with KTextEditor::CompletionEntry!!
+class CodeCompletionEntry : public KTextEditor::CompletionEntry
+{
+public:
+ CodeCompletionEntry() : KTextEditor::CompletionEntry() {
+ }
+ CodeCompletionEntry( const CodeCompletionEntry& rhs ) : KTextEditor::CompletionEntry( rhs ) {
+ }
+ CodeCompletionEntry( const KTextEditor::CompletionEntry& rhs ) : KTextEditor::CompletionEntry( rhs ) {
+ }
+
+ bool operator < ( const CodeCompletionEntry& rhs ) {
+ return userdata < rhs.userdata;
+ }
+ bool operator == ( const CodeCompletionEntry& rhs ) {
+ return userdata == rhs.userdata;
+ }
+ bool operator > ( const CodeCompletionEntry& rhs ) {
+ return userdata > rhs.userdata;
+ }
+
+ CodeCompletionEntry& operator = ( const KTextEditor::CompletionEntry& rhs ) {
+ (*(KTextEditor::CompletionEntry*)this) = rhs;
+ return *this;
+ }
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/codeinformationrepository.cpp b/languages/cpp/codeinformationrepository.cpp
new file mode 100644
index 00000000..5bb22a68
--- /dev/null
+++ b/languages/cpp/codeinformationrepository.cpp
@@ -0,0 +1,339 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include "codeinformationrepository.h"
+#include "cpp_tags.h"
+
+#include <kdevcoderepository.h>
+#include <kdebug.h>
+
+/// @todo move in utils.cpp
+static QValueList<KTextEditor::CompletionEntry>
+my_unique( const QValueList<KTextEditor::CompletionEntry>& entryList )
+{
+
+ QValueList< KTextEditor::CompletionEntry > l;
+ QMap<QString, bool> map;
+ QValueList< KTextEditor::CompletionEntry >::ConstIterator it = entryList.begin();
+ while ( it != entryList.end() )
+ {
+ KTextEditor::CompletionEntry e = *it++;
+ QString key = e.type + " " +
+ e.text + " " +
+ e.prefix + " " +
+ e.postfix + " ";
+ if ( map.find( key ) == map.end() )
+ {
+ map[ key ] = TRUE;
+ l << e;
+ }
+ }
+ return l;
+}
+
+CodeInformationRepository::CodeInformationRepository( KDevCodeRepository* rep )
+ : m_rep( rep )
+{}
+
+CodeInformationRepository::~CodeInformationRepository()
+{}
+
+QValueList<Tag> CodeInformationRepository::query( const QValueList<Catalog :: QueryArgument> & args )
+{
+// kdDebug( 9007 ) << "CodeInformationRepository::query()" << endl;
+
+ QValueList<Tag> tags;
+
+ QValueList<Catalog*> catalogs = m_rep->registeredCatalogs();
+ QValueList<Catalog*>::Iterator it = catalogs.begin();
+ while ( it != catalogs.end() )
+ {
+ Catalog * catalog = *it;
+ ++it;
+
+ if ( !catalog->enabled() )
+ continue;
+
+ tags += catalog->query( args );
+ }
+
+ return tags;
+}
+
+QValueList<Tag> CodeInformationRepository::getTagsInFile( const QString & fileName )
+{
+ kdDebug( 9007 ) << "CodeInformationRepository::getTagsInFile()" << endl;
+
+ QValueList<Catalog::QueryArgument> args;
+ args << Catalog::QueryArgument( "fileName", fileName );
+
+ QValueList<Catalog*> catalogs = m_rep->registeredCatalogs();
+ QValueList<Catalog*>::Iterator it = catalogs.begin();
+ while ( it != catalogs.end() )
+ {
+ Catalog * catalog = *it;
+ ++it;
+
+ QValueList<Tag> tags = catalog->query( args );
+
+ if ( tags.size() )
+ return tags;
+ }
+
+ return QValueList<Tag>();
+}
+
+QValueList<Tag> CodeInformationRepository::getTagsInScope( const QStringList & scope, bool // isInstance
+ )
+{
+ kdDebug( 9007 ) << "CodeInformationRepository::getTagsInScope()" << endl;
+
+ QValueList<Tag> tags;
+ QValueList<Catalog::QueryArgument> args;
+
+#if 0
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Namespace )
+ << Catalog::QueryArgument( "scope", scope );
+ tags += query( args );
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Class )
+ << Catalog::QueryArgument( "scope", scope );
+ tags += query( args );
+#endif
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_FunctionDeclaration )
+ << Catalog::QueryArgument( "scope", scope );
+ tags += query( args );
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Variable )
+ << Catalog::QueryArgument( "scope", scope );
+ tags += query( args );
+
+ if ( true /*!isInstance*/ )
+ {
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Enumerator )
+ << Catalog::QueryArgument( "scope", scope );
+ tags += query( args );
+ }
+
+ return tags;
+}
+
+QValueList<KTextEditor::CompletionEntry> CodeInformationRepository::getEntriesInScope( const QStringList & scope, bool isInstance, bool recompute )
+{
+ kdDebug( 9007 ) << "CodeInformationRepository::getEntriesInScope()" << endl;
+
+ if ( !recompute && !scope.size() && m_globalEntries.size() )
+ return m_globalEntries;
+ else if ( scope.size() == 0 )
+ {
+ m_globalEntries = my_unique( toEntryList( getTagsInScope( scope, isInstance ) ) );
+ return m_globalEntries;
+ }
+
+ return toEntryList( getTagsInScope( scope, isInstance ) );
+}
+
+
+QValueList<Tag> CodeInformationRepository::getBaseClassList( const QString& className )
+{
+// kdDebug( 9007 ) << "CodeInformationRepository::getBaseClassList()" << endl;
+
+ if ( className.isEmpty() )
+ return QValueList<Tag>();
+
+ QValueList<Catalog::QueryArgument> args;
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Base_class );
+ /* if( className.length() >= 2 )
+ args << Catalog::QueryArgument( "prefix", className.left(2) );*/
+ args << Catalog::QueryArgument( "name", className );
+ return query( args );
+}
+
+QValueList<Tag> CodeInformationRepository::getClassOrNamespaceList( const QStringList & scope )
+{
+ kdDebug( 9007 ) << "CodeInformationRepository::getClassOrNamespaceList()" << endl;
+
+ QValueList<Tag> tags;
+ QValueList<Catalog::QueryArgument> args;
+
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Namespace )
+ << Catalog::QueryArgument( "scope", scope );
+ tags += query( args );
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Class )
+ << Catalog::QueryArgument( "scope", scope );
+ tags += query( args );
+
+ return tags;
+}
+
+QValueList<Tag> CodeInformationRepository::getTagsInScope( const QString & name, const QStringList & scope )
+{
+ QValueList<Tag> tags;
+ QValueList<Catalog::QueryArgument> args;
+
+ args.clear();
+ args << Catalog::QueryArgument( "scope", scope );
+ /* if( name.length() >= 2 )
+ args << Catalog::QueryArgument( "prefix", name.left(2) ); */
+ args << Catalog::QueryArgument( "name", name );
+
+ tags += query( args );
+
+ return tags;
+}
+
+KTextEditor::CompletionEntry CodeInformationRepository::toEntry( Tag & tag, CppCodeCompletion::CompletionMode completionMode, TypeProcessor* proc )
+{
+ KTextEditor::CompletionEntry entry;
+
+ if ( tag.name().isEmpty() )
+ return entry;
+
+ switch ( tag.kind() )
+ {
+ case Tag::Kind_Typedef:
+ entry.prefix = "typedef";
+ entry.text = tag.name();
+ break;
+
+ case Tag::Kind_Class:
+ entry.prefix = "class";
+ entry.text = tag.name();
+ break;
+
+ case Tag::Kind_Struct:
+ entry.prefix = "struct";
+ entry.text = tag.name();
+ break;
+
+ case Tag::Kind_Namespace:
+ entry.prefix = "namespace";
+ entry.text = tag.name();
+ break;
+
+ case Tag::Kind_FunctionDeclaration:
+ //case Tag::Kind_Function:
+ {
+
+ CppFunction<Tag> tagInfo( tag );
+ QStringList arguments = tagInfo.arguments();
+ QStringList argumentNames = tagInfo.argumentNames();
+
+ if ( completionMode == CppCodeCompletion::VirtualDeclCompletion )
+ {
+ //Ideally the type info would be a entry.prefix, but we need them to be
+ //inserted upon completion so they have to be part of entry.text
+ entry.text = tagInfo.type();
+ entry.text += " ";
+ entry.text += tag.name();
+ }
+ else
+ entry.text = tag.name();
+
+ if ( !arguments.size() )
+ entry.text += "(";
+ else
+ entry.text += "( ";
+
+ QString signature;
+ for ( uint i = 0; i < arguments.size(); ++i )
+ {
+ if( !proc )
+ signature += arguments[ i ];
+ else
+ signature += proc->processType( arguments[ i ] );
+
+ if ( completionMode == CppCodeCompletion::NormalCompletion ||
+ completionMode == CppCodeCompletion::VirtualDeclCompletion )
+ {
+ QString argName = argumentNames[ i ];
+ if ( !argName.isEmpty() )
+ signature += QString::fromLatin1( " " ) + argName;
+
+ }
+
+ if ( i != ( arguments.size() - 1 ) )
+ {
+ signature += ", ";
+ }
+ }
+
+ if ( signature.isEmpty() )
+ entry.text += ")";
+ else
+ entry.postfix = signature + " )";
+
+ if ( tagInfo.isConst() )
+ entry.postfix += " const";
+
+ if ( completionMode == CppCodeCompletion::VirtualDeclCompletion )
+ {
+ entry.text += entry.postfix + ";";
+ entry.postfix = QString::null;
+ }
+ else if ( completionMode != CppCodeCompletion::NormalCompletion )
+ {
+ entry.text += entry.postfix;
+ entry.postfix = QString::null;
+ }
+
+ QString comment = tag.attribute( "description" ).toString();
+ if ( !comment.isNull() )
+ entry.comment = comment;
+ //else
+ //entry.comment = "no documentation available!";
+ }
+
+ break;
+
+ case Tag::Kind_Enumerator:
+ case Tag::Kind_Variable:
+ entry.text = tag.name();
+ break;
+
+ default:
+ ;
+ }
+
+ entry.comment = tag.comment();
+
+ return entry;
+}
+
+QValueList<KTextEditor :: CompletionEntry> CodeInformationRepository::toEntryList( const QValueList<Tag> & tags, CppCodeCompletion::CompletionMode completionMode )
+{
+ QValueList<KTextEditor :: CompletionEntry> entryList;
+ QMap<QString, bool> ns;
+
+ QValueList<Tag>::ConstIterator it = tags.begin();
+ while ( it != tags.end() )
+ {
+ Tag tag = *it;
+ ++it;
+
+ KTextEditor::CompletionEntry entry = toEntry( tag, completionMode );
+ if ( !entry.text.isEmpty() )
+ entryList << entry;
+ }
+
+ return entryList;
+}
+
+
diff --git a/languages/cpp/codeinformationrepository.h b/languages/cpp/codeinformationrepository.h
new file mode 100644
index 00000000..f7fa712a
--- /dev/null
+++ b/languages/cpp/codeinformationrepository.h
@@ -0,0 +1,58 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef CODEINFORMATIONREPOSITORY_H
+#define CODEINFORMATIONREPOSITORY_H
+
+#include "catalog.h"
+#include "cppcodecompletion.h"
+#include <qmap.h>
+
+#include <ktexteditor/codecompletioninterface.h>
+
+struct TypeProcessor {
+ virtual QString processType( const QString& type ) = 0;
+ virtual QString parentType() = 0;
+};
+
+class KDevCodeRepository;
+
+class CodeInformationRepository
+{
+public:
+ CodeInformationRepository( KDevCodeRepository* rep );
+ virtual ~CodeInformationRepository();
+
+ static QValueList<KTextEditor::CompletionEntry> toEntryList( const QValueList<Tag>& tags,
+ CppCodeCompletion::CompletionMode mode = CppCodeCompletion::NormalCompletion );
+ static KTextEditor::CompletionEntry toEntry( Tag& tag, CppCodeCompletion::CompletionMode mode = CppCodeCompletion::NormalCompletion, TypeProcessor* proc = 0 );
+ QValueList<KTextEditor::CompletionEntry> getEntriesInScope( const QStringList& scope, bool isInstance, bool recompute = false );
+
+ QValueList<Tag> query( const QValueList<Catalog::QueryArgument>& args );
+ QValueList<Tag> getTagsInScope( const QStringList& scope, bool isInstance );
+ QValueList<Tag> getTagsInScope( const QString& name, const QStringList& scope );
+
+ QValueList<Tag> getTagsInFile( const QString& fileName );
+ QValueList<Tag> getBaseClassList( const QString& className );
+ QValueList<Tag> getClassOrNamespaceList( const QStringList& scope );
+
+private:
+ QValueList<KTextEditor::CompletionEntry> m_globalEntries;
+ KDevCodeRepository* m_rep;
+
+private:
+ CodeInformationRepository( const CodeInformationRepository& source );
+ void operator = ( const CodeInformationRepository& source );
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/compiler/Makefile.am b/languages/cpp/compiler/Makefile.am
new file mode 100644
index 00000000..128e715f
--- /dev/null
+++ b/languages/cpp/compiler/Makefile.am
@@ -0,0 +1,6 @@
+# This is the collection of plugins. In contrast to the parts
+# directory, these are 'transient' in a sense and don't
+# share the complete KDevComponent interface.
+
+SUBDIRS = gccoptions
+
diff --git a/languages/cpp/compiler/gccoptions/Makefile.am b/languages/cpp/compiler/gccoptions/Makefile.am
new file mode 100644
index 00000000..3e801ae4
--- /dev/null
+++ b/languages/cpp/compiler/gccoptions/Makefile.am
@@ -0,0 +1,20 @@
+# Here resides the gcc option dialog plugin.
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/extras \
+ -I$(top_srcdir)/lib/widgets $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevgccoptions.la
+libkdevgccoptions_la_LDFLAGS = -module $(all_libraries) $(KDE_PLUGIN)
+libkdevgccoptions_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/lib/widgets/libkdevwidgets.la $(top_builddir)/lib/interfaces/extras/libkdevextras.la $(LIB_KHTML)
+
+libkdevgccoptions_la_SOURCES = gccoptionsplugin.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevgccoptions.desktop kdevgppoptions.desktop kdevg77options.desktop
+
+
+
+
diff --git a/languages/cpp/compiler/gccoptions/gccoptionsplugin.cpp b/languages/cpp/compiler/gccoptions/gccoptionsplugin.cpp
new file mode 100644
index 00000000..ac547fc7
--- /dev/null
+++ b/languages/cpp/compiler/gccoptions/gccoptionsplugin.cpp
@@ -0,0 +1,705 @@
+/***************************************************************************
+* Copyright (C) 2000-2001 by Bernd Gehrmann *
+* bernd@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qvbuttongroup.h>
+#include <qradiobutton.h>
+#include <qvaluelist.h>
+#include <qtabwidget.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <kdialog.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+
+#include "flagboxes.h"
+#include "gccoptionsplugin.h"
+
+K_EXPORT_COMPONENT_FACTORY( libkdevgccoptions, KGenericFactory<GccOptionsPlugin>( "kdevgccoptions" ) )
+
+class GeneralTab : public QWidget
+{
+public:
+ GeneralTab( GccOptionsPlugin::Type type, QWidget *parent = 0, const char *name = 0 );
+ ~GeneralTab();
+
+ void readFlags( QStringList *str );
+ void writeFlags( QStringList *str );
+
+private:
+ FlagCheckBoxController *controller;
+};
+
+
+class OptimizationTab : public QWidget
+{
+public:
+ OptimizationTab( GccOptionsPlugin::Type type, QWidget *parent = 0, const char *name = 0 );
+ ~OptimizationTab();
+
+ void readFlags( QStringList *str );
+ void writeFlags( QStringList *str );
+
+private:
+ QRadioButton *Odefault, *O0, *O1, *O2;
+ FlagListBox *optBox;
+};
+
+
+class G77Tab : public QWidget
+{
+public:
+ G77Tab( QWidget *parent = 0, const char *name = 0 );
+ ~G77Tab();
+
+ void readFlags( QStringList *str );
+ void writeFlags( QStringList *str );
+
+private:
+ FlagCheckBoxController *controller;
+};
+
+
+class Warnings1Tab : public QWidget
+{
+public:
+ Warnings1Tab( GccOptionsPlugin::Type type, QWidget *parent = 0, const char *name = 0 );
+ ~Warnings1Tab();
+
+ void readFlags( QStringList *str );
+ void writeFlags( QStringList *str );
+
+private:
+ FlagCheckBoxController *controller;
+ FlagListBox *wallBox;
+};
+
+
+class Warnings2Tab : public QWidget
+{
+public:
+ Warnings2Tab( GccOptionsPlugin::Type type, QWidget *parent = 0, const char *name = 0 );
+ ~Warnings2Tab();
+
+ void readFlags( QStringList *str );
+ void writeFlags( QStringList *str );
+
+private:
+ FlagListBox *wrestBox;
+};
+
+
+GeneralTab::GeneralTab( GccOptionsPlugin::Type type, QWidget *parent, const char *name )
+ : QWidget( parent, name ), controller( new FlagCheckBoxController )
+{
+ QBoxLayout * layout = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
+ layout->setAutoAdd( true );
+ layout->addSpacing( 10 );
+
+ QVButtonGroup *output_group = new QVButtonGroup( i18n( "Output" ), this );
+ new FlagCheckBox( output_group, controller,
+ "-fsyntax-only", i18n( "Only check the code for syntax errors, do not produce object code" ) );
+ new FlagCheckBox( output_group, controller,
+ "-pg", i18n( "Generate extra code to write profile information for gprof" ) );
+ new FlagCheckBox( output_group, controller,
+ "-save-temps", i18n( "Do not delete intermediate output like assembler files" ) );
+
+ QApplication::sendPostedEvents( this, QEvent::ChildInserted );
+ layout->addSpacing( 10 );
+
+ QVButtonGroup *codegen_group = new QVButtonGroup( i18n( "Code Generation" ), this );
+ if ( type != GccOptionsPlugin::GPP )
+ {
+ new FlagCheckBox( codegen_group, controller,
+ "-fexceptions", i18n( "Enable exception handling" ),
+ "-fno-exception" );
+ }
+ else
+ {
+ new FlagCheckBox( codegen_group, controller,
+ "-fno-exceptions", i18n( "Disable exception handling" ),
+ "-fexception" );
+ }
+ // The following two are somehow mutually exclusive, but the default is
+ // platform-dependent, so if we would leave out one of them, we wouldn't
+ // know how to set the remaining one.
+ new FlagCheckBox( codegen_group, controller,
+ "-fpcc-struct-return", i18n( "Return certain struct and union values in memory rather than in registers" ) );
+ new FlagCheckBox( codegen_group, controller,
+ "-freg-struct-return", i18n( "Return certain struct and union values in registers when possible" ) );
+ new FlagCheckBox( codegen_group, controller,
+ "-short-enums", i18n( "For an enum, choose the smallest possible integer type" ) );
+ new FlagCheckBox( codegen_group, controller,
+ "-short-double", i18n( "Make 'double' the same as 'float'" ) );
+
+ QApplication::sendPostedEvents( this, QEvent::ChildInserted );
+ layout->addStretch();
+}
+
+
+GeneralTab::~GeneralTab()
+{
+ delete controller;
+}
+
+
+void GeneralTab::readFlags( QStringList *list )
+{
+ controller->readFlags( list );
+}
+
+
+void GeneralTab::writeFlags( QStringList *list )
+{
+ controller->writeFlags( list );
+}
+
+
+OptimizationTab::OptimizationTab( GccOptionsPlugin::Type type, QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ QBoxLayout * layout = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
+ layout->setAutoAdd( true );
+
+ QVButtonGroup *group = new QVButtonGroup( i18n( "Optimization Level" ), this );
+ Odefault = new QRadioButton( i18n( "Default" ), group );
+ Odefault->setChecked( true );
+ O0 = new QRadioButton( i18n( "No optimization" ), group );
+ O1 = new QRadioButton( i18n( "Level 1" ), group );
+ O2 = new QRadioButton( i18n( "Level 2" ), group );
+
+ optBox = new FlagListBox( this );
+
+ new FlagListItem( optBox,
+ "-ffloat-store", i18n( "<qt>Do not store floating point variables in registers</qt>" ),
+ "-fno-float-store" );
+ new FlagListItem( optBox,
+ "-fno-defer-pop", i18n( "<qt>Pop the arguments to each function call directly "
+ "after the function returns</qt>" ),
+ "-fdefer-pop" );
+ new FlagListItem( optBox,
+ "-fforce-mem", i18n( "<qt>Force memory operands to be copied into registers before "
+ "doing arithmetic on them</qt>" ),
+ "-fno-force-mem" );
+ new FlagListItem( optBox,
+ "-fforce-addr", i18n( "<qt>Force memory address constants to be copied into registers before "
+ "doing arithmetic on them</qt>" ),
+ "-fno-force-addr" );
+ new FlagListItem( optBox,
+ "-fomit-frame-pointer", i18n( "<qt>Do not keep the frame pointer in a register for functions that "
+ "do not need one</qt>" ),
+ "-fno-omit-frame-pointer" );
+ new FlagListItem( optBox,
+ "-fno-inline", i18n( "<qt>Ignore the <i>inline</i> keyword</qt>" ),
+ "-finline" );
+
+ if ( type == GccOptionsPlugin::GPP )
+ {
+ new FlagListItem( optBox,
+ "-fno-default-inline", i18n( "<qt>Do not make member functions inline merely because they "
+ "are defined inside the class scope</qt>" ),
+ "-fdefault-inline" );
+ }
+
+ QApplication::sendPostedEvents( this, QEvent::ChildInserted );
+ layout->addStretch();
+}
+
+
+OptimizationTab::~OptimizationTab()
+{}
+
+
+void OptimizationTab::readFlags( QStringList *list )
+{
+ optBox->readFlags( list );
+
+ QStringList::Iterator sli;
+ sli = list->find( "-O0" );
+ if ( sli != list->end() )
+ {
+ O0->setChecked( true );
+ list->remove
+ ( sli );
+ }
+ sli = list->find( "-O1" );
+ if ( sli != list->end() )
+ {
+ O1->setChecked( true );
+ list->remove
+ ( sli );
+ }
+ sli = list->find( "-O2" );
+ if ( sli != list->end() )
+ {
+ O2->setChecked( true );
+ list->remove
+ ( sli );
+ }
+}
+
+
+void OptimizationTab::writeFlags( QStringList *list )
+{
+ optBox->writeFlags( list );
+
+ if ( O0->isChecked() )
+ ( *list ) << "-O0";
+ else if ( O1->isChecked() )
+ ( *list ) << "-O1";
+ else if ( O2->isChecked() )
+ ( *list ) << "-O2";
+}
+
+
+G77Tab::G77Tab( QWidget *parent, const char *name )
+ : QWidget( parent, name ), controller( new FlagCheckBoxController )
+{
+ QBoxLayout * layout = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
+ layout->setAutoAdd( true );
+ layout->addSpacing( 10 );
+
+ QVButtonGroup *dialect_group = new QVButtonGroup( i18n( "Dialect" ), this );
+ new FlagCheckBox( dialect_group, controller,
+ "-ffree-form", i18n( "Interpret source code as Fortran 90 free form" ),
+ "-fno-exception" );
+ new FlagCheckBox( dialect_group, controller,
+ "-ff90", i18n( "Allow certain Fortran 90 constructs" ) );
+ new FlagCheckBox( dialect_group, controller,
+ "-fdollar-ok", i18n( "Allow '$' in symbol names" ) );
+ new FlagCheckBox( dialect_group, controller,
+ "-fbackslash", i18n( "Allow '\' in character constants to escape special characters" ),
+ "-fno-backslah" );
+ new FlagCheckBox( dialect_group, controller,
+ "-fonetrip", i18n( "DO loops are executed at least once" ) );
+
+ QApplication::sendPostedEvents( this, QEvent::ChildInserted );
+ layout->addSpacing( 10 );
+
+ QVButtonGroup *codegen_group = new QVButtonGroup( i18n( "Code Generation" ), this );
+ new FlagCheckBox( codegen_group, controller,
+ "-fno-automatic", i18n( "Treat local variables as if SAVE statement had been specified" ) );
+ new FlagCheckBox( codegen_group, controller,
+ "-finit-local-zero", i18n( "Init local variables to zero" ) );
+ new FlagCheckBox( codegen_group, controller,
+ "-fbounds-check", i18n( "Generate run-time checks for array subscripts" ) );
+
+ QApplication::sendPostedEvents( this, QEvent::ChildInserted );
+ layout->addStretch();
+}
+
+
+G77Tab::~G77Tab()
+{
+ delete controller;
+}
+
+
+void G77Tab::readFlags( QStringList *list )
+{
+ controller->readFlags( list );
+}
+
+
+void G77Tab::writeFlags( QStringList *list )
+{
+ controller->writeFlags( list );
+}
+
+
+Warnings1Tab::Warnings1Tab( GccOptionsPlugin::Type type, QWidget *parent, const char *name )
+ : QWidget( parent, name ), controller( new FlagCheckBoxController )
+{
+ QBoxLayout * layout = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
+ layout->setAutoAdd( true );
+
+ new FlagCheckBox( this, controller,
+ "-w", i18n( "Inhibit all warnings" ) );
+ new FlagCheckBox( this, controller,
+ "-Wno-import", i18n( "Inhibit warnings about the use of #import" ) );
+ new FlagCheckBox( this, controller,
+ "-Werror", i18n( "Make all warnings into errors" ) );
+ new FlagCheckBox( this, controller,
+ "-pedantic", i18n( "Issue all warnings demanded by strict ANSI C or ISO C++" ) );
+ new FlagCheckBox( this, controller,
+ "-pedantic-errors", i18n( "Like -pedantic, but errors are produced instead of warnings" ) );
+ new FlagCheckBox( this, controller,
+ "-Wall", i18n( "All warnings below, combined (-Wall):" ) );
+
+ wallBox = new FlagListBox( this );
+
+ new FlagListItem( wallBox,
+ "-Wchar-subscripts", i18n( "<qt>Warn if an array subscript has type <i>char</i></qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wcomment", i18n( "<qt>Warn when a comment-start sequence /* appears inside a comment</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wformat", i18n( "<qt>Check calls to <i>printf()</i>, <i>scanf()</i> etc\n"
+ "to make sure that the arguments supplied have types appropriate\n"
+ "to the format string specified, and that the conversions specified\n"
+ "in the format string make sense</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wformat=2", i18n( "<qt>Enable -Wformat plus format checks not \n"
+ "included in -Wformat. Currently equivalent to \n"
+ "`-Wformat -Wformat-nonliteral -Wformat-security \n"
+ "-Wformat-y2k'.</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wimplicit-int", i18n( "<qt>Warn when a declaration does not specify a type</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wimplicit-funtion-declaration",
+ i18n( "<qt>Issue a warning when a non-declared function is used</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Werror-implicit-function-declaration",
+ i18n( "<qt>Issue an error when a non-declared function is used</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wmain", i18n( "<qt>Warn if the type of <i>main()</i> is suspicious</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wmultichar", i18n( "<qt>Warn when multicharacter constants are encountered</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wmissing-braces", i18n( "<qt>Warn if an aggregate or union initializer is not fully bracketed</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wparentheses", i18n( "<qt>Warn when parentheses are omitted in certain contexts</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wsequence-point", i18n( "<qt>Warn about code that may have undefined semantics because of\n"
+ "violations of sequence point rules in the C standard</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wreturn-type", i18n( "<qt>Warn when a function without explicit return type is defined</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wswitch", i18n( "<qt>Warn whenever a <i>switch</i> statement has an index of enumeral type\n"
+ "and lacks a <i>case</i> for one or more of the named codes of that enumeration</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wtrigraphs", i18n( "<qt>Warn when trigraphs are encountered</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wunused", i18n( "<qt>Warn when a variable is declared but not used</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wuninitialized", i18n( "<qt>Warn when a variable is used without being initialized first</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wunknown-pragmas", i18n( "<qt>Warn when an unknown #pragma statement is encountered</qt>" ) );
+ new FlagListItem( wallBox,
+ "-Wdiv-by-zero", i18n( "<qt>Warn when a division by zero occurs.</qt>" ) );
+ if ( type == GccOptionsPlugin::GPP )
+ {
+ new FlagListItem( wallBox,
+ "-Wreorder", i18n( "<qt>Warn when the order of member initializers is different from\n"
+ "the order in the class declaration</qt>" ) );
+ }
+}
+
+
+Warnings1Tab::~Warnings1Tab()
+{
+ delete controller;
+}
+
+
+void Warnings1Tab::readFlags( QStringList *list )
+{
+ controller->readFlags( list );
+ wallBox->readFlags( list );
+}
+
+
+void Warnings1Tab::writeFlags( QStringList *list )
+{
+ controller->writeFlags( list );
+ wallBox->writeFlags( list );
+}
+
+
+Warnings2Tab::Warnings2Tab( GccOptionsPlugin::Type type, QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ QBoxLayout * layout = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
+ layout->setAutoAdd( true );
+
+ wrestBox = new FlagListBox( this );
+
+ new FlagListItem( wrestBox,
+ "-W", i18n( "<qt>Set options not included in -Wall which are very specific</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wfloat-equal", i18n( "<qt>Warn if floating point values are used in equality comparisons</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wundef", i18n( "<qt>Warn if an undefined identifier is evaluated in an <i>#if</i> directive</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wshadow", i18n( "<qt>Warn whenever a local variable shadows another local variable</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wpointer-arith", i18n( "<qt>Warn about anything that depends on the <i>sizeof</i> a\n"
+ "function type or of <i>void</i></qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wcast-qual", i18n( "<qt>Warn whenever a pointer is cast so as to remove a type\n"
+ "qualifier from the target type</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wcast-align", i18n( "<qt>Warn whenever a pointer is cast such that the required\n"
+ "alignment of the target is increased</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wwrite-strings", i18n( "<qt>Warn when the address of a string constant is cast\n"
+ "into a non-const <i>char *</i> pointer</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wconversion", i18n( "<qt>Warn if a prototype causes a type conversion that is different\n"
+ "from what would happen to the same argument in the absence\n"
+ "of a prototype</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wsign-compare", i18n( "<qt>Warn when a comparison between signed and unsigned values\n"
+ "could produce an incorrect result when the signed value\n"
+ "is converted to unsigned</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wmissing-noreturn", i18n( "<qt>Warn about functions which might be candidates for attribute 'noreturn'</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Waggregate-return", i18n( "<qt>Warn if any functions that return structures or unions are\n"
+ "defined or called</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wmissing-declarations", i18n( "<qt>Warn if a global function is defined without a previous declaration</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wno-deprecated-declarations",
+ i18n( "<qt>Do not warn about uses of functions, variables, and types marked as\n"
+ "deprecated by using the 'deprecated' attribute</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wpacked", i18n( "<qt>Warn if a structure is given the packed attribute, but the packed\n"
+ "attribute has no effect on the layout or size of the structure</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wpadded", i18n( "<qt>Warn if padding is included in a structure, either to align an\n"
+ "element of the structure or to align the whole structure</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wredundant-decls", i18n( "<qt>Warn if anything is declared more than once in the same scope</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wunreachable-code", i18n( "<qt>Warn if the compiler detects that code will never be executed</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Winline", i18n( "<qt>Warn if an <i>inline</i> function cannot be inlined</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wlong-long", i18n( "<qt>Warn if the <i>long long</i> type is used</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wdisabled-optimization", i18n( "<qt>Warn if a requested optimization pass is disabled</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wno-div-by-zero", i18n( "<qt>Do not warn if there is a division by zero</qt>" ) );
+
+ if ( type == GccOptionsPlugin::GCC )
+ {
+ new FlagListItem( wrestBox,
+ "-Wtraditional", i18n( "<qt>Warn about certain constructs that behave differently\n"
+ "in traditional and ANSI C</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wbad-function-cast", i18n( "<qt>Warn whenever a function call is cast to a non-matching type</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wstrict-prototypes", i18n( "<qt>Warn if a function is declared or defined without specifying\n"
+ "the argument types</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wmissing-prototypes", i18n( "<qt>Warn if a global function is defined without a previous prototype declaration</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wnested-externs", i18n( "<qt>Warn if an <i>extern</i> declaration is encountered within a function</qt>" ) );
+ }
+
+
+ if ( type == GccOptionsPlugin::GPP )
+ {
+ new FlagListItem( wrestBox,
+ "-Woverloaded-virtual", i18n( "<qt>Warn when a function declaration hides virtual\n"
+ "functions from a base class</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wsynth", i18n( "<qt>Warn when g++'s synthesis behavior does\n"
+ "not match that of cfront</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wctor-dtor-privacy", i18n( "<qt>Warn when a class seems unusable, because all the constructors or\n"
+ "destructors in a class are private and the class has no friends or\n"
+ "public static member functions</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wnon-virtual-dtor", i18n( "<qt>Warn when a class declares a non-virtual destructor that should\n"
+ "probably be virtual, because it looks like the class will be used\n"
+ "polymorphically</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wsign-promo", i18n( "<qt>Warn when overload resolution chooses a promotion from unsigned or\n"
+ "enumeral type to a signed type over a conversion to an unsigned\n"
+ "type of the same size. Previous versions of G++ would try to\n"
+ "preserve unsignedness, but the standard mandates the current behavior</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wabi", i18n( "<qt>Warn when G++ generates code that is probably not compatible with\n"
+ "the vendor-neutral C++ ABI</qt>" ) );
+ /* new FlagListItem(wrestBox,
+ "-Wreorder", i18n("<qt>Warn when the order of member initializers given in the code does\n"
+ "not match the order in which they must be executed.</qt>"));*/
+ new FlagListItem( wrestBox,
+ "-Weffc++", i18n( "<qt>Warn about violations of the following style guidelines from Scott\n"
+ "Meyers' 'Effective C++' book:\n"
+ "* Item 11: Define a copy constructor and an assignment\n"
+ " operator for classes with dynamically allocated memory;\n"
+ "* Item 12: Prefer initialization to assignment in constructors;\n"
+ "* Item 14: Make destructors virtual in base classes;\n"
+ "* Item 15: Have `operator=' return a reference to `*this';\n"
+ "* Item 23: Do not try to return a reference when you must\n"
+ " return an object\n"
+ "\n"
+ "and about violations of the following style guidelines from Scott\n"
+ "Meyers' 'More Effective C++' book:\n"
+ "* Item 6: Distinguish between prefix and postfix forms of\n"
+ " increment and decrement operators;\n"
+ "* Item 7: Never overload '&&', '||', or ','</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wno-deprecated", i18n( "<qt>Do not warn about usage of deprecated features</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wno-non-template-friend", i18n( "<qt>Disable warnings when non-templatized friend functions are declared\n"
+ "within a template</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wold-style-cast", i18n( "<qt>Warn if an old-style (C-style) cast to a non-void type is used\n"
+ "within a C++ program</qt>" ) );
+ new FlagListItem( wrestBox,
+ "-Wno-pmf-conversions", i18n( "<qt>Disable the diagnostic for converting a bound pointer to member\n"
+ "function to a plain pointer</qt>" ) );
+ }
+}
+
+
+Warnings2Tab::~Warnings2Tab()
+{}
+
+
+void Warnings2Tab::readFlags( QStringList *list )
+{
+ wrestBox->readFlags( list );
+}
+
+
+void Warnings2Tab::writeFlags( QStringList *list )
+{
+ wrestBox->writeFlags( list );
+}
+
+
+// Last but not least... :-)
+GccOptionsDialog::GccOptionsDialog( GccOptionsPlugin::Type type, QWidget *parent, const char *name )
+ : KDialogBase( Tabbed, GccOptionsPlugin::captionForType( type ), Ok | Cancel, Ok, parent, name, true )
+{
+ QVBox * vbox;
+
+ vbox = addVBoxPage( i18n( "General" ) );
+ general = new GeneralTab( type, vbox, "general tab" );
+
+ vbox = addVBoxPage( i18n( "Optimization" ) );
+ optimization = new OptimizationTab( type, vbox, "optimization tab" );
+
+ if ( type == GccOptionsPlugin::G77 )
+ {
+ vbox = addVBoxPage( i18n( "Fortran Specifics" ) );
+ g77 = new G77Tab( vbox, "g77 tab" );
+ }
+ else
+ g77 = 0;
+
+ vbox = addVBoxPage( i18n( "Warnings (safe)" ) );
+ warnings1 = new Warnings1Tab( type, vbox, "warnings1 tab" );
+
+ vbox = addVBoxPage( i18n( "Warnings (unsafe)" ) );
+ warnings2 = new Warnings2Tab( type, vbox, "warnings2 tab" );
+}
+
+
+GccOptionsDialog::~GccOptionsDialog()
+{}
+
+
+void GccOptionsDialog::setFlags( const QString &flags )
+{
+ QStringList flaglist = QStringList::split( " ", flags );
+
+ // Hand them to 'general' at last, so it can make a line edit
+ // with the unprocessed items
+ if ( g77 )
+ g77->readFlags( &flaglist );
+ optimization->readFlags( &flaglist );
+ warnings1->readFlags( &flaglist );
+ warnings2->readFlags( &flaglist );
+ general->readFlags( &flaglist );
+ unrecognizedFlags = flaglist;
+}
+
+
+QString GccOptionsDialog::flags() const
+{
+ QStringList flaglist;
+
+ if ( g77 )
+ g77->writeFlags( &flaglist );
+ optimization->writeFlags( &flaglist );
+ warnings1->writeFlags( &flaglist );
+ warnings2->writeFlags( &flaglist );
+ general->writeFlags( &flaglist );
+
+ QString flags;
+ QStringList::ConstIterator li;
+ for ( li = flaglist.begin(); li != flaglist.end(); ++li )
+ {
+ flags += ( *li );
+ flags += " ";
+ }
+
+ for ( li = unrecognizedFlags.begin(); li != unrecognizedFlags.end(); ++li )
+ {
+ flags += ( *li );
+ flags += " ";
+ }
+
+ flags.truncate( flags.length() - 1 );
+ return flags;
+}
+
+
+GccOptionsPlugin::GccOptionsPlugin( QObject *parent, const char *name, const QStringList &args )
+ : KDevCompilerOptions( parent, name )
+{
+ gcctype = Unknown;
+
+ if ( args.count() == 0 )
+ return ;
+
+ QString typeStr = args[ 0 ];
+
+ if ( typeStr == "gcc" )
+ gcctype = GccOptionsPlugin::GCC;
+ else if ( typeStr == "g++" )
+ gcctype = GccOptionsPlugin::GPP;
+ else if ( typeStr == "g77" )
+ gcctype = GccOptionsPlugin::G77;
+}
+
+
+GccOptionsPlugin::~GccOptionsPlugin()
+{}
+
+
+QString GccOptionsPlugin::captionForType( Type type )
+{
+ switch ( type )
+ {
+ case GCC:
+ return i18n( "GNU C Compiler Options" );
+ case GPP:
+ return i18n( "GNU C++ Compiler Options" );
+ case G77:
+ return i18n( "GNU Fortran 77 Compiler Options" );
+ default:
+ return QString::null;
+ }
+}
+
+
+QString GccOptionsPlugin::exec( QWidget *parent, const QString &flags )
+{
+ if ( gcctype == Unknown )
+ return QString::null;
+ GccOptionsDialog *dlg = new GccOptionsDialog( gcctype, parent, "gcc options dialog" );
+ QString newFlags = flags;
+ dlg->setFlags( flags );
+ if ( dlg->exec() == QDialog::Accepted )
+ newFlags = dlg->flags();
+ delete dlg;
+ return newFlags;
+}
+
+#include "gccoptionsplugin.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/compiler/gccoptions/gccoptionsplugin.h b/languages/cpp/compiler/gccoptions/gccoptionsplugin.h
new file mode 100644
index 00000000..a3b8cd70
--- /dev/null
+++ b/languages/cpp/compiler/gccoptions/gccoptionsplugin.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+ * Copyright (C) 2000-2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _GCCOPTIONSPLUGIN_H_
+#define _GCCOPTIONSPLUGIN_H_
+
+#include <kdialogbase.h>
+
+#include "kdevcompileroptions.h"
+
+
+class GeneralTab;
+class OptimizationTab;
+class G77Tab;
+class Warnings1Tab;
+class Warnings2Tab;
+
+
+class GccOptionsPlugin : public KDevCompilerOptions
+{
+ Q_OBJECT
+
+public:
+ enum Type { GCC, GPP, G77, Unknown };
+ GccOptionsPlugin( QObject *parent, const char *name, const QStringList &args );
+ ~GccOptionsPlugin();
+
+ static QString captionForType(Type type);
+
+ virtual QString exec(QWidget *parent, const QString &flags);
+
+private:
+ Type gcctype;
+};
+
+
+class GccOptionsDialog : public KDialogBase
+{
+public:
+ GccOptionsDialog( GccOptionsPlugin::Type type, QWidget *parent=0, const char *name=0 );
+ ~GccOptionsDialog();
+
+ void setFlags(const QString &flags);
+ QString flags() const;
+
+private:
+ GeneralTab *general;
+ OptimizationTab *optimization;
+ G77Tab *g77;
+ Warnings1Tab *warnings1;
+ Warnings2Tab *warnings2;
+ QStringList unrecognizedFlags;
+};
+
+#endif
diff --git a/languages/cpp/compiler/gccoptions/kdevg77options.desktop b/languages/cpp/compiler/gccoptions/kdevg77options.desktop
new file mode 100644
index 00000000..4f7941b7
--- /dev/null
+++ b/languages/cpp/compiler/gccoptions/kdevg77options.desktop
@@ -0,0 +1,56 @@
+[Desktop Entry]
+Type=Service
+Exec=g77
+Comment=GNU Fortran 77 Compiler
+Comment[br]=Dastumer Fortran 77 GNU
+Comment[ca]=Compilador Fortran 77 de GNU
+Comment[da]=GNU Fortran 77 compiler
+Comment[el]=Μεταγλωττιστής GNU Fortran 77
+Comment[es]=Compilador GNU de Fortran 77
+Comment[et]=GNU Fortran 77 kompilaator
+Comment[eu]=GNU Fortran 77 konpiladorea
+Comment[fa]=مترجم Ùرترن Û·Û· گنو
+Comment[fr]=Compilateur pour Fortran 77 du GNU
+Comment[ga]=Tiomsaitheoir Fortran 77 GNU
+Comment[gl]=Compilador GNU Fortran 77
+Comment[hi]=जीà¤à¤¨à¤¯à¥‚ फ़ोरटà¥à¤°à¥‰à¤¨ 77 कमà¥à¤ªà¤¾à¤¯à¤²à¤°
+Comment[hu]=GNU Fortran 77 fordítóprogram
+Comment[is]=GNU Fortran 77 þýðandi
+Comment[it]=Compilatore per GNU Fortran 77
+Comment[ja]=GNU Fortran 77 コンパイラ
+Comment[nds]=GNU Fortran 77-Kompilerer
+Comment[ne]=GNU Fortran 77 कमà¥à¤ªà¤¾à¤‡à¤²à¤°
+Comment[nl]=GNU Fortran 77-compiler
+Comment[pl]=Kompilator GNU Fortran 77
+Comment[pt]=Compilador GNU Fortran 77
+Comment[pt_BR]=Compilador GNU Fortran 77
+Comment[ru]=КомпилÑтор GNU Fortran 77
+Comment[sk]=GNU Fortran 77 kompilátor
+Comment[sl]=Prevajalnik za GNU Fortran 77
+Comment[sr]=GNU-ов преводилац Fortran-а 77
+Comment[sr@Latn]=GNU-ov prevodilac Fortran-a 77
+Comment[sv]=GNU Fortran 77-compilator
+Comment[ta]=GNU Fortran 77 தொகà¯à®ªà¯à®ªà®¿
+Comment[tg]=Талфифгари GNU Fortran 77
+Comment[tr]=GNU Fortran 77 Derleyicisi
+Comment[zh_CN]=GNU Fortran 77 编译器
+Comment[zh_TW]=GNU Fortran 77 編譯器
+Name=G77Options
+Name[de]=G77-Einstellungen (KDevelop)
+Name[el]=G77Επιλογές
+Name[hi]=जी77विकलà¥à¤ª
+Name[nds]=G77-Optschonen (KDevelop)
+Name[pl]=Opcje G77
+Name[sk]=G77 možnosti
+Name[sl]=Možnosti G77
+Name[sv]=Alternativ för g77
+Name[ta]=G77விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯
+Name[tg]=G77Интихобҳо
+Name[tr]=G77Seçenekleri
+Name[zh_TW]=G77 é¸é …
+ServiceTypes=KDevelop/CompilerOptions
+X-KDE-Library=libkdevgccoptions
+X-KDevelop-Version=5
+X-KDevelop-Language=Fortran
+X-KDevelop-Args=g77
+X-KDevelop-Default=true
diff --git a/languages/cpp/compiler/gccoptions/kdevgccoptions.desktop b/languages/cpp/compiler/gccoptions/kdevgccoptions.desktop
new file mode 100644
index 00000000..5d135cb1
--- /dev/null
+++ b/languages/cpp/compiler/gccoptions/kdevgccoptions.desktop
@@ -0,0 +1,54 @@
+[Desktop Entry]
+Type=Service
+Exec=gcc
+Comment=GNU C Compiler
+Comment[br]=Dastumer C GNU
+Comment[ca]=Compilador C de GNU
+Comment[da]=GNU C compiler
+Comment[el]=Μεταγλωττιστής GNU C
+Comment[es]=Compilador GNU de C
+Comment[et]=GNU C kompilaator
+Comment[eu]=GNU C konpiladorea
+Comment[fa]=مترجم سی گنو
+Comment[fr]=Compilateur C du GNU
+Comment[ga]=Tiomsaitheoir C GNU
+Comment[gl]=Compilador GNU C
+Comment[hi]=जीà¤à¤¨à¤¯à¥‚ सी कमà¥à¤ªà¤¾à¤¯à¤²à¤°
+Comment[hu]=GNU C fordítóprogram
+Comment[is]=GNU C þýðandi
+Comment[it]=Compilatore GNU C
+Comment[ja]=GNU C コンパイラ
+Comment[nds]=GNU C-Kompilerer
+Comment[ne]=GNU C कमà¥à¤ªà¤¾à¤‡à¤²à¤°
+Comment[pl]=Kompilator GNU C
+Comment[pt]=Compilador GNU C
+Comment[pt_BR]=Compilador GNU C
+Comment[ru]=КомпилÑтор GNU C
+Comment[sk]=GNU C kompilátor
+Comment[sl]=Prevajalnik za GNU C
+Comment[sr]=GNU-ов C преводилац
+Comment[sr@Latn]=GNU-ov C prevodilac
+Comment[sv]=GNU C-kompilator
+Comment[ta]=GNU Cதொகà¯à®ªà¯à®ªà®¿
+Comment[tg]=Талфифгари GNU C
+Comment[zh_CN]=GNU C 编译器
+Comment[zh_TW]=GNU C 編譯器
+Name=GccOptions
+Name[de]=GCC-Einstellungen (KDevelop)
+Name[el]=GccΕπιλογές
+Name[hi]=जीसीसी-विकलà¥à¤ª
+Name[nds]=GCC-Instellen
+Name[pl]=Opcje Gcc
+Name[sk]=Gcc možnosti
+Name[sl]=Možnosti Gcc
+Name[sv]=Alternativ för gcc
+Name[ta]=Gccவிரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯
+Name[tr]=GccSeçenekleri
+Name[zh_TW]=Gcc é¸é …
+ServiceTypes=KDevelop/CompilerOptions
+X-KDE-Library=libkdevgccoptions
+X-KDevelop-Version=5
+X-KDevelop-Language=C
+X-KDevelop-Args=gcc
+X-KDevelop-Default=true
+
diff --git a/languages/cpp/compiler/gccoptions/kdevgppoptions.desktop b/languages/cpp/compiler/gccoptions/kdevgppoptions.desktop
new file mode 100644
index 00000000..ad12fa4c
--- /dev/null
+++ b/languages/cpp/compiler/gccoptions/kdevgppoptions.desktop
@@ -0,0 +1,56 @@
+[Desktop Entry]
+Type=Service
+Exec=g++
+Comment=GNU C++ Compiler
+Comment[br]=Dastumer C++ GNU
+Comment[ca]=Compilador C++ de GNU
+Comment[da]=GNU C++ compiler
+Comment[el]=Μεταγλωττιστής GNU C++
+Comment[es]=Compilador GNU de C++
+Comment[et]=GNU C++ kompilaator
+Comment[eu]=GNU C++ konpiladorea
+Comment[fa]=مترجم C++ گنو
+Comment[fr]=Compilateur C++ de GNU
+Comment[ga]=Tiomsaitheoir C++ GNU
+Comment[gl]=Compilador GNU C++
+Comment[hi]=जीà¤à¤¨à¤¯à¥‚ सी++ कमà¥à¤ªà¤¾à¤¯à¤²à¤°
+Comment[hu]=GNU C++ fordítóprogram
+Comment[is]=GNU C++ þýðandi
+Comment[it]=Compilatore GNU C++
+Comment[ja]=GNU C++ コンパイラ
+Comment[nds]=GNU C++-Kompilerer
+Comment[ne]=GNU C++ कमà¥à¤ªà¤¾à¤‡à¤²à¤°
+Comment[nl]=GNU C++ compiler
+Comment[pl]=Kompilator GNU C++
+Comment[pt]=Compilador GNU C++
+Comment[pt_BR]=Compilador GNU C++
+Comment[ru]=КомпилÑтор GNU C++
+Comment[sk]=GNU C++ kompilátor
+Comment[sl]=Prevajalnik za GNU C++
+Comment[sr]=GNU-ов C++ преводилац
+Comment[sr@Latn]=GNU-ov C++ prevodilac
+Comment[sv]=GNU C++ kompilator
+Comment[ta]=GNU C++தொகà¯à®ªà¯à®ªà®¿
+Comment[tg]=Талфифгари GNU C++
+Comment[tr]=GNU C++ Derleyicisi
+Comment[zh_CN]=GNU C++ 编译器
+Comment[zh_TW]=GNU C++ 編譯器
+Name=GppOptions
+Name[de]=GPP-Einstellungen (KDevelop)
+Name[el]=GppΕπιλογές
+Name[hi]=जीपीपी-विकलà¥à¤ª
+Name[nds]=GPP-Instellen
+Name[pl]=Opcje Gpp
+Name[sk]=Gpp možnosti
+Name[sl]=Možnosti Gpp
+Name[sv]=Alternativ för g++
+Name[ta]=Gppவிரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯
+Name[tr]=GppSeçenekleri
+Name[zh_TW]=Gpp é¸é …
+ServiceTypes=KDevelop/CompilerOptions
+X-KDE-Library=libkdevgccoptions
+X-KDevelop-Version=5
+X-KDevelop-Language=C++
+X-KDevelop-Args=g++
+X-KDevelop-Default=true
+
diff --git a/languages/cpp/completiondebug.cpp b/languages/cpp/completiondebug.cpp
new file mode 100644
index 00000000..dc73329e
--- /dev/null
+++ b/languages/cpp/completiondebug.cpp
@@ -0,0 +1,56 @@
+
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "completiondebug.h"
+
+namespace CompletionDebug {
+
+DBGStreamType dbgState;
+
+const int completionMaxDepth = 50;
+
+DBGStreamType::KStreamType& dbg() {
+ return dbgState.dbg();
+}
+
+bool dbgActive() {
+ return true;
+}
+
+#ifndef NDEBUG
+kdbgstream dbgMajor() {
+ kdbgstream ret = kdDebug( 9007 );
+ dbgState.outputPrefix( ret );
+ return ret;
+}
+#else
+kndbgstream dbgMajor() {
+ return kndDebug();
+};
+
+#endif
+
+#ifndef NDEBUG
+template<>
+ KDDebugState<kdbgstream>::KDDebugState() : m_stream ( kdDebug( 9007 ) ) {
+ }
+#endif
+
+template<>
+ KDDebugState<kndbgstream>::KDDebugState() {
+ }
+}
+
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/completiondebug.h b/languages/cpp/completiondebug.h
new file mode 100644
index 00000000..088b3b99
--- /dev/null
+++ b/languages/cpp/completiondebug.h
@@ -0,0 +1,221 @@
+/***************************************************************************
+copyright : (C) 2006 by David Nolden
+email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef __COMPLETIONDEBUG_H__
+#define __COMPLETIONDEBUG_H__
+
+///With verbose shut on, the whole type-resolution-process is nicely traced for easy debugging(at cost of speed).
+//#define VERBOSE
+//#define VERBOSEMAJOR
+
+///When defined, a backtrace is printed the first time the maximum depth is reached for the first time.
+//#define DEPTHBACKTRACE
+
+#include <qstringlist.h>
+#include <kdebug.h>
+
+namespace CompletionDebug {
+template <class StreamType>
+class KDDebugState {
+ private:
+ StreamType m_stream;
+ kndbgstream m_nstream;
+ QStringList m_prefixStack;
+ int m_counter;
+ int m_depth;
+ bool m_enabled;
+ bool m_hadWarning;
+
+ public:
+ typedef StreamType KStreamType;
+ KDDebugState();
+
+ KDDebugState( StreamType stream ) : m_stream( stream ), m_counter( 0 ), m_depth( 0 ), m_enabled( true ), m_hadWarning( false ) {}
+
+ void push( const QString & txt ) {
+ m_prefixStack.push_back( txt );
+ pushDepth();
+ }
+
+ void pop() {
+ m_prefixStack.pop_back();
+ popDepth();
+ };
+
+ inline void pushDepth() {
+ m_depth++;
+ }
+
+ inline void popDepth() {
+ m_depth--;
+ }
+
+ bool hadWarning() {
+ return m_hadWarning;
+ }
+
+ void setHadWarning( bool had ) {
+ m_hadWarning = had;
+ }
+
+ StreamType& dbg() {
+#ifndef VERBOSE
+ if ( !m_enabled )
+ return m_nstream;
+#endif
+
+ m_stream << "(" << m_counter << ")";
+ for ( QStringList::iterator it = m_prefixStack.begin(); it != m_prefixStack.end() ; ++it )
+ m_stream << *it;
+
+ m_counter++;
+ return m_stream;
+ }
+
+ void setState( bool enabled ) {
+ m_enabled = enabled;
+ }
+
+ bool state() {
+ return m_enabled;
+ }
+
+#ifndef NDEBUG
+ void outputPrefix( kdbgstream& target ) {
+ target << "(" << m_counter << ")";
+ for ( QStringList::iterator it = m_prefixStack.begin(); it != m_prefixStack.end() ; ++it )
+ target << *it;
+
+ m_counter++;
+ }
+#endif
+
+ void clearCounter() {
+ m_counter = 0;
+ }
+
+ int depth() {
+ return m_depth;
+ }
+};
+#ifndef NDEBUG
+template <>
+KDDebugState<kdbgstream>::KDDebugState();
+#endif
+template <>
+KDDebugState<kndbgstream>::KDDebugState();
+#if defined(VERBOSE) && !defined(NDEBUG)
+typedef KDDebugState<kdbgstream> DBGStreamType;
+#else
+typedef KDDebugState<kndbgstream> DBGStreamType;
+#endif
+///Class to help indent the debug-output correctly
+extern DBGStreamType dbgState;
+extern const int completionMaxDepth;
+class LogDebug {
+ private:
+ DBGStreamType& m_state;
+ int m_max;
+ public:
+ LogDebug( const char* prefix = "#", int max = completionMaxDepth, DBGStreamType& st = dbgState ) : m_state( st ), m_max( max ) {
+ m_state.push( prefix );
+ };
+ ~LogDebug() {
+ m_state.pop();
+ }
+
+ DBGStreamType::KStreamType& dbg() {
+ return m_state.dbg();
+ }
+
+ int depth() {
+ return m_state.depth();
+ }
+
+ operator bool() {
+ bool r = depth() < m_max;
+
+ if ( !r && !m_state.hadWarning() ) {
+ m_state.setHadWarning( true );
+ dbg() << "recursion is too deep" << endl;
+#ifdef DEPTHBACKTRACE
+ kdDebug( 9007 ) << kdBacktrace() << endl;
+#endif
+ }
+ return r;
+ }
+};
+
+
+///does not care about the logging, but still counts the depth
+class DepthDebug {
+ DBGStreamType& m_state;
+ int m_max;
+ public:
+ DepthDebug( const char* prefix = "#", int max = completionMaxDepth, DBGStreamType& st = dbgState ) : m_state( st ), m_max( max ) {
+ Q_UNUSED( prefix );
+ m_state.pushDepth();
+ };
+
+ ~DepthDebug() {
+ m_state.popDepth();
+ }
+
+ kndbgstream dbg() {
+ return kndDebug();
+ }
+
+ int depth() {
+ return m_state.depth();
+ }
+
+ operator bool() {
+ bool r = depth() < m_max;
+
+ if ( !r && !m_state.hadWarning() ) {
+ m_state.setHadWarning( true );
+ dbg() << "recursion is too deep" << endl;
+#ifdef DEPTHBACKTRACE
+ kdDebug( 9007 ) << kdBacktrace() << endl;
+#endif
+ }
+ return r;
+ }
+};
+
+#ifndef VERBOSEMAJOR
+#define ifVerboseMajor(x) /**/
+#else
+#define ifVerboseMajor(x) x
+#endif
+
+bool dbgActive();
+
+#ifdef VERBOSE
+
+typedef LogDebug Debug;
+DBGStreamType::KStreamType& dbg();
+#define ifVerbose( x) {if( dbgActive() ) {x;}}
+#else
+
+DBGStreamType::KStreamType& dbg();
+typedef DepthDebug Debug;
+#define ifVerbose(x) /**/
+#endif
+#ifndef NDEBUG
+kdbgstream dbgMajor();
+#else
+kndbgstream dbgMajor();
+#endif
+}
+#endif
+// kate: indent-mode csands; tab-width 2;
diff --git a/languages/cpp/computerecoverypoints.h b/languages/cpp/computerecoverypoints.h
new file mode 100644
index 00000000..eccd44f6
--- /dev/null
+++ b/languages/cpp/computerecoverypoints.h
@@ -0,0 +1,190 @@
+/***************************************************************************
+ begin : Sat Jul 21 2001
+ copyright : (C) 2001 by Victor R�er
+ email : victor_roeder@gmx.de
+ copyright : (C) 2002,2003 by Roberto Raggi
+ email : roberto@kdevelop.org
+ copyright : (C) 2005 by Adam Treat
+ email : manyoso@yahoo.com
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __COMPUTERECOVERYPOINTS_H__
+#define __COMPUTERECOVERYPOINTS_H__
+
+#include <qvaluestack.h>
+
+#include "simpletype.h"
+#include "simpletypenamespace.h"
+#include "tree_parser.h"
+
+static QString toSimpleName( NameAST* name )
+{
+ if ( !name )
+ return QString::null;
+
+ QString s;
+ QPtrList<ClassOrNamespaceNameAST> l = name->classOrNamespaceNameList();
+ QPtrListIterator<ClassOrNamespaceNameAST> nameIt( l );
+ while ( nameIt.current() )
+ {
+ if ( nameIt.current() ->name() )
+ {
+ s += nameIt.current() ->name() ->text() + "::";
+ }
+ ++nameIt;
+ }
+
+ if ( name->unqualifiedName() && name->unqualifiedName() ->name() )
+ s += name->unqualifiedName() ->name() ->text();
+
+ return s;
+}
+
+
+struct RecoveryPoint
+{
+ int kind;
+ QStringList scope;
+ QValueList<QStringList> imports;
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+
+ RecoveryPoint()
+ : kind( 0 ), startLine( 0 ), startColumn( 0 ),
+ endLine( 0 ), endColumn( 0 )
+ {}
+
+ ///Registers the recovery-points imports into the given namespace
+ void registerImports( SimpleType ns, QString hardCodedAliases ) {
+ SimpleTypeNamespace* n = dynamic_cast<SimpleTypeNamespace*>( &(*ns) );
+ if( !n ) {
+ kdDebug( 9007 ) << "the global namespace was not resolved correctly " << endl;
+ } else {
+ ///put the imports into the global namespace
+ for( QValueList<QStringList>::iterator it = imports.begin(); it != imports.end(); ++it ) {
+ kdDebug( 9007 ) << "inserting import " << *it << " into the global scope" << endl;
+ n->addAliasMap( QString(""), (*it).join("::"), IncludeFiles() ); ///@TODO: remove this
+ }
+ n->addAliases( hardCodedAliases );
+ }
+ }
+
+private:
+ RecoveryPoint( const RecoveryPoint& source );
+ void operator = ( const RecoveryPoint& source );
+};
+
+
+// namespace?
+class ComputeRecoveryPoints: public TreeParser
+{
+public:
+ ComputeRecoveryPoints( QPtrList<RecoveryPoint>& points )
+ : recoveryPoints( points )
+ {}
+
+ virtual void parseTranslationUnit( const ParsedFile& ast )
+ {
+ QValueList<QStringList> dummy;
+
+ m_imports.push( dummy );
+ TreeParser::parseTranslationUnit( ast );
+ m_imports.pop();
+
+ kdDebug( 9007 ) << "found " << recoveryPoints.count() << " recovery points" << endl;
+ }
+
+ virtual void parseUsingDirective( UsingDirectiveAST* ast )
+ {
+ if ( !ast->name() )
+ return ;
+
+ //QStringList type = CppCodeCompletion::typeName( ast->name() ->text() ).scope();
+ m_imports.top().push_back( ast->name() ->text() );
+ }
+
+ virtual void parseNamespace( NamespaceAST* ast )
+ {
+ m_currentScope.push_back( ast->namespaceName() ->text() );
+ insertRecoveryPoint( ast );
+
+ m_imports.push( m_imports.top() ); // dup
+ // m_imports.top().push_back( m_currentScope );
+
+ TreeParser::parseNamespace( ast );
+
+ m_imports.pop();
+ m_currentScope.pop_back();
+ }
+
+ void parseTemplateDeclaration( TemplateDeclarationAST* ast )
+ {
+ if ( ast->declaration() )
+ parseDeclaration( ast->declaration() );
+
+ TreeParser::parseTemplateDeclaration( ast );
+ }
+
+
+ virtual void parseSimpleDeclaration( SimpleDeclarationAST* ast )
+ {
+ TypeSpecifierAST * typeSpec = ast->typeSpec();
+ //InitDeclaratorListAST* declarators = ast->initDeclaratorList();
+
+ if ( typeSpec )
+ parseTypeSpecifier( typeSpec );
+
+ //insertRecoveryPoint( ast );
+ TreeParser::parseSimpleDeclaration( ast );
+ }
+
+ virtual void parseFunctionDefinition( FunctionDefinitionAST* ast )
+ {
+ m_imports.push( m_imports.top() ); // dup
+ insertRecoveryPoint( ast );
+ m_imports.pop();
+ }
+
+ virtual void parseClassSpecifier( ClassSpecifierAST* ast )
+ {
+ insertRecoveryPoint( ast );
+ m_currentScope.push_back( toSimpleName( ast->name() ) );
+ TreeParser::parseClassSpecifier( ast );
+ m_currentScope.pop_back();
+ }
+
+ void insertRecoveryPoint( AST* ast )
+ {
+ if ( !ast )
+ return ;
+
+ RecoveryPoint* pt = new RecoveryPoint();
+ pt->kind = ast->nodeType();
+ pt->scope = m_currentScope;
+ ast->getStartPosition( &pt->startLine, &pt->startColumn );
+ ast->getEndPosition( &pt->endLine, &pt->endColumn );
+ pt->imports = m_imports.top();
+
+ recoveryPoints.append( pt );
+ }
+
+private:
+ QPtrList<RecoveryPoint>& recoveryPoints;
+ QValueStack< QValueList<QStringList> > m_imports;
+ QStringList m_currentScope;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/configproblemreporter.ui b/languages/cpp/configproblemreporter.ui
new file mode 100644
index 00000000..164d6693
--- /dev/null
+++ b/languages/cpp/configproblemreporter.ui
@@ -0,0 +1,189 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ConfigureProblemReporter</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ConfigureProblemReporter</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>588</width>
+ <height>492</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3_2</cstring>
+ </property>
+ <property name="title">
+ <string>Problem Reporter</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If enabled, the C++ parser will report any syntax errors it detects.
+They will be displayed in the 'Problems' output view and as markers in the editor.</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>problemReporterCheckbox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use Problem Reporter</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>Parsing</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If enabled, the C++ parser will run on the active file after the stated timeout, after there has been any changes to the text.
+
+If disabled, the parser will typically only run when the file is saved.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>bgParserCheckbox</cstring>
+ </property>
+ <property name="text">
+ <string>Enable &amp;background parsing</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>delayLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>msec</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignLeft</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>delaySlider</cstring>
+ </property>
+ <property name="minValue">
+ <number>250</number>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="lineStep">
+ <number>250</number>
+ </property>
+ <property name="pageStep">
+ <number>500</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>NoMarks</enum>
+ </property>
+ <property name="tickInterval">
+ <number>250</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Special &amp;Headers</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Often a macro that the C++ parser must understand in order to correctly parse a piece of code is defined somewhere in a non-standard header file that the parser does not look at. This textbox can be used to define those macros locally so that the C++ parser can understand them.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>specialHeader</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>delaySlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>setDelayLabel(int)</slot>
+ </connection>
+ <connection>
+ <sender>bgParserCheckbox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>bgParserCheckbox_toggled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>bgParserCheckbox</tabstop>
+ <tabstop>delaySlider</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+ <include location="local" impldecl="in implementation">configproblemreporter.ui.h</include>
+</includes>
+<forwards>
+ <forward>class CppSupportPart;</forward>
+</forwards>
+<variables>
+ <variable>CppSupportPart* m_part;</variable>
+</variables>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+ <slot>setPart( CppSupportPart * part )</slot>
+ <slot>accept()</slot>
+ <slot>bgParserCheckbox_toggled( bool b )</slot>
+ <slot access="protected">setDelayLabel( int delay )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/cpp/configproblemreporter.ui.h b/languages/cpp/configproblemreporter.ui.h
new file mode 100644
index 00000000..d5952b95
--- /dev/null
+++ b/languages/cpp/configproblemreporter.ui.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+#include "cppsupportpart.h"
+
+#include <kdevproject.h>
+
+#include <kconfig.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <qfile.h>
+#include <qtextstream.h>
+
+void ConfigureProblemReporter::init()
+{
+ m_part = 0;
+ KConfig* config = kapp->config();
+ config->setGroup( "General Options" );
+ problemReporterCheckbox->setChecked( config->readBoolEntry( "EnableProblemReporter", true ) );
+ bgParserCheckbox->setChecked( config->readBoolEntry( "EnableCppBgParser", true ) );
+ delaySlider->setEnabled( bgParserCheckbox->isChecked() );
+ delaySlider->setValue( config->readNumEntry( "BgParserDelay", 500 ) );
+ setDelayLabel( delaySlider->value() );
+}
+
+void ConfigureProblemReporter::destroy()
+{}
+
+void ConfigureProblemReporter::setPart( CppSupportPart* part )
+{
+ m_part = part;
+ if ( !m_part )
+ return ;
+
+ QString conf_file_name = m_part->specialHeaderName();
+ if ( QFile::exists( conf_file_name ) )
+ {
+ QFile f( conf_file_name );
+ if ( f.open( IO_ReadOnly ) )
+ {
+ QTextStream stream( &f );
+ specialHeader->setText( stream.read() );
+ f.close();
+ }
+ }
+}
+
+void ConfigureProblemReporter::accept()
+{
+ KConfig * config = kapp->config();
+ config->setGroup( "General Options" );
+ config->writeEntry( "EnableProblemReporter", problemReporterCheckbox->isChecked() );
+ config->writeEntry( "EnableCppBgParser", bgParserCheckbox->isChecked() );
+ if ( bgParserCheckbox->isChecked() )
+ config->writeEntry( "BgParserDelay", delaySlider->value() );
+ config->sync();
+
+ m_part->updateBackgroundParserConfig();
+
+
+ if ( m_part && specialHeader->isModified() )
+ {
+ QString conf_file_name = m_part->specialHeaderName( true );
+ QFile f( conf_file_name );
+ if ( f.open( IO_WriteOnly ) )
+ {
+ QTextStream stream( &f );
+ stream << specialHeader->text();
+ f.close();
+
+ m_part->updateParserConfiguration();
+ }
+ }
+}
+
+void ConfigureProblemReporter::bgParserCheckbox_toggled( bool b )
+{
+ delaySlider->setEnabled( b );
+ if ( b == TRUE )
+ delayLabel->show();
+ else
+ delayLabel->hide();
+}
+
+
+void ConfigureProblemReporter::setDelayLabel( int delay )
+{
+ delayLabel->setText( i18n( "delay: %1 msec" ).arg( delay ) );
+}
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/configuration b/languages/cpp/configuration
new file mode 100644
index 00000000..bbdc5f4f
--- /dev/null
+++ b/languages/cpp/configuration
@@ -0,0 +1,2 @@
+// add your favorite macros here
+
diff --git a/languages/cpp/cpp_tags.h b/languages/cpp/cpp_tags.h
new file mode 100644
index 00000000..077fbd82
--- /dev/null
+++ b/languages/cpp/cpp_tags.h
@@ -0,0 +1,432 @@
+//
+//
+// C++ Interface: cpp_tags
+//
+// Description:
+//
+//
+// Author: KDevelop Authors <kdevelop-devel@kdevelop.org>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef CPP_TAGS_H
+#define CPP_TAGS_H
+
+#include <qstring.h>
+#include <qstringlist.h>
+
+template <class Tag>
+class CppBaseClass
+{
+public:
+ CppBaseClass( Tag& tag )
+ : m_tag( tag )
+ {
+ m_info.flags = tag.flags();
+ }
+
+ operator Tag& ()
+ {
+ return asTag();
+ }
+ Tag& asTag()
+ {
+ return m_tag;
+ }
+
+ operator const Tag& () const
+ {
+ return asTag();
+ }
+ const Tag& asTag() const
+ {
+ return m_tag;
+ }
+
+ static QString format( const Tag& tag )
+ {
+ return QString::null;
+ }
+
+ int access() const
+ {
+ return m_info.data.access;
+ }
+
+ void setAccess( int access )
+ {
+ m_info.data.access = access;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isVirtual() const
+ {
+ return m_info.data.isVirtual;
+ }
+
+ void setVirtual( bool b )
+ {
+ m_info.data.isVirtual = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ QString name() const
+ {
+ return m_tag.name();
+ }
+
+ void setName( const QString& name )
+ {
+ m_tag.setName( name );
+ }
+
+ QString baseClass() const
+ {
+ return m_tag.attribute( "b" ).toString();
+ }
+
+ void setBaseClass( const QString& baseClass )
+ {
+ m_tag.setAttribute( "b", baseClass );
+ }
+
+private:
+ Tag& m_tag;
+ union
+ {
+ unsigned long flags;
+ struct
+ {
+ unsigned long access:
+ 3;
+ unsigned long isVirtual:
+ 1;
+ }
+ data;
+ } m_info;
+};
+
+template <class Tag>
+class CppVariable
+{
+public:
+ CppVariable( Tag& tag )
+ : m_tag( tag )
+ {
+ m_info.flags = tag.flags();
+ }
+
+ operator Tag& ()
+ {
+ return asTag();
+ }
+ Tag& asTag()
+ {
+ return m_tag;
+ }
+
+ operator const Tag& () const
+ {
+ return asTag();
+ }
+ const Tag& asTag() const
+ {
+ return m_tag;
+ }
+
+ static QString format( const Tag& tag )
+ {
+ return QString::null;
+ }
+
+ int access() const
+ {
+ return m_info.data.access;
+ }
+
+ void setAccess( int access )
+ {
+ m_info.data.access = access;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isFriend() const
+ {
+ return m_info.data.isFriend;
+ }
+
+ void setFriend( bool b )
+ {
+ m_info.data.isFriend = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isStatic() const
+ {
+ return m_info.data.isStatic;
+ }
+
+ void setStatic( bool b )
+ {
+ m_info.data.isStatic = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ QString type() const
+ {
+ return m_tag.attribute( "t" ).toString();
+ }
+
+ void setType( const QString& type )
+ {
+ m_tag.setAttribute( "t", type );
+ }
+
+ QString name() const
+ {
+ return m_tag.name();
+ }
+
+ void setName( const QString& name )
+ {
+ m_tag.setName( name );
+ }
+
+private:
+ Tag& m_tag;
+ union
+ {
+ unsigned long flags;
+ struct
+ {
+ unsigned long access:
+ 3;
+ unsigned long isStatic:
+ 1;
+ unsigned long isFriend:
+ 1;
+ }
+ data;
+ } m_info;
+};
+
+template <class Tag>
+class CppFunction
+{
+public:
+ CppFunction( Tag& tag )
+ : m_tag( tag )
+ {
+ m_info.flags = tag.flags();
+ }
+
+ operator Tag& ()
+ {
+ return asTag();
+ }
+ Tag& asTag()
+ {
+ return m_tag;
+ }
+
+ operator const Tag& () const
+ {
+ return asTag();
+ }
+ const Tag& asTag() const
+ {
+ return m_tag;
+ }
+
+ static QString format( const Tag& tag )
+ {
+ return QString::null;
+ }
+
+ int access() const
+ {
+ return m_info.data.access;
+ }
+
+ void setAccess( int access )
+ {
+ m_info.data.access = access;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isSignal() const
+ {
+ return bool( m_info.data.isSignal );
+ }
+
+ void setSignal( bool isSignal )
+ {
+ m_info.data.isSignal = isSignal;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isSlot() const
+ {
+ return bool( m_info.data.isSlot );
+ }
+
+ void setSlot( bool isSlot )
+ {
+ m_info.data.isSlot = isSlot;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isInline() const
+ {
+ return m_info.data.isInline;
+ }
+
+ void setInline( bool b )
+ {
+ m_info.data.isInline = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isPure() const
+ {
+ return m_info.data.isPure;
+ }
+
+ void setPure( bool b )
+ {
+ m_info.data.isPure = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isFriend() const
+ {
+ return m_info.data.isFriend;
+ }
+
+ void setFriend( bool b )
+ {
+ m_info.data.isFriend = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isConst() const
+ {
+ return m_info.data.isConst;
+ }
+
+ void setConst( bool b )
+ {
+ m_info.data.isConst = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isVolatile() const
+ {
+ return m_info.data.isVolatile;
+ }
+
+ void setVolatile( bool b )
+ {
+ m_info.data.isVolatile = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isVirtual() const
+ {
+ return m_info.data.isVirtual;
+ }
+
+ void setVirtual( bool b )
+ {
+ m_info.data.isVirtual = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+ bool isStatic() const
+ {
+ return m_info.data.isStatic;
+ }
+
+ void setStatic( bool b )
+ {
+ m_info.data.isStatic = b;
+ m_tag.setFlags( m_info.flags );
+ }
+
+
+ QString type() const
+ {
+ return m_tag.attribute( "t" ).toString();
+ }
+
+ void setType( const QString& type )
+ {
+ m_tag.setAttribute( "t", type );
+ }
+
+ QString name() const
+ {
+ return m_tag.name();
+ }
+
+ void setName( const QString& name )
+ {
+ m_tag.setName( name );
+ }
+
+ QStringList arguments() const
+ {
+ return m_tag.attribute( "a" ).toStringList();
+ }
+
+ void setArguments( const QStringList args )
+ {
+ m_tag.setAttribute( "a", args );
+ }
+
+ QStringList argumentNames() const
+ {
+ return m_tag.attribute( "an" ).toStringList();
+ }
+
+ void setArgumentNames( const QStringList args )
+ {
+ m_tag.setAttribute( "an", args );
+ }
+
+private:
+ Tag& m_tag;
+ union
+ {
+ unsigned long flags;
+ struct
+ {
+ unsigned long access:
+ 3;
+ unsigned long isInline:
+ 1;
+ unsigned long isVirtual:
+ 1;
+ unsigned long isStatic:
+ 1;
+ unsigned long isPure:
+ 1;
+ unsigned long isFriend:
+ 1;
+ unsigned long isConst:
+ 1;
+ unsigned long isValile:
+ 1;
+ unsigned long isSlot:
+ 1;
+ unsigned long isSignal:
+ 1;
+ }
+ data;
+ } m_info;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/cppcodecompletion.cpp b/languages/cpp/cppcodecompletion.cpp
new file mode 100644
index 00000000..27cc9009
--- /dev/null
+++ b/languages/cpp/cppcodecompletion.cpp
@@ -0,0 +1,4492 @@
+/***************************************************************************
+ cppcodecompletion.cpp - description
+ -------------------
+begin : Sat Jul 21 2001
+copyright : (C) 2001 by Victor R�er
+email : victor_roeder@gmx.de
+copyright : (C) 2002,2003 by Roberto Raggi
+email : roberto@kdevelop.org
+copyright : (C) 2005 by Adam Treat
+email : manyoso@yahoo.com
+copyright : (C) 2006,2007 by David Nolden
+email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include "cppcodecompletion.h"
+
+
+#include "cppcodecompletionconfig.h"
+#include "backgroundparser.h"
+#include "ast.h"
+#include "ast_utils.h"
+#include "codeinformationrepository.h"
+#include "parser.h"
+#include "lexer.h"
+#include "tree_parser.h"
+#include "cpp_tags.h"
+#include "cppsupport_utils.h"
+#include "tag_creator.h"
+
+#include <typeinfo>
+
+#include <qpopupmenu.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kparts/part.h>
+#include <kstatusbar.h>
+#include <ktexteditor/document.h>
+#include <kaction.h>
+
+#include <qdatastream.h>
+#include <qfile.h>
+#include <qmap.h>
+#include <qregexp.h>
+#include <qstatusbar.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qpair.h>
+#include <qvaluestack.h>
+
+#include <kdevpartcontroller.h>
+#include <kdevmainwindow.h>
+#include <kdevproject.h>
+#include <kdevcoderepository.h>
+#include <codemodel_utils.h>
+#include <codemodel.h>
+#include <codebrowserfrontend.h>
+
+#include "codecompletionentry.h"
+#include "typedesc.h"
+#include "computerecoverypoints.h"
+#include "completiondebug.h"
+#include "bithelpers.h"
+#include "stringhelpers.h"
+#include "simpletype.h"
+#include "simpletypecachebinder.h"
+#include "safetycounter.h"
+#include "cppevaluation.h"
+#include "simplecontext.h"
+#include "simpletypefunction.h"
+
+//#define DISABLE_TRACING
+
+CppCodeCompletion* CppCodeCompletion::m_instance = 0;
+
+const bool disableVerboseForCompletionList = false;
+const bool disableVerboseForContextMenu = false;
+const bool contextMenuEntriesAtTop = false;
+bool showNamespaceAppearances = true;
+
+const char* constructorPrefix = "<constructor>";
+const char* destructorPrefix = "<destructor>";
+///This enables-disables the automatic processing of the expression under the mouse-cursor
+//#define DISABLETOOLTIPS
+
+/**
+-- TODO: Does not yet correctly search for overloaded functions and select the right one
+-- TODO: The documentation shown in the calltips looks very bad, a better solution must be found(maybe an additional tooltip)
+*/
+
+ void statusBarText( const QString& str, int time ) {
+ CppCodeCompletion* c = CppCodeCompletion::instance();
+ if( c )
+ c->addStatusText( str, time );
+ }
+
+TypePointer CppCodeCompletion::createGlobalNamespace() {
+ KSharedPtr<SimpleTypeCachedNamespace> n = new SimpleTypeCachedNamespace( QStringList(), QStringList() );
+ n->addAliases(m_pSupport->codeCompletionConfig()->namespaceAliases() );
+ return n.data();
+}
+
+template <class Item>
+class ItemLocker {
+ public:
+ ItemLocker( Item& it ) : item( it ) {
+ it.lock();
+ }
+ ~ItemLocker() {
+ item.unlock();
+ }
+ private:
+ Item& item;
+};
+
+ParsedFilePointer getParsedFile( CodeModelItem* i ) {
+ if( !i || !i->file() || !i->file()->parseResult() ) return 0;
+ return dynamic_cast<ParsedFile*>( i->file()->parseResult().data());
+}
+
+SafetyCounter safetyCounter;
+CppCodeCompletion* cppCompletionInstance = 0;
+
+//file global functions, must be before any "using namespace"
+QString cleanForMenu( QString txt ) {
+ return txt.replace( "&", "&&" ).replace( " ", " " );
+}
+
+QString buildSignature( TypePointer currType ) {
+ SimpleTypeFunctionInterface * f = currType->asFunction();
+ if ( !f )
+ return "";
+
+ QString ret;
+ LocateResult rtt = currType->locateDecType( f->getReturnType() );
+ if ( rtt->resolved() || rtt.resolutionCount() > 1 )
+ ret = rtt->fullNameChain();
+ else
+ ret = f->getReturnType().fullNameChain();
+
+
+ TypeDesc desc = currType->desc();
+ desc.decreaseFunctionDepth();
+
+ QString sig = ret + " " + desc.fullNameChain() + f->signature();
+ if ( f->isConst() )
+ sig += " const";
+ return sig;
+}
+
+uint PopupTracker::pendingPopups = 0;
+PopupTracker* PopupTracker::pt = 0;
+
+/** Multiple empty lines are reduced to one, too long lines wrapped over, and the beginnings of the lines are normalized
+*/
+QStringList maximumLength( const QStringList& in, int length ) {
+ QStringList ret;
+ uint firstNonSpace = 50000;
+ for ( QStringList::const_iterator it = in.begin(); it != in.end(); ++it )
+ for ( uint a = 0; a < ( *it ).length(); a++ )
+ if ( !( *it ) [ a ].isSpace() ) {
+ if ( firstNonSpace > a )
+ firstNonSpace = a;
+ break;
+ }
+ if ( firstNonSpace == 50000 )
+ return QStringList();
+
+ bool hadEmptyLine = false;
+ for ( QStringList::const_iterator it = in.begin(); it != in.end(); ++it ) {
+ if ( ( *it ).length() <= firstNonSpace ) {
+ if ( !hadEmptyLine )
+ ret << " ";
+ hadEmptyLine = true;
+ } else {
+ hadEmptyLine = false;
+ QString str = ( *it ).mid( firstNonSpace );
+ while ( !str.isEmpty() ) {
+ if ( (int)str.length() < length ) {
+ ret << str;
+ break;
+ } else {
+ ret << str.left( length ) + "\\";
+ str = str.mid( length );
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+QStringList prepareTextForMenu( const QString& comment, int maxLines, int maxLength ) {
+ QStringList in = QStringList::split( "\n", comment );
+ QStringList out;
+ for ( QStringList::iterator it = in.begin(); it != in.end(); ++it ) {
+ out << cleanForMenu( *it );
+ if ( (int)out.count() >= maxLines ) {
+ out << "[...]";
+ break;
+ }
+ }
+
+ return maximumLength( out, maxLength );
+}
+
+QStringList formatComment( const QString& comment, int maxCols = 120 ) {
+ QStringList ret;
+ SafetyCounter s( 14 ); ///maximum of 14 lines
+
+ QStringList lines = QStringList::split( "\n", comment );
+ for ( QStringList::iterator it = lines.begin(); it != lines.end(); ++it ) {
+ QStringList words = QStringList::split( " ", *it );
+ while ( !words.isEmpty() && s ) {
+ QString line = "? ";
+ int len = 0;
+ while ( !words.isEmpty() && len < maxCols ) {
+ len += words.front().length();
+ line += words.front() + " ";
+ words.pop_front();
+ }
+ ret << line;
+ }
+ }
+ if ( !s )
+ ret << "? comment has too many lines";
+
+ return ret;
+}
+
+bool operator < ( const CodeCompletionEntry& e1, const CodeCompletionEntry& e2 ) {
+ return e1.text < e2.text;
+}
+
+template <class ItemType>
+static QValueList<ItemType> unique( const QValueList<ItemType>& entryList ) {
+
+ QValueList< ItemType > l;
+ QMap<QString, bool> map;
+ typename QValueList< ItemType >::ConstIterator it = entryList.begin();
+ while ( it != entryList.end() ) {
+ CodeCompletionEntry e = *it++;
+ QString key = ( e.type + " " +
+ e.prefix + " " +
+ e.text + " " +
+ e.postfix + " " ).simplifyWhiteSpace().stripWhiteSpace();
+ if ( map.find( key ) == map.end() ) {
+ map[ key ] = TRUE;
+ l << e;
+ }
+ }
+ return l;
+}
+
+static QStringList unique( const QStringList& entryList ) {
+
+ QStringList l;
+ QMap<QString, bool> map;
+ QStringList::ConstIterator it = entryList.begin();
+ while ( it != entryList.end() ) {
+ QString e = *it++;
+ if ( map.find( e ) == map.end() ) {
+ map[ e ] = TRUE;
+ l << e;
+ }
+ }
+ return l;
+}
+
+static QStringList unique( const QValueList<QStringList>& entryList ) {
+
+ QStringList l;
+ QMap<QString, bool> map;
+ QValueList<QStringList>::ConstIterator it = entryList.begin();
+ while ( it != entryList.end() ) {
+ QStringList li = ( *it++ );
+ QString e = li.join( "\n" );
+ if ( map.find( e ) == map.end() ) {
+ map[ e ] = TRUE;
+ l += li;
+ }
+ }
+
+ return l;
+}
+
+
+bool tokenAt( const QString& text, const QString& token, int textPos ) {
+ if ( text.isEmpty() )
+ return false;
+
+ int tokenPos = token.length() - 1;
+ if ( tokenPos <= 0 || textPos <= 0 )
+ return false;
+
+ while ( text[ textPos ] == token[ tokenPos ] ) {
+
+ --tokenPos;
+ --textPos;
+
+ if ( tokenPos == 0 || textPos == 0 ) {
+ if ( tokenPos == 0 ) {
+ if ( textPos >= 1 && text[ textPos ] == token[ tokenPos ] ) {
+ QChar c = text[ textPos - 1 ];
+ return c.isSpace() || c == '{' || c == '}' || c == ';';
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ }
+ return false;
+}
+
+CppSupportPart* CppCodeCompletion::cppSupport() const {
+ return m_pSupport;
+}
+
+using namespace CompletionDebug;
+using namespace StringHelpers;
+using namespace BitHelpers;
+using namespace CppEvaluation;
+
+struct PopupFillerHelpStruct {
+ CppCodeCompletion* receiver;
+ FileList files;
+ CppCodeCompletion::PopupActions& m_popupActions;
+ PopupFillerHelpStruct( CppCodeCompletion* rec ) : m_popupActions( rec->m_popupActions ) {
+ receiver = rec;
+ files = receiver->cppSupport()->codeModel()->fileList();
+ }
+
+ bool shouldShowIncludeMenu() const {
+ return true;
+ }
+
+ QMap<QString, QPopupMenu*> m_namespacePopupCache;
+
+ void insertItem( QPopupMenu* parent, SimpleTypeImpl::MemberInfo d , QString prefix ) {
+ Q_UNUSED(prefix);
+
+ QString memType = d.memberTypeToString();
+
+ if ( d.memberType == SimpleTypeImpl::MemberInfo::Typedef && d.type->fullName() == "const int" )
+ memType = "enum";
+
+ QString txt = i18n( "Jump to %1 %2" ).arg( memType ).arg( cleanForMenu( d.name ) );
+ int id = parent->insertItem( txt, receiver, SLOT( popupAction( int ) ) );
+
+ receiver->m_popupActions.insert( id, d.decl );
+ }
+
+ void insertItem ( QPopupMenu* parent, TypeDesc d , QString prefix ) {
+ Debug dbg( "#insert# ", 10 );
+
+ QString txt1, txt2;
+
+ if ( d.resolved() && d.resolved() ->isNamespace() ) {
+ SimpleTypeCachedNamespace * ns = dynamic_cast<SimpleTypeCachedNamespace*>( d.resolved().data() );
+ if ( ns ) {
+ SimpleTypeNamespace::SlaveList slaves = ns->getSlaves( receiver->getIncludeFiles() );
+ for ( SimpleTypeNamespace::SlaveList::iterator it = slaves.begin(); it != slaves.end(); ++it ) {
+ SimpleTypeCodeModel* cm = dynamic_cast<SimpleTypeCodeModel*>( ( *it ).first.first.resolved().data() );
+ if ( cm && cm->item() ) {
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ QString scope = cm->scope().join("::");
+ QMap< QString, QPopupMenu* >::iterator it = m_namespacePopupCache.find( scope );
+ if( it != m_namespacePopupCache.end() ) {
+ parent->insertItem( "Imported Namespace " + scope, *it );
+ delete m;
+ } else {
+ parent->insertItem( "Imported Namespace " + scope, m );
+
+ insertItem( m, ( new SimpleTypeCachedCodeModel( cm->item() ) ) ->desc(), prefix );
+ m_namespacePopupCache.insert( scope, m );
+ }
+ } else {
+ SimpleTypeNamespace* cn = dynamic_cast<SimpleTypeNamespace*>( ( *it ).first.first.resolved().data() );
+ if( cn ) {
+ TypePointer t = new SimpleTypeNamespace( cn ); //To avoid endless recursion, this needs to be done(the dynamic-cast above fails)
+ insertItem( parent, t->desc(), prefix );
+ }
+ }
+ }
+ return ;
+ }
+ }
+
+ if ( d.resolved() && receiver->cppSupport() ->codeCompletionConfig() ->showNamespaceAppearances() ) {
+ if ( SimpleTypeCachedCodeModel * item = dynamic_cast<SimpleTypeCachedCodeModel*>( d.resolved().data() ) ) { ///(1)
+ if ( item->item() && item->item() ->isNamespace() ) {
+ NamespaceModel* ns = dynamic_cast<NamespaceModel*>( item->item().data() );
+ QStringList wholeScope = ns->scope();
+ wholeScope << ns->name();
+ for( FileList::iterator it = files.begin(); it != files.end(); ++it ) {
+ // if( !safetyCounter ) break;
+ NamespaceModel* ns = (*it).data();
+
+ for( QStringList::iterator it2 = wholeScope.begin(); it2 != wholeScope.end(); ++it2 ) {
+ if( ns->hasNamespace( (*it2) ) ) {
+ ns = ns->namespaceByName( *it2 );
+ if( !ns ) break;
+ } else {
+ ns = 0;
+ break;
+ }
+ }
+
+ if( ns ) {
+ ItemDom i(ns);
+ int sLine, sCol, eLine, eCol;
+ i->getStartPosition( &sLine, &sCol );
+ i->getEndPosition( &eLine, &eCol );
+ insertItem( parent, (new SimpleTypeCodeModel( i ))->desc(), prefix + " " + (*it)->name() + QString(" (%1 Lines): ").arg( eLine - sLine ) ); ///SimpleTypeCodeModel is used instead of SimpleTypeCachedNodeModel, so the detection at (1) does not trigger, this avoids endless recursion.
+ }
+
+ }
+ return;
+ }
+ }
+ }
+
+ if ( d.resolved() ) {
+ if ( d.resolved() ->asFunction() ) {
+ txt1 = prefix + i18n( "Jump to declaration of %1(...)" ).arg( d.resolved() ->scope().join( "::" ) );
+ txt2 = prefix + i18n( "Jump to definition of %1(...)" ).arg( d.resolved() ->scope().join( "::" ) );
+ } else {
+ txt1 = prefix + i18n( "Jump to %1" ).arg( cleanForMenu( d.resolved() ->scope().join( "::" ) ) );
+ }
+ } else {
+ if( !BuiltinTypes::isBuiltin( d ) ) {
+ txt1 = prefix + d.name() + i18n( " is unresolved" );
+ } else {
+ txt1 = prefix + d.name() + i18n( " (builtin " ) + BuiltinTypes::comment( d ) + ")";
+ }
+ }
+
+ int id = parent->insertItem( txt1, receiver, SLOT( popupAction( int ) ) );
+ if ( d.resolved() )
+ receiver->m_popupActions.insert( id, d.resolved() ->getDeclarationInfo() );
+
+ if ( !txt2.isEmpty() ) {
+ int id2 = parent->insertItem( txt2, receiver, SLOT( popupDefinitionAction( int ) ) );
+ if ( d.resolved() )
+ receiver->m_popupDefinitionActions.insert( id2, d.resolved() ->getDeclarationInfo() );
+ }
+ }
+};
+
+ItemDom itemFromScope( const QStringList& scope, NamespaceDom startNamespace ) {
+ if ( scope.isEmpty() )
+ return ItemDom();
+
+ NamespaceDom glob = startNamespace;
+ if ( !glob )
+ return ItemDom();
+
+ ClassModel* curr = glob ;
+
+ QStringList::const_iterator mit = scope.begin();
+
+ while ( curr->isNamespace() && mit != scope.end() && ( ( NamespaceModel* ) curr ) ->hasNamespace( *mit ) ) {
+ curr = &( *( ( ( NamespaceModel* ) curr ) ->namespaceByName( *mit ) ) );
+ ++mit;
+ }
+
+ while ( ( curr->isNamespace() || curr->isClass() ) && mit != scope.end() && curr->hasClass( *mit ) ) {
+ ClassList cl = curr->classByName( *mit );
+ curr = &( **cl.begin() );
+ ++mit;
+ }
+
+ if ( mit != --scope.end() )
+ return ItemDom();
+
+ TypeAliasList l = curr->typeAliasByName( *mit );
+ if ( !l.isEmpty() )
+ return model_cast<ItemDom>( l.front() );
+
+ VariableDom v = curr->variableByName( *mit );
+ if ( v )
+ return model_cast<ItemDom>( v );
+
+ ClassList c = curr->classByName( *mit );
+ if ( !c.isEmpty() )
+ return model_cast<ItemDom>( c.front() );
+
+ EnumDom en = curr->enumByName( *mit );
+ if ( en )
+ return model_cast<ItemDom>( en );
+
+ FunctionList f = curr->functionByName( *mit );
+ if ( !f.isEmpty() )
+ return model_cast<ItemDom>( f.front() );
+
+ FunctionDefinitionList fd = curr->functionDefinitionByName( *mit );
+ if ( !fd.isEmpty() )
+ return model_cast<ItemDom>( fd.front() );
+
+ return ItemDom();
+}
+
+struct PopupClassViewFillerHelpStruct {
+ CppCodeCompletion* receiver;
+ CppCodeCompletion::PopupActions& m_popupActions;
+ PopupClassViewFillerHelpStruct( CppCodeCompletion* rec ) : m_popupActions( rec->m_popupActions ) {
+ receiver = rec;
+ }
+
+ bool shouldShowIncludeMenu() const {
+ return false;
+ }
+
+ void insertItem( QPopupMenu* parent, SimpleTypeImpl::MemberInfo d , QString prefix ) {
+ Q_UNUSED(prefix);
+ FileDom f = receiver->m_pSupport->codeModel() ->fileByName( d.decl.file );
+ if ( !f )
+ return ;
+
+ ItemDom dom = itemFromScope( QStringList::split( "::", d.name ), model_cast<NamespaceDom>( f ) );
+
+ QString memType = d.memberTypeToString();
+
+ if ( d.memberType == SimpleTypeImpl::MemberInfo::Typedef && d.type->fullName() == "const int" )
+ memType = "enum";
+
+ QString txt = i18n( "Show %1 %2" ).arg( memType ).arg( cleanForMenu( d.name ) );
+ int id = parent->insertItem( txt, receiver, SLOT( popupClassViewAction( int ) ) );
+
+ receiver->m_popupClassViewActions.insert( id, dom );
+ }
+
+ void insertItem ( QPopupMenu* parent, TypeDesc d , QString prefix ) {
+ Debug dbg( "#insert# ", 10 );
+
+ QString txt;
+ if ( !d.resolved() )
+ return ;
+
+ ItemDom dom;
+
+ if ( d.resolved() ) {
+ SimpleTypeCodeModel * cm = dynamic_cast<SimpleTypeCodeModel*>( d.resolved().data() );
+ if ( cm )
+ dom = cm->item();
+ }
+
+ if ( d.resolved() ) {
+ if ( !dom && d.resolved() ->isNamespace() ) {
+ SimpleTypeCachedNamespace * ns = dynamic_cast<SimpleTypeCachedNamespace*>( d.resolved().data() );
+ if ( ns ) {
+ SimpleTypeNamespace::SlaveList slaves = ns->getSlaves( receiver->getIncludeFiles() );
+ for ( SimpleTypeNamespace::SlaveList::iterator it = slaves.begin(); it != slaves.end(); ++it ) {
+ SimpleTypeCodeModel* cm = dynamic_cast<SimpleTypeCodeModel*>( ( *it ).first.first.resolved().data() );
+ if ( cm && cm->item() ) {
+ insertItem( parent, ( new SimpleTypeCachedCodeModel( cm->item() ) ) ->desc(), prefix );
+ } else {
+ SimpleTypeNamespace* cn = dynamic_cast<SimpleTypeNamespace*>( ( *it ).first.first.resolved().data() );
+ if( cn ) {
+ TypePointer t = new SimpleTypeNamespace( cn ); //to avoid endless recursion (caching would be better)
+ insertItem( parent, t->desc(), prefix );
+ }
+ }
+ }
+ return ;
+ }
+ } else {
+ if ( dom ) {
+ QString n = d.resolved() ->scope().join( "::" );
+ //QString n = d.fullNameChain();
+ if ( d.resolved() ->asFunction() ) {
+ n = buildSignature( d.resolved() );
+ }
+ txt = prefix + i18n( "Show %1" ).arg( cleanForMenu( n ) );
+ } else {
+ txt = prefix + d.name() + " not in code-model";
+ }
+ }
+ } else {
+ if( !BuiltinTypes::isBuiltin( d ) ) {
+ txt = prefix + d.name() + i18n( " is unresolved" );
+ } else {
+ txt = prefix + d.name() + i18n( " (builtin " ) + BuiltinTypes::comment( d ) + ")";
+ }
+ }
+
+ int id = parent->insertItem( txt, receiver, SLOT( popupClassViewAction( int ) ) );
+
+ if ( dom )
+ receiver->m_popupClassViewActions.insert( id, dom );
+ }
+};
+
+template <class HelpStruct = PopupFillerHelpStruct>
+class PopupFiller {
+ HelpStruct struk;
+ QString depthAdd;
+ SafetyCounter s;
+ public:
+ PopupFiller( HelpStruct str , QString dAdd, int maxCount = 100 ) : struk( str ), depthAdd( dAdd ), s( maxCount ) {}
+
+
+ void fillIncludes( const DeclarationInfo& decl, QPopupMenu* parent, bool& needSeparator ) {
+ if( !struk.receiver->getIncludeFiles()[ HashedString( decl.file ) ] ) {
+ QString file = decl.file;
+ //The include-file seems to be missing
+ if( needSeparator ) {
+ needSeparator = false;
+ parent->insertSeparator();
+ }
+
+ QString includeFile = file;
+ QFileInfo info( file );
+
+ Driver* driver = struk.receiver->cppSupport()->driver();
+ if( driver ) {
+ QStringList elements = QStringList::split( "/", file );
+ includeFile = elements.back();
+ elements.pop_back();
+
+ Dependence d;
+ d.first = includeFile;
+ d.second = Dep_Local;
+ while( driver->findIncludeFile( d, struk.receiver->activeFileName() ) != file && !elements.empty() ) {
+ //kdDebug( 9007 ) << "could not find include-file \"" << d.first << "\"" << endl;
+ includeFile = elements.back() + "/" + includeFile;
+ d.first = includeFile;
+ elements.pop_back();
+ }
+ if( elements.empty() )
+ includeFile = "/" + includeFile;
+
+ //kdDebug( 9007 ) << "found include-file \"" << includeFile << "\"" << endl;
+ }
+ int id = parent->insertItem( i18n( "#include \"%1\" ( defines %2 )" ).arg ( includeFile ).arg( decl.name ), struk.receiver, SLOT( popupAction( int ) ) );
+ DeclarationInfo fakeDec;
+ fakeDec.name = decl.name;
+ fakeDec.file = includeFile;
+ fakeDec.startLine = -1; //Use startline -1 to indicate that instead of jumping to the file, the file should be included.
+ struk.m_popupActions.insert( id, fakeDec );
+ }
+ }
+
+ void fill( QPopupMenu * parent, LocateResult d, QString prefix = "", const DeclarationInfo & sourceVariable = DeclarationInfo() ) {
+ Debug dbg( "#fl# ", 10 )
+ ;
+
+
+ if ( !s || !dbg ) {
+ //dbgMajor() << "safety-counter triggered while filling \"" << d.fullNameChain() << "\"" << endl;
+ return ;
+ }
+
+ if ( !sourceVariable.name.isEmpty() && sourceVariable.name != "this" ) {
+ SimpleTypeImpl::MemberInfo f;
+ f.decl = sourceVariable;
+ f.name = sourceVariable.name;
+ f.type = d.desc();
+ f.memberType = SimpleTypeImpl::MemberInfo::Variable;
+
+ /*int id = m->insertItem( i18n("jump to variable-declaration \"%1\"").arg( type.sourceVariable.name ) , this, SLOT( popupAction( int ) ) );
+
+ m_popupActions.insert( id, type.sourceVariable );*/
+ struk.insertItem( parent, f, prefix );
+
+ parent->insertSeparator();
+
+ if ( !sourceVariable.comment.isEmpty() ) {
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ parent->insertItem( i18n( "Comment on %1" ).arg( sourceVariable.name ), m );
+ QStringList ls = prepareTextForMenu( sourceVariable.comment, 15, 100 );
+ for ( QStringList::iterator it = ls.begin(); it != ls.end(); ++it ) {
+ m->insertItem( *it, 0, SLOT( popupClassViewAction( int ) ) );
+ }
+ parent->insertSeparator();
+ }
+ }
+
+ struk.insertItem( parent, d, prefix );
+
+ if( d->resolved() && !d->resolved()->specialization().isEmpty() ) {
+ SimpleType p = d->resolved()->parent();
+ LocateResult r = p->locateDecType( d->name() );
+ if( r ) {
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ parent->insertItem( i18n( "Specialized from \"%1\"" ).arg( cleanForMenu( r->fullNameChain() ) ), m );
+ fill( m, r );
+ }
+ }
+
+ TypeDesc::TemplateParams p = d->templateParams();
+ for ( TypeDesc::TemplateParams::iterator it = p.begin(); it != p.end(); ++it ) {
+ //if( (*it)->resolved() ) {
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ parent->insertItem( i18n( "Template-param \"%1\"" ).arg( cleanForMenu( ( *it ) ->fullNameChain() ) ), m );
+ fill( m, **it );
+ /*} else {
+ fill( parent, **it, prefix + depthAdd );
+ }*/
+ }
+
+ if ( d->resolved() ) {
+ if ( d->resolved() ->asFunction() ) {
+ LocateResult rt = d->resolved() ->locateDecType( d->resolved() ->asFunction() ->getReturnType() );
+ if ( rt ) {
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ parent->insertItem( i18n( "Return-type \"%1\"" ).arg( cleanForMenu( rt->fullNameChain() ) ), m );
+ fill( m, rt );
+ }
+
+ QValueList<TypeDesc> args = d->resolved() ->asFunction() ->getArgumentTypes();
+ QStringList argNames = d->resolved() ->asFunction() ->getArgumentNames();
+ if ( !args.isEmpty() ) {
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ parent->insertItem( i18n( "Argument-types" ), m );
+ QStringList::iterator it2 = argNames.begin();
+ for ( QValueList<TypeDesc>::iterator it = args.begin(); it != args.end(); ++it ) {
+ LocateResult at = d->resolved() ->locateDecType( *it );
+ QString name = "";
+ if ( it2 != argNames.end() ) {
+ name = *it2;
+ ++it2;
+ }
+ QPopupMenu * mo = PopupTracker::createPopup( m );
+ m->insertItem( i18n( "Argument \"%1\"" ).arg( cleanForMenu( at->fullNameChain() + " " + name ) ), mo );
+ fill( mo, at );
+
+ }
+ }
+ }
+ }
+#ifndef DISABLE_TRACING
+ if ( d.trace() ) {
+ QValueList<QPair<SimpleTypeImpl::MemberInfo, TypeDesc> > trace = d.trace() ->trace();
+ if ( !trace.isEmpty() ) {
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ parent->insertItem( i18n( "Trace" ), m );
+
+ for ( QValueList<QPair<SimpleTypeImpl::MemberInfo, TypeDesc> >::iterator it = trace.begin(); it != trace.end(); ++it ) {
+ QPopupMenu * mo = PopupTracker::createPopup( m );
+ QString tail = ( *it ).second.fullNameChain();
+ if ( !tail.isEmpty() )
+ tail = "::" + tail;
+ m->insertItem( i18n( "%1 -> %2" ).arg( cleanForMenu( ( *it ).first.name + tail ) ).arg( cleanForMenu( ( *it ).first.type->fullNameChain() + tail ) ), mo );
+
+ struk.insertItem( mo, ( *it ).first, prefix );
+
+ if ( !( *it ).first.decl.comment.isEmpty() ) {
+ mo->insertSeparator();
+ QPopupMenu * m = PopupTracker::createPopup( mo );
+ mo->insertItem( i18n( "Comment" ), m );
+ QStringList ls = prepareTextForMenu( ( *it ).first.decl.comment, 15, 100 );
+ for ( QStringList::iterator it = ls.begin(); it != ls.end(); ++it ) {
+ m->insertItem( *it, 0, SLOT( popupClassViewAction( int ) ) );
+ }
+ }
+
+ /*bool needSeparator = true;
+ if( struk.shouldShowIncludeMenu() && struk.receiver->cppSupport()->codeCompletionConfig()->preProcessAllHeaders() && !(*it).first.decl.file.operator QString().isEmpty() )
+ fillIncludes( (*it).first.decl, mo, needSeparator );*/
+ }
+ }
+ }
+#endif
+
+ if ( d->resolved() ) {
+ QValueList<LocateResult> bases = d->resolved() ->getBases();
+ for ( QValueList<LocateResult>::iterator it = bases.begin(); it != bases.end(); ++it ) {
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ parent->insertItem( i18n( "Base-class \"%1\"" ).arg( cleanForMenu( ( *it ) ->fullNameChain() ) ), m );
+ fill( m, *it );
+ }
+
+ if ( d->resolved() ->parent() && d->resolved() ->parent() ->desc() ) {
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ parent->insertItem( i18n( "Nested in \"%1\"" ).arg( cleanForMenu( d->resolved() ->parent() ->fullTypeResolved() ) ), m );
+ fill( m, d->resolved() ->parent() ->desc() );
+ }
+
+ if ( !d->resolved() ->comment().isEmpty() ) {
+ parent->insertSeparator();
+ QPopupMenu * m = PopupTracker::createPopup( parent );
+ parent->insertItem( i18n( "Comment on %1" ).arg( cleanForMenu( d->name() ) ), m );
+ QStringList ls = prepareTextForMenu( d->resolved() ->comment(), 15, 100 );
+ for ( QStringList::iterator it = ls.begin(); it != ls.end(); ++it ) {
+ m->insertItem( *it, 0, SLOT( popupClassViewAction( int ) ) );
+ }
+ }
+ }
+
+ //Add entries for including missing include-files
+ if( struk.shouldShowIncludeMenu() && struk.receiver->cppSupport()->codeCompletionConfig()->preProcessAllHeaders() ) {
+ bool needSeparator = true;
+ //Show the include-files for the whole trace, because usually the first in the trace should be the one to include
+ if ( d.trace() ) {
+ QValueList<QPair<SimpleTypeImpl::MemberInfo, TypeDesc> > trace = d.trace() ->trace();
+ if ( !trace.isEmpty() ) {
+ for ( QValueList<QPair<SimpleTypeImpl::MemberInfo, TypeDesc> >::iterator it = trace.begin(); it != trace.end(); ++it ) {
+ if( struk.shouldShowIncludeMenu() && struk.receiver->cppSupport()->codeCompletionConfig()->preProcessAllHeaders() && !(*it).first.decl.file.operator QString().isEmpty() )
+ fillIncludes( (*it).first.decl, parent, needSeparator );
+ }
+ }
+ }
+
+ //Show the include-file for the item itself
+ if( d->resolved() && !d->resolved()->isNamespace() && struk.receiver->cppSupport() ) {
+ fillIncludes( d->resolved()->getDeclarationInfo(), parent, needSeparator );
+ }
+ }
+ }
+};
+
+struct CompTypeProcessor : public TypeProcessor {
+ SimpleType m_scope;
+ bool m_processArguments;
+
+ CompTypeProcessor( SimpleType scope, bool processArguments ) : m_scope( scope ), m_processArguments( processArguments ) {}
+
+ virtual QString parentType() {
+ return m_scope->fullType();
+ }
+
+ virtual QString processType( const QString& type ) {
+ if ( !m_processArguments )
+ return type;
+ LocateResult t = m_scope->locateDecType( type );
+ if ( t )
+ return t->fullNameChain();
+ else
+ return type;
+ }
+};
+
+struct CppCodeCompletionData {
+ QPtrList<RecoveryPoint> recoveryPoints;
+ //QStringList classNameList;
+
+ CppCodeCompletionData() {
+ recoveryPoints.setAutoDelete( true );
+ }
+
+ RecoveryPoint* findRecoveryPoint( int line, int column ) {
+ if ( recoveryPoints.count() == 0 )
+ return 0;
+
+ QPair<int, int> pt = qMakePair( line, column );
+
+ QPtrListIterator<RecoveryPoint> it( recoveryPoints );
+ RecoveryPoint* recPt = 0;
+
+ while ( it.current() ) {
+ QPair<int, int> startPt = qMakePair( it.current() ->startLine, it.current() ->startColumn );
+ QPair<int, int> endPt = qMakePair( it.current() ->endLine, it.current() ->endColumn );
+
+ if ( pt < startPt ) {
+ break;
+ }
+
+ if ( startPt < pt && pt < endPt )
+ recPt = it.current();
+
+ ++it;
+ }
+
+ return recPt;
+ }
+
+};
+
+CppCodeCompletion::CppCodeCompletion( CppSupportPart* part )
+ : d( new CppCodeCompletionData ),
+ //Matches on includes
+ m_includeRx( "^\\s*#\\s*include\\s+[\"<]" ),
+ //Matches on C++ and C style comments as well as literal strings
+ m_cppCodeCommentsRx( "(//([^\n]*)(\n|$)|/\\*.*\\*/|\"([^\\\\]|\\\\.)*\")" ),
+ //Matches on alpha chars and '.'
+ m_codeCompleteChRx( "([A-Z])|([a-z])|(\\.)" ),
+ //Matches on "->" and "::"
+m_codeCompleteCh2Rx( "(->)|(\\:\\:)" ) {
+ m_instance = this;
+ cppCompletionInstance = this;
+ m_cppCodeCommentsRx.setMinimal( true );
+
+ m_pSupport = part;
+
+ connect( m_pSupport->codeCompletionConfig(), SIGNAL( stored() ), this, SLOT( emptyCache() ) );
+
+ m_activeCursor = 0;
+ m_activeEditor = 0;
+ m_activeCompletion = 0;
+ m_activeHintInterface = 0;
+ m_activeView = 0;
+ m_ccTimer = new QTimer( this );
+ m_showStatusTextTimer = new QTimer( this );
+
+ m_ccLine = 0;
+ m_ccColumn = 0;
+ connect( m_ccTimer, SIGNAL( timeout() ), this, SLOT( slotTimeout() ) );
+ connect( m_showStatusTextTimer, SIGNAL( timeout() ), this, SLOT( slotStatusTextTimeout() ) );
+
+ computeFileEntryList();
+
+ CppSupportPart* cppSupport = m_pSupport;
+ connect( cppSupport->project(), SIGNAL( addedFilesToProject( const QStringList& ) ),
+ this, SLOT( computeFileEntryList() ) );
+ connect( cppSupport->project(), SIGNAL( removedFilesFromProject( const QStringList& ) ),
+ this, SLOT( computeFileEntryList() ) );
+ connect( cppSupport, SIGNAL( synchronousParseReady( const QString&, ParsedFilePointer ) ), this, SLOT( synchronousParseReady( const QString&, ParsedFilePointer ) ) );
+
+ m_bArgHintShow = false;
+ m_bCompletionBoxShow = false;
+ m_blockForKeyword = false;
+ m_demandCompletion = false;
+ m_completionMode = NormalCompletion;
+
+ m_repository = new CodeInformationRepository( cppSupport->codeRepository() );
+
+ connect( cppSupport->codeRepository(), SIGNAL(catalogRegistered( Catalog* )), this, SLOT( emptyCache() ) );
+ connect( cppSupport->codeRepository(), SIGNAL(catalogUnregistered( Catalog* )), this, SLOT( emptyCache() ) );
+ connect( cppSupport->codeRepository(), SIGNAL(catalogChanged( Catalog* )), this, SLOT( emptyCache() ) );
+
+ setupCodeInformationRepository();
+
+ if ( part->partController() ->parts() ) {
+ QPtrListIterator<KParts::Part> it( *part->partController() ->parts() );
+ while ( KParts::Part * part = it.current() ) {
+ integratePart( part );
+ ++it;
+ }
+ }
+
+ if ( part->partController() ->activePart() )
+ slotActivePartChanged( part->partController() ->activePart() );
+
+ connect( part->partController( ), SIGNAL( partAdded( KParts::Part* ) ),
+ this, SLOT( slotPartAdded( KParts::Part* ) ) );
+ connect( part->partController( ), SIGNAL( activePartChanged( KParts::Part* ) ),
+ this, SLOT( slotActivePartChanged( KParts::Part* ) ) );
+
+ connect( part, SIGNAL( fileParsed( const QString& ) ),
+ this, SLOT( slotFileParsed( const QString& ) ) );
+ connect( part, SIGNAL( codeModelUpdated( const QString& ) ),
+ this, SLOT( slotCodeModelUpdated( const QString& ) ) );
+
+ KAction * action = new KAction( i18n("Jump to declaration under cursor"), 0, CTRL + Key_Comma,
+ this, SLOT(slotJumpToDeclCursorContext()), part->actionCollection(), "jump_to_declaration_cursor_context" );
+ action->plug( &m_DummyActionWidget );
+
+ action = new KAction( i18n("Jump to definition under cursor"), 0, CTRL + Key_Period,
+ this, SLOT(slotJumpToDefCursorContext()), part->actionCollection(), "jump_to_defintion_cursor_context" );
+ action->plug( &m_DummyActionWidget );
+}
+
+CppCodeCompletion::~CppCodeCompletion( ) {
+ delete m_repository;
+ delete d;
+}
+
+void CppCodeCompletion::addStatusText( QString text, int timeout ) {
+ m_statusTextList.append( QPair<int, QString>( timeout, text ) );
+ if ( !m_showStatusTextTimer->isActive() ) {
+ slotStatusTextTimeout();
+ }
+}
+
+void CppCodeCompletion::clearStatusText() {
+ m_statusTextList.clear();
+ m_showStatusTextTimer->stop();
+}
+
+void CppCodeCompletion::slotStatusTextTimeout() {
+ if ( m_statusTextList.isEmpty() || !m_pSupport )
+ return ;
+// m_pSupport->mainWindow() ->statusBar() ->message( m_statusTextList.front().second, m_statusTextList.front().first );
+ m_showStatusTextTimer->start( m_statusTextList.front().first , true );
+ m_statusTextList.pop_front();
+}
+
+void CppCodeCompletion::slotTimeout() {
+ if ( !m_activeCursor || !m_activeEditor || !m_activeCompletion )
+ return ;
+
+ uint nLine, nCol;
+ m_activeCursor->cursorPositionReal( &nLine, &nCol );
+
+ if ( nLine != m_ccLine || nCol != m_ccColumn )
+ return ;
+
+ QString textLine = m_activeEditor->textLine( nLine );
+ QChar ch = textLine[ nCol ];
+ if ( ch.isLetterOrNumber() || ch == '_' )
+ return ;
+
+ completeText();
+}
+
+void CppCodeCompletion::slotArgHintHidden() {
+ //kdDebug(9007) << "CppCodeCompletion::slotArgHintHidden()" << endl;
+ m_bArgHintShow = false;
+}
+
+void CppCodeCompletion::slotCompletionBoxHidden() {
+ //kdDebug( 9007 ) << "CppCodeCompletion::slotCompletionBoxHidden()" << endl;
+ m_bCompletionBoxShow = false;
+}
+
+
+void CppCodeCompletion::integratePart( KParts::Part * part ) {
+ if ( !part || !part->widget() )
+ return ;
+
+ KTextEditor::Document* doc = dynamic_cast<KTextEditor::Document*>( part );
+ if ( doc ) {
+ kdDebug( 9007 ) << k_funcinfo << "integrate document: " << doc << endl;
+
+ if ( m_pSupport ) { //The slot should connected even when automatic completion is disabled, so it can be enabled any time
+ kdDebug( 9007 ) << k_funcinfo << "enabling code completion" << endl;
+ connect( part, SIGNAL( textChanged() ), this, SLOT( slotTextChanged() ) );
+ connect( part->widget(), SIGNAL( completionDone() ), this,
+ SLOT( slotCompletionBoxHidden() ) );
+ connect( part->widget(), SIGNAL( completionAborted() ), this,
+ SLOT( slotCompletionBoxHidden() ) );
+ connect( part->widget(), SIGNAL( argHintHidden() ), this,
+ SLOT( slotArgHintHidden() ) );
+ }
+ }
+}
+
+void CppCodeCompletion::slotPartAdded( KParts::Part * part ) {
+ integratePart( part );
+}
+
+void CppCodeCompletion::slotActivePartChanged( KParts::Part * part ) {
+ emptyCache();
+ this->d->recoveryPoints.clear();
+ if ( m_activeHintInterface && m_activeView ) {
+ disconnect( m_activeView , SIGNAL( needTextHint( int, int, QString & ) ), this, SLOT( slotTextHint( int, int, QString& ) ) );
+
+ m_activeHintInterface = 0;
+ }
+ if ( !part )
+ return ;
+
+ kdDebug( 9007 ) << k_funcinfo << endl;
+
+ m_activeFileName = QString::null;
+
+ KTextEditor::Document* doc = dynamic_cast<KTextEditor::Document*>( part );
+ if ( !doc )
+ return ;
+
+ m_activeFileName = doc->url().path();
+
+ // if the interface stuff fails we should disable codecompletion automatically
+ m_activeEditor = dynamic_cast<KTextEditor::EditInterface*>( part );
+ if ( !m_activeEditor ) {
+ kdDebug( 9007 ) << "Editor doesn't support the EditDocumentIface" << endl;
+ return ;
+ }
+
+ m_activeCursor = dynamic_cast<KTextEditor::ViewCursorInterface*>( part->widget() );
+ if ( !m_activeCursor ) {
+ kdDebug( 9007 ) << "The editor doesn't support the CursorDocumentIface!" << endl;
+ return ;
+ }
+
+ m_activeCompletion = dynamic_cast<KTextEditor::CodeCompletionInterface*>( part->widget() );
+ if ( !m_activeCompletion ) {
+ kdDebug( 9007 ) << "Editor doesn't support the CompletionIface" << endl;
+ return ;
+ }
+
+ m_activeView = part ? dynamic_cast<KTextEditor::View*>( part->widget() ) : 0;
+
+ if ( m_activeView )
+ m_activeHintInterface = dynamic_cast<KTextEditor::TextHintInterface*>( m_activeView );
+
+ char* q = 0;
+ kdDebug() << q << endl;
+
+ if ( m_activeHintInterface ) {
+#ifndef DISABLETOOLTIPS
+ m_activeHintInterface->enableTextHints( 500 );
+ connect( m_activeView, SIGNAL( needTextHint( int, int, QString & ) ), this, SLOT( slotTextHint( int, int, QString& ) ) );
+#endif
+
+ } else {
+ kdDebug( 9007 ) << "editor has no text-hint-interface" << endl;
+ }
+
+ kdDebug( 9007 ) << k_funcinfo << "-- end" << endl;
+}
+
+void CppCodeCompletion::slotTextChanged() {
+ m_ccTimer->stop();
+
+ if ( !m_activeCursor )
+ return ;
+
+ unsigned int nLine, nCol;
+ m_activeCursor->cursorPositionReal( &nLine, &nCol );
+
+ QString strCurLine = m_activeEditor->textLine( nLine );
+ QString ch = strCurLine.mid( nCol - 1, 1 );
+ QString ch2 = strCurLine.mid( nCol - 2, 2 );
+
+ // Tell the completion box to _go_away_ when the completion char
+ // becomes empty or whitespace and the box is already showing.
+ // !!WARNING!! This is very hackish, but KTE doesn't offer a way
+ // to tell the completion box to _go_away_
+ if ( ch.simplifyWhiteSpace().isEmpty() &&
+ !strCurLine.simplifyWhiteSpace().contains( "virtual" ) &&
+ m_bCompletionBoxShow ) {
+ QValueList<KTextEditor::CompletionEntry> entryList;
+ m_bCompletionBoxShow = true;
+ m_activeCompletion->showCompletionBox( entryList, 0 );
+ }
+
+ m_ccLine = 0;
+ m_ccColumn = 0;
+
+ bool argsHint = m_pSupport->codeCompletionConfig() ->automaticArgumentsHint();
+ bool codeComplete = m_pSupport->codeCompletionConfig() ->automaticCodeCompletion();
+ bool headComplete = codeComplete; //m_pSupport->codeCompletionConfig() ->automaticHeaderCompletion();
+
+ // m_codeCompleteChRx completes on alpha chars and '.'
+ // m_codeCompleteCh2Rx completes on "->" and "::"
+
+ if ( ( argsHint && ch == "(" ) ||
+ ( codeComplete && strCurLine.simplifyWhiteSpace().contains( "virtual" ) ) ||
+ ( codeComplete && ( m_codeCompleteChRx.search( ch ) != -1 ||
+ m_codeCompleteCh2Rx.search( ch2 ) != -1 ) ) ||
+ ( headComplete && ( ch == "\"" || ch == "<" ) && m_includeRx.search( strCurLine ) != -1 ) ) {
+ int time;
+ m_ccLine = nLine;
+ m_ccColumn = nCol;
+ if ( ch == "(" )
+ time = m_pSupport->codeCompletionConfig() ->argumentsHintDelay();
+ else
+ time = m_pSupport->codeCompletionConfig() ->codeCompletionDelay();
+ m_ccTimer->start( time, true );
+ }
+
+ fitContextItem( nLine, nCol );
+}
+
+void CppCodeCompletion::fitContextItem( int nLine, int nCol ) {
+ if( !SimpleType::globalNamespace() ) {
+ kdDebug( 9007 ) << "no global namespace was set, clearing cache" << endl;
+ emptyCache();
+ }
+ ///Find out whether the cache may be used on, or has to be cleared.
+ if ( m_cachedFromContext ) {
+ int sLine, sCol, eLine, eCol;
+ m_cachedFromContext->getStartPosition( &sLine, &sCol );
+ m_cachedFromContext->getEndPosition( &eLine, &eCol );
+
+ if ( ( nLine < sLine || ( nLine == sLine && nCol < sCol ) ) || ( nLine > eLine || ( nLine == eLine && nCol >= eCol ) ) ) {
+ ///The stored item was left. First check whether the item was expanded.
+ FileDom file = m_pSupport->codeModel() ->fileByName( m_activeFileName );
+
+ if ( file ) {
+ CodeModelUtils::CodeModelHelper fileModel( m_pSupport->codeModel(), file );
+ if ( m_cachedFromContext->isClass() ) {
+ ClassDom klass = fileModel.classAt( nLine, nCol );
+ if ( klass ) {
+ ClassDom oldClass = dynamic_cast<ClassModel*>( m_cachedFromContext.data() );
+ if ( oldClass && oldClass->name() == klass->name() && oldClass->scope() == klass->scope() ) {
+ m_cachedFromContext = klass.data();
+ } else {
+ emptyCache();
+ }
+ } else {
+ emptyCache();
+ }
+ } else if ( m_cachedFromContext->isFunction() ) {
+ FunctionDom function = fileModel.functionAt( nLine, nCol );
+ if ( function ) {
+ FunctionDom oldFunction = dynamic_cast<FunctionModel*>( m_cachedFromContext.data() );
+ if ( oldFunction && oldFunction->name() == function->name() && function->scope() == oldFunction->scope() && oldFunction->argumentList().count() == function->argumentList().count() ) {
+ ArgumentList l1 = oldFunction->argumentList();
+ ArgumentList l2 = function->argumentList();
+ ArgumentList::iterator it = l1.begin();
+ ArgumentList::iterator it2 = l2.begin();
+ bool match = true;
+ while ( it != l1.end() ) {
+ if ( ( *it ) ->type() != ( *it2 ) ->type() ) {
+ match = false;
+ break;
+ }
+ ++it;
+ ++it2;
+ }
+ if ( match ) {
+ m_cachedFromContext = function.data();
+ } else {
+ emptyCache();
+ }
+
+ } else {
+ emptyCache();
+ }
+ } else {
+ emptyCache();
+ }
+ } else {
+ emptyCache();
+ }
+ } else {
+ emptyCache();
+ }
+ }
+ }
+}
+
+enum { T_ACCESS, T_PAREN, T_BRACKET, T_IDE, T_UNKNOWN, T_TEMP };
+
+QString CppCodeCompletion::replaceCppComments( const QString& contents ) {
+ QString text = contents;
+
+ int pos = 0;
+ while ( ( pos = m_cppCodeCommentsRx.search( text, pos ) ) != -1 ) {
+ if ( m_cppCodeCommentsRx.cap( 1 ).startsWith( "//" ) ) {
+ QString before = m_cppCodeCommentsRx.cap( 1 );
+ QString after;
+ after.fill( ' ', before.length() - 5 );
+ after.prepend( "/*" );
+ after.append( "*/" );
+ text.replace( pos, before.length() - 1, after );
+ pos += after.length();
+ } else {
+ pos += m_cppCodeCommentsRx.matchedLength();
+ }
+ }
+ return text;
+}
+
+int CppCodeCompletion::expressionAt( const QString& contents, int index ) {
+ kdDebug( 9007 ) << k_funcinfo << endl;
+
+ /* C++ style comments present issues with finding the expr so I'm
+ matching for them and replacing them with empty C style comments
+ of the same length for purposes of finding the expr. */
+
+ QString text = clearComments( contents );
+
+ int last = T_UNKNOWN;
+ int start = index;
+ --index;
+
+ while ( index > 0 ) {
+ while ( index > 0 && text[ index ].isSpace() ) {
+ --index;
+ }
+
+ QChar ch = text[ index ];
+ QString ch2 = text.mid( index - 1, 2 );
+ if ( ( last != T_IDE ) && ( ch.isLetterOrNumber() || ch == '_' ) ) {
+ while ( index > 0 && ( text[ index ].isLetterOrNumber() || text[ index ] == '_' ) ) {
+ --index;
+ }
+ last = T_IDE;
+ } else if ( last != T_IDE && ch == ')' ) {
+ int count = 0;
+ while ( index > 0 ) {
+ QChar ch = text[ index ];
+ if ( ch == '(' ) {
+ ++count;
+ } else if ( ch == ')' ) {
+ --count;
+ } else if ( count == 0 ) {
+ //index;
+ last = T_PAREN;
+ break;
+ }
+ --index;
+ }
+ } else if ( last != T_IDE && ch == '>' && ch2 != "->" ) {
+ int count = 0;
+ while ( index > 0 ) {
+ QChar ch = text[ index ];
+ if ( ch == '<' ) {
+ ++count;
+ } else if ( ch == '>' ) {
+ --count;
+ } else if ( count == 0 ) {
+ //--index;
+ last = T_TEMP;
+ break;
+ }
+ --index;
+ }
+ } else if ( ch == ']' ) {
+ int count = 0;
+ while ( index > 0 ) {
+ QChar ch = text[ index ];
+ if ( ch == '[' ) {
+ ++count;
+ } else if ( ch == ']' ) {
+ --count;
+ } else if ( count == 0 ) {
+ //--index;
+ last = T_BRACKET;
+ break;
+ }
+ --index;
+ }
+ } else if ( ch == '.' ) {
+ --index;
+ last = T_ACCESS;
+ } else if ( ch2 == "::" ) {
+ index -= 2;
+ last = T_ACCESS;
+ } else if ( ch2 == "->" ) {
+ index -= 2;
+ last = T_ACCESS;
+ } else {
+ if ( start > index ) {
+ ++index;
+ }
+ last = T_UNKNOWN;
+ break;
+ }
+ }
+
+ ///If we're at the first item, the above algorithm cannot be used safely,
+ ///so just determine whether the sign is valid for the beginning of an expression, if it isn't reject it.
+ if ( index == 0 && start > index && !( text[ index ].isLetterOrNumber() || text[ index ] == '_' || text[ index ] == ':' ) ) {
+ ++index;
+ }
+
+ return index;
+}
+
+QStringList CppCodeCompletion::splitExpression( const QString& text ) {
+#define ADD_CURRENT()\
+ if( current.length() ) { l << current; /*kdDebug(9007) << "add word " << current << endl;*/ current = ""; }
+
+ QStringList l;
+ uint index = 0;
+ QString current;
+ while ( index < text.length() ) {
+ QChar ch = text[ index ];
+ QString ch2 = text.mid( index, 2 );
+
+ if ( ch == '.' ) {
+ current += ch;
+ ADD_CURRENT();
+ ++index;
+ } else if ( ch == '(' ) {
+ int count = 0;
+ while ( index < text.length() ) {
+ QChar ch = text[ index ];
+ if ( ch == '(' ) {
+ ++count;
+ } else if ( ch == ')' ) {
+ --count;
+ } else if ( count == 0 ) {
+ break;
+ }
+ current += ch;
+ ++index;
+ }
+ } else if ( ch == '[' ) {
+ int count = 0;
+ while ( index < text.length() ) {
+ QChar ch = text[ index ];
+ if ( ch == '[' ) {
+ ++count;
+ } else if ( ch == ']' ) {
+ --count;
+ } else if ( count == 0 ) {
+ break;
+ }
+ current += ch;
+ ++index;
+ }
+ } else if ( ch2 == "->" ) {
+ current += ch2;
+ ADD_CURRENT();
+ index += 2;
+ } /*else if ( ch2 == "::" )
+ {
+ current += ch2;
+ ADD_CURRENT();
+ index += 2;
+ }*/
+ else {
+ current += text[ index ];
+ ++index;
+ }
+ }
+ ADD_CURRENT();
+ return l;
+}
+
+///Before calling this, a SimpleTypeConfiguration-object should be created, so that the ressources will be freed when that object is destroyed
+EvaluationResult CppCodeCompletion::evaluateExpressionAt( int line, int column , SimpleTypeConfiguration& conf, bool ifUnknownSetType ) {
+ kdDebug( 9007 ) << "CppCodeCompletion::evaluateExpressionAt( " << line << ", " << column << " )" << endl;
+
+ if ( !m_pSupport || !m_activeEditor )
+ return EvaluationResult();
+ if ( line < 0 || line >= ( int ) m_activeEditor->numLines() )
+ return EvaluationResult();
+ if ( column < 0 || column >= m_activeEditor->lineLength( line ) )
+ return EvaluationResult();
+
+ {
+ QString curLine = m_activeEditor->textLine( line );
+
+ ///move column to the last letter of the pointed word
+ while ( column + 1 < ( int ) curLine.length() && isValidIdentifierSign( curLine[ column ] ) && isValidIdentifierSign( curLine[ column + 1 ] ) )
+ column++;
+
+ //if( column > 0 ) column--;
+
+ if ( column >= ( int ) curLine.length() || curLine[ column ].isSpace() )
+ return EvaluationResult();
+
+ QString expr = curLine.left( column + 1 );
+ kdDebug( 9007 ) << "evaluating line \"" << expr.stripWhiteSpace() << "\"" << endl;
+
+ if ( curLine[ column ] == '-' || curLine[ column ] == ';' )
+ --column;
+
+ EvaluationResult type = evaluateExpressionType( line, column + 1, conf, ifUnknownSetType ? addFlag( DefaultEvaluationOptions, DefaultAsTypeExpression ) : DefaultEvaluationOptions );
+
+ kdDebug( 9007 ) << "type: " << type->fullNameChain() << endl;
+
+ return type;
+ }
+}
+
+void CppCodeCompletion::popupAction( int number ) {
+ PopupActions::iterator it = m_popupActions.find( number );
+ if ( it != m_popupActions.end() ) {
+ QString fileName = ( *it ).file == "current_file" ? m_activeFileName : ( *it ).file.operator QString();
+ if( (*it).startLine == -1 ) {
+ //startLine -1 indicates that the file should be added to the include-files
+ m_activeEditor->insertLine( 0, QString("#include \"%1\" /* defines %2 */").arg( fileName ).arg( (*it).name ) );
+ } else {
+ m_pSupport->partController() ->editDocument( fileName, ( *it ).startLine );
+ }
+ } else {
+ kdDebug( 9007 ) << "error" << endl;
+ }
+}
+
+void CppCodeCompletion::popupDefinitionAction( int number ) {
+ PopupActions::iterator it = m_popupDefinitionActions.find( number );
+ if ( it != m_popupDefinitionActions.end() ) {
+ QString fileName = ( *it ).file == "current_file" ? m_activeFileName : ( *it ).file.operator QString();
+ if ( !m_pSupport->switchHeaderImpl( fileName, ( *it ).startLine, ( *it ).startCol ) )
+ m_pSupport->partController() ->editDocument( fileName, ( *it ).startLine );
+ } else {
+ kdDebug( 9007 ) << "error" << endl;
+ }
+}
+
+void CppCodeCompletion::selectItem( ItemDom item ) {
+ Extensions::KDevCodeBrowserFrontend * f = m_pSupport->extension< Extensions::KDevCodeBrowserFrontend > ( "KDevelop/CodeBrowserFrontend" );
+
+ if ( f != 0 ) {
+ ItemDom itemDom( &( *item ) );
+ f->jumpedToItem( itemDom );
+ } else {
+ kdDebug() << "could not find the proper extension" << endl;
+ }
+}
+
+void CppCodeCompletion::popupClassViewAction( int number ) {
+ PopupClassViewActions::iterator it = m_popupClassViewActions.find( number );
+ if ( it != m_popupClassViewActions.end() ) {
+ if ( ( *it ) )
+ selectItem( *it );
+ } else {
+ kdDebug( 9007 ) << "error" << endl;
+ }
+}
+
+void CppCodeCompletion::contextEvaluationMenus ( QPopupMenu *popup, const Context *context, int line, int column ) {
+ clearStatusText();
+ Q_UNUSED(context);
+ if ( !m_pSupport->codeCompletionConfig() ->showEvaluationContextMenu() )
+ return ;
+
+ kdDebug( 9007 ) << "CppCodeCompletion::contextEvaluationMenu()" << endl;
+
+ PopupTracker::print();
+
+ m_popupActions.clear();
+ m_popupDefinitionActions.clear();
+ m_popupClassViewActions.clear();
+
+ if ( !m_pSupport || !m_activeEditor )
+ return ;
+
+ struct SetDbgState {
+ DBGStreamType& st;
+ bool oldState;
+ SetDbgState( DBGStreamType& targ, bool state ) : st( targ ) {
+ oldState = targ.state();
+ targ.setState( state );
+ }
+ ~SetDbgState() {
+ st.setState( oldState );
+ }
+ };
+
+ int cpos = 0;
+
+ SetDbgState stt( dbgState, disableVerboseForContextMenu );
+
+ SimpleTypeConfiguration conf( m_activeFileName );
+
+ EvaluationResult type = evaluateExpressionAt( line, column, conf );
+
+ ///Test if it is a macro
+ if( type.isMacro ) {
+ QPopupMenu * m = PopupTracker::createPopup( popup );
+ int gid;
+ if ( contextMenuEntriesAtTop )
+ gid = popup->insertItem( i18n( "Navigate by Macro \"%1\"" ).arg( cleanForMenu( type.macro.name() ) ), m, 5, cpos++ );
+ else
+ gid = popup->insertItem( i18n( "Navigate by Macro \"%1\"" ).arg( cleanForMenu( type.macro.name() ) ), m );
+
+ int id = m->insertItem( i18n( "Jump to %1" ).arg( cleanForMenu( type.macro.name() ) ), this, SLOT( popupAction( int ) ) );
+ QPopupMenu * b = PopupTracker::createPopup( m );
+ m->insertItem( i18n( "Body" ), b );
+
+ DeclarationInfo i;
+ i.file = type.macro.fileName();
+ i.startCol = type.macro.column();
+ i.startLine = type.macro.line();
+ i.endCol = type.macro.column();
+ i.endLine = type.macro.line();
+ m_popupActions.insert( id, i );
+
+ QStringList ls = prepareTextForMenu( type.macro.body(), 20, 100 );
+ for ( QStringList::iterator it = ls.begin(); it != ls.end(); ++it ) {
+ b->insertItem( *it, 0, SLOT( popupClassViewAction( int ) ) );
+ }
+ }
+
+ ///Test if it is an include-directive
+ QString includeFileName, includeFilePath;
+ bool simpleAlgorithm = false;
+ bool isIncludeDirective = getIncludeInfo( line, includeFileName, includeFilePath, simpleAlgorithm );
+ if( isIncludeDirective ) {
+ ///Add menu entry
+ if( !includeFilePath.isEmpty() ) {
+ int gid;
+ QPopupMenu * m = PopupTracker::createPopup( popup );
+ if ( contextMenuEntriesAtTop )
+ gid = popup->insertItem( i18n( "Goto Include File: %1" ).arg( cleanForMenu( includeFileName ) ), m, 5, cpos++ );
+ else
+ gid = popup->insertItem( i18n( "Goto Include File: %1" ).arg( cleanForMenu( includeFileName ) ), m );
+
+ int id = m->insertItem( i18n( "Jump to %1" ).arg( cleanForMenu( includeFilePath ) ), this, SLOT( popupAction( int ) ) );
+
+ DeclarationInfo i;
+ i.file = includeFilePath;
+ i.startCol = 0;
+ i.startLine = 0;
+ i.endCol = 0;
+ i.endLine = 0;
+ m_popupActions.insert( id, i );
+
+ if( simpleAlgorithm && cppSupport()->codeCompletionConfig()->resolveIncludePaths() ) {
+ //Add a notification that the correct algorithm failed in finding the include-file correctly
+ m->insertItem( i18n( "This include-file could not be located regularly, and was selected from the project file list." ) );
+ }
+ } else {
+ ///Could not find include-file
+ if ( contextMenuEntriesAtTop )
+ popup->insertItem( i18n( "Not Found: \"%1\"" ).arg( includeFileName ), 5, cpos++ );
+ else
+ popup->insertItem( i18n( "Not Found: \"%1\"" ).arg( includeFileName ) );
+ }
+ }
+
+ ///Break if we cannot show additional information
+ if ( isIncludeDirective || (!type->resolved() && !type.sourceVariable && ( !type.resultType.trace() || type.resultType.trace() ->trace().isEmpty() ) && !BuiltinTypes::isBuiltin( type.resultType ) ) )
+ return ;
+
+ QString name = type->fullNameChain();
+ if ( type.sourceVariable )
+ name += " " + type.sourceVariable.name;
+ if ( type.resultType->resolved() && type.resultType->resolved() ->asFunction() )
+ name = buildSignature( type.resultType->resolved() );
+
+ ///Fill the jump-menu
+ {
+ PopupFillerHelpStruct h( this );
+ PopupFiller<PopupFillerHelpStruct> filler( h, "" );
+
+ QPopupMenu * m = PopupTracker::createPopup( popup );
+ int gid;
+ if ( contextMenuEntriesAtTop )
+ gid = popup->insertItem( i18n( "Navigate by \"%1\"" ).arg( cleanForMenu( name ) ), m, 5, cpos++ );
+ else
+ gid = popup->insertItem( i18n( "Navigate by \"%1\"" ).arg( cleanForMenu( name ) ), m );
+
+ popup->setWhatsThis( gid, i18n( "<b>Navigation</b><p>Provides a menu to navigate to positions of items that are involved in this expression" ) );
+
+ /*if( type.sourceVariable && type.sourceVariable.name != "this" ) {
+ int id = m->insertItem( i18n("jump to variable-declaration \"%1\"").arg( type.sourceVariable.name ) , this, SLOT( popupAction( int ) ) );
+
+ m_popupActions.insert( id, type.sourceVariable );
+ }*/
+
+ filler.fill( m, type, "", type.sourceVariable );
+ }
+ if ( type->resolved() ) {
+ ///Now fill the class-view-browsing-stuff
+ {
+ QPopupMenu * m = PopupTracker::createPopup( popup );
+ int gid;
+ if ( contextMenuEntriesAtTop )
+ gid = popup->insertItem( i18n( "Navigate Class-View by \"%1\"" ).arg( cleanForMenu( name ) ), m, 6, cpos++ );
+ else
+ gid = popup->insertItem( i18n( "Navigate Class-View by \"%1\"" ).arg( cleanForMenu( name ) ), m );
+
+ popup->setWhatsThis( gid, i18n( "<b>Navigation</b><p>Provides a menu to show involved items in the class-view " ) );
+
+ PopupClassViewFillerHelpStruct h( this );
+ PopupFiller<PopupClassViewFillerHelpStruct> filler( h, "" );
+
+ filler.fill( m, type );
+ }
+ }
+
+ if ( contextMenuEntriesAtTop )
+ popup->insertSeparator( cpos );
+}
+
+void CppCodeCompletion::slotTextHint( int line, int column, QString &text ) {
+ if ( ! m_pSupport->codeCompletionConfig() ->statusBarTypeEvaluation() )
+ return ;
+
+ kdDebug( 9007 ) << "CppCodeCompletion::slotTextHint()" << endl;
+
+ clearStatusText();
+
+ if ( m_lastHintTime.msecsTo( QTime::currentTime() ) < 300 ) {
+ kdDebug( 9007 ) << "slotNeedTextHint called too often" << endl;
+ return ;
+ }
+
+ m_lastHintTime = QTime::currentTime();
+
+ clearStatusText();
+ text = "";
+ if ( !m_pSupport || !m_activeEditor )
+ return ;
+
+ SimpleTypeConfiguration conf( m_activeFileName );
+
+ EvaluationResult type = evaluateExpressionAt( line, column, conf );
+
+ if ( type.expr.expr().stripWhiteSpace().isEmpty() )
+ return ; ///Expression could not be found
+
+ if ( type.sourceVariable ) {
+ text += type.sourceVariable.toText() + "\n";
+ }
+
+ if ( type->resolved() ) {
+ /*SimpleTypeFunctionInterface* f = type->resolved()->asFunction();
+ if( f ) {
+ text += "function: \"" + buildSignature( type->resolved() ) + "\"";
+ } else {
+ QValueList<TypeDesc> trace = type.resultType->trace();
+ if( !trace.isEmpty() ) {
+ for( QValueList<TypeDesc>::iterator it = trace.begin(); it != trace.end(); ++it ) {
+ text += (*it).fullNameChain() + " --> ";
+ }
+ text += "\n";
+ }
+ text += "type: \"" + type.resultType->fullTypeResolved() + "\"";
+ }
+ if( type.resultType->parent()) text += "\nnested in: \"" + type.resultType->parent()->fullTypeResolvedWithScope() + "\"";
+ DeclarationInfo i = type.resultType->getDeclarationInfo();
+ if( i ) text += "\n" + i.locationToText();
+
+ if( !type.resultType->comment().isEmpty() ) text += "\n\n" + type.resultType->comment() + "";*/
+
+ } else {}
+
+ kdDebug( 9007 ) << "showing: \n" << text << endl;
+ const int timeout = 2000;
+
+ if ( type->resolved() ) {
+ addStatusText( i18n( "Type of \"%1\" is \"%2\"" ).arg( type.expr.expr() ).arg( type->fullNameChain() ), timeout );
+ if ( type.sourceVariable && !type.sourceVariable.comment.isEmpty() ) {
+ addStatusText( i18n( "Comment on variable \"%1\": \"%2\"" ).arg( type.sourceVariable.name ).arg( type.sourceVariable.comment ) , 10000 );
+ }
+ if ( !type->resolved() ->comment().isEmpty() ) {
+ addStatusText( i18n( "Comment on \"%1\": \"%2\"" ).arg( type->name() ).arg( type->resolved() ->comment() ) , 10000 );
+ }
+ if ( type->resolved() ->comment().isEmpty() ) {
+ addStatusText( i18n( "\"%1\" has no comment" ).arg( type->name() ) , timeout );
+ }
+ } else {
+ if ( type ) {
+ if( !BuiltinTypes::isBuiltin( type.resultType ) ) {
+ addStatusText( i18n( "Type of \"%1\" is unresolved, name: \"%2\"" ).arg( type.expr.expr() ).arg( type->fullNameChain() ), 2 * timeout );
+ } else {
+ addStatusText( i18n( "\"%1\" is of builtin type \"%2\", a %3" ).arg( type.expr.expr() ).arg( type->fullNameChain() ).arg(BuiltinTypes::comment( type.resultType )), 2 * timeout );
+ }
+
+
+ } else {
+ addStatusText( i18n( "Type of \"%1\" could not be evaluated: tried to evaluate expression as \"%2\"" ).arg( type.expr.expr() ).arg( type.expr.typeAsString() ), 2 * timeout );
+ }
+ }
+
+ text = ""; ///Don't really use tooltips since those are not implemented in katepart, and don't work right in the qt-designer based part
+}
+
+///not good..
+bool CppCodeCompletion::isTypeExpression( const QString& expr ) {
+ TypeDesc d( expr );
+ if ( !d.isValidType() )
+ return false;
+
+ QString ex = d.fullNameChain();
+ QStringList lex = QStringList::split( " ", ex );
+ QStringList lexpr = QStringList::split( " ", expr );
+ return lex.join( " " ) == lexpr.join( " " );
+}
+
+bool CppCodeCompletion::mayBeTypeTail( int line, int column, QString& append, bool inFunction ) {
+ QString tail = clearComments( m_activeEditor->text( line, column + 1, line + 10 > ( int ) m_activeEditor->numLines() ? ( int ) m_activeEditor->numLines() : line + 10, 0 ) );
+ tail.replace( "\n", " " );
+ SafetyCounter s ( 100 );
+ bool hadSpace = false;
+ while ( !tail.isEmpty() && s ) {
+ if ( tail[ 0 ] == ';' ) {
+ return false;
+ } else if ( ( !inFunction && tail[ 0 ] == ',' ) || tail[ 0 ] == '&' || tail[ 0 ] == '*' || tail[ 0 ] == '{' || tail[ 0 ] == ':' ) {
+ return true;
+ } else if ( isTypeOpenParen( tail[ 0 ] ) ) {
+ ///TODO: use findClose to make the whole expression include template-params
+ int to = findClose( tail, 0 );
+ if ( to != -1 ) {
+ append = tail.left( to + 1 );
+ tail = tail.mid( to + 1 );
+ } else {
+ return false;
+ }
+ } else if ( isTypeCloseParen( tail[ 0 ] ) ) {
+ return true;
+ } else if ( tail[ 0 ].isSpace() ) {
+ tail = tail.mid( 1 );
+ hadSpace = true;
+ } else if ( tail[ 0 ].isLetter() ) {
+ return hadSpace;
+ } else {
+ break;
+ }
+ }
+
+ return false;
+}
+
+bool CppCodeCompletion::canBeTypePrefix( const QString& prefix, bool inFunction ) {
+
+ for ( int p = prefix.length() - 1 ; p >= 0; --p ) {
+ if ( prefix[ p ].isSpace() ) {
+ continue;
+ }
+
+ if ( prefix[ p ] == ';' || prefix[ p ] == '<' || prefix[ p ] == ':' || ( !inFunction && ( prefix[ p ] == '(' || prefix[ p ] == ',' ) ) || prefix[ p ] == '}' || prefix[ p ] == '{' ) {
+ return true;
+ }
+
+ ///@todo: make this a simple regex
+ if ( prefix[ p ].isLetterOrNumber() && ( tokenAt( prefix, "class", p ) || tokenAt( prefix, "struct", p ) || tokenAt( prefix, "const", p ) || tokenAt( prefix, "typedef", p ) || tokenAt( prefix, "public", p ) || tokenAt( prefix, "protected", p ) || tokenAt( prefix, "private", p ) || tokenAt( prefix, "virtual", p ) || tokenAt( prefix, "static", p ) || tokenAt( prefix, "virtual", p ) ) )
+ return true;
+ else {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+///This function is just a litte hack und should be remade, it doesn't work for all cases
+ExpressionInfo CppCodeCompletion::findExpressionAt( int line, int column, int startLine, int startCol, bool inFunction ) {
+ ExpressionInfo ret;
+
+ QString contents = clearComments( getText( startLine, startCol, line, column ) );
+
+
+ int start_expr = expressionAt( contents, contents.length() );
+
+ if ( start_expr != int( contents.length() ) ) {
+ QString str = contents.mid( start_expr, contents.length() - start_expr ).stripWhiteSpace();
+ if ( str.startsWith( "new " ) ) {
+ str = str.mid( 4 ).stripWhiteSpace();
+ }
+ ret.setExpr( str );
+ if ( !ret.expr().isEmpty() )
+ ret.t = ExpressionInfo::NormalExpression;
+ }
+
+ if ( ret ) {
+ ///Check whether it may be a type-expression
+ bool mayBeType = true;
+ QString append;
+ if ( !mayBeTypeTail( line, column - 1, append, inFunction ) )
+ mayBeType = false;
+ if ( mayBeType ) {
+ if ( !canBeTypePrefix( contents.left( start_expr ), inFunction ) )
+ mayBeType = false;
+ }
+
+ //make this a regexp
+ QString e = ret.expr();
+ if ( e.contains( "." ) || e.contains( "->" ) || e.contains( "(" ) || e.contains( ")" ) || e.contains( "=" ) || e.contains( "-" ) )
+ mayBeType = false;
+
+ if ( mayBeType ) {
+ ret.setExpr( ret.expr() + append );
+ ret.t = ExpressionInfo::TypeExpression;
+ }
+ }
+
+ return ret;
+}
+
+void macrosToDriver( Driver& d, FileDom file ) {
+ return; //Deactivate this for now, because macros can cause inconsistency of line/column-numbers between processed text and the not-processed text of the buffer
+ ParseResultPointer p;
+ if( file )
+ p = file->parseResult();
+ ParsedFile* pf = dynamic_cast<ParsedFile*>( p.data() );
+ if( pf ) {
+ d.insertMacros( pf->usedMacros() ); ///Add macros
+ }
+}
+
+SimpleContext* CppCodeCompletion::computeFunctionContext( FunctionDom f, int line, int col, SimpleTypeConfiguration& conf ) {
+ Q_UNUSED(conf);
+ if ( !f )
+ return 0;
+ int modelStartLine, modelStartColumn;
+ int modelEndLine, modelEndColumn;
+
+ f->getStartPosition( &modelStartLine, &modelStartColumn );
+ f->getEndPosition( &modelEndLine, &modelEndColumn );
+
+ QString textLine = m_activeEditor->textLine( modelStartLine );
+ kdDebug( 9007 ) << "startLine = " << textLine << endl;
+
+ QString contents = getText( modelStartLine, modelStartColumn, line, col );
+
+ Driver d;
+ Lexer lexer( &d );
+ macrosToDriver( d, f->file() );
+
+ lexer.setSource( contents );
+ Parser parser( &d, &lexer );
+
+ DeclarationAST::Node recoveredDecl;
+ RecoveryPoint* recoveryPoint = this->d->findRecoveryPoint( line, col );///@todo recovery-points are not needed anymore
+
+ parser.parseDeclaration( recoveredDecl );
+ if ( recoveredDecl.get() ) {
+ bool isFunDef = recoveredDecl->nodeType() == NodeType_FunctionDefinition;
+ kdDebug( 9007 ) << "is function definition= " << isFunDef << endl;
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+ recoveredDecl->getStartPosition( &startLine, &startColumn );
+ recoveredDecl->getEndPosition( &endLine, &endColumn );
+ /*if( startLine != modelStartLine || endLine != modelEndLine || startColumn != modelStartColumn || endColumn != modelEndColumn ) {
+ kdDebug( 9007 ) << "code-model and real file are out of sync \nfunction-bounds in code-model: " << endl;
+ kdDebug( 9007 ) << "(l " << modelStartLine << ", c " << modelStartColumn << ") - (l " << modelEndLine << ", c " << modelEndColumn << ") " << "parsed function-bounds: " << endl;
+ kdDebug( 9007 ) << "(l " << startLine << ", c " << startColumn << ") - (l " << endLine << ", c " << endColumn << ") " << endl;
+ }*/
+
+ if ( isFunDef ) {
+ FunctionDefinitionAST * def = static_cast<FunctionDefinitionAST*>( recoveredDecl.get() );
+
+ SimpleContext* ctx = computeContext( def, endLine, endColumn, modelStartLine, modelStartColumn );
+ if ( !ctx )
+ return 0;
+
+ QStringList scope = f->scope();
+
+
+ if ( !scope.isEmpty() ) {
+ SimpleType parentType;
+ /* if( !m_cachedFromContext ) {
+ TypePointer t = SimpleType(QStringList())->locateDecType( scope.join("") ).desc().resolved();;
+ if( t )
+ parentType = SimpleType( t.data() );
+ else
+ parentType = SimpleType( scope );
+ } else {*/
+ parentType = SimpleType( scope, getIncludeFiles() );
+ //}
+ parentType->descForEdit().setTotalPointerDepth( 1 );
+ ctx->setContainer( parentType );
+ }
+
+ SimpleType global = ctx->global();
+
+ if( dynamic_cast<SimpleTypeNamespace*>( &(*global) ) ) {
+ SimpleTypeNamespace* globalNs = static_cast <SimpleTypeNamespace*>( &(*global) );
+ QValueList<QPair<QString, QString> > localImports = ctx->imports();
+ for( QValueList<QPair<QString, QString> >::const_iterator it = localImports.begin(); it != localImports.end(); ++it )
+ globalNs->addAliasMap( (*it).first, (*it).second );
+ }
+
+ /* //Should not be necessary any more
+ if( !getParsedFile( f->file().data() ) || getParsedFile( f->file().data() )->includeFiles().size() <= 1 ) {
+ if ( !m_cachedFromContext ) {
+ conf.setGlobalNamespace( &( *global ) );
+ if ( recoveryPoint ) {
+ recoveryPoint->registerImports( global, m_pSupport->codeCompletionConfig() ->namespaceAliases() );
+ } else {
+ kdDebug( 9007 ) << "no recovery-point, cannot use imports" << endl;
+ }
+ }
+ }*/
+
+ ///Insert the "this"-type(container) and correctly resolve it using imported namespaces
+ if ( ctx->container() ) {
+ if ( !m_cachedFromContext ) {
+ TypeDesc td = ctx->container() ->desc();
+ td.setIncludeFiles( getIncludeFiles() );
+ td.makePrivate();
+
+ td.resetResolved( );
+ TypePointer tt = ctx->container() ->locateDecType( td, SimpleTypeImpl::LocateBase ) ->resolved();
+ if ( tt ) {
+ ctx->setContainer( SimpleType( tt ) );
+ } else {
+ kdDebug( 9007 ) << "could not resolve local this-type \"" << td.fullNameChain() << "\"" << endl;
+ }
+ }
+
+ SimpleType this_type = ctx->container();
+
+ this_type->descForEdit().setTotalPointerDepth( 1 );
+
+ SimpleVariable var;
+ var.type = this_type->desc();
+ var.name = "this";
+ var.comment = this_type->comment();
+ ctx->add
+ ( var );
+ ctx->setContainer( this_type );
+ }
+
+ return ctx;
+ } else {
+ kdDebug( 9007 ) << "computeFunctionContext: context is no function-definition" << endl;
+ }
+ } else {
+ kdDebug( 9007 ) << "computeFunctionContext: could not find a valid declaration to recover" << endl;
+ }
+ return 0;
+}
+
+bool CppCodeCompletion::functionContains( FunctionDom f , int line, int col ) {
+ if ( !f )
+ return false;
+ int sl, sc, el, ec;
+ f->getStartPosition( &sl, &sc );
+ f->getEndPosition( &el, &ec );
+ QString t = clearComments( getText( sl, sc, el, ec ) );
+ if ( t.isEmpty() )
+ return false;
+
+ //int i = t.find( '{' );
+ int i = t.find( '(' ); //This now includes the argument-list
+ if ( i == -1 )
+ return false;
+ int lineCols = 0;
+ for ( int a = 0; a < i; a++ ) {
+ if ( t[ a ] == '\n' ) {
+ sl++;
+ lineCols = 0;
+ } else {
+ lineCols++;
+ }
+ }
+
+ sc += lineCols;
+
+ return ( line > sl || ( line == sl && col >= sc ) ) && ( line < el || ( line == el && col < ec ) );
+}
+
+void CppCodeCompletion::getFunctionBody( FunctionDom f , int& line, int& col ) {
+ if ( !f )
+ return;
+ int sl, sc, el, ec;
+ f->getStartPosition( &sl, &sc );
+ f->getEndPosition( &el, &ec );
+ QString t = clearComments( getText( sl, sc, el, ec ) );
+ if ( t.isEmpty() )
+ return;
+
+ int i = t.find( '{' );
+ if ( i == -1 )
+ return;
+ i++;
+ if( (uint)i >= t.length() )
+ return;
+ int lineCols = 0;
+ for ( int a = 0; a < i; a++ ) {
+ if ( t[ a ] == '\n' ) {
+ sl++;
+ lineCols = 0;
+ } else {
+ lineCols++;
+ }
+ }
+
+ sc += lineCols;
+
+ line = sl;
+ col = sc;
+}
+
+void CppCodeCompletion::emptyCache() {
+ m_cachedFromContext = 0;
+ SimpleTypeConfiguration c; ///Will automatically destroy the type-store when the function is closed
+ kdDebug( 9007 ) << "completion-cache emptied" << endl;
+}
+
+void CppCodeCompletion::needRecoveryPoints() {
+
+ if ( this->d->recoveryPoints.isEmpty() ) {
+ kdDebug( 9007 ) << "missing recovery-points for file " << m_activeFileName << " they have to be computed now" << endl;
+ m_pSupport->backgroundParser() ->lock ()
+ ;
+
+ std::vector<CppCodeCompletion> vec;
+
+ TranslationUnitAST * ast = *m_pSupport->backgroundParser() ->translationUnit( m_activeFileName );
+ m_pSupport->backgroundParser() ->unlock();
+ if ( !ast ) {
+ kdDebug( 9007 ) << "background-parser is missing the translation-unit. The file needs to be reparsed." << endl;
+ m_pSupport->parseFileAndDependencies( m_activeFileName, true );
+// m_pSupport->mainWindow() ->statusBar() ->message( i18n( "Background-parser is missing the necessary translation-unit. It will be computed, but this completion will fail." ).arg( m_activeFileName ), 2000 );
+ return;
+ } else {
+ computeRecoveryPointsLocked();
+ }
+ if ( this->d->recoveryPoints.isEmpty() ) {
+ kdDebug( 9007 ) << "Failed to compute recovery-points for " << m_activeFileName << endl;
+// m_pSupport->mainWindow() ->statusBar() ->message( i18n( "Failed to compute recovery-points for %1" ).arg( m_activeFileName ), 1000 );
+ } else {
+ kdDebug( 9007 ) << "successfully computed recovery-points for " << m_activeFileName << endl;
+ }
+ }
+}
+
+EvaluationResult CppCodeCompletion::evaluateExpressionType( int line, int column, SimpleTypeConfiguration& conf, EvaluateExpressionOptions opt ) {
+ EvaluationResult ret;
+ safetyCounter.init();
+
+ FileDom file = m_pSupport->codeModel() ->fileByName( m_activeFileName );
+
+ if ( !file ) {
+// m_pSupport->mainWindow() ->statusBar() ->message( i18n( "File %1 does not exist in the code-model" ).arg( m_activeFileName ), 1000 );
+ kdDebug( 9007 ) << "Error: file " << m_activeFileName << " could not be located in the code-model, code-completion stopped\n";
+ return SimpleType();
+ }
+
+ needRecoveryPoints();
+
+ CodeModelUtils::CodeModelHelper fileModel( m_pSupport->codeModel(), file );
+ ItemDom contextItem;
+
+ int nLine = line, nCol = column;
+
+ // emptyCache();
+ fitContextItem( line, column );
+
+ QString strCurLine = m_activeEditor->textLine( nLine );
+
+ QString ch = strCurLine.mid( nCol - 1, 1 );
+ QString ch2 = strCurLine.mid( nCol - 2, 2 );
+
+ while ( ch[ 0 ].isSpace() && nCol >= 3 ) {
+ nCol -= 1;
+ ch = strCurLine.mid( nCol - 1, 1 );
+ ch2 = strCurLine.mid( nCol - 2, 2 );
+ }
+
+ if ( ch2 == "->" || ch == "." || ch == "(" ) {
+ int pos = ch2 == "->" ? nCol - 3 : nCol - 2;
+ QChar c = strCurLine[ pos ];
+ while ( pos > 0 && c.isSpace() )
+ c = strCurLine[ --pos ];
+
+ if ( !( c.isLetterOrNumber() || c == '_' || c == ')' || c == ']' || c == '>' ) ) {
+ conf.invalidate();
+ return SimpleType();
+ }
+ }
+ bool showArguments = false;
+
+ if ( ch == "(" ) {
+ --nCol;
+ while ( nCol > 0 && strCurLine[ nCol ].isSpace() )
+ --nCol;
+ showArguments = true;
+ }
+
+ QString word;
+
+ {
+ ExpressionInfo exp_ = findExpressionAt( line, column , line, 0 );
+
+ if( file->parseResult() ) {
+ ParsedFilePointer p = dynamic_cast<ParsedFile*>( file->parseResult().data());
+ if( p ) {
+ if( p->usedMacros().hasMacro( exp_.expr() ) ) {
+ //It is a macro, return it
+ ret.expr = exp_.expr();
+ ret.isMacro = true;
+ ret.macro = p->usedMacros().macro( exp_.expr() );
+ return ret;
+ }
+ }
+ }
+ }
+
+ if ( !m_cachedFromContext )
+ conf.setGlobalNamespace( createGlobalNamespace() );
+
+ ItemLocker<BackgroundParser> block( *m_pSupport->backgroundParser() );
+
+ FunctionDom currentFunction = fileModel.functionAt( line, column );
+
+ bool functionFailed = true;
+
+ if ( opt & SearchInFunctions ) {
+ //currentFunction = fileModel.functionAt( line, column );
+
+ if ( currentFunction && functionContains( currentFunction, line, column ) ) {
+ ///Evaluate the context of the function-body if we're in the argument-list
+ int realLine = line, realColumn = column;
+ getFunctionBody( currentFunction, realLine, realColumn );
+ if( realLine < line || ( realLine == line && realColumn < column ) ) {
+ realLine = line;
+ realColumn = column;
+ }
+
+ SimpleContext * ctx = computeFunctionContext( currentFunction, realLine, realColumn, conf );
+ contextItem = currentFunction.data();
+
+ if ( ctx ) {
+ opt = remFlag( opt, SearchInClasses );
+ int startLine, endLine;
+ currentFunction->getStartPosition( &startLine, &endLine );
+ ExpressionInfo exp = findExpressionAt( line, column , startLine, endLine, true );
+ if ( ( opt & DefaultAsTypeExpression ) && ( !exp.canBeNormalExpression() && !exp.canBeTypeExpression() ) && !exp.expr().isEmpty() )
+ exp.t = ExpressionInfo::TypeExpression;
+
+ if ( exp.canBeTypeExpression() ) {
+ {
+ if ( ! ( opt & IncludeTypeExpression ) ) {
+ kdDebug( 9007 ) << "recognized a type-expression, but another expression-type is desired" << endl;
+ } else {
+ TypeDesc d( exp.expr() );
+ d.setIncludeFiles( getIncludeFiles() );
+ ret.resultType = ctx->container() ->locateDecType( d );
+ ret.expr = exp;
+ }
+ }
+ }
+ if ( /*exp.canBeNormalExpression() &&*/ !ret.resultType->resolved() ) { ///It is not cleary possible to recognize the kind of an expression from the syntax as long as it's not written completely
+ {
+ if ( ! ( opt & IncludeStandardExpressions ) ) {
+ kdDebug( 9007 ) << "recognized a standard-expression, but another expression-type is desired" << endl;
+ } else {
+ ///Remove the not completely typed last word while normal completion
+ if ( !showArguments && ( opt & CompletionOption ) ) {
+ QString e = exp.expr();
+ int idx = e.length() - 1;
+ while ( e[ idx ].isLetterOrNumber() || e[ idx ] == '_' )
+ --idx;
+
+ if ( idx != int( e.length() ) - 1 ) {
+ ++idx;
+ word = e.mid( idx ).stripWhiteSpace();
+ exp.setExpr( e.left( idx ).stripWhiteSpace() );
+ }
+ }
+
+ functionFailed = false;
+ ret = evaluateExpression( exp, ctx );
+ }
+ }
+ }
+ } else {
+ kdDebug( 9007 ) << "could not compute context" << endl;
+ }
+ if ( ctx )
+ delete ctx;
+ } else {
+ kdDebug( 9007 ) << "could not find context-function in code-model" << endl;
+ }
+ }
+
+ if ( ( opt & SearchInClasses ) && !ret->resolved() && functionFailed ) {
+ ClassDom currentClass = fileModel.classAt( line, column );
+ int startLine = 0, startCol = 0;
+
+ RecoveryPoint* recoveryPoint = this->d->findRecoveryPoint( line, column );
+
+ QStringList scope;
+
+ if ( !currentClass ) {
+ kdDebug( 9007 ) << "no container-class found" << endl;
+ if ( !recoveryPoint ) {
+ kdDebug( 9007 ) << "no recovery-point found" << endl;
+ } else {
+ startLine = recoveryPoint->startLine;
+ startCol = recoveryPoint->startColumn;
+ scope = recoveryPoint->scope;
+ }
+ } else {
+ contextItem = currentClass.data();
+ scope = currentClass->scope();
+ scope << currentClass->name();
+ currentClass->getStartPosition( &startLine, &startCol );
+ }
+
+ SimpleType container;
+ if ( m_cachedFromContext ) {
+ TypeDesc d( scope.join( "::" ) );
+ d.setIncludeFiles( getIncludeFiles() );
+ SimpleTypeImpl * i = SimpleType( QStringList(), getIncludeFiles() ) ->locateDecType( d ).desc().resolved().data();
+ if ( i )
+ container = i;
+ else
+ container = SimpleType( scope, getIncludeFiles() );
+ } else {
+ container = SimpleType( scope, getIncludeFiles() );
+ }
+
+ ExpressionInfo exp = findExpressionAt( line, column , startLine, startCol );
+ exp.t = ExpressionInfo::TypeExpression; ///Outside of functions, we can only handle type-expressions
+ ret.expr = exp;
+
+ if ( exp && ( exp.t & ExpressionInfo::TypeExpression ) ) {
+ kdDebug( 9007 ) << "locating \"" << exp.expr() << "\" in " << container->fullTypeResolvedWithScope() << endl;
+ TypeDesc d( exp.expr() );
+ d.setIncludeFiles( getIncludeFiles() );
+ ret.resultType = container->locateDecType( d );
+ } else {
+ if ( exp ) {
+ kdDebug( 9007 ) << "wrong expression-type recognized" << endl;
+ } else {
+ kdDebug( 9007 ) << "expression could not be recognized" << endl;
+ }
+ }
+ }
+
+ CppCodeCompletionConfig * cfg = m_pSupport->codeCompletionConfig();
+ if( cfg->usePermanentCaching() && contextItem ) {
+ conf.invalidate();
+ m_cachedFromContext = contextItem;
+ }
+
+ return ret;
+}
+
+bool isAfterKeyword( const QString& str, int column ) {
+ QStringList keywords;
+ keywords << "new";
+ keywords << "throw";
+ keywords << "return";
+ keywords << "emit"; ///This could be done even better by only showing signals for completion..
+ for ( QStringList::iterator it = keywords.begin(); it != keywords.end(); ++it ) {
+ int len = ( *it ).length();
+ if ( column >= len && str.mid( column - len, len ) == *it )
+ return true;
+ }
+ return false;
+}
+
+void CppCodeCompletion::setMaxComments( int count ) {
+ m_maxComments = count;
+}
+
+///TODO: make this use findExpressionAt etc. (like the other expression-evaluation-stuff)
+void CppCodeCompletion::completeText( bool invokedOnDemand /*= false*/ ) {
+ kdDebug( 9007 ) << "CppCodeCompletion::completeText()" << endl;
+ clearStatusText();
+
+ if ( !m_pSupport || !m_activeCursor || !m_activeEditor || !m_activeCompletion )
+ return ;
+
+ setMaxComments( 1000 );
+
+ needRecoveryPoints();
+
+ CppCodeCompletionConfig * cfg = m_pSupport->codeCompletionConfig();
+ m_demandCompletion = invokedOnDemand;
+
+ FileDom file = m_pSupport->codeModel() ->fileByName( m_activeFileName );
+
+ if ( !file ) {
+// m_pSupport->mainWindow() ->statusBar() ->message( i18n( "File %1 does not exist in the code-model" ).arg( m_activeFileName ), 1000 );
+ kdDebug( 9007 ) << "Error: file " << m_activeFileName << " could not be located in the code-model, code-completion stopped\n";
+ return ;
+ }
+
+ CodeModelUtils::CodeModelHelper fileModel( m_pSupport->codeModel(), file );
+
+ ItemDom contextItem;
+
+ unsigned int line, column;
+ m_activeCursor->cursorPositionReal( &line, &column );
+
+ fitContextItem( line, column );
+
+ ///Check whether the cursor is within a comment
+ int surroundingStartLine = line - 10, surroundingEndLine = line + 10;
+ if ( surroundingStartLine < 0 )
+ surroundingStartLine = 0;
+ if ( surroundingEndLine > m_activeEditor->numLines() - 1 )
+ surroundingEndLine = m_activeEditor->numLines() - 1;
+ int surroundingEndCol = m_activeEditor->lineLength( surroundingEndLine );
+
+ QString pre = getText( surroundingStartLine, 0, line, column );
+ int pos = pre.length();
+ pre += getText( line, column, surroundingEndLine, surroundingEndCol );
+ QString cleared = clearComments( pre );
+ if ( cleared[ pos ] != pre[ pos ] ) {
+ kdDebug( 9007 ) << "stopping completion because we're in a coment" << endl;
+ return ;
+ }
+
+ int nLine = line, nCol = column;
+
+ QString strCurLine = clearComments( m_activeEditor->textLine( nLine ) );
+
+ QString ch = strCurLine.mid( nCol - 1, 1 );
+ QString ch2 = strCurLine.mid( nCol - 2, 2 );
+
+ while ( ch[ 0 ].isSpace() && nCol >= 3 ) {
+ nCol -= 1;
+ ch = strCurLine.mid( nCol - 1, 1 );
+ ch2 = strCurLine.mid( nCol - 2, 2 );
+ }
+
+ if ( m_includeRx.search( strCurLine ) != -1 ) {
+ if ( !m_fileEntryList.isEmpty() ) {
+ m_bCompletionBoxShow = true;
+ m_activeCompletion->showCompletionBox( m_fileEntryList, column - m_includeRx.matchedLength() );
+ }
+ return ;
+ }
+
+ bool showArguments = false;
+ bool isInstance = true;
+ m_completionMode = NormalCompletion;
+
+ if ( ch2 == "->" || ch == "." || ch == "(" ) {
+ int pos = ch2 == "->" ? nCol - 3 : nCol - 2;
+ QChar c = strCurLine[ pos ];
+ while ( pos > 0 && c.isSpace() )
+ c = strCurLine[ --pos ];
+
+ if ( !( c.isLetterOrNumber() || c == '_' || c == ')' || c == ']' || c == '>' ) )
+ return ;
+ }
+
+ if ( ch == "(" ) {
+ --nCol;
+ while ( nCol > 0 && strCurLine[ nCol - 1 ].isSpace() )
+ --nCol;
+
+ ///check whether it is a value-definition using constructor
+ int column = nCol;
+ bool s1 = false, s2 = false;
+ while ( column > 0 && isValidIdentifierSign( strCurLine[ column - 1 ] ) ) {
+ column--;
+ s1 = true;
+ }
+
+ ///skip white space
+ while ( column > 0 && strCurLine[ column - 1 ].isSpace() ) {
+ --column;
+ s2 = true;
+ }
+
+ if ( s1 && s2 && isValidIdentifierSign( strCurLine[ column - 1 ] ) ) {
+ if ( isAfterKeyword( strCurLine, column ) ) {
+ ///Maybe a constructor using "new", or "throw", "return", ...
+ } else {
+ ///it is a local constructor like "QString name("David");"
+ nCol = column;
+ }
+ }
+
+
+
+ showArguments = TRUE;
+ }
+
+ EvaluationResult type;
+ SimpleType this_type;
+ QString expr, word;
+
+ DeclarationAST::Node recoveredDecl;
+ TypeSpecifierAST::Node recoveredTypeSpec;
+
+ SimpleContext* ctx = 0;
+ SimpleTypeConfiguration conf( m_activeFileName );
+
+ if ( !m_cachedFromContext )
+ conf.setGlobalNamespace( createGlobalNamespace() );
+
+ ItemLocker<BackgroundParser> block( *m_pSupport->backgroundParser() );
+
+ FunctionDom currentFunction = fileModel.functionAt( line, column );
+
+ RecoveryPoint * recoveryPoint = d->findRecoveryPoint( line, column );
+ if ( recoveryPoint || currentFunction ) {
+ contextItem = currentFunction.data();
+ QStringList scope;
+
+ int startLine, startColumn;
+ if ( currentFunction ) { ///maybe change the priority of these
+ kdDebug( 9007 ) << "using code-model for completion" << endl;
+ currentFunction->getStartPosition( &startLine, &startColumn );
+ scope = currentFunction->scope();
+ } else {
+ kdDebug( 9007 ) << "recovery-point, node-kind = " << nodeTypeToString( recoveryPoint->kind ) << endl;
+ startLine = recoveryPoint->startLine;
+ startColumn = recoveryPoint->startColumn;
+ scope = recoveryPoint->scope;
+ }
+
+ QString textLine = m_activeEditor->textLine( startLine );
+ kdDebug( 9007 ) << "startLine = " << textLine << endl;
+
+ if ( currentFunction || recoveryPoint->kind == NodeType_FunctionDefinition ) {
+
+ QString textToReparse = clearComments( getText( startLine, startColumn, line, showArguments ? nCol : column ) );
+
+ kdDebug( 9007 ) << "-------------> reparse text" << endl << textToReparse << endl
+ << "--------------------------------------------" << endl;
+
+ Driver d;
+ Lexer lexer( &d );
+
+ macrosToDriver( d, file );
+
+ lexer.setSource( textToReparse );
+ Parser parser( &d, &lexer );
+
+ parser.parseDeclaration( recoveredDecl );
+ /* kdDebug(9007) << "recoveredDecl = " << recoveredDecl.get() << endl;*/
+ if ( recoveredDecl.get() ) {
+
+ bool isFunDef = recoveredDecl->nodeType() == NodeType_FunctionDefinition;
+ kdDebug( 9007 ) << "is function definition= " << isFunDef << endl;
+
+ int endLine, endColumn;
+ recoveredDecl->getEndPosition( &endLine, &endColumn );
+ kdDebug( 9007 ) << "endLine = " << endLine << ", endColumn " << endColumn << endl;
+
+ /// @todo check end position
+
+ if ( isFunDef ) {
+ FunctionDefinitionAST * def = static_cast<FunctionDefinitionAST*>( recoveredDecl.get() );
+
+ /// @todo remove code duplication
+
+ QString contents = textToReparse;
+ int start_expr = expressionAt( contents, contents.length() );
+
+ // kdDebug(9007) << "start_expr = " << start_expr << endl;
+ if ( start_expr != int( contents.length() ) )
+ expr = contents.mid( start_expr, contents.length() - start_expr ).stripWhiteSpace();
+
+ if ( expr.startsWith( "SIGNAL" ) || expr.startsWith( "SLOT" ) ) {
+ m_completionMode = expr.startsWith( "SIGNAL" ) ? SignalCompletion : SlotCompletion;
+
+ showArguments = false;
+ int end_expr = start_expr - 1;
+ while ( end_expr > 0 && contents[ end_expr ].isSpace() )
+ --end_expr;
+
+ if ( contents[ end_expr ] != ',' ) {
+ expr = QString::null;
+ } else {
+ start_expr = expressionAt( contents, end_expr );
+ expr = contents.mid( start_expr, end_expr - start_expr ).stripWhiteSpace();
+ }
+ } else {
+ if ( !showArguments ) {
+ int idx = expr.length() - 1;
+ while ( expr[ idx ].isLetterOrNumber() || expr[ idx ] == '_' )
+ --idx;
+
+ if ( idx != int( expr.length() ) - 1 ) {
+ ++idx;
+ word = expr.mid( idx ).stripWhiteSpace();
+ expr = expr.left( idx ).stripWhiteSpace();
+ }
+ }
+ }
+
+ ctx = computeContext( def, endLine, endColumn, startLine, startColumn );
+ DeclaratorAST* d = def->initDeclarator() ->declarator();
+ NameAST* name = d->declaratorId();
+
+ QStringList nested;
+
+ QPtrList<ClassOrNamespaceNameAST> l;
+ if ( name ) {
+ l = name->classOrNamespaceNameList();
+ }
+ // QPtrList<ClassOrNamespaceNameAST> l = name->classOrNamespaceNameList();
+ QPtrListIterator<ClassOrNamespaceNameAST> nameIt( l );
+ while ( nameIt.current() ) {
+ if ( nameIt.current() ->name() ) {
+ nested << nameIt.current() ->name() ->text();
+ }
+ ++nameIt;
+ }
+
+ if ( currentFunction ) {
+ scope = currentFunction->scope();
+ if ( !scope.isEmpty() ) {
+ //scope.pop_back();
+ } else {
+ kdDebug( 9007 ) << "scope is empty" << endl;
+ }
+ if( dynamic_cast<SimpleTypeNamespace*>( SimpleType::globalNamespace().data() ) ) {
+ SimpleTypeNamespace* globalNs = static_cast <SimpleTypeNamespace*>( SimpleType::globalNamespace().data() );
+ QValueList<QPair<QString, QString> > localImports = ctx->imports();
+ for( QValueList<QPair<QString, QString> >::const_iterator it = localImports.begin(); it != localImports.end(); ++it )
+ globalNs->addAliasMap( (*it).first, (*it).second );
+ }
+ } else {
+ scope += nested;
+ }
+
+ if ( !scope.isEmpty() ) {
+ SimpleType parentType;
+
+ /*if( !m_cachedFromContext ) {
+ TypePointer t = createGlobalNamespace();
+ conf.setGlobalNamespace( t );
+ SimpleTypeNamespace * n = dynamic_cast<SimpleTypeNamespace*>( t.data() );
+ if ( !n ) {
+ QString str = QString( "the global namespace was not resolved correctly , real type: " ) + typeid( n ).name() + QString( " name: " ) + n->scope().join( "::" ) + " scope-size: " + n->scope().count();
+ kdDebug( 9007 ) << str << endl;
+ m_pSupport->mainWindow() ->statusBar() ->message( str , 1000 );
+ } else {
+ }
+ this_type = SimpleType(t);
+ }*/
+
+ if ( m_cachedFromContext ) {
+ TypeDesc d( scope.join( "::" ) );
+ d.setIncludeFiles( getIncludeFiles() );
+ SimpleTypeImpl * i = SimpleType( QStringList(), getIncludeFiles() ) ->locateDecType( d ).desc().resolved().data();
+ if ( i ) {
+ parentType = i;
+ } else {
+ parentType = SimpleType( scope, getIncludeFiles() );
+ }
+ } else {
+ parentType = SimpleType( scope, getIncludeFiles() );
+ }
+ this_type = parentType;
+ this_type->descForEdit().setTotalPointerDepth( 1 );
+ ctx->setContainer( this_type );
+ }
+
+ ///Now locate the local type using the imported namespaces
+ if ( !scope.isEmpty() ) {
+ if ( !m_cachedFromContext ) {
+ TypeDesc td = ctx->container() ->desc();
+ td.makePrivate();
+ td.resetResolved( );
+ td.setIncludeFiles( getIncludeFiles() );
+ TypePointer tt = ctx->container() ->locateDecType( td, SimpleTypeImpl::LocateBase ) ->resolved();
+ if ( tt ) {
+ ctx->setContainer( SimpleType( tt ) );
+ } else {
+ kdDebug( 9007 ) << "could not resolve local this-type \"" << td.fullNameChain() << "\"" << endl;
+ }
+ }
+
+ SimpleType this_type = ctx->container();
+
+ this_type->descForEdit().setTotalPointerDepth( 1 );
+
+ SimpleVariable var;
+ var.type = this_type->desc();
+ var.name = "this";
+ var.comment = this_type->comment();
+ ctx->add
+ ( var );
+ ctx->setContainer( this_type );
+ }
+
+ ExpressionInfo exp( expr );
+ exp.t = ( ExpressionInfo::Type ) ( ExpressionInfo::NormalExpression | ExpressionInfo::TypeExpression );
+ type = evaluateExpression( exp, ctx );
+ }
+
+ } else {
+ kdDebug( 9007 ) << "no valid declaration to recover!!!" << endl;
+ }
+ } else if ( recoveryPoint->kind == NodeType_ClassSpecifier ) {
+ QString textToReparse = getText( recoveryPoint->startLine, recoveryPoint->startColumn,
+ recoveryPoint->endLine, recoveryPoint->endColumn, line );
+ // kdDebug(9007) << "-------------> please reparse only text" << endl << textToReparse << endl
+ // << "--------------------------------------------" << endl;
+
+ Driver d;
+ Lexer lexer( &d );
+ macrosToDriver( d, file );
+
+ lexer.setSource( textToReparse );
+ Parser parser( &d, &lexer );
+
+ parser.parseClassSpecifier( recoveredTypeSpec );
+ /* kdDebug(9007) << "recoveredDecl = " << recoveredTypeSpec.get() << endl;*/
+ if ( recoveredTypeSpec.get() ) {
+
+ //ClassSpecifierAST * clazz = static_cast<ClassSpecifierAST*>( recoveredTypeSpec.get() );
+
+ QString keyword = getText( line, 0, line, column ).simplifyWhiteSpace();
+
+ kdDebug( 9007 ) << "===========================> keyword is: " << keyword << endl;
+
+ if ( keyword == "virtual" ) { /*
+ BaseClauseAST *baseClause = clazz->baseClause();
+ if ( baseClause )
+ {
+ QPtrList<BaseSpecifierAST> baseList = baseClause->baseSpecifierList();
+ QPtrList<BaseSpecifierAST>::iterator it = baseList.begin();
+
+ for ( ; it != baseList.end(); ++it )
+ type.append( ( *it )->name()->text() );
+
+ ctx = new SimpleContext();
+
+ showArguments = false;
+ m_completionMode = VirtualDeclCompletion;
+
+ kdDebug(9007) << "------> found virtual keyword for class specifier '"
+ << clazz->text() << "'" << endl;
+ }*/
+ } else if ( QString( "virtual" ).find( keyword ) != -1 )
+ m_blockForKeyword = true;
+ else
+ m_blockForKeyword = false;
+ }
+ }
+ }
+
+ ///@todo is all this necessary?
+ if ( !recoveredDecl.get() && !recoveredTypeSpec.get() ) {
+ TranslationUnitAST * ast = *m_pSupport->backgroundParser() ->translationUnit( m_activeFileName );
+ if ( AST * node = findNodeAt( ast, line, column ) ) {
+ kdDebug( 9007 ) << "------------------- AST FOUND --------------------" << endl;
+ kdDebug( 9007 ) << "node-kind = " << nodeTypeToString( node->nodeType() ) << endl;
+
+ if ( FunctionDefinitionAST * def = functionDefinition( node ) ) {
+ kdDebug( 9007 ) << "------> found a function definition" << endl;
+
+ int startLine, startColumn;
+ def->getStartPosition( &startLine, &startColumn );
+
+ QString contents = getText( startLine, startColumn, line, showArguments ? nCol : column );
+
+
+ /// @todo remove code duplication
+ int start_expr = expressionAt( contents, contents.length() );
+
+ // kdDebug(9007) << "start_expr = " << start_expr << endl;
+ if ( start_expr != int( contents.length() ) )
+ expr = contents.mid( start_expr, contents.length() - start_expr ).stripWhiteSpace();
+
+ if ( expr.startsWith( "SIGNAL" ) || expr.startsWith( "SLOT" ) ) {
+ m_completionMode = expr.startsWith( "SIGNAL" ) ? SignalCompletion : SlotCompletion;
+
+ showArguments = false;
+ int end_expr = start_expr - 1;
+ while ( end_expr > 0 && contents[ end_expr ].isSpace() )
+ --end_expr;
+
+ if ( contents[ end_expr ] != ',' ) {
+ expr = QString::null;
+ } else {
+ start_expr = expressionAt( contents, end_expr );
+ expr = contents.mid( start_expr, end_expr - start_expr ).stripWhiteSpace();
+ }
+ } else {
+ int idx = expr.length() - 1;
+ while ( expr[ idx ].isLetterOrNumber() || expr[ idx ] == '_' )
+ --idx;
+
+ if ( idx != int( expr.length() ) - 1 ) {
+ ++idx;
+ word = expr.mid( idx ).stripWhiteSpace();
+ expr = expr.left( idx ).stripWhiteSpace();
+ }
+ }
+
+ ctx = computeContext( def, line, column, startLine, startColumn );
+
+ QStringList scope;
+ scopeOfNode( def, scope );
+ this_type = SimpleType( scope, getIncludeFiles() );
+
+ if ( scope.size() ) { /*
+ SimpleVariable var;
+ var.type = scope;
+ var.name = "this";
+ ctx->add( var );*/
+ //kdDebug(9007) << "add variable " << var.name << " with type " << var.type << endl;
+ }
+
+ ExpressionInfo exp( expr );
+ exp.t = ( ExpressionInfo::Type ) ( ExpressionInfo::NormalExpression | ExpressionInfo::TypeExpression );
+ type = evaluateExpression( exp, ctx );
+ }
+ }
+ }
+
+ if ( !ctx )
+ return ;
+
+ if ( ch2 == "::" ) {
+ QString str = clearComments( expr );
+ if ( !str.contains( '.' ) && !str.contains( "->" ) ) ///Necessary, because the expression may also be like user->BaseUser::
+ isInstance = false;
+ }
+
+ QString resolutionType = "(resolved)";
+ if( !type->resolved() ) {
+ if( BuiltinTypes::isBuiltin( type.resultType ) ) {
+ resolutionType = "(builtin " + BuiltinTypes::comment( type.resultType ) + ")";
+ } else {
+ resolutionType = "(unresolved)";
+ }
+ }
+
+ kdDebug( 9007 ) << "===========================> type is: " << type->fullNameChain() << resolutionType << endl;
+ kdDebug( 9007 ) << "===========================> word is: " << word << endl;
+
+ if ( !showArguments ) {
+ QValueList<CodeCompletionEntry> entryList;
+
+ if ( !type && this_type && ( expr.isEmpty() || expr.endsWith( ";" ) ) ) {
+
+ bool alwaysIncludeNamespaces = cfg->alwaysIncludeNamespaces();
+ {
+ SimpleType t = this_type;
+ ///First, all static data.
+ bool ready = false;
+ SafetyCounter cnt( 20 );
+ int depth = 0;
+ while ( !ready & cnt ) {
+ if ( t->scope().isEmpty() ) {
+ ready = true;
+ }
+ if( !t->isNamespace() || invokedOnDemand || alwaysIncludeNamespaces )
+ computeCompletionEntryList( t, entryList, t->scope(), false, depth );
+ t = t->parent();
+ depth++;
+ }
+ }
+ {
+ SimpleType t = this_type;
+ ///Now find non-static(if we have an instance) and global data
+ bool ready = false;
+ SafetyCounter cnt( 20 );
+ int depth = 0;
+ bool first = true;
+ while ( !ready & cnt ) {
+ if ( t->scope().isEmpty() ) {
+ ready = true;
+ }
+ if ( ( (t->isNamespace() && invokedOnDemand) || alwaysIncludeNamespaces ) || ( first && isInstance ) )
+ computeCompletionEntryList( t, entryList, t->scope(), t->isNamespace() ? true : isInstance, depth );
+ t = t->parent();
+ depth++;
+ first = false;
+ }
+ }
+ if( ctx ) computeCompletionEntryList( entryList, ctx, isInstance );
+ } else if ( type->resolved() && expr.isEmpty() ) {
+ if( ctx ) computeCompletionEntryList( entryList, ctx, isInstance );
+
+ // if ( m_pSupport->codeCompletionConfig() ->includeGlobalFunctions() )
+ // computeCompletionEntryList( type, entryList, QStringList(), false );
+
+ computeCompletionEntryList( type, entryList, QStringList(), false );
+
+ if ( this_type.scope().size() )
+ computeCompletionEntryList( this_type, entryList, this_type.scope(), isInstance );
+ computeCompletionEntryList( type, entryList, type->resolved() ->scope() , isInstance );
+ } else if ( type->resolved() ) {
+ if ( type->resolved() )
+ computeCompletionEntryList( type, entryList, type->resolved() ->scope() , isInstance );
+ }
+
+ QStringList trueMatches;
+
+ if ( invokedOnDemand ) {
+ // find matching words
+ QValueList<CodeCompletionEntry>::Iterator it;
+ for ( it = entryList.begin(); it != entryList.end(); ++it ) {
+ if ( ( *it ).text.startsWith( word ) ) {
+ trueMatches << ( *it ).text;
+
+ // if more than one entry matches, abort immediately
+ if ( trueMatches.size() > 1 )
+ break;
+ }
+ }
+ }
+
+ if ( invokedOnDemand && trueMatches.size() == 1 ) {
+ // erbsland: get the cursor position now, because m_ccLine and m_ccColumn
+ // are not set until the first typed char.
+ unsigned int nLine, nCol;
+ m_activeCursor->cursorPositionReal( &nLine, &nCol );
+ // there is only one entry -> complete immediately
+ m_activeEditor->insertText( nLine, nCol,
+ trueMatches[ 0 ].right( trueMatches[ 0 ].length() - word.length() ) );
+ } else if ( entryList.size() ) {
+ entryList = unique( entryList );
+ qHeapSort( entryList );
+
+ m_bCompletionBoxShow = true;
+ ///Warning: the conversion is only possible because CodeCompletionEntry is binary compatible with KTextEditor::CompletionEntry,
+ ///never change that!
+ m_activeCompletion->showCompletionBox( *( ( QValueList<KTextEditor::CompletionEntry>* ) ( &entryList ) ), word.length() );
+ }
+ } else {
+ QValueList<QStringList> signatureList;
+
+ signatureList = computeSignatureList( type );
+
+ QString methodName = type->name();
+
+ ///Search for variables with ()-operator in the context
+ if ( ctx ) {
+ SimpleVariable var = ctx->findVariable( methodName );
+ if ( !var.name.isEmpty() ) {
+ signatureList += computeSignatureList( ctx->container() ->locateDecType( var.type ) );
+ }
+ }
+
+ ///search for fitting methods/classes in the current context
+ SimpleType t = this_type;
+ bool ready = false;
+ SafetyCounter s( 20 );
+ do {
+ if ( !t )
+ ready = true;
+ TypeDesc d( methodName );
+ d.setIncludeFiles( getIncludeFiles() );
+ SimpleType method = t->typeOf( d );
+ if ( method )
+ signatureList += computeSignatureList( method );
+ if ( t )
+ t = t->parent();
+ } while ( !ready && s );
+
+ if ( !signatureList.isEmpty() ) {
+ //signatureList = unique( signatureList );
+ //qHeapSort( signatureList );
+ m_bArgHintShow = true;
+ m_activeCompletion->showArgHint( unique( signatureList ), "()", "," );
+ }
+ }
+
+ delete( ctx );
+ ctx = 0;
+
+ if ( cfg->usePermanentCaching() ) {
+ conf.invalidate();
+ m_cachedFromContext = contextItem;
+ }
+}
+
+
+QValueList<QStringList> CppCodeCompletion::computeSignatureList( EvaluationResult result ) {
+ SimpleType type = result;
+
+ if ( result.expr.t == ExpressionInfo::TypeExpression ) {
+ TypeDesc d( result->name() );
+ d.setIncludeFiles( getIncludeFiles() );
+ type = type->typeOf( d, SimpleTypeImpl::MemberInfo::Function ); ///Compute the signature of the constructor
+ }
+
+ QValueList<QStringList> retList;
+ SimpleTypeFunctionInterface* f = type->asFunction();
+ SimpleType currType = type;
+
+ if ( !f && !type->isNamespace() ) {
+ SimpleType t = type->typeOf( TypeDesc("operator ( )"), SimpleTypeImpl::MemberInfo::Function );
+
+ if ( t ) {
+ f = t->asFunction();
+ currType = t;
+ }
+ }
+
+ while ( f ) {
+ QStringList lst;
+ QString sig = buildSignature( currType.get() );
+ QString comment = currType->comment();
+ QStringList commentList;
+ if ( m_pSupport->codeCompletionConfig() ->showCommentWithArgumentHint() ) {
+
+ if ( !comment.isEmpty() ) {
+ if ( sig.length() + comment.length() < 130 ) {
+ sig += ": \"" + currType->comment() + "\"";
+ } else {
+ commentList = formatComment( comment );
+ }
+ }
+ }
+
+ lst << sig;
+ lst += commentList;
+
+ currType = f->nextFunction();
+
+ ///Maybe try to apply implicit template-params in this place
+
+ retList << lst;
+ f = currType->asFunction();
+ }
+ return retList;
+}
+
+void CppCodeCompletion::synchronousParseReady( const QString& file, ParsedFilePointer unit ) {
+ if ( file == m_activeFileName ) {
+ computeRecoveryPoints( unit );
+ }
+}
+
+void CppCodeCompletion::slotCodeModelUpdated( const QString& fileName ) {
+ if ( fileName != m_activeFileName || !m_pSupport || !m_activeEditor )
+ return ;
+
+// m_pSupport->mainWindow() ->statusBar() ->message( i18n( "Current file updated %1" ).arg( m_activeFileName ), 1000 );
+
+ computeRecoveryPointsLocked();
+}
+
+void CppCodeCompletion::slotFileParsed( const QString& fileName ) {
+ if ( fileName != m_activeFileName || !m_pSupport || !m_activeEditor )
+ return ;
+
+// m_pSupport->mainWindow() ->statusBar() ->message( i18n( "Current file parsed %1 (cache emptied)" ).arg( m_activeFileName ), 1000 );
+
+ emptyCache(); ///The cache has to be emptied, because the code-model changed. @todo Better: Only refresh the code-model(tell all code-model-types to refresh themselves on demand)
+
+ computeRecoveryPointsLocked();
+}
+
+void CppCodeCompletion::setupCodeInformationRepository( ) {}
+
+SimpleContext* CppCodeCompletion::computeContext( FunctionDefinitionAST * ast, int line, int col, int lineOffset, int colOffset ) {
+ kdDebug( 9007 ) << "CppCodeCompletion::computeContext() -- main" << endl;
+
+ SimpleContext* ctx = new SimpleContext();
+
+ if ( ast && ast->initDeclarator() && ast->initDeclarator() ->declarator() ) {
+ DeclaratorAST * d = ast->initDeclarator() ->declarator();
+ if ( ParameterDeclarationClauseAST * clause = d->parameterDeclarationClause() ) {
+ if ( ParameterDeclarationListAST * params = clause->parameterDeclarationList() ) {
+ QPtrList<ParameterDeclarationAST> l( params->parameterList() );
+ QPtrListIterator<ParameterDeclarationAST> it( l );
+ while ( it.current() ) {
+ ParameterDeclarationAST * param = it.current();
+ ++it;
+
+ SimpleVariable var;
+
+ QStringList ptrList;
+ QPtrList<AST> ptrOpList = param->declarator() ->ptrOpList();
+ QPtrList<AST>::iterator it = ptrOpList.begin();
+ for ( ; it != ptrOpList.end(); ++it ) {
+ ptrList.append( ( *it ) ->text() );
+ }
+
+ var.ptrList = ptrList;
+ var.type = param->typeSpec() ->text() + ptrList.join( "" );
+ var.name = declaratorToString( param->declarator(), QString::null, true );
+ var.comment = param->comment();
+ param->getStartPosition( &var.startLine, &var.startCol );
+ param->getEndPosition( &var.endLine, &var.endCol );
+
+ if ( var.type ) {
+ ctx->add
+ ( var );
+ //kdDebug(9007) << "add argument " << var.name << " with type " << var.type << endl;
+ }
+ }
+ }
+ }
+ }
+
+
+ if ( ast )
+ computeContext( ctx, ast->functionBody(), line, col );
+
+ if ( ctx ) {
+ ctx->offset( lineOffset, colOffset );
+ }
+
+ return ctx;
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, StatementAST* stmt, int line, int col ) {
+ if ( !stmt )
+ return ;
+
+ switch ( stmt->nodeType() ) {
+ case NodeType_IfStatement:
+ computeContext( ctx, static_cast<IfStatementAST*>( stmt ), line, col );
+ break;
+ case NodeType_WhileStatement:
+ computeContext( ctx, static_cast<WhileStatementAST*>( stmt ), line, col );
+ break;
+ case NodeType_DoStatement:
+ computeContext( ctx, static_cast<DoStatementAST*>( stmt ), line, col );
+ break;
+ case NodeType_ForStatement:
+ computeContext( ctx, static_cast<ForStatementAST*>( stmt ), line, col );
+ break;
+ case NodeType_SwitchStatement:
+ computeContext( ctx, static_cast<SwitchStatementAST*>( stmt ), line, col );
+ break;
+ case NodeType_TryBlockStatement:
+ computeContext( ctx, static_cast<TryBlockStatementAST*>( stmt ), line, col );
+ break;
+ case NodeType_DeclarationStatement:
+ computeContext( ctx, static_cast<DeclarationStatementAST*>( stmt ), line, col );
+ break;
+ case NodeType_StatementList:
+ computeContext( ctx, static_cast<StatementListAST*>( stmt ), line, col );
+ break;
+ case NodeType_ExpressionStatement:
+ break;
+ }
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, StatementListAST* ast, int line, int col ) {
+ if ( !inContextScope( ast, line, col, false, true ) )
+ return ;
+
+ QPtrList<StatementAST> l( ast->statementList() );
+ QPtrListIterator<StatementAST> it( l );
+ while ( it.current() ) {
+ StatementAST * stmt = it.current();
+ ++it;
+
+ computeContext( ctx, stmt, line, col );
+ }
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, IfStatementAST* ast, int line, int col ) {
+ if ( !inContextScope( ast, line, col ) )
+ return ;
+
+ computeContext( ctx, ast->condition(), line, col );
+ computeContext( ctx, ast->statement(), line, col );
+ computeContext( ctx, ast->elseStatement(), line, col );
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, ForStatementAST* ast, int line, int col ) {
+ if ( !inContextScope( ast, line, col ) )
+ return ;
+
+ computeContext( ctx, ast->initStatement(), line, col );
+ computeContext( ctx, ast->condition(), line, col );
+ computeContext( ctx, ast->statement(), line, col );
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, DoStatementAST* ast, int line, int col ) {
+ if ( !inContextScope( ast, line, col ) )
+ return ;
+
+ //computeContext( ctx, ast->condition(), line, col );
+ computeContext( ctx, ast->statement(), line, col );
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, WhileStatementAST* ast, int line, int col ) {
+ if ( !inContextScope( ast, line, col ) )
+ return ;
+
+ computeContext( ctx, ast->condition(), line, col );
+ computeContext( ctx, ast->statement(), line, col );
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, SwitchStatementAST* ast, int line, int col ) {
+ if ( !inContextScope( ast, line, col ) )
+ return ;
+
+ computeContext( ctx, ast->condition(), line, col );
+ computeContext( ctx, ast->statement(), line, col );
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, TryBlockStatementAST* ast, int line, int col ) {
+ if ( !inContextScope( ast, line, col ) )
+ return ;
+
+ computeContext( ctx, ast->statement(), line, col );
+ computeContext( ctx, ast->catchStatementList(), line, col );
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, CatchStatementListAST* ast, int line, int col ) {
+ /*if ( !inContextScope( ast, line, col, false, true ) )
+ return;*/
+
+ QPtrList<CatchStatementAST> l( ast->statementList() );
+ QPtrListIterator<CatchStatementAST> it( l );
+ while ( it.current() ) {
+ CatchStatementAST * stmt = it.current();
+ ++it;
+
+ computeContext( ctx, stmt, line, col );
+ }
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, CatchStatementAST* ast, int line, int col ) {
+ if ( !ast->statement() )
+ return ;
+ if ( !inContextScope( ast->statement(), line, col ) )
+ return ;
+
+ computeContext( ctx, ast->condition(), line, col );
+ computeContext( ctx, ast->statement(), line, col );
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, DeclarationStatementAST* ast, int line, int col ) {
+ ///@todo respect NodeType_Typedef
+ if( ast->declaration() && ast->declaration() ->nodeType() == NodeType_UsingDirective ) {
+ UsingDirectiveAST* usingDecl = static_cast<UsingDirectiveAST*>( ast->declaration() );
+ QString name;
+ if( usingDecl->name() ) {
+ name = usingDecl->name()->text();
+
+ if( !name.isNull() )
+ ctx->addImport( QPair<QString, QString>( "", name ) );
+ }
+ }
+
+ if( ast->declaration() && ast->declaration() ->nodeType() == NodeType_NamespaceAlias ) {
+ NamespaceAliasAST* namespaceAlias = static_cast<NamespaceAliasAST*>( ast->declaration() );
+ QString name;
+
+ if( namespaceAlias ->namespaceName() && namespaceAlias->aliasName() ) {
+ ctx->addImport( QPair<QString, QString>( namespaceAlias->namespaceName()->text(), namespaceAlias->aliasName()->text() ) );
+ }
+ }
+
+ if ( !ast->declaration() || ast->declaration() ->nodeType() != NodeType_SimpleDeclaration )
+ return ;
+
+ if ( !inContextScope( ast, line, col, true, false ) )
+ return ;
+
+ SimpleDeclarationAST* simpleDecl = static_cast<SimpleDeclarationAST*>( ast->declaration() );
+ TypeSpecifierAST* typeSpec = simpleDecl->typeSpec();
+
+ InitDeclaratorListAST* initDeclListAST = simpleDecl->initDeclaratorList();
+ if ( !initDeclListAST )
+ return ;
+
+ QPtrList<InitDeclaratorAST> l = initDeclListAST->initDeclaratorList();
+ QPtrListIterator<InitDeclaratorAST> it( l );
+ while ( it.current() ) {
+ DeclaratorAST * d = it.current() ->declarator();
+ ++it;
+
+ if ( d->declaratorId() ) {
+ SimpleVariable var;
+
+ QStringList ptrList;
+ QPtrList<AST> ptrOpList = d->ptrOpList();
+ QPtrList<AST>::iterator it = ptrOpList.begin();
+ for ( ; it != ptrOpList.end(); ++it ) {
+ ptrList.append( ( *it ) ->text() );
+ }
+
+ for( int a = 0; a < d->arrayDimensionList().count(); a++ )
+ ptrList.append("*");
+
+ var.ptrList = ptrList;
+ var.type = typeSpec->text() + ptrList.join( "" );
+ var.name = toSimpleName( d->declaratorId() );
+ var.comment = d->comment();
+ d->getStartPosition( &var.startLine, &var.startCol );
+ d->getEndPosition( &var.endLine, &var.endCol );
+
+ ctx->add
+ ( var );
+ //kdDebug(9007) << "add variable " << var.name << " with type " << var.type << endl;
+ }
+ }
+}
+
+void CppCodeCompletion::computeContext( SimpleContext*& ctx, ConditionAST* ast, int line, int col ) {
+ if ( !ast->typeSpec() || !ast->declarator() || !ast->declarator() ->declaratorId() )
+ return ;
+
+ if ( !inContextScope( ast, line, col, true, false ) )
+ return ;
+
+ SimpleVariable var;
+
+ QStringList ptrList;
+ QPtrList<AST> ptrOpList = ast->declarator() ->ptrOpList();
+ QPtrList<AST>::iterator it = ptrOpList.begin();
+ for ( ; it != ptrOpList.end(); ++it ) {
+ ptrList.append( ( *it ) ->text() );
+ }
+
+ var.ptrList = ptrList;
+ var.type = ast->typeSpec() ->text() + ptrList.join( "" );
+ var.name = toSimpleName( ast->declarator() ->declaratorId() );
+ var.comment = ast->comment();
+ ast->getStartPosition( &var.startLine, &var.startCol );
+ ast->getEndPosition( &var.endLine, &var.endCol );
+ ctx->add
+ ( var );
+ //kdDebug(9007) << "add variable " << var.name << " with type " << var.type << endl;
+}
+
+bool CppCodeCompletion::inContextScope( AST* ast, int line, int col, bool checkStart, bool checkEnd ) {
+ int startLine, startColumn;
+ int endLine, endColumn;
+ ast->getStartPosition( &startLine, &startColumn );
+ ast->getEndPosition( &endLine, &endColumn );
+
+ // kdDebug(9007) << k_funcinfo << endl;
+ // kdDebug(9007) << "current char line: " << line << " col: " << col << endl;
+ //
+ // kdDebug(9007) << nodeTypeToString( ast->nodeType() )
+ // << " start line: " << startLine
+ // << " col: " << startColumn << endl;
+ // kdDebug(9007) << nodeTypeToString( ast->nodeType() )
+ // << " end line: " << endLine
+ // << " col: " << endColumn << endl;
+
+ bool start = line > startLine || ( line == startLine && col >= startColumn );
+ bool end = line < endLine || ( line == endLine && col <= endColumn );
+
+ if ( checkStart && checkEnd )
+ return start && end;
+ else if ( checkStart )
+ return start;
+ else if ( checkEnd )
+ return end;
+
+ return false;
+}
+
+FunctionDefinitionAST * CppCodeCompletion::functionDefinition( AST* node ) {
+
+ while ( node ) {
+ if ( node->nodeType() == NodeType_FunctionDefinition )
+ return static_cast<FunctionDefinitionAST*>( node );
+ node = node->parent();
+ }
+ return 0;
+}
+
+QString CppCodeCompletion::getText( int startLine, int startColumn, int endLine, int endColumn, int omitLine ) {
+ if ( startLine == endLine ) {
+ QString textLine = m_activeEditor->textLine( startLine );
+ return textLine.mid( startColumn, endColumn - startColumn );
+ }
+
+ QStringList contents;
+
+ for ( int line = startLine; line <= endLine; ++line ) {
+ if ( line == omitLine )
+ continue;
+
+ QString textLine = m_activeEditor->textLine( line );
+
+ if ( line == startLine )
+ textLine = textLine.mid( startColumn );
+ if ( line == endLine )
+ textLine = textLine.left( endColumn );
+
+ contents << textLine;
+ }
+ return contents.join( "\n" );
+}
+
+void CppCodeCompletion::computeRecoveryPointsLocked() {
+ m_pSupport->backgroundParser() ->lock ()
+ ;
+ ParsedFilePointer unit = m_pSupport->backgroundParser() ->translationUnit( m_activeFileName );
+ computeRecoveryPoints( unit );
+ m_pSupport->backgroundParser() ->unlock();
+}
+
+void CppCodeCompletion::computeRecoveryPoints( ParsedFilePointer unit ) {
+ if ( m_blockForKeyword )
+ return ;
+
+ kdDebug( 9007 ) << "CppCodeCompletion::computeRecoveryPoints" << endl;
+
+ d->recoveryPoints.clear();
+ if ( !unit )
+ return ;
+
+ ComputeRecoveryPoints walker( d->recoveryPoints );
+ walker.parseTranslationUnit( *unit );
+}
+
+QString codeModelAccessToString( CodeModelItem::Access access ) {
+ switch ( access ) {
+ case CodeModelItem::Public:
+ return "public";
+ case CodeModelItem::Protected:
+ return "protected";
+ case CodeModelItem::Private:
+ return "private";
+ default:
+ return "unknown";
+ }
+}
+
+#define MAXCOMMENTCOLUMNS 45
+
+
+QString CppCodeCompletion::commentFromItem( const SimpleType& parent, const ItemDom& item ) {
+ --m_maxComments;
+ static QString maxReached = " ";
+ if( m_maxComments < 0 ) {
+ return maxReached;
+ }
+ QString ret;
+ int line, col;
+ item->getStartPosition( &line, &col );
+
+
+ if ( !parent->scope().isEmpty() ) {
+ ret += "Container: " + parent->fullTypeResolvedWithScope();
+ }
+
+ if ( item->isEnum() ) {
+ ret += "\nKind: Enum";
+ ret += "\nValues:";
+ const EnumModel* en = dynamic_cast<const EnumModel*>( item.data() );
+ if ( en ) {
+ EnumeratorList values = en->enumeratorList();
+ for ( EnumeratorList::iterator it = values.begin(); it != values.end(); ++it ) {
+ ret += "\n " + ( *it ) ->name();
+ if ( !( *it ) ->value().isEmpty() ) {
+ ret + " = " + ( *it ) ->value();
+ }
+ }
+
+ ret += "\n\nAccess: " + codeModelAccessToString( ( CodeModelItem::Access ) en->access() );
+ } else {}
+
+ }
+
+ if ( item->isFunction() || item->isFunctionDefinition() ) {
+ const FunctionModel * f = dynamic_cast<const FunctionModel*>( item.data() );
+ ret += "\nKind: Function";
+ if ( f ) {
+ QString state;
+ if ( f->isStatic() )
+ state += "static ";
+ if ( f->isVirtual() )
+ state += "virtual ";
+ if ( f->isAbstract() )
+ state += "abstract ";
+ //if( f->isTemplateable() ) state += "template ";
+ if ( f->isConstant() )
+ state += "const ";
+ if ( f->isSlot() )
+ state += "slot ";
+ if ( f->isSignal() )
+ state += "signal ";
+
+ if ( !state.isEmpty() )
+ ret += "\nModifiers: " + state;
+
+ ret += "\nAccess: " + codeModelAccessToString( ( CodeModelItem::Access ) f->access() );
+ }
+ }
+
+ if ( item->isEnumerator() ) {
+ const EnumeratorModel * f = dynamic_cast<const EnumeratorModel*>( item.data() );
+ ret += "\nKind: Enumerator";
+ if ( f ) {
+ if ( !f->value().isEmpty() )
+ ret += "\nValue: " + f->value();
+
+ //ret += "\nAccess: " + codeModelAccessToString( f->() );
+ }
+ } else {
+ if ( item->isVariable() ) {
+ const VariableModel * f = dynamic_cast<const VariableModel*>( item.data() );
+ if ( f ) {
+ if ( !f->isEnumeratorVariable() ) {
+ ret += "\nKind: Variable";
+ if ( f->isStatic() )
+ ret += "\nModifiers: static";
+ } else {
+ ret += "\nKind: Enumerator";
+ ret += "\nEnum: " + f->type();
+ }
+
+ ret += "\nAccess: " + codeModelAccessToString( ( CodeModelItem::Access ) f->access() );
+ }
+ }
+ }
+
+ if ( item->isTypeAlias() ) {
+ const TypeAliasModel * t = dynamic_cast<const TypeAliasModel*>( item.data() );
+ ret += "\nKind: Typedef";
+ if ( t ) {
+ ret += "\nType: " + t->type();
+ LocateResult r = parent->locateDecType( t->type() );
+ if ( r.desc().resolved() )
+ ret += "\nResolved type: " + r.desc().resolved() ->fullTypeResolvedWithScope();
+ else
+ ret += "\nPartially resolved type: " + r.desc().fullNameChain();
+ }
+ }
+
+ if ( item->isClass() ) {
+ ret += "\nKind: Class";
+ }
+
+ ret += QString( "\nFile: %1\nLine: %2 Column: %3" ).arg( prepareTextForMenu( item->fileName(), 3, MAXCOMMENTCOLUMNS ).join( "\n" ) ).arg( line ).arg( col );
+ if ( !item->comment().isEmpty() )
+ ret += "\n\n" + prepareTextForMenu( item->comment(), 3, MAXCOMMENTCOLUMNS ).join( "\n" );
+ return ret;
+}
+
+QString CppCodeCompletion::commentFromTag( const SimpleType& parent, Tag& tag ) {
+ --m_maxComments;
+ static QString maxReached = " ";
+ if( m_maxComments < 0 ) {
+ return maxReached;
+ }
+
+ int line, col;
+ tag.getStartPosition( &line, &col );
+ QString ret; // = tag.comment();
+
+ if ( !parent->scope().isEmpty() ) {
+ ret += "Container: " + parent->fullTypeResolvedWithScope();
+ }
+ /*
+ if( tag.kind() == Tag::Kind_Enum ) {
+ ret += "\nKind: Enum";
+ ret += "\nValues:";
+ EnumModel* en = dynamic_cast<EnumModel*>( item.data() );
+ if( en ) {
+ EnumeratorList values =en->enumeratorList();
+ for( EnumeratorList::iterator it = values.begin(); it != values.end(); ++it )
+ {
+ ret += "\n " + (*it)->name();
+ if( !(*it)->value().isEmpty() ) {
+ ret + " = " + (*it)->value();
+ }
+ }
+
+ ret += "\n\nAccess: " + codeModelAccessToString( (CodeModelItem::Access)en->access() );
+ } else {
+ }
+ }*/
+
+ if ( tag.kind() == Tag::Kind_Function || tag.kind() == Tag::Kind_FunctionDeclaration ) {
+ CppFunction<Tag> function( tag );
+
+ ret += "\nKind: Function";
+
+ QString state;
+ if ( function.isStatic() )
+ state += "static ";
+ if ( function.isVirtual() )
+ state += "virtual ";
+ //if( function.isVolatile() ) state += "volatile ";
+ if ( function.isConst() )
+ state += "const ";
+ if ( function.isSlot() )
+ state += "slot ";
+ if ( function.isSignal() )
+ state += "signal ";
+ if ( !state.isEmpty() )
+ ret += "\nModifiers: " + state;
+
+ ret += "\nAccess: " + TagUtils::accessToString( function.access() );
+ }
+
+ /*if( item->isEnumerator() ) {
+ EnumeratorModel* f = dynamic_cast<EnumeratorModel*>( item.data() );
+ ret += "\nKind: Enumerator";
+ if( f ) {
+ if( !f->value().isEmpty() )
+ ret += "\nValue: " + f->value();
+
+ //ret += "\nAccess: " + codeModelAccessToString( f->() );
+ }
+ } else {
+ if( item->isVariable() ) {
+ VariableModel* f = dynamic_cast<VariableModel*>( item.data() );
+ ret += "\nKind: Variable";
+ if( f ) {
+ ret += "\nAccess: " + codeModelAccessToString( (CodeModelItem::Access)f->access() );
+ }
+ }
+ }*/
+
+ if ( tag.kind() == Tag::Kind_Enum ) {
+ CppVariable<Tag> var( tag );
+
+ ret += "\nKind: Enum";
+ }
+
+ if ( tag.kind() == Tag::Kind_Enumerator ) {
+ CppVariable<Tag> var( tag );
+
+ ret += "\nKind: Enumerator";
+ if ( tag.hasAttribute( "enum" ) && tag.attribute( "enum" ).asString() != "int" )
+ ret += "\nEnum: " + tag.attribute( "enum" ).asString();
+ }
+
+ if ( tag.kind() == Tag::Kind_Variable ) {
+ CppVariable<Tag> var( tag );
+
+ ret += "\nKind: Variable";
+ if ( var.isStatic() )
+ ret += "\nModifiers: static";
+ ret += "\nAccess: " + TagUtils::accessToString( var.access() );
+ }
+
+ if ( tag.kind() == Tag::Kind_Typedef ) {
+ ret += "\nKind: Typedef";
+ ret += "\nType: " + tagType( tag );
+ LocateResult r = parent->locateDecType( tagType( tag ) );
+ if ( r.desc().resolved() )
+ ret += "\nResolved type: " + r.desc().resolved() ->fullTypeResolvedWithScope();
+ else
+ ret += "\nPartially resolved type: " + r.desc().fullNameChain();
+ }
+
+ if ( tag.kind() == Tag::Kind_Class ) {
+ ret += "\nKind: Class";
+ }
+ if ( tag.kind() == Tag::Kind_Struct ) {
+ ret += "\nKind: Struct";
+ }
+
+ ret += QString( "\nFile: %1\nLine: %2 Column: %3" ).arg( prepareTextForMenu( tag.fileName(), 3, MAXCOMMENTCOLUMNS ).join( "\n" ) ).arg( line ).arg( col );
+ if ( !tag.comment().isEmpty() ) {
+ ret += "\n\n" + prepareTextForMenu( tag.comment(), 20, MAXCOMMENTCOLUMNS ).join( "\n" );
+ }
+ return ret;
+}
+
+void CppCodeCompletion::computeCompletionEntryList( SimpleType typeR, QValueList<CodeCompletionEntry>& entryList, const QStringList& type, SimpleTypeNamespace* ns, std::set<HashedString>& ignore, bool isInstance, int depth ) {
+ HashedString myName = HashedString( ns->scope().join("::") +"%"+typeid(*ns).name() );
+ if ( ignore.find( myName ) != ignore.end() )
+ return ;
+ ignore.insert( myName );
+ SimpleTypeNamespace::SlaveList slaves = ns->getSlaves( getIncludeFiles() );
+ for ( SimpleTypeNamespace::SlaveList::iterator it = slaves.begin(); it != slaves.end(); ++it ) {
+ SimpleTypeNamespace* nns = dynamic_cast<SimpleTypeNamespace*>( (*it).first.first.resolved().data() );
+ if ( !nns ) {
+ if( ( *it ).first.first.resolved() ) computeCompletionEntryList( SimpleType((*it).first.first.resolved()), entryList, ( *it ).first.first.resolved()->scope(), isInstance, depth );
+ } else {
+ if( ( *it ).first.first.resolved() ) computeCompletionEntryList( SimpleType(( *it ).first.first.resolved()), entryList, ( *it ).first.first.resolved()->scope(), nns, ignore, isInstance, depth );
+ }
+ }
+}
+
+void CppCodeCompletion::computeCompletionEntryList( SimpleType typeR, QValueList< CodeCompletionEntry > & entryList, const QStringList & type, bool isInstance, int depth ) {
+ dbgState.setState( disableVerboseForCompletionList );
+
+ Debug d( "#cel#" );
+ if ( !safetyCounter || !d )
+ return ;
+ SimpleTypeImpl* m = &( *typeR ) ;
+
+ if ( SimpleTypeNamespace * ns = dynamic_cast<SimpleTypeNamespace*>( m ) ) {
+ std::set<HashedString> ignore;
+ computeCompletionEntryList( typeR, entryList, type, ns, ignore, isInstance, depth );
+ } else if ( dynamic_cast<SimpleTypeCodeModel*>( m ) ) {
+ ItemDom item = ( dynamic_cast<SimpleTypeCodeModel*>( m ) ) ->item();
+ if ( item )
+ if ( ClassModel * mod = dynamic_cast<ClassModel*> ( &( *item ) ) )
+ computeCompletionEntryList( typeR, entryList, ClassDom( mod ) , isInstance, depth );
+ } else {
+ QValueList<Catalog::QueryArgument> args;
+ QValueList<Tag> tags;
+
+ QStringList ts = type;
+ if( !ts.isEmpty() ) {
+ QString s = ts.back() + typeR->specialization();
+ ts.pop_back();
+ ts.push_back( s );
+ }
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_FunctionDeclaration )
+ << Catalog::QueryArgument( "scope", ts );
+ tags = m_repository->query( args );
+ computeCompletionEntryList( typeR, entryList, tags, isInstance, depth );
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Variable )
+ << Catalog::QueryArgument( "scope", ts );
+ tags = m_repository->query( args );
+ computeCompletionEntryList( typeR, entryList, tags, isInstance, depth );
+
+ if ( !isInstance ) {
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Enumerator )
+ << Catalog::QueryArgument( "scope", ts );
+ tags = m_repository->query( args );
+ computeCompletionEntryList( typeR, entryList, tags, isInstance, depth );
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Enum )
+ << Catalog::QueryArgument( "scope", ts );
+ tags = m_repository->query( args );
+ computeCompletionEntryList( typeR, entryList, tags, isInstance, depth );
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Typedef )
+ << Catalog::QueryArgument( "scope", ts );
+ tags = m_repository->query( args );
+ computeCompletionEntryList( typeR, entryList, tags, isInstance, depth );
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Class )
+ << Catalog::QueryArgument( "scope", ts );
+ tags = m_repository->query( args );
+ computeCompletionEntryList( typeR, entryList, tags, isInstance, depth );
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Struct )
+ << Catalog::QueryArgument( "scope", ts );
+ tags = m_repository->query( args );
+ computeCompletionEntryList( typeR, entryList, tags, isInstance, depth );
+ }
+
+ args.clear();
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Base_class );
+ QString fullname = type.join( "::" )+typeR->specialization();
+ /* if( fullname.length() >=2 )
+ args << Catalog::QueryArgument( "prefix", fullname.left(2) );*/
+ args << Catalog::QueryArgument( "name", fullname );
+
+
+ QValueList<LocateResult> parents = typeR->getBases( );
+ for ( QValueList<LocateResult>::Iterator it = parents.begin(); it != parents.end(); ++it ) {
+ if ( !( *it ) ->resolved() )
+ continue;
+ SimpleType tp = SimpleType( ( *it ) ->resolved() );
+ if ( tp )
+ computeCompletionEntryList( tp, entryList, tp.scope(), isInstance, depth + 1 );
+ }
+ }
+ dbgState.setState( true );
+}
+
+
+void CppCodeCompletion::computeCompletionEntryList( SimpleType type, QValueList< CodeCompletionEntry > & entryList, QValueList< Tag > & tags, bool isInstance, int depth ) {
+ Debug d( "#cel#" );
+ if ( !safetyCounter || !d )
+ return ;
+ QString className = type->desc().name();
+
+ bool isNs = type->isNamespace();
+
+ CompTypeProcessor proc( type, m_pSupport->codeCompletionConfig() ->processFunctionArguments() && type->usingTemplates() );
+ bool resolve = m_pSupport->codeCompletionConfig() ->processPrimaryTypes() && type->usingTemplates();
+
+ QValueList<Tag>::Iterator it = tags.begin();
+ while ( it != tags.end() ) {
+ Tag & tag = *it;
+ ++it;
+
+ int subSorting = 0;
+
+ if ( tag.name().isEmpty() ) {
+ continue;
+ } else if ( m_completionMode != NormalCompletion ) {
+ if ( tag.kind() != Tag::Kind_FunctionDeclaration )
+ continue;
+ }
+
+ if ( tag.kind() == Tag::Kind_Function || tag.kind() == Tag::Kind_FunctionDeclaration ) {
+ CppFunction<Tag> info( tag );
+
+ if ( m_completionMode == SlotCompletion && !info.isSlot() )
+ continue;
+ else if ( m_completionMode == SignalCompletion && !info.isSignal() )
+ continue;
+ else if ( m_completionMode == VirtualDeclCompletion && !info.isVirtual() )
+ continue;
+
+ if ( info.isConst() )
+ subSorting = 1;
+ if ( info.isSlot() )
+ subSorting = 2;
+ if ( info.isSignal() )
+ subSorting = 3;
+ if ( info.isVirtual() )
+ subSorting = 4;
+ if ( info.isStatic() )
+ subSorting = 5;
+ }
+
+ CodeCompletionEntry e = CodeInformationRepository::toEntry( tag, m_completionMode, &proc );
+
+ TagFlags fl;
+ fl.flags = tag.flags();
+ int num = fl.data.access;
+
+ QString str = "public";
+ if ( num != 0 ) {
+ str = TagUtils::accessToString( num );
+ } else {
+ num = 0;
+ }
+ // 0 = protected, 1 = public, 2 = private
+
+ if ( str == "public" )
+ num = 0;
+ else if ( str == "protected" )
+ num = 1;
+ else if ( str == "private" )
+ num = 2;
+
+ int sortPosition = 0;
+
+ switch ( tag.kind() ) {
+ case Tag::Kind_Enum:
+ sortPosition = 3;
+ if ( isInstance )
+ continue;
+ break;
+ case Tag::Kind_Enumerator:
+ sortPosition = 4;
+ if ( isInstance )
+ continue;
+ break;
+ case Tag::Kind_Struct:
+ case Tag::Kind_Union:
+ case Tag::Kind_Class:
+ sortPosition = 5;
+ if ( isInstance )
+ continue;
+ break;
+ case Tag::Kind_VariableDeclaration:
+ case Tag::Kind_Variable:
+ sortPosition = 2;
+ if ( !isInstance && !CppVariable<Tag>( tag ).isStatic() && !isNs )
+ continue;
+ break;
+ case Tag::Kind_FunctionDeclaration:
+ case Tag::Kind_Function:
+ sortPosition = 1;
+ if ( !isInstance && !CppFunction<Tag>( tag ).isStatic() && !isNs )
+ continue;
+ break;
+ case Tag::Kind_Typedef:
+ sortPosition = 6;
+ if ( isInstance )
+ continue;
+ break;
+ }
+
+ e.userdata = QString( "%1%2%3%4%5" ).arg( num ).arg( depth ).arg( className ).arg( sortPosition ).arg( subSorting );
+
+ if ( m_completionMode != SignalCompletion ) {
+ if ( !type->isNamespace() ) {
+ if ( num == 1 )
+ e.postfix += "; (protected)"; // in " + proc.parentType() + ")";
+ if ( num == 2 )
+ e.postfix += "; (private)"; // in " + proc.parentType() + ")";
+ }
+ }
+
+
+ QString prefix = tagType( tag ).stripWhiteSpace();
+
+ if ( tag.kind() == Tag::Kind_Enumerator && tag.hasAttribute( "enum" ) ) {
+ prefix = tag.attribute( "enum" ).asString();
+ e.userdata += prefix; ///Sort enumerators together
+ } else if ( tag.kind() == Tag::Kind_Enum ) {
+ prefix = "enum";
+ } else {
+
+ if ( tag.kind() == Tag::Kind_FunctionDeclaration || tag.kind() == Tag::Kind_Function || tag.kind() == Tag::Kind_Variable || tag.kind() == Tag::Kind_Typedef ) {
+ if ( !prefix.isEmpty() && resolve ) {
+ LocateResult et = type->locateDecType( prefix );
+
+ if ( et )
+ prefix = et->fullNameChain();
+ }
+ }
+
+ if ( tag.kind() == Tag::Kind_FunctionDeclaration || tag.kind() == Tag::Kind_Function ) {
+ if ( prefix.isEmpty() ) {
+ if ( tag.name() == className )
+ prefix = constructorPrefix;
+ else if ( tag.name().startsWith( "~" ) )
+ prefix = destructorPrefix;
+ }
+ }
+
+ if ( tag.kind() == Tag::Kind_Class || tag.kind() == Tag::Kind_Function )
+ prefix = "";
+ }
+
+ e.comment = commentFromTag( type, tag );
+
+ if ( e.prefix.isEmpty() )
+ e.prefix = prefix;
+ else
+ e.prefix += " " + prefix;
+
+ e.prefix = e.prefix.stripWhiteSpace();
+ e.prefix = stringMult( depth, " " ) + e.prefix.stripWhiteSpace();
+
+ e.text = e.text.stripWhiteSpace();
+
+ if ( str != "private" )
+ entryList << e;
+ }
+}
+
+void CppCodeCompletion::computeCompletionEntryList( SimpleType type, QValueList< CodeCompletionEntry > & entryList, ClassDom klass, bool isInstance, int depth ) {
+ Debug d( "#cel#" );
+ if ( !safetyCounter || !d )
+ return ;
+
+ computeCompletionEntryList( type, entryList, klass->functionList(), isInstance, depth );
+
+ ///Find all function-definitions that have no functions. Those may be inlined functions and need to be treated too.
+ FunctionDefinitionList definitions = klass->functionDefinitionList();
+ FunctionList l;
+
+ QStringList classScope = klass->scope();
+ classScope << klass->name();
+
+ for ( FunctionDefinitionList::iterator it = definitions.begin(); it != definitions.end(); ++it ) {
+ FunctionList fl = klass->functionByName( ( *it ) ->name() );
+
+ ArgumentList args = ( *it ) ->argumentList();
+
+ if ( !l.isEmpty() ) {
+ bool matched = false;
+ for ( FunctionList::iterator it = fl.begin(); it != fl.end(); ++it ) {
+ ArgumentList fArgs = ( *it ) ->argumentList();
+ if ( fArgs.count() != args.count() )
+ continue;
+ ArgumentList::iterator it = args.begin();
+ ArgumentList::iterator it2 = fArgs.begin();
+ bool hit = true;
+ while ( it != args.end() ) {
+ if ( ( *it ) ->type() != ( *it2 ) ->type() ) {
+ hit = false;
+ break;
+ }
+ ++it;
+ ++it2;
+ }
+ if ( hit ) {
+ matched = true;
+ break;
+ }
+
+ }
+
+ if ( matched )
+ continue;
+ }
+
+ ///The function-definition belongs to some sub-class
+ if( (*it)->scope() != classScope && !(*it)->scope().isEmpty() ) continue;
+ l << ( FunctionModel* ) ( *it ).data();
+ }
+
+ if ( !l.isEmpty() )
+ computeCompletionEntryList( type, entryList, l, isInstance, depth );
+
+ if ( m_completionMode == NormalCompletion )
+ computeCompletionEntryList( type, entryList, klass->variableList(), isInstance, depth );
+
+ if ( !isInstance ) {
+ computeCompletionEntryList( klass->name(), type, entryList, klass->classList(), isInstance, depth );
+ computeCompletionEntryList( klass->name(), type, entryList, klass->typeAliasList(), isInstance, depth );
+ }
+
+ QValueList<LocateResult> parents = type->getBases( );
+
+ for ( QValueList<LocateResult>::Iterator it = parents.begin(); it != parents.end(); ++it ) {
+ if ( !( *it ) ->resolved() )
+ continue;
+
+ SimpleTypeImpl* i = ( *it ) ->resolved();
+ computeCompletionEntryList( i, entryList, i->scope(), isInstance, depth + 1 );
+ /*
+ SimpleTypeCodeModel* m = dynamic_cast<SimpleTypeCodeModel*> ( i );
+ if ( m ) {
+ ItemDom item = m->item();
+ ClassModel* kl = dynamic_cast<ClassModel*> ( &( *item ) );
+ if ( kl ) {
+ computeCompletionEntryList( SimpleType( ( *it ) ->resolved() ), entryList, ClassDom ( kl ), isInstance, depth + 1 );
+ }
+ }*/
+ }
+}
+
+void CppCodeCompletion::computeCompletionEntryList( SimpleType type, QValueList< CodeCompletionEntry > & entryList, NamespaceDom scope, bool isInstance, int depth ) {
+ Debug d( "#cel#" );
+ if ( !safetyCounter || !d )
+ return ;
+
+ CppCodeCompletionConfig * cfg = m_pSupport->codeCompletionConfig();
+
+ computeCompletionEntryList( type, entryList, ClassDom( scope.data() ), isInstance, depth );
+ if ( !isInstance )
+ computeCompletionEntryList( type, entryList, scope->namespaceList(), isInstance, depth );
+}
+
+void CppCodeCompletion::computeCompletionEntryList( QString parent, SimpleType type, QValueList< CodeCompletionEntry > & entryList, const ClassList & lst, bool isInstance, int depth ) {
+ Debug d( "#cel#" );
+ if ( !safetyCounter || !d )
+ return ;
+
+
+ ClassList::ConstIterator it = lst.begin();
+ while ( it != lst.end() ) {
+ ClassDom klass = *it;
+ ++it;
+
+ CodeCompletionEntry entry;
+ entry.prefix = "class";
+ entry.prefix = stringMult( depth, " " ) + entry.prefix.stripWhiteSpace();
+ entry.text = klass->name();
+ entry.comment = commentFromItem( type, klass.data() );
+ if ( isInstance )
+ continue;
+
+ entry.userdata = QString( "%1%2%3%4%5" ).arg( CodeModelItem::Public ).arg( depth ).arg( parent ).arg( 6 );
+
+ entryList << entry;
+
+
+ // if ( cfg->includeTypes() )
+ /*{
+ computeCompletionEntryList( type, entryList, klass->classList(), isInstance, depth );
+ }*/
+ }
+}
+
+void CppCodeCompletion::computeCompletionEntryList( QString parent, SimpleType type, QValueList< CodeCompletionEntry > & entryList, const TypeAliasList & lst, bool isInstance, int depth ) {
+ Debug d( "#cel#" );
+ if ( !safetyCounter || !d )
+ return ;
+
+
+ TypeAliasList::ConstIterator it = lst.begin();
+ while ( it != lst.end() ) {
+ TypeAliasDom klass = *it;
+ ++it;
+
+ CodeCompletionEntry entry;
+
+ LocateResult et = type->locateDecType( klass->type() );
+ if ( et )
+ entry.prefix = "typedef " + et->fullNameChain();
+ else
+ entry.prefix = "typedef " + klass->type();
+
+ entry.prefix = stringMult( depth, " " ) + entry.prefix.stripWhiteSpace();
+ entry.text = klass->name();
+ entry.comment = commentFromItem( type, klass.data() );
+ entry.userdata = QString( "%1%2%3%4%5" ).arg( CodeModelItem::Public ).arg( depth ).arg( parent ).arg( 5 );
+ entryList << entry;
+ }
+}
+void CppCodeCompletion::computeCompletionEntryList( SimpleType type, QValueList< CodeCompletionEntry > & entryList, const NamespaceList & lst, bool /*isInstance*/, int depth ) {
+ Debug d( "#cel#" );
+ if ( !safetyCounter || !d )
+ return ;
+
+ NamespaceList::ConstIterator it = lst.begin();
+ while ( it != lst.end() ) {
+ NamespaceDom scope = *it;
+ ++it;
+
+ CodeCompletionEntry entry;
+ entry.prefix = "namespace";
+ entry.prefix = stringMult( depth, " " ) + entry.prefix.stripWhiteSpace();
+ entry.text = scope->name();
+ entry.comment = commentFromItem( type, scope.data() );
+ entryList << entry;
+ }
+}
+
+void CppCodeCompletion::computeCompletionEntryList( SimpleType type, QValueList< CodeCompletionEntry > & entryList, const FunctionList & methods, bool isInstance, int depth ) {
+ Debug d( "#cel#" );
+ if ( !safetyCounter || !d )
+ return ;
+ QString className = type->desc().name();
+ bool isNs = type->isNamespace();
+
+ bool resolve = type->usingTemplates() && m_pSupport->codeCompletionConfig() ->processPrimaryTypes();
+
+ CompTypeProcessor proc( type, m_pSupport->codeCompletionConfig() ->processFunctionArguments() && type->usingTemplates() );
+
+ FunctionList::ConstIterator it = methods.begin();
+ while ( it != methods.end() ) {
+ FunctionDom meth = *it;
+ ++it;
+
+ if ( isInstance && meth->isStatic() )
+ continue;
+ else if ( m_completionMode == SignalCompletion && !meth->isSignal() )
+ continue;
+ else if ( m_completionMode == SlotCompletion && !meth->isSlot() )
+ continue;
+ else if ( m_completionMode == VirtualDeclCompletion && !meth->isVirtual() )
+ continue;
+
+ if ( !isInstance && !meth->isStatic() && !isNs )
+ continue;
+
+ CodeCompletionEntry entry;
+
+ entry.comment = commentFromItem( type, model_cast<ItemDom>( meth ) );
+
+ if ( ! resolve ) {
+ entry.prefix = meth->resultType();
+ } else {
+ QString tt = meth->resultType();
+ LocateResult t = type->locateDecType( tt );
+ if ( t ) {
+ entry.prefix = t->fullNameChain();
+ } else
+ entry.prefix = meth->resultType();
+ }
+
+ if ( entry.prefix.isEmpty() && meth->name() == className )
+ entry.prefix = constructorPrefix;
+ if ( entry.prefix.isEmpty() && meth->name().startsWith( "~" ) )
+ entry.prefix = destructorPrefix;
+
+ entry.prefix = stringMult( depth, " " ) + entry.prefix.stripWhiteSpace();
+ QString text;
+
+ ArgumentList args = meth->argumentList();
+ ArgumentList::Iterator argIt = args.begin();
+ /*
+ if ( m_completionMode == VirtualDeclCompletion )
+ {
+ //Ideally the type info would be a entry.prefix, but we need them to be
+ //inserted upon completion so they have to be part of entry.text
+ entry.text = meth->resultType();
+ entry.text += " ";
+ entry.text += meth->name();
+ }
+ else*/
+ entry.text = meth->name();
+
+ entry.text += formattedOpeningParenthesis( args.size() == 0 );
+
+ while ( argIt != args.end() ) {
+ ArgumentDom arg = *argIt;
+ ++argIt;
+
+ text += proc.processType( arg->type() );
+ if ( m_completionMode == NormalCompletion ||
+ m_completionMode == VirtualDeclCompletion )
+ text += QString( " " ) + arg->name();
+
+ if ( argIt != args.end() )
+ text += ", ";
+ }
+
+ if ( args.size() == 0 ) {
+ entry.text += formattedClosingParenthesis( true );
+ } else {
+ text += formattedClosingParenthesis( false );
+ }
+
+ int subSorting = 0;
+ if ( meth->isConstant() )
+ subSorting = 1;
+ if ( meth->isSlot() )
+ subSorting = 2;
+ if ( meth->isSignal() )
+ subSorting = 3;
+ if ( meth->isVirtual() )
+ subSorting = 4;
+ if ( meth->isStatic() )
+ subSorting = 5;
+
+ entry.userdata += QString( "%1%2%3%4%5" ).arg( meth->access() ).arg( depth ).arg( className ).arg( 1 ).arg( subSorting );
+
+ if ( m_completionMode == VirtualDeclCompletion )
+ entry.text += text + ";";
+ if ( m_completionMode != NormalCompletion )
+ entry.text += text;
+ else
+ entry.postfix = text;
+
+ if ( meth->isConstant() )
+ entry.postfix += " const";
+ if ( m_completionMode != SignalCompletion ) {
+ if ( !type->isNamespace() ) {
+ if ( meth->access() == CodeModelItem::Protected )
+ entry.postfix += "; (protected)"; // in " + type->fullType() + ")";
+ if ( meth->access() == CodeModelItem::Private )
+ entry.postfix += "; (private)"; // in " + type->fullType() + ")";
+ }
+ }
+
+ entry.text = entry.text.stripWhiteSpace();
+
+ entryList << entry;
+ }
+}
+
+void CppCodeCompletion::computeCompletionEntryList( SimpleType type, QValueList< CodeCompletionEntry > & entryList, const VariableList & attributes, bool isInstance, int depth ) {
+ Debug d( "#cel#" );
+ QString className = type->desc().name();
+ bool isNs = type->isNamespace();
+
+ if ( !safetyCounter || !d )
+ return ;
+
+ if ( m_completionMode != NormalCompletion )
+ return ;
+ bool resolve = type->usingTemplates() && m_pSupport->codeCompletionConfig() ->processPrimaryTypes();
+
+ VariableList::ConstIterator it = attributes.begin();
+ while ( it != attributes.end() ) {
+ VariableDom attr = *it;
+ ++it;
+
+ if ( isInstance && attr->isStatic() )
+ continue;
+ if ( !isInstance && !attr->isStatic() && !isNs )
+ continue;
+
+ CodeCompletionEntry entry;
+ entry.text = attr->name();
+ entry.comment = commentFromItem( type, model_cast<ItemDom>( attr ) );
+ entry.userdata += QString( "%1%2%3%4" ).arg( attr->access() ).arg( depth ).arg( className ).arg( 2 );
+
+
+ if ( !attr->isEnumeratorVariable() ) {
+ if ( ! resolve ) {
+ entry.prefix = attr->type();
+ } else {
+ QString tt = attr->type();
+ LocateResult t = type->locateDecType( tt );
+ //SimpleType t = type->typeOf( attr->name() );
+ if ( t )
+ entry.prefix = t->fullNameChain();
+ else
+ entry.prefix = attr->type();
+ }
+ } else {
+ entry.prefix = attr->type();
+ entry.userdata += attr->type(); ///Sort enumerators by their enum
+ }
+ if ( attr->access() == CodeModelItem::Protected )
+ entry.postfix += "; (protected)"; // in " + type->fullType() + ")";
+ if ( attr->access() == CodeModelItem::Private )
+ entry.postfix += "; (private)"; // in " + type->fullType() + ")";
+
+ entry.prefix = stringMult( depth, " " ) + entry.prefix.stripWhiteSpace();
+
+ entryList << entry;
+ }
+}
+
+void CppCodeCompletion::computeCompletionEntryList( QValueList< CodeCompletionEntry > & entryList, SimpleContext * ctx, bool /*isInstance*/, int depth ) {
+ Debug d( "#cel#" );
+ if ( !safetyCounter || !d )
+ return ;
+
+ while ( ctx ) {
+ QValueList<SimpleVariable> vars = ctx->vars();
+ QValueList<SimpleVariable>::ConstIterator it = vars.begin();
+ while ( it != vars.end() ) {
+ const SimpleVariable & var = *it;
+ ++it;
+
+ CodeCompletionEntry entry;
+ entry.prefix = var.type.fullNameChain();
+ entry.text = var.name;
+ entry.userdata = "000";
+ entry.comment = "Local variable";
+ entryList << entry;
+
+ }
+ ctx = ctx->prev();
+ }
+
+}
+
+EvaluationResult CppCodeCompletion::evaluateExpression( ExpressionInfo expr, SimpleContext* ctx ) {
+ safetyCounter.init();
+
+ //d->classNameList = typeNameList( m_pSupport->codeModel() );
+
+ CppEvaluation::ExpressionEvaluation obj( this, expr, AllOperators, getIncludeFiles(), ctx );
+
+ EvaluationResult res;
+ res = obj.evaluate();
+
+ QString resolutionType = "(resolved)";
+ if( !res->resolved() ) {
+ if( BuiltinTypes::isBuiltin( res.resultType ) ) {
+ resolutionType = "(builtin " + BuiltinTypes::comment( res.resultType ) + ")";
+ } else {
+ resolutionType = "(unresolved)";
+ }
+ }
+
+ addStatusText( i18n( "Type of \"%1\" is \"%2\", %3" ).arg( expr.expr() ).arg( res->fullNameChain() ).arg( resolutionType ), 5000 );
+
+ return res;
+}
+
+void CppCodeCompletion::computeFileEntryList( ) {
+ m_fileEntryList.clear();
+
+ QStringList fileList = m_pSupport->project() ->allFiles();
+ for ( QStringList::Iterator it = fileList.begin(); it != fileList.end(); ++it ) {
+ if ( !m_pSupport->isHeader( *it ) )
+ continue;
+
+ CodeCompletionEntry entry;
+ entry.text = QFileInfo( *it ).fileName();
+
+ m_fileEntryList.push_back( entry );
+ }
+
+ m_fileEntryList = unique( m_fileEntryList );
+}
+
+HashedStringSet CppCodeCompletion::getIncludeFiles( const QString& fi ) {
+ QString file = fi;
+ if( file.isEmpty() )
+ file = m_activeFileName;
+
+ FileDom f = m_pSupport->codeModel() ->fileByName( file );
+ if( f ) {
+ ParseResultPointer p = f->parseResult();
+ if( p ) {
+ ParsedFilePointer pp = dynamic_cast<ParsedFile*>( p.data() );
+ if( pp ) {
+ return pp->includeFiles();
+ }
+ }
+ }
+ return HashedStringSet();
+}
+
+void CppCodeCompletion::slotJumpToDeclCursorContext()
+{
+ kdDebug(9007) << k_funcinfo << endl;
+ jumpCursorContext( Declaration );
+}
+
+void CppCodeCompletion::slotJumpToDefCursorContext()
+{
+ kdDebug(9007) << k_funcinfo << endl;
+ jumpCursorContext( Definition );
+}
+
+void CppCodeCompletion::jumpCursorContext( FunctionType f )
+{
+ if ( !m_activeCursor ) return;
+
+ SimpleTypeConfiguration conf( m_activeFileName );
+
+ unsigned int line;
+ unsigned int column;
+ m_activeCursor->cursorPositionReal( &line, &column );
+
+ EvaluationResult result = evaluateExpressionAt( line, column, conf );
+
+ // Determine the declaration info based on the type of item we are dealing with.
+ DeclarationInfo d;
+
+ QString includeFileName, includeFilePath;
+ bool unused;
+
+ if ( result.isMacro ) {
+ d.name = result.macro.name();
+ d.file = result.macro.fileName();
+ d.startLine = d.endLine = result.macro.line();
+ d.startCol = d.endCol = result.macro.column();
+ } else if ( getIncludeInfo( line, includeFileName, includeFilePath, unused ) ) {
+ d.name = includeFileName;
+ d.file = includeFilePath;
+ } else {
+ d = result.sourceVariable;
+ }
+ if ( !d ) {
+ LocateResult type = result.resultType;
+ if ( type && type->resolved() ) {
+ // Is it a namespace?
+ if ( type->resolved()->isNamespace() ) {
+ SimpleTypeCachedNamespace * ns = dynamic_cast<SimpleTypeCachedNamespace*>( type->resolved().data() );
+ if ( ns ) {
+ SimpleTypeNamespace::SlaveList slaves = ns->getSlaves( getIncludeFiles() );
+ if ( slaves.begin() != slaves.end() ) {
+ SimpleTypeCachedCodeModel * item = dynamic_cast<SimpleTypeCachedCodeModel*>( ( *slaves.begin() ).first.first.resolved().data() );
+ if ( item && item->item() && item->item()->isNamespace() ) {
+ NamespaceModel* ns = dynamic_cast<NamespaceModel*>( item->item().data() );
+ QStringList wholeScope = ns->scope();
+ wholeScope << ns->name();
+ FileList files = cppSupport()->codeModel()->fileList();
+ for ( FileList::iterator it = files.begin(); it != files.end(); ++it ) {
+ NamespaceModel* ns = (*it).data();
+ for ( QStringList::iterator it2 = wholeScope.begin(); it2 != wholeScope.end(); ++it2 ) {
+ if ( ns->hasNamespace( (*it2) ) ) {
+ ns = ns->namespaceByName( *it2 );
+ if ( !ns ) break;
+ } else {
+ ns = 0;
+ break;
+ }
+ }
+ if ( ns ) {
+ d.name = ns->name();
+ ns->getStartPosition( &d.startLine, &d.startCol );
+ ns->getEndPosition( &d.endLine, &d.endCol );
+ d.file = ns->fileName();
+ break;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ // Not a namespace, we can get the declaration info straight from the type description.
+ d = type->resolved()->getDeclarationInfo();
+ }
+ }
+ // Unresolved, maybe its a named enumeration?
+ else if ( type && type.trace() ) {
+ QValueList< QPair<SimpleTypeImpl::MemberInfo, TypeDesc> > trace = type.trace()->trace();
+ if ( !trace.isEmpty() ) {
+ if ( trace.begin() != trace.end() ) {
+ d = ( *trace.begin() ).first.decl;
+ }
+ }
+ }
+ }
+ if ( d ) {
+ QString fileName = d.file == "current_file" ? m_activeFileName : d.file.operator QString();
+ if ( f == Definition && cppSupport()->switchHeaderImpl( fileName, d.startLine, d.startCol ) )
+ return;
+ cppSupport()->partController()->editDocument( fileName, d.startLine );
+ }
+}
+
+QString CppCodeCompletion::createTypeInfoString( int line, int column )
+{
+ QString typeInfoString;
+
+ SimpleTypeConfiguration conf( m_activeFileName );
+ EvaluationResult type = evaluateExpressionAt( line, column, conf );
+
+ if ( type.expr.expr().stripWhiteSpace().isEmpty() )
+ return typeInfoString;
+
+ typeInfoString += type.expr.expr() + QString(" : " );
+
+ if ( type->resolved() )
+ {
+ QString scope = type->resolved()->scope().join("::");
+ int pos = scope.findRev("::");
+ if ( scope.isEmpty() || pos == -1 )
+ {
+ scope = "::";
+ }
+ else
+ {
+ scope.truncate( pos + 2 );
+ }
+
+ typeInfoString += scope + type->fullNameChain() + QString( i18n(" (resolved) ") );
+ }
+ else
+ {
+ if ( type )
+ {
+ if( !BuiltinTypes::isBuiltin( type.resultType ) )
+ {
+ typeInfoString += type->fullNameChain() + QString( i18n(" (unresolved) ") );
+ }
+ else
+ {
+ typeInfoString += type->fullNameChain() + ", " + BuiltinTypes::comment( type.resultType ) + QString( i18n(" (builtin type) ") );
+ }
+ }
+ else
+ {
+ typeInfoString += QString( i18n(" (unresolved) ") );
+ }
+ }
+
+ if( cppSupport() && type->resolved() && cppSupport()->codeCompletionConfig()->preProcessAllHeaders() ) {
+ DeclarationInfo decl = type->resolved()->getDeclarationInfo();
+ if( !getIncludeFiles()[ HashedString( decl.file ) ] ) {
+ typeInfoString += " [header not included] ";
+ }
+ }
+
+ return typeInfoString;
+}
+
+bool CppCodeCompletion::getIncludeInfo( int line, QString& includeFileName, QString& includeFilePath, bool& usedProjectFiles )
+{
+ bool isIncludeDirective = false;
+ QString lineText = getText( line, 0, line+1, 0 );
+ QRegExp includeRx( "(?:#include[\\s]*(?:\\\"|\\<))([^\\n]*)(\\\"|\\>)" );
+ if( includeRx.search( lineText ) != -1 ) {
+ //It is an include-directive. The regular expression captures the string, and the closing sign('"' or '>').
+ isIncludeDirective = true;
+ usedProjectFiles = false;
+ QStringList captured = includeRx.capturedTexts();
+ if( captured.size() == 3 ) {
+ Dependence d;
+ d.first = captured[1];
+ d.second = captured[2] == "\"" ? Dep_Local : Dep_Global;
+ includeFilePath = cppSupport()->driver()->findIncludeFile( d, activeFileName() );
+ if( includeFilePath.isEmpty() ) {
+ //A simple backup-algorithm that can only find files within the same project
+ includeFilePath = cppSupport()->findHeaderSimple( d.first );
+ usedProjectFiles = true;
+ }
+ includeFileName = d.first;
+ } else {
+ kdDebug( 9007 ) << "wrong count of captured items" << endl;
+ }
+ }
+ return isIncludeDirective;
+}
+
+
+#include "cppcodecompletion.moc"
+//kate: indent-mode csands; tab-width 2; space-indent off;
+
diff --git a/languages/cpp/cppcodecompletion.h b/languages/cpp/cppcodecompletion.h
new file mode 100644
index 00000000..0eb49908
--- /dev/null
+++ b/languages/cpp/cppcodecompletion.h
@@ -0,0 +1,324 @@
+/***************************************************************************
+ cppcodecompletion.h - description
+ -------------------
+ begin : Sat Jul 21 2001
+ copyright : (C) 2001 by Victor R�er
+ email : victor_roeder@gmx.de
+ copyright : (C) 2002,2003 by Roberto Raggi
+ email : roberto@kdevelop.org
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __CPPCODECOMPLETION_H__
+#define __CPPCODECOMPLETION_H__
+
+#include "cppsupportpart.h"
+#include "declarationinfo.h"
+
+#include <ast.h>
+#include <codemodel.h>
+#include <set>
+
+#include <ktexteditor/viewcursorinterface.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/codecompletioninterface.h>
+#include <ktexteditor/texthintinterface.h>
+#include <ktexteditor/cursorinterface.h>
+#include <ktexteditor/view.h>
+
+#include <qobject.h>
+#include <qmutex.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+#include <qguardedptr.h>
+#include <qregexp.h>
+
+#include "driver.h"
+///A little debugging class
+#include <qpopupmenu.h>
+class PopupTracker : public QObject {
+ Q_OBJECT
+public:
+ static PopupTracker* pt;
+
+ static uint pendingPopups;
+
+ static QPopupMenu* createPopup( QWidget* parent ) {
+ if( !pt ) pt = new PopupTracker();
+ QPopupMenu* m = new QPopupMenu( parent );
+ ++pendingPopups;
+ connect( m, SIGNAL(destroyed()), pt, SLOT(destroyedPopup()) );
+ return m;
+ }
+
+ static void print() {
+ if( pendingPopups )
+ kdDebug( 9007 ) << "PopupTracker: " << pendingPopups << " popups are still alive" << endl;
+ }
+
+public slots:
+ void destroyedPopup() {
+ --pendingPopups;
+ }
+};
+
+
+class CodeCompletionEntry;
+class CodeInformationRepository;
+class SimpleContext;
+class SimpleType;
+class SimpleTypeNamespace;
+class CppCodeCompletionData;
+class SimpleTypeConfiguration;
+class TypeDesc;
+struct PopupFillerHelpStruct;
+struct PopupClassViewFillerHelpStruct;
+class SimpleTypeImpl;
+class TranslationUnitAST;
+namespace CppEvaluation
+{
+ class EvaluationResult;
+}
+struct ExpressionInfo;
+
+typedef KSharedPtr<SimpleTypeImpl> TypePointer;
+
+class CppCodeCompletion : public QObject
+{
+ Q_OBJECT
+public:
+ friend class SimpleType;
+ enum CompletionMode
+ {
+ NormalCompletion,
+ SignalCompletion,
+ SlotCompletion,
+ VirtualDeclCompletion
+ };
+ enum MemberAccessOp
+ {
+ NoOp,
+ DotOp,
+ ArrowOp
+ };
+
+public:
+ CppCodeCompletion( CppSupportPart* part );
+ virtual ~CppCodeCompletion();
+
+ CodeInformationRepository* repository()
+ {
+ return m_repository;
+ }
+ CompletionMode completionMode() const
+ {
+ return m_completionMode;
+ }
+
+ QString createTypeInfoString( int line, int column );
+
+ QString replaceCppComments( const QString& contents );
+ int expressionAt( const QString& text, int index );
+ QStringList splitExpression( const QString& text );
+
+ CppEvaluation::EvaluationResult evaluateExpression( ExpressionInfo expr, SimpleContext* ctx );
+
+ CppEvaluation::EvaluationResult evaluateExpressionAt( int line, int column, SimpleTypeConfiguration& conf, bool ifUnknownSetType = false );
+
+ void contextEvaluationMenus ( QPopupMenu *popup, const Context *context, int line, int col );
+
+ CppSupportPart* cppSupport() const;
+
+ HashedStringSet getIncludeFiles( const QString& file = QString() );
+
+ static CppCodeCompletion* instance() {
+ return m_instance;
+ }
+
+ ///Adds a string that will be ticked through the status-bar
+ void addStatusText( QString text, int timeout );
+ void clearStatusText();
+
+ QString activeFileName() const {
+ return m_activeFileName;
+ }
+
+public slots:
+ /**
+ * @param invokedOnDemand if true and there is exactly one matching entry
+ * complete the match immediately without showing the completion box.
+ * This is only true, when the users invokes the completion himself
+ * (eg presses the completion shortcut CTRL+space)
+ */
+ void completeText( bool invokedOnDemand = false );
+private slots:
+ void emptyCache();
+ void slotPartAdded( KParts::Part *part );
+ void slotActivePartChanged( KParts::Part *part );
+ void slotArgHintHidden();
+ void slotCompletionBoxHidden();
+ void slotTextChanged();
+ void slotFileParsed( const QString& fileName );
+ void slotCodeModelUpdated( const QString& fileName );
+ void slotTimeout();
+ void slotStatusTextTimeout();
+ void computeFileEntryList();
+ bool isTypeExpression( const QString& expr );
+ void slotTextHint( int line, int col, QString &text );
+ void popupAction( int number );
+ void popupDefinitionAction( int number );
+ void popupClassViewAction( int number );
+ void synchronousParseReady( const QString& file, ParsedFilePointer unit );
+ void slotJumpToDefCursorContext();
+ void slotJumpToDeclCursorContext();
+
+private:
+ enum FunctionType { Declaration, Definition };
+
+ TypePointer createGlobalNamespace();
+ bool functionContains( FunctionDom f , int line, int col );
+ void getFunctionBody( FunctionDom f , int& line, int& col );
+ void selectItem( ItemDom item );
+ void addTypePopups( QPopupMenu* parent, TypeDesc d, QString depthAdd, QString prefix = "" );
+ void addTypeClassPopups( QPopupMenu* parent, TypeDesc d, QString depthAdd, QString prefix = "" );
+ QValueList<QStringList> computeSignatureList( CppEvaluation::EvaluationResult function );
+ void integratePart( KParts::Part* part );
+ void setupCodeInformationRepository();
+ FunctionDefinitionAST* functionDefinition( AST* node );
+ void computeRecoveryPoints( ParsedFilePointer unit );
+ void computeRecoveryPointsLocked();
+ void jumpCursorContext( FunctionType );
+ bool getIncludeInfo( int line, QString& includeFileName, QString& includeFilePath, bool& usedProjectFiles );
+
+ enum EvaluateExpressionOptions {
+ IncludeStandardExpressions = 1,
+ IncludeTypeExpression = 2,
+ CompletionOption = 4, ///Cut off the last word because it is incomplete
+ SearchInFunctions = 8,
+ SearchInClasses = 16,
+ DefaultAsTypeExpression = 32, ///This makes the evaluation interpret any unidentified expression as a type-expression
+ DefaultEvaluationOptions = 1 | 2 | 8 | 16,
+ DefaultCompletionOptions = 1 | 4 | 8 | 16
+ };
+
+ bool mayBeTypeTail( int line, int column, QString& append, bool inFunction = false );
+ bool canBeTypePrefix( const QString& prefix, bool inFunction = false );
+
+
+ ExpressionInfo findExpressionAt( int line, int col, int startLine, int startCol, bool inFunction = false );
+ SimpleContext* computeFunctionContext( FunctionDom f, int line, int col, SimpleTypeConfiguration& conf );
+
+ CppEvaluation::EvaluationResult evaluateExpressionType( int line, int column, SimpleTypeConfiguration& conf, EvaluateExpressionOptions opt = DefaultCompletionOptions );
+ SimpleType unTypeDef( SimpleType scope , QMap<QString, QString>& typedefs );
+
+ // QString buildSignature( TypePointer currType );
+ SimpleType typeOf( QValueList<Tag>& tags, MemberAccessOp accessOp );
+
+ /// @todo remove isInstance
+ void computeCompletionEntryList( QValueList<CodeCompletionEntry>& entryList, SimpleContext* ctx, bool isInstance, int depth = 0 );
+ void computeCompletionEntryList( SimpleType type, QValueList<CodeCompletionEntry>&
+ entryList, const QStringList& typeList, SimpleTypeNamespace* ns, std::set<HashedString>& ignore, bool isInstance, int depth = 0 );
+ void computeCompletionEntryList( SimpleType type, QValueList<CodeCompletionEntry>&
+ entryList, const QStringList& typeList, bool isInstance, int depth = 0 );
+ void computeCompletionEntryList( SimpleType type, QValueList<CodeCompletionEntry>& entryList, QValueList<Tag>& tags, bool isInstance, int depth );
+ void computeCompletionEntryList( SimpleType type, QValueList<CodeCompletionEntry>& entryList, ClassDom klass, bool isInstance, int depth );
+ void computeCompletionEntryList( SimpleType type, QValueList<CodeCompletionEntry>& entryList, NamespaceDom scope, bool isInstance, int depth );
+ void computeCompletionEntryList( SimpleType type, QValueList<CodeCompletionEntry>& entryList, const FunctionList& methods, bool isInstance, int depth );
+ void computeCompletionEntryList( SimpleType type, QValueList<CodeCompletionEntry>& entryList, const VariableList& attributes, bool isInstance, int depth );
+ void computeCompletionEntryList( QString parent, SimpleType type, QValueList<CodeCompletionEntry>& entryList, const ClassList& lst, bool isInstance, int depth );
+ void computeCompletionEntryList( QString parent, SimpleType type, QValueList<CodeCompletionEntry>& entryList, const TypeAliasList& lst, bool isInstance, int depth );
+ void computeCompletionEntryList( SimpleType type, QValueList<CodeCompletionEntry>& entryList, const NamespaceList& lst, bool isInstance, int depth );
+
+ SimpleContext* computeContext( FunctionDefinitionAST* ast, int line, int col, int lineOffset, int colOffset );
+ void computeContext( SimpleContext*& ctx, StatementAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, StatementListAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, IfStatementAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, ForStatementAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, DoStatementAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, WhileStatementAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, SwitchStatementAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, TryBlockStatementAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, CatchStatementListAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, CatchStatementAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, DeclarationStatementAST* ast, int line, int col );
+ void computeContext( SimpleContext*& ctx, ConditionAST* ast, int line, int col );
+ bool inContextScope( AST* ast, int line, int col, bool checkStart = true, bool checkEnd = true );
+
+ QString getText( int startLine, int startColumn, int endLine, int endColumn, int omitLine = -1 );
+
+
+private:
+
+ friend class SimpleTypeCatalog;
+ friend class SimpleTypeCodeModel;
+ friend class SimpleTypeImpl;
+ friend class ExpressionEvaluation;
+ friend class PopupFillerHelpStruct;
+ friend class PopupClassViewFillerHelpStruct;
+ QGuardedPtr<CppSupportPart> m_pSupport;
+ QTimer* m_ccTimer;
+ QTimer* m_showStatusTextTimer;
+ QValueList<QPair<int, QString> > m_statusTextList;
+
+ void fitContextItem( int nLine, int nColumn );
+ void needRecoveryPoints();
+
+ QString m_activeFileName;
+ KTextEditor::ViewCursorInterface* m_activeCursor;
+ KTextEditor::EditInterface* m_activeEditor;
+ KTextEditor::TextHintInterface* m_activeHintInterface;
+ KTextEditor::CodeCompletionInterface* m_activeCompletion;
+ KTextEditor::View* m_activeView;
+
+ bool m_bArgHintShow;
+ bool m_bCompletionBoxShow;
+ bool m_blockForKeyword;
+ bool m_demandCompletion;
+
+ unsigned int m_ccLine;
+ unsigned int m_ccColumn;
+ static CppCodeCompletion* m_instance;
+
+ CodeInformationRepository* m_repository;
+ CppCodeCompletionData* d;
+ CompletionMode m_completionMode;
+
+ QTime m_lastHintTime;
+
+ //If more then the given count of comments were requested, all following ones will be blank.(Performance-reasons)
+ void setMaxComments( int count );
+
+ QString commentFromItem( const SimpleType& parent, const ItemDom& item );
+ QString commentFromTag( const SimpleType& parent, Tag& tag );
+
+ ItemDom m_cachedFromContext; ///Can be a function or a class, representing the position from where the last completion was started. Necessary as long as all imports are put into the global namespace.
+
+ QRegExp m_includeRx;
+ QRegExp m_cppCodeCommentsRx;
+ QRegExp m_codeCompleteChRx;
+ QRegExp m_codeCompleteCh2Rx;
+ QValueList<KTextEditor::CompletionEntry> m_fileEntryList;
+
+ int m_maxComments;
+
+ typedef QMap<int, DeclarationInfo> PopupActions;
+ typedef QMap<int, ItemDom> PopupClassViewActions;
+ PopupActions m_popupActions;
+ PopupActions m_popupDefinitionActions;
+ PopupClassViewActions m_popupClassViewActions;
+
+ // we need something to plug actions that are not in any menu
+ // into in order for their shortcuts to work
+ QWidget m_DummyActionWidget;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/cppcodecompletionconfig.cpp b/languages/cpp/cppcodecompletionconfig.cpp
new file mode 100644
index 00000000..2c394858
--- /dev/null
+++ b/languages/cpp/cppcodecompletionconfig.cpp
@@ -0,0 +1,151 @@
+//
+//
+// C++ Implementation: $MODULE$
+//
+// Description:
+//
+//
+// Author: Roberto Raggi <robertol@kdevelop.org>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "cppcodecompletionconfig.h"
+#include "cppsupportpart.h"
+
+#include <domutil.h>
+
+#include <kdebug.h>
+#include <qdom.h>
+
+QString CppCodeCompletionConfig::defaultPath = QString::fromLatin1( "/kdevcppsupport/codecompletion" );
+
+CppCodeCompletionConfig::CppCodeCompletionConfig( CppSupportPart * part, QDomDocument* dom )
+ : QObject( part ), m_part( part ), m_dom( dom )
+{
+ init();
+}
+
+CppCodeCompletionConfig::~CppCodeCompletionConfig()
+{}
+
+void CppCodeCompletionConfig::init( )
+{
+/* m_includeGlobalFunctions = DomUtil::readBoolEntry( *m_dom, defaultPath + "/includeGlobalFunctions", true );
+ m_includeTypes = DomUtil::readBoolEntry( *m_dom, defaultPath + "/includeTypes", true );
+ m_includeEnums = DomUtil::readBoolEntry( *m_dom, defaultPath + "/includeEnums", true );
+ m_includeTypedefs = DomUtil::readBoolEntry( *m_dom, defaultPath + "/includeTypedefs", false );*/
+ m_automaticCodeCompletion = DomUtil::readBoolEntry( *m_dom, defaultPath + "/automaticCodeCompletion", false );
+ m_automaticArgumentsHint = DomUtil::readBoolEntry( *m_dom, defaultPath + "/automaticArgumentsHint", true );
+ m_automaticHeaderCompletion = DomUtil::readBoolEntry( *m_dom, defaultPath + "/automaticHeaderCompletion", true );
+ m_codeCompletionDelay = DomUtil::readIntEntry( *m_dom, defaultPath + "/codeCompletionDelay", 250 );
+ m_argumentsHintDelay = DomUtil::readIntEntry( *m_dom, defaultPath + "/argumentsHintDelay", 400 );
+ m_headerCompletionDelay = DomUtil::readIntEntry( *m_dom, defaultPath + "/headerCompletionDelay", 250 );
+
+ m_showOnlyAccessibleItems = DomUtil::readBoolEntry( *m_dom, defaultPath + "/showOnlyAccessibleItems", false );
+ m_completionBoxItemOrder = (CompletionBoxItemOrder)DomUtil::readIntEntry( *m_dom, defaultPath + "/completionBoxItemOrder", ByAccessLevel );
+ m_showEvaluationContextMenu = DomUtil::readBoolEntry( *m_dom, defaultPath + "/howEvaluationContextMenu", true );
+ m_showCommentWithArgumentHint = DomUtil::readBoolEntry( *m_dom, defaultPath + "/showCommentWithArgumentHint", true );
+ m_statusBarTypeEvaluation = DomUtil::readBoolEntry( *m_dom, defaultPath + "/statusBarTypeEvaluation", false );
+ m_namespaceAliases = DomUtil::readEntry( *m_dom, defaultPath + "/namespaceAliases", "std=_GLIBCXX_STD;__gnu_cxx=std" );
+ m_processPrimaryTypes = DomUtil::readBoolEntry( *m_dom, defaultPath + "/processPrimaryTypes", true );
+ m_processFunctionArguments = DomUtil::readBoolEntry( *m_dom, defaultPath + "/processFunctionArguments", false );
+
+ m_preProcessAllHeaders = DomUtil::readBoolEntry( *m_dom, defaultPath + "/preProcessAllHeaders", false );
+ m_parseMissingHeaders = DomUtil::readBoolEntry( *m_dom, defaultPath + "/parseMissingHeadersExperimental", false );
+ m_resolveIncludePaths = DomUtil::readBoolEntry( *m_dom, defaultPath + "/resolveIncludePathsUsingMakeExperimental", false );
+ m_alwaysParseInBackground = DomUtil::readBoolEntry( *m_dom, defaultPath + "/alwaysParseInBackground", true );
+ m_usePermanentCaching = DomUtil::readBoolEntry( *m_dom, defaultPath + "/usePermanentCaching", true );
+ m_alwaysIncludeNamespaces = DomUtil::readBoolEntry( *m_dom, defaultPath + "/alwaysIncludeNamespaces", false );
+ m_includePaths = DomUtil::readEntry( *m_dom, defaultPath + "/includePaths", ".;" );
+
+
+}
+
+void CppCodeCompletionConfig::store( )
+{
+/* DomUtil::writeBoolEntry( *m_dom, defaultPath + "/includeGlobalFunctions", m_includeGlobalFunctions );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/includeTypes", m_includeTypes );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/includeEnums", m_includeEnums );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/includeTypedefs", m_includeTypedefs );*/
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/automaticCodeCompletion", m_automaticCodeCompletion );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/automaticArgumentsHint", m_automaticArgumentsHint );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/automaticHeaderCompletion", m_automaticHeaderCompletion );
+ DomUtil::writeIntEntry( *m_dom, defaultPath + "/codeCompletionDelay", m_codeCompletionDelay );
+ DomUtil::writeIntEntry( *m_dom, defaultPath + "/argumentsHintDelay", m_argumentsHintDelay );
+ DomUtil::writeIntEntry( *m_dom, defaultPath + "/headerCompletionDelay", m_headerCompletionDelay );
+
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/showOnlyAccessibleItems", m_showOnlyAccessibleItems );
+ DomUtil::writeIntEntry( *m_dom, defaultPath + "/completionBoxItemOrder", m_completionBoxItemOrder );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/howEvaluationContextMenu", m_showEvaluationContextMenu );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/showCommentWithArgumentHint", m_showCommentWithArgumentHint );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/statusBarTypeEvaluation", m_statusBarTypeEvaluation );
+ DomUtil::writeEntry( *m_dom, defaultPath + "/namespaceAliases", m_namespaceAliases );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/processPrimaryTypes", m_processPrimaryTypes );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/processFunctionArguments", m_processFunctionArguments );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/preProcessAllHeaders", m_preProcessAllHeaders );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/parseMissingHeadersExperimental", m_parseMissingHeaders );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/resolveIncludePathsUsingMakeExperimental", m_resolveIncludePaths );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/alwaysParseInBackground", m_alwaysParseInBackground );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/usePermanentCaching", m_usePermanentCaching );
+ DomUtil::writeBoolEntry( *m_dom, defaultPath + "/alwaysIncludeNamespaces", m_alwaysIncludeNamespaces );
+ DomUtil::writeEntry( *m_dom, defaultPath + "/includePaths", m_includePaths );
+
+ emit stored();
+}
+
+// void CppCodeCompletionConfig::setIncludeTypes( bool b )
+// {
+// m_includeTypes = b;
+// }
+//
+// void CppCodeCompletionConfig::setIncludeEnums( bool b )
+// {
+// m_includeEnums = b;
+// }
+//
+// void CppCodeCompletionConfig::setIncludeTypedefs( bool b )
+// {
+// m_includeTypedefs = b;
+// }
+
+void CppCodeCompletionConfig::setAutomaticCodeCompletion( bool b )
+{
+ m_automaticCodeCompletion = b;
+}
+
+void CppCodeCompletionConfig::setAutomaticArgumentsHint( bool b )
+{
+ m_automaticArgumentsHint = b;
+}
+
+void CppCodeCompletionConfig::setCodeCompletionDelay( int delay )
+{
+ m_codeCompletionDelay = delay;
+}
+
+void CppCodeCompletionConfig::setArgumentsHintDelay( int delay )
+{
+ m_argumentsHintDelay = delay;
+}
+
+// void CppCodeCompletionConfig::setIncludeGlobalFunctions( bool b )
+// {
+// m_includeGlobalFunctions = b;
+// }
+
+void CppCodeCompletionConfig::setHeaderCompletionDelay( int delay )
+{
+ m_headerCompletionDelay = delay;
+}
+
+void CppCodeCompletionConfig::setAutomaticHeaderCompletion( bool b )
+{
+ m_automaticHeaderCompletion = b;
+}
+
+bool CppCodeCompletionConfig::showNamespaceAppearances() const {
+ return true;
+}
+
+#include "cppcodecompletionconfig.moc"
diff --git a/languages/cpp/cppcodecompletionconfig.h b/languages/cpp/cppcodecompletionconfig.h
new file mode 100644
index 00000000..13b23ccf
--- /dev/null
+++ b/languages/cpp/cppcodecompletionconfig.h
@@ -0,0 +1,310 @@
+//
+//
+// C++ Interface: $MODULE$
+//
+// Description:
+//
+//
+// Author: Roberto Raggi <robertol@kdevelop.org>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef CPPCODECOMPLETIONCONFIG_H
+#define CPPCODECOMPLETIONCONFIG_H
+
+#include <qobject.h>
+
+class CppSupportPart;
+class QDomDocument;
+
+
+/**
+@author Roberto Raggi
+*/
+class CppCodeCompletionConfig : public QObject
+{
+ Q_OBJECT
+public:
+ CppCodeCompletionConfig( CppSupportPart* part, QDomDocument* dom );
+ virtual ~CppCodeCompletionConfig();
+
+// bool includeGlobalFunctions() const
+// {
+// return m_includeGlobalFunctions;
+// }
+//
+// void setIncludeGlobalFunctions( bool b );
+//
+// bool includeTypes() const
+// {
+// return m_includeTypes;
+// }
+//
+// void setIncludeTypes( bool b );
+//
+// bool includeEnums() const
+// {
+// return m_includeEnums;
+// }
+//
+// void setIncludeEnums( bool b );
+//
+// bool includeTypedefs() const
+// {
+// return m_includeTypedefs;
+// }
+//
+// void setIncludeTypedefs( bool b );
+
+ enum CompletionBoxItemOrder {
+ ByAccessLevel,
+ ByClass,
+ ByAlphabet
+ };
+
+ ///Whether the completion-cache should be kept alive as long as the context does not change
+ bool usePermanentCaching() const {
+ return m_usePermanentCaching;
+ }
+
+ void setUsePermanentCaching(bool b) {
+ m_usePermanentCaching = b;
+ }
+
+ ///Whether higher namespaces(like the global one) should be included while computing the
+ ///completion-list when using automatic code-completion. Should get an option in the interface(slows down the completion).
+ bool alwaysIncludeNamespaces() const {
+ return m_alwaysIncludeNamespaces;
+ }
+
+ void setAlwaysIncludeNamespaces(bool b) {
+ m_alwaysIncludeNamespaces = b;
+ }
+
+ ///Whether all included headers should be processed by the preprocessor(makes macros work across header-files)
+ void setPreProcessAllHeaders(bool b) {
+ m_preProcessAllHeaders = b;
+ }
+
+ ///Whether headers that were found and were not yet parsed in their active state should be parsed into the code-model
+ void setParseMissingHeaders(bool b) {
+ m_parseMissingHeaders = b;
+ }
+
+ ///Additional include-paths defined by the user
+ void setCustomIncludePaths(QString str) {
+ m_includePaths = str;
+ }
+
+ ///Whether we should try to automatically find out the used include-path from Makefiles etc.
+ void setResolveIncludePaths(bool b) {
+ m_resolveIncludePaths = b;
+ }
+
+ ///Whether higher namespaces(like the global one) should be included while computing the
+ ///completion-list when using automatic code-completion. Should get an option in the interface(slows down the completion).
+
+ ///Whether all included headers should be processed by the preprocessor(makes macros work across header-files)
+ bool preProcessAllHeaders() const {
+ return m_preProcessAllHeaders;
+ }
+
+ ///Whether headers that were found and were not yet parsed in their active state should be parsed into the code-model
+ bool parseMissingHeaders() const {
+ return m_parseMissingHeaders;
+ }
+
+ ///Additional include-paths defined by the user
+ QString customIncludePaths() const {
+ return m_includePaths;
+ }
+
+ ///Whether we should try to automatically find out the used include-path from Makefiles etc.
+ bool resolveIncludePaths() const {
+ return m_resolveIncludePaths;
+ }
+
+ bool alwaysParseInBackground() const {
+ return m_alwaysParseInBackground;
+ }
+
+ void setAlwaysParseInBackground(bool b) {
+ m_alwaysParseInBackground = b;
+ }
+
+ bool showNamespaceAppearances() const;
+
+ bool showOnlyAccessibleItems() const {
+ ///not yet used
+ return m_showOnlyAccessibleItems;
+ }
+
+ CompletionBoxItemOrder completionBoxItemOrder() const {
+ ///not yet used
+ return m_completionBoxItemOrder;
+ }
+
+ bool showEvaluationContextMenu() const {
+ ///used
+ return m_showEvaluationContextMenu;
+ }
+
+ bool showCommentWithArgumentHint() const {
+ ///used
+ return m_showCommentWithArgumentHint;
+ }
+
+ bool statusBarTypeEvaluation() const {
+ ///used
+ return m_statusBarTypeEvaluation;
+ }
+
+ QString namespaceAliases() const {
+ ///used
+ return m_namespaceAliases;
+ }
+
+ bool processPrimaryTypes() const { ///The "do complete return-type-evaluation" entry. However it should be renamed, because it also covers Variable-types and typedefs!
+ ///used
+ return m_processPrimaryTypes;
+ }
+
+ bool processFunctionArguments() const { ///The "do complete argument-type-evaluation" entry
+ ///used
+ return m_processFunctionArguments;
+ }
+
+
+ void setShowOnlyAccessibleItems( bool b ) {
+ ///not yet used
+ m_showOnlyAccessibleItems = b;
+ }
+
+ void setCompletionBoxItemOrder( CompletionBoxItemOrder b ) {
+ ///not yet used
+ m_completionBoxItemOrder = b;
+ }
+
+ void setShowEvaluationContextMenu( bool b ) {
+ ///used
+ m_showEvaluationContextMenu = b;
+ }
+
+ void setShowCommentWithArgumentHint( bool b ) {
+ ///used
+ m_showCommentWithArgumentHint = b;
+ }
+
+ void setStatusBarTypeEvaluation( bool b ) {
+ ///used
+ m_statusBarTypeEvaluation = b;
+ }
+
+ void setNamespaceAliases( QString n ) {
+ ///used
+ m_namespaceAliases = n;
+ }
+
+ void setProcessPrimaryTypes( bool b ) { ///The "do complete return-type-evaluation" entry. However it should be renamed, because it also covers Variable-types and typedefs!
+ ///used
+ m_processPrimaryTypes = b;
+ }
+
+ void setProcessFunctionArguments( bool b ) { ///The "do complete argument-type-evaluation" entry
+ ///used
+ m_processFunctionArguments = b;
+ }
+
+ bool automaticCodeCompletion() const {
+ return m_automaticCodeCompletion;
+ }
+
+
+ void setAutomaticCodeCompletion( bool b );
+
+ bool automaticArgumentsHint() const
+ {
+ ///used
+ return m_automaticArgumentsHint;
+ }
+
+ void setAutomaticArgumentsHint( bool b );
+
+ bool automaticHeaderCompletion() const
+ {
+ ///used
+ return m_automaticHeaderCompletion;
+ }
+
+ void setAutomaticHeaderCompletion( bool b );
+
+ int codeCompletionDelay() const
+ {
+ ///used
+ return m_codeCompletionDelay;
+ }
+
+ void setCodeCompletionDelay( int delay );
+
+ int argumentsHintDelay() const
+ {
+ ///used
+ return m_argumentsHintDelay;
+ }
+
+ void setArgumentsHintDelay( int delay );
+
+ int headerCompletionDelay() const
+ {
+ ///used
+ return m_headerCompletionDelay;
+ }
+
+ void setHeaderCompletionDelay( int delay );
+
+public slots:
+ void store();
+
+signals:
+ void stored();
+
+private:
+ void init();
+
+private:
+ CppSupportPart* m_part;
+ QDomDocument* m_dom;
+/* bool m_includeGlobalFunctions;
+ bool m_includeTypes;
+ bool m_includeEnums;
+ bool m_includeTypedefs;*/
+ bool m_automaticCodeCompletion;
+ bool m_automaticArgumentsHint;
+ bool m_automaticHeaderCompletion;
+ int m_codeCompletionDelay;
+ int m_argumentsHintDelay;
+ int m_headerCompletionDelay;
+
+ bool m_preProcessAllHeaders;
+ bool m_parseMissingHeaders;
+ bool m_resolveIncludePaths;
+ bool m_alwaysIncludeNamespaces;
+ bool m_alwaysParseInBackground;
+ bool m_usePermanentCaching;
+ QString m_includePaths;
+
+ bool m_showOnlyAccessibleItems;
+ CompletionBoxItemOrder m_completionBoxItemOrder;
+ bool m_showEvaluationContextMenu;
+ bool m_showCommentWithArgumentHint;
+ bool m_statusBarTypeEvaluation;
+ QString m_namespaceAliases;
+ bool m_processPrimaryTypes;
+ bool m_processFunctionArguments;
+
+ static QString defaultPath;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/cppevaluation.cpp b/languages/cpp/cppevaluation.cpp
new file mode 100644
index 00000000..ff1f4ab9
--- /dev/null
+++ b/languages/cpp/cppevaluation.cpp
@@ -0,0 +1,483 @@
+/***************************************************************************
+ begin : Sat Jul 21 2001
+ copyright : (C) 2001 by Victor R�er
+ email : victor_roeder@gmx.de
+ copyright : (C) 2002,2003 by Roberto Raggi
+ email : roberto@kdevelop.org
+ copyright : (C) 2005 by Adam Treat
+ email : manyoso@yahoo.com
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "cppevaluation.h"
+#include "simplecontext.h"
+#include "safetycounter.h"
+
+extern SafetyCounter safetyCounter;
+
+namespace CppEvaluation {
+
+void statusLog( const QString& str ) {
+ ifVerboseMajor( dbgMajor() << str << endl );
+ statusBarText( str, 2000 );
+}
+OperatorSet AllOperators;
+
+///These lines register the operators to the list of all operators
+RegisterOperator< DotOperator > DotReg( AllOperators );
+RegisterOperator< NestedTypeOperator > NestedReg( AllOperators );
+RegisterOperator< ArrowOperator > ArrowReg( AllOperators );
+RegisterOperator< StarOperator > StarReg( AllOperators );
+RegisterOperator< AddressOperator > AddressReg( AllOperators );
+RegisterOperator< IndexOperator > IndexReg( AllOperators );
+RegisterOperator< ParenOperator > ParenReg( AllOperators );
+
+template<class To, class From>
+QValueList<To> convertList( const QValueList<From>& from ) {
+ QValueList<To> ret;
+ for( typename QValueList<From>::const_iterator it = from.begin(); it != from.end(); ++it ) {
+ ret << (To)*it;
+ }
+ return ret;
+}
+
+QString nameFromType( SimpleType t ) {
+ return t->fullTypeResolved();
+}
+
+QString Operator::printTypeList( QValueList<EvaluationResult>& lst )
+{
+ QString ret;
+ for( QValueList<EvaluationResult>::iterator it = lst.begin(); it != lst.end(); ++it ) {
+ ret += "\"" + (*it)->fullNameChain() + "\", ";
+ }
+ ret.truncate( ret.length() - 3 );
+ return ret;
+}
+
+void Operator::log( const QString& msg ) {
+ statusLog( "\"" + name() + "\": " + msg );
+ //ifVerboseMajor( dbgMajor() << "\"" << name() << "\": " << msg << endl );
+}
+
+OperatorSet::~OperatorSet() {
+ for( QValueList< Operator* >::iterator it = m_operators.begin(); it != m_operators.end(); ++it ) {
+ delete *it;
+ }
+}
+
+OperatorIdentification OperatorSet::identifyOperator( const QString& str_ , Operator::BindingSide allowedBindings) {
+ QString str = str_.stripWhiteSpace();
+ for( OperatorList::iterator it = m_operators.begin(); it != m_operators.end(); ++it ) {
+ if( ((*it)->binding() & allowedBindings) == (*it)->binding() ) {
+ if( OperatorIdentification ident = (*it)->identify( str ) ) {
+ return ident;
+ }
+ }
+ }
+
+ return OperatorIdentification();
+}
+
+OperatorIdentification UnaryOperator::identify( QString& str ) {
+ OperatorIdentification ret;
+ if( str.startsWith( m_identString ) ) {
+ ret.start = 0;
+ ret.end = m_identString.length();
+ ret.found = true;
+ ret.op = this;
+ }
+ return ret;
+}
+
+EvaluationResult UnaryOperator::apply( QValueList<EvaluationResult> params, QValueList<EvaluationResult> innerParams ) {
+ if( !checkParams( params ) ) {
+ log( QString("parameter-check failed: %1 params: ").arg( params.size() ) + printTypeList( params ) );
+ return EvaluationResult();
+ } else {
+ EvaluationResult t = unaryApply( params.front(), innerParams );
+ if( !t ) {
+ if( params.front() )
+ log( "could not apply \"" + name() + "\" to \"" + nameFromType( params.front() ) + "\"");
+ else
+ log( "operator \"" + name() + "\" applied on \"" + nameFromType( params.front() ) + "\": returning unresolved type \"" + nameFromType( t ) + "\"");
+ }
+ return t;
+ }
+}
+
+EvaluationResult NestedTypeOperator::unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& /*innerParams*/ ) {
+ return param;
+}
+
+EvaluationResult DotOperator::unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& /*innerParams*/ ) {
+ if( param->totalPointerDepth() == 0 ) {
+ return param;
+ } else {
+ log( "failed to apply dot-operator to " + param->fullNameChain() + " because the pointer-depth is wrong" );
+ return EvaluationResult();
+ }
+}
+
+
+EvaluationResult ArrowOperator::unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& innerParams ) {
+ if( param->totalPointerDepth() == 1 ) {
+ param->setTotalPointerDepth( param->totalPointerDepth() - 1 );
+ return param;
+ } else {
+ if( param->resolved() ) {
+ if( param->totalPointerDepth() == 0 ) {
+ return param->resolved()->applyOperator( SimpleTypeImpl::ArrowOp , convertList<LocateResult, EvaluationResult>(innerParams) );
+ } else {
+ log("failed to apply arrow-operator to " + param->fullNameChain() + " because the pointer-depth is wrong" );
+ return EvaluationResult();
+ }
+ } else {
+ log( "failed to apply arrow-operator to unresolved type" );
+ return EvaluationResult();
+ }
+ };
+}
+
+EvaluationResult StarOperator::unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& /*innerParams*/ ) {
+ if( param->totalPointerDepth() > 0 ) {
+ param->setTotalPointerDepth( param->totalPointerDepth() - 1 );
+ return param;
+ } else {
+ if( param->resolved() ) {
+ return param->resolved()->applyOperator( SimpleTypeImpl::StarOp );
+ } else {
+ log( "failed to apply star-operator to unresolved type" );
+ return EvaluationResult();
+ }
+ };
+}
+
+EvaluationResult AddressOperator::unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& /*innerParams*/ ) {
+ param->setTotalPointerDepth( param->totalPointerDepth() + 1 );
+ return param;
+}
+
+OperatorIdentification UnaryParenOperator::identify( QString& str ) {
+ OperatorIdentification ret;
+ if( str.startsWith( QString( identString()[0] ) ) ) {
+ ret.start = 0;
+ ret.end = findClose( str, 0 );
+ if( ret.end == -1 ) {
+ ret.found = false;
+ ret.end = 0;
+ } else {
+ if( str[ret.end] == identString()[1] ) {
+ ret.found = true;
+ ret.end += 1;
+ ret.op = this;
+
+ ///Try to extract the parameter-strings.
+ ParamIterator it( identString(), str.mid( ret.start, ret.end - ret.start ) );
+
+ while( it ) {
+ ret.innerParams << (*it).stripWhiteSpace();
+
+ ++it;
+ }
+
+ } else {
+ ret.end = 0;
+ }
+ }
+ }
+ return ret;
+}
+
+
+EvaluationResult IndexOperator::unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& innerParams ) {
+ if( param->totalPointerDepth() > 0 ) {
+ param->setTotalPointerDepth( param->totalPointerDepth() - 1 );
+ return param;
+ } else {
+ if( param->resolved() ) {
+ return param->resolved()->applyOperator( SimpleTypeImpl::IndexOp, convertList<LocateResult>( innerParams ) );
+ } else {
+ log( "failed to apply index-operator to unresolved type" );
+ return EvaluationResult();
+ }
+ };
+}
+
+EvaluationResult ParenOperator::unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& innerParams ) {
+ if( param ) {
+ if( param->resolved() ) {
+ return param->resolved()->applyOperator( SimpleTypeImpl::ParenOp, convertList<LocateResult>(innerParams) );
+ } else {
+ log( "failed to apply paren-operator to unresolved type" );
+ return EvaluationResult();
+ }
+
+ } else {
+ return innerParams[0];
+ }
+}
+
+ExpressionEvaluation::ExpressionEvaluation( CppCodeCompletion* data, ExpressionInfo expr, OperatorSet& operators, const HashedStringSet& includeFiles, SimpleContext* ctx ) : m_data( data ), m_ctx( ctx ), m_expr( expr ), m_global(false), m_operators( operators ), m_includeFiles( includeFiles ) {
+ safetyCounter.init();
+
+ ifVerboseMajor( dbgMajor( ) << "Initializing evaluation of expression " << expr << endl );
+
+ if ( expr.expr().startsWith( "::" ) )
+ {
+ expr.setExpr( expr.expr().mid( 2 ) );
+ m_global = true;
+ }
+
+ //m_expr = m_data->splitExpression( expr.expr() ).join("");
+}
+
+EvaluationResult ExpressionEvaluation::evaluate() {
+ EvaluationResult res;
+ res = evaluateExpressionInternal( m_expr.expr(), m_ctx->global(), m_ctx, m_ctx, /*m_expr.canBeTypeExpression() cannot be safely determined*/true );
+
+ ExpressionInfo ex = res.expr; ///backup and set the type which was chosen while the evaluation-process
+ res.expr = m_expr;
+ res.expr.t = ex.t;
+
+ return res;
+}
+
+EvaluationResult ExpressionEvaluation::evaluateExpressionInternal( QString expr, EvaluationResult scope, SimpleContext * ctx, SimpleContext* innerCtx , bool canBeTypeExpression) {
+ LogDebug d( "#evl#" );
+ if( expr.isEmpty() || !safetyCounter ) {
+ scope.expr.t = ExpressionInfo::NormalExpression;
+ return scope;
+ }
+
+ /*if( !scope->resolved() ) {
+ ifVerboseMajor( dbgMajor() << "evaluateExpressionInternal(\"" << expr << "\") scope: \"" << scope->fullTypeStructure() << "\" is unresolved " << endl );
+ return EvaluationResult();
+ }*/
+
+ ifVerboseMajor( dbgMajor() << "evaluateExpressionInternal(\"" << expr << "\") scope: \"" << scope->fullNameChain() << "\" context: " << ctx << endl );
+
+ expr = expr.stripWhiteSpace();
+
+ ///Find the rightmost operator with the lowest priority, for the first split.
+ QValueList<OperatorIdentification> idents;
+ for( uint a = 0; a < expr.length(); ++a ) {
+ QString part = expr.mid( a );
+ OperatorIdentification ident = m_operators.identifyOperator( part );
+ if( ident ) {
+ ifVerboseMajor( dbgMajor() << "identified \"" << ident.op->name() << "\" in string " << part << endl );
+ ident.start += a;
+ ident.end += a;
+ idents << ident;
+ a += ident.end;
+ } else {
+ if( isLeftParen( part[0] ) ) {
+ int jump = findClose( part, 0 );
+ if( jump != -1 )
+ a += jump;
+ }
+ }
+ }
+
+ if( !idents.isEmpty() ) {
+ OperatorIdentification lowest;
+
+ for( QValueList<OperatorIdentification>::iterator it = idents.begin(); it != idents.end(); ++it ) {
+ if( lowest ) {
+ if( lowest.op->priority() >= (*it).op->priority() )
+ lowest = *it;
+ } else {
+ lowest = *it;
+ }
+ }
+
+ if( lowest ) {
+ QString leftSide = expr.left( lowest.start ).stripWhiteSpace();
+ QString rightSide = expr.right( expr.length() - lowest.end ).stripWhiteSpace();
+
+ EvaluationResult left, right;
+ if( !leftSide.isEmpty() ) {
+ left = evaluateExpressionInternal( leftSide, scope, ctx, innerCtx, lowest.op->canBeType( Operator::Left ) );
+ } else {
+ left = scope;
+ }
+
+ if( !left && (lowest.op->binding() & Operator::Left) ) {
+ ifVerboseMajor( dbgMajor() << "problem while evaluating expression \"" << expr << "\", the operator \"" << lowest.op->name() << "\" has a binding to the left side, but no left side could be evaluated: \"" << leftSide << "\"" << endl );
+ }
+
+ if( !rightSide.isEmpty() && (lowest.op->binding() & Operator::Right) )
+ right = evaluateExpressionInternal( rightSide, SimpleType(), ctx, innerCtx, lowest.op->canBeType( Operator::Right ) );
+
+ if( !right && (lowest.op->binding() & Operator::Right) ) {
+ ifVerboseMajor( dbgMajor() << "problem while evaluating expression \"" << expr << "\", the operator \"" << lowest.op->name() << "\" has a binding to the right side, but no right side could be evaluated: \"" << rightSide << "\"" << endl );
+ }
+
+ QValueList<EvaluationResult> innerParams;
+ QValueList<EvaluationResult> params;
+ if( lowest.op->binding() & Operator::Left ) params << left;
+ if( lowest.op->binding() & Operator::Right ) params << right;
+
+ for( QValueList<QString>::iterator it = lowest.innerParams.begin(); it != lowest.innerParams.end(); ++it ) {
+ ifVerboseMajor(dbgMajor() << "evaluating inner parameter \"" + *it + "\"" );
+ innerParams << evaluateExpressionInternal( (*it), SimpleType(), innerCtx, innerCtx, lowest.op->canBeType( Operator::Neutral ) );
+ }
+
+ EvaluationResult applied = lowest.op->apply( params, innerParams );
+ if( !applied ) {
+ statusLog( "\"" + expr + "\": failed to apply the operator \"" + lowest.op->name() + "\"" );
+ }
+
+ if( ! (lowest.op->binding() & Operator::Left) && !leftSide.isEmpty() ) {
+ ///When the operator has no binding to the left, the left side should be empty.
+ statusLog( "\"" + expr + "\": problem with the operator \"" + lowest.op->name() + ", it has no binding to the left side, but the left side is \""+ leftSide + "\"" );
+ }
+
+ if( ! (lowest.op->binding() & Operator::Right) && !rightSide.isEmpty() ) {
+ ///When the operator has no binding to the right, we should continue evaluating the right side, using the left type as scope.
+ ///Think about this.
+ return evaluateExpressionInternal( rightSide, applied, 0, innerCtx, lowest.op->canBeType( Operator::Right ) );
+ }
+
+ return applied;
+ } else {
+ ifVerboseMajor( dbgMajor() << " could not find an operator in " << expr << endl );
+ return evaluateAtomicExpression( expr, scope, ctx );
+ }
+ }
+
+ //dbgMajor() << " could not evaluate " << expr << endl;
+ ifVerboseMajor( dbgMajor() << "evaluating \"" << expr << "\" as atomic expression" << endl );
+
+ TypeDesc exp = m_ctx->container()->resolveTemplateParams( TypeDesc(expr) );
+
+ ifVerboseMajor( dbgMajor() << "after template-parameter resolution: \"" << exp.fullNameChain() << "\"" << endl );
+
+ EvaluationResult res = evaluateAtomicExpression( exp, scope, ctx, canBeTypeExpression );
+ return res;
+}
+
+/**This function needs a clean workover.
+ * An atomic expression is one that only consists of a type-, function- or variable-name(may include '::')
+ */
+EvaluationResult ExpressionEvaluation::evaluateAtomicExpression( TypeDesc expr, EvaluationResult scope, SimpleContext * ctx, bool canBeTypeExpression ) {
+ LogDebug d( "#evt#");
+ if( !safetyCounter || !d ) return SimpleType();
+ bool canBeItemExpression = true; ///To be implemented
+
+ if( scope ) {
+ expr.setIncludeFiles( scope.resultType->includeFiles() );
+ } else {
+ expr.setIncludeFiles( m_includeFiles );
+ }
+
+
+ ifVerboseMajor( dbgMajor() << "evaluateAtomicExpression(\"" << expr.name() << "\") scope: \"" << scope->fullNameChain() << "\" context: " << ctx << endl );
+
+ EvaluationResult bestRet;
+ int bestDepth = 0;
+
+ if( expr.name().isEmpty() )
+ return scope;
+
+ TypePointer searchIn = scope->resolved();
+ if( !searchIn ) {
+ statusLog( "scope-type is not resolved" );
+ return EvaluationResult();
+ }
+
+ if( ctx )
+ searchIn = ctx->container().get();
+
+ if( ctx && canBeItemExpression ) {
+ ///Search for variables and functions, first in the current context, and then through the container-classes upwards.
+ // find the variable in the current context
+ SimpleVariable var = ctx->findVariable( expr.name() );
+
+ if ( var.type ) {
+ TypeDesc d( var.type );
+ d.setIncludeFiles( m_includeFiles );
+ EvaluationResult ret = EvaluationResult( ctx->container()->locateDecType( d ), var.toDeclarationInfo( "current_file" ));
+ ret.expr.t = ExpressionInfo::NormalExpression;
+ return ret;
+ }
+
+ SimpleType current = ctx->container();
+
+ SimpleTypeImpl::TypeOfResult type;
+
+ SafetyCounter s( 20 );
+ bool ready = false;
+ int depth = 0;
+
+ while( !ready && s )
+ {
+ if( !current ) ready = true;
+
+ type = current->typeOf( expr );
+ if ( type) {
+ bestRet = EvaluationResult( type.type, type.decl );
+ bestDepth = depth;
+ bestRet.expr = expr.fullNameChain();
+ bestRet.expr.t = ExpressionInfo::NormalExpression;
+ }
+
+ depth++;
+ if( !ready ) current = current->parent();
+ }
+ }
+ /*
+ if( scope.expr.t & ExpressionInfo::TypeExpression )
+ canBeTypeExpression = true;*/
+
+ if( canBeItemExpression && (!bestRet || bestDepth > 0 ) ) {
+ //SimpleTypeImpl::
+ SimpleTypeImpl::TypeOfResult res = searchIn->typeOf( expr );
+
+ if( res ) {
+ bestRet = EvaluationResult( res.type, res.decl );
+ bestDepth = 0;
+ }
+ }
+ if( canBeTypeExpression ) {
+ ///Search for Types
+ LocateResult type = searchIn->locateDecType( expr );
+
+ if( !bestRet ||
+ /** Did we find a constructor within a class? */
+ (type->resolved() && ( bestRet->resolved() && type->resolved()->desc() == bestRet->resolved()->parent()->desc() && bestRet->resolved()->asFunction() ) ) ) {
+ /*if ( type && type->resolved() )
+ {*/
+ EvaluationResult ret = type;
+ ret.expr = expr.fullNameChain();
+ ret.expr.t = ExpressionInfo::TypeExpression;
+ bestRet = ret;
+ }
+ /*} else {
+ bestRet = EvaluationResult( type );
+ QStringList s = split+exprList;
+ s.pop_front();
+ if( !s.isEmpty() )
+ bestRet->append( new TypeDescShared( s.join("::") ) );
+ }*/
+ }
+
+ if( bestRet )
+ return bestRet;
+
+ ifVerboseMajor( dbgMajor() << "evaluateAtomicExpression: \"" << scope.resultType->fullNameChain() << "\"could not locate " << expr.fullNameChain() << endl );
+ return bestRet;
+}
+}
+
+// kate: indent-mode csands; tab-width 2;
diff --git a/languages/cpp/cppevaluation.h b/languages/cpp/cppevaluation.h
new file mode 100644
index 00000000..e4adeb28
--- /dev/null
+++ b/languages/cpp/cppevaluation.h
@@ -0,0 +1,367 @@
+/***************************************************************************
+ begin : Sat Jul 21 2001
+ copyright : (C) 2001 by Victor R�er
+ email : victor_roeder@gmx.de
+ copyright : (C) 2002,2003 by Roberto Raggi
+ email : roberto@kdevelop.org
+ copyright : (C) 2005 by Adam Treat
+ email : manyoso@yahoo.com
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef CPPEVALUATION_H
+#define CPPEVALUATION_H
+
+#include <qvaluelist.h>
+
+#include "expressioninfo.h"
+#include "simpletype.h"
+#include "declarationinfo.h"
+#include <hashedstring.h>
+
+class SimpleContext;
+
+void statusBarText( const QString& str, int time = 1000 );
+
+namespace CppEvaluation {
+
+template <class To, class From>
+extern QValueList<To> convertList( const QValueList<From>& from );
+
+extern QString nameFromType( SimpleType t );
+
+class Operator;
+
+struct OperatorIdentification {
+ QValueList<QString> innerParams; /** Inner parameters of the operator( for the vec["hello"] the "hello" ) */
+ int start, end; /** Range the operator occupies */
+ bool found;
+ Operator* op; ///Can be 0 !
+
+ OperatorIdentification() : start( 0 ), end( 0 ), found( false ), op( 0 ) {}
+
+ operator bool() {
+ return found;
+ }
+};
+
+
+class EvaluationResult {
+ public:
+ EvaluationResult& operator = ( const EvaluationResult& rhs ) {
+ resultType = rhs.resultType;
+ sourceVariable = rhs.sourceVariable;
+ expr = rhs.expr;
+ isMacro = rhs.isMacro;
+ macro = rhs.macro;
+ return *this;
+ }
+
+ EvaluationResult( const EvaluationResult& rhs ) : resultType( rhs.resultType ), expr( rhs.expr ), sourceVariable( rhs.sourceVariable ), isMacro( rhs.isMacro ), macro( rhs.macro ) {}
+
+ LocateResult resultType; ///The resulting type
+
+ ExpressionInfo expr; ///Information about the expression that was processed
+
+ DeclarationInfo sourceVariable; ///If the type comes from a variable, this stores Information about it
+
+ bool isMacro;
+ Macro macro;
+
+ ///should be removed
+ EvaluationResult( SimpleType rhs ) : isMacro( false ) {
+ if ( rhs.get() != 0 )
+ resultType = rhs->desc();
+ }
+
+ EvaluationResult( LocateResult tp = TypeDesc(), DeclarationInfo var = DeclarationInfo() ) : resultType( tp ), sourceVariable( var ), isMacro( false ) {}
+
+ /*operator TypeDesc () const {
+ return (TypeDesc)resultType;
+ }*/
+
+ ///This must be removed
+ operator SimpleType() const {
+ if ( resultType->resolved() ) {
+ return SimpleType( resultType->resolved() );
+ } else {
+ return SimpleType( new SimpleTypeImpl( ( TypeDesc ) resultType ) );
+ }
+ }
+
+ TypeDesc* operator -> () {
+ return & resultType.desc();
+ }
+
+ operator LocateResult () const {
+ return resultType;
+ }
+
+ operator bool() const {
+ return ( bool ) resultType;
+ }
+};
+
+
+
+class Operator {
+ public:
+ enum BindingSide {
+ Neutral = 0,
+ Left = 1,
+ Right = 2
+ };
+ enum Type {
+ Unary = 1,
+ Binary = 2,
+ Ternary = 3
+ };
+
+ virtual ~Operator() {}
+
+ virtual int priority() = 0;
+
+ virtual Type type() = 0;
+ virtual int paramCount() = 0;
+
+ ///"binding" means that the operator needs the evaluated type of the expression on that side
+ ///The types of all bound sides will later be sent in the "params"-list of the apply-function
+ virtual BindingSide binding() = 0; ///The side to which the operator binds
+
+ ///When this returns true, the ident-structure must be filled correctly
+ virtual OperatorIdentification identify( QString& str ) = 0;
+
+ ///params
+ virtual EvaluationResult apply( QValueList<EvaluationResult> params, QValueList<EvaluationResult> innerParams ) = 0;
+
+ virtual QString name() = 0;
+
+ ///Should return whether the item it the given side can be a type(Neutral stands for the inner paremeters)
+ virtual bool canBeType( BindingSide side ) {
+ return true;
+ }
+
+ protected:
+ void log( const QString& msg );
+ QString printTypeList( QValueList<EvaluationResult>& lst );
+};
+
+
+class OperatorSet {
+ private:
+ typedef QValueList< Operator* > OperatorList;
+ OperatorList m_operators;
+ public:
+ OperatorSet() {}
+
+ ~OperatorSet();
+
+ void registerOperator( Operator* op ) {
+ m_operators << op;
+ }
+
+ OperatorIdentification identifyOperator( const QString& str_ , Operator::BindingSide allowedBindings = ( Operator::BindingSide ) ( Operator::Left | Operator::Right | Operator::Neutral ) );
+
+};
+extern OperatorSet AllOperators;
+
+
+template <class OperatorType>
+class RegisterOperator {
+ public:
+ RegisterOperator( OperatorSet& set
+ ) {
+ set.registerOperator( new OperatorType() );
+ }
+ ~RegisterOperator() {}
+}
+;
+
+
+class UnaryOperator : public Operator {
+ public:
+ UnaryOperator( int priority , QString identString, QString description, Operator::BindingSide binding ) : Operator(), m_priority( priority ), m_identString( identString ), m_name( description ), m_binding( binding ) {}
+
+ virtual int priority() {
+ return m_priority;
+ }
+
+ virtual Operator::Type type() {
+ return Operator::Unary;
+ }
+
+ virtual Operator::BindingSide binding() {
+ return m_binding;
+ }
+
+ virtual int paramCount() {
+ return 1;
+ }
+
+ virtual OperatorIdentification identify( QString& str );
+
+ virtual EvaluationResult unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& innerParams ) = 0;
+
+ virtual bool checkParams( const QValueList<EvaluationResult>& params ) {
+ return !params.isEmpty() && params[ 0 ];
+ }
+
+ virtual EvaluationResult apply( QValueList<EvaluationResult> params, QValueList<EvaluationResult> innerParams );
+
+ virtual QString name() {
+ return m_name;
+ }
+
+ private:
+ int m_priority;
+ QString m_identString;
+ QString m_name;
+ Operator::BindingSide m_binding;
+ protected:
+
+ QString identString() const {
+ return m_identString;
+ }
+
+};
+
+
+class NestedTypeOperator : public UnaryOperator {
+ public:
+ NestedTypeOperator() : UnaryOperator( 18, "::", "nested-type-operator", Operator::Left ) {}
+
+ virtual EvaluationResult unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& /*innerParams*/ );
+};
+
+//RegisterOperator< NestedTypeOperator > NestedTypeReg( AllOperators ); ///This registers the operator to the list of all operators
+
+class DotOperator : public UnaryOperator {
+ public:
+ DotOperator() : UnaryOperator( 17, ".", "dot-operator", Operator::Left ) {}
+
+ virtual EvaluationResult unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& /*innerParams*/ );
+
+ virtual bool canBeType( BindingSide side ) {
+ return false;
+ }
+};
+
+class ArrowOperator : public UnaryOperator {
+ public:
+ ArrowOperator() : UnaryOperator( 17, "->", "arrow-operator", Operator::Left ) {}
+
+ virtual EvaluationResult unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& innerParams );
+
+ virtual bool canBeType( BindingSide side ) {
+ return false;
+ }
+};
+
+
+class StarOperator : public UnaryOperator {
+ public:
+ StarOperator() : UnaryOperator( 15, "*", "star-operator", Operator::Right ) { ///Normally this should have a priority of 16, but that would need changes to the expression-parsin g-loop
+ }
+
+ virtual EvaluationResult unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& /*innerParams*/ );
+
+ virtual bool canBeType( BindingSide side ) {
+ return false;
+ }
+};
+
+
+class AddressOperator : public UnaryOperator {
+ public:
+ AddressOperator() : UnaryOperator( 16, "&", "address-operator", Operator::Right ) {}
+
+ virtual EvaluationResult unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& /*innerParams*/ );
+
+ virtual bool canBeType( BindingSide side ) {
+ return false;
+ }
+};
+
+
+class UnaryParenOperator : public UnaryOperator {
+ public:
+ ///Identstring should be both parens, for Example "[]" or "()"
+ UnaryParenOperator( int priority , QString identString, QString description, Operator::BindingSide binding ) : UnaryOperator( priority, identString, description, binding ) {}
+
+ virtual OperatorIdentification identify( QString& str );
+
+ virtual bool canBeType( BindingSide side ) {
+ return false;
+ }
+};
+
+class IndexOperator : public UnaryParenOperator {
+ public:
+ IndexOperator() : UnaryParenOperator( 17, "[]", "index-operator", Operator::Left ) {}
+
+ virtual EvaluationResult unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& innerParams );
+
+ virtual bool canBeType( BindingSide side ) {
+ return false;
+ }
+};
+
+
+class ParenOperator : public UnaryParenOperator {
+ public:
+ ParenOperator() : UnaryParenOperator( 16, "()", "paren-operator", Operator::Left ) {}
+
+ virtual bool checkParams( const QValueList<EvaluationResult>& params ) {
+ return !params.isEmpty();
+ }
+
+ virtual EvaluationResult unaryApply( EvaluationResult param, const QValueList<EvaluationResult>& innerParams );
+
+ virtual bool canBeType( BindingSide side ) {
+ return false;
+ }
+};
+
+//This is used in CppCodeCompletion::evaluateExpression(..)
+class ExpressionEvaluation {
+ private:
+ CppCodeCompletion* m_data;
+ SimpleContext* m_ctx;
+ ExpressionInfo m_expr;
+ bool m_global;
+ OperatorSet& m_operators;
+ HashedStringSet m_includeFiles;
+
+ public:
+ ExpressionEvaluation( CppCodeCompletion* data, ExpressionInfo expr, OperatorSet& operators, const HashedStringSet& includeFiles, SimpleContext* ctx = 0 );
+
+ EvaluationResult evaluate();
+
+ private:
+ /**
+ recursion-method:
+ 1. Find the rightmost operator with the lowest priority, split the expression
+
+ vector[ (*it)->position ]().
+ */
+ virtual EvaluationResult evaluateExpressionInternal( QString expr, EvaluationResult scope, SimpleContext * ctx, SimpleContext* innerCtx , bool canBeTypeExpression = true );
+
+ ///Locates types or members
+ EvaluationResult evaluateAtomicExpression( TypeDesc expr, EvaluationResult scope, SimpleContext * ctx = 0, bool canBeTypeExpression = true );
+};
+
+
+}
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/cppimplementationwidget.cpp b/languages/cpp/cppimplementationwidget.cpp
new file mode 100644
index 00000000..c00c9b05
--- /dev/null
+++ b/languages/cpp/cppimplementationwidget.cpp
@@ -0,0 +1,100 @@
+/***************************************************************************
+* Copyright (C) 2004 by Alexander Dymo *
+* adymo@kdevelop.org *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU Library 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 Library 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. *
+***************************************************************************/
+#include "cppimplementationwidget.h"
+
+#include <qfileinfo.h>
+#include <qtextstream.h>
+#include <qfile.h>
+#include <qdir.h>
+#include <qregexp.h>
+#include <qdom.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <klistview.h>
+#include <klineedit.h>
+
+#include <kdevlanguagesupport.h>
+#include <kdevproject.h>
+#include <domutil.h>
+#include <filetemplate.h>
+
+CppImplementationWidget::CppImplementationWidget( KDevLanguageSupport *part,
+ QWidget *parent, const char *name, bool modal )
+ : ImplementationWidget( part, parent, name, modal )
+{}
+
+QStringList CppImplementationWidget::createClassFiles()
+{
+ QString template_h = "#ifndef $DEFTEXT$_H\n#define $DEFTEXT$_H\n\n#include \"$BASEINCLUDE$\"\n\nclass $CLASSNAME$: public $BASECLASSNAME$ {\nQ_OBJECT\npublic:\n $CLASSNAME$(QWidget *parent = 0, const char *name = 0);\n};\n\n#endif\n";
+ QString template_cpp = "#include \"$CLASSINCLUDE$\"\n\n$CLASSNAME$::$CLASSNAME$(QWidget *parent, const char *name)\n :$BASECLASSNAME$(parent, name)\n{\n}\n";
+ if ( m_part->project() ->options() == KDevProject::UsesAutotoolsBuildSystem )
+ template_cpp += "\n#include \"$MOCINCLUDE$\"\n";
+
+ QFileInfo formInfo( m_formName );
+ template_h.replace( QRegExp( "\\$BASEINCLUDE\\$" ), formInfo.baseName() + ".h" );
+ template_h.replace( QRegExp( "\\$CLASSNAME\\$" ), classNameEdit->text() );
+ template_h.replace( QRegExp( "\\$BASECLASSNAME\\$" ), m_baseClassName );
+ template_h.replace( QRegExp( "\\$DEFTEXT\\$" ), fileNameEdit->text().upper() );
+
+ template_cpp.replace( QRegExp( "\\$CLASSINCLUDE\\$" ), fileNameEdit->text() + ".h" );
+ template_cpp.replace( QRegExp( "\\$CLASSNAME\\$" ), classNameEdit->text() );
+ template_cpp.replace( QRegExp( "\\$BASECLASSNAME\\$" ), m_baseClassName );
+ template_cpp.replace( QRegExp( "\\$MOCINCLUDE\\$" ), fileNameEdit->text() + ".moc" );
+
+ template_h = FileTemplate::read( m_part, "h" ) + template_h;
+ template_cpp = FileTemplate::read( m_part, "cpp" ) + template_cpp;
+
+ QString file_h = fileNameEdit->text() + ".h";
+ QString file_cpp = fileNameEdit->text() + ".cpp";
+ if ( !m_part->project() ->activeDirectory().isEmpty() )
+ {
+ file_h = m_part->project() ->activeDirectory() + "/" + file_h;
+ file_cpp = m_part->project() ->activeDirectory() + "/" + file_cpp;
+ }
+
+ QFile ifile( QDir::cleanDirPath( m_part->project() ->projectDirectory() + "/" + file_cpp ) );
+ if ( !ifile.open( IO_WriteOnly ) )
+ {
+ KMessageBox::error( this, i18n( "Cannot write to implementation file" ) );
+ return QStringList();
+ }
+ QTextStream istream( &ifile );
+ istream << template_cpp;
+ ifile.close();
+
+ QFile hfile( QDir::cleanDirPath( m_part->project() ->projectDirectory() + "/" + file_h ) );
+ if ( !hfile.open( IO_WriteOnly ) )
+ {
+ KMessageBox::error( this, i18n( "Cannot write to header file" ) );
+ return QStringList();
+ }
+ QTextStream hstream( &hfile );
+ hstream << template_h;
+ hfile.close();
+
+ QStringList fileList;
+ fileList.append( file_h );
+ fileList.append( file_cpp );
+
+ return fileList;
+}
+
+#include "cppimplementationwidget.moc"
diff --git a/languages/cpp/cppimplementationwidget.h b/languages/cpp/cppimplementationwidget.h
new file mode 100644
index 00000000..d10045db
--- /dev/null
+++ b/languages/cpp/cppimplementationwidget.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+* Copyright (C) 2004 by Alexander Dymo *
+* adymo@kdevelop.org *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU Library 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 Library 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. *
+***************************************************************************/
+#ifndef CPPIMPLEMENTATIONWIDGET_H
+#define CPPIMPLEMENTATIONWIDGET_H
+
+#include <implementationwidget.h>
+
+#include <codemodel.h>
+
+class KListViewItem;
+class CppSupportPart;
+
+class CppImplementationWidget : public ImplementationWidget
+{
+ Q_OBJECT
+public:
+ CppImplementationWidget( KDevLanguageSupport *part, QWidget* parent = 0, const char* name = 0, bool modal = false );
+
+protected:
+ virtual QStringList createClassFiles();
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
+
diff --git a/languages/cpp/cppnewclassdlg.cpp b/languages/cpp/cppnewclassdlg.cpp
new file mode 100644
index 00000000..b941b46e
--- /dev/null
+++ b/languages/cpp/cppnewclassdlg.cpp
@@ -0,0 +1,2242 @@
+/***************************************************************************
+* Copyright (C) 1998 by Sandy Meier *
+* smeier@rz.uni-potsdam.de *
+* Copyright (C) 1999 by Benoit.Cerrina *
+* Benoit.Cerrina@writeme.com *
+* Copyright (C) 2002 by Bernd Gehrmann *
+* bernd@kdevelop.org *
+* Copyright (C) 2003 by Eray Ozkural *
+* <erayo@cs.bilkent.edu.tr> *
+* Copyright (C) 2003-2004 by Alexander Dymo *
+* adymo@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include "cppnewclassdlg.h"
+
+#include <qcheckbox.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qradiobutton.h>
+#include <qregexp.h>
+#include <qtextedit.h>
+#include <qrect.h>
+#include <qstyle.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <qcombobox.h>
+#include <qlistview.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qtabwidget.h>
+#include <klineedit.h>
+#include <kdeversion.h>
+
+#include "cppsupportpart.h"
+#include "kdevproject.h"
+#include "kdevsourceformatter.h"
+#include "kdevcoderepository.h"
+#include "kdevpartcontroller.h"
+#include "backgroundparser.h"
+#include "domutil.h"
+#include "filetemplate.h"
+#include "storeconverter.h"
+#include "qtbuildconfig.h"
+
+#include "classgeneratorconfig.h"
+
+QString QRegExp_escape( const QString& str )
+{
+#if QT_VERSION >= 0x030100
+ return QRegExp::escape( str );
+#else
+ // this block is copyrighted by Trolltech AS (GPL)
+ static const char meta[] = "$()*+.?[\\]^{|}";
+ QString quoted = str;
+ int i = 0;
+
+ while ( i < ( int ) quoted.length() )
+ {
+ if ( strchr( meta, quoted[ i ].latin1() ) != 0 )
+ quoted.insert( i++, "\\" );
+ i++;
+ }
+ return quoted;
+#endif
+}
+
+CppNewClassDialog::CppNewClassDialog( CppSupportPart *part, QWidget *parent, const char *name )
+ : CppNewClassDialogBase( parent, name ), myModel( 0 )
+{
+ headerModified = false;
+ baseincludeModified = false;
+ implementationModified = false;
+ m_part = part;
+ // read file template configuration
+ // KDevProject *project = part->project();
+ QDomDocument &dom = *part->projectDom();
+ interface_url = DomUtil::readEntry( dom, "/cppsupportpart/filetemplates/interfaceURL" );
+ implementation_url = DomUtil::readEntry( dom, "/cppsupportpart/filetemplates/implementationURL" );
+ interface_suffix = DomUtil::readEntry( dom, "/cppsupportpart/filetemplates/interfacesuffix", ".h" );
+ implementation_suffix = DomUtil::readEntry( dom, "/cppsupportpart/filetemplates/implementationsuffix", ".cpp" );
+ lowercase_filenames = DomUtil::readBoolEntry( dom, "/cppsupportpart/filetemplates/lowercasefilenames", true );
+ m_parse = DomUtil::readEntry( *m_part->projectDom(), "/cppsupportpart/newclass/filenamesetting", "none" );
+ // name_handler_combo->setCurrentText(m_parse);
+ baseclasses_view->setSorting( -1 );
+ constructors_view->setSorting( -1 );
+
+ accessMenu = new QPopupMenu( this );
+ accessMenu->insertItem( i18n( "Use as Private" ),
+ this, SLOT( changeToPrivate() ), 0, 1 );
+ accessMenu->insertItem( i18n( "Use as Protected" ),
+ this, SLOT( changeToProtected() ), 0, 2 );
+ accessMenu->insertItem( i18n( "Use as Public" ),
+ this, SLOT( changeToPublic() ), 0, 3 );
+ accessMenu->insertSeparator();
+ accessMenu->insertItem( i18n( "Unset" ),
+ this, SLOT( changeToInherited() ), 0, 5 );
+
+ overMenu = new QPopupMenu( this );
+ overMenu->insertItem( i18n( "Extend Base Class Functionality" ),
+ this, SLOT( extendFunctionality() ), 0, 11 );
+ overMenu->insertItem( i18n( "Replace Base Class Method" ),
+ this, SLOT( replaceFunctionality() ), 0, 12 );
+
+ compBasename = basename_edit->completionObject();
+ setCompletionBasename( m_part->codeModel() );
+ compNamespace = namespace_edit->completionObject();
+ setCompletionNamespaceRecursive( m_part->codeModel() ->globalNamespace() );
+ classname_edit->setFocus();
+
+ // enable/disable qt options for non qt projects
+ childclass_box->setEnabled( m_part->qtBuildConfig()->isUsed() );
+ qobject_box->setEnabled( m_part->qtBuildConfig()->isUsed() );
+}
+
+
+CppNewClassDialog::~CppNewClassDialog()
+{
+ delete compBasename;
+ delete compNamespace;
+ delete myModel;
+}
+
+void CppNewClassDialog::setCompletionBasename( CodeModel *model )
+{
+ compBasename->clear();
+
+ // Import selected namespace without qualifier
+ NamespaceDom namespaceDom = model->globalNamespace();
+
+ QStringList::const_iterator it = currNamespace.begin();
+ for ( ; it != currNamespace.end() ; ++it )
+ {
+ if ( ! namespaceDom->hasNamespace( *it ) )
+ break;
+ namespaceDom = namespaceDom->namespaceByName( *it );
+ }
+
+ if ( it == currNamespace.end() )
+ // complete namespace has been found (not breaked)
+ compBasename->insertItems( sortedNameList( namespaceDom -> classList() ) );
+
+ addCompletionBasenameNamespacesRecursive( model->globalNamespace() );
+
+ QStringList compItems = compBasename->items();
+ it = compItems.begin();
+ for ( int i = 0;
+ it != compItems.end(); ++it, ++i )
+ kdDebug( 9007 ) << "compBasename->items()[" << i << "] = \"" << *it << "\"" << endl;
+}
+
+QStringList& gres( QStringList &list, const QRegExp & rx, const QString & after )
+{
+ QStringList::Iterator it = list.begin();
+ while ( it != list.end() )
+ {
+ ( *it ).replace( rx, after );
+ ++it;
+ }
+ return list;
+}
+
+void CppNewClassDialog::addCompletionBasenameNamespacesRecursive( const NamespaceDom & namespaceDom,
+ const QString & namespaceParent )
+{
+ // Add classes of this namespace
+ QStringList classList = sortedNameList( namespaceDom -> classList() );
+
+ if ( ! namespaceParent.isEmpty() )
+ {
+#if QT_VERSION >= 0x030200
+ classList.gres( QRegExp( "^" ), namespaceParent + "::" );
+#else
+
+ gres( classList, QRegExp( "^" ), namespaceParent + "::" );
+#endif
+
+ }
+
+ compBasename -> insertItems( classList );
+
+
+ // Recursion
+ NamespaceList namespaceList = namespaceDom->namespaceList();
+ NamespaceList::const_iterator it = namespaceList.begin();
+
+ for ( ; it != namespaceList.end() ; ++it )
+ {
+ QString fullNamespace;
+
+ if ( ! namespaceParent.isEmpty() )
+ fullNamespace = namespaceParent + "::";
+
+ fullNamespace += ( *it ) -> name();
+ addCompletionBasenameNamespacesRecursive( *it, fullNamespace );
+ }
+}
+
+
+void CppNewClassDialog::setCompletionNamespaceRecursive( const NamespaceDom & namespaceDom, const QString & namespaceParent )
+{
+ NamespaceList namespaceList = namespaceDom->namespaceList();
+ NamespaceList::const_iterator it = namespaceList.begin();
+ for ( ; it != namespaceList.end() ; ++it )
+ {
+ QString fullNamespace;
+
+ if ( ! namespaceParent.isEmpty() )
+ fullNamespace = namespaceParent + "::";
+
+ fullNamespace += ( *it ) -> name();
+ kdDebug( 9007 ) << "compNamespace -> addItem( \"" << fullNamespace << "\" )" << endl;
+ compNamespace -> addItem( fullNamespace );
+ setCompletionNamespaceRecursive( *it, fullNamespace );
+ }
+}
+
+void CppNewClassDialog::nameHandlerChanged( const QString &text )
+{
+ DomUtil::writeEntry( *m_part->projectDom(), "/cppsupportpart/newclass/filenamesetting", text );
+ m_parse = text;
+ classNameChanged( classname_edit->text() );
+}
+
+void CppNewClassDialog::classNameChanged( const QString &text )
+{
+ QString str = text;
+
+ if ( !headerModified )
+ {
+ QString header = str + interface_suffix;
+ switch ( gen_config->fileCase() )
+ {
+ case ClassGeneratorConfig::LowerCase:
+ header = header.lower();
+ break;
+ case ClassGeneratorConfig::UpperCase:
+ header = header.upper();
+ break;
+ default:
+ ;
+ }
+ header = header.replace( QRegExp( "(template *<.*> *)?(class +)?" ), "" );
+ header_edit->setText( header );
+ }
+ if ( !implementationModified )
+ {
+ QString implementation;
+ if ( str.contains( "template" ) )
+ implementation = str + "_impl" + interface_suffix;
+ else
+ implementation = str + implementation_suffix;
+ switch ( gen_config->fileCase() )
+ {
+ case ClassGeneratorConfig::LowerCase:
+ implementation = implementation.lower();
+ break;
+ case ClassGeneratorConfig::UpperCase:
+ implementation = implementation.upper();
+ break;
+ default:
+ ;
+ }
+ implementation = implementation.replace( QRegExp( "(template *<.*> *)?(class +)?" ), "" );
+ implementation_edit->setText( implementation );
+ }
+}
+
+void CppNewClassDialog::classNamespaceChanged( const QString &text )
+{
+ currNamespace = QStringList::split( QString( "::" ), text );
+ setCompletionBasename( m_part -> codeModel() );
+ reloadAdvancedInheritance( true );
+}
+
+void CppNewClassDialog::baseclassname_changed( const QString &text )
+{
+ if ( ( basename_edit->hasFocus() ) && ( !baseincludeModified ) )
+ {
+ QString header = text;
+
+ // handle Qt classes in a special way.
+ if( m_part->qtBuildConfig()->isUsed() && header.startsWith( "Q" ) )
+ {
+ if( m_part->qtBuildConfig()->version() == 3 )
+ {
+ header = header.lower() + ".h";
+ }
+ else if( m_part->qtBuildConfig()->version() == 4 )
+ {
+ // 1:1, e.g QObject is #include <QObject>
+ }
+ }
+ else
+ {
+ if ( header.contains( QRegExp( "::" ) ) )
+ header = header.mid( header.findRev( QRegExp( "::" ) ) + 2 );
+ header = header.replace( QRegExp( " *<.*>" ), "" );
+ header += interface_suffix;
+
+ switch ( gen_config->superCase() )
+ {
+ case ClassGeneratorConfig::LowerCase:
+ header = header.lower();
+ break;
+ case ClassGeneratorConfig::UpperCase:
+ header = header.upper();
+ break;
+ default:
+ ;
+ }
+ }
+
+ baseinclude_edit->setText( header );
+ }
+}
+
+void CppNewClassDialog::baseIncludeChanged( const QString &text )
+{
+ if ( baseinclude_edit->hasFocus() )
+ {
+ baseincludeModified = true;
+ if ( baseclasses_view->selectedItem() )
+ baseclasses_view->selectedItem() ->setText( 4, "true" );
+ }
+ if ( baseclasses_view->selectedItem() )
+ {
+ baseclasses_view->selectedItem() ->setText( 3, text );
+ }
+}
+
+void CppNewClassDialog::headerChanged()
+{
+ // Only if a change caused by the user himself
+ if ( header_edit->hasFocus() )
+ headerModified = true;
+}
+
+
+void CppNewClassDialog::implementationChanged()
+{
+ // Only if a change caused by the user himself
+ if ( implementation_edit->hasFocus() )
+ implementationModified = true;
+}
+
+void CppNewClassDialog::checkObjCInheritance( int val )
+{
+ childclass_box->setEnabled( !val && m_part->qtBuildConfig()->isUsed() );
+ gtk_box->setEnabled( !val );
+ qobject_box->setEnabled( !val && m_part->qtBuildConfig()->isUsed() );
+ namespace_edit->setEnabled( !val );
+ class_tabs->setTabEnabled( tab2, !val );
+ /* virtual_box->setEnabled(!val);
+ public_button->setEnabled(!val);
+ protected_button->setEnabled(!val);
+ private_button->setEnabled(!val);*/
+ if ( val && ( baseclasses_view->childCount() > 1 ) )
+ if ( KMessageBox::warningContinueCancel( this,
+ i18n( "Objective C does not support multiple inheritance.\nOnly the first base class in the list will be taken into account." ),
+ i18n( "Warning" ), KStdGuiItem::cont(), "Check Objective C inheritance rules" ) == KMessageBox::Cancel )
+ objc_box->setChecked( false );
+}
+
+void CppNewClassDialog::checkQWidgetInheritance( int val )
+{
+ if ( val )
+ {
+ qobject_box->setEnabled( val && m_part->qtBuildConfig()->isUsed() );
+ qobject_box->setChecked( val && m_part->qtBuildConfig()->isUsed() );
+ objc_box->setEnabled( !val );
+ gtk_box->setEnabled( !val );
+ }
+ else if ( qobject_box->isChecked() )
+ {
+ objc_box->setEnabled( false );
+ gtk_box->setEnabled( false );
+ }
+ else
+ {
+ objc_box->setEnabled( !val );
+ gtk_box->setEnabled( !val );
+ }
+
+
+ if ( val )
+ {
+ if ( baseclasses_view->childCount() == 0 )
+ {
+ addBaseClass();
+ basename_edit->setText( "QWidget" );
+ }
+ /* constructors_cpp_edit->append(classname_edit->text() + "::" + classname_edit->text() +
+ "(QWidget *parent, const char *name):\n QWidget(parent, name)\n{\n}\n");
+ constructors_h_edit->append(classname_edit->text() + "(QWidget *parent, const char *name);\n");*/
+ }
+
+ if ( val && ( baseclasses_view->childCount() > 1 ) )
+ if ( KMessageBox::warningContinueCancel( this,
+ i18n( "Multiple inheritance requires QObject derivative to be first and unique in base class list." ),
+ i18n( "Warning" ), KStdGuiItem::cont(), "Check QWidget inheritance rules" ) == KMessageBox::Cancel )
+ childclass_box->setChecked( false );
+}
+
+void CppNewClassDialog::qobject_box_stateChanged( int val )
+{
+ if ( childclass_box->isChecked() )
+ return ;
+
+ if ( baseclasses_view->childCount() == 0 )
+ {
+ addBaseClass();
+ basename_edit->setText( "QObject" );
+ }
+
+
+ objc_box->setEnabled( !val );
+ gtk_box->setEnabled( !val );
+}
+
+void CppNewClassDialog::gtk_box_stateChanged( int val )
+{
+ class_tabs->setTabEnabled( tab2, !val );
+ childclass_box->setEnabled( !val && m_part->qtBuildConfig()->isUsed() );
+ objc_box->setEnabled( !val );
+ qobject_box->setEnabled( !val && m_part->qtBuildConfig()->isUsed() );
+ namespace_edit->setEnabled( !val );
+
+ basename_edit->setEnabled( !val );
+ virtual_box->setEnabled( !val );
+ public_button->setEnabled( !val );
+ protected_button->setEnabled( !val );
+ private_button->setEnabled( !val );
+ addbaseclass_button->setEnabled( !val );
+ rembaseclass_button->setEnabled( !val );
+ upbaseclass_button->setEnabled( !val );
+ downbaseclass_button->setEnabled( !val );
+ baseclasses_view->setEnabled( !val );
+ baseinclude_edit->setEnabled( !val );
+}
+
+
+void CppNewClassDialog::accept()
+{
+ ClassGenerator generator( *this );
+ if ( generator.generate() )
+ QDialog::accept();
+
+}
+
+void CppNewClassDialog::setStateOfInheritanceEditors( bool state, bool hideList )
+{
+ basename_edit->setEnabled( state );
+ virtual_box->setEnabled( state );
+ public_button->setEnabled( state );
+ protected_button->setEnabled( state );
+ private_button->setEnabled( state );
+ scope_box->setEnabled( state );
+ baseinclude_edit->setEnabled( state );
+ if ( state )
+ baseclasses_view->setEnabled( state );
+ else
+ baseclasses_view->setEnabled( hideList ? state : true );
+ rembaseclass_button->setEnabled( state );
+ if ( !state )
+ {
+ upbaseclass_button->setEnabled( state );
+ downbaseclass_button->setEnabled( state );
+ }
+}
+
+void CppNewClassDialog::addBaseClass()
+{
+ baseincludeModified = false;
+ if ( baseclasses_view->selectedItem() )
+ baseclasses_view->selectedItem() ->setSelected( false );
+ QListViewItem* it = new QListViewItem( baseclasses_view, baseclasses_view->lastItem(),
+ QString::null, "public", QString( "%1" ).arg( scope_box->currentItem() ), QString::null, "false" );
+ setStateOfInheritanceEditors( true );
+ public_button->setChecked( true );
+ virtual_box->setChecked( false );
+ basename_edit->setText( QString::null );
+ basename_edit->setFocus();
+ baseclasses_view->setSelected( it, true );
+}
+
+void CppNewClassDialog::remBaseClass()
+{
+ bool basename_focused = false;
+ if ( basename_edit->hasFocus() )
+ {
+ basename_focused = true;
+ basename_edit->clearFocus();
+ }
+ if ( baseclasses_view->selectedItem() )
+ {
+ QListViewItem * it = baseclasses_view->selectedItem();
+ remClassFromAdv( it->text( 0 ) );
+ baseclasses_view->selectedItem() ->setSelected( false );
+ if ( it->itemBelow() )
+ baseclasses_view->setSelected( it->itemBelow(), true );
+ else if ( it->itemAbove() )
+ baseclasses_view->setSelected( it->itemAbove(), true );
+ delete it;
+ if ( baseclasses_view->childCount() == 0 )
+ setStateOfInheritanceEditors( false );
+ baseincludeModified = false;
+ }
+ if ( basename_focused )
+ basename_edit->setFocus();
+}
+
+void CppNewClassDialog::remBaseClassOnly()
+{
+ if ( baseclasses_view->selectedItem() )
+ {
+ QListViewItem * it = baseclasses_view->selectedItem();
+ baseclasses_view->selectedItem() ->setSelected( false );
+ if ( it->itemBelow() )
+ baseclasses_view->setSelected( it->itemBelow(), true );
+ else if ( it->itemAbove() )
+ baseclasses_view->setSelected( it->itemAbove(), true );
+ delete it;
+ if ( baseclasses_view->childCount() == 0 )
+ setStateOfInheritanceEditors( false );
+ baseincludeModified = true;
+ }
+}
+
+void CppNewClassDialog::remClassFromAdv( QString text )
+{
+ // Strip off namespace qualification
+ if ( text.contains( "::" ) )
+ text = text.mid( text.findRev( "::" ) + 2 );
+
+ removeTemplateParams( text );
+ QListViewItem *it = 0;
+ if ( ( it = access_view->findItem( text, 0 ) ) )
+ delete it;
+ if ( ( it = methods_view->findItem( text, 0 ) ) )
+ delete it;
+ if ( ( it = constructors_view->findItem( text, 0 ) ) )
+ {
+ /// @todo changing constructors text in constructors_cpp_edit
+ // and constructors_h_edit must be implemented
+
+ /* int *para = new int(1);
+ int *index = new int(1);
+ if (constructors_cpp_edit->find(text + "(", true, false, true, para, index))
+ {
+ qWarning("%s( found", text.latin1());
+ if (para) constructors_cpp_edit->removeParagraph(*para);
+ }*/
+ delete it;
+ }
+}
+
+void CppNewClassDialog::currBaseNameChanged( const QString &text )
+{
+ if ( baseclasses_view->selectedItem() && ( basename_edit->hasFocus() ) )
+ {
+ if ( class_tabs->isTabEnabled( tab2 ) )
+ {
+ //check for this class in the adv. inheritance lists
+ //and delete if it exists
+ remClassFromAdv( baseclasses_view->selectedItem() ->text( 0 ) );
+ //parse new base class
+ parseClass( text, baseclasses_view->selectedItem() ->text( 1 ) );
+ }
+ baseclasses_view->selectedItem() ->setText( 0, text );
+ updateConstructorsOrder();
+ }
+}
+
+void CppNewClassDialog::currBasePrivateSet()
+{
+ if ( baseclasses_view->selectedItem() )
+ {
+ setAccessForBase( baseclasses_view->selectedItem() ->text( 0 ), "private" );
+ baseclasses_view->selectedItem() ->setText( 1, ( virtual_box->isChecked() ? "virtual " : "" ) + QString( "private" ) );
+ }
+}
+
+void CppNewClassDialog::currBaseProtectedSet()
+{
+ if ( baseclasses_view->selectedItem() )
+ {
+ setAccessForBase( baseclasses_view->selectedItem() ->text( 0 ), "protected" );
+ baseclasses_view->selectedItem() ->setText( 1, ( virtual_box->isChecked() ? "virtual " : "" ) + QString( "protected" ) );
+ }
+}
+
+void CppNewClassDialog::currBasePublicSet()
+{
+ if ( baseclasses_view->selectedItem() )
+ {
+ setAccessForBase( baseclasses_view->selectedItem() ->text( 0 ), "public" );
+ baseclasses_view->selectedItem() ->setText( 1, ( virtual_box->isChecked() ? "virtual " : "" ) + QString( "public" ) );
+ }
+}
+
+void CppNewClassDialog::scopeboxActivated( int value )
+{
+ if ( baseclasses_view->selectedItem() )
+ {
+ baseclasses_view->selectedItem() ->setText( 2, QString( "%1" ).arg( value ) );
+ }
+}
+
+void CppNewClassDialog::currBaseVirtualChanged( int val )
+{
+ if ( baseclasses_view->selectedItem() )
+ {
+ baseclasses_view->selectedItem() ->setText( 1, QString( val ? "virtual " : "" ) +
+ QString( private_button->isChecked() ? "private" : "" ) +
+ QString( protected_button->isChecked() ? "protected" : "" ) +
+ QString( public_button->isChecked() ? "public" : "" ) );
+ }
+}
+
+void CppNewClassDialog::currBaseSelected( QListViewItem *it )
+{
+ if ( it == 0 )
+ {
+ setStateOfInheritanceEditors( false, false );
+ return ;
+ }
+ setStateOfInheritanceEditors( true );
+ basename_edit->setText( it->text( 0 ) );
+ baseinclude_edit->setText( it->text( 3 ) );
+ scope_box->setCurrentItem( it->text( 2 ).toInt() );
+ if ( it->text( 1 ).contains( "private" ) )
+ private_button->setChecked( true );
+ else
+ private_button->setChecked( false );
+ if ( it->text( 1 ).contains( "protected" ) )
+ protected_button->setChecked( true );
+ else
+ protected_button->setChecked( false );
+ if ( it->text( 1 ).contains( "public" ) )
+ public_button->setChecked( true );
+ else
+ public_button->setChecked( false );
+ if ( it->text( 1 ).contains( "virtual" ) )
+ virtual_box->setChecked( true );
+ else
+ virtual_box->setChecked( false );
+ checkUpButtonState();
+ checkDownButtonState();
+
+ if ( it->text( 4 ) == "true" )
+ baseincludeModified = true;
+ else
+ baseincludeModified = false;
+}
+
+void CppNewClassDialog::upbaseclass_button_clicked()
+{
+ bool basename_focused = false;
+ if ( basename_edit->hasFocus() )
+ {
+ basename_focused = true;
+ basename_edit->clearFocus();
+ }
+ if ( baseclasses_view->selectedItem() )
+ {
+ QListViewItem * it = baseclasses_view->selectedItem();
+ if ( it->itemAbove() )
+ {
+ QListViewItem * newit;
+ if ( it->itemAbove() ->itemAbove() )
+ newit = new QListViewItem( baseclasses_view, it->itemAbove() ->itemAbove(),
+ it->text( 0 ), it->text( 1 ), it->text( 2 ), it->text( 3 ), it->text( 4 ) );
+ else
+ newit = new QListViewItem( baseclasses_view, it->text( 0 ), it->text( 1 ),
+ it->text( 2 ), it->text( 3 ), it->text( 4 ) );
+ remBaseClassOnly();
+ baseclasses_view->setSelected( newit, true );
+ checkUpButtonState();
+ updateConstructorsOrder();
+ }
+ }
+ if ( basename_focused )
+ basename_edit->setFocus();
+}
+
+void CppNewClassDialog::downbaseclass_button_clicked()
+{
+ bool basename_focused = false;
+ if ( basename_edit->hasFocus() )
+ {
+ basename_focused = true;
+ basename_edit->clearFocus();
+ }
+ if ( baseclasses_view->selectedItem() )
+ {
+ QListViewItem * it = baseclasses_view->selectedItem();
+ if ( it->itemBelow() )
+ {
+ QListViewItem * newit = new QListViewItem( baseclasses_view, it->itemBelow(),
+ it->text( 0 ), it->text( 1 ), it->text( 2 ), it->text( 3 ), it->text( 3 ) );
+ remBaseClassOnly();
+ baseclasses_view->setSelected( newit, true );
+ setStateOfInheritanceEditors( true );
+ checkDownButtonState();
+ updateConstructorsOrder();
+ }
+ }
+ if ( basename_focused )
+ basename_edit->setFocus();
+}
+
+void CppNewClassDialog::updateConstructorsOrder()
+{
+ QListViewItemIterator it( baseclasses_view );
+ QListViewItem *c_it;
+ QListViewItem *fc_it = 0;
+
+ while ( it.current() )
+ {
+ if ( ( c_it = constructors_view->findItem( it.current() ->text( 0 ), 0 ) ) )
+ {
+ c_it->moveItem( fc_it );
+ fc_it = c_it;
+ }
+ ++it;
+ }
+}
+
+
+void CppNewClassDialog::checkUpButtonState()
+{
+ if ( baseclasses_view->selectedItem() )
+ upbaseclass_button->setEnabled( baseclasses_view->selectedItem() ->itemAbove() );
+}
+
+void CppNewClassDialog::checkDownButtonState()
+{
+ if ( baseclasses_view->selectedItem() )
+ downbaseclass_button->setEnabled( baseclasses_view->selectedItem() ->itemBelow() );
+}
+
+void CppNewClassDialog::baseclasses_view_selectionChanged()
+{
+ /* if (baseclasses_view->selectedItem())
+ {
+ setStateOfInheritanceEditors(false, false);
+ }*/
+}
+
+void CppNewClassDialog::changeToPrivate()
+{
+ if ( access_view->selectedItem() )
+ access_view->selectedItem() ->setText( 2, "private" );
+}
+
+void CppNewClassDialog::changeToProtected()
+{
+ if ( access_view->selectedItem() )
+ access_view->selectedItem() ->setText( 2, "protected" );
+}
+
+void CppNewClassDialog::changeToPublic()
+{
+ if ( access_view->selectedItem() )
+ access_view->selectedItem() ->setText( 2, "public" );
+}
+
+void CppNewClassDialog::changeToInherited()
+{
+ if ( access_view->selectedItem() )
+ access_view->selectedItem() ->setText( 2, QString::null );
+}
+
+void CppNewClassDialog::newTabSelected( const QString& /*text*/ )
+{
+ /* if (text == i18n("&Advanced Inheritance"))
+ reloadAdvancedInheritance(true);*/
+}
+
+void CppNewClassDialog::newTabSelected( QWidget* /*w*/ )
+{
+ /* if ( QString(w->name()) == QString("tab2"))
+ {
+ reloadAdvancedInheritance(false);
+ }*/
+}
+
+
+void CppNewClassDialog::reloadAdvancedInheritance( bool clean )
+{
+ clearConstructorsList( clean );
+ clearMethodsList( clean );
+ clearUpgradeList( clean );
+
+ QListViewItemIterator it( baseclasses_view );
+ while ( it.current() )
+ {
+ if ( ! ( it.current() ->text( 0 ).isEmpty() ) )
+ {
+ parseClass( it.current() ->text( 0 ), it.current() ->text( 1 ) );
+ }
+ ++it;
+ }
+}
+
+void CppNewClassDialog::parseClass( QString clName, QString inheritance )
+{
+ // Determine namespace
+ QStringList clNamespace = currNamespace;
+ bool clFullQualified = false;
+
+ if ( clName.contains( "::" ) )
+ {
+ // Full qualified, override imported namespace
+ clFullQualified = true;
+ int splitpoint = clName.findRev( "::" );
+ clNamespace = QStringList::split( "::", clName.left( splitpoint ) );
+ clName = clName.mid( splitpoint + 2 );
+ }
+
+ kdDebug( 9007 ) << "clFullQualified = " << clFullQualified << endl;
+ kdDebug( 9007 ) << "clName = " << clName << endl;
+ QString debMsg = "clNamespace = ";
+ for ( QStringList::const_iterator it = clNamespace.begin();
+ it != clNamespace.end(); ++it )
+ debMsg += ( *it ) + "::";
+ kdDebug( 9007 ) << debMsg << endl;
+
+ QString templateAdd = templateActualParamsFormatted( clName );
+ removeTemplateParams( clName );
+
+ ClassList myClasses; // = m_part->codeModel()->globalNamespace()->classByName(clName);
+
+ NamespaceDom namespaceDom = m_part->codeModel() ->globalNamespace();
+
+ QStringList::const_iterator namespaceIt = clNamespace.begin();
+ for ( ; namespaceIt != clNamespace.end(); ++namespaceIt )
+ {
+ if ( ! namespaceDom -> hasNamespace( *namespaceIt ) )
+ break;
+ namespaceDom = namespaceDom->namespaceByName( *namespaceIt );
+ }
+ if ( namespaceIt == clNamespace.end() )
+ {
+ // Found specified namespace
+ myClasses = namespaceDom->classByName( clName );
+ // Fall back to global namespace if class was not fully qualified and is not found in selected namespace
+ if ( myClasses.empty() && ! clFullQualified )
+ myClasses = m_part -> codeModel() -> globalNamespace() -> classByName( clName );
+ }
+
+ if ( myClasses.empty() )
+ {
+ kdDebug() << "Trying persistent class store..." << endl;
+ parsePCSClass( clName, inheritance );
+ }
+
+ for ( ClassList::const_iterator classIt = myClasses.begin(); classIt != myClasses.end(); ++classIt )
+ {
+ PCheckListItem<ClassDom> *it = new PCheckListItem<ClassDom>( *classIt, constructors_view, ( *classIt ) ->name() );
+ it->templateAddition = templateAdd;
+ PListViewItem<ClassDom> *over = new PListViewItem<ClassDom>( *classIt, methods_view, ( *classIt ) ->name() );
+ over->templateAddition = templateAdd;
+ QListViewItem *over_methods = new QListViewItem( over, i18n( "Methods" ) );
+ QListViewItem *over_slots = new QListViewItem( over, i18n( "Slots (Qt-specific)" ) );
+ PListViewItem<ClassDom> *access = new PListViewItem<ClassDom>( *classIt, access_view, ( *classIt ) ->name() );
+ QListViewItem *access_methods = new QListViewItem( access, i18n( "Methods" ) );
+ QListViewItem *access_slots = new QListViewItem( access, i18n( "Slots (Qt-specific)" ) );
+ QListViewItem *access_attrs = new QListViewItem( access, i18n( "Attributes" ) );
+
+ FunctionList functionList = ( *classIt ) ->functionList();
+ for ( FunctionList::const_iterator methodIt = functionList.begin();
+ methodIt != functionList.end(); ++methodIt )
+ {
+ if ( ( *methodIt ) ->isSignal() )
+ {
+ // don't show signals as overridable methods
+ }
+ else if ( isConstructor( ( *classIt ) ->name(), *methodIt ) )
+ {
+ addToConstructorsList( it, *methodIt );
+ }
+ else if ( ( *methodIt ) ->isSlot() )
+ {
+ if ( ( *methodIt ) ->access() != CodeModelItem::Private )
+ {
+ addToMethodsList( over_slots, *methodIt );
+
+ QString inhModifier;
+ //protected inheritance gives protected attributes
+ if ( inheritance.contains( "protected" ) )
+ inhModifier = "protected";
+ //private inheritance gives private attributes
+ else if ( inheritance.contains( "private" ) )
+ inhModifier = "private";
+ //public inheritance gives protected and public attributes
+ else if ( inheritance.contains( "public" ) )
+ inhModifier = ( *methodIt ) ->access() == CodeModelItem::Public ? "public" : "protected";
+ addToUpgradeList( access_slots, *methodIt, inhModifier );
+ }
+ }
+ else
+ {
+ // display only public and protected methods of the base class
+ if ( ( !isDestructor( ( *classIt ) ->name(), *methodIt ) ) && ( ( *methodIt ) ->access() != CodeModelItem::Private ) )
+ {
+ addToMethodsList( over_methods, *methodIt );
+
+ // see what modifier is given for the base class
+ QString inhModifier;
+ //protected inheritance gives protected methods
+ if ( inheritance.contains( "protected" ) )
+ inhModifier = "protected";
+ //private inheritance gives private methods
+ else if ( inheritance.contains( "private" ) )
+ inhModifier = "private";
+ //public inheritance gives protected and public methods
+ else if ( inheritance.contains( "public" ) )
+ inhModifier = ( *methodIt ) ->access() == CodeModelItem::Public ? "public" : "protected";
+ addToUpgradeList( access_methods, *methodIt, inhModifier );
+ }
+ }
+ }
+
+ VariableList variableList = ( *classIt ) ->variableList();
+ for ( VariableList::const_iterator varIt = variableList.begin();
+ varIt != variableList.end(); ++varIt )
+ {
+ if ( ( *varIt ) ->access() != CodeModelItem::Private )
+ {
+ QString inhModifier;
+ //protected inheritance gives protected attributes
+ if ( inheritance.contains( "protected" ) )
+ inhModifier = "protected";
+ //private inheritance gives private attributes
+ else if ( inheritance.contains( "private" ) )
+ inhModifier = "private";
+ //public inheritance gives protected and public attributes
+ else if ( inheritance.contains( "public" ) )
+ inhModifier = ( *varIt ) ->access() == CodeModelItem::Public ? "public" : "protected";
+ addToUpgradeList( access_attrs, *varIt, inhModifier );
+ }
+ }
+ }
+}
+
+bool CppNewClassDialog::isConstructor( QString className, const FunctionDom &method )
+{
+ // regexp: myclass\\s*\\(\\s*(const)?\\s*myclass\\s*&[A-Za-z_0-9\\s]*\\) is for copy constructors
+ if ( ( className == method->name() ) )
+ {
+ qWarning( "1x" );
+ if ( ( method->argumentList().count() == 1 ) && ( m_part->formatModelItem( method->argumentList() [ 0 ].data() ).contains( QRegExp( " *(const)? *" + className + " *& *" ) ) ) )
+ // if ( method->asString().contains(QRegExp(className + "\\s*\\(\\s*(const)?\\s*" + className + "\\s*&[A-Za-z_0-9\\s]*\\)", true, false)) )
+ return false;
+ else
+ return true;
+ }
+ else
+ return false;
+}
+
+void CppNewClassDialog::addToConstructorsList( QCheckListItem *myClass, FunctionDom method )
+{
+ new PCheckListItem<FunctionDom>( method, myClass, m_part->formatModelItem( method.data() ), QCheckListItem::RadioButton );
+}
+
+void CppNewClassDialog::addToMethodsList( QListViewItem *parent, FunctionDom method )
+{
+ PCheckListItem<FunctionDom> *it = new PCheckListItem<FunctionDom>( method, parent, m_part->formatModelItem( method.data() ), QCheckListItem::CheckBox );
+ method->isAbstract() ? it->setText( 1, i18n( "replace" ) ) : it->setText( 1, i18n( "extend" ) );
+}
+
+void CppNewClassDialog::addToUpgradeList( QListViewItem *parent, FunctionDom method, QString modifier )
+{
+ PListViewItem<FunctionDom> *it = new PListViewItem<FunctionDom>( method, parent, m_part->formatModelItem( method.data() ) );
+ it->setText( 1, modifier );
+}
+
+void CppNewClassDialog::addToUpgradeList( QListViewItem *parent, VariableDom attr, QString modifier )
+{
+ PListViewItem<VariableDom> *it = new PListViewItem<VariableDom>( attr, parent, m_part->formatModelItem( attr.data() ) );
+ it->setText( 1, modifier );
+}
+
+
+void CppNewClassDialog::parsePCSClass( QString clName, QString inheritance )
+{
+ // Determine namespace
+ QStringList clNamespace = currNamespace;
+ bool clFullQualified = false;
+
+ if ( clName.contains( "::" ) )
+ {
+ // Full qualified, override imported namespace
+ clFullQualified = true;
+ int splitpoint = clName.findRev( "::" );
+ clNamespace = QStringList::split( "::", clName.left( splitpoint ) );
+ clName = clName.mid( splitpoint + 2 );
+ }
+
+ kdDebug( 9007 ) << "clFullQualified = " << clFullQualified << endl;
+ kdDebug( 9007 ) << "clName = " << clName << endl;
+ kdDebug( 9007 ) << "clNamespace = " << clNamespace.join( "." ) << endl;
+
+ QString templateAdd = templateActualParamsFormatted( clName );
+ removeTemplateParams( clName );
+
+ myModel = new CodeModel();
+ StoreConverter converter( m_part, myModel );
+ converter.PCSClassToCodeModel( clName, clNamespace );
+
+ ClassList myClasses = myModel->globalNamespace() ->classByName( clName );
+ // kdDebug() << " tag class count: " << myClasses.count() << endl;
+
+ for ( ClassList::const_iterator classIt = myClasses.begin(); classIt != myClasses.end(); ++classIt )
+ {
+ kdDebug() << " this is class " << ( *classIt ) ->name() << endl;
+ PCheckListItem<ClassDom> *it = new PCheckListItem<ClassDom>( *classIt, constructors_view, ( *classIt ) ->name() );
+ it->templateAddition = templateAdd;
+ PListViewItem<ClassDom> *over = new PListViewItem<ClassDom>( *classIt, methods_view, ( *classIt ) ->name() );
+ over->templateAddition = templateAdd;
+ QListViewItem *over_methods = new QListViewItem( over, i18n( "Methods" ) );
+ QListViewItem *over_slots = new QListViewItem( over, i18n( "Slots (Qt-specific)" ) );
+ PListViewItem<ClassDom> *access = new PListViewItem<ClassDom>( *classIt, access_view, ( *classIt ) ->name() );
+ QListViewItem *access_methods = new QListViewItem( access, i18n( "Methods" ) );
+ QListViewItem *access_slots = new QListViewItem( access, i18n( "Slots (Qt-specific)" ) );
+ QListViewItem *access_attrs = new QListViewItem( access, i18n( "Attributes" ) );
+
+ FunctionList functionList = ( *classIt ) ->functionList();
+ for ( FunctionList::const_iterator methodIt = functionList.begin();
+ methodIt != functionList.end(); ++methodIt )
+ {
+ if ( ( *methodIt ) ->isSignal() )
+ {
+ //don't show signals as overridable methods
+ }
+ else if ( isConstructor( ( *classIt ) ->name(), *methodIt ) )
+ {
+ addToConstructorsList( it, *methodIt );
+ }
+ else if ( ( *methodIt ) ->isSlot() )
+ {
+ if ( ( *methodIt ) ->access() != CodeModelItem::Private )
+ {
+ addToMethodsList( over_slots, *methodIt );
+
+ QString inhModifier;
+ //protected inheritance gives protected attributes
+ if ( inheritance.contains( "protected" ) )
+ inhModifier = "protected";
+ //private inheritance gives private attributes
+ else if ( inheritance.contains( "private" ) )
+ inhModifier = "private";
+ //public inheritance gives protected and public attributes
+ else if ( inheritance.contains( "public" ) )
+ inhModifier = ( *methodIt ) ->access() == CodeModelItem::Public ? "public" : "protected";
+ addToUpgradeList( access_slots, *methodIt, inhModifier );
+ }
+ }
+ else
+ {
+ //display only public and protected methods of the base class
+ if ( ( !isDestructor( ( *classIt ) ->name(), *methodIt ) ) && ( ( *methodIt ) ->access() != CodeModelItem::Private ) )
+ {
+ addToMethodsList( over_methods, *methodIt );
+
+ //see what modifier is given for the base class
+ QString inhModifier;
+ //protected inheritance gives protected methods
+ if ( inheritance.contains( "protected" ) )
+ inhModifier = "protected";
+ //private inheritance gives private methods
+ else if ( inheritance.contains( "private" ) )
+ inhModifier = "private";
+ //public inheritance gives protected and public methods
+ else if ( inheritance.contains( "public" ) )
+ inhModifier = ( *methodIt ) ->access() == CodeModelItem::Public ? "public" : "protected";
+ addToUpgradeList( access_methods, *methodIt, inhModifier );
+ }
+ }
+ }
+
+ VariableList variableList = ( *classIt ) ->variableList();
+ for ( VariableList::const_iterator varIt = variableList.begin();
+ varIt != variableList.end(); ++varIt )
+ {
+ if ( ( *varIt ) ->access() != CodeModelItem::Private )
+ {
+ QString inhModifier;
+ //protected inheritance gives protected attributes
+ if ( inheritance.contains( "protected" ) )
+ inhModifier = "protected";
+ //private inheritance gives private attributes
+ else if ( inheritance.contains( "private" ) )
+ inhModifier = "private";
+ //public inheritance gives protected and public attributes
+ else if ( inheritance.contains( "public" ) )
+ inhModifier = ( *varIt ) ->access() == CodeModelItem::Public ? "public" : "protected";
+ addToUpgradeList( access_attrs, *varIt, inhModifier );
+ }
+ }
+ }
+}
+
+void CppNewClassDialog::clear_selection_button_clicked()
+{
+ QListViewItemIterator it( constructors_view );
+ while ( it.current() )
+ {
+ PCheckListItem<FunctionDom> *curr;
+ if ( ( curr = dynamic_cast<PCheckListItem<FunctionDom>* >( it.current() ) ) )
+ curr->setOn( false );
+ ++it;
+ }
+}
+
+void CppNewClassDialog::clearConstructorsList( bool clean )
+{
+ if ( clean )
+ constructors_view->clear();
+ /* else
+ {
+ QListViewItemIterator it( constructors_view );
+ while ( it.current() )
+ {
+ if ( ! currBaseClasses.contains(it.current().text(0)) )
+ delete it.current();
+ ++it;
+ }
+ }*/
+}
+
+void CppNewClassDialog::clearMethodsList( bool clean )
+{
+ if ( clean )
+ methods_view->clear();
+}
+
+void CppNewClassDialog::clearUpgradeList( bool clean )
+{
+ if ( clean )
+ access_view->clear();
+}
+
+void CppNewClassDialog::setAccessForItem( QListViewItem *curr, QString newAccess, bool isPublic )
+{
+ if ( newAccess == "public" )
+ curr->setText( 1, isPublic ? "public" : "protected" );
+ else
+ curr->setText( 1, newAccess );
+ if ( !curr->text( 2 ).isEmpty() )
+ {
+ if ( ( curr->text( 2 ) == "private" ) && ( ( newAccess == "public" ) || ( newAccess == "protected" ) ) )
+ curr->setText( 2, QString::null );
+ if ( ( curr->text( 2 ) == "protected" ) && ( ( newAccess == "public" ) && ( isPublic ) ) )
+ curr->setText( 2, QString::null );
+ }
+}
+
+void CppNewClassDialog::setAccessForBase( QString baseclass, QString newAccess )
+{
+ QListViewItem * base;
+
+ if ( ( base = access_view->findItem( baseclass, 0 ) ) )
+ {
+ QListViewItemIterator it( base );
+ while ( it.current() )
+ {
+ if ( !it.current() ->text( 1 ).isEmpty() )
+ {
+ PListViewItem<VariableDom> *curr;
+ PListViewItem<FunctionDom> *curr_m;
+ if ( ( curr = dynamic_cast<PListViewItem<VariableDom>* >( it.current() ) ) )
+ setAccessForItem( curr, newAccess, curr->item() ->access() == CodeModelItem::Public );
+ else if ( ( curr_m = dynamic_cast<PListViewItem<FunctionDom>* >( it.current() ) ) )
+ setAccessForItem( curr_m, newAccess, curr_m->item() ->access() == CodeModelItem::Public );
+ }
+ ++it;
+ }
+ }
+}
+
+
+void CppNewClassDialog::access_view_mouseButtonPressed( int button, QListViewItem * item, const QPoint &p, int /*c*/ )
+{
+ if ( item && ( ( button == LeftButton ) || ( button == RightButton ) ) && ( item->depth() > 1 ) )
+ {
+ accessMenu->setItemEnabled( 1, true );
+ accessMenu->setItemEnabled( 2, true );
+ accessMenu->setItemEnabled( 3, true );
+ if ( item->text( 1 ) == "protected" )
+ {
+ accessMenu->setItemEnabled( 1, false );
+ }
+ if ( item->text( 1 ) == "public" )
+ {
+ accessMenu->setItemEnabled( 1, false );
+ accessMenu->setItemEnabled( 2, false );
+ }
+ accessMenu->exec( p );
+
+ /* accessMenu->setItemEnabled(1, item->text(1) == "private" ? false : true );
+ accessMenu->setItemEnabled(2, item->text(1) == "protected" ? false : true );
+ accessMenu->setItemEnabled(3, item->text(1) == "public" ? false : true );*/
+ }
+}
+
+
+void CppNewClassDialog::methods_view_mouseButtonPressed( int button , QListViewItem * item, const QPoint&p , int /*c*/ )
+{
+ if ( item && ( button == RightButton ) && ( item->depth() > 1 ) && ( ! item->text( 1 ).isEmpty() ) )
+ {
+ overMenu->exec( p );
+ }
+}
+
+void CppNewClassDialog::extendFunctionality()
+{
+ if ( methods_view->selectedItem() )
+ methods_view->selectedItem() ->setText( 1, i18n( "extend" ) );
+}
+
+void CppNewClassDialog::replaceFunctionality()
+{
+ if ( methods_view->selectedItem() )
+ methods_view->selectedItem() ->setText( 1, i18n( "replace" ) );
+}
+
+void CppNewClassDialog::selectall_button_clicked()
+{
+ QListViewItemIterator it( constructors_view );
+ while ( it.current() )
+ {
+ PCheckListItem<FunctionDom> *curr;
+ if ( ( curr = dynamic_cast<PCheckListItem<FunctionDom>* >( it.current() ) ) )
+ curr->setOn( true );
+ ++it;
+ }
+}
+
+void CppNewClassDialog::to_constructors_list_clicked()
+{
+ QString templateAdd = templateStrFormatted().isEmpty() ? QString::null : templateStrFormatted() + "\n";
+ QString constructor_h = classNameFormatted();
+ QString constructor_cpp = templateAdd + classNameFormatted() + templateParamsFormatted() + "::" + classNameFormatted();
+ constructor_h += "(";
+ constructor_cpp += "(";
+ QString params_h;
+ QString params_cpp;
+ QString base;
+ int unnamed = 1;
+
+ QListViewItemIterator it( constructors_view );
+ while ( it.current() )
+ {
+ PCheckListItem<FunctionDom> *curr;
+ if ( ( curr = dynamic_cast<PCheckListItem<FunctionDom>* >( it.current() ) ) )
+ {
+ if ( curr->isOn() && curr->parent() )
+ {
+ //fill the base classes list
+ base += base.isEmpty() ? ": " : ", ";
+ base += curr->parent() ->text( 0 );
+ PCheckListItem<ClassDom> *p;
+ if ( ( p = dynamic_cast<PCheckListItem<ClassDom>* >( curr->parent() ) ) )
+ {
+ base += p->templateAddition;
+ }
+ params_h += params_h.isEmpty() ? "" : ", ";
+
+ //fill arguments for both constructor and base class initializer
+ QString cparams;
+ QString bparams;
+ ArgumentList argumentList = curr->item() ->argumentList();
+ for ( ArgumentList::const_iterator argIt = argumentList.begin();
+ argIt != argumentList.end(); ++argIt )
+ {
+ bparams += bparams.isEmpty() ? "" : ", ";
+ cparams += cparams.isEmpty() ? "" : ", ";
+ cparams += ( *argIt ) ->type() + " ";
+ if ( ( *argIt ) ->name().isEmpty() )
+ {
+ cparams += QString( "arg%1" ).arg( unnamed );
+ bparams += QString( "arg%1" ).arg( unnamed++ );
+ }
+ else
+ {
+ bparams += ( *argIt ) ->name();
+ cparams += ( *argIt ) ->name();
+ }
+ if ( !( *argIt ) ->defaultValue().isEmpty() )
+ bparams += " = " + ( *argIt ) ->defaultValue();
+ }
+ params_h += cparams;
+ params_cpp = params_h;
+ base += "(" + bparams + ")";
+ }
+ }
+ ++it;
+ }
+
+ constructor_cpp += params_cpp + ")" + base + QString( "\n{\n}\n\n\n" );
+ constructor_h += params_h + ");\n\n";
+
+ constructors_h_edit->append( constructor_h );
+ constructors_cpp_edit->append( constructor_cpp );
+}
+
+
+
+/* ----------------------------------------------------------
+ ----------------------------------------------------------
+ ----------------------------------------------------------
+ ----------------------------------------------------------
+
+ class CppNewClassDialog::ClassGenerator
+
+ ----------------------------------------------------------
+ ----------------------------------------------------------
+ ----------------------------------------------------------
+ ---------------------------------------------------------- */
+
+
+bool CppNewClassDialog::ClassGenerator::validateInput()
+{
+ className = dlg.classname_edit->text().simplifyWhiteSpace();
+ QString temp = className;
+ className.replace( QRegExp( "template *<.*> *(class *)?" ), "" );
+ templateStr = temp.replace( QRegExp( QRegExp_escape( className ) ), "" );
+ templateStr.replace( QRegExp( " *class *$" ), "" );
+
+ templateParams = templateStr;
+ templateParams.replace( QRegExp( "^ *template *" ), "" );
+ templateParams.replace( QRegExp( " *class *" ), "" );
+ templateParams.simplifyWhiteSpace();
+
+ if ( className.isEmpty() )
+ {
+ KMessageBox::error( &dlg, i18n( "You must enter a classname." ) );
+ return false;
+ }
+
+ header = dlg.header_edit->text().simplifyWhiteSpace();
+ if ( header.isEmpty() )
+ {
+ KMessageBox::error( &dlg, i18n( "You must enter a name for the header file." ) );
+ return false;
+ }
+ implementation = dlg.implementation_edit->text().simplifyWhiteSpace();
+ if ( (!headeronly) && implementation.isEmpty() )
+ {
+ KMessageBox::error( &dlg, i18n( "You must enter a name for the implementation file." ) );
+ return false;
+ }
+
+ /// \FIXME
+ if ( ( header.find( '/' ) != -1 || implementation.find( '/' ) != -1 ) && !( dlg.m_part->project() ->options() & KDevProject::UsesQMakeBuildSystem) )
+ {
+ KMessageBox::error( &dlg, i18n( "Generated files will always be added to the "
+ "active directory, so you must not give an "
+ "explicit subdirectory." ) );
+ return false;
+ }
+
+ return true;
+}
+
+
+bool CppNewClassDialog::ClassGenerator::generate()
+{
+ if ( !validateInput() )
+ return false;
+
+ project = dlg.m_part->project();
+ subDir = project->projectDirectory() + "/";
+ if ( !project->activeDirectory().isEmpty() ){
+ subDir += project->activeDirectory();
+ subDir = QDir::cleanDirPath(subDir);
+ subDir += "/";
+ }
+ headerPath = subDir + header;
+ implementationPath = subDir + implementation;
+
+ if ( QFileInfo( headerPath ).exists() || QFileInfo( implementationPath ).exists() )
+ {
+ KMessageBox::error( &dlg, i18n( "KDevelop is not able to add classes "
+ "to existing header or implementation files." ) );
+ return false;
+ }
+
+ if( ( dlg.m_part->project() ->options() & KDevProject::UsesQMakeBuildSystem) )
+ {
+ QDir dir( QFileInfo( project->projectDirectory()+QString( QChar( QDir::separator() ) )+project->activeDirectory() + QString( QChar( QDir::separator() ) ) + header ).dirPath() );
+ kdDebug(9024) << "Dir for new file:" << dir.absPath() << endl;
+ if( dir.isRelative() )
+ dir.convertToAbs();
+
+ QValueStack<QString> dirsToCreate;
+ while( !dir.exists() )
+ {
+ dirsToCreate.push( dir.dirName() );
+ dir.cdUp();
+ }
+
+ while( !dirsToCreate.isEmpty() )
+ {
+ dir.mkdir( dirsToCreate.top() );
+ dir.cd( dirsToCreate.pop() );
+ }
+ }
+ common_text();
+
+ if(!headeronly) gen_implementation();
+
+ gen_interface();
+
+ QStringList fileList;
+ QString file;
+ if( project->activeDirectory().isEmpty() )
+ file = header;
+ else
+ file = project->activeDirectory() + "/" + header;
+ fileList.append ( file );
+ if (!headeronly)
+ {
+ if( project->activeDirectory().isEmpty() )
+ file = implementation;
+ else
+ file = project->activeDirectory() + "/" + implementation;
+ fileList.append ( file );
+ }
+ project->addFiles ( fileList );
+
+ return true;
+}
+
+void CppNewClassDialog::ClassGenerator::common_text()
+{
+
+ // common
+
+ namespaceStr = dlg.namespace_edit->text();
+ namespaces = QStringList::split( QString( "::" ), namespaceStr );
+
+ childClass = dlg.childclass_box->isChecked();
+ objc = dlg.objc_box->isChecked();
+ qobject = dlg.qobject_box->isChecked();
+ gtk = dlg.gtk_box->isChecked();
+ headeronly = dlg.headeronly_box->isChecked();
+
+ if ( ( dlg.baseclasses_view->childCount() == 0 ) && childClass )
+ new QListViewItem( dlg.baseclasses_view, "QWidget", "public" );
+ if ( objc && ( dlg.baseclasses_view->childCount() == 0 ) )
+ new QListViewItem( dlg.baseclasses_view, "NSObject", "public" );
+
+ if ( dlg.documentation_edit->text().isEmpty() && ( !dlg.gen_config->doc_box->isChecked() ) )
+ doc = "";
+ else
+ {
+ doc = QString( "/**\n" );
+ if ( !dlg.documentation_edit->text().isEmpty() )
+ {
+ doc.append( dlg.documentation_edit->text() );
+ if ( dlg.gen_config->author_box->isChecked() )
+ doc.append( "\n\n" );
+ }
+ QString author = DomUtil::readEntry( *dlg.m_part->projectDom(), "/general/author" );
+ QString email = DomUtil::readEntry( *dlg.m_part->projectDom(), "/general/email" );
+ if( !email.isEmpty() )
+ author += QString( " <%1>" ).arg( email );
+
+ if ( dlg.gen_config->author_box->isChecked() )
+ doc.append( "\t@author " + author + "\n" );
+ doc.append( "*/" );
+ }
+
+ if ( !namespaceStr.isEmpty() )
+ {
+ for ( QStringList::Iterator it = namespaces.begin(); it != namespaces.end(); ++it )
+ {
+ if ( !namespaceBeg.isEmpty() )
+ namespaceBeg += "\n\n";
+ if ( !namespaceEnd.isEmpty() )
+ namespaceEnd += "\n\n";
+ namespaceBeg += "namespace " + ( *it ) + " {";
+ namespaceEnd += "}";
+ }
+ }
+
+ //advanced constructor creation
+
+ advConstructorsHeader = QString::null;
+ advConstructorsSource = QString::null;
+ if ( !dlg.constructors_h_edit->text().isEmpty() )
+ {
+ advConstructorsHeader = " " + dlg.constructors_h_edit->text();
+ advConstructorsHeader.replace( QRegExp( "\n" ), "\n " );
+ }
+ if ( !dlg.constructors_cpp_edit->text().isEmpty() )
+ {
+ advConstructorsSource = dlg.constructors_cpp_edit->text();
+ }
+ advConstructorsHeader.replace( QRegExp( "[\\n ]*$" ), QString::null );
+ advConstructorsSource.replace( QRegExp( "[\\n ]*$" ), QString::null );
+
+ //advanced method overriding
+
+ advH_public = QString::null;
+ advH_public_slots = QString::null;
+ advH_protected = QString::null;
+ advH_protected_slots = QString::null;
+ advH_private = QString::null;
+ advH_private_slots = QString::null;
+ advCpp = QString::null;
+
+ QListViewItemIterator it( dlg.methods_view );
+ while ( it.current() )
+ {
+ PCheckListItem<FunctionDom> *curr;
+ if ( ( curr = dynamic_cast<PCheckListItem<FunctionDom>* >( it.current() ) ) )
+ {
+ if ( curr->isOn() && ( curr->parent() ) && ( curr->parent() ->parent() ) )
+ {
+ QString * adv_h = 0;
+ if ( curr->item() ->access() == CodeModelItem::Private )
+ adv_h = curr->item() ->isSlot() ? &advH_private_slots : &advH_private;
+ if ( curr->item() ->access() == CodeModelItem::Protected )
+ adv_h = curr->item() ->isSlot() ? &advH_protected_slots : &advH_protected;
+ if ( curr->item() ->access() == CodeModelItem::Public )
+ adv_h = curr->item() ->isSlot() ? &advH_public_slots : &advH_public;
+
+ // if (advCpp.isEmpty()) advCpp += "\n\n";
+
+ QString bcName = curr->parent() ->parent() ->text( 0 );
+ PListViewItem<ClassDom> *bc;
+ if ( ( bc = dynamic_cast<PListViewItem<ClassDom>* >( curr->parent() ->parent() ) ) )
+ {
+ bcName += bc->templateAddition;
+ }
+ genMethodDeclaration( curr->item(), className, templateStr, adv_h, &advCpp,
+ ( curr->text( 1 ) == i18n( "extend" ) ) ? true : false, bcName );
+ }
+ }
+ ++it;
+ }
+
+ //advanced access control and upgrading
+ QListViewItemIterator ita( dlg.access_view );
+ while ( ita.current() )
+ {
+ PListViewItem<VariableDom> *curr;
+ PListViewItem<FunctionDom> *curr_m;
+ if ( ( curr = dynamic_cast<PListViewItem<VariableDom>* >( ita.current() ) ) )
+ {
+ if ( ( !curr->text( 2 ).isEmpty() ) && ( curr->parent() ) && ( curr->parent() ->parent() ) )
+ {
+ QString * adv_h = 0;
+ if ( curr->text( 2 ) == "private" )
+ adv_h = &advH_private;
+ if ( curr->text( 2 ) == "public" )
+ adv_h = &advH_public;
+ if ( curr->text( 2 ) == "protected" )
+ adv_h = &advH_protected;
+
+ /* if ((*adv_h).isEmpty())
+ *adv_h += "\n\n";*/
+ if ( adv_h )
+ *adv_h += QString( " using " ) + curr->parent() ->parent() ->text( 0 ) + "::" + curr->item() ->name() + ";\n";
+ }
+ }
+ else if ( ( curr_m = dynamic_cast<PListViewItem<FunctionDom>* >( ita.current() ) ) )
+ {
+ if ( ( !curr_m->text( 2 ).isEmpty() ) && ( curr_m->parent() ) && ( curr_m->parent() ->parent() ) )
+ {
+ QString * adv_h = 0;
+ if ( curr_m->text( 2 ) == "private" )
+ adv_h = &advH_private;
+ if ( curr_m->text( 2 ) == "public" )
+ adv_h = &advH_public;
+ if ( curr_m->text( 2 ) == "protected" )
+ adv_h = &advH_protected;
+
+ /* if ((*adv_h).isEmpty())
+ *adv_h += "\n\n";*/
+
+ QString methodName = curr_m->item() ->name();
+ if ( !methodName.contains( QRegExp( "^[a-zA-z_]" ) ) )
+ methodName = "operator" + methodName;
+ *adv_h += " using " + curr_m->parent() ->parent() ->text( 0 ) + "::" + methodName + ";\n";
+ }
+ }
+ ++ita;
+ }
+
+ QRegExp e( "[\\n ]*$" );
+ advH_public.replace( e, QString::null );
+ advH_public_slots.replace( e, QString::null );
+ advH_protected.replace( e, QString::null );
+ advH_protected_slots.replace( e, QString::null );
+ advH_private.replace( e, QString::null );
+ advH_private_slots.replace( e, QString::null );
+ advCpp.replace( e, QString::null );
+}
+
+void CppNewClassDialog::ClassGenerator::genMethodDeclaration( FunctionDom method,
+ QString className, QString templateStr, QString *adv_h, QString *adv_cpp, bool extend, QString baseClassName )
+{
+ /* if ((*adv_h).isEmpty())
+ *adv_h += "\n\n";*/
+ QString methodName = method->name();
+ if ( !methodName.contains( QRegExp( "^[a-zA-z_]" ) ) )
+ methodName = "operator" + methodName;
+ *adv_h += " " + ( method->isVirtual() ? QString( "virtual " ) : QString( "" ) )
+ + ( method->isStatic() ? QString( "static " ) : QString( "" ) )
+ + method->resultType() + " " + methodName + "(";
+ if ( !templateStr.isEmpty() )
+ * adv_cpp += templateStr + "\n";
+ *adv_cpp += method->resultType() + " " + className + templateParams + "::" + methodName + "(";
+
+ QString bparams;
+ QString cparams;
+ int unnamed = 1;
+
+ ArgumentList argumentList = method->argumentList();
+ for ( ArgumentList::const_iterator argIt = argumentList.begin();
+ argIt != argumentList.end(); ++argIt )
+ {
+ bparams += bparams.isEmpty() ? "" : ", ";
+ cparams += cparams.isEmpty() ? "" : ", ";
+ cparams += ( *argIt ) ->type() + " ";
+ if ( ( *argIt ) ->name().isEmpty() )
+ {
+ cparams += QString( "arg%1" ).arg( unnamed );
+ bparams += QString( "arg%1" ).arg( unnamed++ );
+ }
+ else
+ {
+ bparams += ( *argIt ) ->name();
+ cparams += ( *argIt ) ->name();
+ }
+ if ( !( *argIt ) ->defaultValue().isEmpty() )
+ bparams += " " + ( *argIt ) ->defaultValue();
+ }
+ *adv_h += cparams + ")" + ( method->isConstant() ? " const" : "" ) + ";\n";
+ *adv_cpp += cparams + ")" + ( method->isConstant() ? " const" : "" ) + "\n{\n";
+ if ( extend )
+ * adv_cpp += ( ( method->resultType() == "void" ) ? " " : " return " ) +
+ baseClassName + "::" + methodName + "(" + bparams + ");\n";
+ *adv_cpp += "}\n\n";
+}
+
+
+void CppNewClassDialog::ClassGenerator::gen_implementation()
+{
+
+ // implementation
+
+ QString classImpl;
+ QFileInfo fi( implementationPath );
+ QString module = fi.baseName();
+ QString basefilename = fi.baseName( true );
+
+ if ( dlg.filetemplate_box->isChecked() )
+ {
+ /* QDomDocument dom = *dlg.m_part->projectDom();
+ if(DomUtil::readBoolEntry(dom,"/cppsupportpart/filetemplates/choosefiles",false))
+ classImpl = FileTemplate::read(dlg.m_part, DomUtil::readEntry(dom,"/cppsupportpart/filetemplates/implementationURL",""), FileTemplate::Custom);
+ else*/
+ classImpl = FileTemplate::read( dlg.m_part, fi.extension( true ) );
+ }
+
+ classImpl.replace( QRegExp( "\\$MODULE\\$" ), module );
+ classImpl.replace( QRegExp( "\\$FILENAME\\$" ), basefilename );
+
+ if ( objc )
+ {
+ classImpl += dlg.gen_config->objcSource();
+ }
+ else if ( gtk )
+ {
+ classImpl += dlg.gen_config->gtkSource();
+ }
+ else
+ {
+ classImpl += dlg.gen_config->cppSource();
+ /* classImpl += QString(
+ "#include \"$HEADER$\"\n"
+ "\n"
+ "\n")
+ + namespaceBeg
+ + ( advConstructorsSource.isEmpty() ? QString("$CLASSNAME$::$CLASSNAME$($ARGS$)\n"
+ "$BASEINITIALIZER$"
+ "{\n"
+ "}\n") : advConstructorsSource )
+ + QString("\n"
+ "$CLASSNAME$::~$CLASSNAME$()\n"
+ "{\n"
+ "}\n")
+ + advCpp
+ + namespaceEnd;*/
+ }
+
+ QString relPath;
+ for ( int i = implementation.findRev( '/' ); i != -1; i = implementation.findRev( '/', --i ) )
+ relPath += "../";
+
+ QString constructors = ( advConstructorsSource.isEmpty() ? QString( "$TEMPLATESTR$\n$CLASSNAME$$TEMPLATEPARAMS$::$CLASSNAME$($ARGS$)\n"
+ "$BASEINITIALIZER$"
+ "{\n"
+ "}" ) : advConstructorsSource )
+ + QString( "\n\n\n"
+ "$TEMPLATESTR$\n$CLASSNAME$$TEMPLATEPARAMS$::~$CLASSNAME$()\n"
+ "{\n"
+ "}\n" );
+
+ qWarning( "NEW CLASS: constructors = %s", constructors.latin1() );
+
+ if ( childClass )
+ {
+ if( dlg.m_part->qtBuildConfig()->version() == 3 )
+ {
+ argsH = "QWidget *parent = 0, const char *name = 0";
+ argsCpp = "QWidget *parent, const char *name";
+ }
+ else
+ {
+ argsH = "QWidget *parent = 0";
+ argsCpp = "QWidget *parent";
+ }
+ }
+ else if ( qobject )
+ {
+ if( dlg.m_part->qtBuildConfig()->version() == 3 )
+ {
+ argsH = "QObject *parent = 0, const char *name = 0";
+ argsCpp = "QObject *parent, const char *name";
+ }
+ else
+ {
+ argsH = "QObject *parent = 0";
+ argsCpp = "QObject *parent";
+ }
+ }
+ else
+ {
+ argsH = "";
+ argsCpp = "";
+ }
+ QString baseInitializer;
+
+ if ( childClass && ( dlg.baseclasses_view->childCount() == 0 ) )
+ {
+ if( dlg.m_part->qtBuildConfig()->version() == 3 )
+ baseInitializer = " : QWidget(parent, name)";
+ else
+ baseInitializer = " : QWidget(parent)";
+ }
+ else if ( qobject && ( dlg.baseclasses_view->childCount() == 0 ) )
+ {
+ if( dlg.m_part->qtBuildConfig()->version() == 3 )
+ baseInitializer = " : QObject(parent, name)";
+ else
+ baseInitializer = " : QObject(parent)";
+ }
+ else if ( dlg.baseclasses_view->childCount() != 0 )
+ {
+ QListViewItemIterator it( dlg.baseclasses_view );
+ baseInitializer += " : ";
+ while ( it.current() )
+ {
+ if ( !it.current() ->text( 0 ).isEmpty() )
+ {
+ if ( baseInitializer != " : " )
+ {
+ baseInitializer += ", ";
+ }
+
+ if ( childClass && ( baseInitializer == " : " ) )
+ {
+ if( dlg.m_part->qtBuildConfig()->version() == 3 )
+ baseInitializer += it.current()->text( 0 ) + "(parent, name)";
+ else
+ baseInitializer += it.current()->text( 0 ) + "(parent)";
+ }
+ else if ( qobject && ( baseInitializer == " : " ) )
+ {
+ if( dlg.m_part->qtBuildConfig()->version() == 3 )
+ baseInitializer += it.current()->text( 0 ) + "(parent, name)";
+ else
+ baseInitializer += it.current()->text( 0 ) + "(parent)";
+ }
+ else
+ {
+ baseInitializer += it.current()->text( 0 ) + "()";
+ }
+ }
+ ++it;
+ }
+ baseInitializer += "\n";
+ }
+
+ constructors.replace( QRegExp( "\\$BASEINITIALIZER\\$" ), baseInitializer );
+ constructors.replace( QRegExp( "\\$CLASSNAME\\$" ), className );
+ // qWarning("NEW CLASS: constructors = %s", constructors.latin1());
+ if ( templateStr.isEmpty() )
+ {
+ constructors.replace( QRegExp( "\\$TEMPLATESTR\\$\\n" ), "" );
+ constructors.replace( QRegExp( "\\$TEMPLATEPARAMS\\$" ), "" );
+ }
+ else
+ {
+ constructors.replace( QRegExp( "\\$TEMPLATESTR\\$" ), templateStr );
+ constructors.replace( QRegExp( "\\$TEMPLATEPARAMS\\$" ), templateParams );
+ classImpl.replace( QRegExp( "#include \"\\$HEADER\\$\"\\n" ), "" );
+ }
+ // qWarning("NEW CLASS: constructors = %s", constructors.latin1());
+ constructors.replace( QRegExp( "\\$ARGS\\$" ), argsCpp );
+ // qWarning("NEW CLASS: constructors = %s", constructors.latin1());
+
+
+ //remove unnesessary carriadge returns
+ QString hp = relPath + header;
+ beautifySource( classImpl, hp, className, namespaceBeg, constructors, advCpp, namespaceEnd, implementation );
+
+ classImpl.replace( QRegExp( "\\$HEADER\\$" ), relPath + header );
+ classImpl.replace( QRegExp( "\\$CLASSNAME\\$" ), className );
+ classImpl.replace( QRegExp( "\\$NAMESPACEBEG\\$" ), namespaceBeg );
+ classImpl.replace( QRegExp( "\\$CONSTRUCTORDEFINITIONS\\$" ), constructors );
+ classImpl.replace( QRegExp( "\\$DEFINITIONS\\$" ), advCpp );
+ classImpl.replace( QRegExp( "\\$NAMESPACEEND\\$" ), namespaceEnd );
+ classImpl.replace( QRegExp( "\\$FILENAME\\$" ), implementation );
+
+ if ( ( dlg.m_part->project() ) && ( childClass || qobject ) && ( dlg.m_part->project() ->options() & KDevProject::UsesAutotoolsBuildSystem ) )
+ {
+ QString moc = header;
+ moc.replace( QRegExp( "\\..*" ), ".moc" );
+ classImpl += "#include \"" + moc + "\"\n";
+ }
+
+ if ( dlg.gen_config->reformat_box->isChecked() )
+ {
+ KDevSourceFormatter * fmt = dlg.m_part->extension<KDevSourceFormatter>( "KDevelop/SourceFormatter" );
+ if ( fmt )
+ classImpl = fmt->formatSource( classImpl );
+ }
+
+ kdDebug( 9007 ) << "implementationPath = " << implementationPath << endl;
+
+ QFile ifile( implementationPath );
+ if ( !ifile.open( IO_WriteOnly ) )
+ {
+ KMessageBox::error( &dlg, i18n( "Cannot write to implementation file" ) );
+ return ;
+ }
+ QTextStream istream( &ifile );
+ istream << classImpl;
+ ifile.close();
+
+ KURL u;
+ u.setPath( implementationPath );
+ dlg.m_part->partController()->editDocument( u );
+}
+
+
+void CppNewClassDialog::ClassGenerator::gen_interface()
+{
+ // interface
+
+ QString classIntf;
+ QFileInfo fi( headerPath );
+ QString module = fi.baseName();
+ QString basefilename = fi.baseName( true );
+
+ if ( dlg.filetemplate_box->isChecked() )
+ {
+ /* QDomDocument dom = *dlg.m_part->projectDom();
+ if(DomUtil::readBoolEntry(dom,"/cppsupportpart/filetemplates/choosefiles",false))
+ classIntf = FileTemplate::read(dlg.m_part, DomUtil::readEntry(dom,"/cppsupportpart/filetemplates/interfaceURL",""), FileTemplate::Custom);
+ else*/
+ classIntf = FileTemplate::read( dlg.m_part, fi.extension( true ) );
+ }
+
+ classIntf.replace( QRegExp( "\\$MODULE\\$" ), module );
+ classIntf.replace( QRegExp( "\\$FILENAME\\$" ), basefilename );
+
+ if ( objc )
+ {
+ classIntf += dlg.gen_config->objcHeader();
+ }
+ else if ( gtk )
+ {
+ classIntf += dlg.gen_config->gtkHeader();
+ }
+ else
+ {
+ classIntf += dlg.gen_config->cppHeader();
+ /* classIntf = QString("\n"
+ "#ifndef $HEADERGUARD$\n"
+ "#define $HEADERGUARD$\n"
+ "\n"
+ "$INCLUDEBASEHEADER$\n"
+ "\n")
+ + namespaceBeg
+ + QString("class $CLASSNAME$$INHERITANCE$\n"
+ "{\n"
+ "$QOBJECT$"
+ "public:\n")
+ + ( advConstructorsHeader.isEmpty() ? QString(" $CLASSNAME$($ARGS$);\n") : advConstructorsHeader )
+ + QString("\n ~$CLASSNAME$();\n")
+ + advH_public
+ + (advH_public_slots.isEmpty() ? QString::fromLatin1("") : ("\n\npublic slots:" + advH_public_slots))
+ + (advH_protected.isEmpty() ? QString::fromLatin1("") : ("\n\nprotected:" + advH_protected))
+ + (advH_protected_slots.isEmpty() ? QString::fromLatin1("") : ("\n\nprotected slots:" + advH_protected_slots))
+ + (advH_private.isEmpty() ? QString::fromLatin1("") : ("\n\nprivate:" + advH_private))
+ + (advH_private_slots.isEmpty() ? QString::fromLatin1("") : ("\n\nprivate slots:" + advH_private_slots))
+ + QString("};\n"
+ "\n")
+ + namespaceEnd
+ + "#endif\n";*/
+ }
+
+ QString headerGuard;
+ switch ( dlg.gen_config->defCase() )
+ {
+ case ClassGeneratorConfig::UpperCase:
+ headerGuard = namespaceStr.upper() + header.mid( header.findRev( "/" )+1 ).upper();
+ break;
+ case ClassGeneratorConfig::LowerCase:
+ headerGuard = namespaceStr.lower() + header.mid( header.findRev( "/" )+1 ).lower();
+ break;
+ case ClassGeneratorConfig::SameAsFileCase:
+ headerGuard = dlg.header_edit->text().mid( dlg.header_edit->text().findRev( "/" )+1 );
+ break;
+ case ClassGeneratorConfig::SameAsClassCase:
+ headerGuard = namespaceStr + header.mid( header.findRev( "/" )+1 );
+ break;
+ }
+
+ headerGuard.replace( QRegExp( "\\." ), "_" );
+ headerGuard.replace( QRegExp( "::" ), "_" );
+ QString includeBaseHeader;
+ if( dlg.m_part->qtBuildConfig()->isUsed() )
+ {
+ if( childClass && ( dlg.baseclasses_view->childCount() == 0 ) )
+ {
+ if( dlg.m_part->qtBuildConfig()->version() == 3 )
+ includeBaseHeader = "#include <qwidget.h>";
+ else
+ includeBaseHeader = "#include <QWidget>";
+ }
+ else if( qobject && ( dlg.baseclasses_view->childCount() == 0 ) )
+ {
+ if( dlg.m_part->qtBuildConfig()->version() == 3 )
+ includeBaseHeader = "#include <qobject.h>";
+ else
+ includeBaseHeader = "#include <QObject>";
+ }
+ }
+
+ if ( objc )
+ {
+ if ( dlg.baseclasses_view->firstChild() )
+ if ( dlg.baseclasses_view->firstChild() ->text( 0 ) != "NSObject" )
+ if ( !dlg.baseclasses_view->firstChild() ->text( 3 ).isEmpty() )
+ includeBaseHeader = "#include "
+ + ( dlg.baseclasses_view->firstChild() ->text( 2 ).toInt() == 0 ? QString( "<" ) : QString( "\"" ) )
+ + dlg.baseclasses_view->firstChild() ->text( 3 )
+ + ( dlg.baseclasses_view->firstChild() ->text( 2 ).toInt() == 0 ? QString( ">" ) : QString( "\"" ) );
+ }
+ else
+ {
+ QListViewItemIterator it( dlg.baseclasses_view );
+ while ( it.current() )
+ {
+ if ( !it.current() ->text( 0 ).isEmpty() )
+ if ( !it.current() ->text( 3 ).isEmpty() )
+ // if ((!childClass) || (it.current()->text(0) != "QWidget"))
+ includeBaseHeader += ( includeBaseHeader.isEmpty() ? QString( "" ) : QString( "\n" ) ) + QString::fromLatin1( "#include " ) +
+ ( it.current() ->text( 2 ).toInt() == 0 ? QString( "<" ) : QString( "\"" ) )
+ + it.current() ->text( 3 )
+ + ( it.current() ->text( 2 ).toInt() == 0 ? QString( ">" ) : QString( "\"" ) );
+ ++it;
+ }
+ }
+
+ QString author = DomUtil::readEntry( *dlg.m_part->projectDom(), "/general/author" );
+ QString email = DomUtil::readEntry( *dlg.m_part->projectDom(), "/general/email" );
+ if( !email.isEmpty() )
+ author += QString( " <%1>" ).arg( email );
+
+ QString inheritance;
+ if ( dlg.baseclasses_view->childCount() > 0 )
+ {
+ inheritance += " : ";
+
+ QListViewItemIterator it( dlg.baseclasses_view );
+ while ( it.current() )
+ {
+ if ( !it.current() ->text( 0 ).isEmpty() )
+ {
+ if ( inheritance != " : " )
+ inheritance += ", ";
+ if ( it.current() ->text( 1 ).contains( "virtual" ) )
+ inheritance += "virtual ";
+ if ( it.current() ->text( 1 ).contains( "public" ) )
+ inheritance += "public ";
+ if ( it.current() ->text( 1 ).contains( "protected" ) )
+ inheritance += "protected ";
+ if ( it.current() ->text( 1 ).contains( "private" ) )
+ inheritance += "private ";
+ inheritance += it.current() ->text( 0 );
+ }
+ ++it;
+ }
+ }
+ else if ( qobject )
+ inheritance += ": public QObject";
+
+ QString constructors = QString( advConstructorsHeader.isEmpty() ?
+ QString( " $CLASSNAME$($ARGS$);" ) : advConstructorsHeader )
+ + QString( "\n\n ~$CLASSNAME$();" );
+
+ constructors.replace( QRegExp( "\\$CLASSNAME\\$" ), className );
+ constructors.replace( QRegExp( "\\$ARGS\\$" ), argsH );
+
+ QString qobjectStr;
+ if ( childClass || qobject )
+ qobjectStr = "Q_OBJECT";
+
+
+ QString baseclass;
+ if ( dlg.baseclasses_view->childCount() > 0 )
+ baseclass = dlg.baseclasses_view->firstChild() ->text( 0 );
+ //remove unnesessary carriadge returns
+ beautifyHeader( classIntf, headerGuard, includeBaseHeader, author, doc, className, templateStr,
+ baseclass, inheritance, qobjectStr, argsH,
+ header, namespaceBeg, constructors, advH_public, advH_public_slots,
+ advH_protected, advH_protected_slots, advH_private, advH_private_slots, namespaceEnd );
+
+
+ classIntf.replace( QRegExp( "\\$HEADERGUARD\\$" ), headerGuard );
+ classIntf.replace( QRegExp( "\\$INCLUDEBASEHEADER\\$" ), includeBaseHeader );
+ classIntf.replace( QRegExp( "\\$AUTHOR\\$" ), author );
+ classIntf.replace( QRegExp( "\\$DOC\\$" ), doc );
+ classIntf.replace( QRegExp( "\\$TEMPLATE\\$" ), templateStr );
+ classIntf.replace( QRegExp( "\\$CLASSNAME\\$" ), className );
+ if ( dlg.baseclasses_view->childCount() > 0 )
+ classIntf.replace( QRegExp( "\\$BASECLASS\\$" ), dlg.baseclasses_view->firstChild() ->text( 0 ) );
+ classIntf.replace( QRegExp( "\\$INHERITANCE\\$" ), inheritance );
+ classIntf.replace( QRegExp( "\\$QOBJECT\\$" ), qobjectStr );
+ classIntf.replace( QRegExp( "\\$ARGS\\$" ), argsH );
+ classIntf.replace( QRegExp( "\\$FILENAME\\$" ), header );
+ classIntf.replace( QRegExp( "\\$NAMESPACEBEG\\$" ), namespaceBeg );
+ classIntf.replace( QRegExp( "\\$CONSTRUCTORDECLARATIONS\\$" ), constructors );
+ classIntf.replace( QRegExp( "\\$PUBLICDECLARATIONS\\$" ), advH_public );
+ classIntf.replace( QRegExp( "\\$PUBLICSLOTS\\$" ), advH_public_slots );
+ classIntf.replace( QRegExp( "\\$PROTECTEDDECLARATIONS\\$" ), QString( "protected:\n" ) + advH_protected );
+ classIntf.replace( QRegExp( "\\$PROTECTEDSLOTS\\$" ), QString( "protected slots:\n" ) + advH_protected_slots );
+ classIntf.replace( QRegExp( "\\$PRIVATEDECLARATIONS\\$" ), QString( "private:\n" ) + advH_private );
+ classIntf.replace( QRegExp( "\\$PRIVATESLOTS\\$" ), QString( "private slots:\n" ) + advH_private_slots );
+ classIntf.replace( QRegExp( "\\$NAMESPACEEND\\$" ), namespaceEnd );
+
+ if ( !templateStr.isEmpty() && (!headeronly) )
+ classIntf.replace( QRegExp( "#endif" ), "#include \"" + dlg.implementation_edit->text() + "\"\n\n#endif" );
+
+ if ( dlg.gen_config->reformat_box->isChecked() )
+ {
+ KDevSourceFormatter * fmt = dlg.m_part->extension<KDevSourceFormatter>( "KDevelop/SourceFormatter" );
+ if ( fmt )
+ classIntf = fmt->formatSource( classIntf );
+ }
+
+ QFile hfile( headerPath );
+ if ( !hfile.open( IO_WriteOnly ) )
+ {
+ KMessageBox::error( &dlg, i18n( "Cannot write to header file" ) );
+ return ;
+ }
+ QTextStream hstream( &hfile );
+ hstream << classIntf;
+ hfile.close();
+
+ KURL u;
+ u.setPath( headerPath );
+ dlg.m_part->partController()->editDocument( u );
+}
+
+void CppNewClassDialog::ClassGenerator::beautifyHeader( QString &templ, QString &headerGuard,
+ QString &includeBaseHeader, QString &author, QString &doc, QString &className, QString &templateStr,
+ QString &baseclass, QString &inheritance, QString &qobjectStr, QString &args,
+ QString &header, QString &namespaceBeg, QString &constructors, QString &advH_public, QString &advH_public_slots,
+ QString &advH_protected, QString &advH_protected_slots, QString &advH_private, QString &advH_private_slots,
+ QString &namespaceEnd )
+{
+ if ( headerGuard.isEmpty() )
+ templ.replace( QRegExp( "\\$HEADERGUARD\\$[\\n ]*" ), QString::null );
+ if ( includeBaseHeader.isEmpty() )
+ templ.replace( QRegExp( "\\$INCLUDEBASEHEADER\\$[\\n ]*" ), QString::null );
+ if ( author.isEmpty() )
+ templ.replace( QRegExp( "\\$AUTHOR\\$[\\n ]*" ), QString::null );
+ if ( doc.isEmpty() )
+ templ.replace( QRegExp( "\\$DOC\\$[\\n ]*" ), QString::null );
+ if ( className.isEmpty() )
+ templ.replace( QRegExp( "\\$CLASSNAME\\$[\\n ]*" ), QString::null );
+ if ( templateStr.isEmpty() )
+ templ.replace( QRegExp( "\\$TEMPLATE\\$[\\n ]*" ), QString::null );
+ if ( baseclass.isEmpty() )
+ templ.replace( QRegExp( "\\$BASECLASS\\$[\\n ]*" ), QString::null );
+ if ( inheritance.isEmpty() )
+ templ.replace( QRegExp( "\\$INHERITANCE\\$[\\n ]*" ), QString::null );
+ if ( qobjectStr.isEmpty() )
+ templ.replace( QRegExp( "\\$QOBJECT\\$[\\n ]*" ), QString::null );
+ if ( args.isEmpty() )
+ templ.replace( QRegExp( "\\$ARGS\\$[\\n ]*" ), QString::null );
+ if ( header.isEmpty() )
+ templ.replace( QRegExp( "\\$FILENAME\\$[\\n ]*" ), QString::null );
+ if ( namespaceBeg.isEmpty() )
+ templ.replace( QRegExp( "\\$NAMESPACEBEG\\$[\\n ]*" ), QString::null );
+ if ( constructors.isEmpty() )
+ templ.replace( QRegExp( "\\$CONSTRUCTORDECLARATIONS\\$[\\n ]*" ), QString::null );
+ if ( advH_public.isEmpty() )
+ templ.replace( QRegExp( "\\$PUBLICDECLARATIONS\\$[\\n ]*" ), QString::null );
+ if ( advH_public_slots.isEmpty() )
+ templ.replace( QRegExp( "\\$PUBLICSLOTS\\$[\\n ]*" ), QString::null );
+ if ( advH_protected.isEmpty() )
+ templ.replace( QRegExp( "\\$PROTECTEDDECLARATIONS\\$[\\n ]*" ), QString::null );
+ if ( advH_protected_slots.isEmpty() )
+ templ.replace( QRegExp( "\\$PROTECTEDSLOTS\\$[\\n ]*" ), QString::null );
+ if ( advH_private.isEmpty() )
+ templ.replace( QRegExp( "\\$PRIVATEDECLARATIONS\\$[\\n ]*" ), QString::null );
+ if ( advH_private_slots.isEmpty() )
+ templ.replace( QRegExp( "\\$PRIVATESLOTS\\$[\\n ]*" ), QString::null );
+ if ( namespaceEnd.isEmpty() )
+ templ.replace( QRegExp( "\\$NAMESPACEEND\\$[\\n ]*" ), QString::null );
+}
+
+
+void CppNewClassDialog::ClassGenerator::beautifySource( QString &templ, QString &header, QString &className, QString &namespaceBeg,
+ QString &constructors, QString &advCpp, QString &namespaceEnd, QString &implementation )
+{
+ if ( header.isEmpty() )
+ templ.replace( QRegExp( "\\$HEADER\\$[\\n ]*" ), QString::null );
+ if ( className.isEmpty() )
+ templ.replace( QRegExp( "\\$CLASSNAME\\$[\\n ]*" ), QString::null );
+ if ( namespaceBeg.isEmpty() )
+ templ.replace( QRegExp( "\\$NAMESPACEBEG\\$[\\n ]*" ), QString::null );
+ if ( constructors.isEmpty() )
+ templ.replace( QRegExp( "\\$CONSTRUCTORDEFINITIONS\\$[\\n ]*" ), QString::null );
+ if ( advCpp.isEmpty() )
+ templ.replace( QRegExp( "\\$DEFINITIONS\\$[\\n ]*" ), QString::null );
+ if ( namespaceEnd.isEmpty() )
+ templ.replace( QRegExp( "\\$NAMESPACEEND\\$[\\n ]*" ), QString::null );
+ if ( implementation.isEmpty() )
+ templ.replace( QRegExp( "\\$FILENAME\\$[\\n ]*" ), QString::null );
+}
+
+QString CppNewClassDialog::classNameFormatted( )
+{
+ return classNameFormatted( classname_edit->text() );
+}
+
+QString CppNewClassDialog::classNameFormatted( const QString &name )
+{
+ QString temp = name.simplifyWhiteSpace();
+ return temp.replace( QRegExp( "template *<.*> *(class *)?" ), "" );
+}
+
+
+QString CppNewClassDialog::templateStrFormatted( )
+{
+ return templateStrFormatted( classname_edit->text() );
+}
+
+QString CppNewClassDialog::templateStrFormatted( const QString &name )
+{
+ QString className = name.simplifyWhiteSpace();
+ QString temp = className;
+ className.replace( QRegExp( "template *<.*> *(class *)?" ), "" );
+ QString templateStr = temp.replace( QRegExp( QRegExp_escape( className ) ), "" );
+ templateStr.replace( QRegExp( " *class *$" ), "" );
+ return templateStr;
+}
+
+QString CppNewClassDialog::templateParamsFormatted( )
+{
+ return templateParamsFormatted( classname_edit->text() );
+}
+
+QString CppNewClassDialog::templateParamsFormatted( const QString &name )
+{
+ QString className = name.simplifyWhiteSpace();
+ QString temp = className;
+ className.replace( QRegExp( "template *<.*> *(class *)?" ), "" );
+ QString templateStr = temp.replace( QRegExp( QRegExp_escape( className ) ), "" );
+ templateStr.replace( QRegExp( " *class *$" ), "" );
+
+ QString templateParams = templateStr;
+ templateParams.replace( QRegExp( "^ *template *" ), "" );
+ templateParams.replace( QRegExp( " *class *" ), "" );
+ templateParams.simplifyWhiteSpace();
+
+ return templateParams;
+}
+
+QString CppNewClassDialog::templateActualParamsFormatted( const QString & name )
+{
+ QString className = name.simplifyWhiteSpace();
+ QString temp = className;
+ className.replace( QRegExp( "<.*> *" ), "" );
+ QString templateStr = temp.replace( QRegExp( QRegExp_escape( className ) ), "" );
+ return templateStr;
+}
+
+void CppNewClassDialog::removeTemplateParams( QString & name )
+{
+ name.replace( QRegExp( "<.*> *" ), "" );
+}
+
+bool CppNewClassDialog::isDestructor( QString className, const FunctionDom &method )
+{
+ if ( m_part->formatModelItem( method.data() ).contains( QRegExp( " *~ *" + className ) ) )
+ return true;
+ return false;
+}
+
+void CppNewClassDialog::headeronly_box_stateChanged(int val)
+{
+ implementation_edit->setEnabled(!val);
+}
+
+#include "cppnewclassdlg.moc"
+
+//kate: space-indent on; indent-width 4; tab-width 4; replace-tabs on
diff --git a/languages/cpp/cppnewclassdlg.h b/languages/cpp/cppnewclassdlg.h
new file mode 100644
index 00000000..fb680921
--- /dev/null
+++ b/languages/cpp/cppnewclassdlg.h
@@ -0,0 +1,292 @@
+/***************************************************************************
+* Copyright (C) 1998 by Sandy Meier *
+* smeier@rz.uni-potsdam.de *
+* Copyright (C) 2002 by Bernd Gehrmann *
+* bernd@kdevelop.org *
+* Copyright (C) 2003 by Alexander Dymo *
+* cloudtemple@mksat.net *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef _CPPNEWCLASSDLG_H_
+#define _CPPNEWCLASSDLG_H_
+
+#include <qlineedit.h>
+#include <qlistview.h>
+#include <qwidgetstack.h>
+
+#include "codemodel.h"
+#include "cppnewclassdlgbase.h"
+
+class CppSupportPart;
+class KDevProject;
+class QPopupMenu;
+class KCompletion;
+class CodeModel;
+
+
+template <class T>
+class PCheckListItem: public QCheckListItem
+{
+public:
+
+ PCheckListItem ( T item, QCheckListItem * parent, const QString & text, Type tt = Controller ) :
+ QCheckListItem ( parent, text, tt ), m_item( item )
+ {}
+
+ PCheckListItem ( T item, QCheckListItem * parent, QListViewItem * after, const QString & text, Type tt = Controller ) :
+ QCheckListItem ( parent, after, text, tt ), m_item( item )
+ {}
+
+ PCheckListItem ( T item, QListViewItem * parent, const QString & text, Type tt = Controller ) :
+ QCheckListItem ( parent, text, tt ), m_item( item )
+ {}
+
+ PCheckListItem ( T item, QListViewItem * parent, QListViewItem * after, const QString & text, Type tt = Controller ) :
+ QCheckListItem ( parent, after, text, tt ), m_item( item )
+ {}
+
+ PCheckListItem ( T item, QListView * parent, const QString & text, Type tt = Controller ) :
+ QCheckListItem ( parent, text, tt ), m_item( item )
+ {}
+
+ PCheckListItem ( T item, QListView * parent, QListViewItem * after, const QString & text, Type tt = Controller ) :
+ QCheckListItem ( parent, after, text, tt ), m_item( item )
+ {}
+
+ PCheckListItem ( T item, QListViewItem * parent, const QString & text, const QPixmap & p ) :
+ QCheckListItem ( parent, text, p ), m_item( item )
+ {}
+
+ PCheckListItem ( T item, QListView * parent, const QString & text, const QPixmap & p ) :
+ QCheckListItem ( parent, text, p ), m_item( item )
+ {}
+
+ T item()
+ {
+ return m_item;
+ }
+
+ QString templateAddition;
+
+private:
+ T m_item;
+};
+
+template <class T>
+class PListViewItem: public QListViewItem
+{
+public:
+
+ PListViewItem ( T item, QListViewItem * parent, QListViewItem * after, const QString & text ) :
+ QListViewItem ( parent, after, text ), m_item( item )
+ {}
+
+ PListViewItem ( T item, QListViewItem * parent, const QString & text ) :
+ QListViewItem ( parent, text ), m_item( item )
+ {}
+
+ PListViewItem ( T item, QListView * parent, const QString & text ) :
+ QListViewItem ( parent, text ), m_item( item )
+ {}
+
+ PListViewItem ( T item, QListView * parent, QListViewItem * after, const QString & text ) :
+ QListViewItem ( parent, after, text ), m_item( item )
+ {}
+
+ T item()
+ {
+ return m_item;
+ }
+
+ QString templateAddition;
+private:
+ T m_item;
+};
+
+
+class CppNewClassDialog : public CppNewClassDialogBase
+{
+ Q_OBJECT
+
+public:
+ CppNewClassDialog( CppSupportPart *part, QWidget *parent = 0, const char *name = 0 );
+ ~CppNewClassDialog();
+
+protected:
+ virtual void accept();
+ virtual void classNameChanged( const QString &text );
+ virtual void classNamespaceChanged( const QString &text );
+ virtual void headerChanged();
+ virtual void implementationChanged();
+ virtual void nameHandlerChanged( const QString &text );
+ virtual void baseclassname_changed( const QString &text );
+ virtual void baseIncludeChanged( const QString &text );
+
+ virtual void addBaseClass();
+ virtual void remBaseClass();
+ virtual void remBaseClassOnly();
+ virtual void currBaseNameChanged( const QString &text );
+ virtual void currBasePrivateSet();
+ virtual void currBaseProtectedSet();
+ virtual void currBasePublicSet();
+ virtual void currBaseVirtualChanged( int val );
+ virtual void currBaseSelected( QListViewItem *it );
+ virtual void scopeboxActivated( int value );
+
+ virtual void checkObjCInheritance( int val );
+ virtual void checkQWidgetInheritance( int val );
+
+ virtual void upbaseclass_button_clicked();
+ virtual void downbaseclass_button_clicked();
+ virtual void baseclasses_view_selectionChanged();
+
+ virtual void newTabSelected( const QString &text );
+ virtual void newTabSelected( QWidget *w );
+ virtual void access_view_mouseButtonPressed( int button, QListViewItem * item, const QPoint &p, int c );
+ virtual void changeToPrivate();
+ virtual void changeToProtected();
+ virtual void changeToPublic();
+ virtual void changeToInherited();
+ virtual void methods_view_mouseButtonPressed( int button , QListViewItem * item, const QPoint&p , int c );
+ virtual void extendFunctionality();
+ virtual void replaceFunctionality();
+ virtual void to_constructors_list_clicked();
+ virtual void clear_selection_button_clicked();
+ virtual void selectall_button_clicked();
+ virtual void gtk_box_stateChanged( int val );
+ virtual void qobject_box_stateChanged( int val );
+ virtual void headeronly_box_stateChanged(int val);
+
+ void reloadAdvancedInheritance( bool clean = false );
+ void parseClass( QString clName, QString inheritance );
+ void parsePCSClass( QString clName, QString inheritance );
+ void addToConstructorsList( QCheckListItem *myClass, FunctionDom method );
+ void addToMethodsList( QListViewItem *parent, FunctionDom method );
+ void addToUpgradeList( QListViewItem *parent, FunctionDom method, QString modifier );
+ void addToUpgradeList( QListViewItem *parent, VariableDom attr, QString modifier );
+ void clearConstructorsList( bool clean = false );
+ void clearMethodsList( bool clean = false );
+ void clearUpgradeList( bool clean = false );
+ bool isConstructor( QString className, const FunctionDom &method );
+ bool isDestructor( QString className, const FunctionDom &method );
+
+private:
+
+ bool headerModified;
+ bool baseincludeModified;
+ bool implementationModified;
+ QString m_parse;
+ QPopupMenu *accessMenu;
+ QPopupMenu *overMenu;
+ CppSupportPart *m_part;
+ CodeModel *myModel;
+
+ // configuration variables
+ QString interface_url;
+ QString implementation_url;
+ QString interface_suffix;
+ QString implementation_suffix;
+ QStringList currNamespace;
+ bool lowercase_filenames;
+ QStringList currBaseClasses;
+ KCompletion * compBasename;
+ KCompletion * compNamespace;
+
+ void setCompletionBasename( CodeModel *model );
+ void addCompletionBasenameNamespacesRecursive( const NamespaceDom & namespaceDom, const QString & namespaceParent = "" );
+ void setCompletionNamespaceRecursive( const NamespaceDom & namespaceDom, const QString & namespaceParent = "" );
+ void setStateOfInheritanceEditors( bool state, bool hideList = true );
+ void setAccessForBase( QString baseclass, QString newAccess );
+ void setAccessForItem( QListViewItem *curr, QString newAccess, bool isPublic );
+ void remClassFromAdv( QString text );
+ void checkUpButtonState();
+ void checkDownButtonState();
+ void updateConstructorsOrder();
+
+ QString classNameFormatted();
+ QString templateStrFormatted();
+ QString templateParamsFormatted();
+ QString classNameFormatted( const QString & );
+ QString templateStrFormatted( const QString & );
+ QString templateParamsFormatted( const QString & );
+ QString templateActualParamsFormatted( const QString & );
+ void removeTemplateParams( QString & );
+
+ friend class ClassGenerator;
+
+ //! The class that translates UI input to a class
+ class ClassGenerator
+ {
+
+ public:
+ ClassGenerator( CppNewClassDialog& _dlg ) : dlg( _dlg )
+ {}
+ bool generate();
+
+ private:
+ bool validateInput();
+ void common_text();
+ void gen_implementation();
+ void gen_interface();
+ void genMethodDeclaration( FunctionDom method, QString className, QString templateStr,
+ QString *adv_h, QString *adv_cpp, bool extend, QString baseClassName );
+
+ void beautifyHeader( QString &templ, QString &headerGuard,
+ QString &includeBaseHeader, QString &author, QString &doc, QString &className, QString &templateStr,
+ QString &baseclass, QString &inheritance, QString &qobjectStr, QString &args,
+ QString &header, QString &namespaceBeg, QString &constructors, QString &advH_public,
+ QString &advH_public_slots,
+ QString &advH_protected, QString &advH_protected_slots, QString &advH_private, QString &advH_private_slots,
+ QString &namespaceEnd );
+ void beautifySource( QString &templ, QString &header, QString &className, QString &namespaceBeg,
+ QString &constructors, QString &advCpp, QString &namespaceEnd, QString &implementation );
+
+ QString className;
+ QString templateStr;
+ QString templateParams;
+ QString header;
+ QString implementation;
+
+ QString advConstructorsHeader;
+ QString advConstructorsSource;
+
+ KDevProject *project;
+ QString subDir, headerPath, implementationPath;
+ QString doc;
+ QString namespaceStr;
+ bool childClass;
+ bool objc;
+ bool qobject;
+ bool gtk;
+ bool headeronly;
+ QStringList namespaces;
+ QString namespaceBeg, namespaceEnd;
+ QString argsH;
+ QString argsCpp;
+
+ QString advH_public;
+ QString advH_public_slots;
+ QString advH_protected;
+ QString advH_protected_slots;
+ QString advH_private;
+ QString advH_private_slots;
+ QString advCpp;
+
+
+ CppNewClassDialog& dlg;
+ };
+
+
+ //! workaround to make gcc 2.95.x happy
+ friend class CppNewClassDialog::ClassGenerator;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/cppnewclassdlgbase.ui b/languages/cpp/cppnewclassdlgbase.ui
new file mode 100644
index 00000000..4f443eaf
--- /dev/null
+++ b/languages/cpp/cppnewclassdlgbase.ui
@@ -0,0 +1,1290 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>CppNewClassDialogBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CppNewClassDlgBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>510</width>
+ <height>611</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>New Class</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>class_tabs</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab1</cstring>
+ </property>
+ <attribute name="title">
+ <string>Class &amp;Information</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>Spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout10</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>documentation_label_</cstring>
+ </property>
+ <property name="text">
+ <string>Docu&amp;mentation:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>documentation_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>documentation_edit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Insert a short description for your new class
+here for documentation purposes. This can be used
+to create API documentation in HTML format with
+doxygen or similar tools.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>filenames_group</cstring>
+ </property>
+ <property name="title">
+ <string>File Names</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>header_label</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Header:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>header_edit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>header_edit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Insert your header file name here.
+It is automatically inserted while
+you select the classname, but you can
+still edit it afterwards.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>implementation_label</cstring>
+ </property>
+ <property name="text">
+ <string>Im&amp;plementation:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>implementation_edit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>implementation_edit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Insert your implementation filename here.
+It is automatically inserted while
+you select the classname, but you can
+still edit it afterwards.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>headeronly_box</cstring>
+ </property>
+ <property name="text">
+ <string>Create only header</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>groupBox7</cstring>
+ </property>
+ <property name="title">
+ <string>Class</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>classname_label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>classname_edit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>classname_edit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Insert your new classname here.
+You can also define template classes by specifying
+template &lt;params&gt; classname</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>namespace_label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Name&amp;space:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>namespace_edit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>namespace_edit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Insert a name of the namespace here.
+You can define nested namespaces by specifying
+Namespace1::Namespace2::...::NamespaceN</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>inheritance_group</cstring>
+ </property>
+ <property name="title">
+ <string>Inheritance</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>addbaseclass_button</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="0">
+ <property name="name">
+ <cstring>rembaseclass_button</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="0">
+ <property name="name">
+ <cstring>upbaseclass_button</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Move &amp;Up</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="0">
+ <property name="name">
+ <cstring>downbaseclass_button</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Move &amp;Down</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>basename_label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Base class:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>basename_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QListView" row="2" column="1" rowspan="4" colspan="2">
+ <column>
+ <property name="text">
+ <string>Baseclass Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Inheritance Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>baseclasses_view</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="resizePolicy">
+ <enum>AutoOneFit</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>basename_edit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>StrongFocus</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Insert the base class which your new class will be derived from. If you have checked 'Generate QWidget child class' the new class will be derived from QWidget. If no base class is named, the new class will not have a parent class. You can also use template classes here (like BaseClass&lt;int, int&gt;)</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="2">
+ <property name="name">
+ <cstring>baseinclude_edit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>StrongFocus</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Global</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Local</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>scope_box</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>virtual_box</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Virtual</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>public_button</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Public</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>protected_button</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Protected</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>private_button</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Private</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="2" column="1">
+ <property name="name">
+ <cstring>optionsBox</cstring>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>filetemplate_box</cstring>
+ </property>
+ <property name="text">
+ <string>Use file t&amp;emplates</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>qobject_box</cstring>
+ </property>
+ <property name="text">
+ <string>Generate QOb&amp;ject child class</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>childclass_box</cstring>
+ </property>
+ <property name="text">
+ <string>Generate Q&amp;Widget child class</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>gtk_box</cstring>
+ </property>
+ <property name="text">
+ <string>Generate G&amp;TK+ class</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>objc_box</cstring>
+ </property>
+ <property name="text">
+ <string>Use Objective-C</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab2</cstring>
+ </property>
+ <attribute name="title">
+ <string>Ad&amp;vanced Information</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabWidget4</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Constr&amp;uctors</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Base Class Constructors</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>constructors_view</cstring>
+ </property>
+ <property name="resizePolicy">
+ <enum>AutoOneFit</enum>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>to_constructors_list</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>125</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>C&amp;reate Constructor &gt;&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>clear_selection_button</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>125</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>C&amp;lear Selection</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9_2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>150</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabWidget3</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab_header</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Header</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QTextEdit" row="0" column="0">
+ <property name="name">
+ <cstring>constructors_h_edit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab_source</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Source</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QTextEdit" row="0" column="0">
+ <property name="name">
+ <cstring>constructors_cpp_edit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Methods Ov&amp;erriding</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Methods</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Extend Functionality</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>methods_view</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="resizePolicy">
+ <enum>AutoOneFit</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Access Control</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Methods &amp; Attributes</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Implied Modifier</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>New Modifier</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>access_view</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="resizePolicy">
+ <enum>AutoOneFit</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Generation Options</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="ClassGeneratorConfig" row="0" column="0">
+ <property name="name">
+ <cstring>gen_config</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>StrongFocus</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer7_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>ok_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancel_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>ClassGeneratorConfig</class>
+ <header location="local">classgeneratorconfig.h</header>
+ <sizehint>
+ <width>0</width>
+ <height>0</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="2926">789c9d95594f32591086effd15c4ba3393fae895ee4ce6824540141011b7c95cf406a202caa6f065fefb549faaea0b24996fc623cb937aeb3d55754e871f67a587eb6ee9ecc7c96a1dada74929798e96a5b374339bedfefceb8f9f27a7b65da27fcb724bf6e96f27a783752929f516f32c070402289b3fc39d8203c3136157e276c1260eac0f0ade0907927f2d9c58261f929cad72be0cef8535ff5959e277c201ef0fa02cf1ae7022f9efca12ff301ca81e87c21a5f32db5acf95b0eebfcdd92e2be3a5b0fa7986435bfd6e981d99278c0ae6795c288b3e2b98e3036157d8f839961308af985df51b1b0e9dc0098ddf5a3811fd7dceaee52a370d475e28f9b7ca1c07539f67173c144e65be2fcae2d763f62d89df2acb7cc282393e57b6b9ff58d893fca632c7d1ccc78bbcd48b4c7cc2ec4bfdf0aa2cfbf50be6fa2c65d9af2aacfd2c94e53cccf9fa7645eb7794a59ebdb027fe5565895f09cb7e981a267f9febaf3117fab6702af599e7a5e2049e6dce1377c25affa6608e4786e34a58894dfc8b59f5f890731087e28f2de648fbdb16ccfd6c9465bf7365c732f12f61ed3f5016fd4a59f4e6790fddd00a5d137f638eb4bfa532df5ffc148ea4be5ac17c5ea9b2ecd72b98efff403893fa1accb12d5c5696fd4d7f6152c41f95c53f2a98f56b6597fbf3857da9b75e30fb5584b59fa78239de5596fd3e0be6fdccf311b99115f1fcdaccb12fe77927ac7e2365f1c382793e63e14cfccdf3132571e69b1f07e83327d23fbac2bee4d785d57f2a9c89de9c6fecaa1fce98135bf845b9e2189e2a07e6fee287b0cfcf3bce9525ff5d38927a1bcca9cc1b66ca528ff93d89d338e3f9e182b9c86f31a752ff609d2f847f5f83b5ea31c218137a4f8fac0cc738e10cd6d3b7189f718a2ff88a6f38c339ad05adfcf31d3f7089ab037d42ea356e708b9ff8853bdc6395de6b58c706ad736c1ee823f2de608b146dbcc08e8976f012afb04b3975ec1de853aa2457f749d5c16b1ce00d0ecdf75b1ce1dd11fd1b55d236cef7f8808ff88465b4d02676d03da29f51dd9e513fa28f150c3004246d07002288bfe9e7d45f0712f22635a490d15ef730361e3b389c67aedf2390ea3157e73dc333e9a6f042d13ebc7ed32f6882405d3ee1c678030ee10d6630a76f162c8ee8f37adeb14c0aaa0b3e68b725ac80a2b039a29f630db6e46bc127d5fd45de4b5226b0833d8ea07a445f871ae96dacc218ead08073c835136842eba8be016db830e77a419f21aca143f76c025b9ae7e5813ea35bd5a0731fd1c4877a7f614fde57d085deb7f31ad31dccf54fd087883ab7a88f6baabb45fdf760003707fa09ddd826f66048af1826f00a0bb3aa7009b73082bb03fd2faeffa7fff58cfffcbcfffdfbc93f7f7d62d7</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>ok_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancel_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>classname_edit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>classNameChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>header_edit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>headerChanged()</slot>
+ </connection>
+ <connection>
+ <sender>implementation_edit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>implementationChanged()</slot>
+ </connection>
+ <connection>
+ <sender>childclass_box</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>checkQWidgetInheritance(int)</slot>
+ </connection>
+ <connection>
+ <sender>objc_box</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>checkObjCInheritance(int)</slot>
+ </connection>
+ <connection>
+ <sender>virtual_box</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>currBaseVirtualChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>public_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>currBasePublicSet()</slot>
+ </connection>
+ <connection>
+ <sender>protected_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>currBaseProtectedSet()</slot>
+ </connection>
+ <connection>
+ <sender>private_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>currBasePrivateSet()</slot>
+ </connection>
+ <connection>
+ <sender>addbaseclass_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>addBaseClass()</slot>
+ </connection>
+ <connection>
+ <sender>rembaseclass_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>remBaseClass()</slot>
+ </connection>
+ <connection>
+ <sender>baseclasses_view</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>currBaseSelected(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>upbaseclass_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>upbaseclass_button_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>downbaseclass_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>downbaseclass_button_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>baseclasses_view</sender>
+ <signal>selectionChanged()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>baseclasses_view_selectionChanged()</slot>
+ </connection>
+ <connection>
+ <sender>gtk_box</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>gtk_box_stateChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>basename_edit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>currBaseNameChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>qobject_box</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>qobject_box_stateChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>access_view</sender>
+ <signal>mouseButtonPressed(int,QListViewItem*,const QPoint&amp;,int)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>access_view_mouseButtonPressed(int,QListViewItem*,const QPoint&amp;,int)</slot>
+ </connection>
+ <connection>
+ <sender>methods_view</sender>
+ <signal>mouseButtonPressed(int,QListViewItem*,const QPoint&amp;,int)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>methods_view_mouseButtonPressed(int,QListViewItem*,const QPoint&amp;,int)</slot>
+ </connection>
+ <connection>
+ <sender>clear_selection_button</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>clear_selection_button_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>to_constructors_list</sender>
+ <signal>clicked()</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>to_constructors_list_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>class_tabs</sender>
+ <signal>selected(const QString&amp;)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>newTabSelected(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>class_tabs</sender>
+ <signal>currentChanged(QWidget*)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>newTabSelected(QWidget*)</slot>
+ </connection>
+ <connection>
+ <sender>basename_edit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>baseclassname_changed(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>baseinclude_edit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>baseIncludeChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>scope_box</sender>
+ <signal>activated(int)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>scopeboxActivated(int)</slot>
+ </connection>
+ <connection>
+ <sender>namespace_edit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>classNamespaceChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>headeronly_box</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>CppNewClassDlgBase</receiver>
+ <slot>headeronly_box_stateChanged(int)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>classname_edit</tabstop>
+ <tabstop>namespace_edit</tabstop>
+ <tabstop>addbaseclass_button</tabstop>
+ <tabstop>basename_edit</tabstop>
+ <tabstop>baseinclude_edit</tabstop>
+ <tabstop>scope_box</tabstop>
+ <tabstop>virtual_box</tabstop>
+ <tabstop>public_button</tabstop>
+ <tabstop>protected_button</tabstop>
+ <tabstop>private_button</tabstop>
+ <tabstop>baseclasses_view</tabstop>
+ <tabstop>rembaseclass_button</tabstop>
+ <tabstop>upbaseclass_button</tabstop>
+ <tabstop>downbaseclass_button</tabstop>
+ <tabstop>header_edit</tabstop>
+ <tabstop>implementation_edit</tabstop>
+ <tabstop>filetemplate_box</tabstop>
+ <tabstop>qobject_box</tabstop>
+ <tabstop>childclass_box</tabstop>
+ <tabstop>gtk_box</tabstop>
+ <tabstop>objc_box</tabstop>
+ <tabstop>documentation_edit</tabstop>
+ <tabstop>class_tabs</tabstop>
+ <tabstop>ok_button</tabstop>
+ <tabstop>cancel_button</tabstop>
+ <tabstop>tabWidget4</tabstop>
+ <tabstop>constructors_view</tabstop>
+ <tabstop>to_constructors_list</tabstop>
+ <tabstop>clear_selection_button</tabstop>
+ <tabstop>tabWidget3</tabstop>
+ <tabstop>constructors_h_edit</tabstop>
+ <tabstop>methods_view</tabstop>
+ <tabstop>access_view</tabstop>
+ <tabstop>gen_config</tabstop>
+ <tabstop>constructors_cpp_edit</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected">updateClassStore()</slot>
+ <slot access="protected">access_view_mouseButtonPressed( int button, QListViewItem * item, const QPoint &amp; p, int c )</slot>
+ <slot access="protected">classNameChanged( const QString &amp; text )</slot>
+ <slot access="protected">headerChanged()</slot>
+ <slot access="protected">implementationChanged()</slot>
+ <slot access="protected">nameHandlerChanged( const QString &amp; text )</slot>
+ <slot access="protected">addBaseClass()</slot>
+ <slot access="protected">remBaseClass()</slot>
+ <slot access="protected">currBaseNameChanged( const QString &amp; text )</slot>
+ <slot access="protected">currBasePrivateSet()</slot>
+ <slot access="protected">currBaseProtectedSet()</slot>
+ <slot access="protected">currBasePublicSet()</slot>
+ <slot access="protected">currBaseVirtualChanged( int val )</slot>
+ <slot access="protected">currBaseSelected( QListViewItem * it )</slot>
+ <slot access="protected">checkObjCInheritance( int val )</slot>
+ <slot access="protected">checkQWidgetInheritance( int val )</slot>
+ <slot access="protected">newTabSelected( const QString &amp; text )</slot>
+ <slot access="protected">changeToPrivate()</slot>
+ <slot access="protected">changeToProtected()</slot>
+ <slot access="protected">changeToPublic()</slot>
+ <slot access="protected">changeToInherited()</slot>
+ <slot access="protected">methods_view_mouseButtonPressed( int, QListViewItem *, const QPoint &amp;, int )</slot>
+ <slot access="protected">newTabSelected( QWidget * w )</slot>
+ <slot access="protected">extendFunctionality()</slot>
+ <slot access="protected">replaceFunctionality()</slot>
+ <slot access="protected">to_constructors_list_clicked()</slot>
+ <slot access="protected">from_constructors_list_clicked()</slot>
+ <slot access="protected">add_constructor_button_clicked()</slot>
+ <slot access="protected">rem_constructor_button_clicked()</slot>
+ <slot access="protected">clear_selection_button_clicked()</slot>
+ <slot access="protected">upbaseclass_button_clicked()</slot>
+ <slot access="protected">downbaseclass_button_clicked()</slot>
+ <slot access="protected">baseclasses_view_selectionChanged()</slot>
+ <slot access="protected">gtk_box_stateChanged( int )</slot>
+ <slot access="protected">qobject_box_stateChanged( int )</slot>
+ <slot access="protected">selectall_button_clicked()</slot>
+ <slot access="protected">baseclassname_changed( const QString &amp; )</slot>
+ <slot access="protected">baseIncludeChanged( const QString &amp; )</slot>
+ <slot access="protected">scopeboxActivated( int )</slot>
+ <slot access="protected">classNamespaceChanged( const QString &amp; )</slot>
+ <slot access="protected">headeronly_box_stateChanged(int val)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>classgeneratorconfig.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/cppsplitheadersourceconfig.cpp b/languages/cpp/cppsplitheadersourceconfig.cpp
new file mode 100644
index 00000000..68253368
--- /dev/null
+++ b/languages/cpp/cppsplitheadersourceconfig.cpp
@@ -0,0 +1,82 @@
+/*
+ * KDevelop config for split header/source
+ *
+ * Copyright (c) 2005 Adam Treat <treat@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "cppsplitheadersourceconfig.h"
+#include "cppsupportpart.h"
+
+#include <domutil.h>
+
+#include <kdebug.h>
+#include <qdom.h>
+
+QString CppSplitHeaderSourceConfig::defaultPath = QString::fromLatin1( "/kdevcppsupport/splitheadersource" );
+
+CppSplitHeaderSourceConfig::CppSplitHeaderSourceConfig( CppSupportPart * part, QDomDocument* dom )
+ : QObject( part ), m_part( part ), m_dom( dom )
+{
+ init();
+}
+
+CppSplitHeaderSourceConfig::~CppSplitHeaderSourceConfig()
+{}
+
+void CppSplitHeaderSourceConfig::init( )
+{
+ m_splitEnable =
+ DomUtil::readBoolEntry( *m_dom, defaultPath + "/enabled", false );
+ m_splitSync =
+ DomUtil::readBoolEntry( *m_dom, defaultPath + "/synchronize", true );
+ m_splitOrientation =
+ DomUtil::readEntry( *m_dom, defaultPath + "/orientation", "Vertical" );
+}
+
+void CppSplitHeaderSourceConfig::store( )
+{
+ DomUtil::writeBoolEntry( *m_dom,
+ defaultPath + "/enabled",
+ m_splitEnable );
+ DomUtil::writeBoolEntry( *m_dom,
+ defaultPath + "/synchronize",
+ m_splitSync );
+ DomUtil::writeEntry( *m_dom,
+ defaultPath + "/orientation",
+ m_splitOrientation );
+
+ emit stored();
+}
+
+void CppSplitHeaderSourceConfig::setSplitEnable( bool b )
+{
+ m_splitEnable = b;
+}
+
+void CppSplitHeaderSourceConfig::setAutoSync( bool b )
+{
+ m_splitSync = b;
+}
+
+void CppSplitHeaderSourceConfig::setOrientation( const QString &o )
+{
+ m_splitOrientation = o;
+}
+
+#include "cppsplitheadersourceconfig.moc"
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/cppsplitheadersourceconfig.h b/languages/cpp/cppsplitheadersourceconfig.h
new file mode 100644
index 00000000..d975bc2c
--- /dev/null
+++ b/languages/cpp/cppsplitheadersourceconfig.h
@@ -0,0 +1,74 @@
+/*
+ * KDevelop config for split header/source
+ *
+ * Copyright (c) 2005 Adam Treat <treat@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#ifndef CPPSPLITHEADERSOURCECONFIG_H
+#define CPPSPLITHEADERSOURCECONFIG_H
+
+#include <qobject.h>
+
+class CppSupportPart;
+class QDomDocument;
+
+class CppSplitHeaderSourceConfig : public QObject
+{
+ Q_OBJECT
+public:
+ CppSplitHeaderSourceConfig( CppSupportPart* part, QDomDocument* dom );
+ virtual ~CppSplitHeaderSourceConfig();
+
+ bool splitEnabled() const
+ {
+ return m_splitEnable;
+ }
+ void setSplitEnable( bool b );
+
+ bool autoSync() const
+ {
+ return m_splitSync;
+ }
+ void setAutoSync( bool b );
+
+ QString orientation() const
+ {
+ return m_splitOrientation;
+ }
+ void setOrientation( const QString &o );
+
+public slots:
+ void store();
+
+private:
+ void init();
+
+signals:
+ void stored();
+
+private:
+ CppSupportPart* m_part;
+ QDomDocument* m_dom;
+ bool m_splitEnable;
+ bool m_splitSync;
+ QString m_splitOrientation;
+
+ static QString defaultPath;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/cppsupport_events.h b/languages/cpp/cppsupport_events.h
new file mode 100644
index 00000000..0c266726
--- /dev/null
+++ b/languages/cpp/cppsupport_events.h
@@ -0,0 +1,75 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef __cppsupport_events_h
+#define __cppsupport_events_h
+
+#include "kdevdeepcopy.h"
+
+#include <qevent.h>
+#include <qvaluelist.h>
+
+#if QT_VERSION < 0x030100
+#include <kdevmutex.h>
+#else
+#include <qmutex.h>
+#endif
+
+enum
+{
+ Event_FileParsed = QEvent::User + 1000
+};
+
+
+class FileParsedEvent: public QCustomEvent
+{
+public:
+ FileParsedEvent( const QString& fileName, const QValueList<Problem>& problems, bool fromDisk = false )
+ : QCustomEvent( Event_FileParsed ), m_fileName( deepCopy( fileName ) ), m_fromDisk( fromDisk )
+ {
+ // the members are deep copies
+ QValueListConstIterator<Problem> it = problems.begin();
+ while ( it != problems.end() )
+ {
+ Problem p = *it;
+ m_problems.append( Problem( deepCopy( p.text() ), p.line(), p.column(), p.level() ) );
+ m_problems.back().setFileName( deepCopy( p.fileName() ) );
+ ++it;
+ }
+ }
+
+ QString fileName() const
+ {
+ return m_fileName;
+ }
+ QValueList<Problem> problems() const
+ {
+ return m_problems;
+ }
+
+ bool fromDisk() {
+ return m_fromDisk;
+ }
+
+private:
+ QString m_fileName;
+ QValueList<Problem> m_problems;
+ bool m_fromDisk;
+
+private:
+ FileParsedEvent( const FileParsedEvent& source );
+ void operator = ( const FileParsedEvent& source );
+};
+
+
+#endif // __cppsupport_events_h
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/cppsupport_utils.cpp b/languages/cpp/cppsupport_utils.cpp
new file mode 100644
index 00000000..e6f80abc
--- /dev/null
+++ b/languages/cpp/cppsupport_utils.cpp
@@ -0,0 +1,139 @@
+#include <qdir.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+
+#include <codemodel.h>
+
+#include "cppsupport_utils.h"
+
+static void typeNameList( QStringList& path, QStringList & lst, const CodeModel * model );
+static void typeNameList( QStringList& path, QStringList & lst, NamespaceDom ns );
+static void typeNameList( QStringList & path, QStringList & lst, ClassDom klass );
+
+QStringList typeNameList( const CodeModel* model )
+{
+ QStringList lst;
+ QStringList path;
+ typeNameList( path, lst, model );
+ return lst;
+}
+
+static void typeNameList( QStringList& path, QStringList & lst, const CodeModel * model )
+{
+ const FileList fileList = model->fileList();
+ for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it )
+ typeNameList( path, lst, model_cast<NamespaceDom>(*it) );
+}
+
+static void typeNameList( QStringList& path, QStringList & lst, NamespaceDom ns )
+{
+ if( !ns->isFile() )
+ path.push_back( ns->name() );
+
+ const NamespaceList namespaceList = ns->namespaceList();
+ for( NamespaceList::ConstIterator it=namespaceList.begin(); it!=namespaceList.end(); ++it )
+ typeNameList( path, lst, *it );
+
+ const ClassList classList = ns->classList();
+ for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
+ typeNameList( path, lst, *it );
+
+ if( !ns->isFile() )
+ path.pop_back();
+}
+
+static void typeNameList( QStringList & path, QStringList & lst, ClassDom klass )
+{
+ path.push_back( klass->name() );
+
+ lst << path.join( "::" );
+
+ const ClassList classList = klass->classList();
+ for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
+ typeNameList( path, lst, *it );
+
+ path.pop_back();
+}
+
+static void typedefMap( QMap<QString, QString> & map, const CodeModel * model );
+static void typedefMap( QMap<QString, QString> & map, NamespaceDom ns );
+static void typedefMap( QMap<QString, QString> & map, ClassDom klass );
+
+QMap<QString, QString> typedefMap( const CodeModel* model )
+{
+ QMap<QString, QString> map;
+ typedefMap( map, model );
+
+ /*We need to flatten the typedefs to avoid circular aliases.
+ Example:
+ map["Foo"] = "int";
+ map["Bar"] = "Foo";
+ map["Baz"] = "Bar";*/
+
+ QMap<QString, QString>::iterator it = map.begin();
+ for ( ; it != map.end(); ++it )
+ {
+ while ( map.contains( map[ it.key() ] ) &&
+ it.key() != map[ it.key() ] )
+ {
+ map[ it.key() ] = map[ map[ it.key() ] ];
+ }
+ }
+
+ return map;
+}
+
+static void typedefMap( QMap<QString, QString> & map, const CodeModel * model )
+{
+ const FileList fileList = model->fileList();
+ for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it )
+ typedefMap( map, model_cast<NamespaceDom>(*it) );
+}
+
+static void typedefMap( QMap<QString, QString> & map, NamespaceDom ns )
+{
+ const TypeAliasList aliasList = ns->typeAliasList();
+ for( TypeAliasList::ConstIterator it=aliasList.begin(); it!=aliasList.end(); ++it )
+ map[ ( *it )->name() ] = ( *it )->type();
+
+ const NamespaceList namespaceList = ns->namespaceList();
+ for( NamespaceList::ConstIterator it=namespaceList.begin(); it!=namespaceList.end(); ++it )
+ typedefMap( map, *it );
+
+ const ClassList classList = ns->classList();
+ for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
+ typedefMap( map, *it );
+}
+
+static void typedefMap( QMap<QString, QString> & map, ClassDom klass )
+{
+ const TypeAliasList aliasList = klass->typeAliasList();
+ for( TypeAliasList::ConstIterator it=aliasList.begin(); it!=aliasList.end(); ++it )
+ map[ ( *it )->name() ] = ( *it )->type();
+
+ const ClassList classList = klass->classList();
+ for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
+ typedefMap( map, *it );
+}
+
+QString formattedOpeningParenthesis(bool suppressSpace)
+{
+ KConfig * config = kapp->config();
+ config->setGroup("AStyle");
+ bool use_spaces = config->readBoolEntry("PadParentheses", false);
+ if (not use_spaces or suppressSpace) return "(";
+ return "( ";
+}
+
+QString formattedClosingParenthesis(bool suppressSpace)
+{
+ KConfig * config = kapp->config();
+ config->setGroup("AStyle");
+ bool use_spaces = config->readBoolEntry("PadParentheses", false);
+ if (not use_spaces or suppressSpace) return ")";
+ return " )";
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/cppsupport_utils.h b/languages/cpp/cppsupport_utils.h
new file mode 100644
index 00000000..9182dd08
--- /dev/null
+++ b/languages/cpp/cppsupport_utils.h
@@ -0,0 +1,28 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef __cppsupport_utils_h
+#define __cppsupport_utils_h
+
+#include <qmap.h>
+#include <qstringlist.h>
+
+#include "codemodel.h"
+
+QStringList typeNameList( const CodeModel* model );
+QMap<QString, QString> typedefMap( const CodeModel* model );
+
+QString formattedOpeningParenthesis(bool suppressSpace = false);
+QString formattedClosingParenthesis(bool suppressSpace = false);
+
+#endif // __cppsupport_utils_h
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/cppsupportfactory.cpp b/languages/cpp/cppsupportfactory.cpp
new file mode 100644
index 00000000..77a586c9
--- /dev/null
+++ b/languages/cpp/cppsupportfactory.cpp
@@ -0,0 +1,42 @@
+/***************************************************************************
+ * Copyright (C) 2000-2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include <kinstance.h>
+#include <kstandarddirs.h>
+#include <kdevplugininfo.h>
+#include "cppsupportfactory.h"
+
+K_EXPORT_COMPONENT_FACTORY( libkdevcppsupport, CppSupportFactory )
+
+static const KDevPluginInfo data("kdevcppsupport");
+
+CppSupportFactory::CppSupportFactory()
+: KDevGenericFactory<CppSupportPart>( data )
+{
+}
+
+KInstance *CppSupportFactory::createInstance()
+{
+ KInstance *instance = KDevGenericFactory<CppSupportPart>::createInstance();
+ KStandardDirs *dirs = instance->dirs();
+ dirs->addResourceType( "newclasstemplates", KStandardDirs::kde_default("data") + "kdevcppsupport/newclass/" );
+ dirs->addResourceType( "pcs", KStandardDirs::kde_default( "data" ) + "kdevcppsupport/pcs/" );
+
+ return instance;
+}
+
+const KDevPluginInfo * CppSupportFactory::info()
+{
+ return &data;
+}
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
+
diff --git a/languages/cpp/cppsupportfactory.h b/languages/cpp/cppsupportfactory.h
new file mode 100644
index 00000000..78f53a7f
--- /dev/null
+++ b/languages/cpp/cppsupportfactory.h
@@ -0,0 +1,33 @@
+/***************************************************************************
+* Copyright (C) 2000-2001 by Bernd Gehrmann *
+* bernd@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef _CPPSUPPORTFACTORY_H_
+#define _CPPSUPPORTFACTORY_H_
+
+#include <kdevgenericfactory.h>
+#include "cppsupportpart.h"
+
+class KDevPluginInfo;
+
+class CppSupportFactory : public KDevGenericFactory<CppSupportPart>
+{
+public:
+ CppSupportFactory();
+
+ static const KDevPluginInfo *info();
+
+protected:
+ virtual KInstance *createInstance();
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/cppsupportpart.cpp b/languages/cpp/cppsupportpart.cpp
new file mode 100644
index 00000000..f72b168c
--- /dev/null
+++ b/languages/cpp/cppsupportpart.cpp
@@ -0,0 +1,3186 @@
+/***************************************************************************
+* Copyright (C) 1999 by Jonas Nordin *
+* jonas.nordin@syncom.se *
+* Copyright (C) 2000-2001 by Bernd Gehrmann *
+* bernd@kdevelop.org *
+* Copyright (C) 2002-2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* Copyright (C) 2003-2004 by Alexander Dymo *
+* adymo@mksat.net *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+
+#include "cppsupportpart.h"
+#include "cppsupport_events.h"
+#include "problemreporter.h"
+#include "backgroundparser.h"
+#include "store_walker.h"
+#include "ast.h"
+#include "ast_utils.h"
+#include "cppcodecompletion.h"
+#include "ccconfigwidget.h"
+#include "KDevCppSupportIface.h"
+#include "cppsupportfactory.h"
+#include "catalog.h"
+#include "cpp_tags.h"
+#include "kdevdriver.h"
+#include "cppcodecompletionconfig.h"
+#include "cppsplitheadersourceconfig.h"
+#include "tag_creator.h"
+#include "cppsupport_utils.h"
+#include "classgeneratorconfig.h"
+#include "urlutil.h"
+#include "creategettersetterconfiguration.h"
+#include "kdevsourceformatter.h"
+#include "kdevcreatefile.h"
+#include "qtbuildconfig.h"
+#include "kdeveditorutil.h"
+#include <ktexteditor/viewcursorinterface.h>
+#include <kpopupmenu.h>
+// wizards
+#include "cppnewclassdlg.h"
+#include "subclassingdlg.h"
+#include "addmethoddialog.h"
+#include "addattributedialog.h"
+#include "creategettersetterdialog.h"
+// designer integration
+#include "qtdesignercppintegration.h"
+#include "cppimplementationwidget.h"
+#include "configproblemreporter.h"
+#include "codeinformationrepository.h"
+
+#include <qeventloop.h>
+#include <qheader.h>
+#include <qdir.h>
+#include <qdom.h>
+#include <qfileinfo.h>
+#include <qguardedptr.h>
+#include <qpopupmenu.h>
+#include <qprogressdialog.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+#include <qstatusbar.h>
+#include <qprogressbar.h>
+#include <qregexp.h>
+#include <qlabel.h>
+#include <qvbox.h>
+#include <kmessagebox.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdialogbase.h>
+#include <kgenericfactory.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kmainwindow.h>
+#include <kstatusbar.h>
+#include <kconfig.h>
+#include <kdeversion.h>
+#include <kstandarddirs.h>
+#include <kiconloader.h>
+
+#include <ktexteditor/document.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/selectioninterface.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <ktexteditor/clipboardinterface.h>
+#include <ktexteditor/texthintinterface.h>
+
+#include <kdevcore.h>
+#include <kdevproject.h>
+#include <kdevmainwindow.h>
+#include <kdevpartcontroller.h>
+#include <kdevmakefrontend.h>
+#include <kdevcoderepository.h>
+#include <codemodel_utils.h>
+#include <kdevplugininfo.h>
+
+#include <domutil.h>
+#include <config.h>
+
+const bool alwaysParseInBackground = true;
+
+enum { KDEV_DB_VERSION = 21 };
+enum { KDEV_PCS_VERSION = 18 };
+
+QStringList CppSupportPart::m_sourceMimeTypes = QStringList() << "text/x-csrc" << "text/x-c++src";
+QStringList CppSupportPart::m_headerMimeTypes = QStringList() << "text/x-chdr" << "text/x-c++hdr";
+
+QStringList CppSupportPart::m_sourceExtensions = QStringList::split( ",", "c,C,cc,cpp,c++,cxx,m,mm,M" );
+QStringList CppSupportPart::m_headerExtensions = QStringList::split( ",", "h,H,hh,h++,hxx,hpp,inl,tlh,diff,ui.h" );
+
+class CppDriver: public KDevDriver
+{
+public:
+ CppDriver( CppSupportPart* cppSupport ) : KDevDriver( cppSupport, true )
+ {}
+
+ void fileParsed( ParsedFile& fileName )
+ {
+ //kdDebug(9007) << "-----> file " << fileName << " parsed!" << endl;
+
+ ParsedFilePointer ast = takeTranslationUnit( fileName.fileName() );
+
+ if ( cppSupport() ->problemReporter() )
+ {
+ cppSupport() ->problemReporter() ->removeAllProblems( fileName.fileName() );
+
+ QValueList<Problem> pl = problems( fileName.fileName() );
+ QValueList<Problem>::ConstIterator it = pl.begin();
+ while ( it != pl.end() )
+ {
+ const Problem & p = *it++;
+ cppSupport() ->problemReporter() ->reportProblem( fileName.fileName(), p );
+ }
+ }
+
+ StoreWalker walker( fileName.fileName(), cppSupport() ->codeModel() );
+
+ if ( cppSupport() ->codeModel() ->hasFile( fileName.fileName() ) )
+ {
+ FileDom file = cppSupport() ->codeModel() ->fileByName( fileName.fileName() );
+ cppSupport() ->removeWithReferences( fileName.fileName() );
+ }
+
+ walker.parseTranslationUnit( *ast );
+ cppSupport() ->codeModel() ->addFile( walker.file() );
+ remove
+ ( fileName.fileName() );
+
+ if( cppSupport()->_jd ) {
+ cppSupport()->_jd->backgroundState ++;
+ cppSupport()->_jd->lastParse = QTime::currentTime();
+ }
+
+ QFileInfo fileInfo( fileName.fileName() );
+ QString path = URLUtil::canonicalPath( fileName.fileName() );
+
+ cppSupport()->m_timestamp[ path ] = fileInfo.lastModified();
+
+ cppSupport()->emitSynchronousParseReady( fileName.fileName(), ast );
+ }
+};
+
+// ProblemReporter doesn't really depend on background parsing, so it's a bit of a mixup to
+// handle them together, but it's the same config widget so...
+class BackgroundParserConfig
+{
+ bool m_useProblemReporter;
+ bool m_useBackgroundParser;
+ int m_backgroundParseDelay;
+public:
+ void readConfig()
+ {
+ KConfig* config = kapp->config();
+ config->setGroup( "General Options" );
+ m_useProblemReporter = config->readBoolEntry( "EnableProblemReporter", true );
+ m_useBackgroundParser = config->readBoolEntry( "EnableCppBgParser", true );
+ m_backgroundParseDelay = config->readNumEntry( "BgParserDelay", 500 );
+ }
+
+ bool useProblemReporter() { return m_useProblemReporter; }
+ bool useBackgroundParser() { return m_useBackgroundParser; }
+ int backgroudParseDelay() { return m_backgroundParseDelay; }
+};
+
+
+CppSupportPart::CppSupportPart( QObject *parent, const char *name, const QStringList &args )
+: KDevLanguageSupport( CppSupportFactory::info(), parent, name ? name : "KDevCppSupport" ), m_backgroundParser(0),
+ m_activeDocument( 0 ), m_activeView( 0 ), m_activeSelection( 0 ), m_activeEditor( 0 ), m_activeViewCursor( 0 ),
+ m_projectClosed( true ), m_projectClosing( false ), m_valid( false ), m_isTyping( false ), m_hadErrors( false ),
+ _jd(0)
+{
+ setInstance( CppSupportFactory::instance() );
+
+ m_pCompletionConfig = new CppCodeCompletionConfig( this, projectDom() );
+ m_pSplitHeaderSourceConfig = new CppSplitHeaderSourceConfig( this, projectDom() );
+ m_pCreateGetterSetterConfiguration = new CreateGetterSetterConfiguration( this ); connect( m_pSplitHeaderSourceConfig, SIGNAL( stored() ),
+ this, SLOT( splitHeaderSourceConfigStored() ) );
+ connect( m_pCompletionConfig, SIGNAL( stored() ),
+ this, SLOT( codeCompletionConfigStored() ) );
+ m_qtBuildConfig = new QtBuildConfig( this, projectDom() );
+ m_qtBuildConfig->store();
+
+ m_backgroundParserConfig = new BackgroundParserConfig;
+ m_backgroundParserConfig->readConfig();
+
+ m_driver = new CppDriver( this );
+ m_problemReporter = 0;
+
+ m_textChangedTimer = new QTimer( this );
+ connect( m_textChangedTimer, SIGNAL(timeout()), this, SLOT(slotParseCurrentFile()) );
+
+ m_cursorMovedTimer = new QTimer( this );
+ connect( m_cursorMovedTimer, SIGNAL(timeout()), this, SLOT(slotCursorPositionChanged()) );
+
+
+// m_deleteParserStoreTimer = new QTimer( this );
+ m_saveMemoryTimer = new QTimer( this );
+ m_buildSafeFileSetTimer = new QTimer( this );
+// m_functionHintTimer = new QTimer( this );
+ connect( m_buildSafeFileSetTimer, SIGNAL(timeout()), this, SLOT(buildSafeFileSet()) );
+ connect( m_saveMemoryTimer, SIGNAL(timeout()), this, SLOT(slotSaveMemory()) );
+// connect( m_deleteParserStoreTimer, SIGNAL(timeout()), this, SLOT(slotDeleteParserStore()) );
+ resetParserStoreTimer();
+ m_saveMemoryTimer->start( 240000, false ); //Free some memory every 4 minutes
+ // connect( m_functionHintTimer, SIGNAL(timeout()), this, SLOT(slotFunctionHint()) );
+
+ setXMLFile( "kdevcppsupport.rc" );
+
+ m_catalogList.setAutoDelete( true );
+
+ connect( core(), SIGNAL( projectOpened() ), this, SLOT( projectOpened() ) );
+ connect( core(), SIGNAL( projectClosed() ), this, SLOT( projectClosed() ) );
+ connect( core(), SIGNAL( languageChanged() ), this, SLOT( projectOpened() ) );
+ connect( partController(), SIGNAL( savedFile( const KURL& ) ),
+ this, SLOT( savedFile( const KURL& ) ) );
+ connect( core(), SIGNAL( contextMenu( QPopupMenu *, const Context * ) ),
+ this, SLOT( contextMenu( QPopupMenu *, const Context * ) ) );
+ connect( partController(), SIGNAL( activePartChanged( KParts::Part* ) ),
+ this, SLOT( activePartChanged( KParts::Part* ) ) );
+ connect( partController(), SIGNAL( partRemoved( KParts::Part* ) ),
+ this, SLOT( partRemoved( KParts::Part* ) ) );
+
+ connect( core(), SIGNAL( configWidget( KDialogBase* ) ),
+ this, SLOT( configWidget( KDialogBase* ) ) );
+
+ m_switchHeaderSourceAction = new KAction( i18n( "Switch Header/Implementation" ), SHIFT + Key_F12,
+ this, SLOT( slotSwitchHeader() ),
+ actionCollection(), "edit_switchheader" );
+ m_switchHeaderSourceAction->setToolTip( i18n( "Switch between header and implementation files" ) );
+ m_switchHeaderSourceAction->setWhatsThis( i18n( "<b>Switch Header/Implementation</b><p>"
+ "If you are currently looking at a header file, this "
+ "brings you to the corresponding implementation file. "
+ "If you are looking at an implementation file (.cpp etc.), "
+ "this brings you to the corresponding header file." ) );
+ m_switchHeaderSourceAction->setEnabled( false );
+
+ KAction *action;
+
+ action = new KAction( i18n( "Complete Text" ), CTRL + Key_Space,
+ this, SLOT( slotCompleteText() ),
+ actionCollection(), "edit_complete_text" );
+ action->setToolTip( i18n( "Complete current expression" ) );
+ action->setWhatsThis( i18n( "<b>Complete Text</p><p>Completes current expression using "
+ "memory class store for the current project and persistent class stores "
+ "for external libraries." ) );
+ action->setEnabled( false );
+
+ m_createGetterSetterAction = new KAction( i18n( "Create Accessor Methods" ), 0,
+ this, SLOT( slotCreateAccessMethods() ), actionCollection(),
+ "edit_create_getter_setter" );
+
+ action = new KAction( i18n( "Make Member" ), 0, Key_F2,
+ this, SLOT( slotMakeMember() ),
+ actionCollection(), "edit_make_member" );
+ action->setToolTip( i18n( "Make member" ) );
+ action->setWhatsThis( i18n( "<b>Make member</b><p>Creates a class member function in implementation file "
+ "based on the member declaration at the current line." ) );
+ action->plug( &m_DummyActionWidget );
+
+ action = new KAction( i18n( "Navigation Menu" ), 0, CTRL + ALT + Key_Space,
+ this, SLOT( slotNavigate() ),
+ actionCollection(), "edit_navigate" );
+ action->setToolTip( i18n( "Show the navigation-menu" ) );
+ action->setWhatsThis( i18n( "<b>Navigate</b><p>Shows a navigation-menu based on the type-evaluation of the item under the cursor." ) );
+ action->plug( &m_DummyActionWidget );
+
+
+ action = new KAction( i18n( "New Class..." ), "classnew", 0,
+ this, SLOT( slotNewClass() ),
+ actionCollection(), "project_newclass" );
+ action->setToolTip( i18n( "Generate a new class" ) );
+ action->setWhatsThis( i18n( "<b>New Class</b><p>Calls the <b>New Class</b> wizard." ) );
+
+ m_pCompletion = 0;
+
+ withcpp = false;
+ if ( args.count() == 1 && args[ 0 ] == "Cpp" )
+ withcpp = true;
+
+ // daniel
+ connect( core( ), SIGNAL( projectConfigWidget( KDialogBase* ) ), this,
+ SLOT( projectConfigWidget( KDialogBase* ) ) );
+
+ new KDevCppSupportIface( this );
+ //(void) dcopClient();
+
+ m_lockupTester = new UIBlockTester( 100 );
+}
+
+
+CppSupportPart::~CppSupportPart()
+{
+ delete m_lockupTester;
+
+ if ( !m_projectClosed )
+ projectClosed();
+
+ delete( m_driver );
+ m_driver = 0;
+
+ if ( m_backgroundParser )
+ {
+ m_backgroundParser->close();
+ // m_backgroundParser->wait();
+ delete m_backgroundParser;
+ m_backgroundParser = 0;
+ }
+
+ codeRepository() ->setMainCatalog( 0 );
+
+ QPtrListIterator<Catalog> it( m_catalogList );
+ while ( Catalog * catalog = it.current() )
+ {
+ ++it;
+ codeRepository() ->unregisterCatalog( catalog );
+ }
+
+
+ delete m_backgroundParserConfig;
+ m_backgroundParserConfig = 0;
+
+ delete m_pCompletion;
+ m_pCompletion = 0;
+
+/* mainWindow()->removeView( m_problemReporter );
+ delete m_problemReporter;
+ m_problemReporter = 0;
+*/
+ delete _jd;
+ _jd = 0;
+
+ kdDebug( 9007 ) << k_funcinfo << endl;
+}
+
+
+void CppSupportPart::customEvent( QCustomEvent* ev )
+{
+ kdDebug( 9007 ) << "CppSupportPart::customEvent(" << ev->type() << ")" << endl;
+
+ QTime t;
+ t.start();
+ bool fromDisk = false;
+
+ if ( ev->type() == int( Event_FileParsed ) )
+ {
+ resetParserStoreTimer();
+
+ FileParsedEvent * event = ( FileParsedEvent* ) ev;
+ fromDisk = event->fromDisk();
+ QString fileName = event->fileName();
+ bool hasErrors = false;
+ if ( m_problemReporter )
+ {
+ m_problemReporter->removeAllProblems( fileName );
+
+ QValueList<Problem> problems = event->problems();
+ QValueList<Problem>::ConstIterator it = problems.begin();
+ while ( it != problems.end() )
+ {
+ const Problem & p = *it++;
+ if ( p.level() == Problem::Level_Error )
+ hasErrors = true;
+
+ m_problemReporter->reportProblem( fileName, p );
+ }
+ }
+ ParsedFilePointer p = m_backgroundParser->translationUnit( fileName );
+ if( p && !p->includedFrom().isEmpty() ) {
+ kdDebug( 9007 ) << "customEvent() parsed included file \"" << fileName << "\" included from \"" << p->includedFrom() << "\"" << endl;
+ } else {
+ kdDebug( 9007 ) << "customEvent() parsed file \"" << fileName << "\"" << endl;
+ }
+
+ if( p && !p->includedFrom().isEmpty() ) {
+ if( !project()->isProjectFile( fileName ) ) {
+ //The file was parsed to resolve a dependency, and is not a project file
+ addToRepository( p );
+ } else {
+ //It is a project-file that was parsed for whatever reason to resolve a dependency(currently it isn't handled this way)
+ }
+ } else if( !project()->isProjectFile( fileName ) || !m_parseEmitWaiting.reject( fileName ) ) {
+ ParseEmitWaiting::Processed p = m_parseEmitWaiting.processFile( fileName, ( !m_hadErrors && hasErrors && !fromDisk && m_isTyping && fileName == m_activeFileName ) ? ParseEmitWaiting::HadErrors : ParseEmitWaiting::None );
+ parseEmit( p );
+
+ //Increase status-bar
+ if( p.hasFlag( ParseEmitWaiting::Silent ) && _jd ) {
+ _jd->backgroundState ++;
+ _jd->lastParse = QTime::currentTime();
+ }
+
+ } else {
+ ParseEmitWaiting::Processed p = m_fileParsedEmitWaiting.processFile( fileName );
+ if( !p.hasFlag( ParseEmitWaiting::Silent ) )
+ emitFileParsed( p );
+
+ //Increase status-bar
+ if( p.hasFlag( ParseEmitWaiting::Silent ) && _jd ) {
+ _jd->backgroundState ++;
+ _jd->lastParse = QTime::currentTime();
+ }
+ }
+ }
+}
+
+
+void CppSupportPart::projectConfigWidget( KDialogBase* dlg )
+{
+ QVBox * vbox = 0;
+
+ vbox = dlg->addVBoxPage( i18n( "C++ Support" ), i18n( "C++ Support" ),
+ BarIcon( info() ->icon(), KIcon::SizeMedium ) );
+ CCConfigWidget* w = new CCConfigWidget( this, vbox );
+ connect( dlg, SIGNAL( okClicked( ) ), w, SLOT( accept( ) ) );
+}
+
+void CppSupportPart::configWidget( KDialogBase *dlg )
+{
+ QVBox * vbox = dlg->addVBoxPage( i18n( "C++ Class Generator" ), i18n( "C++ Class Generator" ),
+ BarIcon( info() ->icon(), KIcon::SizeMedium ) );
+ ClassGeneratorConfig *w = new ClassGeneratorConfig( vbox, "classgenerator config widget" );
+ connect( dlg, SIGNAL( okClicked() ), w, SLOT( storeConfig() ) );
+
+ vbox = dlg->addVBoxPage(i18n("C++ Parsing"), i18n("C++ Parsing"),
+ BarIcon( "source_cpp", KIcon::SizeMedium) );
+ ConfigureProblemReporter* ww = new ConfigureProblemReporter( vbox );
+ ww->setPart( this );
+ connect(dlg, SIGNAL(okClicked()), ww, SLOT(accept()));
+}
+
+void CppSupportPart::activePartChanged( KParts::Part *part )
+{
+ kdDebug( 9032 ) << "CppSupportPart::activePartChanged()" << endl;
+
+ bool enabled = false;
+
+// m_functionHintTimer->stop();
+
+ if ( m_activeView )
+ {
+ disconnect( m_activeView, SIGNAL( cursorPositionChanged() ), this, 0 );
+ }
+ if ( m_activeDocument )
+ {
+ disconnect( m_activeDocument, SIGNAL(textChanged()), this, 0 );
+ }
+
+ m_isTyping = false;
+ m_hadErrors = true;
+ m_activeDocument = dynamic_cast<KTextEditor::Document*>( part );
+ m_activeView = part ? dynamic_cast<KTextEditor::View*>( part->widget() ) : 0;
+ m_activeEditor = dynamic_cast<KTextEditor::EditInterface*>( part );
+ m_activeSelection = dynamic_cast<KTextEditor::SelectionInterface*>( part );
+ m_activeViewCursor = dynamic_cast<KTextEditor::ViewCursorInterface*>( m_activeView );
+
+ m_activeFileName = QString::null;
+
+ if ( m_activeDocument )
+ {
+ m_activeFileName = URLUtil::canonicalPath( m_activeDocument->url().path() );
+ QFileInfo fi( m_activeFileName );
+ QString ext = fi.extension();
+ if ( isSource( m_activeFileName ) || isHeader( m_activeFileName ) )
+ enabled = true;
+ }
+
+ actionCollection() ->action( "edit_switchheader" ) ->setEnabled( enabled );
+ actionCollection() ->action( "edit_complete_text" ) ->setEnabled( enabled );
+ actionCollection() ->action( "edit_make_member" ) ->setEnabled( enabled );
+
+ if ( !part || !part->widget() )
+ return ;
+
+ if ( m_activeDocument )
+ {
+ connect( m_activeDocument, SIGNAL(textChanged()), this, SLOT(slotTextChanged()) );
+ m_textChangedTimer->start( 250, true ); // kick the parse timer, we might want to parse the current file
+ }
+
+ if ( m_activeViewCursor )
+ {
+ connect( m_activeView, SIGNAL( cursorPositionChanged() ), this, SLOT(slotCursorMoved()) );
+// this, SLOT( slotCursorPositionChanged() ) );
+ }
+
+
+#if 0
+ KTextEditor::TextHintInterface* textHintIface = dynamic_cast<KTextEditor::TextHintInterface*>( m_activeView );
+ if ( !textHintIface )
+ return ;
+
+ connect( view, SIGNAL( needTextHint( int, int, QString& ) ),
+ this, SLOT( slotNeedTextHint( int, int, QString& ) ) );
+
+ textHintIface->enableTextHints( 1000 );
+#endif
+}
+
+
+void CppSupportPart::setTyping( bool typing ) {
+ m_isTyping = typing;
+ if( m_problemReporter) {
+ m_hadErrors &= m_problemReporter->hasErrors(m_activeFileName);///m_hadErrors generally stores whether there was an error-free state of the file.
+ }
+}
+
+
+void CppSupportPart::projectOpened( )
+{
+ kdDebug( 9007 ) << "projectOpened( )" << endl;
+
+ m_backgroundParser = new BackgroundParser( this, &m_eventConsumed );
+ m_backgroundParser->start( QThread::IdlePriority );
+
+ // setup the driver
+ QString conf_file_name = specialHeaderName();
+ if ( QFile::exists( conf_file_name ) )
+ m_driver->parseFile( conf_file_name, true, true, true );
+
+ m_projectDirectory = URLUtil::canonicalPath( project() ->projectDirectory() );
+ m_projectFileList = project() ->allFiles();
+
+ setupCatalog();
+
+ embedProblemReporter();
+
+ connect( core(), SIGNAL( configWidget( KDialogBase* ) ),
+ m_problemReporter, SLOT( configWidget( KDialogBase* ) ) );
+
+ connect( project( ), SIGNAL( addedFilesToProject( const QStringList & ) ),
+ this, SLOT( addedFilesToProject( const QStringList & ) ) );
+ connect( project( ), SIGNAL( removedFilesFromProject( const QStringList & ) ),
+ this, SLOT( removedFilesFromProject( const QStringList & ) ) );
+ connect( project( ), SIGNAL( changedFilesInProject( const QStringList & ) ),
+ this, SLOT( changedFilesInProject( const QStringList & ) ) );
+ connect( project(), SIGNAL( projectCompiled() ),
+ this, SLOT( slotProjectCompiled() ) );
+
+ m_timestamp.clear();
+ m_parseEmitWaiting.clear();
+ m_fileParsedEmitWaiting.clear();
+
+ m_pCompletion = new CppCodeCompletion( this );
+ m_projectClosed = false;
+
+ m_buildSafeFileSetTimer->start( 500, true );
+ updateParserConfiguration(); //Necessary to respect custom include-paths and such
+
+ QTimer::singleShot( 500, this, SLOT( initialParse( ) ) );
+}
+
+void CppSupportPart::embedProblemReporter( bool force )
+{
+ if ( force || m_backgroundParserConfig->useProblemReporter() )
+ {
+ m_problemReporter = new ProblemReporter( this, 0, "problemReporterWidget" );
+ m_problemReporter->setIcon( SmallIcon( "info" ) );
+ m_problemReporter->setCaption( i18n( "Problem Reporter" ) );
+ mainWindow( ) ->embedOutputView( m_problemReporter, i18n( "Problems" ), i18n( "Problem reporter" ) );
+ }
+}
+
+void CppSupportPart::removeProblemReporter()
+{
+ mainWindow()->removeView( m_problemReporter );
+ delete m_problemReporter;
+ m_problemReporter = 0;
+}
+
+
+void CppSupportPart::projectClosed( )
+{
+ kdDebug( 9007 ) << "projectClosed( )" << endl;
+
+ m_projectClosing = true;
+
+ QStringList enabledPCSs;
+ QValueList<Catalog*> catalogs = codeRepository() ->registeredCatalogs();
+ for ( QValueList<Catalog*>::Iterator it = catalogs.begin(); it != catalogs.end(); ++it )
+ {
+ Catalog* c = *it;
+ if ( c->enabled() )
+ enabledPCSs.push_back( QFileInfo( c->dbName() ).baseName(true) );
+ }
+ DomUtil::writeListEntry( *project() ->projectDom(), "kdevcppsupport/references", "pcs", enabledPCSs );
+
+ for ( QMap<KInterfaceDesigner::DesignerType, KDevDesignerIntegration*>::const_iterator it = m_designers.begin();
+ it != m_designers.end(); ++it )
+ {
+ kdDebug( 9007 ) << "calling save settings fro designer integration" << endl;
+ it.data() ->saveSettings( *project() ->projectDom(), "kdevcppsupport/designerintegration" );
+ }
+
+ saveProjectSourceInfo();
+
+ m_pCompletionConfig->store();
+
+ delete _jd;
+ _jd = 0;
+
+ removeProblemReporter();
+
+ delete m_pCompletion;
+ m_parseEmitWaiting.clear();
+ m_fileParsedEmitWaiting.clear();
+ m_pCompletion = 0;
+ m_projectClosed = true;
+ m_projectClosing = false;
+}
+
+
+void CppSupportPart::slotNavigate() {
+ if( codeCompletion() && m_activeView && m_activeViewCursor ) {
+ unsigned int curLine = 0, curCol = 0;
+ m_activeViewCursor->cursorPositionReal( &curLine, &curCol );
+
+ if( m_navigationMenu ) delete (KPopupMenu*)m_navigationMenu;
+
+ m_navigationMenu = new KPopupMenu( m_activeView );
+
+ codeCompletion()->contextEvaluationMenus( m_navigationMenu, 0, curLine, curCol );
+
+ m_navigationMenu->move( m_activeView->mapToGlobal( m_activeViewCursor->cursorCoordinates() ) );
+ if ( m_navigationMenu->count() > 0 )
+ {
+ m_navigationMenu->show();
+ }
+ }
+}
+
+
+void CppSupportPart::contextMenu( QPopupMenu *popup, const Context *context )
+{
+ m_activeClass = 0;
+ m_activeFunction = 0;
+ m_activeVariable = 0;
+ m_curAttribute = 0;
+ m_curClass = 0;
+
+ if ( context->hasType( Context::EditorContext ) )
+ {
+ int id;
+
+ m_switchHeaderSourceAction->plug( popup );
+
+ // CodeModelItemContext
+ if ( context->type() == Context::EditorContext )
+ {
+ m_curClass = currentClass();
+ if ( m_curClass != 0 )
+ {
+ m_curAttribute = currentAttribute( m_curClass );
+ if ( m_curAttribute != 0 )
+ m_createGetterSetterAction->plug( popup );
+ }
+ }
+
+ QString text;
+ int atline, atcol;
+ MakeMemberHelper( text, atline, atcol );
+ if ( !text.isEmpty() )
+ {
+ id = popup->insertItem( i18n( "Make Member" ), this, SLOT( slotMakeMember() ) );
+ popup->setWhatsThis( id, i18n( "<b>Make member</b><p>Creates a class member function in implementation file "
+ "based on the member declaration at the current line." ) );
+ }
+
+ kdDebug( 9007 ) << "======> code model has the file: " << m_activeFileName << " = " << codeModel() ->hasFile( m_activeFileName ) << endl;
+
+ bool showContextMenuExplosion = false;
+ bool showContextTypeEvaluation = false;
+ KConfig *config = CppSupportFactory::instance() ->config();
+ if ( config )
+ {
+ config->setGroup( "General" );
+ showContextMenuExplosion = config->readBoolEntry( "ShowContextMenuExplosion", false );
+ config->setGroup( "General" );
+ showContextTypeEvaluation = config->readBoolEntry( "ShowContextTypeEvaluation", true );
+ }
+
+
+ if( codeModel() ->hasFile( m_activeFileName ) ) {
+
+ if( showContextTypeEvaluation && m_activeViewCursor != 0 ) {
+ if( codeCompletion() ) {
+ unsigned int curLine = 0, curCol = 0;
+ m_activeViewCursor->cursorPositionReal( &curLine, &curCol );
+
+ codeCompletion()->contextEvaluationMenus( popup, context, curLine, curCol );
+ }
+ }
+
+
+ if ( showContextMenuExplosion )
+ {
+ //kdDebug( 9007 ) << "CppSupportPart::contextMenu 1" << endl;
+ QString candidate;
+ if ( isSource( m_activeFileName ) )
+ candidate = sourceOrHeaderCandidate();
+ else
+ candidate = m_activeFileName;
+
+ unsigned int curLine = 0, curCol = 0;
+ if ( m_activeViewCursor != 0 )
+ m_activeViewCursor->cursorPositionReal( &curLine, &curCol );
+
+ //kdDebug( 9007 ) << "CppSupportPart::contextMenu 2: candidate: " << candidate << endl;
+
+ if ( !candidate.isEmpty() && codeModel() ->hasFile( candidate ) )
+ {
+ QPopupMenu * m2 = new QPopupMenu( popup );
+ id = popup->insertItem( i18n( "Go to Declaration" ), m2 );
+ popup->setWhatsThis( id, i18n( "<b>Go to declaration</b><p>Provides a menu to select available function declarations "
+ "in the current file and in the corresponding header (if the current file is an implementation) or source (if the current file is a header) file." ) );
+
+ FileDom file2 = codeModel() ->fileByName( candidate );
+ //kdDebug( 9007 ) << "CppSupportPart::contextMenu 3: " << file2->name() << endl;
+
+ FunctionList functionList2 = CodeModelUtils::allFunctions( file2 );
+ for ( FunctionList::ConstIterator it = functionList2.begin(); it != functionList2.end(); ++it )
+ {
+ QString text = ( *it ) ->scope().join( "::" );
+ //kdDebug( 9007 ) << "CppSupportPart::contextMenu 3 text: " << text << endl;
+ if ( !text.isEmpty() )
+ {
+ text += "::";
+ }
+ text += formatModelItem( *it, true );
+ text = text.replace( QString::fromLatin1( "&" ), QString::fromLatin1( "&&" ) );
+ int id = m2->insertItem( text, this, SLOT( gotoDeclarationLine( int ) ) );
+ int line, column;
+ ( *it ) ->getStartPosition( &line, &column );
+ m2->setItemParameter( id, line );
+ }
+
+ if ( m2->count() == 0 )
+ {
+ popup->removeItem( id );
+ }
+ //kdDebug( 9007 ) << "CppSupportPart::contextMenu 4" << endl;
+ }
+
+ QString candidate1;
+ if ( isHeader( m_activeFileName ) )
+ {
+ candidate1 = sourceOrHeaderCandidate();
+ }
+ else
+ {
+ candidate1 = m_activeFileName;
+ }
+ //kdDebug( 9007 ) << "CppSupportPart::go to definition in " << candidate1 << endl;
+ if ( codeModel() ->hasFile( candidate1 ) )
+ {
+ QPopupMenu * m = new QPopupMenu( popup );
+ id = popup->insertItem( i18n( "Go to Definition" ), m );
+ popup->setWhatsThis( id, i18n( "<b>Go to definition</b><p>Provides a menu to select available function definitions "
+ "in the current file and in the corresponding header (if the current file is an implementation) or source (if the current file is a header) file." ) );
+
+ const FileDom file = codeModel() ->fileByName( candidate1 );
+ const FunctionDefinitionList functionDefinitionList = CodeModelUtils::allFunctionDefinitionsDetailed( file ).functionList;
+ for ( FunctionDefinitionList::ConstIterator it = functionDefinitionList.begin(); it != functionDefinitionList.end(); ++it )
+ {
+ QString text = ( *it ) ->scope().join( "::" );
+ if ( !text.isEmpty() )
+ {
+ text += "::";
+ }
+ text += formatModelItem( *it, true );
+ text = text.replace( QString::fromLatin1( "&" ), QString::fromLatin1( "&&" ) );
+ int id = m->insertItem( text, this, SLOT( gotoLine( int ) ) );
+ int line, column;
+ ( *it ) ->getStartPosition( &line, &column );
+ m->setItemParameter( id, line );
+ }
+ if ( m->count() == 0 )
+ {
+ popup->removeItem( id );
+ }
+
+ }
+ }
+ }
+
+ const EditorContext *econtext = static_cast<const EditorContext*>( context );
+ QString str = econtext->currentLine();
+ if ( str.isEmpty() )
+ return ;
+ }
+ else if ( context->hasType( Context::CodeModelItemContext ) )
+ {
+ const CodeModelItemContext * mcontext = static_cast<const CodeModelItemContext*>( context );
+
+ if ( mcontext->item() ->isClass() )
+ {
+ m_activeClass = ( ClassModel* ) mcontext->item();
+ int id = popup->insertItem( i18n( "Extract Interface..." ), this, SLOT( slotExtractInterface() ) );
+ popup->setWhatsThis( id, i18n( "<b>Extract interface</b><p>Extracts interface from the selected class and creates a new class with this interface. "
+ "No implementation code is extracted and no implementation code is created." ) );
+ }
+ else if ( mcontext->item() ->isFunction() )
+ {
+ m_activeFunction = ( FunctionModel* ) mcontext->item();
+ }
+ }
+ else if ( context->hasType( Context::FileContext ) )
+ {
+ const FileContext * fc = static_cast<const FileContext*>( context );
+ //this is a .ui file and only selection contains only one such file
+ KURL url = fc->urls().first();
+ kdDebug( 9007 ) << "file context with " << url.path() << endl;
+ if ( url.fileName().endsWith( ".ui" ) )
+ {
+ m_contextFileName = url.path();
+ int id = popup->insertItem( i18n( "Create or Select Implementation..." ), this, SLOT( slotCreateSubclass() ) );
+ popup->setWhatsThis( id, i18n( "<b>Create or select implementation</b><p>Creates or selects a subclass of selected form for use with integrated KDevDesigner." ) );
+ }
+ }
+}
+
+
+QStringList makeListUnique( const QStringList& rhs ) {
+ QMap<QString, bool> map;
+ QStringList ret;
+ for( QStringList::const_iterator it = rhs.begin(); it != rhs.end(); ++it ) {
+ if( map.find( *it ) == map.end() ) {
+ ret << *it;
+ map.insert( *it, true );
+ }
+ }
+ return ret;
+}
+
+// Makes sure that header files come first
+QStringList CppSupportPart::reorder( const QStringList &list )
+{
+ QStringList headers, others;
+
+ QStringList headerExtensions = QStringList::split( ",", "h,H,hh,hxx,hpp,tlh" );
+
+ QString projectPath = project()->projectDirectory();
+
+ QStringList::ConstIterator it;
+ for ( it = list.begin(); it != list.end(); ++it )
+ {
+ QString filePath = *it;
+ // brilliant stuff.. this method is apparently called both with
+ // relative and absolute paths..
+ if ( !filePath.startsWith("/") )
+ {
+ filePath = projectPath + "/" + filePath;
+ }
+ if( !isValidSource( filePath ) ) continue;
+ if ( headerExtensions.contains( QFileInfo( filePath ).extension() ) )
+ headers << ( filePath );
+ else
+ others << ( filePath );
+ }
+
+ return makeListUnique( headers + others );
+}
+
+void CppSupportPart::addedFilesToProject( const QStringList &fileList )
+{
+ m_projectFileList = project() ->allFiles();
+ QStringList files = reorder( fileList );
+
+ for ( QStringList::ConstIterator it = files.begin(); it != files.end(); ++it )
+ {
+ QString path = *it;
+ if (!path.startsWith("/"))
+ path = URLUtil::canonicalPath( m_projectDirectory + "/" + ( *it ) );
+
+ maybeParse( path );
+ //emit addedSourceInfo( path );
+ }
+ m_buildSafeFileSetTimer->start( 500, true );
+}
+
+void CppSupportPart::removedFilesFromProject( const QStringList &fileList )
+{
+ m_projectFileList = project() ->allFiles();
+ for ( QStringList::ConstIterator it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString path = URLUtil::canonicalPath( m_projectDirectory + "/" + *it );
+ kdDebug( 9007 ) << "=====================> remove file: " << path << endl;
+
+ removeWithReferences( path );
+ m_backgroundParser->removeFile( path );
+ }
+ m_buildSafeFileSetTimer->start( 500, true );
+}
+
+void CppSupportPart::changedFilesInProject( const QStringList & fileList )
+{
+ QStringList files = reorder( fileList );
+
+ for ( QStringList::ConstIterator it = files.begin(); it != files.end(); ++it )
+ {
+ QString path = URLUtil::canonicalPath( m_projectDirectory + "/" + *it );
+
+ maybeParse( path );
+ //emit addedSourceInfo( path );
+ }
+}
+
+void CppSupportPart::savedFile( const KURL &file )
+{
+ if( file.path() == m_activeFileName ) {
+ m_isTyping = false;
+ m_hadErrors = false;
+ maybeParse( file.path() );
+ }
+
+ Q_UNUSED( file.path() );
+
+#if 0 // not needed anymore
+
+ kdDebug( 9007 ) << "savedFile(): " << fileName.mid ( m_projectDirectory.length() + 1 ) << endl;
+
+ if ( m_projectFileList.contains( fileName.mid ( m_projectDirectory.length() + 1 ) ) )
+ {
+ maybeParse( fileName );
+ emit addedSourceInfo( fileName );
+ }
+#endif
+}
+
+QString CppSupportPart::findSourceFile()
+{
+ // get the path of the currently active document
+ QFileInfo fi( m_activeFileName );
+ QString path = fi.filePath();
+ QString ext = fi.extension();
+ // extract the base path (full path without '.' and extension)
+ QString base = path.left( path.length() - ext.length() - 1 );
+ QStringList candidates;
+ if ( QStringList::split( ',', "h,H,hh,hxx,hpp,tlh" ).contains( ext ) )
+ {
+ candidates << ( base + ".c" );
+ candidates << ( base + ".cc" );
+ candidates << ( base + ".cpp" );
+ candidates << ( base + ".c++" );
+ candidates << ( base + ".cxx" );
+ candidates << ( base + ".C" );
+ candidates << ( base + ".m" );
+ candidates << ( base + ".mm" );
+ candidates << ( base + ".M" );
+ candidates << ( base + ".inl" );
+ candidates << ( base + "_impl.h" );
+ }
+
+ QStringList::ConstIterator it;
+ for ( it = candidates.begin(); it != candidates.end(); ++it )
+ {
+ kdDebug( 9007 ) << "Trying " << ( *it ) << endl;
+ if ( QFileInfo( *it ).exists() )
+ {
+ return * it;
+ }
+ }
+ return m_activeFileName;
+}
+
+QString CppSupportPart::sourceOrHeaderCandidate( const KURL &url )
+{
+ QString urlPath;
+ if ( url.isEmpty() )
+ {
+ KTextEditor::Document * doc =
+ dynamic_cast<KTextEditor::Document*>( partController() ->activePart() );
+ if ( !doc )
+ return QString::null;
+ urlPath = doc->url().path();
+ }
+ else
+ {
+ urlPath = url.path();
+ }
+ // get the path of the currently active document
+ QFileInfo fi( urlPath );
+ QString path = fi.filePath();
+ // extract the exension
+ QString ext = fi.extension();
+ if ( ext.isEmpty() )
+ return QString::null;
+ // extract the base path (full path without '.' and extension)
+ QString base = path.left( path.length() - ext.length() - 1 );
+ //kdDebug( 9007 ) << "base: " << base << ", ext: " << ext << endl;
+ // just the filename without the extension
+ QString fileNameWoExt = fi.fileName();
+ if ( !ext.isEmpty() )
+ fileNameWoExt.replace( "." + ext, "" );
+ QString possibleExts;
+ // depending on the current extension assemble a list of
+ // candidate files to look for
+ QStringList candidates;
+ // special case for template classes created by the new class dialog
+ if ( path.endsWith( "_impl.h" ) )
+ {
+ QString headerpath = path;
+ headerpath.replace( "_impl.h", ".h" );
+ candidates << headerpath;
+ fileNameWoExt.replace( "_impl", "" );
+ possibleExts = "h";
+ }
+ // if file is a header file search for implementation file
+ else if ( QStringList::split( ',', "h,H,hh,hxx,hpp,tlh" ).contains( ext ) )
+ {
+ candidates << ( base + ".c" );
+ candidates << ( base + ".cc" );
+ candidates << ( base + ".cpp" );
+ candidates << ( base + ".c++" );
+ candidates << ( base + ".cxx" );
+ candidates << ( base + ".C" );
+ candidates << ( base + ".m" );
+ candidates << ( base + ".mm" );
+ candidates << ( base + ".M" );
+ candidates << ( base + ".inl" );
+ candidates << ( base + "_impl.h" );
+ possibleExts = "c,cc,cpp,c++,cxx,C,m,mm,M,inl,_impl.h";
+ }
+ // if file is an implementation file, search for header file
+ else if ( QStringList::split( ',', "c,cc,cpp,c++,cxx,C,m,mm,M,inl" ).contains( ext ) )
+ {
+ candidates << ( base + ".h" );
+ candidates << ( base + ".H" );
+ candidates << ( base + ".hh" );
+ candidates << ( base + ".hxx" );
+ candidates << ( base + ".hpp" );
+ candidates << ( base + ".tlh" );
+ possibleExts = "h,H,hh,hxx,hpp,tlh";
+ }
+ // search for files from the assembled candidate lists, return the first
+ // candidate file that actually exists or QString::null if nothing is found.
+ QStringList::ConstIterator it;
+ for ( it = candidates.begin(); it != candidates.end(); ++it )
+ {
+ //kdDebug( 9007 ) << "Trying " << ( *it ) << endl;
+ if ( QFileInfo( *it ).exists() )
+ {
+ kdDebug( 9007 ) << "using: " << *it << endl;
+ return * it;
+ }
+ }
+ //kdDebug( 9007 ) << "Now searching in project files." << endl;
+ // Our last resort: search the project file list for matching files
+ QStringList::iterator fileIt;
+ QFileInfo candidateFileWoExt;
+ QString candidateFileWoExtString;
+ QStringList possibleExtsList = QStringList::split( ',', possibleExts );
+ for ( fileIt = m_projectFileList.begin(); fileIt != m_projectFileList.end(); ++fileIt )
+ {
+ candidateFileWoExt.setFile(*fileIt);
+ //kdDebug( 9007 ) << "candidate file: " << *fileIt << endl;
+ if( !candidateFileWoExt.extension().isEmpty() )
+ candidateFileWoExtString = candidateFileWoExt.fileName().replace( "." + candidateFileWoExt.extension(), "" );
+ if ( candidateFileWoExtString == fileNameWoExt )
+ {
+ if ( possibleExtsList.contains( candidateFileWoExt.extension() ) || candidateFileWoExt.extension().isEmpty() )
+ {
+ //kdDebug( 9007 ) << "checking if " << *fileIt << " exists" << endl;
+ if ( QFileInfo( *fileIt ).exists() )
+ kdDebug( 9007 ) << "using: " << *fileIt << endl;
+ return *fileIt;
+ }
+ }
+ }
+ return QString::null;
+}
+
+void CppSupportPart::slotSaveMemory() {
+ if( m_backgroundParser ) {
+ ///This is done so the caches are completely empty after kdevelop was idle for some time(else it would be waste of memory). The background-parsers internal lexer-cache-manager just cares about keeping the count of cached files under a specific count, but doesn't decrease that count when kdevelop is idle.
+ m_backgroundParser->lock();
+ m_backgroundParser->saveMemory();
+ m_backgroundParser->unlock();
+ }
+}
+
+void CppSupportPart::slotSwitchHeader( bool scrollOnly )
+{
+ bool attemptMatch = true;
+ KConfig *config = CppSupportFactory::instance() ->config();
+ if ( config )
+ {
+ config->setGroup( "General" );
+ attemptMatch = config->readBoolEntry( "SwitchShouldMatch", true );
+ }
+
+ // ok, both files exist. Do the codemodel have them?
+ if ( codeModel() ->hasFile( m_activeFileName ) && m_activeViewCursor && attemptMatch )
+ {
+ unsigned int currentline, column;
+ m_activeViewCursor->cursorPositionReal( &currentline, &column );
+
+ if ( switchHeaderImpl( m_activeFileName, currentline, column, scrollOnly ) )
+ return;
+ }
+
+ // last chance
+ KURL url;
+ url.setPath( sourceOrHeaderCandidate() );
+
+ if ( scrollOnly )
+ return;
+ else if ( !splitHeaderSourceConfig()->splitEnabled() )
+ partController() ->editDocument( url );
+ else
+ partController() ->splitCurrentDocument( url );
+}
+
+bool CppSupportPart::switchHeaderImpl( const QString& file, int line, int col, bool scrollOnly )
+{
+ bool handled = false;
+
+ FunctionDom d;
+ FileDom fd = codeModel() ->fileByName( file );
+ if ( fd ) {
+ CodeModelUtils::CodeModelHelper h( codeModel(), fd );
+ d = h.functionAt( line, col );
+ }
+ if ( d ) {
+ if( d->isFunctionDefinition() ) {
+ FunctionDom decl = findFunction( d );
+ if ( decl ) {
+ if ( (void*)&decl != (void*)d.data() && ( !scrollOnly || decl->fileName() != file ) ) {
+ jumpToCodeModelItem( model_cast<ItemDom>(decl), scrollOnly );
+ handled = true;
+ }
+ }
+ } else {
+ FunctionDom def = findFunctionDefinition( d );
+ if ( def ) {
+ if ( def != d && ( !scrollOnly || def->fileName() != file ) ) {
+ jumpToCodeModelItem( model_cast<ItemDom>(def), scrollOnly );
+ handled = true;
+ }
+ }
+ }
+ }
+
+ return handled;
+}
+
+FunctionDom CppSupportPart::findFunction( const FunctionDom& def )
+{
+ // We have a definition so we're looking for a declaration. The declaration will either be the child of a namespace node (non class members)
+ // or the child of a class node (class member). Search recursively until we find a declaration that matches.
+ FunctionDom bestMatch;
+ FunctionDom decl = findFunctionInNamespace( codeModel()->globalNamespace(), def, codeModel()->globalNamespace()->namespaceImports(),
+ sourceOrHeaderCandidate( def->fileName() ), 0, bestMatch );
+ return decl ? decl : bestMatch;
+}
+
+FunctionDom CppSupportPart::findFunctionInNamespace( const NamespaceDom& ns, const FunctionDom& def, const std::set<NamespaceImportModel>& nsImports,
+ const QString& candidateFile, int scopeIndex, FunctionDom& bestMatch )
+{
+ FunctionDom d;
+ QStringList scope = def->scope();
+ if ( !(scopeIndex >= (signed) scope.size()) ) {
+ NamespaceDom ns_next = ns->namespaceByName( scope[ scopeIndex ] );
+ if ( ns_next ) {
+ d = findFunctionInNamespace( ns_next, def, ns_next->namespaceImports(), candidateFile, scopeIndex+1, bestMatch );
+ }
+ if ( !d ) {
+ for ( std::set<NamespaceImportModel>::const_iterator it_ns = nsImports.begin(); it_ns != nsImports.end(); ++it_ns ) {
+ if ( (*it_ns).fileName().str() == def->fileName() ) {
+ ns_next = ns->namespaceByName( (*it_ns).name() );
+ if ( ns_next ) {
+ if ( d = findFunctionInNamespace( ns_next, def, nsImports, candidateFile, scopeIndex, bestMatch ) ) break;
+ }
+ }
+ }
+ }
+ if ( !d ) {
+ ClassList classList = ns->classByName( scope[ scopeIndex ] );
+ for ( ClassList::ConstIterator it_cs = classList.begin(); it_cs != classList.end(); ) {
+ if ( d = findFunctionInClass( *(it_cs++), def, nsImports, candidateFile, scopeIndex+1, bestMatch ) ) break;
+ }
+ }
+ }
+ if ( !d ) {
+ FunctionList functionList = ns->functionByName( def->name() );
+ for ( FunctionList::ConstIterator it_decl = functionList.begin(); it_decl != functionList.end(); ++it_decl ) {
+ if ( CodeModelUtils::compareDeclarationToDefinition( *it_decl, (FunctionDefinitionModel*) def.data(), nsImports ) ) {
+ ParsedFile* p = dynamic_cast<ParsedFile*>( def->file()->parseResult().data() );
+ if ( p ) {
+ if ( p->includeFiles()[ (*it_decl)->fileName() ] ) {
+ d = *it_decl;
+ break;
+ } else if ( (*it_decl)->fileName() == candidateFile ) {
+ d = *it_decl;
+ break;
+ }
+ }
+ if ( !bestMatch ) {
+ bestMatch = *it_decl;
+ }
+ }
+ }
+ }
+ return d;
+}
+
+FunctionDom CppSupportPart::findFunctionInClass( const ClassDom& cs, const FunctionDom& def, const std::set<NamespaceImportModel>& nsImports,
+ const QString& candidateFile, int scopeIndex, FunctionDom& bestMatch )
+{
+ FunctionDom d;
+ QStringList scope = def->scope();
+ if ( !(scopeIndex >= (signed) scope.size()) ) {
+ ClassList classList = cs->classByName( scope[ scopeIndex ] );
+ for ( ClassList::ConstIterator it_cs = classList.begin(); it_cs != classList.end(); ) {
+ if ( d = findFunctionInClass( *(it_cs++), def, nsImports, candidateFile, scopeIndex+1, bestMatch ) ) break;
+ }
+ }
+ if ( !d ) {
+ FunctionList functionList = cs->functionByName( def->name() );
+ for ( FunctionList::ConstIterator it_decl = functionList.begin(); it_decl != functionList.end(); ++it_decl ) {
+ if ( CodeModelUtils::compareDeclarationToDefinition( *it_decl, (FunctionDefinitionModel*) def.data(), nsImports ) ) {
+ ParsedFile* p = dynamic_cast<ParsedFile*>( def->file()->parseResult().data() );
+ if ( p ) {
+ if ( p->includeFiles()[ (*it_decl)->fileName() ] ) {
+ d = *it_decl;
+ break;
+ } else if ( (*it_decl)->fileName() == candidateFile ) {
+ d = *it_decl;
+ break;
+ }
+ }
+ if ( !bestMatch ) {
+ bestMatch = *it_decl;
+ }
+ }
+ }
+ }
+ return d;
+}
+
+FunctionDom CppSupportPart::findFunctionDefinition( const FunctionDom& decl )
+{
+ // We have a declaration so we're looking for a definition. The definition will be the child of some namespace node (never a class node).
+ // Since the definition can be the child of any namespace in its scope depending on syntax, we have to check every one.
+ FunctionDom def, bestMatch;
+ NamespaceDom ns = codeModel()->globalNamespace();
+ QString candidateFile = sourceOrHeaderCandidate( decl->fileName() );
+ FunctionDefinitionList functionList = ns->functionDefinitionByName( decl->name() );
+ for ( FunctionDefinitionList::ConstIterator it_def = functionList.begin(); it_def != functionList.end() && !def; ++it_def ) {
+ if ( CodeModelUtils::compareDeclarationToDefinition( decl, *it_def, ns->namespaceImports() ) ) {
+ ParsedFile* p = dynamic_cast<ParsedFile*>( (*it_def)->file()->parseResult().data() );
+ if ( p ) {
+ if ( p->includeFiles()[ decl->fileName() ] ) {
+ def = *it_def;
+ } else if ( (*it_def)->fileName() == candidateFile ) {
+ def = *it_def;
+ break;
+ }
+ }
+ if ( !bestMatch ) {
+ bestMatch = *it_def;
+ }
+ }
+ }
+ QStringList scope = decl->scope();
+ for ( QStringList::ConstIterator it_scope = scope.begin(); it_scope != scope.end() && !def; ++it_scope ) {
+ NamespaceDom ns_next = ns->namespaceByName( *it_scope );
+ if ( ns_next ) {
+ ns = ns_next;
+ FunctionDefinitionList functionList = ns->functionDefinitionByName( decl->name() );
+ for ( FunctionDefinitionList::ConstIterator it_def = functionList.begin(); it_def != functionList.end() && !def; ++it_def ) {
+ if ( CodeModelUtils::compareDeclarationToDefinition( decl, *it_def, ns->namespaceImports() ) ) {
+ ParsedFile* p = dynamic_cast<ParsedFile*>( (*it_def)->file()->parseResult().data() );
+ if ( p ) {
+ if ( p->includeFiles()[ decl->fileName() ] ) {
+ def = *it_def;
+ } else if ( (*it_def)->fileName() == candidateFile ) {
+ def = *it_def;
+ break;
+ }
+ }
+ if ( !bestMatch ) {
+ bestMatch = *it_def;
+ }
+ }
+ }
+ }
+ }
+ return def ? def : bestMatch;
+}
+
+void CppSupportPart::jumpToCodeModelItem( const ItemDom& item, bool scrollOnly )
+{
+ static KURL lastSyncedUrl;
+ static int lastSyncedLine = -1;
+
+ int line, col;
+ item->getStartPosition( &line, &col );
+
+ KURL url( item->fileName() );
+
+ if ( scrollOnly ) {
+ KParts::ReadOnlyPart* part = partController()->partForURL( url );
+ int currentLine = lastSyncedLine;
+ if ( part ) {
+ KTextEditor::ViewCursorInterface *iface = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget());
+ if( iface )
+ iface->cursorPosition( (uint*) &currentLine, (uint*) &col );
+ }
+ partController() ->scrollToLineColumn( url, line, -1, lastSyncedLine != currentLine || lastSyncedUrl != url );
+ } else if ( !splitHeaderSourceConfig()->splitEnabled() )
+ partController() ->editDocument( url, line );
+ else
+ partController() ->splitCurrentDocument( url, line );
+ lastSyncedLine = line;
+ lastSyncedUrl = url;
+}
+
+KDevLanguageSupport::Features CppSupportPart::features()
+{
+ if ( withcpp )
+ return Features( Classes | Structs | Functions | Variables | Namespaces | Declarations
+ | Signals | Slots | AddMethod | AddAttribute | NewClass | CreateAccessMethods );
+ else
+ return Features ( Structs | Functions | Variables | Declarations );
+}
+
+QString CppSupportPart::formatClassName( const QString &name )
+{
+ QString n = name;
+ return n.replace( ".", "::" );
+}
+
+QString CppSupportPart::unformatClassName( const QString &name )
+{
+ QString n = name;
+ return n.replace( "::", "." );
+}
+
+bool CppSupportPart::shouldSplitDocument(const KURL &url)
+{
+ if ( !splitHeaderSourceConfig()->splitEnabled() )
+ return false;
+
+ KURL::List list = partController()->openURLs();
+ KURL::List::ConstIterator it = list.begin();
+ while ( it != list.end() )
+ {
+ QString candidate = sourceOrHeaderCandidate( ( *it ) );
+ if ( candidate.isEmpty() )
+ {
+ ++it;
+ continue;
+ }
+
+ KURL urlCandidate;
+ urlCandidate.setPath( candidate );
+ if ( url == urlCandidate )
+ {
+ // It is already open, so switch to it so
+ // our split view will open with it
+ partController() ->editDocument( ( *it ) );
+ return true;
+ }
+ ++it;
+ }
+ return false;
+}
+
+Qt::Orientation CppSupportPart::splitOrientation() const
+{
+ QString o = splitHeaderSourceConfig()->orientation();
+ if ( o == "Vertical" )
+ return Qt::Vertical;
+ else
+ return Qt::Horizontal;
+}
+
+void CppSupportPart::slotNewClass()
+{
+ CppNewClassDialog dlg( this );
+ dlg.exec();
+}
+
+void CppSupportPart::addMethod( ClassDom klass )
+{
+ if ( !klass )
+ {
+ KMessageBox::error( 0, i18n( "Please select a class." ), i18n( "Error" ) );
+ return ;
+ }
+
+ AddMethodDialog dlg( this, klass, mainWindow() ->main() );
+ dlg.exec();
+}
+
+void CppSupportPart::addAttribute( ClassDom klass )
+{
+ if ( !klass )
+ {
+ KMessageBox::error( 0, i18n( "Please select a class." ), i18n( "Error" ) );
+ return ;
+ }
+
+ AddAttributeDialog dlg( this, klass, mainWindow() ->main() );
+ dlg.exec();
+}
+
+void CppSupportPart::slotCompleteText()
+{
+ if ( !m_pCompletion )
+ return ;
+ m_pCompletion->completeText( true );
+}
+
+/**
+ * parsing stuff for project persistent classstore and code completion
+ */
+void CppSupportPart::initialParse( )
+{
+ // For debugging
+ if ( !project( ) )
+ {
+ // messagebox ?
+ kdDebug( 9007 ) << "No project" << endl;
+ return ;
+ }
+
+ parseProject( );
+ m_valid = true;
+ return ;
+}
+
+bool CppSupportPart::parseProject( bool force )
+{
+ if( _jd )
+ delete _jd->progressBar; ///Make sure the progress-bar is open
+
+ mainWindow() ->statusBar() ->message( i18n( "Updating..." ) );
+
+ kapp->setOverrideCursor( waitCursor );
+
+ _jd = new JobData;
+ if( QFileInfo( project() ->projectDirectory() + "/" + project()->projectName().lower()
+ + ".kdevelop.pcs" ).exists())
+ {
+ QDir d( project() ->projectDirectory());
+ d.rename(project() ->projectName().lower() + ".kdevelop.pcs",
+ project() ->projectName() +".kdevelop.pcs");
+ }
+ _jd->file.setName( project() ->projectDirectory() + "/" + project()->projectName()
+ + ".kdevelop.pcs" );
+
+ QString skip_file_name = project() ->projectDirectory() + "/" +
+ project() ->projectName() + ".kdevelop.ignore_pcs";
+ QString skip_lower_file_name = project() ->projectDirectory() + "/" +
+ project() ->projectName().lower() + ".kdevelop.ignore_pcs";
+
+ if ( !force && !QFile::exists( skip_file_name ) &&
+ !QFile::exists( skip_lower_file_name ) && _jd->file.open( IO_ReadOnly ) )
+ {
+ _jd->stream.setDevice( &( _jd->file ) );
+
+ createIgnorePCSFile();
+
+ QString sig;
+ int pcs_version = 0;
+ _jd->stream >> sig >> pcs_version;
+ if ( sig == "PCS" && pcs_version == KDEV_PCS_VERSION )
+ {
+
+ int numFiles = 0;
+ _jd->stream >> numFiles;
+ kdDebug( 9007 ) << "Read " << numFiles << " files from pcs" << endl;
+
+ for ( int i = 0; i < numFiles; ++i )
+ {
+ QString fn;
+ uint ts;
+ uint offset;
+
+ _jd->stream >> fn >> ts >> offset;
+ _jd->pcs[ fn ] = qMakePair( ts, offset );
+ }
+ }
+ }
+
+ _jd->files = reorder( modifiedFileList() );
+
+ QProgressBar* bar = new QProgressBar( _jd->files.count( ), mainWindow( ) ->statusBar( ) );
+ bar->setMinimumWidth( 120 );
+ bar->setCenterIndicator( true );
+ mainWindow( ) ->statusBar( ) ->addWidget( bar );
+ bar->show( );
+
+ _jd->progressBar = bar;
+ _jd->dir.setPath( m_projectDirectory );
+ _jd->it = _jd->files.begin();
+ _jd->reparseList = QStringList();
+ _jd->backgroundCount = 0;
+ _jd->cycle = 0;
+
+ QTimer::singleShot( 0, this, SLOT( slotParseFiles() ) );
+
+ m_saveMemoryTimer->stop(); //Do not regularly remove cached files that may still be needed while parsing(the cache anyway be full for the whole parsing-process)
+ return true;
+}
+
+void CppSupportPart::slotParseFiles()
+{
+ // NOTE: The checking for m_projectClosed is actually (currently) not needed.
+ // When the project is closed, the language support plugin is destroyed
+ // and as a consequence, the timer job signal never arrives at this method
+
+ if ( !_jd ) return; // how can this possibly happen?!
+
+ if ( _jd->cycle == 0 && !m_projectClosed && _jd->it != _jd->files.end() )
+ {
+ _jd->progressBar->setProgress( _jd->progressBar->progress() + 1 );
+
+ QFileInfo fileInfo( _jd->dir, *( _jd->it ) );
+
+ if ( fileInfo.exists() && fileInfo.isFile() && fileInfo.isReadable() )
+ {
+ QString absFilePath = URLUtil::canonicalPath( fileInfo.absFilePath() );
+
+ if ( isValidSource( absFilePath ) )
+ {
+ QDateTime t = fileInfo.lastModified();
+
+ if ( ! ( m_timestamp.contains( absFilePath ) && m_timestamp[ absFilePath ] == t ) )
+ {
+ if ( _jd->pcs.contains( absFilePath ) )
+ {
+ _jd->stream.device() ->at( _jd->pcs[ absFilePath ].second );
+ FileDom file = codeModel() ->create<FileModel>();
+ file->read( _jd->stream );
+ codeModel() ->addFile( file );
+
+ if( t.toTime_t() != _jd->pcs[ absFilePath ].first ) {
+ ///The FileDom had to be created first, so the dependencies are known
+ _jd->reparseList << file->name();
+/* kdDebug( 9007 ) << "File timestamp: " << ": " << t.toTime_t() << endl;
+ kdDebug( 9007 ) << "Stored timestamp: " << ": " << _jd->pcs[ absFilePath ].first << endl;*/
+ } else {
+ m_timestamp[ absFilePath ] = t;
+/* kdDebug( 9007 ) << "timestamp ok" << endl;*/
+ }
+ } else {
+ _jd->reparseList << absFilePath;
+ /* kdDebug( 9007 ) << absFilePath << " put into reparse-list" << endl;
+ */ }
+ } else {
+/* kdDebug( 9007 ) << absFilePath << " is already in code-model" << endl;*/
+ }
+ }
+ }
+
+ ++( _jd->it );
+ QTimer::singleShot( 0, this, SLOT( slotParseFiles() ) );
+
+ if( _jd->it == _jd->files.end()) {
+ if( _jd->reparseList.isEmpty() ) {
+ _jd->backgroundCount = 0;
+ } else {
+ if( alwaysParseInBackground ) {
+ _jd->backgroundCount = parseFilesAndDependencies( _jd->reparseList, true, false, true );
+ } else {
+ _jd->reparseList = reorder( _jd->reparseList );
+ _jd->it = _jd->reparseList.begin();
+ _jd->backgroundCount = _jd->reparseList.count();
+ }
+ _jd->progressBar->setProgress( 0 ); ///restart progress-bar for reparsing
+ _jd->progressBar->setTotalSteps( _jd->backgroundCount );
+ }
+
+ _jd->lastBackgroundState = -1;
+ _jd->backgroundState = 0;
+ _jd->cycle = 1;
+ _jd->lastParse = QTime::currentTime();
+ kapp->restoreOverrideCursor( );
+ }
+ }
+ else // finished or interrupted
+ {
+ if( _jd->backgroundCount <= _jd->backgroundState || m_projectClosed ) {
+ mainWindow( ) ->statusBar( ) ->removeWidget( _jd->progressBar );
+
+ if ( !m_projectClosed )
+ {
+ kdDebug( 9007 ) << "updating sourceinfo" << endl;
+ kapp->restoreOverrideCursor( );
+ emit updatedSourceInfo();
+ mainWindow( ) ->statusBar( ) ->message( i18n( "Done" ), 2000 );
+ QFile::remove( project() ->projectDirectory()
+ + "/" + project() ->projectName()
+ + ".kdevelop.ignore_pcs" );
+ QFile::remove( project() ->projectDirectory()
+ + "/" + project() ->projectName().lower()
+ + ".kdevelop.ignore_pcs" );
+
+ }
+ else
+ {
+ kdDebug( 9007 ) << "ABORT" << endl;
+ }
+
+ delete _jd;
+ _jd = 0;
+ m_saveMemoryTimer->start( 240000, false );
+ } else {
+ _jd->progressBar->setProgress( _jd->backgroundState ); ///restart
+ _jd->progressBar->setTotalSteps( _jd->backgroundCount );
+ if( _jd->lastParse.msecsTo( QTime::currentTime()) > 60000 && !m_backgroundParser->filesInQueue()) {
+ _jd->backgroundCount = _jd->backgroundState; ///Stop waiting if there is no progress and no file in the background-parser
+ QTimer::singleShot( 0, this, SLOT( slotParseFiles() ) );
+ } else {
+ int timeStep = 0;
+ if( alwaysParseInBackground ) {
+ QTimer::singleShot( 10, this, SLOT( slotParseFiles() ) );
+ } else {
+ if( _jd->it == _jd->reparseList.end() ) {
+ /*_jd->it = _jd->files.end();
+ _jd->backgroundCount = _jd->backgroundState; ///finish processing*/
+ timeStep = 1;
+ } else {
+ /*///Parse the files one by one
+ if( _jd->lastParse.msecsTo( QTime::currentTime()) > 100 || _jd->backgroundState != _jd->lastBackgroundState ) {*/
+ maybeParse( *_jd->it, false );
+ ++(_jd->it);
+ _jd->lastBackgroundState = _jd->backgroundState;
+ /*}else{
+ timeStep = 1;
+ }*/
+ }
+ QTimer::singleShot( timeStep, this, SLOT( slotParseFiles() ) );
+ }
+ }
+ }
+ }
+}
+
+void CppSupportPart::maybeParse( const QString& fn, bool background )
+{
+ if ( !isValidSource( fn ) )
+ return ;
+
+ QFileInfo fileInfo( fn );
+ QString path = URLUtil::canonicalPath( fn );
+ QDateTime t = fileInfo.lastModified();
+
+ if ( !fileInfo.exists() )
+ return;
+
+ QMap<QString, QDateTime>::Iterator it = m_timestamp.find( path );
+ if ( codeModel()->hasFile( fn ) && it != m_timestamp.end() && *it == t )
+ return;
+
+ QStringList l;
+ l << fn;
+ parseFilesAndDependencies( l, background );
+}
+
+bool CppSupportPart::isQueued( const QString& file ) const {
+ //int c = m_backgroundParser->countInQueue( file );
+ //if( c == 0 ) return false;
+ return m_parseEmitWaiting.waiting( file, ParseEmitWaiting::Silent, 2 ); //Since it may be possible that the background-parser is currently parsing the file(in an obselete state), it is allowed to have the file in the queue twice.
+}
+
+void CppSupportPart::slotNeedTextHint( int line, int column, QString& textHint )
+{
+ if ( 1 || !m_activeEditor )
+ return ;
+
+ m_backgroundParser->lock();
+ TranslationUnitAST* ast = *m_backgroundParser->translationUnit( m_activeFileName );
+ AST* node = 0;
+ if ( ast && ( node = findNodeAt( ast, line, column ) ) )
+ {
+
+ while ( node && node->nodeType() != NodeType_FunctionDefinition )
+ node = node->parent();
+
+ if ( node )
+ {
+ int startLine, startColumn;
+ int endLine, endColumn;
+ node->getStartPosition( &startLine, &startColumn );
+ node->getEndPosition( &endLine, &endColumn );
+
+ if ( !node->text().isNull() )
+ textHint = node->text();
+ else
+ textHint = m_activeEditor->textLine( startLine ).simplifyWhiteSpace();
+ }
+ }
+ m_backgroundParser->unlock();
+}
+
+void CppSupportPart::MakeMemberHelper( QString& text, int& atLine, int& atColumn )
+{
+ if ( !m_activeViewCursor || !m_valid )
+ return ;
+
+ atLine = -2;
+ atColumn = 0;
+
+ QString implFile = findSourceFile();
+
+ m_backgroundParser->lock();
+ TranslationUnitAST* translationUnit = *m_backgroundParser->translationUnit( m_activeFileName );
+ if ( translationUnit )
+ {
+ bool fail = false;
+ unsigned int line, column;
+ m_activeViewCursor->cursorPositionReal( &line, &column );
+
+ AST* currentNode = findNodeAt( translationUnit, line, column );
+ DeclaratorAST* declarator = 0;
+ while ( currentNode && currentNode->nodeType() != NodeType_SimpleDeclaration )
+ {
+ if ( currentNode->nodeType() == NodeType_Declarator )
+ declarator = ( DeclaratorAST* ) currentNode;
+ currentNode = currentNode->parent();
+ }
+ SimpleDeclarationAST* decl = currentNode ? ( SimpleDeclarationAST* ) currentNode : 0;
+
+ if ( decl && decl->storageSpecifier() && decl->storageSpecifier()->text().contains("friend") )
+ {
+ kdDebug(9007) << "this is a friend declaration, don't create any definition" << endl;
+ fail = true;
+ }
+
+ if ( !fail && decl && decl->initDeclaratorList() && !declarator )
+ {
+ InitDeclaratorAST * i = decl->initDeclaratorList() ->initDeclaratorList().at( 0 );
+ if ( i )
+ declarator = i->declarator();
+ }
+
+ if ( !fail && decl && declarator && declarator->parameterDeclarationClause() )
+ {
+
+ QStringList scope;
+ scopeOfNode( decl, scope );
+
+ QString scopeStr = scope.join( "::" );
+ if ( !scopeStr.isEmpty() )
+ scopeStr += "::";
+
+ QString declStr = declaratorToString( declarator, scopeStr ).simplifyWhiteSpace();
+ if ( declarator->exceptionSpecification() )
+ {
+ declStr += QString::fromLatin1( " throw( " );
+ QPtrList<AST> l = declarator->exceptionSpecification() ->nodeList();
+ QPtrListIterator<AST> type_it( l );
+ while ( type_it.current() )
+ {
+ declStr += type_it.current() ->text();
+ ++type_it;
+
+ if ( type_it.current() )
+ declStr += QString::fromLatin1( ", " );
+ }
+
+ declStr += QString::fromLatin1( " )" );
+ }
+
+ text += "\n\n";
+ QString type = typeSpecToString( decl->typeSpec() );
+ text += type;
+ if ( !type.isNull() )
+ text += + " ";
+
+ text += declStr + "\n{\n}";
+ }
+
+ if ( !fail )
+ {
+ translationUnit = *m_backgroundParser->translationUnit( implFile );
+ if ( translationUnit )
+ translationUnit->getEndPosition( &atLine, &atColumn );
+ }
+
+ kdDebug( 9007 ) << "at line in mm: " << atLine << endl;
+ }
+ m_backgroundParser->unlock();
+}
+
+void CppSupportPart::slotMakeMember()
+{
+ QString text;
+ int atColumn, atLine;
+ MakeMemberHelper( text, atLine, atColumn );
+
+ if ( !text.isEmpty() )
+ {
+ QString implFile = findSourceFile();
+
+ if ( !implFile.isEmpty() )
+ {
+ partController() ->editDocument( KURL( implFile ) );
+ kapp->eventLoop()->processEvents( QEventLoop::ExcludeUserInput | QEventLoop::ExcludeSocketNotifiers, 500 );
+ }
+ if ( atLine == -2 )
+ atLine = m_activeEditor->numLines() - 1;
+
+ m_backgroundParser->lock ()
+ ;
+
+ kdDebug( 9007 ) << "at line in mm: " << atLine << " atCol: " << atColumn << endl;
+ kdDebug( 9007 ) << "text: " << text << endl;
+ if ( m_activeEditor )
+ m_activeEditor->insertText( atLine, atColumn, text );
+ if ( m_activeViewCursor )
+ m_activeViewCursor->setCursorPositionReal( atLine + 3, 1 );
+
+ m_backgroundParser->unlock();
+ }
+}
+
+QStringList CppSupportPart::subclassWidget( const QString& formName )
+{
+ QStringList newFileNames;
+ SubclassingDlg *dlg = new SubclassingDlg( this, formName, newFileNames );
+ dlg->exec();
+ return newFileNames;
+}
+
+QStringList CppSupportPart::updateWidget( const QString& formName, const QString& fileName )
+{
+ QStringList dummy;
+ SubclassingDlg *dlg = new SubclassingDlg( this, formName, fileName, dummy );
+ dlg->exec();
+ return dummy;
+}
+
+void CppSupportPart::partRemoved( KParts::Part* part )
+{
+ kdDebug( 9032 ) << "CppSupportPart::partRemoved()" << endl;
+
+ if ( KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( part ) )
+ {
+
+ QString fileName = doc->url().path();
+ if ( !isValidSource( fileName ) )
+ return ;
+
+ QString canonicalFileName = URLUtil::canonicalPath( fileName );
+ m_backgroundParser->removeFile( canonicalFileName );
+ m_backgroundParser->addFile( canonicalFileName, true );
+ }
+}
+
+void CppSupportPart::slotProjectCompiled()
+{
+ kdDebug( 9007 ) << "CppSupportPart::slotProjectCompiled()" << endl;
+ parseProject();
+}
+
+QStringList CppSupportPart::modifiedFileList()
+{
+ QStringList lst;
+
+ QStringList fileList = m_projectFileList;
+ QStringList::Iterator it = fileList.begin();
+ while ( it != fileList.end() )
+ {
+ QString fileName = *it;
+ ++it;
+
+ QFileInfo fileInfo( m_projectDirectory, fileName );
+ QString path = URLUtil::canonicalPath( fileInfo.absFilePath() );
+
+ if ( !( isSource( path ) || isHeader( path ) ) )
+ continue;
+
+ QDateTime t = fileInfo.lastModified();
+
+ QMap<QString, QDateTime>::Iterator dictIt = m_timestamp.find( path );
+ if ( fileInfo.exists() && dictIt != m_timestamp.end() && *dictIt == t )
+ continue;
+
+ lst << fileName;
+ }
+
+ return lst;
+}
+
+KTextEditor::Document * CppSupportPart::findDocument( const KURL & url )
+{
+ if ( !partController() ->parts() )
+ return 0;
+
+ QPtrList<KParts::Part> parts( *partController() ->parts() );
+ QPtrListIterator<KParts::Part> it( parts );
+ while ( KParts::Part * part = it.current() )
+ {
+ KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( part );
+ if ( doc && doc->url() == url )
+ return doc;
+ ++it;
+ }
+
+ return 0;
+}
+
+void CppSupportPart::setupCatalog( )
+{
+ kdDebug( 9007 ) << "CppSupportPart::setupCatalog()" << endl;
+
+ KStandardDirs *dirs = CppSupportFactory::instance() ->dirs();
+ QStringList pcsList = dirs->findAllResources( "pcs", "*.db", false, true );
+ QStringList pcsIdxList = dirs->findAllResources( "pcs", "*.idx", false, true );
+
+ QStringList enabledPCSs;
+ if ( DomUtil::elementByPath( *project() ->projectDom(), "kdevcppsupport/references" ).isNull() )
+ {
+ for ( QStringList::Iterator it = pcsList.begin(); it != pcsList.end(); ++it )
+ {
+ kdDebug( 9007 ) << "CppSupportPart::setupCatalog()1 " << *it << endl;
+ enabledPCSs.push_back( QFileInfo( *it ).baseName(true) );
+ }
+ }
+ else
+ {
+ enabledPCSs = DomUtil::readListEntry( *project() ->projectDom(), "kdevcppsupport/references", "pcs" );
+ }
+
+ QStringList indexList = QStringList() << "kind" << "name" << "scope" << "fileName" << "prefix";
+
+ if ( pcsList.size() && pcsVersion() < KDEV_DB_VERSION )
+ {
+ QStringList l = pcsList + pcsIdxList;
+ int rtn = KMessageBox::questionYesNoList( 0, i18n( "Persistent class store will be disabled: you have a wrong version of pcs installed.\nRemove old pcs files?" ), l, i18n( "C++ Support" ), KStdGuiItem::del(), KStdGuiItem::cancel() );
+ if ( rtn == KMessageBox::Yes )
+ {
+ QStringList::Iterator it = l.begin();
+ while ( it != l.end() )
+ {
+ QFile::remove
+ ( *it );
+ ++it;
+ }
+ // @todo regenerate the pcs list
+ pcsList.clear();
+ }
+ else
+ {
+ return ;
+ }
+ }
+
+ QStringList::Iterator it = pcsList.begin();
+ while ( it != pcsList.end() )
+ {
+ kdDebug( 9007 ) << "CppSupportPart::setupCatalog()2 " << *it << endl;
+ Catalog * catalog = new Catalog();
+ catalog->open( *it );
+ catalog->setEnabled( enabledPCSs.contains( QFileInfo( *it ).baseName(true) ) );
+ ++it;
+
+ for ( QStringList::Iterator idxIt = indexList.begin(); idxIt != indexList.end(); ++idxIt )
+ catalog->addIndex( ( *idxIt ).utf8() );
+
+ m_catalogList.append( catalog );
+ codeRepository() ->registerCatalog( catalog );
+ }
+
+ setPcsVersion( KDEV_DB_VERSION );
+}
+
+KMimeType::List CppSupportPart::mimeTypes( )
+{
+ QStringList mimeList;
+ mimeList += m_headerMimeTypes;
+ mimeList += m_sourceMimeTypes;
+
+ KMimeType::List list;
+ for ( QStringList::Iterator it = mimeList.begin(); it != mimeList.end(); ++it )
+ {
+ if ( KMimeType::Ptr mime = KMimeType::mimeType( *it ) )
+ list << mime;
+ }
+
+ return list;
+}
+
+int CppSupportPart::pcsVersion()
+{
+ KConfig * config = CppSupportFactory::instance() ->config();
+ KConfigGroupSaver cgs( config, "PCS" );
+ return config->readNumEntry( "Version", 0 );
+}
+
+void CppSupportPart::setPcsVersion( int version )
+{
+ KConfig * config = CppSupportFactory::instance() ->config();
+ KConfigGroupSaver cgs( config, "PCS" );
+ config->writeEntry( "Version", version );
+ config->sync();
+}
+
+QString CppSupportPart::formatTag( const Tag & inputTag )
+{
+ Tag tag = inputTag;
+
+ switch ( tag.kind() )
+ {
+ case Tag::Kind_Namespace:
+ return QString::fromLatin1( "namespace " ) + tag.name();
+
+ case Tag::Kind_Class:
+ return QString::fromLatin1( "class " ) + tag.name();
+
+ case Tag::Kind_Function:
+ case Tag::Kind_FunctionDeclaration:
+ {
+ CppFunction<Tag> tagInfo( tag );
+ return tagInfo.name() + "( " + tagInfo.arguments().join( ", " ) + " ) : " + tagInfo.type();
+ }
+ break;
+
+ case Tag::Kind_Variable:
+ case Tag::Kind_VariableDeclaration:
+ {
+ CppVariable<Tag> tagInfo( tag );
+ return tagInfo.name() + " : " + tagInfo.type();
+ }
+ break;
+ }
+ return tag.name();
+}
+
+void CppSupportPart::codeCompletionConfigStored( )
+{
+ if ( m_projectClosing ) return;
+ updateParserConfiguration();
+ /*
+ m_backgroundParser->updateParserConfiguration();
+
+ KDevDriver* d = dynamic_cast<KDevDriver*>( m_driver ); //The foreground-parse isn't used anymore, and could be removed
+ if( d ) {
+ d->setup();
+ d->makeMacrosPersistent();
+ }*/
+ partController() ->setActivePart( partController()->activePart() );
+}
+
+void CppSupportPart::splitHeaderSourceConfigStored( )
+{
+ QString o = splitHeaderSourceConfig()->orientation();
+ if ( o == "Vertical" )
+ emit splitOrientationChanged( Qt::Vertical );
+ else if ( o == "Horizontal" )
+ emit splitOrientationChanged( Qt::Horizontal );
+}
+
+void CppSupportPart::removeWithReferences( const QString & fileName )
+{
+kdDebug( 9007 ) << "remove with references: " << fileName << endl;
+ m_timestamp.remove( fileName );
+ if ( !codeModel() ->hasFile( fileName ) )
+ return ;
+
+ emit aboutToRemoveSourceInfo( fileName );
+
+ codeModel() ->removeFile( codeModel() ->fileByName( fileName ) );
+}
+
+bool CppSupportPart::isValidSource( const QString& fileName ) const
+{
+ QFileInfo fileInfo( fileName );
+ QString path = URLUtil::canonicalPath( fileInfo.absFilePath() );
+
+ return /*project() && project() ->isProjectFile( path )
+ &&*/ ( isSource( path ) || isHeader( path ) )
+ && !QFile::exists( fileInfo.dirPath( true ) + "/.kdev_ignore" );
+}
+
+QString CppSupportPart::formatModelItem( const CodeModelItem *item, bool shortDescription )
+{
+ if ( item->isFunction() || item->isFunctionDefinition() )
+ {
+ const FunctionModel * model = static_cast<const FunctionModel*>( item );
+ QString function;
+ QString args;
+ ArgumentList argumentList = model->argumentList();
+ for ( ArgumentList::const_iterator it = argumentList.begin(); it != argumentList.end(); ++it )
+ {
+ args.isEmpty() ? args += "" : args += ", " ;
+ args += formatModelItem( ( *it ).data() );
+ }
+ if ( !shortDescription )
+ function += ( model->isVirtual() ? QString( "virtual " ) : QString( "" ) ) + model->resultType() + " ";
+
+ function += model->name() + "(" + args + ")" + ( model->isConstant() ? QString( " const" ) : QString( "" ) ) +
+ ( model->isAbstract() ? QString( " = 0" ) : QString( "" ) );
+
+ return function;
+ }
+ else if ( item->isVariable() )
+ {
+ const VariableModel * model = static_cast<const VariableModel*>( item );
+ if ( shortDescription )
+ return model->name();
+ return model->type() + " " + model->name();
+ }
+ else if ( item->isArgument() )
+ {
+ const ArgumentModel * model = static_cast<const ArgumentModel*>( item );
+ QString arg;
+ if ( !shortDescription )
+ arg += model->type() + " ";
+ arg += model->name();
+ if ( !shortDescription )
+ arg += model->defaultValue().isEmpty() ? QString( "" ) : QString( " = " ) + model->defaultValue();
+ return arg.stripWhiteSpace();
+ }
+ else
+ return KDevLanguageSupport::formatModelItem( item, shortDescription );
+}
+
+void CppSupportPart::addClass()
+{
+ slotNewClass();
+}
+
+void CppSupportPart::saveProjectSourceInfo()
+{
+ const FileList fileList = codeModel() ->fileList();
+
+ if ( !project() || fileList.isEmpty() )
+ return ;
+
+ QFile f( project() ->projectDirectory() + "/"
+ + project() ->projectName() + ".kdevelop.pcs" );
+ if ( !f.open( IO_WriteOnly ) )
+ return ;
+
+ m_backgroundParser->lock();
+
+ createIgnorePCSFile();
+
+ QDataStream stream( &f );
+ QMap<QString, uint> offsets;
+
+ QString pcs( "PCS" );
+ stream << pcs << KDEV_PCS_VERSION;
+
+ stream << int( fileList.size() );
+ for ( FileList::ConstIterator it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ const FileDom dom = ( *it );
+ stream << dom->name() << m_timestamp[ dom->name() ].toTime_t();
+ if( m_timestamp.find( dom->name() ) == m_timestamp.end() ) {
+ kdDebug( 9007 ) << dom->name() << ": timestamp is missing " << endl;
+ }
+ offsets.insert( dom->name(), stream.device() ->at() );
+ stream << ( uint ) 0; // dummy offset
+ }
+
+ for ( FileList::ConstIterator it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ const FileDom dom = ( *it );
+ int offset = stream.device() ->at();
+
+ dom->write( stream );
+
+ int end = stream.device() ->at();
+
+ stream.device() ->at( offsets[ dom->name() ] );
+ stream << offset;
+ stream.device() ->at( end );
+ }
+
+ QFile::remove( project() ->projectDirectory() + "/"
+ + project() ->projectName() + ".kdevelop.ignore_pcs" );
+ QFile::remove( project() ->projectDirectory() + "/"
+ + project() ->projectName().lower() + ".kdevelop.ignore_pcs" );
+
+ m_backgroundParser->unlock();
+}
+
+QString CppSupportPart::extractInterface( const ClassDom& klass )
+{
+ QString txt;
+ QTextStream stream( &txt, IO_WriteOnly );
+
+ QString name = klass->name() + "Interface";
+ QString ind;
+ ind.fill( QChar( ' ' ), 4 );
+
+ stream
+ << "class " << name << "\n"
+ << "{" << "\n"
+ << "public:" << "\n"
+ << ind << name << "() {}" << "\n"
+ << ind << "virtual ~" << name << "() {}" << "\n"
+ << "\n";
+
+ const FunctionList functionList = klass->functionList();
+ for ( FunctionList::ConstIterator it = functionList.begin(); it != functionList.end(); ++it )
+ {
+ const FunctionDom& fun = *it;
+
+ if ( !fun->isVirtual() || fun->name().startsWith( "~" ) )
+ continue;
+
+ stream << ind << formatModelItem( fun );
+ if ( !fun->isAbstract() )
+ stream << " = 0";
+
+ stream << ";\n";
+ }
+
+ stream
+ << "\n"
+ << "private:" << "\n"
+ << ind << name << "( const " << name << "& source );" << "\n"
+ << ind << "void operator = ( const " << name << "& source );" << "\n"
+ << "};" << "\n\n";
+
+ return txt;
+}
+
+void CppSupportPart::slotExtractInterface( )
+{
+ if ( !m_activeClass )
+ return ;
+
+ QFileInfo fileInfo( m_activeClass->fileName() );
+ QString ifaceFileName = fileInfo.dirPath( true ) + "/" + m_activeClass->name().lower() + "_interface.h";
+ if ( QFile::exists( ifaceFileName ) )
+ {
+ KMessageBox::error( mainWindow() ->main(), i18n( "File %1 already exists" ).arg( ifaceFileName ),
+ i18n( "C++ Support" ) );
+ }
+ else
+ {
+ QString text = extractInterface( m_activeClass );
+
+ QFile f( ifaceFileName );
+ if ( f.open( IO_WriteOnly ) )
+ {
+ QTextStream stream( &f );
+ stream
+ << "#ifndef __" << m_activeClass->name().upper() << "_INTERFACE_H" << "\n"
+ << "#define __" << m_activeClass->name().upper() << "_INTERFACE_H" << "\n"
+ << "\n"
+ << extractInterface( m_activeClass )
+ << "\n"
+ << "#endif // __" << m_activeClass->name().upper() << "_INTERFACE_H" << "\n";
+ f.close();
+
+ project() ->addFile( ifaceFileName );
+ }
+ }
+
+ m_activeClass = 0;
+}
+
+void CppSupportPart::gotoLine( int line )
+{
+ if ( isHeader( m_activeFileName ) )
+ {
+ KURL url;
+ url.setPath( sourceOrHeaderCandidate() );
+ partController() ->editDocument( url, line );
+ }
+ else
+ m_activeViewCursor->setCursorPositionReal( line, 0 );
+}
+
+FileDom CppSupportPart::fileByName( const QString& name) {
+ return codeModel()->fileByName( name );
+}
+
+
+int CppSupportPart::parseFilesAndDependencies( QStringList files, bool background, bool parseFirst, bool silent ) {
+ QMap<QString, int> fileGroups;
+ int nextGroup = 0;
+
+ for( QStringList::iterator it = files.begin(); it != files.end(); ++it ) {
+ FileDom d = fileByName( *it );
+
+ QStringList lst;
+ if( !d ) {
+ lst << *it;
+ }else{
+ lst = codeModel()->getGroupStrings( d->groupId() );
+/* kdDebug( 9007 ) << "adding group of: " << *it << ":\n" << " which is " << lst.join("\n") << "\n\n";*/
+ if( lst.count() > 10 ) {
+ lst = codeModel()->getGroupStrings( d->groupId() );
+ }
+ }
+ int cgroup = nextGroup;
+ nextGroup++;
+
+ if( fileGroups.find( *it ) != fileGroups.end() )
+ cgroup = fileGroups[*it];
+
+ for( QStringList::iterator lit = lst.begin(); lit != lst.end(); ++lit )
+ fileGroups[*lit] = cgroup;
+ }
+
+ QValueVector<QStringList> groups;
+ groups.resize( nextGroup );
+
+ ///put the groups together
+ for( QMap<QString, int>::iterator it = fileGroups.begin(); it != fileGroups.end(); ++it ) {
+ groups[*it] << it.key();
+ }
+
+ for( int a = 0; a < nextGroup; a++ ) {
+ QStringList group = reorder( groups[a] );
+
+
+/* kdDebug( 9007 ) << "reparsing the following group: " << ":\n" << group.join("\n") << "\n\n";*/
+ if( background ) {
+
+ m_backgroundParser->lock();
+
+ if( !group.isEmpty() ) {
+ if( !parseFirst )
+ m_parseEmitWaiting.addGroup( group, silent ? ParseEmitWaiting::Silent : ParseEmitWaiting::None );
+ else
+ m_parseEmitWaiting.addGroupFront( group, silent ? ParseEmitWaiting::Silent : ParseEmitWaiting::None );
+ if( !silent ) {
+ if( !parseFirst )
+ m_fileParsedEmitWaiting.addGroup( group, silent ? ParseEmitWaiting::Silent : ParseEmitWaiting::None );
+ else
+ m_fileParsedEmitWaiting.addGroupFront( group, silent ? ParseEmitWaiting::Silent : ParseEmitWaiting::None );
+ }
+ }
+
+ if( parseFirst && !group.empty() ) {
+ for(QStringList::iterator it = --group.end(); it != group.end(); ) {
+ backgroundParser()->addFileFront(*it);
+ if( it == group.begin() ) {
+ it = group.end();
+ } else {
+ --it;
+ }
+ }
+ } else {
+ for(QStringList::iterator it = group.begin(); it != group.end(); ++it) {
+ backgroundParser()->addFile(*it);
+ }
+ }
+
+ m_backgroundParser->unlock();
+
+ } else {
+ for(QStringList::iterator it = group.begin(); it != group.end(); ++it) {
+ m_driver->parseFile( *it );
+ }
+ }
+ }
+
+ return fileGroups.count();
+}
+
+int CppSupportPart::parseFileAndDependencies( const QString & fileName, bool background, bool parseFirst, bool silent ) {
+ if(! isValidSource( fileName ) ) return 0;
+
+// kdDebug( 9007 ) << "reparsing dependencies of " << fileName << "\n";
+
+ return parseFilesAndDependencies( fileName, background, parseFirst, silent );
+}
+
+void CppSupportPart::parseEmit( ParseEmitWaiting::Processed files ) {
+ if( files.res.isEmpty() ) return;
+
+ bool modelHasFiles = true;
+
+ for( QStringList::iterator it = files.res.begin(); it != files.res.end(); ++it ) {
+ if( !codeModel()->hasFile( *it ) ) modelHasFiles = false;
+ }
+
+ int oldFileCount = codeModel()->fileList().count();
+
+ if( (files.flag & ParseEmitWaiting::HadErrors) && modelHasFiles && !files.hasFlag( ParseEmitWaiting::Silent ) ) {
+ mainWindow() ->statusBar() ->message( "File parsed, but not updating code-model because of errors", 2000 );
+ kdDebug( 9007 ) << "not updating code-model because at least one file has errors" << endl;
+ // for( QStringList::iterator it = files.res.begin(); it != files.res.end(); ++it )
+ // m_backgroundParser->removeFile( *it );
+ } else {
+ ///update timestamps
+ for( QStringList::iterator it = files.res.begin(); it != files.res.end(); ++it ) {
+ if( !codeModel()->hasFile( *it ) ) modelHasFiles = false;
+ QString& fileName = *it;
+
+ QFileInfo fileInfo( fileName );
+ QString path = URLUtil::canonicalPath( fileName );
+
+ if ( !fileInfo.exists() ) {
+ removeWithReferences( path );
+ continue ;
+ }
+
+ m_timestamp[ path ] = fileInfo.lastModified();
+ }
+
+ if( files.hasFlag( ParseEmitWaiting::Silent ) && !alwaysParseInBackground )
+ return;
+
+ m_backgroundParser->lock();
+
+ QStringList l = files.res;
+
+ QMap<QString, bool> wholeResult;
+ QStringList missing;
+
+ QMap<QString, FileDom> newFiles;
+
+ while(!l.isEmpty() ) {
+ QString fileName = l.front();
+
+ if( !m_backgroundParser->hasTranslationUnit( fileName ) ) {
+ kdDebug( 9007 ) << "error: translation-unit is missing: " << fileName << endl;
+ missing << fileName;
+ } else {
+ if ( ParsedFilePointer ast = m_backgroundParser->translationUnit( fileName ) )
+ {
+ if ( true /*!hasErrors*/ )
+ {
+ FileDom oldFile = codeModel()->fileByName( fileName );
+
+ StoreWalker walker( fileName, codeModel() );
+ walker.setOverrides( newFiles );
+
+ walker.parseTranslationUnit( *ast );
+
+ if( oldFile ) {
+ newFiles[fileName] = walker.file();
+
+ ///update timestamps
+ QFileInfo fileInfo( fileName );
+ QString path = URLUtil::canonicalPath( fileName );
+
+ m_timestamp[ path ] = fileInfo.lastModified();
+ } else {
+ codeModel() ->addFile( walker.file() );
+ }
+
+ if( walker.file() ) {
+ QStringList grp = walker.file()->wholeGroupStrings();
+ for( QStringList::const_iterator it = grp.begin(); it != grp.end(); ++it )
+ wholeResult[*it] = true;
+ }
+ }
+ } else {
+ kdDebug( 9007 ) << "failed to parse " << fileName << endl;
+ }
+ }
+
+
+ l.pop_front();
+ }
+
+ bool canUpdate = true;
+ for( QMap<QString, FileDom>::const_iterator it = newFiles.begin(); it != newFiles.end(); ++it ) {
+ FileDom oldFile = codeModel()->fileByName( it.key() );
+
+ if( !oldFile || !oldFile->canUpdate( *it ) ) {
+ canUpdate = false;
+ break;
+ }
+ }
+
+ if( canUpdate ) {
+ ///Update the code-model
+ for( QMap<QString, FileDom>::const_iterator it = newFiles.begin(); it != newFiles.end(); ++it ) {
+ FileDom oldFile = codeModel()->fileByName( it.key() );
+ oldFile->update( *it );
+ codeModel()->mergeGroups( oldFile->groupId(), (*it)->groupId() ); ///Merge parsing-groups together
+ }
+ } else {
+ ///Remove the current files and replace them with the new ones
+ for( QMap<QString, FileDom>::const_iterator it = newFiles.begin(); it != newFiles.end(); ++it ) {
+ removeWithReferences( it.key() );
+ codeModel()->addFile( *it );
+ }
+ }
+ /*
+ ///make the list unique
+
+ l.clear();
+ for( QMap<QString, bool>::const_iterator it = wholeResult.begin(); it != wholeResult.end(); ++it )
+ l << it.key();*/
+
+ m_backgroundParser->unlock();
+
+ if( !missing.isEmpty() ) {
+ kdDebug( 9007 ) << "error: translation-units were missing: " << missing << endl;
+ //don't reparse missing units, because it may cause the whole project to be reparsed
+ // parseFilesAndDependencies( missing, true, false, files.hasFlag( ParseEmitWaiting::Silent ) );
+ }
+
+ if( files.hasFlag( ParseEmitWaiting::Silent ) ) {
+ if( alwaysParseInBackground )
+ for( QStringList::iterator it = files.res.begin(); it != files.res.end(); ++it )
+ m_backgroundParser->removeFile( *it );
+ } else {
+ if( !canUpdate ) { ///If the current model could be updated, do not emit addedSourceInfo(..) and remove the units from the parser, because nobody will be using them
+ QStringList l = files.res;
+ while(!l.isEmpty() ) {
+ emit aboutToRemoveSourceInfo( l.front() );
+ emit removedSourceInfo( l.front() );
+ emit addedSourceInfo( l.front() );
+ l.pop_front();
+ }
+
+ if( !files.hasFlag( ParseEmitWaiting::Silent ) )
+ emitFileParsed( files );
+ } else {
+ QStringList l = files.res;
+ while( !l.isEmpty() ) {
+ emit codeModelUpdated( l.front() );
+ emit aboutToRemoveSourceInfo( l.front() );
+ emit removedSourceInfo( l.front() );
+ emit addedSourceInfo( l.front() );
+ l.pop_front();
+ }
+ }
+ }
+ kdDebug( 9007 ) << "files in code-model after parseEmit: " << codeModel()->fileList().count() << " before: " << oldFileCount << endl;
+ }
+}
+
+/*void CppSupportPart::recomputeCodeModel( const QString& fileName )
+{*/
+
+//}
+
+void CppSupportPart::emitSynchronousParseReady( const QString& file, ParsedFilePointer unit ) {
+ emit synchronousParseReady( file, unit );
+}
+
+void CppSupportPart::emitFileParsed( QStringList l )
+{
+ while( !l.isEmpty() ) {
+ emit fileParsed( l.front() );
+ l.pop_front();
+ }
+}
+
+bool CppSupportPart::isHeader( const QString& fileName ) const
+{
+ /*KMimeType::Ptr ptr = KMimeType::findByPath( fileName );
+ if ( ptr && m_headerMimeTypes.contains( ptr->name() ) )
+ return true;*/
+
+ return ( m_headerExtensions.findIndex( QFileInfo( fileName ).extension() ) != -1 );
+}
+
+bool CppSupportPart::isSource( const QString& fileName ) const
+{
+ /*KMimeType::Ptr ptr = KMimeType::findByPath( fileName );
+ if ( ptr && m_sourceMimeTypes.contains( ptr->name() ) )
+ return true;*/
+
+ return ( m_sourceExtensions.findIndex( QFileInfo( fileName ).extension() ) != -1 );
+}
+
+void CppSupportPart::gotoDeclarationLine( int line )
+{
+ if ( isHeader( m_activeFileName ) )
+ m_activeViewCursor->setCursorPositionReal( line, 0 );
+ else
+ {
+ KURL url;
+ url.setPath( sourceOrHeaderCandidate() );
+ partController() ->editDocument( url, line );
+ }
+}
+
+void CppSupportPart::removeCatalog( const QString & dbName )
+{
+ if ( !QFile::exists( dbName ) )
+ return ;
+
+ QValueList<Catalog*> catalogs = codeRepository() ->registeredCatalogs();
+ Catalog* c = 0;
+ for ( QValueList<Catalog*>::Iterator it = catalogs.begin(); it != catalogs.end(); ++it )
+ {
+ if ( ( *it ) ->dbName() == dbName )
+ {
+ c = *it;
+ break;
+ }
+ }
+
+ if ( c )
+ {
+ codeRepository() ->unregisterCatalog( c );
+ m_catalogList.remove( c );
+ }
+
+ QFileInfo fileInfo( dbName );
+ QDir dir( fileInfo.dir( true ) );
+ QStringList indexList = QStringList() << "kind" << "name" << "scope" << "fileName" << "prefix";
+ for(QStringList::Iterator iter = indexList.begin(); iter != indexList.end(); iter++)
+ {
+ QStringList fileList = dir.entryList( fileInfo.baseName(true) +"." +(*iter) + ".idx" );
+ for ( QStringList::Iterator it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString idxName = fileInfo.dirPath( true ) + "/" + *it;
+ kdDebug( 9007 ) << "=========> remove db index: " << idxName << endl;
+ dir.remove( *it );
+ }
+ }
+ dir.remove( fileInfo.fileName() );
+}
+
+void CppSupportPart::addCatalog( Catalog * catalog )
+{
+ m_catalogList.append( catalog );
+ codeRepository() ->registerCatalog( catalog );
+}
+
+FunctionDefinitionDom CppSupportPart::functionDefinitionAt( int line, int column )
+{
+ if ( !codeModel() ->hasFile( m_activeFileName ) )
+ return FunctionDefinitionDom();
+
+ CodeModelUtils::CodeModelHelper h( codeModel(), codeModel()->fileByName( m_activeFileName ) );
+
+ FunctionDom d = h.functionAt( line, column, CodeModelUtils::CodeModelHelper::Definition );
+ if( d ) {
+ FunctionDefinitionModel* m = dynamic_cast<FunctionDefinitionModel*>( d.data() );
+ if( m ) return FunctionDefinitionDom( m );
+ }
+ return FunctionDefinitionDom();
+}
+
+FunctionDefinitionDom CppSupportPart::currentFunctionDefinition( )
+{
+ if ( !this->m_activeViewCursor )
+ return FunctionDefinitionDom();
+
+ unsigned int line, column;
+ this->m_activeViewCursor->cursorPositionReal( &line, &column );
+ return functionDefinitionAt( line, column );
+}
+
+void CppSupportPart::slotCursorPositionChanged()
+{
+ if ( codeCompletion() )
+ {
+ unsigned int line = 0;
+ unsigned int column = 0;
+ if ( KDevEditorUtil::currentPositionReal( &line, &column, dynamic_cast<KTextEditor::Document*>( partController()->activePart() ) ) )
+ {
+ QString typeInfoString = codeCompletion()->createTypeInfoString( line, column );
+ mainWindow()->statusBar()->message( typeInfoString );
+ }
+ }
+
+ // m_functionHintTimer->changeInterval( 1000 );
+ if ( splitHeaderSourceConfig()->splitEnabled()
+ && splitHeaderSourceConfig()->autoSync() )
+ slotSwitchHeader( true );
+}
+
+/*
+void CppSupportPart::slotFunctionHint( )
+{
+ kdDebug( 9007 ) << "=======> compute current function definition" << endl;
+// m_functionHintTimer->stop();
+ if ( FunctionDefinitionDom fun = currentFunctionDefinition() )
+ {
+ QStringList scope = fun->scope();
+ QString funName = scope.join( "::" );
+ if ( !funName.isEmpty() )
+ funName += "::";
+
+ funName += formatModelItem( fun, true );
+
+ mainWindow() ->statusBar() ->message( funName, 2000 );
+ }
+}
+*/
+
+void CppSupportPart::createIgnorePCSFile( )
+{
+ static QCString skip_me( "ignore me\n" );
+
+ QString skip_file_name = project() ->projectDirectory() + "/"
+ + project() ->projectName() + ".kdevelop.ignore_pcs";
+ QFile skip_pcs_file( skip_file_name );
+ if ( skip_pcs_file.open( IO_WriteOnly ) )
+ {
+ skip_pcs_file.writeBlock( skip_me );
+ skip_pcs_file.close();
+ }
+}
+
+QString CppSupportPart::specialHeaderName( bool local ) const
+{
+ if ( local )
+ return ::locateLocal( "data", "kdevcppsupport/configuration", CppSupportFactory::instance() );
+
+ return ::locate( "data", "kdevcppsupport/configuration", CppSupportFactory::instance() );
+}
+
+void CppSupportPart::updateParserConfiguration()
+{
+ m_backgroundParser->updateParserConfiguration();
+
+ QString conf_file_name = specialHeaderName();
+
+ m_driver->removeAllMacrosInFile( conf_file_name );
+ dynamic_cast<KDevDriver*>(m_driver)->setup();
+ m_driver->parseFile( conf_file_name, true, true, true );
+
+ m_buildSafeFileSetTimer->start( 500, true );
+ parseProject( true );
+}
+
+const Driver* CppSupportPart::driver() const {
+ return m_driver;
+}
+
+Driver* CppSupportPart::driver() {
+ return m_driver;
+}
+
+KDevDesignerIntegration * CppSupportPart::designer( KInterfaceDesigner::DesignerType type )
+{
+ KDevDesignerIntegration * des = 0;
+ switch ( type )
+ {
+ case KInterfaceDesigner::Glade:
+ case KInterfaceDesigner::QtDesigner:
+ des = m_designers[ type ];
+ if ( des == 0 )
+ {
+ CppImplementationWidget * impl = new CppImplementationWidget( this );
+ des = new QtDesignerCppIntegration( this, impl );
+ des->loadSettings( *project() ->projectDom(), "kdevcppsupport/designerintegration" );
+ m_designers[ type ] = des;
+ }
+ break;
+ }
+ return des;
+}
+
+
+void CppSupportPart::resetParserStoreTimer() {
+ // m_deleteParserStoreTimer->start(10000); ///try to empty the store regularly
+}
+
+void CppSupportPart::slotDeleteParserStore() {
+ /* if( !m_backgroundParser->filesInQueue() )
+ m_backgroundParser->removeAllFiles();
+ else
+ resetParserStoreTimer();*/
+}
+
+
+void CppSupportPart::slotCreateSubclass()
+{
+ QFileInfo fi( m_contextFileName );
+ if ( fi.extension( false ) != "ui" )
+ return ;
+ QtDesignerCppIntegration *des = dynamic_cast<QtDesignerCppIntegration*>( designer( KInterfaceDesigner::QtDesigner ) );
+ if ( des )
+ des->selectImplementation( m_contextFileName );
+}
+
+void CppSupportPart::addMethod( ClassDom aClass, const QString& name, const QString type,
+ const QString& parameters, CodeModelItem::Access accessType,
+ bool isConst, bool isInline, bool isVirtual, bool isPureVirtual,
+ const QString& implementation )
+{
+ partController() ->editDocument( KURL( aClass->fileName() ) );
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( partController() ->activePart() );
+ if ( !editIface )
+ {
+ /// @fixme show messagebox
+ return ;
+ }
+ QString declarationString = type + " " + name + "(" + parameters + ")" + ( isConst ? " const" : "" );
+
+ KDevSourceFormatter* sourceFormatter = extension<KDevSourceFormatter>( "KDevelop/SourceFormatter" );
+
+ QString finalDeclaration = ( ( isVirtual || isPureVirtual ) ? "\nvirtual " : "\n" + declarationString +
+ ( isPureVirtual ? " = 0 " : "" ) +
+ ( isInline ? "\n{\n" + implementation + "\n}\n" : ";" ) );
+
+ if ( sourceFormatter != 0 )
+ finalDeclaration = sourceFormatter->formatSource( finalDeclaration );
+
+ QString indentString = "\t";
+
+ if ( sourceFormatter != 0 )
+ indentString = sourceFormatter->indentString();
+
+ editIface->insertText( findInsertionLineMethod( aClass, accessType ), 0,
+ finalDeclaration.replace( "\n", "\n\t" ) + "\n" );
+
+ backgroundParser() ->addFile( aClass->fileName() );
+ if ( isInline || isPureVirtual )
+ return ;
+
+ // construct fully qualified name for method definition
+ QString fullyQualifiedName = aClass->scope().join("::");
+ if (! fullyQualifiedName.isEmpty())
+ {
+ fullyQualifiedName += "::";
+ }
+ fullyQualifiedName += aClass->name() + "::" + name;
+
+ QString definitionString = "\n" + type + " " + fullyQualifiedName + "(" + parameters + ")" + ( isConst ? " const" : "" ) + "\n{\n" + implementation + "\n}\n";
+
+ if ( sourceFormatter != 0 )
+ definitionString = sourceFormatter->formatSource( definitionString );
+
+ QFileInfo info( aClass->fileName() );
+ QString implementationFile = info.dirPath( true ) + "/" + info.baseName() + ".cpp" ;
+ QFileInfo fileInfo( implementationFile );
+ KDevCreateFile* createFileSupport = extension<KDevCreateFile>( "KDevelop/CreateFile" );
+ if ( !QFile::exists( fileInfo.absFilePath() ) && createFileSupport != 0 )
+ createFileSupport->createNewFile( fileInfo.extension(), fileInfo.dirPath( true ), fileInfo.baseName() );
+
+ partController() ->editDocument( KURL( implementationFile ) );
+ editIface = dynamic_cast<KTextEditor::EditInterface*>( partController() ->activePart() );
+ if ( !editIface )
+ return ; //@fixme errorverdoedelung
+
+ editIface->insertLine( editIface->numLines(), QString::fromLatin1( "" ) );
+ editIface->insertText( editIface->numLines() - 1, 0, definitionString );
+ backgroundParser() ->addFile( implementationFile );
+}
+
+ClassDom CppSupportPart::currentClass( ) const
+{
+ FileDom file = codeModel() ->fileByName( m_activeFileName );
+ if ( file == 0 || m_activeViewCursor == 0 )
+ return 0;
+
+ unsigned int curLine, curCol;
+ m_activeViewCursor->cursorPositionReal( &curLine, &curCol );
+
+ CodeModelUtils::CodeModelHelper h( codeModel(), file );
+
+ return h.classAt( curLine, curCol );
+}
+
+VariableDom CppSupportPart::currentAttribute( ClassDom curClass ) const
+{
+ if ( m_activeViewCursor == 0 || curClass == 0 )
+ return 0;
+
+ unsigned int line, col;
+ m_activeViewCursor->cursorPositionReal( &line, &col );
+
+ VariableList vars = curClass->variableList();
+
+ for ( VariableList::iterator i = vars.begin(); i != vars.end(); ++i )
+ {
+ int startLine, startCol;
+ ( *i ) ->getStartPosition( &startLine, &startCol );
+ if ( startLine < (int)line || ( startLine == (int)line && startCol <= (int)col ) )
+ {
+ int endLine, endCol;
+ ( *i ) ->getEndPosition( &endLine, &endCol );
+ if ( endLine > (int)line || ( endLine == (int)line && endCol >= (int)col ) )
+ return * i;
+ }
+ }
+ return 0;
+}
+
+void CppSupportPart::slotCreateAccessMethods( )
+{
+ if ( m_curAttribute == 0 || m_curClass == 0 )
+ return ;
+
+ CreateGetterSetterDialog dlg ( this, m_curClass, m_curAttribute );
+ dlg.exec();
+}
+
+int CppSupportPart::findInsertionLineMethod( ClassDom aClass, CodeModelItem::Access access )
+{
+ int line, column;
+ aClass->getEndPosition( &line, &column );
+
+ int point = CodeModelUtils::findLastMethodLine( aClass, access );
+
+ if ( point == -1 )
+ {
+ KTextEditor::EditInterface * editIface = dynamic_cast<KTextEditor::EditInterface*>( partController() ->activePart() );
+ if ( !editIface )
+ return -1;
+
+ editIface->insertLine( line - 1, CodeModelUtils::accessSpecifierToString( access ) + ":\n" );
+ return line;
+ }
+
+ return point + 1;
+}
+
+int CppSupportPart::findInsertionLineVariable( ClassDom aClass, CodeModelItem::Access access )
+{
+ int line, column;
+ aClass->getEndPosition( &line, &column );
+
+ int point = CodeModelUtils::findLastVariableLine( aClass, access );
+
+ if ( point == -1 )
+ {
+ KTextEditor::EditInterface * editIface = dynamic_cast<KTextEditor::EditInterface*>( partController() ->activePart() );
+ if ( !editIface )
+ return -1;
+
+ editIface->insertLine( line - 1, CodeModelUtils::accessSpecifierToString( access ) + ":\n" );
+ return line;
+ }
+
+ return point;
+}
+
+void CppSupportPart::createAccessMethods( ClassDom theClass, VariableDom theVariable )
+{
+ m_curClass = theClass;
+ m_curAttribute = theVariable;
+
+ slotCreateAccessMethods();
+}
+
+void CppSupportPart::slotCursorMoved()
+{
+ m_cursorMovedTimer->start( 250, true );
+}
+
+void CppSupportPart::slotTextChanged()
+{
+ setTyping( true ); ///@todo check if this is really needed
+
+ if ( m_backgroundParserConfig->useBackgroundParser() )
+ {
+ m_textChangedTimer->start( m_backgroundParserConfig->backgroudParseDelay(), true );
+ }
+}
+
+void CppSupportPart::slotParseCurrentFile()
+{
+ if( isValid() && !isQueued( m_activeFileName ) )
+ {
+ parseFileAndDependencies( m_activeFileName, true, true );
+ }
+}
+
+void CppSupportPart::updateBackgroundParserConfig()
+{
+ BackgroundParserConfig config;
+ config.readConfig();
+
+ if ( m_backgroundParserConfig->useProblemReporter() && !config.useProblemReporter() )
+ {
+ removeProblemReporter();
+ }
+ else if ( !m_backgroundParserConfig->useProblemReporter() && config.useProblemReporter() )
+ {
+ embedProblemReporter( true );
+ }
+
+ *m_backgroundParserConfig = config;
+}
+
+const SynchronizedFileSet& CppSupportPart::safeFileSet() const {
+ return m_safeProjectFiles;
+}
+
+SynchronizedFileSet& CppSupportPart::safeFileSet() {
+ return m_safeProjectFiles;
+}
+
+void CppSupportPart::buildSafeFileSet() {
+ if( codeCompletion() == 0 ) //probably the project has already been closed
+ return;
+ SynchronizedFileSet::SetType files; //everything that goes into this set must be deep-copied
+
+ kdDebug( 9007 ) << "CppSupportPart:: rebuilding safe-file-set" << endl;
+ for( QStringList::const_iterator it = m_projectFileList.begin(); it != m_projectFileList.end(); ++it ) {
+ QFileInfo fi( *it );
+ QString file = *it;
+ if( fi.isRelative() ) {
+ fi.setFile( QDir(m_projectDirectory), *it );
+ file = fi.absFilePath();
+ }
+
+ //deep-copy
+ files.insert( QString::fromUtf8(file.utf8()) );
+ }
+
+ ///Now get all translation-units from the code-repository
+ QValueList<Catalog::QueryArgument> args;
+
+ args << Catalog::QueryArgument( "kind", Tag::Kind_TranslationUnit );
+
+ QValueList<Tag> tags( codeCompletion()->repository()->query( args ) );
+
+ for( QValueList<Tag>::const_iterator it = tags.begin(); it != tags.end(); ++it ) {
+ files.insert( (*it).fileName() + "||" + (*it).attribute("macroValueHash").toString() + "||" + (*it).attribute("macroIdHash").toString() );
+ }
+ m_safeProjectFiles.setFiles( files );
+}
+
+void CppSupportPart::addToRepository( ParsedFilePointer file ) {
+ QString catalogString( "automatic_" + KURL::encode_string_no_slash(m_projectDirectory) );
+
+ KStandardDirs *dirs = CppSupportFactory::instance() ->dirs();
+
+ QString dbName = dirs->saveLocation( "data", "kdevcppsupport/pcs" ) + catalogString + ".db";
+
+ Catalog* catalog = 0;
+ ///First check if the catalog is already there
+ QValueList<Catalog*> catalogs = codeRepository()->registeredCatalogs();
+ for( QValueList<Catalog*>::const_iterator it = catalogs.begin(); it != catalogs.end(); ++it ) {
+ if( (*it)->dbName() == dbName ) {
+ catalog = *it;
+ break;
+ }
+ }
+
+ if( !catalog ) {
+ kdDebug( 9007 ) << "creating new catalog named " << catalogString << " for automatic filling" << endl;
+ //QStringList indexList = QStringList() << "kind" << "name" << "scope" << "fileName" << "prefix";
+ catalog = new Catalog;
+ catalog->open( dbName );
+ catalog->addIndex( "kind" );
+ catalog->addIndex( "name" );
+ catalog->addIndex( "scope" );
+ catalog->addIndex( "prefix" );
+ catalog->addIndex( "fileName" );
+ /*
+ for ( QStringList::Iterator idxIt = indexList.begin(); idxIt != indexList.end(); ++idxIt )
+ catalog->addIndex( ( *idxIt ).utf8() );*/
+ addCatalog( catalog );
+ }
+ catalog->setEnabled( true );
+
+ ///Now check if the file was already parsed with the same parameters, if yes don't parse again(auto-update is currently not supported, when major changes have been done in the libraries, the repository should be deleted)
+ QValueList<Catalog::QueryArgument> args;
+
+ bool compatibleParsed = false;
+ Tag compatibleParsedTag;
+
+ args << Catalog::QueryArgument( "kind", Tag::Kind_TranslationUnit );
+ args << Catalog::QueryArgument( "fileName", file->fileName() );
+ QValueList<Tag> tags( catalog->query( args ) );
+ if( !tags.isEmpty() ) {
+ for( QValueList<Tag>::const_iterator it = tags.begin(); it != tags.end(); ++it ) {
+ if( (*it).hasAttribute( "cppparsedfile" ) ) {
+ QVariant v = (*it).attribute( "cppparsedfile" );
+ ///@todo reenable this
+ /*QByteArray b = v.toByteArray();
+ if( !b.isEmpty() ) {
+ //Would be much more efficient not to do this deserialization
+ ParsedFile f(b);
+ if( f.usedMacros().valueHash() == file->usedMacros().valueHash() && f.usedMacros().idHash() == file->usedMacros().idHash() && f.includeFiles().hash() == file->includeFiles().hash() ) {
+ ///Do not reparse the file, it seems to already be in the repository in a similar state
+ if( (*it).attribute( "includedFrom" ).toString() == file->includedFrom() ) return;
+
+ ///It is probable that the same state has already been parsed, but there seems to be no such tag yet(the tag will be added)
+ compatibleParsed = true;
+ compatibleParsedTag = *it;
+ break;
+ }
+ }*/
+ }
+ }
+ }
+
+ if( compatibleParsed ) {
+ ///Add a Tag that makes sure that the file will not be parsed again
+ compatibleParsedTag.setAttribute( "includedFrom", file->includedFrom() );
+ QByteArray data;
+ QDataStream s( data, IO_WriteOnly );
+ file->write( s );
+ compatibleParsedTag.setAttribute( "cppparsedfile", data );
+ catalog->addItem( compatibleParsedTag );
+ return;
+ }
+
+ kdDebug( 9007 ) << "parsing translation-unit " << file->fileName() << " into catalog " << catalogString << endl;
+ TagCreator w( file->fileName(), catalog );
+ w.parseTranslationUnit( *file );
+ codeRepository()->touchCatalog( catalog );
+
+ m_safeProjectFiles.insert( file->fileName() + "||" + QString("%1").arg(file->usedMacros().valueHash()) + "||" + QString("%1").arg(file->usedMacros().idHash()) );
+}
+
+QString CppSupportPart::findHeaderSimple( const QString &header )
+{
+ QStringList::ConstIterator it;
+ for ( it = m_projectFileList.begin(); it != m_projectFileList.end(); ++it )
+ {
+ QString s = *it;
+ if (s == header)
+ return s;
+ if ( ( s.right( header.length() ) == header ) && ( s[s.length() - header.length() - 1] == '/' ) )
+ return s;
+ }
+
+ return QString::null;
+}
+
+UIBlockTester::UIBlockTesterThread::UIBlockTesterThread( UIBlockTester& parent ) : QThread(), m_parent( parent ), m_stop(false) {
+}
+
+void UIBlockTester::UIBlockTesterThread::run() {
+ while(!m_stop) {
+ msleep( m_parent.m_msecs / 10 );
+ m_parent.m_timeMutex.lock();
+ QDateTime t = QDateTime::currentDateTime();
+ uint msecs = m_parent.m_lastTime.time().msecsTo( t.time() );
+ if( msecs > m_parent.m_msecs ) {
+ m_parent.lockup();
+ m_parent.m_lastTime = t;
+ }
+ m_parent.m_timeMutex.unlock();
+ }
+}
+
+void UIBlockTester::UIBlockTesterThread::stop() {
+ m_stop = true;
+}
+
+UIBlockTester::UIBlockTester( uint milliseconds ) : m_thread( *this ), m_msecs( milliseconds ) {
+ m_timer = new QTimer( this );
+ m_timer->start( milliseconds/10 );
+ connect( m_timer, SIGNAL(timeout()), this, SLOT(timer()) );
+ timer();
+ m_thread.start();
+}
+UIBlockTester::~UIBlockTester() {
+ m_thread.stop();
+ m_thread.wait();
+}
+
+void UIBlockTester::timer() {
+ m_timeMutex.lock();
+ m_lastTime = QDateTime::currentDateTime();
+ m_timeMutex.unlock();
+}
+
+void UIBlockTester::lockup() {
+ //std::cout << "UIBlockTester: lockup of the UI for " << m_msecs << endl; ///kdDebug(..) is not thread-safe..
+ int a = 1; ///Place breakpoint here
+}
+
+#include "cppsupportpart.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
+
diff --git a/languages/cpp/cppsupportpart.h b/languages/cpp/cppsupportpart.h
new file mode 100644
index 00000000..e01d5115
--- /dev/null
+++ b/languages/cpp/cppsupportpart.h
@@ -0,0 +1,661 @@
+/***************************************************************************
+* Copyright (C) 1999 by Jonas Nordin *
+* jonas.nordin@syncom.se *
+* Copyright (C) 2000-2001 by Bernd Gehrmann *
+* bernd@kdevelop.org *
+* Copyright (C) 2002-2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* Copyright (C) 2003-2004 by Alexander Dymo *
+* adymo@mksat.net *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef _CPPSUPPORTPART_H_
+#define _CPPSUPPORTPART_H_
+
+#include <kdevcore.h>
+#include <kdevlanguagesupport.h>
+
+#include <qthread.h>
+#include <qmutex.h>
+#include <qtimer.h>
+#include <kdialogbase.h>
+#include <qguardedptr.h>
+#include <qstring.h>
+#include <qwaitcondition.h>
+#include <qdatetime.h>
+#include <qdir.h>
+#include <qprogressbar.h>
+#include <kdebug.h>
+#include <ext/hash_map>
+#include "driver.h"
+
+
+///A class that helps detecting what exactly makes the UI block. To use it, just place a breakpoint on UIBlockTester::lockup() and inspect the execution-position of the main thread
+class UIBlockTester : public QObject {
+ Q_OBJECT
+ class UIBlockTesterThread : public QThread {
+ public:
+ UIBlockTesterThread( UIBlockTester& parent );
+ void run();
+ void stop();
+ private:
+ UIBlockTester& m_parent;
+ bool m_stop;
+ };
+ friend class UIBlockTesterThread;
+public:
+
+ ///@param milliseconds when the ui locks for .. milliseconds, lockup() is called
+ UIBlockTester( uint milliseconds );
+ ~UIBlockTester();
+
+private slots:
+ void timer();
+
+protected:
+ virtual void lockup();
+
+private:
+ UIBlockTesterThread m_thread;
+ QDateTime m_lastTime;
+ QMutex m_timeMutex;
+ QTimer * m_timer;
+ uint m_msecs;
+};
+
+class Context;
+class CppCodeCompletion;
+class CppCodeCompletionConfig;
+class CppSplitHeaderSourceConfig;
+class CreateGetterSetterConfiguration;
+class QtBuildConfig;
+class ProblemReporter;
+class BackgroundParser;
+class Catalog;
+class QLabel;
+class QProgressBar;
+class QStringList;
+class QListViewItem;
+class TranslationUnitAST;
+class QTimer;
+class KListView;
+class Driver;
+class KPopupMenu;
+class BackgroundParserConfig;
+class KAction;
+
+namespace KParts
+{
+ class Part;
+}
+namespace KTextEditor
+{
+ class Document;
+ class View;
+ class EditInterface;
+ class SelectionInterface;
+ class ViewCursorInterface;
+}
+
+
+class SynchronizedFileSet
+{
+public:
+ typedef __gnu_cxx::hash_set< HashedString > SetType;
+ SynchronizedFileSet()
+ {}
+
+ bool isEmpty() const
+ {
+ QMutexLocker locker( &m_mutex );
+ return m_fileSet.empty();
+ }
+
+ uint count() const
+ {
+ QMutexLocker locker( &m_mutex );
+ return m_fileSet.size();
+ }
+
+ void clear()
+ {
+ QMutexLocker locker( &m_mutex );
+ m_fileSet.clear();
+ }
+
+ void setFiles( const SetType& files ) {
+ QMutexLocker locker( &m_mutex );
+ m_fileSet = files;
+ }
+
+ void insert( const HashedString& str )
+ {
+ HashedString s( QString::fromUtf8(str.str().utf8()) );
+ QMutexLocker locker( &m_mutex );
+
+ m_fileSet.insert( s );
+ }
+
+ bool contains( const HashedString& str ) const {
+ QMutexLocker locker( &m_mutex );
+ return m_fileSet.find( str ) != m_fileSet.end();
+ }
+
+private:
+ mutable QMutex m_mutex;
+ SetType m_fileSet;
+};
+
+class CppSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+ CppSupportPart( QObject *parent, const char *name, const QStringList &args );
+ virtual ~CppSupportPart();
+
+ bool isValid() const
+ {
+ return m_valid;
+ }
+
+ QString specialHeaderName( bool local = false ) const;
+ void updateParserConfiguration();
+ void updateBackgroundParserConfig();
+
+ // @fixme - isValid is used to avoid using the problem reporter
+ // when a project is first parsed. This because the problem reporter
+ // is currently a great slowdown for large projects (see bug #73671)
+ ProblemReporter* problemReporter() const
+ {
+ return isValid() ? static_cast<ProblemReporter *>( m_problemReporter ) : 0;
+ }
+
+ /** parses the file and all files that belong to it using the background-parser */
+ int parseFileAndDependencies( const QString& fileName, bool background = true, bool parseFirst = false, bool silent = false );
+ int parseFilesAndDependencies( QStringList files, bool background = true, bool parseFirst = false, bool silent = false );
+
+ BackgroundParser* backgroundParser() const
+ {
+ return m_backgroundParser;
+ }
+ CppCodeCompletion* codeCompletion() const
+ {
+ return m_pCompletion;
+ }
+ CppCodeCompletionConfig* codeCompletionConfig() const
+ {
+ return m_pCompletionConfig;
+ }
+ CppSplitHeaderSourceConfig* splitHeaderSourceConfig() const
+ {
+ return m_pSplitHeaderSourceConfig;
+ }
+ CreateGetterSetterConfiguration* createGetterSetterConfiguration() const
+ {
+ return m_pCreateGetterSetterConfiguration;
+ }
+
+ /**
+ Get a pointer to the QtBuildConfig object
+ @return A pointer to the QtBuildConfig object.
+ */
+ inline QtBuildConfig* qtBuildConfig() const { return m_qtBuildConfig; }
+
+ const QPtrList<Catalog>& catalogList() const
+ {
+ return m_catalogList;
+ }
+ void addCatalog( Catalog* catalog );
+ void removeCatalog( const QString& dbName );
+
+ bool isValidSource( const QString& fileName ) const;
+
+ virtual void customEvent( QCustomEvent* ev );
+
+ virtual QStringList subclassWidget( const QString& formName );
+ virtual QStringList updateWidget( const QString& formName, const QString& fileName );
+
+ FunctionDefinitionDom currentFunctionDefinition();
+ FunctionDefinitionDom functionDefinitionAt( int line, int column );
+
+
+ KTextEditor::Document* findDocument( const KURL& url );
+ static KConfig *config();
+
+ virtual QString formatTag( const Tag& tag );
+ virtual QString formatModelItem( const CodeModelItem *item, bool shortDescription = false );
+ virtual void addClass();
+
+ QString extractInterface( const ClassDom& klass );
+
+ bool isHeader( const QString& fileName ) const;
+ bool isSource( const QString& fileName ) const;
+
+ //uses the old simple algorithm to find the header
+ QString findHeaderSimple( const QString &header );
+
+ virtual KDevDesignerIntegration *designer( KInterfaceDesigner::DesignerType type );
+
+ void setTyping( bool typing );
+
+ /**
+ * Add a new method to a class.
+ * @param aClass The class to which the method should be added.
+ * @param name The name of the method.
+ * @param type The return type of the method.
+ * @param parameters A string containing the parameters
+ * (including names, default values, but no '(' , ')', e.g.: "int, const QString& aString").
+ * @param accessType The access specifier e.g. CodeModelItem::PUBLIC.
+ * @param isConst true if method is const.
+ * @param isInline true if method should be declared inline.
+ * @param isVirtual true if method is virtual(this is ignored if isPureVirtual is true)
+ * @param isPureVirtual true if method is pure virtual (this overrides any value of isVirtual)
+ * @param implementation a optional implementation, if this is not set the method body will be empty.
+ * @author Jonas Jacobi <j.jacobi@gmx.de>
+ */
+ virtual void addMethod( ClassDom aClass, const QString& name, const QString type, const QString& parameters, CodeModelItem::Access accessType, bool isConst, bool isInline, bool isVirtual, bool isPureVirtual, const QString& implementation = "" );
+
+ void createAccessMethods( ClassDom theClass, VariableDom theVariable );
+
+ bool isQueued( const QString& file ) const;
+ bool switchHeaderImpl( const QString& file, int line, int col, bool scrollOnly = false );
+
+ const Driver* driver() const;
+
+ Driver* driver();
+
+ ///thread-safe, returns the thread-safe set of all files that do not need to be parsed when being included, either because they are part of the project and parsed anyway, or because they are already in the code-repository
+ const SynchronizedFileSet& safeFileSet() const;
+ SynchronizedFileSet& safeFileSet();
+signals:
+ void fileParsed( const QString& fileName );
+ ///Emitted whenever a file was parsed, but the code-model could be updated(the file in the code-model did not have to be replaced)
+ void codeModelUpdated( const QString& fileName );
+ ///Emitted whenever a translation-unit was parsed in the main thread
+ void synchronousParseReady( const QString& file, ParsedFilePointer unit );
+
+protected:
+ virtual KDevLanguageSupport::Features features();
+ virtual KMimeType::List mimeTypes();
+ virtual QString formatClassName( const QString &name );
+ virtual QString unformatClassName( const QString &name );
+ virtual bool shouldSplitDocument( const KURL &url );
+ virtual Qt::Orientation splitOrientation() const;
+ virtual void addMethod( ClassDom klass );
+ virtual void addAttribute( ClassDom klass );
+
+private slots:
+ void activePartChanged( KParts::Part *part );
+ void partRemoved( KParts::Part* part );
+ void projectOpened();
+ void projectClosed();
+ void savedFile( const KURL &fileName );
+ void configWidget( KDialogBase *dlg );
+ void projectConfigWidget( KDialogBase *dlg );
+ void contextMenu( QPopupMenu *popup, const Context *context );
+ void addedFilesToProject( const QStringList &fileList );
+ void removedFilesFromProject( const QStringList &fileList );
+ void changedFilesInProject( const QStringList & fileList );
+ void slotProjectCompiled();
+ void setupCatalog();
+ void codeCompletionConfigStored();
+ void splitHeaderSourceConfigStored();
+ // void recomputeCodeModel( const QString& fileName );
+ void slotNavigate();
+ void slotNewClass();
+ void slotSwitchHeader( bool scrollOnly = false );
+ void slotCompleteText();
+ void slotMakeMember();
+ void slotExtractInterface();
+ void slotCursorPositionChanged();
+// void slotFunctionHint();
+ void gotoLine( int line );
+ void gotoDeclarationLine( int line );
+ void emitFileParsed( QStringList l );
+ void slotParseFiles();
+ void slotCreateSubclass();
+ void slotCreateAccessMethods();
+ void slotDeleteParserStore();
+ void slotSaveMemory();
+ void slotTextChanged();
+ void slotCursorMoved();
+ void slotParseCurrentFile();
+ void embedProblemReporter( bool force = false );
+ void removeProblemReporter();
+
+
+ void slotNeedTextHint( int, int, QString& );
+
+ /**
+ * loads, parses and creates both classstores needed
+ */
+ void initialParse( );
+
+ /**
+ * only parses the current project
+ */
+ bool parseProject( bool force = false );
+
+private:
+
+ void resetParserStoreTimer();
+ /**
+ * Get a linenumber in which a new method with a specific access specifier can be inserted.
+ * If there isn't a "section" with access, such a "section" gets inserted and the resulting place is returned.
+ * @param aClass the class one wants to insert a method to.
+ * @param access the access specifier the new method should have.
+ * @return A linenumber where the new method can be inserted
+ * or -1 if partController()->activePart() is no KTextEditorInterface.
+ * @author Jonas Jacobi <j.jacobi@gmx.de>
+ */
+ int findInsertionLineMethod( ClassDom aClass, CodeModelItem::Access access );
+ /**
+ * Same as above, just returns a insertion line for a variable instead of a method
+ */
+ int findInsertionLineVariable( ClassDom aClass, CodeModelItem::Access access );
+
+
+ /**
+ * Get a class declaration which is "around" the current cursor position.
+ * @return The class declaration which is "around" the current cursor position,
+ * in the case of nested classes this is the innermost fitting class. If there is no
+ * class declared at the current cursor position, 0 is returned.
+ * @author Jonas Jacobi <j.jacobi@gmx.de>
+ */
+ ClassDom currentClass() const;
+ /**
+ * Get the class attribute of curClass, which is declared at the current cursor position.
+ * @param curClass the class to search for attributes.
+ * @return the attribute declared at the current cursor position or 0, if no attribute is declared there.
+ * @author Jonas Jacobi <j.jacobi@gmx.de>
+ */
+ VariableDom currentAttribute( ClassDom curClass ) const;
+
+ /**
+ * checks if a file has to be parsed
+ */
+ FileDom fileByName( const QString& name);
+ void maybeParse( const QString& fileName, bool background = true );
+ void removeWithReferences( const QString& fileName );
+ void createIgnorePCSFile();
+
+ void MakeMemberHelper( QString& text, int& atline, int& atcol );
+
+ QString sourceOrHeaderCandidate( const KURL &url = KURL() );
+
+ FunctionDom findFunction( const FunctionDom& def );
+ FunctionDom findFunctionInNamespace( const NamespaceDom& ns, const FunctionDom& def, const std::set<NamespaceImportModel>& nsImports,
+ const QString& candidateFile, int scopeIndex, FunctionDom& bestMatch );
+ FunctionDom findFunctionInClass( const ClassDom& cs, const FunctionDom& def, const std::set<NamespaceImportModel>& nsImports,
+ const QString& candidateFile, int scopeIndex, FunctionDom& bestMatch );
+ FunctionDom findFunctionDefinition( const FunctionDom& decl );
+
+ void jumpToCodeModelItem( const ItemDom& item, bool scrollOnly );
+
+ QStringList modifiedFileList();
+ QString findSourceFile();
+ int pcsVersion();
+ void setPcsVersion( int version );
+
+ void saveProjectSourceInfo();
+ QStringList reorder( const QStringList& list );
+
+ CppCodeCompletion* m_pCompletion;
+ CppCodeCompletionConfig* m_pCompletionConfig;
+ CppSplitHeaderSourceConfig* m_pSplitHeaderSourceConfig;
+
+ CreateGetterSetterConfiguration* m_pCreateGetterSetterConfiguration;
+ KAction * m_createGetterSetterAction;
+ KAction * m_switchHeaderSourceAction;
+
+ QtBuildConfig* m_qtBuildConfig;
+
+ bool withcpp;
+ QString m_contextFileName;
+
+ VariableDom m_curAttribute;
+ ClassDom m_curClass;
+ QGuardedPtr< ProblemReporter > m_problemReporter;
+ BackgroundParser* m_backgroundParser;
+ UIBlockTester* m_lockupTester;
+
+ KTextEditor::Document* m_activeDocument;
+ KTextEditor::View* m_activeView;
+ KTextEditor::SelectionInterface* m_activeSelection;
+ KTextEditor::EditInterface* m_activeEditor;
+ KTextEditor::ViewCursorInterface* m_activeViewCursor;
+ QString m_activeFileName;
+
+ QMap<KInterfaceDesigner::DesignerType, KDevDesignerIntegration*> m_designers;
+
+ QWaitCondition m_eventConsumed;
+ bool m_projectClosed;
+ bool m_projectClosing;
+
+ QMap<QString, QDateTime> m_timestamp;
+ bool m_valid;
+ bool m_isTyping;
+ bool m_hadErrors; ///Whether there were already errors when the user started typing
+
+ QPtrList<Catalog> m_catalogList;
+ Driver* m_driver;
+ QString m_projectDirectory;
+ QStringList m_projectFileList;
+
+ ClassDom m_activeClass;
+ FunctionDom m_activeFunction;
+ VariableDom m_activeVariable;
+
+ QGuardedPtr<KPopupMenu> m_navigationMenu;
+
+// QTimer* m_functionHintTimer;
+// QTimer* m_deleteParserStoreTimer;
+ QTimer* m_saveMemoryTimer;
+ QTimer * m_textChangedTimer;
+ QTimer * m_cursorMovedTimer;
+ QTimer* m_buildSafeFileSetTimer;
+
+ class ParseEmitWaiting {
+ public:
+ enum Flags {
+ None = 0,
+ HadErrors = 1,
+ HadQueueProblem = 2,
+ Silent = 4
+ };
+ private:
+ struct Item {
+ QStringList first;
+ QStringList second;
+ Flags flags;
+ Item() : flags(None) {
+ }
+ Item( QStringList f, QStringList s, Flags fl = None ) : first( f ), second( s ), flags( fl )
+ {
+ }
+ };
+ //typedef QPair<QStringList, QStringList> Item; ///The files we are waiting fore, and the files we already got
+ typedef QValueList< Item > List;
+ List m_waiting;
+
+
+ QStringList harvestUntil( List::iterator targIt ) {
+ List::iterator it = m_waiting.begin();
+ QStringList ret;
+ while( it != targIt && it != m_waiting.end() ) {
+ ret += (*it).first;
+ it = m_waiting.erase( it );
+ }
+ return ret;
+ }
+
+ public:
+ void addGroup( QStringList& files, Flags flag = None ) {
+ m_waiting << Item(files, QStringList(), flag);
+ }
+ void addGroupFront( QStringList& files, Flags flag = None ) {
+ m_waiting.push_front( Item(files, QStringList(), flag) );
+ }
+ void clear() {
+ m_waiting.clear();
+ }
+
+ ///files that were not requested must not be processed, since they maybe do not respect the group-relationships.
+ bool reject( QString file ) {
+ for( List::iterator it = m_waiting.begin(); it != m_waiting.end(); ++it) {
+ if( (*it).first.find( file ) != (*it).first.end() ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ bool waiting( QString file, Flags forbidFlags = None, int count = 1 ) const {
+ int hits = 0;
+ for( List::const_iterator it = m_waiting.begin(); it != m_waiting.end(); ++it) {
+ if( (*it).first.find( file ) != (*it).first.end() ) {
+ if( ((Flags)((*it).flags & forbidFlags )) == None ) {
+ hits++;
+ if( hits >= count ) return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ struct Processed {
+ QStringList res;
+ Flags flag;
+ Processed() : flag(None) {
+ }
+ Processed(const QStringList& l , Flags f = None ) : res( l ), flag( f ) {
+ }
+ operator QStringList() {
+ return res;
+ }
+
+ bool hadQueueProblem() {
+ return flag & HadQueueProblem;
+ }
+
+ bool hasFlag( Flags f ) const {
+ return f & flag;
+ }
+ // surely a copy paste implementation?
+/*
+ bool hasFlag( Flags flag ) const {
+ return flag & HadQueueProblem;
+ }
+*/
+ };
+
+
+ private:
+ ///Just return all files that have been parsed
+ Processed errorRecover( QString currentFile ) {
+ QStringList ret;
+ kdDebug( 9007 ) << "ParseEmitWaiting: error in the waiting-chain" << endl;
+ for( List::iterator it = m_waiting.begin(); it != m_waiting.end(); ++it) {
+ ret += (*it).second;
+ }
+ if( !currentFile.isEmpty() ) ret << currentFile;
+ m_waiting.clear();
+ return Processed( ret, HadQueueProblem );
+ }
+ public:
+
+ ///returns the parsed-messages that should be emitted
+ Processed processFile( QString file, Flags flag = None ) {
+ QStringList ret;
+ for( List::iterator it = m_waiting.begin(); it != m_waiting.end(); ++it) {
+ if( (*it).first.find( file ) != (*it).first.end() ) {
+ if( (*it).second.find( file ) == (*it).second.end() ) {
+ (*it).flags = (Flags) ((*it).flags | flag);
+ (*it).second << file;
+ if( (*it).second.count() == (*it).first.count() ) {
+ Flags f = (*it).flags;
+ if( it != m_waiting.begin() ) {
+ kdDebug( 9007 ) << "ParseEmitWaiting: the chain has multiple groups waiting, they are flushed" << endl;
+ f = (Flags)(f | HadQueueProblem);
+ }
+ return Processed( harvestUntil( ++it ), f );
+ } else {
+ ///The file was registered, now wait for the next
+ return QStringList();
+ }
+ } else {
+ ///The file has already been parsed
+ kdDebug( 9007 ) << "ParseEmitWaiting: file has been parsed twice" << endl;
+ return errorRecover( file );
+ }
+ }
+ }
+
+ kdDebug( 9007 ) << "ParseEmitWaiting: file \"" << file << "\" has no group waiting for it" << endl;
+ ret << file;
+ return Processed( ret, HadQueueProblem );
+ }
+ };
+
+ ParseEmitWaiting m_parseEmitWaiting;
+ ParseEmitWaiting m_fileParsedEmitWaiting;
+
+private slots:
+ void parseEmit( ParseEmitWaiting::Processed files );
+ void buildSafeFileSet();
+private:
+
+ SynchronizedFileSet m_safeProjectFiles;
+ BackgroundParserConfig * m_backgroundParserConfig;
+
+ static QStringList m_sourceMimeTypes;
+ static QStringList m_headerMimeTypes;
+
+ static QStringList m_sourceExtensions;
+ static QStringList m_headerExtensions;
+
+ friend class KDevCppSupportIface;
+ friend class CppDriver;
+
+ // we need something to plug actions that are not in any menu
+ // into in order for their shortcuts to work
+ QWidget m_DummyActionWidget;
+
+ void addToRepository( ParsedFilePointer );
+ void emitSynchronousParseReady( const QString& file, ParsedFilePointer unit );
+
+ struct JobData
+ {
+ QDir dir;
+ QGuardedPtr<QProgressBar> progressBar;
+ QStringList::Iterator it;
+ QStringList files;
+ int cycle;
+ int backgroundCount;
+ int lastBackgroundState;
+ int backgroundState;
+ QStringList reparseList;
+ QMap< QString, QPair<uint, uint> > pcs;
+ QDataStream stream;
+ QFile file;
+ QTime lastParse;
+
+ ~JobData()
+ {
+ delete progressBar;
+ }
+ };
+
+ JobData * _jd;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/cpptemplates b/languages/cpp/cpptemplates
new file mode 100644
index 00000000..e55181c0
--- /dev/null
+++ b/languages/cpp/cpptemplates
@@ -0,0 +1,22 @@
+<!DOCTYPE Templates>
+<Templates>
+ <Template code="if( | ){
+} else {
+}" name="ife" description="if else" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+ <Template code="private|" name="pr" description="private" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+ <Template code="while( | ){
+}" name="whileb" description="while statement" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+ <Template code="public|" name="pu" description="public" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+ <Template code="switch( | ){
+}" name="switchb" description="switch statement" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+ <Template code="protected|" name="pro" description="protected" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+ <Template code="for( |; ; ){
+}" name="forb" description="for statement" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+ <Template code="class | {
+public:
+};" name="classd" description="class declaration" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+ <Template code="struct | {
+};" name="structd" description="struct declaration" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+ <Template code="if( | ){
+}" name="ifb" description="if statement" suffixes="C++ (h,H,hh,hxx,hpp,inl,tlh,c,C,cc,cpp,c++,cxx,m,mm,M)"/>
+</Templates>
diff --git a/languages/cpp/creategettersetter.ui b/languages/cpp/creategettersetter.ui
new file mode 100644
index 00000000..0796d4fb
--- /dev/null
+++ b/languages/cpp/creategettersetter.ui
@@ -0,0 +1,232 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>CreateGetterSetterDialogBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CreateGetterSetterDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>428</width>
+ <height>105</height>
+ </rect>
+ </property>
+ <property name="modal">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>61</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="0" column="5">
+ <property name="name">
+ <cstring>m_chkInlineGet</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;inline</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>create an inline get method</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this is checked the get method will be created inline; otherwise, it will not.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>m_chkGet</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;get method</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>create get method</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this is checked a getter method will be created.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>m_chkSet</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;set method</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>create set method</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this is checked a set method will be created</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>m_edtGet</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>name of the get method</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The name of the created get method</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>m_edtSet</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>name of the set method</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The name of the created set method</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="5">
+ <property name="name">
+ <cstring>m_chkInlineSet</cstring>
+ </property>
+ <property name="text">
+ <string>i&amp;nline</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>create an inline set method</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this is checked the set method will be created inline; otherwise, it will not.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton" row="2" column="4" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_btnCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="2" column="3">
+ <property name="name">
+ <cstring>m_btnOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_chkGet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_edtGet</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_chkSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_edtSet</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_btnOk</sender>
+ <signal>clicked()</signal>
+ <receiver>CreateGetterSetterDialogBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>m_btnCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>CreateGetterSetterDialogBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>m_chkGet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_chkInlineGet</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_chkSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_chkInlineSet</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_chkInlineGet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CreateGetterSetterDialogBase</receiver>
+ <slot>slotInlineChanged()</slot>
+ </connection>
+ <connection>
+ <sender>m_chkInlineSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CreateGetterSetterDialogBase</receiver>
+ <slot>slotInlineChanged()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>m_chkGet</tabstop>
+ <tabstop>m_edtGet</tabstop>
+ <tabstop>m_chkSet</tabstop>
+ <tabstop>m_edtSet</tabstop>
+ <tabstop>m_btnCancel</tabstop>
+ <tabstop>m_btnOk</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">slotInlineChanged()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/creategettersetterconfiguration.cpp b/languages/cpp/creategettersetterconfiguration.cpp
new file mode 100644
index 00000000..5b64290f
--- /dev/null
+++ b/languages/cpp/creategettersetterconfiguration.cpp
@@ -0,0 +1,62 @@
+//
+// C++ Implementation: %{MODULE}
+//
+// Description:
+//
+//
+// Author: %{AUTHOR} <%{EMAIL}>, (C) %{YEAR}
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "creategettersetterconfiguration.h"
+
+#include "cppsupportpart.h"
+
+#include <domutil.h>
+
+#include <qdom.h>
+#include <kmessagebox.h>
+QString CreateGetterSetterConfiguration::defaultPath = QString::fromLatin1( "/kdevcppsupport/creategettersetter" );
+
+CreateGetterSetterConfiguration::CreateGetterSetterConfiguration( CppSupportPart * part )
+: QObject(part), m_part(part), m_settings(0)
+{
+ init();
+}
+
+
+CreateGetterSetterConfiguration::~CreateGetterSetterConfiguration()
+{
+}
+
+void CreateGetterSetterConfiguration::init( )
+{
+ m_settings = m_part->projectDom();
+ if (m_settings == 0)
+ return;
+
+ m_prefixGet = DomUtil::readEntry( *m_settings, defaultPath + "/prefixGet", "" );
+ m_prefixSet = DomUtil::readEntry( *m_settings, defaultPath + "/prefixSet", "set" );
+ m_prefixVariable = QStringList::split(",", DomUtil::readEntry( *m_settings, defaultPath + "/prefixVariable", "m_,_" ));
+ m_parameterName = DomUtil::readEntry( *m_settings, defaultPath + "/parameterName", "theValue" );
+ m_isInlineGet = DomUtil::readBoolEntry(*m_settings, defaultPath + "/inlineGet", true );
+ m_isInlineSet = DomUtil::readBoolEntry(*m_settings, defaultPath + "/inlineSet", true );
+}
+
+void CreateGetterSetterConfiguration::store( )
+{
+ if (m_settings == 0)
+ return;
+
+ DomUtil::writeEntry( *m_settings, defaultPath + "/prefixGet", m_prefixGet );
+ DomUtil::writeEntry( *m_settings, defaultPath + "/prefixSet", m_prefixSet );
+ DomUtil::writeEntry( *m_settings, defaultPath + "/prefixVariable", m_prefixVariable.join(",") );
+ DomUtil::writeEntry( *m_settings, defaultPath + "/parameterName", m_parameterName );
+ DomUtil::writeBoolEntry(*m_settings, defaultPath + "/inlineGet", m_isInlineGet );
+ DomUtil::writeBoolEntry(*m_settings, defaultPath + "/inlineSet", m_isInlineSet );
+}
+
+#include "creategettersetterconfiguration.moc"
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/creategettersetterconfiguration.h b/languages/cpp/creategettersetterconfiguration.h
new file mode 100644
index 00000000..e11a45ee
--- /dev/null
+++ b/languages/cpp/creategettersetterconfiguration.h
@@ -0,0 +1,117 @@
+//
+// C++ Interface: creategettersetterconfiguration
+//
+// Description:
+//
+//
+// Author: Jonas Jacobi <j.jacobi@gmx.de>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef CREATEGETTERSETTERCONFIGURATION_H
+#define CREATEGETTERSETTERCONFIGURATION_H
+
+#include <qobject.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+class CppSupportPart;
+class QDomDocument;
+
+/**
+ * Class containing the settings for the creation of get/set methods for class attributes.
+ * It contains several attributes:
+ * - prefixGet is the prefix which is put in front of the attributename for the getmethod.
+ * - prefixSet is the prefix which is put in front of the attributename for the setmethod.
+ * - prefixVariable is a StringList containing prefixes which should be removed from the attributename
+ * when creating the get/set method names
+ * - parameterName is the name of the parameter containing the value in the setmethod.
+ * - inlineGet true if getmethod should be created inline, false otherwise
+ * - inlineSet true if setmethod should be created inline, false otherwise
+ *
+ * The settings are stored per project under /kdevcppsupport/creategettersetter/.
+ * @author Jonas Jacobi <j.jacobi@gmx.de>
+ */
+class CreateGetterSetterConfiguration : public QObject{
+Q_OBJECT
+public:
+ CreateGetterSetterConfiguration(CppSupportPart* part);
+ ~CreateGetterSetterConfiguration();
+
+public slots:
+ void init();
+ void store();
+
+public:
+ void setPrefixGet(const QString& theValue)
+ {
+ m_prefixGet = theValue;
+ }
+
+ QString prefixGet() const
+ {
+ return m_prefixGet;
+ }
+ void setPrefixSet(const QString& theValue)
+ {
+ m_prefixSet = theValue;
+ }
+
+ QString prefixSet() const
+ {
+ return m_prefixSet;
+ }
+ void setPrefixVariable(const QStringList& theValue)
+ {
+ m_prefixVariable = theValue;
+ }
+
+ QStringList prefixVariable() const
+ {
+ return m_prefixVariable;
+ }
+ void setParameterName(const QString& theValue)
+ {
+ m_parameterName = theValue;
+ }
+
+ QString parameterName() const
+ {
+ return m_parameterName;
+ }
+ void setInlineGet(bool theValue)
+ {
+ m_isInlineGet = theValue;
+ }
+
+ bool isInlineGet() const
+ {
+ return m_isInlineGet;
+ }
+ void setInlineSet(bool theValue)
+ {
+ m_isInlineSet = theValue;
+ }
+
+ bool isInlineSet() const
+ {
+ return m_isInlineSet;
+ }
+
+private:
+ CppSupportPart* m_part;
+ QDomDocument* m_settings;
+
+ QString m_prefixGet;
+ QString m_prefixSet;
+ QStringList m_prefixVariable;
+ QString m_parameterName;
+ bool m_isInlineGet;
+ bool m_isInlineSet;
+
+private:
+ static QString defaultPath;
+};
+
+#endif
diff --git a/languages/cpp/creategettersetterdialog.cpp b/languages/cpp/creategettersetterdialog.cpp
new file mode 100644
index 00000000..41a2f27e
--- /dev/null
+++ b/languages/cpp/creategettersetterdialog.cpp
@@ -0,0 +1,122 @@
+//
+// C++ Implementation: %{MODULE}
+//
+// Description:
+//
+//
+// Author: %{AUTHOR} <%{EMAIL}>, (C) %{YEAR}
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "creategettersetterdialog.h"
+
+#include "cppsupportpart.h"
+#include <klineedit.h>
+#include <qcheckbox.h>
+#include <qregexp.h>
+
+#include "creategettersetterconfiguration.h"
+
+CreateGetterSetterDialog::CreateGetterSetterDialog( CppSupportPart* part, ClassDom aClass,
+ VariableDom aVar, QWidget *parent, const char *pName )
+: CreateGetterSetterDialogBase( parent, pName ), m_part( part ), m_class( aClass ), m_var( aVar )
+{
+ QString name = aVar->name();
+ setCaption( "Create methods for " + name );
+
+ if ( aVar->type().startsWith( "const" ) && !aVar->type().endsWith( "*" ) )
+ {
+ m_chkSet->setChecked( false );
+ m_chkSet->setEnabled( false );
+ }
+
+ CreateGetterSetterConfiguration* config = m_part->createGetterSetterConfiguration();
+ if ( config == 0 )
+ return ;
+
+ QStringList prefixes = config->prefixVariable();
+ unsigned int len = 0;
+
+ QStringList::ConstIterator theend = prefixes.end(); //find longest fitting prefix and remove it
+ for ( QStringList::ConstIterator ci = prefixes.begin(); ci != theend; ++ci )
+ {
+ if ( name.startsWith( *ci ) && ( *ci ).length() > len )
+ len = ( *ci ).length();
+ }
+
+ if ( len > 0 )
+ name.remove( 0, len );
+
+ m_edtGet->setText( name );
+
+ QString getName = name;
+ if ( ! config->prefixGet().isEmpty() )
+ getName[ 0 ] = getName[ 0 ].upper();
+
+ QString setName = name;
+ if ( ! config->prefixSet().isEmpty() )
+ setName[ 0 ] = setName[ 0 ].upper();
+
+ bool getIsChecked = config->isInlineGet();
+ bool setIsChecked = config->isInlineSet();
+ m_chkInlineGet->setChecked( getIsChecked );
+ m_chkInlineSet->setChecked( setIsChecked );
+
+ m_edtGet->setText( config->prefixGet() + getName );
+ m_edtSet->setText( config->prefixSet() + setName );
+}
+
+void CreateGetterSetterDialog::accept( )
+{
+ CreateGetterSetterConfiguration * config = m_part->createGetterSetterConfiguration();
+
+ if ( config == 0 )
+ return ;
+
+ if ( m_chkGet->isChecked() && !m_edtGet->text().isEmpty() )
+ m_part->addMethod( m_class, m_edtGet->text(), m_var->type(), "",
+ CodeModelItem::Public, true, m_chkInlineGet->isChecked(),
+ false, false, "\treturn " + m_var->name() + ";" );
+
+ if ( m_chkSet->isChecked() && !m_edtSet->text().isEmpty() )
+ {
+ QString parameterStr;
+
+ if ( m_var->type().endsWith( "*" ) )
+ {
+ parameterStr = m_var->type() + " " + config->parameterName();
+ }
+ else
+ {
+ QRegExp basicTypes( "((unsigned)?\\s*(char|byte|short|int|long))|double|float|bool" );
+ if ( basicTypes.exactMatch( m_var->type() ) )
+ parameterStr = m_var->type() + " " + config->parameterName();
+ else
+ parameterStr = "const " + m_var->type() + "& " + config->parameterName();
+ }
+ m_part->addMethod( m_class, m_edtSet->text(), "void", parameterStr, CodeModelItem::Public,
+ false, m_chkInlineSet->isChecked(), false, false,
+ "\t" + m_var->name() + " = " + config->parameterName() + ";" );
+ }
+ //@todo illegale eingaben nicht akzeptieren wie z.b. int& ...
+ QDialog::accept();
+}
+
+/**
+ * store current settings wether get/set methods should be created inline.
+ * this is done everytime one changes this behaviour in the dialog.
+ */
+void CreateGetterSetterDialog::slotInlineChanged( )
+{
+ CreateGetterSetterConfiguration * config = m_part->createGetterSetterConfiguration();
+ if ( config == 0 )
+ return ;
+
+ config->setInlineGet( m_chkInlineGet->isChecked() );
+ config->setInlineSet( m_chkInlineSet->isChecked() );
+ config->store();
+}
+
+#include "creategettersetterdialog.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/creategettersetterdialog.h b/languages/cpp/creategettersetterdialog.h
new file mode 100644
index 00000000..a535e303
--- /dev/null
+++ b/languages/cpp/creategettersetterdialog.h
@@ -0,0 +1,41 @@
+//
+// C++ Interface: $MODULE$
+//
+// Description:
+//
+//
+// Author: Jonas Jacobi <j.jacobi@gmx.de>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef CREATEACCESSMETHODSDIALOG_H
+#define CREATEACCESSMETHODSDIALOG_H
+
+#include "creategettersetter.h"
+#include "codemodel.h"
+
+class CppSupportPart;
+
+/**
+ * Dialog which is shown, when a user wants to create get/set methods for a class attribute.
+ * @author Jonas Jacobi <j.jacobi@gmx.de>
+ */
+class CreateGetterSetterDialog: public CreateGetterSetterDialogBase
+{
+ Q_OBJECT
+public:
+ CreateGetterSetterDialog(CppSupportPart* part, ClassDom aClass, VariableDom var, QWidget *parent = 0, const char *name = 0);
+
+protected slots:
+ void accept();
+ void slotInlineChanged();
+
+private:
+ CppSupportPart* m_part;
+
+ ClassDom m_class;
+ VariableDom m_var;
+};
+
+#endif
diff --git a/languages/cpp/createpcsdialog.cpp b/languages/cpp/createpcsdialog.cpp
new file mode 100644
index 00000000..1dc45034
--- /dev/null
+++ b/languages/cpp/createpcsdialog.cpp
@@ -0,0 +1,358 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include "createpcsdialog.h"
+#include "createpcsdialog.moc"
+#include "driver.h"
+#include "tag_creator.h"
+#include "cppsupportpart.h"
+#include "setuphelper.h"
+
+#include <catalog.h>
+#include <kdevpcsimporter.h>
+#include <kdevcoderepository.h>
+
+#include <kparts/componentfactory.h>
+
+#include <ktrader.h>
+#include <kdebug.h>
+#include <klibloader.h>
+#include <klistbox.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <kapplication.h>
+#include <kinstance.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kstringhandler.h>
+#include <klineedit.h>
+
+#include <qprogressbar.h>
+#include <qheader.h>
+#include <qlabel.h>
+#include <qregexp.h>
+#include <qlayout.h>
+#include <qtimer.h>
+#include <qpushbutton.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+class CreatePCSDialog::RppDriver: public Driver
+{
+public:
+ RppDriver( Catalog* c )
+ : catalog( c )
+ {
+ setup();
+ }
+
+ virtual ~RppDriver()
+ {
+#if 0 /// \FIXME robe
+ TagCreator::destroyDocumentation();
+#endif
+
+ }
+
+#if 0 /// \FIXME robe
+ void addDocDirectory( const QString& dir )
+ {
+ m_docDirectoryList.append( dir );
+ TagCreator::setDocumentationDirectories( m_docDirectoryList );
+ }
+#endif
+
+ void fileParsed( ParsedFile& ast )
+ {
+ /// @todo increment progress
+
+#if 0 /// @todo show problems
+ QValueList<Problem> l = problems( fileName );
+ QValueList<Problem>::Iterator it = l.begin();
+ while ( it != l.end() )
+ {
+ const Problem & p = *it;
+ ++it;
+ }
+#endif
+
+ takeTranslationUnit( ast );
+
+ TagCreator w( ast.fileName(), catalog );
+ w.parseTranslationUnit( ast );
+
+ //if( !isResolveDependencesEnabled() )
+ // removeAllMacrosInFile( fileName );
+ }
+
+ // setup the preprocessor
+ // code provided by Reginald Stadlbauer <reggie@trolltech.com>
+ void setup()
+ {
+ bool ok;
+ QString gccLibPath = SetupHelper::getGccIncludePath(&ok);
+ if (!ok)
+ return;
+ gccLibPath = gccLibPath.replace( QRegExp( "[\r\n]" ), "" );
+ addIncludePath( gccLibPath );
+ //addIncludePath( "/usr/include/g++-3" );
+ //addIncludePath( "/usr/include/g++" );
+ QStringList lines = SetupHelper::getGccMacros(&ok);
+ if (!ok)
+ return;
+ for (QStringList::ConstIterator it = lines.constBegin(); it != lines.constEnd(); ++it) {
+ QStringList lst = QStringList::split( ' ', *it );
+ if ( lst.count() != 3 )
+ continue;
+ addMacro( Macro( lst[1], lst[2] ) );
+ }
+ addMacro( Macro( "__cplusplus", "1" ) );
+ addMacro( Macro( "Q_SIGNALS", "signals" ) );
+ addMacro( Macro( "Q_SLOTS", "slots" ) );
+ }
+
+private:
+ Catalog* catalog;
+#if 0 /// \FIXME
+
+ QStringList m_docDirectoryList;
+#endif
+};
+
+
+class PCSListViewItem: public KListViewItem
+{
+public:
+ PCSListViewItem( KService::Ptr ptr, KDevPCSImporter* importer, QListViewItem* parent )
+ : KListViewItem( parent ), m_importer( importer )
+ {
+ init( ptr );
+ }
+ PCSListViewItem( KService::Ptr ptr, KDevPCSImporter* importer, QListView* parent )
+ : KListViewItem( parent ), m_importer( importer )
+ {
+ init( ptr );
+ }
+
+ ~PCSListViewItem()
+ {
+ delete( m_importer );
+ m_importer = 0;
+ }
+
+ void init( KService::Ptr ptr )
+ {
+ setText( 0, ptr->comment() );
+ setPixmap( 0, SmallIcon( ptr->icon() ) );
+ }
+
+ KDevPCSImporter* importer()
+ {
+ return m_importer;
+ }
+
+private:
+ KDevPCSImporter* m_importer;
+};
+
+class CreatePCSDialog::PCSJobData
+{
+public:
+ QString dbName;
+ Catalog * catalog;
+ RppDriver * driver;
+ QStringList list;
+ QStringList::iterator it;
+ int progress;
+
+ PCSJobData( const QString & dbName, QStringList const & fileList )
+ : dbName( dbName), list( fileList ), it( list.begin() ), progress( 0 )
+ {
+ catalog = new Catalog;
+ catalog->open( dbName );
+ catalog->addIndex( "kind" );
+ catalog->addIndex( "name" );
+ catalog->addIndex( "scope" );
+ catalog->addIndex( "fileName" );
+
+ driver = new RppDriver( catalog );
+ }
+
+ ~PCSJobData()
+ {
+ delete driver;
+ delete catalog;
+ }
+};
+
+
+
+CreatePCSDialog::CreatePCSDialog( CppSupportPart* part, QWidget* parent, const char* name, bool modal, WFlags fl )
+ : CreatePCSDialogBase( parent, name, modal, fl ), m_part( part ), m_jobData( 0 )
+{
+ helpButton()->hide();
+
+ m_settings = 0;
+ importerListView->header() ->hide();
+
+ KTrader::OfferList lst = KTrader::self() ->query( "KDevelop/PCSImporter" );
+ kdDebug( 9007 ) << "====================> found " << lst.size() << " importers" << endl;
+
+ for ( KTrader::OfferList::Iterator it = lst.begin(); it != lst.end(); ++it )
+ {
+ KService::Ptr ptr = *it;
+
+ int error = 0;
+ KDevPCSImporter* importer = KParts::ComponentFactory::createInstanceFromService<KDevPCSImporter>( ptr, this, ptr->name().latin1(), QStringList(), &error );
+ if ( importer )
+ {
+ new PCSListViewItem( ptr, importer, importerListView );
+ }
+ }
+
+ setNextEnabled( importerPage, false );
+
+ QHBoxLayout* hbox = new QHBoxLayout( settingsPage );
+ hbox->setAutoAdd( true );
+
+ if ( importerListView->firstChild() )
+ {
+ importerListView->setSelected( importerListView->firstChild(), true );
+ setNextEnabled( importerPage, true );
+ }
+}
+
+CreatePCSDialog::~CreatePCSDialog()
+{}
+
+/*$SPECIALIZATION$*/
+void CreatePCSDialog::back()
+{
+ QWizard::back();
+}
+
+void CreatePCSDialog::next()
+{
+ QWizard::next();
+}
+
+void CreatePCSDialog::reject()
+{
+ if ( m_jobData ) {
+ m_part->removeCatalog( m_jobData->dbName );
+
+ delete m_jobData;
+ m_jobData = 0;
+ }
+
+ QWizard::reject();
+}
+
+void CreatePCSDialog::accept()
+{
+ delete m_jobData;
+ m_jobData = 0;
+
+ QWizard::accept();
+}
+
+void CreatePCSDialog::slotSelected( const QString & )
+{
+ if ( currentPage() == settingsPage )
+ {
+ if ( m_settings )
+ delete( m_settings );
+
+ KDevPCSImporter* importer = static_cast<PCSListViewItem*>( importerListView->selectedItem() ) ->importer();
+ m_settings = importer->createSettingsPage( settingsPage );
+ setNextEnabled( currentPage(), false );
+ setHelpEnabled( currentPage(), false );
+ connect( m_settings, SIGNAL( enabled( int ) ), this, SLOT( setNextPageEnabled( int ) ) );
+
+ if ( m_settings )
+ {
+ setHelpEnabled( m_settings, false );
+ m_settings->show();
+ }
+ }
+ else if ( currentPage() == descriptionPage )
+ {
+ KDevPCSImporter* importer = static_cast<PCSListViewItem*>( importerListView->selectedItem() )->importer();
+ filename_edit->setText( importer->dbName() );
+ }
+ else if ( currentPage() == finalPage )
+ {
+ setBackEnabled( currentPage(), false );
+ setNextEnabled( currentPage(), false );
+
+ KDevPCSImporter* importer = static_cast<PCSListViewItem*>( importerListView->selectedItem() )->importer();
+ QStringList fileList = importer->fileList();
+ progressBar->setTotalSteps( fileList.size() );
+ progressBar->setPercentageVisible( true );
+
+ KStandardDirs *dirs = m_part->instance() ->dirs();
+
+ QString dbName = dirs->saveLocation( "data", "kdevcppsupport/pcs" ) + KURL::encode_string_no_slash(filename_edit->text()) + ".db";
+ kdDebug( 9007 ) << "================================> dbName = " << dbName << endl;
+
+ m_part->removeCatalog( dbName );
+
+ m_jobData = new PCSJobData( dbName, fileList );
+ QTimer::singleShot( 0, this, SLOT(parseNext()) );
+ }
+}
+
+void CreatePCSDialog::parseNext( )
+{
+ if ( ! m_jobData ) return;
+
+ if ( m_jobData->it == m_jobData->list.end() )
+ {
+ if ( m_jobData->progress > 0 )
+ {
+ m_part->addCatalog( m_jobData->catalog );
+ m_jobData->catalog = 0;
+ }
+ currentFile->setText("");
+ cancelButton()->setEnabled( false );
+
+ setFinishEnabled( currentPage(), true );
+
+ delete m_jobData;
+ m_jobData = 0;
+
+ return;
+ }
+
+ progressBar->setProgress( ++(m_jobData->progress) );
+ currentFile->setText( KStringHandler::lsqueeze( *(m_jobData->it), 80 ) );
+
+ m_jobData->driver->parseFile( *(m_jobData->it) );
+
+ ++(m_jobData->it);
+
+ QTimer::singleShot( 0, this, SLOT(parseNext()) );
+}
+
+
+void CreatePCSDialog::setNextPageEnabled( int enabled )
+{
+ setNextEnabled( currentPage(), enabled );
+}
+
+void CreatePCSDialog::slotSelectionChanged( QListViewItem * item )
+{
+ setNextPageEnabled( item != 0 );
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
diff --git a/languages/cpp/createpcsdialog.h b/languages/cpp/createpcsdialog.h
new file mode 100644
index 00000000..0d03d16f
--- /dev/null
+++ b/languages/cpp/createpcsdialog.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef CREATEPCSDIALOG_H
+#define CREATEPCSDIALOG_H
+
+#include "createpcsdialogbase.h"
+
+class CppSupportPart;
+
+class CreatePCSDialog : public CreatePCSDialogBase
+{
+ Q_OBJECT
+
+public:
+ CreatePCSDialog( CppSupportPart* part, QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~CreatePCSDialog();
+ /*$PUBLIC_FUNCTIONS$*/
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ virtual void slotSelected( const QString& );
+ virtual void slotSelectionChanged( QListViewItem* );
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ virtual void back();
+ virtual void next();
+ virtual void reject();
+ virtual void accept();
+ void setNextPageEnabled( int );
+
+ void parseNext();
+
+private:
+ CppSupportPart* m_part;
+ QWidget* m_settings;
+ class RppDriver;
+
+ class PCSJobData;
+ PCSJobData * m_jobData;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
+
+
diff --git a/languages/cpp/createpcsdialogbase.ui b/languages/cpp/createpcsdialogbase.ui
new file mode 100644
index 00000000..09b59a70
--- /dev/null
+++ b/languages/cpp/createpcsdialogbase.ui
@@ -0,0 +1,168 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>CreatePCSDialogBase</class>
+<widget class="QWizard">
+ <property name="name">
+ <cstring>CreatePCSDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>477</width>
+ <height>411</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>New Persistant Class Store</string>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>importerPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Select importer</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>importerListView</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>settingsPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Select directory</string>
+ </attribute>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>descriptionPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Describe database contents</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Filename:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>filename_edit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>111</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>finalPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Creating...</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QProgressBar">
+ <property name="name">
+ <cstring>progressBar</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>currentFile</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>81</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>CreatePCSDialogBase</sender>
+ <signal>selected(const QString&amp;)</signal>
+ <receiver>CreatePCSDialogBase</receiver>
+ <slot>slotSelected(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>importerListView</sender>
+ <signal>clicked(QListViewItem*)</signal>
+ <receiver>CreatePCSDialogBase</receiver>
+ <slot>slotSelectionChanged(QListViewItem*)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>slotSelected(const QString&amp;)</slot>
+ <slot>slotSelectionChanged(QListViewItem*)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/debugger/DESIGN.txt b/languages/cpp/debugger/DESIGN.txt
new file mode 100644
index 00000000..627fd403
--- /dev/null
+++ b/languages/cpp/debugger/DESIGN.txt
@@ -0,0 +1,113 @@
+
+This document describes the design of KDevelop's debugger part. Not that it's
+work in progress, and sometimes describes desired design, not the actual
+one.
+
+== Components and lifecycle ==
+
+Debugger part consists of low-lever "controller" that handles talking
+with gdb and guess what state gdb is in, a number of view widgets, showing
+the state of the program, and a number of places where user can click to
+affect the program.
+
+What makes them all work together are "events" that controller sends
+to all interested parties. They are:
+
+ - Debugger exited. All view classes and actions become disabled and hidden
+ - Program exited. All view classes that can't be used without program
+ become disabled.
+ - Debugger is busy executing a command. All actions become disabled.
+ - Debugger is waiting for command. All actions becomes enabled.
+ - Program state changed. All views flush all cached data and
+ reload the content.
+ - Current thread/stack frame changed. All views switch to showing that
+ thread/frame.
+
+The distinction between "program state change" and "thread/frame" changed is
+that the latter does not imply that any *data* changed, and so it's not
+necessary to clear already cached data for other threads.
+
+== Command execution ==
+
+The controller has a queue of commands to send to gdb. A command typically
+has a callback (pair of QObject* and a member pointer) to be called when
+command is done.
+
+When the queue is non-empty, and debugger is not busy executing the previous
+command, the controller will send the command from the queue top to the gdb.
+The command being executed is remembed in the currentCmd_ member variable.
+Gdb will reply with a number of "out-of-band" responses, followed by one
+"done" or "error" response.
+
+The "done"/"error" response, when using MI interface, is a tree-line structure
+that's parsed with into GDBMI::ResultRecord structure, that is then passed
+to callback assocaited with the current command. Say, for "get me value of
+expression" command, MI response includes textual "value" field that can be
+used by any part of GUI to show the value. After callback is called,
+controller deletes the current command and then tries to execute next one from
+the queue, if there's one.
+
+The commands related to running program (continue/step/etc) are handled in
+a bit special way. Instead of calling any callbacks, controller performs
+predefined set of steps:
+
+ - Decide what's the reason for stop, and maybe do something special
+
+ - For stop on shared lib load, just continue
+
+ - For stop on breakpoint, run the breakpoint commands if any.
+
+ - Set a flag that program state might have changed, and must be reloaded
+
+ - Since hitting tracepoint adds extra commands, including possibly
+ "continue", we don't start reloading widgets immediately, instead
+ we wait for all commands currently in queue to get executed.
+
+ - Once there are no commands in queue, and "reload_program_state" flag is
+ set, we raise the 'program_state_changed' event. All widgets react to
+ that by queueing commands for realoding their state.
+
+
+
+
+
+
+
+
+
+
+
+
+
+Note that all commands are executed in the order they were queued, so if you
+add several commands at the same time, they are executed "automically". Each
+one sees the gdb state that the previous one has left it in.
+
+The MI protocol is stateful, that is there are things like current thread
+and current stack that affect the meaning of commands. Take care to never
+switch such "current" variables unless it's explicitly asked by the user.
+This means that if you have to switch thread/frame, always switch it back
+as the last command in a sequences.
+
+
+== Breakpoints handling ==
+
+Whenever a new breakpoint is added, or an existing breakpoint is modified,
+we immediately try to send the proper commands to gdb. Note that we
+don't try to check which properties of breakpoint were modified, we
+just send all breakpoint data.
+
+This is not always possible, because debugger might be busy, or just
+not started yet. In this case, we set 'pending' flag for breakpoint. Each time
+the debugger becomes free, we try to send the pending breakpoint again.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/languages/cpp/debugger/Makefile.am b/languages/cpp/debugger/Makefile.am
new file mode 100644
index 00000000..0ac84358
--- /dev/null
+++ b/languages/cpp/debugger/Makefile.am
@@ -0,0 +1,33 @@
+# Here resides the debugger part.
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+
+SUBDIRS = mi
+INCLUDES = -I$(top_srcdir)/languages/lib/debugger \
+ -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/util \
+ -I$(top_srcdir)/lib/widgets $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevdebugger.la
+libkdevdebugger_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevdebugger_la_LIBADD = $(top_builddir)/lib/libkdevelop.la $(top_builddir)/lib/widgets/libkdevwidgets.la $(LIB_KHTML) \
+ $(top_builddir)/languages/lib/debugger/liblang_debugger.la \
+ $(top_builddir)/languages/cpp/debugger/mi/libgdbmi_parser.la
+
+libkdevdebugger_la_SOURCES = debuggerdcopinterface.skel debuggerpart.cpp \
+ dbgcontroller.cpp gdbcontroller.cpp gdbcommand.cpp \
+ gdbparser.cpp stty.cpp breakpoint.cpp variablewidget.cpp \
+ gdbbreakpointwidget.cpp framestackwidget.cpp disassemblewidget.cpp \
+ memviewdlg.cpp dbgpsdlg.cpp dbgtoolbar.cpp debuggerconfigwidget.cpp \
+ debuggerconfigwidgetbase.ui debuggertracingdialogbase.ui \
+ gdboutputwidget.cpp gdbtable.cpp debuggertracingdialog.cpp \
+ label_with_double_click.cpp
+
+METASOURCES = AUTO
+KDE_ICON = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevdebugger.desktop
+
+rcdir = $(kde_datadir)/kdevdebugger
+rc_DATA = kdevdebugger.rc
+noinst_HEADERS = gdbtable.h
diff --git a/languages/cpp/debugger/TODO.txt b/languages/cpp/debugger/TODO.txt
new file mode 100644
index 00000000..38aca109
--- /dev/null
+++ b/languages/cpp/debugger/TODO.txt
@@ -0,0 +1,218 @@
+
+KDEV4 Debugger:
+
+ - Launch framework
+
+ - On fly launch types -- "dbus call to connect to a given app"
+
+ - Advanced data visualization
+
+ - Customizable by the user
+
+ - Assembler display that's good
+
+ - Hex display that's good
+
+ - Register display that is good.
+
+ - Debugger scripts? Remembering and replaying a set of
+ commands?
+
+ - Debugger as a visualizer tool?
+
+
+TODO:
+
+ - Check gdb version at startup.
+
+ - P1:
+
+ - Breakpoints duplicated on editing.
+
+ - Global radix
+
+ - Hiding of static members.
+
+ - No horizonal scrollbar in the variables widget.
+
+ - Debugging optimized binaries
+
+ - Debugged application somtimes not killed.
+
+ - Fix moving breakpoints on editing files
+
+ - Pressing tab in memory range dialog modified the edited file.
+
+ - Testing stepping into code for which gdb can't find the file or fullname.
+ Test stepping (or stepi) into undebuggable code.
+
+ - Test files without debug info
+
+ - Reconsider fixed font in variable widget
+
+ - Investigate 'stop on shlib load breaking next" on Dario's project.
+
+ - Incoming bug reports:
+
+ - Check core files usage.
+
+ - Fix remote target dialog, which is confusing and requires
+ to specify tree scripts!
+
+ - Big projects
+
+ - Add support for other special types (STL)
+
+ - Breakpoints
+
+ - Add shortcuts to context menu.
+
+ - Add icons
+
+ - Status display column is just ugly
+
+ - Handle "out of breakpoints" message.
+
+ - Check that changing breakpoint when program is running works sanely.
+ Need to either disable breakpoints widget when debugger is busy, or
+ stop debugger when we add new breakpoint.
+
+ - Implement gdb -> KDevelop breakpoint addition for all existing
+ breakpoint types.
+
+
+
+ - For function breakpoints, the 'file' property of breakpoint from
+ gdb is not a fullname (gdb 6.4), so we don't find the file.
+
+ - For function breakpoints with gdb CVS, clicking on marker corresponding
+ to function breakpoint does not clear it, but adds a new one.
+
+ - "Immediately leave function" breakpoint type.
+
+
+ - Watchpoints redux:
+
+ - Fix status display for watchpoints
+
+ - Test loading of read watchpoints from session file.
+
+ - Change "toogle watchpoint" into checkbox.
+
+ - "Read watchpoint triggered" message disappears too soon.
+
+
+ - Fix up the mess with relative vs. full names of files for breakpoints.
+
+
+ UI cleanup:
+
+ - The dialog box on watchpoint hit draws slowly initially.
+
+ - Cntrl-Enter for "add watch".
+
+ - Close all opened thread when opening other?
+
+ - The dialog box shown in MI errors is ugly. Often, it contains names
+ of internal gdb functions, or no interest to outsiders.
+
+ - Should strip formatting when copying from gdb output window.
+
+ Console command interaction:
+
+ - Handle "Program exited" messages from CLI "continue".
+
+
+ Code cleanup:
+
+ - Rename FileLine to Code.
+
+ - Kill raw char* manipulation.
+
+ - Fix hardcoded color in framestack widget
+
+ - Kill 'trimmableItem'.
+
+ Minor tweaks:
+
+ - Need some "scope" for error reporting. Say, we can try to set invalid
+ breakpoint condition from session file, on debugger startup. Need to
+ produce message like:
+ "Error detected when setting condition for breakpoint 1",
+ not a pretty opaque error we get now.
+
+ - Highlight type changes in variable widget
+
+ - Highlight composite types changes?
+
+ - Test that modifying breakpoint while application is running works.
+
+ - If remembered expresion includes dereferences pointer as a child,
+ that child is still updated as we step.
+
+ - Error in 'finish' command (e.g. on the outer frame) hides the
+ current line indicator.
+
+ - Should disable the 'finish' command on the outer frame.
+
+ Optimizations:
+
+ - If we're in some function and looked at frame 0 and frame 1, and
+ then run "finish", we need to reuse VarFrameRoot for previous frame
+ 1, which now became frame 0, no need to recreate it. Generally, need
+ to preserve open/closed state of all variables for all scopes.
+
+
+
+
+
+
+BUGS/ISSUES found:
+
+ - "set edit off" breaks MI
+ - no stop reason for stop on shared library load
+ - using "interpreter mi -whatever" when already in MI
+ mode causes gdb to output two "^done" messages and
+ it confuses us.
+ - No support for "character" format in -data-evaluate-expression
+ or -var-set-format
+ - Some of the -stack* command operate on current frame unless one is
+ specified, but -stack-list-arguments will print all frames.
+
+ - Output of -thread-list-ids uses the following syntax
+
+ {thread-id="1",thread-id="2"}
+
+ which is neither tuple nor list.
+
+ - Pending breakpoits broken in MI.
+
+
+ - Varobj broken:
+
+ - When entering new scope, we need to issue -stack-list-locals
+ to get names of new varaibles in that scope.
+
+ - When stopping inside undebuggable code (say, on watchpoint hit),
+ -file-list-exec-source-file reports the last valid source file.
+
+ - It's not possible to find if intefiour is running or not.
+
+
+
+
+
+Advantages of MI
+
+
+- The information is easier to extract.
+
+ - For watchpoint, getting the old and new value of
+ watched expression for display is trivial. For CLI,
+ this is tricky and not done in current code.
+
+
+
+
+
+
diff --git a/languages/cpp/debugger/breakpoint.cpp b/languages/cpp/debugger/breakpoint.cpp
new file mode 100644
index 00000000..7bcf674f
--- /dev/null
+++ b/languages/cpp/debugger/breakpoint.cpp
@@ -0,0 +1,719 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "breakpoint.h"
+#include "gdbcontroller.h"
+#include "gdbcommand.h"
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <qfileinfo.h>
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qregexp.h>
+#include <qstring.h>
+
+#include <stdio.h>
+#include <typeinfo>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace GDBDebugger
+{
+
+static int BPKey_ = 0;
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+Breakpoint::Breakpoint(bool temporary, bool enabled)
+ : s_pending_(true),
+ s_actionAdd_(true),
+ s_actionClear_(false),
+ s_actionModify_(false),
+ s_actionDie_(false),
+ s_dbgProcessing_(false),
+ s_enabled_(enabled),
+ s_temporary_(temporary),
+ s_hardwareBP_(false),
+ s_tracingEnabled_(false),
+ s_traceFormatStringEnabled_(false),
+
+ dbgId_(-1),
+ hits_(0),
+ key_(BPKey_++),
+ active_(-1),
+ ignoreCount_(0),
+ condition_("")
+{
+}
+
+/***************************************************************************/
+
+Breakpoint::~Breakpoint()
+{
+}
+
+void Breakpoint::sendToGdb(GDBController* controller)
+{
+ // Need to issue 'modifyBreakpoint' when setting breakpoint is done
+ controller_ = controller;
+
+ // FIXME: should either make sure this widget is disabled
+ // when needed, or implement simular logic.
+ if (controller->stateIsOn(s_dbgNotStarted))
+ {
+ // Can't modify breakpoint now, will try again later.
+ setPending(true);
+ return;
+ }
+
+ setPending(false);
+
+ bool restart = false;
+ // FIXME: this will only catch command for which gdb
+ // produces the "^running" marker.
+ // FIXME: this probably won't work if there are other
+ // run commands in the thread already.
+ if (controller->stateIsOn(s_appRunning)
+ && !controller->stateIsOn(s_explicitBreakInto))
+ {
+ kdDebug(9012) << "PAUSING APP\n";
+ controller->pauseApp();
+ restart = true;
+ }
+
+ if (isActionAdd())
+ {
+ // This prevents us from sending breakpoint command to
+ // gdb for empty breakpoints, when user haven't even
+ // typed function name, or address, or variable.
+ //
+ // Check for isDbgProcessing makes sure we don't issue
+ // several -break-insert commands before getting
+ // output from the first one.
+ if (isValid() && !isDbgProcessing())
+ {
+ setBreakpoint(controller);
+ }
+ }
+ else
+ {
+ if (isActionClear())
+ {
+ clearBreakpoint(controller);
+ }
+ else
+ {
+ if (isActionModify())
+ {
+ modifyBreakpoint(controller);
+ }
+ }
+ }
+
+ if (restart) {
+ kdDebug(9012) << "RESTARING APP\n";
+ GDBCommand *cmd = new GDBCommand("-exec-continue");
+ cmd->setRun(true);
+ controller->addCommand(cmd);
+ }
+}
+
+void Breakpoint::clearBreakpoint(GDBController* /*c*/)
+{
+ controller()->addCommandBeforeRun(
+ new GDBCommand(dbgRemoveCommand(),
+ this,
+ &Breakpoint::handleDeleted));
+}
+
+void Breakpoint::applicationExited(GDBController*)
+{
+}
+
+
+void Breakpoint::setBreakpoint(GDBController* controller)
+{
+ setDbgProcessing(true);
+
+ // Don't use handler mechanism yet, because the reply
+ // should contain internal id of breakpoint (not gdb id), so that we
+ // can match gdb id with the breakpoint instance we've set.
+
+ // Note that at startup we issue several breakpoint commands, so can't
+ // just store last breakpoint. Need to stack of last breakpoint commands,
+ // but that for later.
+ //
+ // When this command is finished, slotParseGDBBreakpointSet
+ // will be called by the controller.
+ controller->addCommandBeforeRun(
+ new GDBCommand(dbgSetCommand(controller),
+ this,
+ &Breakpoint::handleSet, true));
+}
+
+
+void Breakpoint::modifyBreakpoint(GDBController* controller)
+{
+ controller->
+ addCommandBeforeRun(
+ new ModifyBreakpointCommand(QString("-break-condition %1 ") +
+ conditional(), this));
+ controller->
+ addCommandBeforeRun(
+ new ModifyBreakpointCommand(QString("-break-after %1 ") +
+ QString::number(ignoreCount()), this));
+
+ controller->
+ addCommandBeforeRun(
+ new ModifyBreakpointCommand(isEnabled() ?
+ QString("-break-enable %1")
+ : QString("-break-disable %1"), this));
+}
+
+void Breakpoint::removedInGdb()
+{
+ setActionDie();
+ emit modified(this);
+}
+
+
+bool Breakpoint::match(const Breakpoint* breakpoint) const
+{
+ // simple case
+ if (this == breakpoint)
+ return true;
+
+ // Type case
+ if (typeid(*this) != typeid(*breakpoint))
+ return false;
+
+ return match_data(breakpoint);
+}
+
+/***************************************************************************/
+
+QString Breakpoint::dbgRemoveCommand() const
+{
+ if (dbgId_>0)
+ return QString("-break-delete %1").arg(dbgId_); // gdb command - not translatable
+
+ return QString();
+}
+
+
+/***************************************************************************/
+
+// called when debugger ends
+void Breakpoint::reset()
+{
+ dbgId_ = -1;
+ s_pending_ = true;
+ s_actionAdd_ = true; // waiting for the debugger to start
+ s_actionClear_ = false;
+ // All breakpoint properties will be automatically sent to
+ // gdb when breakpoint is first added, no matter what value
+ // this field has.
+ s_actionModify_ = false;
+ s_dbgProcessing_ = false;
+ s_hardwareBP_ = false;
+ hits_ = 0;
+ active_ = -1;
+}
+
+/***************************************************************************/
+
+void Breakpoint::setActive(int active, int id)
+{
+ active_ = active;
+ dbgId_ = id;
+
+ if (s_pending_ && !(s_actionAdd_ && s_actionModify_)) {
+ s_pending_ = false;
+ s_actionModify_ = false;
+ }
+
+ s_actionAdd_ = false;
+ s_actionClear_ = false;
+ s_actionDie_ = false;
+ s_dbgProcessing_ = false;
+}
+
+/***************************************************************************/
+
+QString Breakpoint::statusDisplay(int activeFlag) const
+{
+ QString status="";
+ if (!s_enabled_)
+ status = i18n("Disabled");
+ else
+ if (s_pending_)
+ {
+ if (s_actionAdd_)
+ status = i18n("Pending (add)");
+ if (s_actionClear_)
+ status = i18n("Pending (clear)");
+ if (s_actionModify_)
+ status = i18n("Pending (modify)");
+ }
+ else
+ if (isActive(activeFlag))
+ status = i18n("Active");
+
+ return status;
+}
+
+QString Breakpoint::traceRealFormatString() const
+{
+ QString result;
+
+ if (traceFormatStringEnabled())
+ {
+ result = traceFormatString();
+ }
+ else
+ {
+ result = "Tracepoint";
+ if (const FilePosBreakpoint* fb
+ = dynamic_cast<const FilePosBreakpoint*>(this))
+ {
+ result += " at " + fb->location() + ": ";
+ }
+ else
+ {
+ result += " " + QString::number(key()) + ": ";
+ }
+ for(QStringList::const_iterator i = tracedExpressions_.begin(),
+ e = tracedExpressions_.end(); i != e; ++i)
+ {
+ result += " " + *i + " = %d";
+ }
+ }
+
+ // Quote the thing
+ result = "\"" + result + "\\n\"";
+
+ for(QStringList::const_iterator i = tracedExpressions_.begin(),
+ e = tracedExpressions_.end(); i != e; ++i)
+ {
+ result += ", " + *i;
+ }
+
+ return result;
+}
+
+void Breakpoint::handleSet(const GDBMI::ResultRecord& r)
+{
+ // Try to find gdb id. It's a bit harder that it should be,
+ // because field names differ depending on breakpoint type.
+
+ int id = -1;
+
+ if (r.hasField("bkpt"))
+ id = r["bkpt"]["number"].literal().toInt();
+ else if (r.hasField("wpt"))
+ id = r["wpt"]["number"].literal().toInt();
+ else if (r.hasField("hw-rwpt"))
+ id = r["hw-rwpt"]["number"].literal().toInt();
+ // We don't have access watchpoints in UI yet, but
+ // for future.
+ else if (r.hasField("hw-awpt"))
+ id = r["hw-awpt"]["number"].literal().toInt();
+
+ if (id == -1)
+ {
+ // If can't set because file not found yet,
+ // will need to try later.
+ setPending(true);
+ }
+ else
+ {
+ setActive(0 /* unused m_activeFlag */, id);
+ }
+
+ // Need to do this so that if breakpoint is not set
+ // (because the file is not found)
+ // we unset isDbgProcessing flag, so that breakpoint can
+ // be set on next stop.
+ setDbgProcessing(false);
+
+ // Immediately call modifyBreakpoint to set all breakpoint
+ // properties, such as condition.
+ modifyBreakpoint(controller_);
+
+ emit modified(this);
+}
+
+void Breakpoint::handleDeleted(const GDBMI::ResultRecord& /*r*/)
+{
+ kdDebug(9012) << "inside handleDeleted\n";
+ setActionDie();
+ if (FilePosBreakpoint* fp = dynamic_cast<FilePosBreakpoint*>(this))
+ {
+ kdDebug(9012) << "handleDeleted, line is " << fp->lineNum() << "\n";
+ }
+ emit modified(this);
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+FilePosBreakpoint::FilePosBreakpoint()
+: subtype_(filepos),
+ line_(-1)
+{}
+
+FilePosBreakpoint::FilePosBreakpoint(const QString &fileName, int lineNum,
+ bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled)
+{
+ // Sets 'subtype'
+ setLocation(QString("%1:%2").arg(fileName).arg(lineNum));
+}
+
+FilePosBreakpoint::~FilePosBreakpoint()
+{
+}
+
+QString FilePosBreakpoint::dbgSetCommand(GDBController *c) const
+{
+ QString cmdStr = "-break-insert";
+
+ if (isTemporary())
+ cmdStr = cmdStr + " -t";
+
+ if (c->miPendingBreakpoints())
+ cmdStr = cmdStr + " -f";
+
+ return cmdStr + " " + location_;
+}
+
+bool FilePosBreakpoint::match_data(const Breakpoint *xb) const
+{
+ const FilePosBreakpoint* b = static_cast<const FilePosBreakpoint*>(xb);
+
+ if (b)
+ return location_ == b->location_;
+ else
+ return false;
+}
+
+QString FilePosBreakpoint::displayType() const
+{
+ return i18n("Code breakpoint", "Code");
+}
+
+bool FilePosBreakpoint::isValid() const
+{
+ return !location_.isEmpty();
+}
+
+bool FilePosBreakpoint::hasFileAndLine() const
+{
+ return line_ != -1;
+}
+
+QString FilePosBreakpoint::fileName() const
+{
+ return fileName_;
+}
+
+unsigned FilePosBreakpoint::lineNum() const
+{
+ return line_;
+}
+
+
+
+QString FilePosBreakpoint::location(bool compact) const
+{
+ if (subtype_ == filepos && hasFileAndLine() && compact)
+ {
+ return QFileInfo(fileName_).fileName()+":"+QString::number(line_);
+ }
+ else
+ {
+ return location_;
+ }
+}
+
+/***************************************************************************/
+
+void FilePosBreakpoint::setLocation(const QString& location)
+{
+ location_ = location;
+
+ QRegExp regExp1("(.*):(\\d+)$");
+ regExp1.setMinimal(true);
+ if ( regExp1.search(location, 0) >= 0 )
+ {
+ subtype_ = filepos;
+
+ QString t = regExp1.cap(1);
+ QString dirPath = QFileInfo(t).dirPath();
+ if ( dirPath == "." )
+ {
+ QString existingDirPath = QFileInfo(fileName_).dirPath();
+ if (existingDirPath != ".")
+ fileName_ = existingDirPath+"/"+regExp1.cap(1);
+ else
+ fileName_ = regExp1.cap(1);
+ }
+ else
+ fileName_ = regExp1.cap(1);
+
+ line_ = regExp1.cap(2).toInt();
+
+ location_ = QString("%1:%2").arg(fileName_).arg(regExp1.cap(2));
+ }
+ else
+ {
+ // Could be address as well, but it's treated absolutely
+ // the same everywhere.
+ subtype_ = function;
+ }
+}
+
+void FilePosBreakpoint::handleSet(const GDBMI::ResultRecord& r)
+{
+ // Below logic gets filename and line from gdb response, and
+ // allows us to show breakpoint marker even for function
+ // breakpoints. Unfortunately, 'fullname' field is available only in
+ // post-6.4 versions of gdb and if we try to use 'file', then
+ // KDevelop won't be able to find that file to show the marker.
+ if (r.hasField("bkpt"))
+ {
+ const GDBMI::Value& v = r["bkpt"];
+ if (v.hasField("fullname") && v.hasField("line"))
+ {
+ fileName_ = v["fullname"].literal();
+ line_ = v["line"].literal().toInt();
+ }
+ }
+
+ Breakpoint::handleSet(r);
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+Watchpoint::Watchpoint(const QString& varName, bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled),
+ varName_(varName)
+{
+}
+
+/***************************************************************************/
+
+Watchpoint::~Watchpoint()
+{
+}
+
+void Watchpoint::setBreakpoint(GDBController* controller)
+{
+ if (isEnabled())
+ {
+ setDbgProcessing(true);
+
+ controller->addCommandBeforeRun(
+ new GDBCommand(
+ QString("-data-evaluate-expression &%1").arg(varName_),
+ this,
+ &Watchpoint::handleAddressComputed));
+ }
+}
+
+void Watchpoint::handleAddressComputed(const GDBMI::ResultRecord& r)
+{
+ address_ = r["value"].literal().toULongLong(0, 16);
+ controller()->addCommandBeforeRun(
+ new GDBCommand(
+ QString("-break-watch *%1").arg(r["value"].literal()),
+ static_cast<Breakpoint*>(this),
+ &Watchpoint::handleSet));
+}
+
+void Watchpoint::applicationExited(GDBController* c)
+{
+ if (!c->stateIsOn(s_dbgNotStarted))
+ {
+ // Note: not using 'clearBreakpoint' as it will delete breakpoint
+ // completely.
+
+ controller()->addCommand(
+ new GDBCommand(dbgRemoveCommand()));
+ setDbgId(-1);
+ setEnabled(false);
+ setActionAdd(true);
+ address_ = static_cast<unsigned long long>(-1);
+ emit modified(this);
+ }
+}
+
+void Watchpoint::removedInGdb()
+{
+ // Do nothing. Watchpoints must be preserved
+ // even if they are gone in gdb.
+}
+
+/***************************************************************************/
+
+QString Watchpoint::dbgSetCommand(GDBController *) const
+{
+ return QString("-break-watch ")+varName_; // gdb command - not translatable
+}
+
+/***************************************************************************/
+
+bool Watchpoint::match_data(const Breakpoint* xb) const
+{
+ const Watchpoint* b = static_cast<const Watchpoint*>(xb);
+
+ return (varName_ == b->varName_);
+}
+
+ReadWatchpoint::ReadWatchpoint(const QString& varName, bool temporary, bool enabled)
+ : Watchpoint(varName, temporary, enabled)
+{
+}
+
+QString ReadWatchpoint::dbgSetCommand(GDBController *) const
+{
+ return QString("-break-watch -r ")+varName();
+}
+
+bool ReadWatchpoint::match_data(const Breakpoint* xb) const
+{
+ const ReadWatchpoint* b = static_cast<const ReadWatchpoint*>(xb);
+
+ return (varName() == b->varName());
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+//ExitBreakpoint::ExitBreakpoint(bool temporary, bool enabled) :
+// Breakpoint(temporary, enabled)
+//{
+//}
+//
+///***************************************************************************/
+//
+//ExitBreakpoint::~ExitBreakpoint()
+//{
+//}
+//
+///***************************************************************************/
+//
+//QString ExitBreakpoint::dbgSetCommand() const
+//{
+// return "";
+//}
+//
+///***************************************************************************/
+//
+//bool ExitBreakpoint::match(const Breakpoint* brkpt) const
+//{
+// // simple case
+// if (this == brkpt)
+// return true;
+//
+// // Type case
+// const ExitBreakpoint* check = dynamic_cast<const ExitBreakpoint*>(brkpt);
+// if (!check)
+// return false;
+//
+// // member case
+// return true;
+//}
+//
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+//
+// These are implemented in gdb but can cause a lot of breakpoints
+// to be set. This needs more thought before being implemented
+
+//RegExpBreakpoint::RegExpBreakpoint(bool temporary, bool enabled) :
+// Breakpoint(temporary, enabled)
+//{
+//}
+//
+///***************************************************************************/
+//
+//RegExpBreakpoint::~RegExpBreakpoint()
+//{
+//}
+//
+///***************************************************************************/
+//
+//QString RegExpBreakpoint::dbgSetCommand() const
+//{
+// return "";
+//}
+//
+///***************************************************************************/
+//
+////QString RegExpBreakpoint::dbgRemoveCommand() const
+////{
+//// return "";
+////}
+//
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+// Most catch options arn't implemented in gdb so ignore this for now.
+
+//CatchBreakpoint::CatchBreakpoint(bool temporary, bool enabled) :
+// Breakpoint(temporary, enabled)
+//{
+//}
+//
+///***************************************************************************/
+//
+//CatchBreakpoint::~CatchBreakpoint()
+//{
+//}
+//
+///***************************************************************************/
+//
+//QString CatchBreakpoint::dbgSetCommand() const
+//{
+// return "";
+//}
+//
+///***************************************************************************/
+//
+////QString CatchBreakpoint::dbgRemoveCommand() const
+////{
+//// return "";
+////}
+//
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#include "breakpoint.moc"
diff --git a/languages/cpp/debugger/breakpoint.h b/languages/cpp/debugger/breakpoint.h
new file mode 100644
index 00000000..f06fc3d3
--- /dev/null
+++ b/languages/cpp/debugger/breakpoint.h
@@ -0,0 +1,313 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _BREAKPOINT_H_
+#define _BREAKPOINT_H_
+
+#include <klocale.h>
+
+#include <qobject.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace GDBMI
+{
+ class ResultRecord;
+}
+
+namespace GDBDebugger
+{
+
+ class GDBController;
+
+enum BP_TYPES
+{
+ BP_TYPE_Invalid,
+ BP_TYPE_FilePos,
+ BP_TYPE_Watchpoint,
+ BP_TYPE_ReadWatchpoint
+};
+
+class Breakpoint : public QObject
+{
+ Q_OBJECT
+public:
+ Breakpoint(bool temporary=false, bool enabled=true);
+ virtual ~Breakpoint();
+
+ void sendToGdb(GDBController* c);
+
+ // Called whenever this breakpoint is removed on gdb side.
+ virtual void removedInGdb();
+
+ virtual void applicationExited(GDBController*);
+
+
+
+ virtual QString dbgSetCommand(GDBController *) const = 0;
+ virtual QString dbgRemoveCommand() const;
+ /** Returns true if 'breakpoint' is identical to *this.
+ Checks for trival cases like pointer equality and
+ differing typeid() and then calls virtual
+ match_data.
+ */
+ bool match(const Breakpoint* breakpoint) const;
+ /** Returns true if essential data in 'breakpoint' is equivalent
+ to *this. The caller should guarantee that dynamic type
+ of *this and *breakpoint is the same.
+ */
+ virtual bool match_data(const Breakpoint* breakpoint) const = 0;
+
+ virtual bool hasFileAndLine() const { return false; }
+
+
+ virtual void reset();
+
+ void setActive(int active, int id);
+ bool isActive(int active) const { return (active_ == active) ||
+ (s_pending_ && !s_actionClear_); }
+
+ void setEnabled(bool enabled) { s_enabled_ = enabled; }
+ bool isEnabled() const { return s_enabled_; }
+
+ void setTemporary(bool temporary) { s_temporary_ = temporary; }
+ bool isTemporary() const { return s_temporary_; }
+
+ void setHardwareBP(bool hardwareBP) { s_hardwareBP_ = hardwareBP; }
+ bool isHardwareBP() const { return s_hardwareBP_; }
+
+ void setIgnoreCount(int ignoreCount) { ignoreCount_ = ignoreCount; }
+ int ignoreCount() const { return ignoreCount_; }
+
+ void setAddress(const QString &address) { address_ = address; }
+ QString address() const { return address_; }
+
+ void setConditional(const QString &condition) { condition_ = condition; }
+ QString conditional() const { return condition_; }
+
+ void setPending(bool pending) { s_pending_ = pending; }
+ bool isPending() const { return s_pending_; }
+
+ void setActionAdd(bool actionAdd) { s_actionDie_ = false;
+ s_actionAdd_ = actionAdd; }
+ bool isActionAdd() const { return s_actionAdd_; }
+
+ void setActionClear(bool actionClear) { s_actionClear_ = actionClear; }
+ bool isActionClear() const { return s_actionClear_; }
+
+ void setActionModify(bool actionModify) { s_actionDie_ = false;
+ s_actionModify_ = actionModify; }
+ bool isActionModify() const { return s_actionModify_; }
+
+ void setDbgProcessing(bool dbgProcessing) { s_dbgProcessing_ = dbgProcessing; }
+ bool isDbgProcessing() const { return s_dbgProcessing_; }
+ void setActionDie() { s_actionDie_ = true;
+ s_actionClear_ = false; }
+ bool isActionDie() const { return s_actionDie_; }
+
+ int key() const { return key_; }
+ void setDbgId(int dbgId) { dbgId_ = dbgId; }
+ int dbgId() const { return dbgId_; }
+ void setHits(int hits) { hits_ = hits; }
+ int hits() const { return hits_; }
+
+ virtual QString statusDisplay(int activeFlag) const;
+ virtual BP_TYPES type() const { return BP_TYPE_Invalid; }
+ virtual QString displayType() const { return i18n( "Invalid" ); }
+
+
+ bool tracingEnabled() const { return s_tracingEnabled_; }
+ void setTracingEnabled(bool enable) { s_tracingEnabled_ = enable; }
+
+ const QStringList& tracedExpressions() const { return tracedExpressions_; }
+ void setTracedExpressions(const QStringList& l) { tracedExpressions_ = l; }
+
+ bool traceFormatStringEnabled() const { return s_traceFormatStringEnabled_; }
+ void setTraceFormatStringEnabled(bool en) { s_traceFormatStringEnabled_ = en; }
+
+ const QString& traceFormatString() const { return traceFormatString_; }
+ void setTraceFormatString(const QString& s) { traceFormatString_ = s; }
+
+ QString traceRealFormatString() const;
+
+ virtual QString location(bool compact=true) const = 0;
+ virtual void setLocation(const QString& ) = 0;
+ virtual bool isValid() const = 0;
+
+signals:
+ /** Emitted whenever this breakpoint is modified from gdb side,
+ say when it's first created, or when gdb reports that any
+ property has changes.
+ */
+ void modified(Breakpoint*);
+
+private:
+ void handleDeleted(const GDBMI::ResultRecord&);
+ virtual void setBreakpoint(GDBController* controller);
+ void modifyBreakpoint(GDBController* controller);
+
+protected:
+ GDBController* controller() const { return controller_; }
+ virtual void handleSet(const GDBMI::ResultRecord&);
+ void clearBreakpoint(GDBController* c);
+
+private:
+ bool s_pending_ :1;
+ bool s_actionAdd_ :1;
+ bool s_actionClear_ :1;
+ bool s_actionModify_ :1;
+ bool s_actionDie_ :1;
+ bool s_dbgProcessing_ :1;
+ bool s_enabled_ :1;
+ bool s_temporary_ :1;
+ bool s_hardwareBP_ :1; // assigned by gdb
+ bool s_tracingEnabled_ :1;
+ bool s_traceFormatStringEnabled_ :1;
+
+ int dbgId_; // assigned by gdb
+ int hits_; // assigned by gdb
+
+ int key_; // internal unique key
+ int active_; // counter incremented on receipt of all BP's
+
+ int ignoreCount_;
+ QString address_;
+ QString condition_;
+ QStringList tracedExpressions_;
+ QString traceFormatString_;
+
+ GDBController* controller_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class FilePosBreakpoint : public Breakpoint
+{
+public:
+ FilePosBreakpoint();
+
+ FilePosBreakpoint(const QString &fileName, int lineNum,
+ bool temporary=false, bool enabled=true);
+ virtual ~FilePosBreakpoint();
+ virtual QString dbgSetCommand(GDBController *) const;
+ virtual bool match_data(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_FilePos; }
+ QString displayType() const;
+ QString location(bool compact=true) const;
+ void setLocation(const QString& location);
+ bool isValid() const;
+
+ bool hasFileAndLine() const;
+ QString fileName() const;
+ unsigned lineNum() const;
+
+protected:
+ void handleSet(const GDBMI::ResultRecord&);
+
+
+private:
+
+ enum subtype { filepos = 1, function, address };
+ subtype subtype_;
+
+ QString location_;
+ QString fileName_;
+ int line_;
+};
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+//class RegExpBreakpoint : public Breakpoint
+//{
+//public:
+// RegExpBreakpoint(bool temporary=false, bool enabled=true);
+// virtual ~RegExpBreakpoint();
+// virtual QString dbgSetCommand() const;
+//};
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+//class CatchBreakpoint : public Breakpoint
+//{
+//public:
+// CatchBreakpoint(bool temporary=false, bool enabled=true);
+// virtual ~CatchBreakpoint();
+// virtual QString dbgSetCommand() const;
+// virtual CatchBreakpoint& operator=(const CatchBreakpoint& rhs);
+//};
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+//class ExitBreakpoint : public Breakpoint
+//{
+//public:
+// ExitBreakpoint(bool temporary=false, bool enabled=true);
+// virtual ~ExitBreakpoint();
+// virtual QString dbgSetCommand() const;
+// bool match(const Breakpoint* brkpt) const;
+// virtual void configureDisplay();
+//};
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class Watchpoint : public Breakpoint
+{
+public:
+ Watchpoint(const QString &varName, bool temporary=false, bool enabled=true);
+ virtual ~Watchpoint();
+ virtual QString dbgSetCommand(GDBController *) const;
+
+ void applicationExited(GDBController*);
+ void removedInGdb();
+
+ bool match_data(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_Watchpoint; }
+ QString displayType() const { return i18n("Watchpoint"); }
+ void setVarName(const QString& varName) { varName_ = varName; }
+ QString varName() const { return varName_; }
+ unsigned long long address() const { return address_; }
+ QString location(bool) const { return varName_; }
+ void setLocation(const QString& location) { varName_ = location; }
+ bool isValid() const { return !varName_.isEmpty(); }
+
+private:
+ void setBreakpoint(GDBController* controller);
+ void handleAddressComputed(const GDBMI::ResultRecord&);
+
+ QString varName_;
+ unsigned long long address_;
+};
+
+class ReadWatchpoint : public Watchpoint
+{
+public:
+ ReadWatchpoint(const QString &varName, bool temporary=false, bool enabled=true);
+ virtual QString dbgSetCommand(GDBController *) const;
+ bool match_data(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_ReadWatchpoint; }
+ QString displayType() const { return i18n("Read Watchpoint"); }
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/dbgcontroller.cpp b/languages/cpp/debugger/dbgcontroller.cpp
new file mode 100644
index 00000000..6ca94543
--- /dev/null
+++ b/languages/cpp/debugger/dbgcontroller.cpp
@@ -0,0 +1,40 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "dbgcontroller.h"
+#include <kprocess.h>
+
+/***************************************************************************/
+
+namespace GDBDebugger
+{
+
+DbgController::DbgController()
+ : dbgProcess_(0)
+{
+}
+
+/***************************************************************************/
+
+DbgController::~DbgController()
+{
+ delete dbgProcess_;
+}
+
+/***************************************************************************/
+
+}
+
+#include "dbgcontroller.moc"
diff --git a/languages/cpp/debugger/dbgcontroller.h b/languages/cpp/debugger/dbgcontroller.h
new file mode 100644
index 00000000..8d13f2d0
--- /dev/null
+++ b/languages/cpp/debugger/dbgcontroller.h
@@ -0,0 +1,128 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DBGCONTROLLER_H_
+#define _DBGCONTROLLER_H_
+
+#include "mi/gdbmi.h"
+
+#include <qobject.h>
+#include <domutil.h>
+
+
+
+class KProcess;
+class QString;
+class QStrList;
+
+namespace GDBDebugger
+{
+
+class Breakpoint;
+class DbgCommand;
+class TrimmableItem;
+class VarItem;
+
+
+/***************************************************************************/
+/**
+ * @author jbb
+ */
+/***************************************************************************/
+// sigh - namespace's don't work on some of the older compilers
+enum DBGStateFlags
+{
+ s_dbgNotStarted = 1,
+ s_appNotStarted = 2,
+ s_waitForWrite = 8,
+ s_programExited = 16,
+ s_viewBT = 128,
+ s_viewBP = 256,
+ s_attached = 512,
+ s_core = 1024,
+ s_waitTimer = 2048,
+ // Set when 'slotStopDebugger' started executing, to avoid
+ // entering that function several times.
+ s_shuttingDown = 4096,
+ s_explicitBreakInto = (s_shuttingDown << 1),
+ s_dbgBusy = (s_explicitBreakInto << 1),
+ s_appRunning = (s_dbgBusy << 1),
+ s_lastDbgState = (s_appRunning << 1)
+
+};
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class DbgController : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ DbgController();
+ virtual ~DbgController();
+
+ virtual bool stateIsOn( int state ) = 0;
+
+public slots:
+ virtual void configure() = 0;
+
+ virtual void slotCoreFile(const QString &coreFile) = 0;
+ virtual void slotAttachTo(int pid) = 0;
+
+ virtual void slotStopDebugger() = 0;
+
+ virtual void slotRun() = 0;
+ // Kills the application but does not stop the debugger itself.
+ virtual void slotKill() = 0;
+ virtual void slotRunUntil(const QString &fileName, int lineNum) = 0;
+ virtual void slotJumpTo(const QString &fileName, int lineNum) = 0;
+ virtual void slotStepInto() = 0;
+ virtual void slotStepOver() = 0;
+ virtual void slotStepIntoIns() = 0;
+ virtual void slotStepOverIns() = 0;
+ virtual void slotStepOutOff() = 0;
+
+ virtual void slotBreakInto() = 0;
+
+ // jw - for optional additional commands and initialization
+ virtual void slotVarItemConstructed(VarItem */*item*/) {}
+
+protected slots:
+ virtual void slotDbgStdout(KProcess *proc, char *buf, int buflen) = 0;
+ virtual void slotDbgStderr(KProcess*, char*, int) {} ;
+ virtual void slotDbgWroteStdin(KProcess *proc) = 0;
+ virtual void slotDbgProcessExited(KProcess *proc) = 0;
+
+signals:
+ void gotoSourcePosition (const QString &fileName, int lineNum);
+ void rawGDBMemoryDump (char *buf);
+ void rawGDBRegisters (char *buf);
+ void rawGDBLibraries (char *buf);
+ void ttyStdout (const char *output);
+ void ttyStderr (const char *output);
+ void gdbInternalCommandStdout (const char *output);
+ void gdbUserCommandStdout (const char *output);
+ void gdbStderr (const char *output);
+ void showStepInSource (const QString &fileName, int lineNum, const QString &address);
+ void dbgStatus (const QString &status, int statusFlag);
+
+protected:
+ KProcess *dbgProcess_;
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/dbgpsdlg.cpp b/languages/cpp/debugger/dbgpsdlg.cpp
new file mode 100644
index 00000000..524e4539
--- /dev/null
+++ b/languages/cpp/debugger/dbgpsdlg.cpp
@@ -0,0 +1,203 @@
+/***************************************************************************
+ begin : Mon Sep 20 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "dbgpsdlg.h"
+
+#include <kbuttonbox.h>
+#include <kdialog.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kprocess.h>
+#include <kstdguiitem.h>
+#include <kdeversion.h>
+#include <klistview.h>
+#include <klistviewsearchline.h>
+#include <kmessagebox.h>
+
+#include <qframe.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <qtoolbutton.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qheader.h>
+#include <qtimer.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+
+namespace GDBDebugger
+{
+
+/***************************************************************************/
+
+// Display a list of processes for the user to select one
+// only display processes that they can do something with so if the user
+// is root then display all processes
+// For use with the internal debugger, but this dialog doesn't know anything
+// about why it's doing it.
+
+Dbg_PS_Dialog::Dbg_PS_Dialog(QWidget *parent, const char *name)
+ : KDialog(parent, name, true), // modal
+ psProc_(0),
+ pids_(new KListView(this)),
+ pidLines_(QString())
+{
+ setCaption(i18n("Attach to Process"));
+
+ pids_->addColumn("PID");
+ pids_->addColumn("TTY");
+ pids_->addColumn("STAT");
+ pids_->addColumn("TIME");
+ pids_->addColumn("COMMAND");
+
+
+ QBoxLayout *topLayout = new QVBoxLayout(this, 5);
+
+ searchLineWidget_ = new KListViewSearchLineWidget(pids_, this);
+ topLayout->addWidget(searchLineWidget_);
+
+ topLayout->addWidget(pids_);
+ pids_->setFont(KGlobalSettings::fixedFont());
+
+ KButtonBox *buttonbox = new KButtonBox(this, Qt::Horizontal);
+ buttonbox->addStretch();
+ QPushButton *ok = buttonbox->addButton(KStdGuiItem::ok());
+ QPushButton *cancel = buttonbox->addButton(KStdGuiItem::cancel());
+ buttonbox->layout();
+ topLayout->addWidget(buttonbox);
+
+ connect(ok, SIGNAL(clicked()), SLOT(accept()));
+ connect(cancel, SIGNAL(clicked()), SLOT(reject()));
+
+ // Default display to 40 chars wide, default height is okay
+ resize( ((KGlobalSettings::fixedFont()).pointSize())*40, height());
+ topLayout->activate();
+
+ QTimer::singleShot(0, this, SLOT(slotInit()));
+
+}
+
+/***************************************************************************/
+
+Dbg_PS_Dialog::~Dbg_PS_Dialog()
+{
+ delete psProc_;
+}
+
+/***************************************************************************/
+
+int Dbg_PS_Dialog::pidSelected()
+{
+ return pids_->currentItem()->text(0).toInt();
+}
+
+/***************************************************************************/
+void Dbg_PS_Dialog::slotInit()
+{
+ psProc_ = new KShellProcess("/bin/sh");
+#ifdef USE_SOLARIS
+ *psProc_ << "ps";
+ *psProc_ << "-opid";
+ *psProc_ << "-otty";
+ *psProc_ << "-os";
+ *psProc_ << "-otime";
+ *psProc_ << "-oargs";
+ pidCmd_ = "ps -opid -otty -os -otime -oargs";
+
+ if (getuid() == 0) {
+ *psProc_ << "-e";
+ pidCmd_ += " -e";
+ }
+#else
+ *psProc_ << "ps";
+ *psProc_ << "x";
+ pidCmd_ = "ps x";
+
+ if (getuid() == 0) {
+ *psProc_ << "a";
+ pidCmd_ += " a";
+ }
+#endif
+
+ connect( psProc_, SIGNAL(processExited(KProcess *)), SLOT(slotProcessExited()) );
+ connect( psProc_, SIGNAL(receivedStdout(KProcess *, char *, int)), SLOT(slotReceivedOutput(KProcess *, char *, int)) );
+
+ psProc_->start(KProcess::NotifyOnExit, KProcess::Stdout);
+}
+
+/***************************************************************************/
+
+void Dbg_PS_Dialog::slotReceivedOutput(KProcess */*proc*/, char *buffer, int buflen)
+{
+ pidLines_ += QString::fromLocal8Bit(buffer, buflen);
+}
+
+/***************************************************************************/
+
+void Dbg_PS_Dialog::slotProcessExited()
+{
+ delete psProc_;
+ psProc_ = 0;
+
+ pidLines_ += '\n';
+
+ int start = pidLines_.find('\n', 0); // Skip the first line (header line)
+ int pos;
+
+ static QRegExp ps_output_line("^\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)");
+ while ( (pos = pidLines_.find('\n', start)) != -1) {
+
+ QString item = pidLines_.mid(start, pos-start);
+ if (!item.isEmpty() && item.find(pidCmd_) == -1)
+ {
+ if(ps_output_line.search(item) == -1)
+ {
+ KMessageBox::information(
+ this,
+ // FIXME: probably should XML-escape 'item' before passing it
+ // to 'arg'.
+ i18n("<b>Could not parse output from the <tt>ps</tt> command.</b>"
+ "<p>The following line could not be parsed:"
+ "<b><tt>%1</tt>").arg(item),
+ i18n("Internal error"), "gdb_error" );
+ break;
+ }
+
+ new QListViewItem(pids_,
+ ps_output_line.cap(1),
+ ps_output_line.cap(2),
+ ps_output_line.cap(3),
+ ps_output_line.cap(4),
+ ps_output_line.cap(5));
+ }
+
+ start = pos+1;
+ }
+ // Need to set focus here too, as KListView will
+ // 'steal' it otherwise.
+ searchLineWidget_->searchLine()->setFocus();
+}
+
+void Dbg_PS_Dialog::focusIn(QFocusEvent*)
+{
+ searchLineWidget_->searchLine()->setFocus();
+}
+
+}
+
+/***************************************************************************/
+#include "dbgpsdlg.moc"
diff --git a/languages/cpp/debugger/dbgpsdlg.h b/languages/cpp/debugger/dbgpsdlg.h
new file mode 100644
index 00000000..d88eb72f
--- /dev/null
+++ b/languages/cpp/debugger/dbgpsdlg.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ begin : Mon Sep 20 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DBGPSDLG_H_
+#define _DBGPSDLG_H_
+
+#include <kdialog.h>
+
+class QListBox;
+class KProcess;
+class KListView;
+class KListViewSearchLineWidget;
+
+namespace GDBDebugger
+{
+
+/***************************************************************************/
+
+class Dbg_PS_Dialog : public KDialog
+{
+ Q_OBJECT
+
+public:
+ Dbg_PS_Dialog( QWidget *parent=0, const char *name=0 );
+ ~Dbg_PS_Dialog();
+
+ int pidSelected();
+
+private slots:
+ void slotInit();
+ void slotReceivedOutput(KProcess *proc, char *buffer, int buflen);
+ void slotProcessExited();
+
+protected:
+ void focusIn(QFocusEvent*);
+
+private:
+ KProcess* psProc_;
+ KListView* pids_;
+ KListViewSearchLineWidget* searchLineWidget_;
+ QString pidLines_;
+ QString pidCmd_;
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/dbgtoolbar.cpp b/languages/cpp/debugger/dbgtoolbar.cpp
new file mode 100644
index 00000000..a3e58343
--- /dev/null
+++ b/languages/cpp/debugger/dbgtoolbar.cpp
@@ -0,0 +1,498 @@
+/***************************************************************************
+ begin : Thu Dec 23 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef QT_MAC
+#include "dbgtoolbar.h"
+#include "debuggerpart.h"
+#include "dbgcontroller.h"
+
+#include <kdockwindow.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kstandarddirs.h>
+#include <kwin.h>
+#include <kwinmodule.h>
+
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// Implements a floating toolbar for the debugger.
+
+// Unfortunately, I couldn't get the KToolBar to work nicely when it
+// was floating, so I was forced to write these classes. I'm not sure whether
+// I didn't try hard enough or ... and I've forgotten what the problems were
+// now.
+
+// The problem with using this is that it will not dock as a normal toolbar.
+// I'm not convince that this is a real problem though.
+
+// So, if you can get it to work as a KToolBar, and it works well when the
+// app is running, then all these classes can be removed.
+
+// This code is very specific to the internal debugger in kdevelop.
+
+namespace GDBDebugger
+{
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// This just allows the user to click on the toolbar and drag it somewhere else.
+// I would have preferred to use normal decoration on the toolbar and removed
+// the iconify, close, etc buttons from the window title but again I kept running
+// into problems. Instead, I used no decoration and this class. Also this looks
+// similar to the KToolBar floating style.
+class DbgMoveHandle : public QFrame
+{
+public:
+ DbgMoveHandle(DbgToolBar *parent=0, const char * name=0, WFlags f=0);
+ virtual ~DbgMoveHandle();
+
+ virtual void mousePressEvent(QMouseEvent *e);
+ virtual void mouseReleaseEvent(QMouseEvent *e);
+ virtual void mouseMoveEvent(QMouseEvent *e);
+
+private:
+ DbgToolBar* toolBar_;
+ QPoint offset_;
+ bool moving_;
+};
+
+// **************************************************************************
+
+DbgMoveHandle::DbgMoveHandle(DbgToolBar *parent, const char * name, WFlags f)
+ : QFrame(parent, name, f),
+ toolBar_(parent),
+ offset_(QPoint(0,0)),
+ moving_(false)
+{
+ setFrameStyle(QFrame::Panel|QFrame::Raised);
+ setFixedHeight(12);
+}
+
+// **************************************************************************
+
+DbgMoveHandle::~DbgMoveHandle()
+{
+}
+
+// **************************************************************************
+
+void DbgMoveHandle::mousePressEvent(QMouseEvent *e)
+{
+ QFrame::mousePressEvent(e);
+ if (moving_)
+ return;
+
+ if (e->button() == RightButton) {
+ KPopupMenu *menu = new KPopupMenu(this);
+ menu->insertTitle(i18n("Debug Toolbar"));
+ menu->insertItem(i18n("Dock to Panel"),
+ parent(), SLOT(slotDock()));
+ menu->insertItem(i18n("Dock to Panel && Iconify KDevelop"),
+ parent(), SLOT(slotIconifyAndDock()));
+ menu->popup(e->globalPos());
+ } else {
+ moving_ = true;
+ offset_ = parentWidget()->pos() - e->globalPos();
+ setFrameStyle(QFrame::Panel|QFrame::Sunken);
+ QApplication::setOverrideCursor(QCursor(sizeAllCursor));
+ setPalette(QPalette(colorGroup().background()));
+ repaint();
+ }
+}
+
+// **************************************************************************
+
+void DbgMoveHandle::mouseReleaseEvent(QMouseEvent *e)
+{
+ QFrame::mouseReleaseEvent(e);
+ moving_ = false;
+ offset_ = QPoint(0,0);
+ setFrameStyle(QFrame::Panel|QFrame::Raised);
+ QApplication::restoreOverrideCursor();
+ setPalette(QPalette(colorGroup().background()));
+ repaint();
+}
+
+// **************************************************************************
+
+void DbgMoveHandle::mouseMoveEvent(QMouseEvent *e)
+{
+ QFrame::mouseMoveEvent(e);
+ if (!moving_)
+ return;
+
+ toolBar_->move(e->globalPos() + offset_);
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// This class adds text _and_ a pixmap to a button. Why doesn't QPushButton
+// support that? It only allowed text _or_ pixmap.
+class DbgButton : public QPushButton
+{
+public:
+ DbgButton(const QPixmap &pixmap, const QString &text,
+ DbgToolBar *parent, const char *name=0);
+ virtual ~DbgButton() {};
+ void drawButtonLabel(QPainter *painter);
+ QSize sizeHint() const;
+
+private:
+ QPixmap pixmap_;
+};
+
+// **************************************************************************
+
+DbgButton::DbgButton(const QPixmap& pixmap, const QString& text,
+ DbgToolBar* parent, const char* name)
+ : QPushButton(parent, name),
+ pixmap_(pixmap)
+{
+ setText(text);
+}
+
+// **************************************************************************
+
+void DbgButton::drawButtonLabel(QPainter *painter)
+{
+ // We always have a pixmap (today...)
+ // Centre it if there's no text
+
+ bool hasText = !text().isEmpty();
+ int x = ((hasText ? height() : width()) - pixmap_.width()) / 2;
+ int y = (height() - pixmap_.height()) / 2;
+ painter->drawPixmap(x, y, pixmap_);
+
+ if (hasText) {
+ painter->setPen(colorGroup().text());
+ painter->drawText(height()+2, 0, width()-(height()+2), height(), AlignLeft|AlignVCenter, text());
+ }
+}
+
+// **************************************************************************
+
+QSize DbgButton::sizeHint() const
+{
+ if (text().isEmpty())
+ return pixmap_.size();
+ else
+ {
+ QSize ps = pixmap_.size();
+ QSize bs = QPushButton::sizeHint();
+ QSize result;
+ result.setWidth( ps.width() + bs.width()+10 );
+ result.setHeight( ps.height() > bs.height() ? ps.height() : bs.height() );
+ return result;
+ }
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+DbgDocker::DbgDocker(QWidget* parent, DbgToolBar* toolBar, const QPixmap& pixmap) :
+ KSystemTray(parent, "DbgDocker"),
+ toolBar_(toolBar)
+{
+ setPixmap(pixmap);
+ QToolTip::add( this, i18n("KDevelop debugger: Click to execute one line of code (\"step\")") );
+}
+
+// **************************************************************************
+
+void DbgDocker::mousePressEvent(QMouseEvent *e)
+{
+ if (!rect().contains( e->pos()))
+ return;
+
+ switch (e->button()) {
+ case LeftButton:
+ {
+ // Not really a click, but it'll hold for the time being !!!
+ emit clicked();
+ break;
+ }
+ case RightButton:
+ {
+ KPopupMenu* menu = new KPopupMenu(this);
+ menu->insertTitle(i18n("Debug Toolbar"));
+ menu->insertItem(i18n("Activate"), toolBar_, SLOT(slotUndock()));
+ menu->insertItem(i18n("Activate (KDevelop gets focus)"), toolBar_, SLOT(slotActivateAndUndock()));
+ menu->popup(e->globalPos());
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+DbgToolBar::DbgToolBar(DebuggerPart* part,
+ QWidget* parent, const char* name)
+ : QFrame(0, name),
+ part_(part),
+ activeWindow_(0),
+ winModule_(0),
+ bKDevFocus_(0),
+ bPrevFocus_(0),
+ appIsActive_(false),
+ docked_(false),
+ docker_(0),
+ dockWindow_(new KSystemTray(parent))
+{
+ winModule_ = new KWinModule(this);
+ docker_ = new DbgDocker(parent, this, BarIcon("dbgnext"));
+ connect(docker_, SIGNAL(clicked()), part_, SLOT(slotStepOver()));
+
+ // Must have noFocus set so that we can see what window was active.
+ // see slotDbgKdevFocus() for more comments
+ // I do not want the user to be able to "close" this widget. If we have any
+ // decoration then they can and that is bad.
+ // This widget is closed when the debugger finishes i.e. they press "Stop"
+
+ // Do we need NoFocus???
+ KWin::setState(winId(), NET::StaysOnTop | NET::SkipTaskbar);
+// KWin::setType(winId(), NET::Override); // So it has no decoration
+ KWin::setType(winId(), NET::Dock);
+
+ setFocusPolicy(NoFocus);
+ setFrameStyle( QFrame::Box | QFrame::Plain );
+ setLineWidth(4);
+ setMidLineWidth(0);
+
+ QBoxLayout* topLayout = new QVBoxLayout(this);
+
+ QBoxLayout* nextLayout = new QHBoxLayout();
+ QBoxLayout* stepLayout = new QHBoxLayout();
+ QBoxLayout* focusLayout = new QHBoxLayout();
+
+ DbgMoveHandle* moveHandle= new DbgMoveHandle(this);
+
+ QPushButton* bRun = new DbgButton(BarIcon("dbgrun"), i18n("Run"), this);
+ QPushButton* bInterrupt = new DbgButton(BarIcon("player_pause"), i18n("Interrupt"), this);
+ QPushButton* bNext = new DbgButton(BarIcon("dbgnext"), QString::null, this);
+ QPushButton* bNexti = new DbgButton(BarIcon("dbgnextinst"), QString::null, this);
+ QPushButton* bStep = new DbgButton(BarIcon("dbgstep"), QString::null, this);
+ QPushButton* bStepi = new DbgButton(BarIcon("dbgstepinst"), QString::null, this);
+ QPushButton* bFinish = new DbgButton(BarIcon("dbgstepout"), i18n("Step Out"), this);
+ QPushButton* bRunTo = new DbgButton(BarIcon("dbgrunto"), i18n("Run to Cursor"), this);
+ QPushButton* bView = new DbgButton(BarIcon("dbgmemview"), i18n("Viewers"), this);
+ bKDevFocus_ = new DbgButton(BarIcon("kdevelop"), QString::null, this);
+ bPrevFocus_ = new DbgButton(BarIcon("dbgmemview"), QString::null, this);
+
+ connect(bRun, SIGNAL(clicked()), part_, SLOT(slotRun()));
+ connect(bInterrupt, SIGNAL(clicked()), part_, SLOT(slotPause()));
+ connect(bNext, SIGNAL(clicked()), part_, SLOT(slotStepOver()));
+ connect(bNexti, SIGNAL(clicked()), part_, SLOT(slotStepOverInstruction()));
+ connect(bStep, SIGNAL(clicked()), part_, SLOT(slotStepInto()));
+ connect(bStepi, SIGNAL(clicked()), part_, SLOT(slotStepIntoInstruction()));
+ connect(bFinish, SIGNAL(clicked()), part_, SLOT(slotStepOut()));
+ connect(bRunTo, SIGNAL(clicked()), part_, SLOT(slotRunToCursor()));
+ connect(bView, SIGNAL(clicked()), part_, SLOT(slotMemoryView()));
+ connect(bKDevFocus_, SIGNAL(clicked()), this, SLOT(slotKdevFocus()));
+ connect(bPrevFocus_, SIGNAL(clicked()), this, SLOT(slotPrevFocus()));
+
+ QToolTip::add( bRun, i18n("Continue with application execution, may start the application") );
+ QToolTip::add( bInterrupt, i18n("Interrupt the application execution") );
+ QToolTip::add( bNext, i18n("Execute one line of code, but run through functions") );
+ QToolTip::add( bNexti, i18n("Execute one assembler instruction, but run through functions") );
+ QToolTip::add( bStep, i18n("Execute one line of code, stepping into functions if appropriate") );
+ QToolTip::add( bStepi, i18n("Execute one assembler instruction, stepping into functions if appropriate") );
+ QToolTip::add( bFinish, i18n("Execute to end of current stack frame") );
+ QToolTip::add( bRunTo, i18n("Continues execution until the cursor position is reached.") );
+ QToolTip::add( bView, i18n("Memory, dissemble, registers, library viewers") );
+ QToolTip::add( bKDevFocus_, i18n("Set focus on KDevelop") );
+ QToolTip::add( bPrevFocus_, i18n("Set focus on window that had focus when KDevelop got focus") );
+
+ QWhatsThis::add( bRun, i18n("Continue with application execution. May start the application.") );
+ QWhatsThis::add( bInterrupt, i18n("Interrupt the application execution.") );
+ QWhatsThis::add( bNext, i18n("Execute one line of code, but run through functions.") );
+ QWhatsThis::add( bNexti, i18n("Execute one assembler instruction, but run through functions.") );
+ QWhatsThis::add( bStep, i18n("Execute one line of code, stepping into functions if appropriate.") );
+ QWhatsThis::add( bStepi, i18n("Execute one assembler instruction, stepping into functions if appropriate.") );
+ QWhatsThis::add( bFinish, i18n("Execute to end of current stack frame.") );
+ QWhatsThis::add( bRunTo, i18n("Continues execution until the cursor position is reached.") );
+ QWhatsThis::add( bView, i18n("Memory, dissemble, registers, library viewers.") );
+ QWhatsThis::add( bKDevFocus_, i18n("Set focus on KDevelop.") );
+ QWhatsThis::add( bPrevFocus_, i18n("Set focus on window that had focus when KDevelop got focus.") );
+
+ topLayout->addWidget(moveHandle);
+ topLayout->addWidget(bRun);
+ topLayout->addLayout(nextLayout);
+ topLayout->addLayout(stepLayout);
+ topLayout->addWidget(bFinish);
+ topLayout->addWidget(bRunTo);
+ topLayout->addWidget(bView);
+ topLayout->addWidget(bInterrupt);
+ topLayout->addLayout(focusLayout);
+
+ focusLayout->addWidget(bKDevFocus_);
+ focusLayout->addWidget(bPrevFocus_);
+
+ stepLayout->addWidget(bStep);
+ stepLayout->addWidget(bStepi);
+
+ nextLayout->addWidget(bNext);
+ nextLayout->addWidget(bNexti);
+
+// int w = QMAX(bRun->sizeHint().width(), bFinish->sizeHint().width());
+// w = QMAX(w, bInterrupt->sizeHint().width());
+// w = QMAX(w, bView->sizeHint().width());
+
+ // they should have the same height, so don't be too fussy
+// int h = bFinish->sizeHint().height();
+//
+// bNext->setMinimumHeight(h);
+// bNexti->setMinimumHeight(h);
+// bStep->setMinimumHeight(h);
+// bStepi->setMinimumHeight(h);
+// bKDevFocus_->setMinimumHeight(h);
+// bPrevFocus_->setMinimumHeight(h);
+
+// setMinimumSize(w+10, h*7);
+// setMaximumSize(w+10, h*7);
+
+ setAppIndicator(appIsActive_);
+ topLayout->activate();
+}
+
+// **************************************************************************
+
+DbgToolBar::~DbgToolBar()
+{
+ slotUndock();
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotKdevFocus()
+{
+ // I really want to be able to set the focus on the _application_ being debugged
+ // but this is the best compromise I can come up with. All we do is save the
+ // window that had focus when they switch to the kdevelop window. To do this
+ // the toolbar _cannot_ accept focus.
+ // If anyone has a way of determining what window the app is _actually_ running on
+ // then please fix and send a patch.
+
+ if (winModule_->activeWindow() != topLevelWidget()->winId())
+ activeWindow_ = winModule_->activeWindow();
+
+ KWin::activateWindow(topLevelWidget()->winId());
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotPrevFocus()
+{
+ KWin::activateWindow(activeWindow_);
+}
+
+// **************************************************************************
+
+// If the app is active then the app button is highlighted, otherwise
+// kdev button is highlighted.
+void DbgToolBar::slotDbgStatus(const QString&, int state)
+{
+ bool appIndicator = state & s_dbgBusy;
+ if (appIndicator != appIsActive_) {
+ setAppIndicator(appIndicator);
+ appIsActive_ = appIndicator;
+ }
+}
+
+// **************************************************************************
+
+void DbgToolBar::setAppIndicator(bool appIndicator)
+{
+ if (appIndicator) {
+ bPrevFocus_->setPalette(QPalette(colorGroup().mid()));
+ bKDevFocus_->setPalette(QPalette(colorGroup().background()));
+ } else {
+ bPrevFocus_->setPalette(QPalette(colorGroup().background()));
+ bKDevFocus_->setPalette(QPalette(colorGroup().mid()));
+ }
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotDock()
+{
+ if (docked_)
+ return;
+
+ // Q_ASSERT(!docker_);
+ hide();
+
+ docker_->show();
+ docked_ = true;
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotIconifyAndDock()
+{
+ if (docked_)
+ return;
+
+ // KWin::iconifyWindow(ckDevelop_->winId(), true);
+ slotDock();
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotUndock()
+{
+ if (!docked_)
+ return;
+
+ show();
+ docker_->hide();
+ docked_ = false;
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotActivateAndUndock()
+{
+ if (!docked_)
+ return;
+
+ KWin::activateWindow(topLevelWidget()->winId());
+ slotUndock();
+}
+
+}
+
+// **************************************************************************
+#include "dbgtoolbar.moc"
+#endif
diff --git a/languages/cpp/debugger/dbgtoolbar.h b/languages/cpp/debugger/dbgtoolbar.h
new file mode 100644
index 00000000..4f284701
--- /dev/null
+++ b/languages/cpp/debugger/dbgtoolbar.h
@@ -0,0 +1,85 @@
+/***************************************************************************
+ begin : Thu Dec 23 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 *q
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+#ifndef QT_MAC
+#ifndef _DBGTOOLBAR_H_
+#define _DBGTOOLBAR_H_
+
+class KWinModule;
+
+#include <ksystemtray.h>
+#include <kwin.h> // needed for WId :(
+
+#include <qframe.h>
+
+namespace GDBDebugger
+{
+
+class DbgButton;
+class DbgToolBar;
+class DebuggerPart;
+
+class DbgDocker : public KSystemTray
+{
+ Q_OBJECT
+
+public:
+ DbgDocker(QWidget *parent, DbgToolBar *toolBar, const QPixmap &pixmap);
+ virtual ~DbgDocker() {};
+ virtual void mousePressEvent(QMouseEvent *e);
+
+signals:
+ void clicked();
+
+private:
+ DbgToolBar* toolBar_;
+};
+
+
+class DbgToolBar : public QFrame
+{
+ Q_OBJECT
+
+public:
+ DbgToolBar(DebuggerPart *part, QWidget* parent, const char* name=0);
+ virtual ~DbgToolBar();
+
+private slots:
+ void slotDbgStatus(const QString&, int);
+ void slotDock();
+ void slotUndock();
+ void slotIconifyAndDock();
+ void slotActivateAndUndock();
+
+ void slotKdevFocus();
+ void slotPrevFocus();
+
+private:
+ void setAppIndicator(bool appIndicator);
+
+ DebuggerPart* part_;
+ WId activeWindow_;
+ KWinModule* winModule_;
+ DbgButton* bKDevFocus_;
+ DbgButton* bPrevFocus_;
+ bool appIsActive_;
+ bool docked_;
+ DbgDocker* docker_;
+ KSystemTray* dockWindow_;
+};
+
+}
+
+#endif
+#endif
diff --git a/languages/cpp/debugger/debuggerconfigwidget.cpp b/languages/cpp/debugger/debuggerconfigwidget.cpp
new file mode 100644
index 00000000..93e52e64
--- /dev/null
+++ b/languages/cpp/debugger/debuggerconfigwidget.cpp
@@ -0,0 +1,138 @@
+/***************************************************************************
+ * Copyright (C) 1999-2001 by John Birch *
+ * jbb@kdevelop.org *
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "debuggerconfigwidget.h"
+
+#include "debuggerpart.h"
+#include "kdevproject.h"
+
+#include "domutil.h"
+#include <kurlrequester.h>
+#include <klineedit.h>
+
+#include <qcheckbox.h>
+#include <qfileinfo.h>
+#include <qradiobutton.h>
+
+namespace GDBDebugger
+{
+
+DebuggerConfigWidget::DebuggerConfigWidget(DebuggerPart* part, QWidget *parent, const char *name)
+ : DebuggerConfigWidgetBase(parent, name), dom(*part->projectDom())
+{
+ gdbPath_edit->setMode(KFile::File|KFile::ExistingOnly|KFile::LocalOnly);
+
+ gdbPath_edit->setURL( DomUtil::readEntry(dom, "/kdevdebugger/general/gdbpath"));
+
+ QString shell = DomUtil::readEntry(dom, "/kdevdebugger/general/dbgshell","no_value");
+ if( shell == QString("no_value") )
+ {
+ QFileInfo info( part->project()->buildDirectory() + "/libtool" );
+ if( info.exists() ) {
+ shell = "libtool";
+ } else {
+ // Try one directory up.
+ info.setFile( part->project()->buildDirectory() + "/../libtool" );
+ if( info.exists() ) {
+ shell = "../libtool";
+ } else {
+ // Give up.
+ shell = QString::null;
+ }
+ }
+ }
+ debuggingShell_edit->setURL( shell );
+
+ // Use setFile instead?
+ configGdbScript_edit->setURL( DomUtil::readEntry(dom, "/kdevdebugger/general/configGdbScript"));
+ runShellScript_edit ->setURL( DomUtil::readEntry(dom, "/kdevdebugger/general/runShellScript"));
+ runGdbScript_edit ->setURL( DomUtil::readEntry(dom, "/kdevdebugger/general/runGdbScript"));
+
+ displayStaticMembers_box->setChecked( DomUtil::readBoolEntry(dom, "/kdevdebugger/display/staticmembers", false));
+ asmDemangle_box->setChecked( DomUtil::readBoolEntry(dom, "/kdevdebugger/display/demanglenames", true));
+ breakOnLoadingLibrary_box->setChecked( DomUtil::readBoolEntry(dom, "/kdevdebugger/general/breakonloadinglibs", true));
+ dbgTerminal_box->setChecked( DomUtil::readBoolEntry(dom, "/kdevdebugger/general/separatetty", false));
+ enableFloatingToolBar_box->setChecked( DomUtil::readBoolEntry(dom, "/kdevdebugger/general/floatingtoolbar", false));
+ int outputRadix = DomUtil::readIntEntry(dom, "/kdevdebugger/display/outputradix", 10);
+
+ switch (outputRadix)
+ {
+ case 8:
+ outputRadixOctal->setChecked(true);
+ break;
+ case 16:
+ outputRadixHexadecimal->setChecked(true);
+ break;
+ case 10:
+ default:
+ outputRadixDecimal->setChecked(true);
+ break;
+ }
+
+
+ if( DomUtil::readBoolEntry( dom, "/kdevdebugger/general/raiseGDBOnStart", false ) )
+ {
+ radioGDB->setChecked(true);
+ }else
+ {
+ radioFramestack->setChecked(true);
+ }
+
+ // ??? DomUtil::readEntry(dom, "/kdevdebugger/general/allowforcedbpset");
+
+ resize(sizeHint());
+}
+
+
+DebuggerConfigWidget::~DebuggerConfigWidget()
+{}
+
+
+void DebuggerConfigWidget::accept()
+{
+ DomUtil::writeEntry(dom, "/kdevdebugger/general/gdbpath", gdbPath_edit->url());
+ DomUtil::writeEntry(dom, "/kdevdebugger/general/dbgshell", debuggingShell_edit->url());
+
+ DomUtil::writeEntry(dom, "/kdevdebugger/general/configGdbScript", configGdbScript_edit->url());
+ DomUtil::writeEntry(dom, "/kdevdebugger/general/runShellScript", runShellScript_edit ->url());
+ DomUtil::writeEntry(dom, "/kdevdebugger/general/runGdbScript", runGdbScript_edit ->url());
+
+ DomUtil::writeBoolEntry(dom, "/kdevdebugger/display/staticmembers", displayStaticMembers_box->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevdebugger/display/demanglenames", asmDemangle_box->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevdebugger/general/breakonloadinglibs", breakOnLoadingLibrary_box->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevdebugger/general/separatetty", dbgTerminal_box->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevdebugger/general/floatingtoolbar", enableFloatingToolBar_box->isChecked());
+
+ int outputRadix;
+ if (outputRadixOctal->isChecked())
+ outputRadix = 8;
+ else if (outputRadixHexadecimal->isChecked())
+ outputRadix = 16;
+ else
+ outputRadix = 10;
+
+ DomUtil::writeIntEntry(dom, "/kdevdebugger/display/outputradix", outputRadix);
+
+ if( radioGDB->isChecked() )
+ {
+ DomUtil::writeBoolEntry(dom, "/kdevdebugger/general/raiseGDBOnStart", true);
+ }else
+ {
+ DomUtil::writeBoolEntry(dom, "/kdevdebugger/general/raiseGDBOnStart", false);
+ }
+
+}
+
+}
+
+#include "debuggerconfigwidget.moc"
diff --git a/languages/cpp/debugger/debuggerconfigwidget.h b/languages/cpp/debugger/debuggerconfigwidget.h
new file mode 100644
index 00000000..dbf63d4b
--- /dev/null
+++ b/languages/cpp/debugger/debuggerconfigwidget.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 1999-2001 by John Birch *
+ * jbb@kdevelop.org *
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DEBUGGERCONFIGWIDGET_H_
+#define _DEBUGGERCONFIGWIDGET_H_
+
+#include "debuggerconfigwidgetbase.h"
+
+#include <qdom.h>
+
+namespace GDBDebugger
+{
+
+class DebuggerPart;
+
+class DebuggerConfigWidget : public DebuggerConfigWidgetBase
+{
+ Q_OBJECT
+
+public:
+ DebuggerConfigWidget( DebuggerPart* part, QWidget *parent=0, const char *name=0 );
+ ~DebuggerConfigWidget();
+
+public slots:
+ void accept();
+
+private:
+ QDomDocument &dom;
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/debuggerconfigwidgetbase.ui b/languages/cpp/debugger/debuggerconfigwidgetbase.ui
new file mode 100644
index 00000000..bf81b2d3
--- /dev/null
+++ b/languages/cpp/debugger/debuggerconfigwidgetbase.ui
@@ -0,0 +1,453 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DebuggerConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>debugger_config_widget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>558</width>
+ <height>627</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Debugger Configuration</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Debug arguments can be set on the Run Options page
+ or directly in the project manager</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>gdbPath_label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Debugger executable:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>gdbPath_edit</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>gdbPath_edit</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Gdb executable</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>To run "gdb" binary from $PATH, leave this field empty. To run custom gdb, for example, for a different architecture, enter the executable name here. You can either run gdb from $PATH, but with a different name (say, "arm-gdb"), by typing the name here, or specify full path to the gdb executable.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>debuggingShell_label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Debugging &amp;shell:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>debuggingShell_edit</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Run gdb in a special shell (mainly for automake projects)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If you want gdb to be executed by a special shell or tool insert it here. The main use-case is for Automake based projects where the application is actually only a script and libtool is needed to get it to run inside gdb.</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>debuggingShell_edit</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Run gdb in a special shell (mainly for automake projects)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If you want gdb to be executed by a special shell or tool insert it here. The main use-case is for Automake based projects where the application is actually only a script and &lt;b&gt;libtool&lt;/b&gt; is needed to get it to run inside gdb.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>asmDemangle_box</cstring>
+ </property>
+ <property name="text">
+ <string>Display &amp;demangled names</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When displaying the disassembled code you
+can select to see the methods' mangled names.
+However, non-mangled names are easier to read.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>breakOnLoadingLibrary_box</cstring>
+ </property>
+ <property name="text">
+ <string>Try settings &amp;breakpoints on library loading</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If GDB has not seen a library that will be loaded via
+"dlopen" then it will refuse to set a breakpoint in that code.
+We can get GDB to stop on a library load and hence
+try to set the pending breakpoints. See the documentation
+for more details relating to this behavior.
+
+If you are not "dlopen"ing libs then leave this unchecked.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0">
+ <property name="name">
+ <cstring>dbgTerminal_box</cstring>
+ </property>
+ <property name="text">
+ <string>Enable separate terminal for application &amp;IO</string>
+ </property>
+ <property name="accel">
+ <string>Alt+I</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This allows you to enter terminal input when your
+application contains terminal input code (e.g. cin, fgets, etc.).
+If you use terminal input in your application then check this option.
+Otherwise leave it unchecked.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>enableFloatingToolBar_box</cstring>
+ </property>
+ <property name="text">
+ <string>E&amp;nable floating toolbar</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Use the floating toolbar. This toolbar always stays
+on top of all windows so that if the app covers KDevelop
+you have control of the app through the small toolbar. It
+can also be docked into the panel.
+
+This toolbar is in addition to the toolbar in KDevelop.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>displayStaticMembers_box</cstring>
+ </property>
+ <property name="text">
+ <string>Display static &amp;members</string>
+ </property>
+ <property name="accel">
+ <string>Alt+M</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Displaying static members makes GDB slower in
+producing data within KDE and Qt.
+It may change the "signature" of the data
+which QString and friends rely on,
+but if you need to debug into these values then
+check this option.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>globalOutputRadix</cstring>
+ </property>
+ <property name="title">
+ <string>Global Output Radix</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>outputRadixOctal</cstring>
+ </property>
+ <property name="text">
+ <string>Oct&amp;al</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>outputRadixHexadecimal</cstring>
+ </property>
+ <property name="text">
+ <string>He&amp;xadecimal</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>outputRadixDecimal</cstring>
+ </property>
+ <property name="text">
+ <string>Decimal</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>Start Debugger With</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioFramestack</cstring>
+ </property>
+ <property name="text">
+ <string>Framestack</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioGDB</cstring>
+ </property>
+ <property name="text">
+ <string>GDB Output</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Remote Debugging</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This script is intended for the actual commands needed to connect to a remotely running executable.
+ shell sleep 5 wait for remote program to start
+ target remote ... connect to the remote debugger
+ continue [optional] run debugging to the first breakpoint.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>runShellScript_label</cstring>
+ </property>
+ <property name="text">
+ <string>R&amp;un shell script:</string>
+ <comment>Shell script to be executed at run time</comment>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>runShellScript_edit</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="2" column="1">
+ <property name="name">
+ <cstring>runGdbScript_edit</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Script to connect with remote application</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This script is sourced by gdb after the two preceding scripts have been executed.
+This script is intended for the actual commands needed to connect to a remotely running executable.
+ shell sleep 5 wait for remote program to start
+ target remote ... connect to the remote debugger
+ continue [optional] run debugging to the first breakpoint.</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="1" column="1">
+ <property name="name">
+ <cstring>runShellScript_edit</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Script to start remote application</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This shell script is run after the Config gdb script has been sourced by gdb.
+When debugging remotely this script is intended to actually start the remote process.
+[It is expected that the debug executable can be reached on the target, maybe by downloading it as a final build step]
+1) Find a way to execute a command remotely - rsh, ssh, telnet, ...
+2a) Execute "gdbserver ... application" on target.
+or if your executable contains the gdb stub
+2b) Execute "application" on target.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>runGdbScript_label</cstring>
+ </property>
+ <property name="text">
+ <string>Run &amp;gdb script:</string>
+ <comment>Gdb script to be executed at run time.</comment>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>runGdbScript_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>configGdbScript_label</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Config gdb script:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>configGdbScript_edit</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="0" column="1">
+ <property name="name">
+ <cstring>configGdbScript_edit</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Gdb configure script</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This script is sourced by gdb when the debugging starts.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>debuggingShell_edit</tabstop>
+ <tabstop>gdbPath_edit</tabstop>
+ <tabstop>displayStaticMembers_box</tabstop>
+ <tabstop>asmDemangle_box</tabstop>
+ <tabstop>breakOnLoadingLibrary_box</tabstop>
+ <tabstop>enableFloatingToolBar_box</tabstop>
+ <tabstop>dbgTerminal_box</tabstop>
+ <tabstop>outputRadixOctal</tabstop>
+ <tabstop>outputRadixDecimal</tabstop>
+ <tabstop>outputRadixHexadecimal</tabstop>
+ <tabstop>configGdbScript_edit</tabstop>
+ <tabstop>runShellScript_edit</tabstop>
+ <tabstop>runGdbScript_edit</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/debugger/debuggerdcopinterface.h b/languages/cpp/debugger/debuggerdcopinterface.h
new file mode 100644
index 00000000..4a9bcf30
--- /dev/null
+++ b/languages/cpp/debugger/debuggerdcopinterface.h
@@ -0,0 +1,29 @@
+/***************************************************************************
+ * Copyright (C) 2003 Hamish Rodda <rodda@kde.org> *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef DEBUGGERDCOPINTERFACE_H
+#define DEBUGGERDCOPINTERFACE_H
+
+#include <dcopobject.h>
+
+/**
+ * Enables dcop communication with the debugger part.
+ */
+class DebuggerDCOPInterface : public DCOPObject
+{
+ K_DCOP
+public:
+
+k_dcop:
+ virtual ASYNC slotDebugExternalProcess() = 0;
+ virtual ASYNC slotDebugCommandLine(const QString& command) = 0;
+};
+
+#endif
diff --git a/languages/cpp/debugger/debuggerpart.cpp b/languages/cpp/debugger/debuggerpart.cpp
new file mode 100644
index 00000000..c8c3c1a1
--- /dev/null
+++ b/languages/cpp/debugger/debuggerpart.cpp
@@ -0,0 +1,1272 @@
+/***************************************************************************
+ * Copyright (C) 1999-2001 by John Birch *
+ * jbb@kdevelop.org *
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "debuggerpart.h"
+#include "label_with_double_click.h"
+
+#include <qdir.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+#include <qpopupmenu.h>
+#include <qtooltip.h>
+
+#include <kaction.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kdevgenericfactory.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kstatusbar.h>
+#include <kparts/part.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <kmessagebox.h>
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <qtimer.h>
+#include <kstringhandler.h>
+#include <kdockwidget.h>
+
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevmainwindow.h"
+#include "kdevappfrontend.h"
+#include "kdevpartcontroller.h"
+#include "kdevdebugger.h"
+#include "domutil.h"
+#include "variablewidget.h"
+#include "gdbbreakpointwidget.h"
+#include "framestackwidget.h"
+#include "disassemblewidget.h"
+#include "processwidget.h"
+#include "gdbcontroller.h"
+#include "breakpoint.h"
+#include "dbgpsdlg.h"
+#include "dbgtoolbar.h"
+#include "memviewdlg.h"
+#include "gdbparser.h"
+#include "gdboutputwidget.h"
+#include "debuggerconfigwidget.h"
+#include "processlinemaker.h"
+
+#include <iostream>
+
+#include <kdevplugininfo.h>
+#include <debugger.h>
+
+
+
+
+
+namespace GDBDebugger
+{
+
+static const KDevPluginInfo data("kdevdebugger");
+
+typedef KDevGenericFactory<DebuggerPart> DebuggerFactory;
+K_EXPORT_COMPONENT_FACTORY( libkdevdebugger, DebuggerFactory( data ) )
+
+DebuggerPart::DebuggerPart( QObject *parent, const char *name, const QStringList & ) :
+ KDevPlugin( &data, parent, name ? name : "DebuggerPart" ),
+ controller(0), previousDebuggerState_(s_dbgNotStarted),
+ justRestarted_(false), needRebuild_(true),
+ running_(false)
+{
+ setObjId("DebuggerInterface");
+ setInstance(DebuggerFactory::instance());
+
+ setXMLFile("kdevdebugger.rc");
+
+ m_debugger = new Debugger( partController() );
+
+ statusBarIndicator = new LabelWithDoubleClick(
+ " ", mainWindow()->statusBar());
+ statusBarIndicator->setFixedWidth(15);
+ statusBarIndicator->setAlignment(Qt::AlignCenter);
+ mainWindow()->statusBar()->addWidget(statusBarIndicator, 0, true);
+ statusBarIndicator->show();
+
+ // Setup widgets and dbgcontroller
+
+ controller = new GDBController(*projectDom());
+
+
+ gdbBreakpointWidget = new GDBBreakpointWidget( controller,
+ 0, "gdbBreakpointWidget" );
+ gdbBreakpointWidget->setCaption(i18n("Breakpoint List"));
+ QWhatsThis::add
+ (gdbBreakpointWidget, i18n("<b>Breakpoint list</b><p>"
+ "Displays a list of breakpoints with "
+ "their current status. Clicking on a "
+ "breakpoint item allows you to change "
+ "the breakpoint and will take you "
+ "to the source in the editor window."));
+ gdbBreakpointWidget->setIcon( SmallIcon("stop") );
+ mainWindow()->embedOutputView(gdbBreakpointWidget, i18n("Breakpoints"), i18n("Debugger breakpoints"));
+
+ variableWidget = new VariableWidget( controller,
+ gdbBreakpointWidget,
+ 0, "variablewidget");
+ mainWindow()->embedSelectView(variableWidget, i18n("Variables"),
+ i18n("Debugger variable-view"));
+ mainWindow()->setViewAvailable(variableWidget, false);
+
+ framestackWidget = new FramestackWidget( controller, 0, "framestackWidget" );
+ framestackWidget->setEnabled(false);
+ framestackWidget->setCaption(i18n("Frame Stack"));
+ QWhatsThis::add
+ (framestackWidget, i18n("<b>Frame stack</b><p>"
+ "Often referred to as the \"call stack\", "
+ "this is a list showing what function is "
+ "currently active and who called each "
+ "function to get to this point in your "
+ "program. By clicking on an item you "
+ "can see the values in any of the "
+ "previous calling functions."));
+ framestackWidget->setIcon( SmallIcon("table") );
+ mainWindow()->embedOutputView(framestackWidget, i18n("Frame Stack"), i18n("Debugger function call stack"));
+ mainWindow()->setViewAvailable(framestackWidget, false);
+
+ disassembleWidget = new DisassembleWidget( controller, 0, "disassembleWidget" );
+ disassembleWidget->setEnabled(false);
+ disassembleWidget->setCaption(i18n("Machine Code Display"));
+ QWhatsThis::add
+ (disassembleWidget, i18n("<b>Machine code display</b><p>"
+ "A machine code view into your running "
+ "executable with the current instruction "
+ "highlighted. You can step instruction by "
+ "instruction using the debuggers toolbar "
+ "buttons of \"step over\" instruction and "
+ "\"step into\" instruction."));
+ disassembleWidget->setIcon( SmallIcon("gear") );
+ mainWindow()->embedOutputView(disassembleWidget, i18n("Disassemble"),
+ i18n("Debugger disassemble view"));
+ mainWindow()->setViewAvailable(disassembleWidget, false);
+
+ gdbOutputWidget = new GDBOutputWidget( 0, "gdbOutputWidget" );
+ gdbOutputWidget->setEnabled(false);
+ gdbOutputWidget->setIcon( SmallIcon("inline_image") );
+ gdbOutputWidget->setCaption(i18n("GDB Output"));
+ QWhatsThis::add
+ (gdbOutputWidget, i18n("<b>GDB output</b><p>"
+ "Shows all gdb commands being executed. "
+ "You can also issue any other gdb command while debugging."));
+ mainWindow()->embedOutputView(gdbOutputWidget, i18n("GDB"),
+ i18n("GDB output"));
+ mainWindow()->setViewAvailable(gdbOutputWidget, false);
+
+ // gdbBreakpointWidget -> this
+ connect( gdbBreakpointWidget, SIGNAL(refreshBPState(const Breakpoint&)),
+ this, SLOT(slotRefreshBPState(const Breakpoint&)));
+ connect( gdbBreakpointWidget, SIGNAL(publishBPState(const Breakpoint&)),
+ this, SLOT(slotRefreshBPState(const Breakpoint&)));
+ connect( gdbBreakpointWidget, SIGNAL(gotoSourcePosition(const QString&, int)),
+ this, SLOT(slotGotoSource(const QString&, int)) );
+
+
+ viewerWidget = new ViewerWidget( controller, 0, "viewerWidget");
+ mainWindow()->embedSelectView(viewerWidget,
+ i18n("Debug views"),
+ i18n("Special debugger views"));
+ mainWindow()->setViewAvailable(viewerWidget, false);
+ connect(viewerWidget, SIGNAL(setViewShown(bool)),
+ this, SLOT(slotShowView(bool)));
+
+ // Now setup the actions
+ KAction *action;
+
+// action = new KAction(i18n("&Start"), "1rightarrow", CTRL+SHIFT+Key_F9,
+ action = new KAction(i18n("&Start"), "dbgrun", Key_F9,
+ this, SLOT(slotRun()),
+ actionCollection(), "debug_run");
+ action->setToolTip( i18n("Start in debugger") );
+ action->setWhatsThis( i18n("<b>Start in debugger</b><p>"
+ "Starts the debugger with the project's main "
+ "executable. You may set some breakpoints "
+ "before this, or you can interrupt the program "
+ "while it is running, in order to get information "
+ "about variables, frame stack, and so on.") );
+
+ action = new KAction(i18n("&Restart"), "dbgrestart", 0,
+ this, SLOT(slotRestart()),
+ actionCollection(), "debug_restart");
+ action->setToolTip( i18n("Restart program") );
+ action->setWhatsThis( i18n("<b>Restarts application</b><p>"
+ "Restarts applications from the beginning."
+ ) );
+ action->setEnabled(false);
+
+
+ action = new KAction(i18n("Sto&p"), "stop", 0,
+ this, SLOT(slotStop()),
+ actionCollection(), "debug_stop");
+ action->setToolTip( i18n("Stop debugger") );
+ action->setWhatsThis(i18n("<b>Stop debugger</b><p>Kills the executable and exits the debugger."));
+
+ action = new KAction(i18n("Interrupt"), "player_pause", 0,
+ this, SLOT(slotPause()),
+ actionCollection(), "debug_pause");
+ action->setToolTip( i18n("Interrupt application") );
+ action->setWhatsThis(i18n("<b>Interrupt application</b><p>Interrupts the debugged process or current GDB command."));
+
+ action = new KAction(i18n("Run to &Cursor"), "dbgrunto", 0,
+ this, SLOT(slotRunToCursor()),
+ actionCollection(), "debug_runtocursor");
+ action->setToolTip( i18n("Run to cursor") );
+ action->setWhatsThis(i18n("<b>Run to cursor</b><p>Continues execution until the cursor position is reached."));
+
+
+ action = new KAction(i18n("Set E&xecution Position to Cursor"), "dbgjumpto", 0,
+ this, SLOT(slotJumpToCursor()),
+ actionCollection(), "debug_jumptocursor");
+ action->setToolTip( i18n("Jump to cursor") );
+ action->setWhatsThis(i18n("<b>Set Execution Position </b><p>Set the execution pointer to the current cursor position."));
+
+
+ action = new KAction(i18n("Step &Over"), "dbgnext", Key_F10,
+ this, SLOT(slotStepOver()),
+ actionCollection(), "debug_stepover");
+ action->setToolTip( i18n("Step over the next line") );
+ action->setWhatsThis( i18n("<b>Step over</b><p>"
+ "Executes one line of source in the current source file. "
+ "If the source line is a call to a function the whole "
+ "function is executed and the app will stop at the line "
+ "following the function call.") );
+
+
+ action = new KAction(i18n("Step over Ins&truction"), "dbgnextinst", 0,
+ this, SLOT(slotStepOverInstruction()),
+ actionCollection(), "debug_stepoverinst");
+ action->setToolTip( i18n("Step over instruction") );
+ action->setWhatsThis(i18n("<b>Step over instruction</b><p>Steps over the next assembly instruction."));
+
+
+ action = new KAction(i18n("Step &Into"), "dbgstep", Key_F11,
+ this, SLOT(slotStepInto()),
+ actionCollection(), "debug_stepinto");
+ action->setToolTip( i18n("Step into the next statement") );
+ action->setWhatsThis( i18n("<b>Step into</b><p>"
+ "Executes exactly one line of source. If the source line "
+ "is a call to a function then execution will stop after "
+ "the function has been entered.") );
+
+
+ action = new KAction(i18n("Step into I&nstruction"), "dbgstepinst", 0,
+ this, SLOT(slotStepIntoInstruction()),
+ actionCollection(), "debug_stepintoinst");
+ action->setToolTip( i18n("Step into instruction") );
+ action->setWhatsThis(i18n("<b>Step into instruction</b><p>Steps into the next assembly instruction."));
+
+
+ action = new KAction(i18n("Step O&ut"), "dbgstepout", Key_F12,
+ this, SLOT(slotStepOut()),
+ actionCollection(), "debug_stepout");
+ action->setToolTip( i18n("Steps out of the current function") );
+ action->setWhatsThis( i18n("<b>Step out</b><p>"
+ "Executes the application until the currently executing "
+ "function is completed. The debugger will then display "
+ "the line after the original call to that function. If "
+ "program execution is in the outermost frame (i.e. in "
+ "main()) then this operation has no effect.") );
+
+
+ action = new KAction(i18n("Viewers"), "dbgmemview", 0,
+ this, SLOT(slotMemoryView()),
+ actionCollection(), "debug_memview");
+ action->setToolTip( i18n("Debugger viewers") );
+ action->setWhatsThis(i18n("<b>Debugger viewers</b><p>Various information about application being executed. There are 4 views available:<br>"
+ "<b>Memory</b><br>"
+ "<b>Disassemble</b><br>"
+ "<b>Registers</b><br>"
+ "<b>Libraries</b>"));
+
+
+ action = new KAction(i18n("Examine Core File..."), "core", 0,
+ this, SLOT(slotExamineCore()),
+ actionCollection(), "debug_core");
+ action->setToolTip( i18n("Examine core file") );
+ action->setWhatsThis( i18n("<b>Examine core file</b><p>"
+ "This loads a core file, which is typically created "
+ "after the application has crashed, e.g. with a "
+ "segmentation fault. The core file contains an "
+ "image of the program memory at the time it crashed, "
+ "allowing you to do a post-mortem analysis.") );
+
+
+ action = new KAction(i18n("Attach to Process"), "connect_creating", 0,
+ this, SLOT(slotAttachProcess()),
+ actionCollection(), "debug_attach");
+ action->setToolTip( i18n("Attach to process") );
+ action->setWhatsThis(i18n("<b>Attach to process</b><p>Attaches the debugger to a running process."));
+
+ action = new KAction(i18n("Toggle Breakpoint"), 0, 0,
+ this, SLOT(toggleBreakpoint()),
+ actionCollection(), "debug_toggle_breakpoint");
+ action->setToolTip(i18n("Toggle breakpoint"));
+ action->setWhatsThis(i18n("<b>Toggle breakpoint</b><p>Toggles the breakpoint at the current line in editor."));
+
+ connect( mainWindow()->main()->guiFactory(), SIGNAL(clientAdded(KXMLGUIClient*)),
+ this, SLOT(guiClientAdded(KXMLGUIClient*)) );
+
+ connect( core(), SIGNAL(projectConfigWidget(KDialogBase*)),
+ this, SLOT(projectConfigWidget(KDialogBase*)) );
+
+ connect( partController(), SIGNAL(loadedFile(const KURL &)),
+ gdbBreakpointWidget, SLOT(slotRefreshBP(const KURL &)) );
+ connect( debugger(), SIGNAL(toggledBreakpoint(const QString &, int)),
+ gdbBreakpointWidget, SLOT(slotToggleBreakpoint(const QString &, int)) );
+ connect( debugger(), SIGNAL(editedBreakpoint(const QString &, int)),
+ gdbBreakpointWidget, SLOT(slotEditBreakpoint(const QString &, int)) );
+ connect( debugger(), SIGNAL(toggledBreakpointEnabled(const QString &, int)),
+ gdbBreakpointWidget, SLOT(slotToggleBreakpointEnabled(const QString &, int)) );
+
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+
+ connect( core(), SIGNAL(stopButtonClicked(KDevPlugin*)),
+ this, SLOT(slotStop(KDevPlugin*)) );
+ connect( core(), SIGNAL(projectClosed()),
+ this, SLOT(projectClosed()) );
+
+ connect( partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part*)) );
+
+ procLineMaker = new ProcessLineMaker();
+
+ connect( procLineMaker, SIGNAL(receivedStdoutLine(const QCString&)),
+ appFrontend(), SLOT(insertStdoutLine(const QCString&)) );
+ connect( procLineMaker, SIGNAL(receivedStderrLine(const QCString&)),
+ appFrontend(), SLOT(insertStderrLine(const QCString&)) );
+
+ connect( procLineMaker, SIGNAL(receivedPartialStdoutLine(const QCString&)),
+ appFrontend(), SLOT(addPartialStdoutLine(const QCString&)));
+ connect( procLineMaker, SIGNAL(receivedPartialStderrLine(const QCString&)),
+ appFrontend(), SLOT(addPartialStderrLine(const QCString&)));
+
+ // The output from tracepoints goes to "application" window, because
+ // we don't have any better alternative, and using yet another window
+ // is undesirable. Besides, this makes tracepoint look even more similar
+ // to printf debugging.
+ connect( gdbBreakpointWidget, SIGNAL(tracingOutput(const char*)),
+ procLineMaker, SLOT(slotReceivedStdout(const char*)));
+
+
+ connect(partController(), SIGNAL(savedFile(const KURL &)),
+ this, SLOT(slotFileSaved()));
+
+ if (project())
+ connect(project(), SIGNAL(projectCompiled()),
+ this, SLOT(slotProjectCompiled()));
+
+ setupController();
+ QTimer::singleShot(0, this, SLOT(setupDcop()));
+}
+
+void DebuggerPart::setupDcop()
+{
+ QCStringList objects = kapp->dcopClient()->registeredApplications();
+ for (QCStringList::Iterator it = objects.begin(); it != objects.end(); ++it)
+ if ((*it).find("drkonqi-") == 0)
+ slotDCOPApplicationRegistered(*it);
+
+ connect(kapp->dcopClient(), SIGNAL(applicationRegistered(const QCString&)), SLOT(slotDCOPApplicationRegistered(const QCString&)));
+ kapp->dcopClient()->setNotifications(true);
+}
+
+void DebuggerPart::slotDCOPApplicationRegistered(const QCString& appId)
+{
+ if (appId.find("drkonqi-") == 0) {
+ QByteArray answer;
+ QCString replyType;
+
+ kapp->dcopClient()->call(appId, "krashinfo", "appName()", QByteArray(), replyType, answer, true, 5000);
+
+ QDataStream d(answer, IO_ReadOnly);
+ QCString appName;
+ d >> appName;
+
+ if (appName.length() && project() && project()->mainProgram().endsWith(appName)) {
+ kapp->dcopClient()->send(appId, "krashinfo", "registerDebuggingApplication(QString)", i18n("Debug in &KDevelop"));
+ connectDCOPSignal(appId, "krashinfo", "acceptDebuggingApplication()", "slotDebugExternalProcess()", true);
+ }
+ }
+}
+
+ASYNC DebuggerPart::slotDebugExternalProcess()
+{
+ QByteArray answer;
+ QCString replyType;
+
+ kapp->dcopClient()->call(kapp->dcopClient()->senderId(), "krashinfo", "pid()", QByteArray(), replyType, answer, true, 5000);
+
+ QDataStream d(answer, IO_ReadOnly);
+ int pid;
+ d >> pid;
+
+ if (attachProcess(pid) && m_drkonqi.isEmpty()) {
+ m_drkonqi = kapp->dcopClient()->senderId();
+ QTimer::singleShot(15000, this, SLOT(slotCloseDrKonqi()));
+ mainWindow()->raiseView(framestackWidget);
+ }
+
+ mainWindow()->main()->raise();
+}
+
+ASYNC DebuggerPart::slotDebugCommandLine(const QString& /*command*/)
+{
+ KMessageBox::information(0, "Asked to debug command line");
+}
+
+void DebuggerPart::slotCloseDrKonqi()
+{
+ kapp->dcopClient()->send(m_drkonqi, "MainApplication-Interface", "quit()", QByteArray());
+ m_drkonqi = "";
+}
+
+DebuggerPart::~DebuggerPart()
+{
+ kapp->dcopClient()->setNotifications(false);
+
+ if (variableWidget)
+ mainWindow()->removeView(variableWidget);
+ if (gdbBreakpointWidget)
+ mainWindow()->removeView(gdbBreakpointWidget);
+ if (framestackWidget)
+ mainWindow()->removeView(framestackWidget);
+ if (disassembleWidget)
+ mainWindow()->removeView(disassembleWidget);
+ if(gdbOutputWidget)
+ mainWindow()->removeView(gdbOutputWidget);
+
+ delete variableWidget;
+ delete gdbBreakpointWidget;
+ delete framestackWidget;
+ delete disassembleWidget;
+ delete gdbOutputWidget;
+ delete controller;
+ delete floatingToolBar;
+ delete statusBarIndicator;
+ delete procLineMaker;
+
+ GDBParser::destroy();
+}
+
+
+void DebuggerPart::guiClientAdded( KXMLGUIClient* client )
+{
+ // Can't change state until after XMLGUI has been loaded...
+ // Anyone know of a better way of doing this?
+ if( client == this )
+ stateChanged( QString("stopped") );
+}
+
+void DebuggerPart::contextMenu(QPopupMenu *popup, const Context *context)
+{
+ if (!context->hasType( Context::EditorContext ))
+ return;
+
+ const EditorContext *econtext = static_cast<const EditorContext*>(context);
+ m_contextIdent = econtext->currentWord();
+
+ bool running = !(previousDebuggerState_ & s_dbgNotStarted);
+
+ // If debugger is running, we insert items at the top.
+ // The reason is user has explicitly run the debugger, so he's
+ // surely debugging, not editing code or something. So, first
+ // menu items should be about debugging, not some copy/paste/cut
+ // things.
+ if (!running)
+ popup->insertSeparator();
+
+ int index = running ? 0 : -1;
+ if (running)
+ {
+ // Too bad we can't add QAction to popup menu in Qt3.
+ KAction* act = actionCollection()->action("debug_runtocursor");
+ Q_ASSERT(act);
+ if (act)
+ {
+ int id = popup->insertItem( act->iconSet(), i18n("Run to &Cursor"),
+ this, SLOT(slotRunToCursor()),
+ 0, -1, index);
+
+ popup->setWhatsThis(id, act->whatsThis());
+ index += running;
+ }
+ }
+ if (econtext->url().isLocalFile())
+ {
+ int id = popup->insertItem( i18n("Toggle Breakpoint"),
+ this, SLOT(toggleBreakpoint()),
+ 0, -1, index);
+ index += running;
+ popup->setWhatsThis(id, i18n("<b>Toggle breakpoint</b><p>Toggles breakpoint at the current line."));
+ }
+ if (!m_contextIdent.isEmpty())
+ {
+ QString squeezed = KStringHandler::csqueeze(m_contextIdent, 30);
+ int id = popup->insertItem( i18n("Evaluate: %1").arg(squeezed),
+ this, SLOT(contextEvaluate()),
+ 0, -1, index);
+ index += running;
+ popup->setWhatsThis(id, i18n("<b>Evaluate expression</b><p>Shows the value of the expression under the cursor."));
+ int id2 = popup->insertItem( i18n("Watch: %1").arg(squeezed),
+ this, SLOT(contextWatch()),
+ 0, -1, index);
+ index += running;
+ popup->setWhatsThis(id2, i18n("<b>Watch expression</b><p>Adds an expression under the cursor to the Variables/Watch list."));
+ }
+ if (running)
+ popup->insertSeparator(index);
+}
+
+
+void DebuggerPart::toggleBreakpoint()
+{
+ KParts::ReadWritePart *rwpart
+ = dynamic_cast<KParts::ReadWritePart*>(partController()->activePart());
+ KTextEditor::ViewCursorInterface *cursorIface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(partController()->activeWidget());
+
+ if (!rwpart || !cursorIface)
+ return;
+
+ uint line, col;
+ cursorIface->cursorPositionReal(&line, &col);
+
+ gdbBreakpointWidget->slotToggleBreakpoint(rwpart->url().path(), line);
+}
+
+
+void DebuggerPart::contextWatch()
+{
+ variableWidget->slotAddWatchVariable(m_contextIdent);
+}
+
+void DebuggerPart::contextEvaluate()
+{
+ variableWidget->slotEvaluateExpression(m_contextIdent);
+}
+
+void DebuggerPart::projectConfigWidget(KDialogBase *dlg)
+{
+ QVBox *vbox = dlg->addVBoxPage(i18n("Debugger"), i18n("Debugger"), BarIcon( info()->icon(), KIcon::SizeMedium) );
+ DebuggerConfigWidget *w = new DebuggerConfigWidget(this, vbox, "debugger config widget");
+ connect( dlg, SIGNAL(okClicked()), w, SLOT(accept()) );
+ connect( dlg, SIGNAL(finished()), controller, SLOT(configure()) );
+}
+
+
+void DebuggerPart::setupController()
+{
+ VariableTree *variableTree = variableWidget->varTree();
+
+ // variableTree -> gdbBreakpointWidget
+ connect( variableTree, SIGNAL(toggleWatchpoint(const QString &)),
+ gdbBreakpointWidget, SLOT(slotToggleWatchpoint(const QString &)));
+
+ // gdbOutputWidget -> controller
+ connect( gdbOutputWidget, SIGNAL(userGDBCmd(const QString &)),
+ controller, SLOT(slotUserGDBCmd(const QString&)));
+ connect( gdbOutputWidget, SIGNAL(breakInto()),
+ controller, SLOT(slotBreakInto()));
+
+ connect( controller, SIGNAL(breakpointHit(int)),
+ gdbBreakpointWidget, SLOT(slotBreakpointHit(int)));
+
+ // controller -> disassembleWidget
+ connect( controller, SIGNAL(showStepInSource(const QString&, int, const QString&)),
+ disassembleWidget, SLOT(slotShowStepInSource(const QString&, int, const QString&)));
+
+ // controller -> this
+ connect( controller, SIGNAL(dbgStatus(const QString&, int)),
+ this, SLOT(slotStatus(const QString&, int)));
+ connect( controller, SIGNAL(showStepInSource(const QString&, int, const QString&)),
+ this, SLOT(slotShowStep(const QString&, int)));
+ connect( controller, SIGNAL(debuggerAbnormalExit()),
+ this, SLOT(slotDebuggerAbnormalExit()));
+
+ connect(controller, SIGNAL(event(GDBController::event_t)),
+ this, SLOT(slotEvent(GDBController::event_t)));
+
+ // controller -> procLineMaker
+ connect( controller, SIGNAL(ttyStdout(const char*)),
+ procLineMaker, SLOT(slotReceivedStdout(const char*)));
+ connect( controller, SIGNAL(ttyStderr(const char*)),
+ procLineMaker, SLOT(slotReceivedStderr(const char*)));
+
+ // controller -> gdbOutputWidget
+ connect( controller, SIGNAL(gdbInternalCommandStdout(const char*)),
+ gdbOutputWidget, SLOT(slotInternalCommandStdout(const char*)) );
+ connect( controller, SIGNAL(gdbUserCommandStdout(const char*)),
+ gdbOutputWidget, SLOT(slotUserCommandStdout(const char*)) );
+
+ connect( controller, SIGNAL(gdbStderr(const char*)),
+ gdbOutputWidget, SLOT(slotReceivedStderr(const char*)) );
+ connect( controller, SIGNAL(dbgStatus(const QString&, int)),
+ gdbOutputWidget, SLOT(slotDbgStatus(const QString&, int)));
+
+ // controller -> viewerWidget
+ connect( controller, SIGNAL(dbgStatus(const QString&, int)),
+ viewerWidget, SLOT(slotDebuggerState(const QString&, int)));
+
+
+ connect(statusBarIndicator, SIGNAL(doubleClicked()),
+ controller, SLOT(explainDebuggerStatus()));
+
+}
+
+
+bool DebuggerPart::startDebugger()
+{
+ QString build_dir; // Currently selected build directory
+ DomUtil::PairList run_envvars; // List with the environment variables
+ QString run_directory; // Directory from where the program should be run
+ QString program; // Absolute path to application
+ QString run_arguments; // Command line arguments to be passed to the application
+
+ if (project()) {
+ build_dir = project()->buildDirectory();
+ run_envvars = project()->runEnvironmentVars();
+ run_directory = project()->runDirectory();
+ program = project()->mainProgram();
+ run_arguments = project()->debugArguments();
+ }
+
+ QString shell = DomUtil::readEntry(*projectDom(), "/kdevdebugger/general/dbgshell");
+ if( !shell.isEmpty() )
+ {
+ shell = shell.simplifyWhiteSpace();
+ QString shell_without_args = QStringList::split(QChar(' '), shell ).first();
+
+ QFileInfo info( shell_without_args );
+ if( info.isRelative() )
+ {
+ shell_without_args = build_dir + "/" + shell_without_args;
+ info.setFile( shell_without_args );
+ }
+ if( !info.exists() )
+ {
+ KMessageBox::information(
+ mainWindow()->main(),
+ i18n("Could not locate the debugging shell '%1'.").arg( shell_without_args ),
+ i18n("Debugging Shell Not Found"), "gdb_error" );
+ return false;
+ }
+ }
+
+ if (controller->start(shell, run_envvars, run_directory,
+ program, run_arguments))
+ {
+ core()->running(this, true);
+
+ stateChanged( QString("active") );
+
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("&Continue") );
+
+ ac->action("debug_run")->setToolTip(
+ i18n("Continues the application execution") );
+ ac->action("debug_run")->setWhatsThis(
+ i18n("Continue application execution\n\n"
+ "Continues the execution of your application in the "
+ "debugger. This only takes effect when the application "
+ "has been halted by the debugger (i.e. a breakpoint has "
+ "been activated or the interrupt was pressed).") );
+
+ mainWindow()->setViewAvailable(framestackWidget, true);
+ mainWindow()->setViewAvailable(disassembleWidget, true);
+ mainWindow()->setViewAvailable(gdbOutputWidget, true);
+ mainWindow()->setViewAvailable(variableWidget, true);
+
+ framestackWidget->setEnabled(true);
+ disassembleWidget->setEnabled(true);
+
+ gdbOutputWidget->setEnabled(true);
+
+
+ if (DomUtil::readBoolEntry(*projectDom(), "/kdevdebugger/general/floatingtoolbar", false))
+ {
+#ifndef QT_MAC
+ floatingToolBar = new DbgToolBar(this, mainWindow()->main());
+ floatingToolBar->show();
+#endif
+ }
+
+ running_ = true;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void DebuggerPart::slotStopDebugger()
+{
+ running_ = false;
+ controller->slotStopDebugger();
+ debugger()->clearExecutionPoint();
+
+ delete floatingToolBar;
+ floatingToolBar = 0;
+
+ gdbBreakpointWidget->reset();
+ disassembleWidget->clear();
+ gdbOutputWidget->clear();
+ disassembleWidget->slotActivate(false);
+
+// variableWidget->setEnabled(false);
+ framestackWidget->setEnabled(false);
+ disassembleWidget->setEnabled(false);
+ gdbOutputWidget->setEnabled(false);
+
+
+ mainWindow()->setViewAvailable(variableWidget, false);
+ mainWindow()->setViewAvailable(framestackWidget, false);
+ mainWindow()->setViewAvailable(disassembleWidget, false);
+ mainWindow()->setViewAvailable(gdbOutputWidget, false);
+
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("&Start") );
+// ac->action("debug_run")->setIcon( "1rightarrow" );
+ ac->action("debug_run")->setToolTip( i18n("Runs the program in the debugger") );
+ ac->action("debug_run")->setWhatsThis( i18n("Start in debugger\n\n"
+ "Starts the debugger with the project's main "
+ "executable. You may set some breakpoints "
+ "before this, or you can interrupt the program "
+ "while it is running, in order to get information "
+ "about variables, frame stack, and so on.") );
+
+ stateChanged( QString("stopped") );
+
+ core()->running(this, false);
+}
+
+void DebuggerPart::slotShowView(bool show)
+{
+ const QWidget* s = static_cast<const QWidget*>(sender());
+ QWidget* ncs = const_cast<QWidget*>(s);
+ mainWindow()->setViewAvailable(ncs, show);
+ if (show)
+ mainWindow()->raiseView(ncs);
+}
+
+void DebuggerPart::slotDebuggerAbnormalExit()
+{
+ mainWindow()->raiseView(gdbOutputWidget);
+
+ KMessageBox::information(
+ mainWindow()->main(),
+ i18n("<b>GDB exited abnormally</b>"
+ "<p>This is likely a bug in GDB. "
+ "Examine the gdb output window and then stop the debugger"),
+ i18n("GDB exited abnormally"), "gdb_error");
+
+ // Note: we don't stop the debugger here, becuse that will hide gdb
+ // window and prevent the user from finding the exact reason of the
+ // problem.
+}
+
+void DebuggerPart::slotFileSaved()
+{
+ needRebuild_ = true;
+}
+
+void DebuggerPart::slotProjectCompiled()
+{
+ needRebuild_ = false;
+}
+
+void DebuggerPart::projectClosed()
+{
+ slotStopDebugger();
+}
+
+void DebuggerPart::slotRun()
+{
+ if( controller->stateIsOn( s_dbgNotStarted ) ||
+ controller->stateIsOn( s_appNotStarted ) )
+ {
+ if (running_ && controller->stateIsOn(s_dbgNotStarted))
+ {
+ // User has already run the debugger, but it's not running.
+ // Most likely, the debugger has crashed, and the debuggerpart
+ // was left in 'running' state so that the user can examine
+ // gdb output or something. But now, need to fully shut down
+ // previous debug session.
+ slotStopDebugger();
+ }
+
+ // We're either starting gdb for the first time,
+ // or starting the application under gdb. In both
+ // cases, might need to rebuild the application.
+
+ // Note that this logic somewhat duplicates the
+ // isDirty method present in a number of project plugins.
+ // But there, it's a private method we can't conveniently
+ // access. Besides, the custom makefiles project manager won't
+ // care about a file unless it's explicitly added, so it can
+ // miss dependencies.
+
+ needRebuild_ |= haveModifiedFiles();
+
+ bool rebuild = false;
+ if (needRebuild_ && project())
+ {
+ // We don't add "Don't ask again" checkbox to the
+ // message because it's not clear if one cooked
+ // decision will be right for all cases when we're starting
+ // debugging with modified code, and because it's not clear
+ // how user can reset this "don't ask again" setting.
+ int r = KMessageBox::questionYesNoCancel(
+ 0,
+ "<b>" + i18n("Rebuild the project?") + "</b>" +
+ i18n("<p>The project is out of date. Rebuild it?"),
+ i18n("Rebuild the project?"));
+ if (r == KMessageBox::Cancel)
+ {
+ return;
+ }
+ if (r == KMessageBox::Yes)
+ {
+ rebuild = true;
+ }
+ else
+ {
+ // If the user said don't rebuild, try to avoid
+ // asking the same question again.
+ // Note that this only affects 'were any files changed'
+ // check, if a file is changed but not saved we'll
+ // still ask the user again. That's bad, but I don't know
+ // a better solution -- it's hard to check that
+ // the file has the same content as it had when the user
+ // last answered 'no, don't rebuild'.
+ needRebuild_ = false;
+ }
+
+ if (rebuild)
+ {
+ disconnect(SIGNAL(buildProject()));
+ // The KDevProject has no method to build the project,
+ // so try connecting to a slot has is present to all
+ // existing project managers.
+ // Note: this assumes that 'slotBuild' will save
+ // modified files.
+
+ if (connect(this, SIGNAL(buildProject()),
+ project(), SLOT(slotBuild())))
+ {
+ connect(project(), SIGNAL(projectCompiled()),
+ this, SLOT(slotRun_part2()));
+
+ emit buildProject();
+ rebuild = true;
+ }
+ }
+ }
+ if (!rebuild)
+ {
+ slotRun_part2();
+ }
+ return;
+ }
+ else
+ {
+ // When continuing the program, don't try to rebuild -- user
+ // has explicitly asked to "continue".
+ mainWindow()->statusBar()->message(i18n("Continuing program"), 1000);
+ }
+ controller->slotRun();
+}
+
+void DebuggerPart::slotRun_part2()
+{
+ needRebuild_ = false;
+
+ disconnect(project(), SIGNAL(projectCompiled()),
+ this, SLOT(slotRun_part2()));
+
+ if (controller->stateIsOn( s_dbgNotStarted ))
+ {
+ mainWindow()->statusBar()->message(i18n("Debugging program"), 1000);
+ if ( DomUtil::readBoolEntry( *projectDom(), "/kdevdebugger/general/raiseGDBOnStart", false ) )
+ {
+ mainWindow()->raiseView( gdbOutputWidget );
+ }else
+ {
+ mainWindow()->raiseView( framestackWidget );
+ }
+ appFrontend()->clearView();
+ startDebugger();
+ }
+ else if (controller->stateIsOn( s_appNotStarted ) )
+ {
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("&Continue") );
+ ac->action("debug_run")->setToolTip( i18n("Continues the application execution") );
+ ac->action("debug_run")->setWhatsThis( i18n("Continue application execution\n\n"
+ "Continues the execution of your application in the "
+ "debugger. This only takes effect when the application "
+ "has been halted by the debugger (i.e. a breakpoint has "
+ "been activated or the interrupt was pressed).") );
+
+ mainWindow()->statusBar()->message(i18n("Running program"), 1000);
+
+ appFrontend()->clearView();
+ }
+
+ controller->slotRun();
+}
+
+
+void DebuggerPart::slotRestart()
+{
+ // We implement restart as kill + slotRun, as opposed as plain "run"
+ // command because kill + slotRun allows any special logic in slotRun
+ // to apply for restart.
+ //
+ // That includes:
+ // - checking for out-of-date project
+ // - special setup for remote debugging.
+ //
+ // Had we used plain 'run' command, restart for remote debugging simply
+ // would not work.
+ controller->slotKill();
+ slotRun();
+}
+
+void DebuggerPart::slotExamineCore()
+{
+ mainWindow()->statusBar()->message(i18n("Choose a core file to examine..."), 1000);
+
+ QString dirName = project()? project()->projectDirectory() : QDir::homeDirPath();
+ QString coreFile = KFileDialog::getOpenFileName(dirName);
+ if (coreFile.isNull())
+ return;
+
+ mainWindow()->statusBar()->message(i18n("Examining core file %1").arg(coreFile), 1000);
+
+ startDebugger();
+ controller->slotCoreFile(coreFile);
+}
+
+
+void DebuggerPart::slotAttachProcess()
+{
+ mainWindow()->statusBar()->message(i18n("Choose a process to attach to..."), 1000);
+
+ Dbg_PS_Dialog dlg;
+ if (!dlg.exec() || !dlg.pidSelected())
+ return;
+
+ int pid = dlg.pidSelected();
+ attachProcess(pid);
+}
+
+bool DebuggerPart::attachProcess(int pid)
+{
+ mainWindow()->statusBar()->message(i18n("Attaching to process %1").arg(pid), 1000);
+
+ bool ret = startDebugger();
+ controller->slotAttachTo(pid);
+ return ret;
+}
+
+
+void DebuggerPart::slotStop(KDevPlugin* which)
+{
+ if( which != 0 && which != this )
+ return;
+
+// if( !controller->stateIsOn( s_dbgNotStarted ) && !controller->stateIsOn( s_shuttingDown ) )
+ slotStopDebugger();
+}
+
+
+void DebuggerPart::slotPause()
+{
+ controller->slotBreakInto();
+}
+
+
+void DebuggerPart::slotRunToCursor()
+{
+ KParts::ReadWritePart *rwpart
+ = dynamic_cast<KParts::ReadWritePart*>(partController()->activePart());
+ KTextEditor::ViewCursorInterface *cursorIface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(partController()->activeWidget());
+
+ if (!rwpart || !rwpart->url().isLocalFile() || !cursorIface)
+ return;
+
+ uint line, col;
+ cursorIface->cursorPosition(&line, &col);
+
+ controller->slotRunUntil(rwpart->url().path(), ++line);
+}
+
+void DebuggerPart::slotJumpToCursor()
+{
+ KParts::ReadWritePart *rwpart
+ = dynamic_cast<KParts::ReadWritePart*>(partController()->activePart());
+ KTextEditor::ViewCursorInterface *cursorIface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(partController()->activeWidget());
+
+ if (!rwpart || !rwpart->url().isLocalFile() || !cursorIface)
+ return;
+
+ uint line, col;
+ cursorIface->cursorPositionReal(&line, &col);
+
+ controller->slotJumpTo(rwpart->url().path(), ++line);
+}
+
+void DebuggerPart::slotStepOver()
+{
+ controller->slotStepOver();
+}
+
+
+void DebuggerPart::slotStepOverInstruction()
+{
+ controller->slotStepOverIns();
+}
+
+
+void DebuggerPart::slotStepIntoInstruction()
+{
+ controller->slotStepIntoIns();
+}
+
+
+void DebuggerPart::slotStepInto()
+{
+ controller->slotStepInto();
+}
+
+
+void DebuggerPart::slotStepOut()
+{
+ controller->slotStepOutOff();
+}
+
+
+void DebuggerPart::slotMemoryView()
+{
+ viewerWidget->slotAddMemoryView();
+}
+
+void DebuggerPart::slotRefreshBPState( const Breakpoint& BP)
+{
+ if (BP.hasFileAndLine())
+ {
+ const FilePosBreakpoint& bp = dynamic_cast<const FilePosBreakpoint&>(BP);
+ if (bp.isActionDie())
+ {
+ debugger()->setBreakpoint(bp.fileName(), bp.lineNum()-1, -1, true, false);
+ }
+ else if (bp.isActionClear())
+ {
+ // Do nothing. This is always a result of breakpoint deletion,
+ // either via click on gutter, or via breakpoints window.
+ // We should not add marker for a breakpoint that's being deleted,
+ // because if user removes marker, and we re-add it here until
+ // we see 'actionDie' this can confuse the code.
+ // And no need to clear the marker, since we'll soon see 'actionDie'
+ // and clear it for good.
+ }
+ else
+ debugger()->setBreakpoint(bp.fileName(), bp.lineNum()-1,
+ 1/*bp->id()*/, bp.isEnabled(), bp.isPending() );
+ }
+}
+
+void DebuggerPart::slotStatus(const QString &msg, int state)
+{
+ QString stateIndicator, stateIndicatorFull;
+
+ if (state & s_dbgNotStarted)
+ {
+ stateIndicator = " ";
+ stateIndicatorFull = "Debugger not started";
+ stateChanged( QString("stopped") );
+ }
+ else if (state & s_dbgBusy)
+ {
+ stateIndicator = "R";
+ stateIndicatorFull = "Debugger is busy";
+ stateChanged( QString("active") );
+ }
+ else if (state & s_programExited)
+ {
+ stateIndicator = "E";
+ stateIndicatorFull = "Application has exited";
+ stateChanged( QString("stopped") );
+ }
+ else
+ {
+ stateIndicator = "P";
+ stateIndicatorFull = "Application is paused";
+ stateChanged( QString("paused") );
+ // On the first stop, show the variables view.
+ // We do it on first stop, and not at debugger start, because
+ // a program might just successfully run till completion. If we show
+ // the var views on start and hide on stop, this will look like flicker.
+ // On the other hand, if application is paused, it's very
+ // likely that the user wants to see variables.
+ if (justRestarted_)
+ {
+ justRestarted_ = false;
+ mainWindow()->setViewAvailable(variableWidget, true);
+ mainWindow()->raiseView(variableWidget);
+ }
+ }
+
+ if (state & s_appNotStarted)
+ {
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("To start something","Start") );
+ ac->action("debug_run")->setToolTip( i18n("Restart the program in the debugger") );
+ ac->action("debug_run")->setWhatsThis( i18n("Restart in debugger\n\n"
+ "Restarts the program in the debugger") );
+ }
+
+
+ bool program_running = !(state & s_appNotStarted);
+ bool attached_or_core = (state & s_attached) || (state & s_core);
+
+ // If program is started, enable the 'restart' comand.
+ actionCollection()->action("debug_restart")->setEnabled(
+ program_running && !attached_or_core);
+
+
+ // As soon as debugger clears 's_appNotStarted' flag, we
+ // set 'justRestarted' variable.
+ // The other approach would be to set justRestarted in slotRun, slotCore
+ // and slotAttach.
+ // Note that setting this var in startDebugger is not OK, because the
+ // initial state of debugger is exactly the same as state after pause,
+ // so we'll always show varaibles view.
+ if ((previousDebuggerState_ & s_appNotStarted) &&
+ !(state & s_appNotStarted))
+ {
+ justRestarted_ = true;
+ }
+ if (state & s_appNotStarted)
+ {
+ justRestarted_ = false;
+ }
+
+ // And now? :-)
+ kdDebug(9012) << "Debugger state: " << stateIndicator << ": " << endl;
+ kdDebug(9012) << " " << msg << endl;
+
+ statusBarIndicator->setText(stateIndicator);
+ QToolTip::add(statusBarIndicator, stateIndicatorFull);
+ if (!msg.isEmpty())
+ mainWindow()->statusBar()->message(msg, 3000);
+
+
+ previousDebuggerState_ = state;
+}
+
+void DebuggerPart::slotEvent(GDBController::event_t e)
+{
+ if (e == GDBController::program_running ||
+ e == GDBController::program_exited ||
+ e == GDBController::debugger_exited)
+ {
+ debugger()->clearExecutionPoint();
+ }
+}
+
+
+void DebuggerPart::slotShowStep(const QString &fileName, int lineNum)
+{
+ if ( ! fileName.isEmpty() )
+ {
+ // Debugger counts lines from 1
+ debugger()->gotoExecutionPoint(KURL( fileName ), lineNum-1);
+ }
+ else
+ {
+ debugger()->clearExecutionPoint();
+ }
+}
+
+
+void DebuggerPart::slotGotoSource(const QString &fileName, int lineNum)
+{
+ if ( ! fileName.isEmpty() )
+ partController()->editDocument(KURL( fileName ), lineNum);
+}
+
+
+void DebuggerPart::slotActivePartChanged( KParts::Part* part )
+{
+ KAction* action = actionCollection()->action("debug_toggle_breakpoint");
+ if(!action)
+ return;
+
+ if(!part)
+ {
+ action->setEnabled(false);
+ return;
+ }
+ KTextEditor::ViewCursorInterface *iface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget());
+ action->setEnabled( iface != 0 );
+}
+
+void DebuggerPart::restorePartialProjectSession(const QDomElement* el)
+{
+ gdbBreakpointWidget->restorePartialProjectSession(el);
+ gdbOutputWidget->restorePartialProjectSession(el);
+}
+
+void DebuggerPart::savePartialProjectSession(QDomElement* el)
+{
+ gdbBreakpointWidget->savePartialProjectSession(el);
+ gdbOutputWidget->savePartialProjectSession(el);
+}
+
+bool DebuggerPart::haveModifiedFiles()
+{
+ bool have_modified = false;
+ KURL::List const& filelist = partController()->openURLs();
+ KURL::List::ConstIterator it = filelist.begin();
+ while ( it != filelist.end() )
+ {
+ if (partController()->documentState(*it) != Clean)
+ have_modified = true;
+
+ ++it;
+ }
+
+ return have_modified;
+}
+
+}
+
+KDevAppFrontend * GDBDebugger::DebuggerPart::appFrontend( )
+{
+ return extension<KDevAppFrontend>("KDevelop/AppFrontend");
+}
+
+KDevDebugger * GDBDebugger::DebuggerPart::debugger()
+{
+ return m_debugger;
+}
+
+#include "debuggerpart.moc"
diff --git a/languages/cpp/debugger/debuggerpart.h b/languages/cpp/debugger/debuggerpart.h
new file mode 100644
index 00000000..afb3b340
--- /dev/null
+++ b/languages/cpp/debugger/debuggerpart.h
@@ -0,0 +1,164 @@
+/***************************************************************************
+ * Copyright (C) 1999-2001 by John Birch *
+ * jbb@kdevelop.org *
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DEBUGGERPART_H_
+#define _DEBUGGERPART_H_
+
+#include <qguardedptr.h>
+#include "kdevplugin.h"
+#include "kdevcore.h"
+
+#include "gdbcontroller.h"
+#include "debuggerdcopinterface.h"
+
+namespace KParts { class Part; }
+
+class QLabel;
+class QPopupMenu;
+class KDialogBase;
+class ProcessWidget;
+class ProcessLineMaker;
+class KDevAppFrontend;
+class KDevDebugger;
+
+namespace GDBDebugger
+{
+
+class GDBBreakpointWidget;
+class FramestackWidget;
+class DisassembleWidget;
+class Breakpoint;
+class GDBController;
+class DbgToolBar;
+class VariableWidget;
+class GDBOutputWidget;
+class ViewerWidget;
+
+class DebuggerPart : public KDevPlugin, virtual public DebuggerDCOPInterface
+{
+ Q_OBJECT
+
+public:
+ DebuggerPart( QObject *parent, const char *name, const QStringList & );
+ ~DebuggerPart();
+ virtual void restorePartialProjectSession(const QDomElement* el);
+ virtual void savePartialProjectSession(QDomElement* el);
+
+k_dcop:
+ virtual ASYNC slotDebugExternalProcess();
+ virtual ASYNC slotDebugCommandLine(const QString& command);
+
+private slots:
+ void setupDcop();
+ void guiClientAdded(KXMLGUIClient*);
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void toggleBreakpoint();
+ void contextEvaluate();
+ void contextWatch();
+// void projectOpened();
+ void projectClosed();
+ void projectConfigWidget(KDialogBase *dlg);
+ void slotActivePartChanged(KParts::Part*);
+
+ void slotRun();
+ // Called to finish run operation in the case when we're
+ // starting the debugger. Called either directly from
+ // slotRun, if no rebuilding of project is needed, or
+ // indirectly from project()->projectCompiled() after project
+ // is rebuilt.
+ void slotRun_part2();
+ void slotRestart();
+ void slotExamineCore();
+ void slotAttachProcess();
+ void slotStopDebugger();
+ void slotStop(KDevPlugin* which = 0);
+ void slotPause();
+ void slotRunToCursor();
+ void slotJumpToCursor();
+ void slotStepOver();
+ void slotStepOverInstruction();
+ void slotStepIntoInstruction();
+ void slotStepInto();
+ void slotStepOut();
+ void slotMemoryView();
+
+ void slotRefreshBPState(const Breakpoint&);
+
+ void slotStatus(const QString &msg, int state);
+ void slotShowStep(const QString &fileName, int lineNum);
+ void slotGotoSource(const QString &fileName, int lineNum);
+
+ void slotDCOPApplicationRegistered(const QCString &appId);
+ void slotCloseDrKonqi();
+
+ // Hide or show the view that's the sender of this signal.
+ void slotShowView(bool enabled);
+
+ void slotDebuggerAbnormalExit();
+
+ // Called when some file in the project was saved.
+ // Sets 'needRebuild_' to true.
+ void slotFileSaved();
+
+ void slotProjectCompiled();
+
+ void slotEvent(GDBController::event_t);
+
+private:
+ KDevAppFrontend *appFrontend();
+ KDevDebugger *debugger();
+
+ bool attachProcess(int pid);
+ bool startDebugger();
+ void setupController();
+ bool haveModifiedFiles();
+
+ QGuardedPtr<VariableWidget> variableWidget;
+ QGuardedPtr<GDBBreakpointWidget> gdbBreakpointWidget;
+ QGuardedPtr<FramestackWidget> framestackWidget;
+ QGuardedPtr<DisassembleWidget> disassembleWidget;
+ QGuardedPtr<GDBOutputWidget> gdbOutputWidget;
+ QGuardedPtr<ViewerWidget> viewerWidget;
+ GDBController *controller;
+ QGuardedPtr<QLabel> statusBarIndicator;
+ QGuardedPtr<DbgToolBar> floatingToolBar;
+ ProcessLineMaker* procLineMaker;
+ ProcessLineMaker* gdbLineMaker;
+
+ QString m_contextIdent;
+ QCString m_drkonqi;
+
+ KDevDebugger *m_debugger;
+ int previousDebuggerState_;
+ // Set to true after each debugger restart
+ // Currently used to auto-show variables view
+ // on the first pause.
+ bool justRestarted_;
+
+ // Flag that specifies in project rebuild is necessary
+ // before running the debugger. Set to 'true' in constructor
+ // because we have no idea if project is 'dirty' or not
+ // when it's opened, and then set to 'true' each time a file is
+ // modified.
+ bool needRebuild_;
+
+ // Set by 'startDebugger' and cleared by 'slotStopDebugger'.
+ bool running_;
+
+signals:
+ void buildProject();
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/debuggertracingdialog.cpp b/languages/cpp/debugger/debuggertracingdialog.cpp
new file mode 100644
index 00000000..217f0b88
--- /dev/null
+++ b/languages/cpp/debugger/debuggertracingdialog.cpp
@@ -0,0 +1,104 @@
+
+#include "debuggertracingdialog.h"
+#include "breakpoint.h"
+
+#include <qbutton.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <klineedit.h>
+#include <keditlistbox.h>
+#include <kmessagebox.h>
+
+namespace GDBDebugger
+{
+
+ DebuggerTracingDialog
+ ::DebuggerTracingDialog(Breakpoint* bp,
+ QWidget* parent, const char* name)
+ : DebuggerTracingDialogBase(parent, name), bp_(bp)
+ {
+ expressions->setButtons(KEditListBox::Add | KEditListBox::Remove);
+
+ connect(enable, SIGNAL(stateChanged(int)),
+ this, SLOT(enableOrDisable(int)));
+
+ connect(enableCustomFormat, SIGNAL(stateChanged(int)),
+ this, SLOT(enableOrDisableCustomFormat(int)));
+
+ enable->setChecked(bp_->tracingEnabled());
+ expressions->setItems(bp_->tracedExpressions());
+ enableCustomFormat->setChecked(bp_->traceFormatStringEnabled());
+ customFormat->setText(bp_->traceFormatString());
+
+ enableOrDisable(enable->state());
+ }
+
+ void DebuggerTracingDialog::enableOrDisable(int state)
+ {
+ bool enable = (state == QButton::On);
+
+ expressionsLabel->setEnabled(enable);
+ expressions->setEnabled(enable);
+ enableCustomFormat->setEnabled(enable);
+ customFormat->setEnabled(enable && enableCustomFormat->isOn());
+ }
+
+ void DebuggerTracingDialog::enableOrDisableCustomFormat(int state)
+ {
+ customFormat->setEnabled(state == QButton::On);
+ }
+
+ void DebuggerTracingDialog::accept()
+ {
+ // Check that if we use format string,
+ // the number of expression is not larget than the number of
+ // format specifiers
+ bool ok = true;
+
+ if (enableCustomFormat->isOn())
+ {
+ QString s = customFormat->text();
+ unsigned percent_count = 0;
+ for (unsigned i = 0; i < s.length(); ++i)
+ if (s[i] == '%')
+ {
+ if (i+1 < s.length())
+ {
+ if (s[i+1] != '%')
+ {
+ ++percent_count;
+ }
+ else
+ {
+ // Double %
+ ++i;
+ }
+ }
+ }
+
+ if (percent_count < expressions->items().count())
+ {
+ ok = false;
+
+ KMessageBox::error(
+ this,
+ "<b>Not enough format specifiers</b>"
+ "<p>The number of format specifiers in the custom format "
+ "string is less then the number of expressions. Either remove "
+ "some expressions or edit the format string.",
+ "Not enough format specifiers");
+ }
+
+ }
+
+ if (ok)
+ {
+ bp_->setTracingEnabled(enable->isOn());
+ bp_->setTracedExpressions(expressions->items());
+ bp_->setTraceFormatStringEnabled(enableCustomFormat->isOn());
+ bp_->setTraceFormatString(customFormat->text());
+ DebuggerTracingDialogBase::accept();
+ }
+ }
+
+}
diff --git a/languages/cpp/debugger/debuggertracingdialog.h b/languages/cpp/debugger/debuggertracingdialog.h
new file mode 100644
index 00000000..1379f684
--- /dev/null
+++ b/languages/cpp/debugger/debuggertracingdialog.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Vladimir Prus *
+ * ghost@cs.msu.su *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef DEBUGGER_TRACING_DIALOG_VP_2005_08_22
+#define DEBUGGER_TRACING_DIALOG_VP_2005_08_22
+
+#include "debuggertracingdialogbase.h"
+
+
+namespace GDBDebugger
+{
+ class Breakpoint;
+
+ class DebuggerTracingDialog : public DebuggerTracingDialogBase
+ {
+ Q_OBJECT
+ public:
+ DebuggerTracingDialog(Breakpoint* bp,
+ QWidget* parent, const char* name = 0);
+
+ private slots:
+ void enableOrDisable(int);
+ void enableOrDisableCustomFormat(int);
+
+ private:
+ void accept();
+
+ private:
+ Breakpoint* bp_;
+ };
+}
+
+#endif
diff --git a/languages/cpp/debugger/debuggertracingdialogbase.ui b/languages/cpp/debugger/debuggertracingdialogbase.ui
new file mode 100644
index 00000000..333dc4de
--- /dev/null
+++ b/languages/cpp/debugger/debuggertracingdialogbase.ui
@@ -0,0 +1,141 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DebuggerTracingDialogBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>DebuggerTracingDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>348</width>
+ <height>409</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Tracing Configuration</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>enable</cstring>
+ </property>
+ <property name="text">
+ <string>Enable tracing</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Enable tracing&lt;/b&gt;
+&lt;p&gt;Tracing is a mechanism to automatically print values of the choosed expressions and continue execution when breakpoint is hit. You can think of it as printf debugging that does not require modifying the source.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="2">
+ <property name="name">
+ <cstring>cancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>enableCustomFormat</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Custom format string</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="1">
+ <property name="name">
+ <cstring>okButton</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="5" column="0">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KLineEdit" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>customFormat</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Custom format string&lt;/b&gt;
+&lt;p&gt;Specify a C-style format string that will be used when printing the choosen expression. For example:
+&lt;p align="center"&gt; &lt;tt&gt;Tracepoint 1: g = %d&lt;/tt&gt;&lt;/p&gt;
+If custom format string is not enabled, names and values of all expressions will be printed, using "%d" as format specifier for all expressions.</string>
+ </property>
+ </widget>
+ <widget class="KEditListBox" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>expressions</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>expressionsLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Expressions to print:</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DebuggerTracingDialogBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DebuggerTracingDialogBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>enableOrDisable()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>keditlistbox.h</includehint>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/debugger/disassemblewidget.cpp b/languages/cpp/debugger/disassemblewidget.cpp
new file mode 100644
index 00000000..759393f5
--- /dev/null
+++ b/languages/cpp/debugger/disassemblewidget.cpp
@@ -0,0 +1,173 @@
+/***************************************************************************
+ begin : Tues Jan 3 2000
+ copyright : (C) 2000 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "disassemblewidget.h"
+#include "gdbcontroller.h"
+#include "gdbcommand.h"
+
+#include <kdebug.h>
+#include <kdeversion.h>
+#include <ktextedit.h>
+#include <kglobalsettings.h>
+
+#include <qdict.h>
+#include <qheader.h>
+#include <qtextedit.h>
+
+#include <stdlib.h>
+
+namespace GDBDebugger
+{
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+DisassembleWidget::DisassembleWidget(GDBController* controller, QWidget *parent, const char *name)
+ : QTextEdit(parent, name), controller_(controller),
+ active_(false),
+ lower_(0),
+ upper_(0),
+ address_(0)
+{
+ setFont(KGlobalSettings::fixedFont());
+ setReadOnly(true);
+}
+
+/***************************************************************************/
+
+DisassembleWidget::~DisassembleWidget()
+{}
+
+/***************************************************************************/
+
+bool DisassembleWidget::displayCurrent()
+{
+ Q_ASSERT(address_ >= lower_ || address_ <= upper_);
+
+ int line;
+ for (line=0; line < paragraphs(); line++)
+ {
+ unsigned long address = strtoul(text(line).latin1(), 0, 0);
+ if (address == address_)
+ {
+ // put cursor at start of line and highlight the line
+ setCursorPosition(line, 0);
+ setSelection(line,0,line+1,0,0);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/***************************************************************************/
+
+void DisassembleWidget::slotActivate(bool activate)
+{
+ kdDebug(9012) << "Disassemble widget active: " << activate << endl;
+
+ if (active_ != activate)
+ {
+ active_ = activate;
+ if (active_ && address_)
+ {
+ if (address_ < lower_ || address_ > upper_ || !displayCurrent())
+ getNextDisplay();
+ }
+ }
+}
+
+/***************************************************************************/
+
+void DisassembleWidget::slotShowStepInSource( const QString &, int,
+ const QString &currentAddress)
+{
+ kdDebug(9012) << "DisasssembleWidget::slotShowStepInSource()" << endl;
+
+ currentAddress_ = currentAddress;
+ address_ = strtoul(currentAddress.latin1(), 0, 0);
+ if (!active_)
+ return;
+
+ if (address_ < lower_ || address_ > upper_ || !displayCurrent())
+ getNextDisplay();
+}
+
+/***************************************************************************/
+
+void DisassembleWidget::getNextDisplay()
+{
+ kdDebug(9012) << "DisasssembleWidget::getNextDisplay()" << endl;
+
+ if (address_)
+ {
+ Q_ASSERT(!currentAddress_.isNull());
+
+ QString cmd = QString("-data-disassemble -s $pc -e \"$pc + 128\" -- 0");
+ controller_->addCommandToFront(
+ new GDBCommand( cmd, this, &DisassembleWidget::memoryRead ) );
+ }
+}
+
+/***************************************************************************/
+
+void DisassembleWidget::memoryRead(const GDBMI::ResultRecord& r)
+{
+ const GDBMI::Value& content = r["asm_insns"];
+ QString rawdata;
+
+ clear();
+
+ for(unsigned i = 0; i < content.size(); ++i)
+ {
+ const GDBMI::Value& line = content[i];
+
+ QString addr = line["address"].literal();
+ QString fct = line["func-name"].literal();
+ QString offs = line["offset"].literal();
+ QString inst = line["inst"].literal();
+
+ rawdata += QString(addr + " " + fct+"+"+offs + " " + inst + "\n");
+
+ if (i == 0) {
+ lower_ = strtoul(addr.latin1(), 0, 0);
+ } else if (i == content.size()-1) {
+ upper_ = strtoul(addr.latin1(), 0, 0);
+ }
+ }
+
+ append(rawdata);
+
+ displayCurrent();
+}
+
+
+void DisassembleWidget::showEvent(QShowEvent*)
+{
+ slotActivate(true);
+}
+
+
+void DisassembleWidget::hideEvent(QHideEvent*)
+{
+ slotActivate(false);
+}
+
+/***************************************************************************/
+
+}
+
+#include "disassemblewidget.moc"
diff --git a/languages/cpp/debugger/disassemblewidget.h b/languages/cpp/debugger/disassemblewidget.h
new file mode 100644
index 00000000..6b2fdd3a
--- /dev/null
+++ b/languages/cpp/debugger/disassemblewidget.h
@@ -0,0 +1,69 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DISASSEMBLEWIDGET_H_
+#define _DISASSEMBLEWIDGET_H_
+
+#include "mi/gdbmi.h"
+
+#include <qtextedit.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace GDBDebugger
+{
+
+class Breakpoint;
+class GDBController;
+
+class DisassembleWidget : public QTextEdit
+{
+ Q_OBJECT
+
+public:
+ DisassembleWidget( GDBController* controller, QWidget *parent=0, const char *name=0 );
+ virtual ~DisassembleWidget();
+
+public slots:
+ void slotActivate(bool activate);
+ void slotShowStepInSource(const QString &fileName, int lineNum, const QString &address);
+
+private:
+ virtual void showEvent(QShowEvent*);
+ virtual void hideEvent(QHideEvent*);
+
+ bool displayCurrent();
+ void getNextDisplay();
+
+ /// callback for GDBCommand
+ void memoryRead(const GDBMI::ResultRecord& r);
+
+ GDBController* controller_;
+ bool active_;
+ unsigned long lower_;
+ unsigned long upper_;
+ unsigned long address_;
+ QString currentAddress_;
+};
+
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+#endif
diff --git a/languages/cpp/debugger/framestackwidget.cpp b/languages/cpp/debugger/framestackwidget.cpp
new file mode 100644
index 00000000..e731a1ee
--- /dev/null
+++ b/languages/cpp/debugger/framestackwidget.cpp
@@ -0,0 +1,645 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "framestackwidget.h"
+#include "gdbparser.h"
+#include "gdbcommand.h"
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kglobalsettings.h>
+
+#include <qheader.h>
+#include <qlistbox.h>
+#include <qregexp.h>
+#include <qstrlist.h>
+#include <qpainter.h>
+
+
+#include <ctype.h>
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace GDBDebugger
+{
+
+FramestackWidget::FramestackWidget(GDBController* controller,
+ QWidget *parent,
+ const char *name, WFlags f)
+ : QListView(parent, name, f),
+ viewedThread_(0),
+ controller_(controller),
+ mayUpdate_( false )
+{
+ setRootIsDecorated(true);
+ setSorting(-1);
+ setSelectionMode(Single);
+ addColumn(QString::null); // Frame number
+ addColumn(QString::null); // function name/address
+ addColumn(QString::null); // source
+ header()->hide();
+
+
+ // FIXME: maybe, all debugger components should derive from
+ // a base class that does this connect.
+ connect(controller, SIGNAL(event(GDBController::event_t)),
+ this, SLOT(slotEvent(GDBController::event_t)));
+
+ connect( this, SIGNAL(clicked(QListViewItem*)),
+ this, SLOT(slotSelectionChanged(QListViewItem*)) );
+}
+
+
+/***************************************************************************/
+
+FramestackWidget::~FramestackWidget()
+{}
+
+/***************************************************************************/
+
+QListViewItem *FramestackWidget::lastChild() const
+{
+ QListViewItem* child = firstChild();
+ if (child)
+ while (QListViewItem* nextChild = child->nextSibling())
+ child = nextChild;
+
+ return child;
+}
+
+// **************************************************************************
+
+void FramestackWidget::clear()
+{
+ viewedThread_ = 0;
+
+ QListView::clear();
+}
+
+/***************************************************************************/
+
+void FramestackWidget::slotSelectionChanged(QListViewItem *thisItem)
+{
+ ThreadStackItem *thread = dynamic_cast<ThreadStackItem*> (thisItem);
+ if (thread)
+ {
+ controller_->selectFrame(0, thread->threadNo());
+ }
+ else
+ {
+ FrameStackItem *frame = dynamic_cast<FrameStackItem*> (thisItem);
+ if (frame)
+ {
+ if (frame->text(0) == "...")
+ {
+ // Switch to the target thread.
+ if (frame->threadNo() != -1)
+ controller_->addCommand(
+ new GDBCommand(QString("-thread-select %1")
+ .arg(frame->threadNo()).ascii()));
+
+ viewedThread_ = findThread(frame->threadNo());
+ getBacktrace(frame->frameNo(), frame->frameNo() + frameChunk_);
+ }
+ else
+ {
+ controller_->
+ selectFrame(frame->frameNo(), frame->threadNo());
+ }
+ }
+ }
+}
+
+/***************************************************************************/
+
+void FramestackWidget::slotEvent(GDBController::event_t e)
+{
+ switch(e)
+ {
+ case GDBController::program_state_changed:
+
+ kdDebug(9012) << "Clearning framestack\n";
+ clear();
+
+ if ( isVisible() )
+ {
+ controller_->addCommand(
+ new GDBCommand("-thread-list-ids",
+ this, &FramestackWidget::handleThreadList));
+ mayUpdate_ = false;
+ }
+ else mayUpdate_ = true;
+
+ break;
+
+
+ case GDBController::thread_or_frame_changed:
+
+ if (viewedThread_)
+ {
+ // For non-threaded programs frame switch is no-op
+ // as far as framestack is concerned.
+ // FIXME: but need to highlight the current frame.
+
+ if (ThreadStackItem* item
+ = findThread(controller_->currentThread()))
+ {
+ viewedThread_ = item;
+
+ if (!item->firstChild())
+ {
+ // No backtrace for this thread yet.
+ getBacktrace();
+ }
+ }
+ }
+
+ break;
+
+ case GDBController::program_exited:
+ case GDBController::debugger_exited:
+ {
+ clear();
+ break;
+ }
+ case GDBController::debugger_busy:
+ case GDBController::debugger_ready:
+ case GDBController::shared_library_loaded:
+ case GDBController::program_running:
+ case GDBController::connected_to_program:
+ break;
+ }
+}
+
+void FramestackWidget::showEvent(QShowEvent*)
+{
+ if (controller_->stateIsOn(s_appRunning|s_dbgBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ if ( mayUpdate_ )
+ {
+ clear();
+
+ controller_->addCommand(
+ new GDBCommand( "-thread-list-ids", this, &FramestackWidget::handleThreadList ) );
+
+ mayUpdate_ = false;
+ }
+}
+
+void FramestackWidget::getBacktrace(int min_frame, int max_frame)
+{
+ minFrame_ = min_frame;
+ maxFrame_ = max_frame;
+
+ controller_->addCommand(
+ new GDBCommand(QString("-stack-info-depth %1").arg(max_frame+1),
+ this,
+ &FramestackWidget::handleStackDepth));
+}
+
+void FramestackWidget::handleStackDepth(const GDBMI::ResultRecord& r)
+{
+ int existing_frames = r["depth"].literal().toInt();
+
+ has_more_frames = (existing_frames > maxFrame_);
+
+ if (existing_frames < maxFrame_)
+ maxFrame_ = existing_frames;
+ //add the following command to the front, so noone switches threads in between
+ controller_->addCommandToFront(
+ new GDBCommand(QString("-stack-list-frames %1 %2")
+ .arg(minFrame_).arg(maxFrame_),
+ this, &FramestackWidget::parseGDBBacktraceList));
+}
+
+void FramestackWidget::getBacktraceForThread(int threadNo)
+{
+ unsigned currentThread = controller_->currentThread();
+ if (viewedThread_)
+ {
+ // Switch to the target thread.
+ controller_->addCommand(
+ new GDBCommand(QString("-thread-select %1")
+ .arg(threadNo).ascii()));
+
+ viewedThread_ = findThread(threadNo);
+ }
+
+ getBacktrace();
+
+ if (viewedThread_)
+ {
+ // Switch back to the original thread.
+ controller_->addCommand(
+ new GDBCommand(QString("-thread-select %1")
+ .arg(currentThread).ascii()));
+ }
+}
+
+void FramestackWidget::handleThreadList(const GDBMI::ResultRecord& r)
+{
+ // Gdb reply is:
+ // ^done,thread-ids={thread-id="3",thread-id="2",thread-id="1"},
+ // which syntactically is a tuple, but one has to access it
+ // by index anyway.
+ const GDBMI::TupleValue& ids =
+ dynamic_cast<const GDBMI::TupleValue&>(r["thread-ids"]);
+
+ if (ids.results.size() > 1)
+ {
+ // Need to iterate over all threads to figure out where each one stands.
+ // Note that this sequence of command will be executed in strict
+ // sequences, so no other view can add its command in between and
+ // get state for a wrong thread.
+
+ // Really threaded program.
+ for(unsigned i = 0, e = ids.results.size(); i != e; ++i)
+ {
+ QString id = ids.results[i]->value->literal();
+
+ controller_->addCommand(
+ new GDBCommand(QString("-thread-select %1").arg(id).ascii(),
+ this, &FramestackWidget::handleThread));
+ }
+
+ controller_->addCommand(
+ new GDBCommand(QString("-thread-select %1")
+ .arg(controller_->currentThread()).ascii()));
+ }
+
+ // Get backtrace for the current thread. We need to do this
+ // here, and not in event handler for program_state_changed,
+ // viewedThread_ is initialized by 'handleThread' before
+ // backtrace handler is called.
+ getBacktrace();
+}
+
+void FramestackWidget::handleThread(const GDBMI::ResultRecord& r)
+{
+ QString id = r["new-thread-id"].literal();
+ int id_num = id.toInt();
+
+ QString name_column;
+ QString func_column;
+ QString args_column;
+ QString source_column;
+
+ formatFrame(r["frame"], func_column, source_column);
+
+ ThreadStackItem* thread = new ThreadStackItem(this, id_num);
+ thread->setText(1, func_column);
+ thread->setText(2, source_column);
+
+ // The thread with a '*' is always the viewedthread
+
+ if (id_num == controller_->currentThread())
+ {
+ viewedThread_ = thread;
+ setSelected(viewedThread_, true);
+ }
+}
+
+
+void FramestackWidget::parseGDBBacktraceList(const GDBMI::ResultRecord& r)
+{
+ if (!r.hasField("stack"))
+ return;
+
+ const GDBMI::Value& frames = r["stack"];
+
+ if (frames.empty())
+ return;
+
+ Q_ASSERT(dynamic_cast<const GDBMI::ListValue*>(&frames));
+
+ // Remove "..." item, if there's one.
+ QListViewItem* last;
+ if (viewedThread_)
+ {
+ last = viewedThread_->firstChild();
+ if (last)
+ while(last->nextSibling())
+ last = last->nextSibling();
+ }
+ else
+ {
+ last = lastItem();
+ }
+ if (last && last->text(0) == "...")
+ delete last;
+
+ int lastLevel;
+ for(unsigned i = 0, e = frames.size(); i != e; ++i)
+ {
+ const GDBMI::Value& frame = frames[i];
+
+ // For now, just produce string simular to gdb
+ // console output. In future we might have a table,
+ // or something better.
+ QString frameDesc;
+
+ QString name_column;
+ QString func_column;
+ QString source_column;
+
+ QString level_s = frame["level"].literal();
+ int level = level_s.toInt();
+
+ name_column = "#" + level_s;
+
+ formatFrame(frame, func_column, source_column);
+
+ FrameStackItem* item;
+ if (viewedThread_)
+ item = new FrameStackItem(viewedThread_, level, name_column);
+ else
+ item = new FrameStackItem(this, level, name_column);
+ lastLevel = level;
+
+ item->setText(1, func_column);
+ item->setText(2, source_column);
+ }
+ if (has_more_frames)
+ {
+ QListViewItem* item;
+ if (viewedThread_)
+ item = new FrameStackItem(viewedThread_, lastLevel+1, "...");
+ else
+ item = new FrameStackItem(this, lastLevel+1, "...");
+ item->setText(1, "(click to get more frames)");
+ }
+
+ currentFrame_ = 0;
+ // Make sure the first frame in the stopped backtrace is selected
+ // and open
+ if (viewedThread_)
+ viewedThread_->setOpen(true);
+ else
+ {
+ if (FrameStackItem* frame = (FrameStackItem*) firstChild())
+ {
+ frame->setOpen(true);
+ setSelected(frame, true);
+ }
+ }
+}
+
+// **************************************************************************
+
+ThreadStackItem *FramestackWidget::findThread(int threadNo)
+{
+ QListViewItem *sibling = firstChild();
+ while (sibling)
+ {
+ ThreadStackItem *thread = dynamic_cast<ThreadStackItem*> (sibling);
+ if (thread && thread->threadNo() == threadNo)
+ {
+ return thread;
+ }
+ sibling = sibling->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+
+FrameStackItem *FramestackWidget::findFrame(int frameNo, int threadNo)
+{
+ QListViewItem* frameItem = 0;
+
+ if (threadNo != -1)
+ {
+ ThreadStackItem *thread = findThread(threadNo);
+ if (thread == 0)
+ return 0; // no matching thread?
+ frameItem = thread->firstChild();
+ }
+ else
+ frameItem = firstChild();
+
+ while (frameItem)
+ {
+ if (((FrameStackItem*)frameItem)->frameNo() == frameNo)
+ break;
+
+ frameItem = frameItem->nextSibling();
+ }
+ return (FrameStackItem*)frameItem;
+}
+
+void FramestackWidget::formatFrame(const GDBMI::Value& frame,
+ QString& func_column,
+ QString& source_column)
+{
+ func_column = source_column = "";
+
+ if (frame.hasField("func"))
+ {
+ func_column += " " + frame["func"].literal();
+ }
+ else
+ {
+ func_column += " " + frame["address"].literal();
+ }
+
+
+ if (frame.hasField("file"))
+ {
+ source_column = frame["file"].literal();
+
+ if (frame.hasField("line"))
+ {
+ source_column += ":" + frame["line"].literal();
+ }
+ }
+ else if (frame.hasField("from"))
+ {
+ source_column = frame["from"].literal();
+ }
+}
+
+
+void FramestackWidget::drawContentsOffset( QPainter * p, int ox, int oy,
+ int cx, int cy, int cw, int ch )
+{
+ QListView::drawContentsOffset(p, ox, oy, cx, cy, cw, ch);
+
+ int s1_x = header()->sectionPos(1);
+ int s1_w = header()->sectionSize(1);
+
+ QRect section1(s1_x, contentsHeight(), s1_w, viewport()->height());
+
+ p->fillRect(section1, KGlobalSettings::alternateBackgroundColor());
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+FrameStackItem::FrameStackItem(FramestackWidget *parent,
+ unsigned frameNo,
+ const QString &name)
+ : QListViewItem(parent, parent->lastChild()),
+ frameNo_(frameNo),
+ threadNo_(-1)
+{
+ setText(0, name);
+}
+
+// **************************************************************************
+
+FrameStackItem::FrameStackItem(ThreadStackItem *parent,
+ unsigned frameNo,
+ const QString &name)
+ : QListViewItem(parent, parent->lastChild()),
+ frameNo_(frameNo),
+ threadNo_(parent->threadNo())
+{
+ setText(0, name);
+}
+
+// **************************************************************************
+
+FrameStackItem::~FrameStackItem()
+{}
+
+// **************************************************************************
+
+QListViewItem *FrameStackItem::lastChild() const
+{
+ QListViewItem* child = firstChild();
+ if (child)
+ while (QListViewItem* nextChild = child->nextSibling())
+ child = nextChild;
+
+ return child;
+}
+
+// **************************************************************************
+
+void FrameStackItem::setOpen(bool open)
+{
+#if 0
+ if (open)
+ {
+ FramestackWidget* owner = (FramestackWidget*)listView();
+ if (this->threadNo() != owner->viewedThread() &&
+ this->frameNo() != owner->currentFrame_)
+ {
+ ((FramestackWidget*)listView())->slotSelectFrame(0, threadNo());
+ }
+ }
+#endif
+ QListViewItem::setOpen(open);
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+ThreadStackItem::ThreadStackItem(FramestackWidget *parent, unsigned threadNo)
+: QListViewItem(parent),
+ threadNo_(threadNo)
+{
+ setText(0, i18n("Thread %1").arg(threadNo_));
+ setExpandable(true);
+}
+
+// **************************************************************************
+
+ThreadStackItem::~ThreadStackItem()
+{}
+
+// **************************************************************************
+
+QListViewItem *ThreadStackItem::lastChild() const
+{
+ QListViewItem* child = firstChild();
+ if (child)
+ while (QListViewItem* nextChild = child->nextSibling())
+ child = nextChild;
+
+ return child;
+}
+
+// **************************************************************************
+
+void ThreadStackItem::setOpen(bool open)
+{
+ // If we're openining, and have no child yet, get backtrace from
+ // gdb.
+ if (open && !firstChild())
+ {
+ // Not that this will not switch to another thread (and won't show
+ // position in that other thread). This will only get the frames.
+
+ // Imagine you have 20 frames and you want to find one blocked on
+ // mutex. You don't want a new source file to be opened for each
+ // thread you open to find if that's the one you want to debug.
+ ((FramestackWidget*)listView())->getBacktraceForThread(threadNo());
+ }
+
+ if (open)
+ {
+ savedFunc_ = text(1);
+ setText(1, "");
+ savedSource_ = text(2);
+ setText(2, "");
+ }
+ else
+ {
+ setText(1, savedFunc_);
+ setText(2, savedSource_);
+ }
+
+ QListViewItem::setOpen(open);
+}
+
+void FrameStackItem::paintCell(QPainter * p, const QColorGroup & cg,
+ int column, int width, int align )
+{
+ QColorGroup cg2(cg);
+ if (column % 2)
+ {
+ cg2.setColor(QColorGroup::Base,
+ KGlobalSettings::alternateBackgroundColor());
+ }
+ QListViewItem::paintCell(p, cg2, column, width, align);
+}
+
+void ThreadStackItem::paintCell(QPainter * p, const QColorGroup & cg,
+ int column, int width, int align )
+{
+ QColorGroup cg2(cg);
+ if (column % 2)
+ {
+ cg2.setColor(QColorGroup::Base,
+ KGlobalSettings::alternateBackgroundColor());
+ }
+ QListViewItem::paintCell(p, cg2, column, width, align);
+}
+
+
+}
+
+/***************************************************************************/
+/***************************************************************************/
+
+#include "framestackwidget.moc"
diff --git a/languages/cpp/debugger/framestackwidget.h b/languages/cpp/debugger/framestackwidget.h
new file mode 100644
index 00000000..36cac1ba
--- /dev/null
+++ b/languages/cpp/debugger/framestackwidget.h
@@ -0,0 +1,183 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _FRAMESTACKWIDGET_H_
+#define _FRAMESTACKWIDGET_H_
+
+#include <qlistview.h>
+#include <qstringlist.h>
+
+#include "gdbcontroller.h"
+#include "mi/miparser.h"
+
+#include <vector>
+
+namespace GDBDebugger
+{
+
+class FramestackWidget;
+
+
+class ThreadStackItem : public QListViewItem
+{
+public:
+ ThreadStackItem(FramestackWidget *parent,
+ unsigned threadNo);
+ virtual ~ThreadStackItem();
+
+ void setOpen(bool open);
+ QListViewItem *lastChild() const;
+
+ void paintCell(QPainter * p, const QColorGroup & cg,
+ int column, int width, int align );
+
+ int threadNo()
+ { return threadNo_; }
+
+private:
+ int threadNo_;
+ QString savedFunc_;
+ QString savedSource_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class FrameStackItem : public QListViewItem
+{
+public:
+ FrameStackItem(FramestackWidget *parent,
+ unsigned frameNo,
+ const QString &name);
+ FrameStackItem(ThreadStackItem *parent,
+ unsigned frameNo,
+ const QString &name);
+ virtual ~FrameStackItem();
+
+ void setOpen(bool open);
+ QListViewItem *lastChild() const;
+
+ void paintCell(QPainter * p, const QColorGroup & cg,
+ int column, int width, int align );
+
+ int frameNo()
+ { return frameNo_; }
+ int threadNo()
+ { return threadNo_; }
+private:
+ int frameNo_;
+ int threadNo_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+
+/**
+ * @author John Birch
+ */
+class FramestackWidget : public QListView
+{
+ Q_OBJECT
+
+public:
+ FramestackWidget( GDBController* controller,
+ QWidget *parent=0,
+ const char *name=0, WFlags f=0 );
+ virtual ~FramestackWidget();
+
+ QListViewItem *lastChild() const;
+
+ ThreadStackItem *findThread(int threadNo);
+ FrameStackItem *findFrame(int frameNo, int threadNo);
+
+ int viewedThread()
+ { return viewedThread_ ? viewedThread_->threadNo() : -1; }
+
+protected:
+
+ void drawContentsOffset( QPainter * p, int ox, int oy,
+ int cx, int cy, int cw, int ch );
+
+
+
+private:
+ /** Given gdb's 'frame' information, compute decent
+ textual representation for display.
+
+ The function is used both for frames and threads.
+ */
+ void formatFrame(const GDBMI::Value& frame,
+ QString& func_column,
+ QString& source_column);
+
+ /** Cause gdb to produce backtrace for the current thread.
+
+ GDB reply will be route to parseArg and parseGDBBacktraceList,
+ and will show up under viewedThread_ (if there are threads), or
+ on top-level.
+ */
+ void getBacktrace(int min_frame = 0, int max_frame = frameChunk_);
+
+ /** Obtains backtrace for the specified thread without chaning the current
+ thread in gdb.
+
+ Switches viewedThread_ to the specified thread, switches gdb thread,
+ call getBacktrace(), and switches the current thread back.
+ */
+ void getBacktraceForThread(int threadNo);
+ friend class ThreadStackItem;
+
+
+ void handleThreadList(const GDBMI::ResultRecord&);
+ void handleThread(const GDBMI::ResultRecord&);
+ void parseGDBBacktraceList(const GDBMI::ResultRecord&);
+ void handleStackDepth(const GDBMI::ResultRecord& r);
+
+public slots:
+ void slotEvent(GDBController::event_t e);
+ void slotSelectionChanged(QListViewItem *thisItem);
+
+#if QT_VERSION < 300
+private:
+ QListViewItem* findItemWhichBeginsWith(const QString& text) const;
+#endif
+ virtual void showEvent(QShowEvent*);
+
+private:
+
+ void clear();
+
+private:
+
+ ThreadStackItem *viewedThread_;
+ int currentFrame_;
+ GDBController* controller_;
+
+ // Data to pass from 'getBacktrace' to 'handleStackDepth'
+ int minFrame_;
+ int maxFrame_;
+ bool has_more_frames;
+
+ bool mayUpdate_;
+
+ friend class FrameStackItem;
+
+ static const int frameChunk_ = 5;
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/gdbbreakpointwidget.cpp b/languages/cpp/debugger/gdbbreakpointwidget.cpp
new file mode 100644
index 00000000..f9a83d6c
--- /dev/null
+++ b/languages/cpp/debugger/gdbbreakpointwidget.cpp
@@ -0,0 +1,1262 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "gdbbreakpointwidget.h"
+#include "gdbtable.h"
+#include "debuggertracingdialog.h"
+#include "gdbcommand.h"
+#include "gdbcontroller.h"
+
+#include "breakpoint.h"
+#include "domutil.h"
+
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kurl.h>
+#include <kmessagebox.h>
+
+#include <qvbuttongroup.h>
+#include <qfileinfo.h>
+#include <qheader.h>
+#include <qtable.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+
+#include <stdlib.h>
+#include <ctype.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace GDBDebugger
+{
+
+enum Column {
+ Control = 0,
+ Enable = 1,
+ Type = 2,
+ Status = 3,
+ Location = 4,
+ Condition = 5,
+ IgnoreCount = 6,
+ Hits = 7,
+ Tracing = 8
+};
+
+
+#define numCols 9
+
+enum BW_ITEMS { BW_ITEM_Show, BW_ITEM_Edit, BW_ITEM_Disable, BW_ITEM_Delete,
+ BW_ITEM_DisableAll, BW_ITEM_EnableAll, BW_ITEM_DeleteAll};
+
+static int m_activeFlag = 0;
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class BreakpointTableRow : public QTableItem
+{
+public:
+
+ BreakpointTableRow(QTable* table, EditType editType, Breakpoint* bp);
+ ~BreakpointTableRow();
+
+ bool match (Breakpoint* bp) const;
+ void reset ();
+ void setRow();
+
+ Breakpoint* breakpoint() { return m_breakpoint; }
+
+private:
+ void appendEmptyRow();
+
+private:
+ Breakpoint* m_breakpoint;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+BreakpointTableRow::BreakpointTableRow(QTable* parent, EditType editType,
+ Breakpoint* bp) :
+ QTableItem(parent, editType, ""),
+ m_breakpoint(bp)
+{
+ appendEmptyRow();
+ setRow();
+}
+
+/***************************************************************************/
+
+BreakpointTableRow::~BreakpointTableRow()
+{
+ m_breakpoint->deleteLater();
+}
+
+/***************************************************************************/
+
+bool BreakpointTableRow::match(Breakpoint* breakpoint) const
+{
+ return m_breakpoint->match(breakpoint);
+}
+
+/***************************************************************************/
+
+void BreakpointTableRow::reset()
+{
+ m_breakpoint->reset();
+ setRow();
+}
+
+/***************************************************************************/
+
+void BreakpointTableRow::appendEmptyRow()
+{
+ int row = table()->numRows();
+ table()->setNumRows(row+1);
+
+ table()->setItem(row, Control, this);
+
+ QCheckTableItem* cti = new QCheckTableItem( table(), "");
+ table()->setItem(row, Enable, cti);
+
+ ComplexEditCell* act = new ComplexEditCell(table());
+ table()->setItem(row, Tracing, act);
+ QObject::connect(act, SIGNAL(edit(QTableItem*)),
+ table()->parent(), SLOT(editTracing(QTableItem*)));
+}
+
+/***************************************************************************/
+
+void BreakpointTableRow::setRow()
+{
+ if ( m_breakpoint )
+ {
+ QTableItem *item = table()->item ( row(), Enable );
+ Q_ASSERT(item->rtti() == 2);
+ ((QCheckTableItem*)item)->setChecked(m_breakpoint->isEnabled());
+
+ QString status=m_breakpoint->statusDisplay(m_activeFlag);
+
+ table()->setText(row(), Status, status);
+ table()->setText(row(), Condition, m_breakpoint->conditional());
+ table()->setText(row(), IgnoreCount, QString::number(m_breakpoint->ignoreCount() ));
+ table()->setText(row(), Hits, QString::number(m_breakpoint->hits() ));
+
+ QString displayType = m_breakpoint->displayType();
+ table()->setText(row(), Location, m_breakpoint->location());
+
+
+ QTableItem* ce = table()->item( row(), Tracing );
+ ce->setText(breakpoint()->tracingEnabled() ? "Enabled" : "Disabled");
+ // In case there's editor open in this cell, update it too.
+ static_cast<ComplexEditCell*>(ce)->updateValue();
+
+
+ if (m_breakpoint->isTemporary())
+ displayType = i18n(" temporary");
+ if (m_breakpoint->isHardwareBP())
+ displayType += i18n(" hw");
+
+ table()->setText(row(), Type, displayType);
+ table()->adjustColumn(Type);
+ table()->adjustColumn(Status);
+ table()->adjustColumn(Location);
+ table()->adjustColumn(Hits);
+ table()->adjustColumn(IgnoreCount);
+ table()->adjustColumn(Condition);
+ }
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+GDBBreakpointWidget::GDBBreakpointWidget(GDBController* controller,
+ QWidget *parent, const char *name) :
+QHBox(parent, name),
+controller_(controller)
+{
+ m_table = new GDBTable(0, numCols, this, name);
+ m_table->setSelectionMode(QTable::SingleRow);
+ m_table->setShowGrid (false);
+ m_table->setLeftMargin(0);
+ m_table->setFocusStyle(QTable::FollowStyle);
+
+ m_table->hideColumn(Control);
+ m_table->setColumnReadOnly(Type, true);
+ m_table->setColumnReadOnly(Status, true);
+ m_table->setColumnReadOnly(Hits, true);
+ m_table->setColumnWidth( Enable, 20);
+
+ QHeader *header = m_table->horizontalHeader();
+
+ header->setLabel( Enable, "" );
+ header->setLabel( Type, i18n("Type") );
+ header->setLabel( Status, i18n("Status") );
+ header->setLabel( Location, i18n("Location") );
+ header->setLabel( Condition, i18n("Condition") );
+ header->setLabel( IgnoreCount, i18n("Ignore Count") );
+ header->setLabel( Hits, i18n("Hits") );
+ header->setLabel( Tracing, i18n("Tracing") );
+
+ QPopupMenu* newBreakpoint = new QPopupMenu(this);
+ newBreakpoint->insertItem(i18n("Code breakpoint", "Code"),
+ BP_TYPE_FilePos);
+ newBreakpoint->insertItem(i18n("Data breakpoint", "Data write"),
+ BP_TYPE_Watchpoint);
+ newBreakpoint->insertItem(i18n("Data read breakpoint", "Data read"),
+ BP_TYPE_ReadWatchpoint);
+
+
+ m_ctxMenu = new QPopupMenu( this );
+ m_ctxMenu->insertItem( i18n("New breakpoint", "New"),
+ newBreakpoint);
+ m_ctxMenu->insertItem( i18n( "Show text" ), BW_ITEM_Show );
+ int edit_id =
+ m_ctxMenu->insertItem( i18n( "Edit" ), BW_ITEM_Edit );
+ m_ctxMenu->setAccel(Qt::Key_Enter, edit_id);
+ m_ctxMenu->insertItem( i18n( "Disable" ), BW_ITEM_Disable );
+ int del_id =
+ m_ctxMenu->insertItem( SmallIcon("breakpoint_delete"),
+ i18n( "Delete" ), BW_ITEM_Delete );
+ m_ctxMenu->setAccel(Qt::Key_Delete, del_id);
+ m_ctxMenu->insertSeparator();
+ m_ctxMenu->insertItem( i18n( "Disable all"), BW_ITEM_DisableAll );
+ m_ctxMenu->insertItem( i18n( "Enable all"), BW_ITEM_EnableAll );
+ m_ctxMenu->insertItem( i18n( "Delete all"), BW_ITEM_DeleteAll );
+
+ m_table->show();
+
+ connect( newBreakpoint, SIGNAL(activated(int)),
+ this, SLOT(slotAddBlankBreakpoint(int)) );
+
+ connect( m_table, SIGNAL(contextMenuRequested(int, int, const QPoint &)),
+ this, SLOT(slotContextMenuShow(int, int, const QPoint & )) );
+ connect( m_ctxMenu, SIGNAL(activated(int)),
+ this, SLOT(slotContextMenuSelect(int)) );
+
+ connect( m_table, SIGNAL(doubleClicked(int, int, int, const QPoint &)),
+ this, SLOT(slotRowDoubleClicked(int, int, int, const QPoint &)));
+
+ connect( m_table, SIGNAL(valueChanged(int, int)),
+ this, SLOT(slotNewValue(int, int)));
+
+ connect( m_table, SIGNAL(returnPressed()),
+ this, SLOT(slotEditBreakpoint()));
+// connect( m_table, SIGNAL(f2Pressed()),
+// this, SLOT(slotEditBreakpoint()));
+ connect( m_table, SIGNAL(deletePressed()),
+ this, SLOT(slotRemoveBreakpoint()));
+// This slot doesn't exist anymore
+// connect( m_table, SIGNAL(insertPressed()),
+// this, SLOT(slotAddBlankBreakpoint()));
+
+ // FIXME: maybe, all debugger components should derive from
+ // a base class that does this connect.
+ connect(controller, SIGNAL(event(GDBController::event_t)),
+ this, SLOT(slotEvent(GDBController::event_t)));
+
+ connect(controller,
+ SIGNAL(watchpointHit(int, const QString&, const QString&)),
+ this,
+ SLOT(slotWatchpointHit(int, const QString&, const QString&)));
+}
+
+/***************************************************************************/
+
+GDBBreakpointWidget::~GDBBreakpointWidget()
+{
+ delete m_table;
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::reset()
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ btr->reset();
+ sendToGdb(*(btr->breakpoint()));
+ }
+ }
+}
+
+/***************************************************************************/
+
+// When a file is loaded then we need to tell the editor (display window)
+// which lines contain a breakpoint.
+void GDBBreakpointWidget::slotRefreshBP(const KURL &filename)
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ FilePosBreakpoint* bp = dynamic_cast<FilePosBreakpoint*>(btr->breakpoint());
+ if (bp && bp->hasFileAndLine()
+ && (bp->fileName() == filename.path()))
+ emit refreshBPState(*bp);
+ }
+ }
+}
+
+void GDBBreakpointWidget::slotBreakpointHit(int id)
+{
+ BreakpointTableRow* br = findId(id);
+
+ // FIXME: should produce an message, this is most likely
+ // an error.
+ if (!br)
+ return;
+
+ Breakpoint* b = br->breakpoint();
+
+ if (b->tracingEnabled())
+ {
+ controller_->addCommand(
+ new CliCommand(("printf "
+ + b->traceRealFormatString()).latin1(),
+ this,
+ &GDBBreakpointWidget::handleTracingPrintf));
+
+ controller_->addCommand(new
+ GDBCommand("-exec-continue"));
+
+ }
+ else
+ {
+ controller_->demandAttention();
+ }
+}
+
+void GDBBreakpointWidget::slotWatchpointHit(int id,
+ const QString& oldValue,
+ const QString& newValue)
+{
+ BreakpointTableRow* br = findId(id);
+
+ // FIXME: should produce an message, this is most likely
+ // an error.
+ if (!br)
+ return;
+
+ Watchpoint* b = dynamic_cast<Watchpoint*>(br->breakpoint());
+
+
+ KMessageBox::information(
+ 0,
+ i18n("<b>Data write breakpoint</b><br>"
+ "Expression: %1<br>"
+ "Address: 0x%2<br>"
+ "Old value: %3<br>"
+ "New value: %4")
+ .arg(b->varName())
+ .arg(b->address(), 0, 16)
+ .arg(oldValue)
+ .arg(newValue));
+}
+
+/***************************************************************************/
+
+BreakpointTableRow* GDBBreakpointWidget::find(Breakpoint *breakpoint)
+{
+ // NOTE:- The match doesn't have to be equal. Each type of bp
+ // must decide on the match criteria.
+ Q_ASSERT (breakpoint);
+
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr && btr->match(breakpoint))
+ return btr;
+ }
+
+ return 0;
+}
+
+/***************************************************************************/
+
+// The Id is supplied by the debugger
+BreakpointTableRow* GDBBreakpointWidget::findId(int dbgId)
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr && btr->breakpoint()->dbgId() == dbgId)
+ return btr;
+ }
+
+ return 0;
+}
+
+/***************************************************************************/
+
+// The key is a unique number supplied by us
+BreakpointTableRow* GDBBreakpointWidget::findKey(int BPKey)
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr && btr->breakpoint()->key() == BPKey)
+ return btr;
+ }
+
+ return 0;
+}
+
+bool GDBBreakpointWidget::hasWatchpointForAddress(
+ unsigned long long address) const
+{
+ for(int i = 0; i < m_table->numRows(); ++i)
+ {
+ BreakpointTableRow* br = (BreakpointTableRow*)
+ m_table->item(i, Control);
+
+ Watchpoint* w = dynamic_cast<Watchpoint*>(br->breakpoint());
+ if (w && w->address() == address)
+ return true;
+ }
+ return false;
+}
+
+/***************************************************************************/
+
+BreakpointTableRow* GDBBreakpointWidget::addBreakpoint(Breakpoint *bp)
+{
+ BreakpointTableRow* btr =
+ new BreakpointTableRow( m_table, QTableItem::WhenCurrent, bp );
+
+ connect(bp, SIGNAL(modified(Breakpoint*)),
+ this, SLOT(slotBreakpointModified(Breakpoint*)));
+
+ sendToGdb(*bp);
+
+ return btr;
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::removeBreakpoint(BreakpointTableRow* btr)
+{
+ if (!btr)
+ return;
+
+ // Pending but the debugger hasn't started processing this bp so
+ // we can just remove it.
+ Breakpoint* bp = btr->breakpoint();
+ // No gdb breakpoint, and no breakpoint addition command in the
+ // queue. Just remove.
+ if (bp->dbgId() == -1 && !bp->isDbgProcessing())
+ {
+ bp->setActionDie();
+ sendToGdb(*bp);
+ m_table->removeRow(btr->row());
+ }
+ else
+ {
+ bp->setActionClear(true);
+ sendToGdb(*bp);
+ btr->setRow();
+ }
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotToggleBreakpoint(const QString &fileName, int lineNum)
+{
+ FilePosBreakpoint *fpBP = new FilePosBreakpoint(fileName, lineNum+1);
+
+ BreakpointTableRow* btr = find(fpBP);
+ if (btr)
+ {
+ removeBreakpoint(btr);
+ }
+ else
+ addBreakpoint(fpBP);
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotToggleBreakpointEnabled(const QString &fileName, int lineNum)
+{
+ FilePosBreakpoint *fpBP = new FilePosBreakpoint(fileName, lineNum+1);
+
+ BreakpointTableRow* btr = find(fpBP);
+ delete fpBP;
+ if (btr)
+ {
+ Breakpoint* bp=btr->breakpoint();
+ bp->setEnabled(!bp->isEnabled());
+ sendToGdb(*bp);
+ }
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotToggleWatchpoint(const QString &varName)
+{
+ Watchpoint *watchpoint = new Watchpoint(varName, false, true);
+ BreakpointTableRow* btr = find(watchpoint);
+ if (btr)
+ {
+ removeBreakpoint(btr);
+ delete watchpoint;
+ }
+ else
+ addBreakpoint(watchpoint);
+}
+
+void GDBBreakpointWidget::handleBreakpointList(const GDBMI::ResultRecord& r)
+{
+ m_activeFlag++;
+
+ const GDBMI::Value& blist = r["BreakpointTable"]["body"];
+
+ for(unsigned i = 0, e = blist.size(); i != e; ++i)
+ {
+ const GDBMI::Value& b = blist[i];
+
+ int id = b["number"].literal().toInt();
+ BreakpointTableRow* btr = findId(id);
+ if (btr)
+ {
+ Breakpoint *bp = btr->breakpoint();
+ bp->setActive(m_activeFlag, id);
+ bp->setHits(b["times"].toInt());
+ if (b.hasField("ignore"))
+ bp->setIgnoreCount(b["ignore"].toInt());
+ else
+ bp->setIgnoreCount(0);
+ if (b.hasField("cond"))
+ bp->setConditional(b["cond"].literal());
+ else
+ bp->setConditional(QString::null);
+ btr->setRow();
+ emit publishBPState(*bp);
+ }
+ else
+ {
+ // It's a breakpoint added outside, most probably
+ // via gdb console. Add it now.
+ QString type = b["type"].literal();
+
+ if (type == "breakpoint" || type == "hw breakpoint")
+ {
+ if (b.hasField("fullname") && b.hasField("line"))
+ {
+ Breakpoint* bp = new FilePosBreakpoint(
+ b["fullname"].literal(),
+ b["line"].literal().toInt());
+
+ bp->setActive(m_activeFlag, id);
+ bp->setActionAdd(false);
+ bp->setPending(false);
+
+ new BreakpointTableRow(m_table,
+ QTableItem::WhenCurrent,
+ bp);
+
+ emit publishBPState(*bp);
+ }
+ }
+
+ }
+ }
+
+ // Remove any inactive breakpoints.
+ for ( int row = m_table->numRows()-1; row >= 0 ; row-- )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ Breakpoint* bp = btr->breakpoint();
+ if (!(bp->isActive(m_activeFlag)))
+ {
+ // FIXME: need to review is this happens for
+ // as-yet unset breakpoint.
+ bp->removedInGdb();
+ }
+ }
+ }
+}
+
+void GDBBreakpointWidget::handleTracingPrintf(const QValueVector<QString>& s)
+{
+ // The first line of output is the command itself, which we don't need.
+ for(unsigned i = 1; i < s.size(); ++i)
+ emit tracingOutput(s[i].local8Bit());
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotBreakpointSet(Breakpoint* bp)
+{
+ // FIXME: why 'key' is used here?
+ BreakpointTableRow* btr = findKey(bp->key());
+ if (!btr)
+ {
+ kdDebug(9012) << "Early return\n";
+ return;
+ }
+
+ btr->setRow();
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotAddBlankBreakpoint(int idx)
+{
+ BreakpointTableRow* btr = 0;
+ switch (idx)
+ {
+ case BP_TYPE_FilePos:
+ btr = addBreakpoint(new FilePosBreakpoint());
+ break;
+
+ case BP_TYPE_Watchpoint:
+ btr = addBreakpoint(new Watchpoint(""));
+ break;
+
+ case BP_TYPE_ReadWatchpoint:
+ btr = addBreakpoint(new ReadWatchpoint(""));
+ break;
+
+ default:
+ break;
+ }
+
+ if (btr)
+ {
+ m_table->selectRow(btr->row());
+ m_table->editCell(btr->row(), Location, false);
+ }
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotRemoveBreakpoint()
+{
+ int row = m_table->currentRow();
+ if ( row != -1)
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ removeBreakpoint(btr);
+ }
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotRemoveAllBreakpoints()
+{
+ for ( int row = m_table->numRows()-1; row>=0; row-- )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ removeBreakpoint(btr);
+ }
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotRowDoubleClicked(int row, int col, int btn, const QPoint &)
+{
+ if ( btn == Qt::LeftButton )
+ {
+// kdDebug(9012) << "in slotRowSelected row=" << row << endl;
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ FilePosBreakpoint* bp = dynamic_cast<FilePosBreakpoint*>(btr->breakpoint());
+ if (bp && bp->hasFileAndLine())
+ emit gotoSourcePosition(bp->fileName(), bp->lineNum()-1);
+
+ // put the focus back on the clicked item if appropriate
+ if (col == Location || col == Condition || col == IgnoreCount)
+ m_table->editCell(row, col, false);
+ }
+ }
+}
+
+void GDBBreakpointWidget::slotContextMenuShow( int row, int /*col*/, const QPoint &mousePos )
+{
+ BreakpointTableRow *btr = (BreakpointTableRow *)m_table->item(row, Control );
+
+ if (btr == NULL)
+ {
+ btr = (BreakpointTableRow *)m_table->item(m_table->currentRow(),
+ Control );
+ }
+
+ if (btr != NULL)
+ {
+ m_ctxMenu->setItemEnabled(
+ BW_ITEM_Show,
+ btr->breakpoint()->hasFileAndLine());
+
+ if (btr->breakpoint( )->isEnabled( ))
+ {
+ m_ctxMenu->changeItem( BW_ITEM_Disable, i18n("Disable") );
+ }
+ else
+ {
+ m_ctxMenu->changeItem( BW_ITEM_Disable, i18n("Enable") );
+ }
+
+ m_ctxMenu->setItemEnabled(BW_ITEM_Disable, true);
+ m_ctxMenu->setItemEnabled(BW_ITEM_Delete, true);
+ m_ctxMenu->setItemEnabled(BW_ITEM_Edit, true);
+ }
+ else
+ {
+ m_ctxMenu->setItemEnabled(BW_ITEM_Show, false);
+ m_ctxMenu->setItemEnabled(BW_ITEM_Disable, false);
+ m_ctxMenu->setItemEnabled(BW_ITEM_Delete, false);
+ m_ctxMenu->setItemEnabled(BW_ITEM_Edit, false);
+ }
+
+ bool has_bps = (m_table->numRows() != 0);
+ m_ctxMenu->setItemEnabled(BW_ITEM_DisableAll, has_bps);
+ m_ctxMenu->setItemEnabled(BW_ITEM_EnableAll, has_bps);
+ m_ctxMenu->setItemEnabled(BW_ITEM_Delete, has_bps);
+
+ m_ctxMenu->popup( mousePos );
+}
+
+void GDBBreakpointWidget::slotContextMenuSelect( int item )
+{
+ int row, col;
+ BreakpointTableRow *btr;
+ Breakpoint *bp;
+ FilePosBreakpoint *fbp;
+
+ row= m_table->currentRow( );
+ if (row == -1)
+ return;
+ btr = (BreakpointTableRow *)m_table->item( row, Control );
+ if (btr == NULL)
+ return;
+ bp = btr->breakpoint( );
+ if (bp == NULL)
+ return;
+ fbp = dynamic_cast<FilePosBreakpoint*>(bp);
+
+ switch( item )
+ {
+ case BW_ITEM_Show:
+ if (fbp)
+ emit gotoSourcePosition(fbp->fileName(), fbp->lineNum()-1);
+ break;
+ case BW_ITEM_Edit:
+ col = m_table->currentColumn( );
+ if (col == Location || col == Condition || col == IgnoreCount)
+ m_table->editCell(row, col, false);
+ break;
+ case BW_ITEM_Disable:
+
+ bp->setEnabled( !bp->isEnabled( ) );
+ btr->setRow( );
+ sendToGdb( *bp );
+ break;
+ case BW_ITEM_Delete:
+ slotRemoveBreakpoint( );
+ break;
+ case BW_ITEM_DeleteAll:
+ slotRemoveAllBreakpoints();
+ break;
+ case BW_ITEM_DisableAll:
+ case BW_ITEM_EnableAll:
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *)
+ m_table->item(row, Control);
+
+ if (btr)
+ {
+ btr->breakpoint()->setEnabled(item == BW_ITEM_EnableAll);
+ btr->setRow();
+ sendToGdb(*btr->breakpoint());
+ }
+ }
+ break;
+ default:
+ // oops, check it out! this case is not in sync with the
+ // m_ctxMenu. Check the enum in the header file.
+ return;
+ }
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotEditRow(int row, int col, const QPoint &)
+{
+// kdDebug(9012) << "in slotEditRow row=" << row << endl;
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ if (col == Location || col == Condition || col == IgnoreCount)
+ m_table->editCell(row, col, false);
+ }
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotNewValue(int row, int col)
+{
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+
+ QString new_value = m_table->text(row, col);
+
+ if (btr)
+ {
+ Breakpoint* bp = btr->breakpoint();
+ switch (col)
+ {
+ case Enable:
+ {
+ QCheckTableItem *item =
+ (QCheckTableItem*)m_table->item ( row, Enable );
+ bp->setEnabled(item->isChecked());
+ }
+ break;
+
+ case Location:
+ {
+ if (bp->location() != new_value)
+ {
+ // GDB does not allow to change location of
+ // an existing breakpoint. So, need to remove old
+ // breakpoint and add another.
+
+ // Announce to editor that breakpoit at its
+ // current location is dying.
+ bp->setActionDie();
+ emit publishBPState(*bp);
+
+ // However, we don't want the line in breakpoint
+ // widget to disappear and appear again.
+
+ // Emit delete command. This won't resync breakpoint
+ // table (unlike clearBreakpoint), so we won't have
+ // nasty effect where line in the table first disappears
+ // and then appears again, and won't have internal issues
+ // as well.
+ if (!controller_->stateIsOn(s_dbgNotStarted))
+ controller_->addCommand(bp->dbgRemoveCommand().latin1());
+
+ // Now add new breakpoint in gdb. It will correspond to
+ // the same 'Breakpoint' and 'BreakpointRow' objects in
+ // KDevelop is the previous, deleted, breakpoint.
+
+ // Note: clears 'actionDie' implicitly.
+ bp->setActionAdd(true);
+ bp->setLocation(new_value);
+ }
+ break;
+ }
+
+ case Condition:
+ {
+ bp->setConditional(new_value);
+ break;
+ }
+
+ case IgnoreCount:
+ {
+ bp->setIgnoreCount(new_value.toInt());
+ break;
+ }
+ default:
+ break;
+ }
+
+ bp->setActionModify(true);
+
+
+ // This is not needed for most changes, since we've
+ // just read a value from table cell to breakpoint, and
+ // setRow will write back the same value to the cell.
+ // It's only really needed for tracing column changes,
+ // where tracing config dialog directly changes breakpoint,
+ // so we need to send those changes to the table.
+ btr->setRow();
+
+
+ sendToGdb(*bp);
+ }
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotEditBreakpoint(const QString &fileName, int lineNum)
+{
+ FilePosBreakpoint *fpBP = new FilePosBreakpoint(fileName, lineNum+1);
+
+ BreakpointTableRow* btr = find(fpBP);
+ delete fpBP;
+
+ if (btr)
+ {
+ QTableSelection ts;
+ ts.init(btr->row(), 0);
+ ts.expandTo(btr->row(), numCols);
+ m_table->addSelection(ts);
+ m_table->editCell(btr->row(), Location, false);
+ }
+
+}
+
+void GDBBreakpointWidget::sendToGdb(Breakpoint& BP)
+{
+ // Announce the change in state. We need to do this before
+ // everything. For example, if debugger is not yet running, we'll
+ // immediate exit after setting pending flag, but we still want changes
+ // in "enabled" flag to be shown on the left border of the editor.
+ emit publishBPState(BP);
+
+ BP.sendToGdb(controller_);
+}
+
+void GDBBreakpointWidget::slotBreakpointModified(Breakpoint* b)
+{
+ emit publishBPState(*b);
+
+ if (BreakpointTableRow* btr = find(b))
+ {
+ if (b->isActionDie())
+ {
+ // Breakpoint was deleted, kill the table row.
+ m_table->removeRow(btr->row());
+ }
+ else
+ {
+ btr->setRow();
+ }
+ }
+}
+
+void GDBBreakpointWidget::slotEvent(GDBController::event_t e)
+{
+ switch(e)
+ {
+ case GDBController::program_state_changed:
+ {
+ controller_->addCommand(
+ new GDBCommand("-break-list",
+ this,
+ &GDBBreakpointWidget::handleBreakpointList));
+ break;
+ }
+
+ case GDBController::shared_library_loaded:
+ case GDBController::connected_to_program:
+ {
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *)
+ m_table->item(row, Control);
+
+ if (btr)
+ {
+ Breakpoint* bp = btr->breakpoint();
+ if ( (bp->dbgId() == -1 || bp->isPending())
+ && !bp->isDbgProcessing()
+ && bp->isValid())
+ {
+ sendToGdb(*bp);
+ }
+ }
+ }
+ break;
+ }
+ case GDBController::program_exited:
+ {
+ for(int row = 0; row < m_table->numRows(); ++row)
+ {
+ Breakpoint* b = static_cast<BreakpointTableRow*>(
+ m_table->item(row, Control))->breakpoint();
+
+ b->applicationExited(controller_);
+ }
+ }
+
+ default:
+ ;
+ }
+}
+
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::slotEditBreakpoint()
+{
+ m_table->editCell(m_table->currentRow(), Location, false);
+}
+
+
+void GDBBreakpointWidget::editTracing(QTableItem* item)
+{
+ BreakpointTableRow* btr = (BreakpointTableRow *)
+ m_table->item(item->row(), Control);
+
+ DebuggerTracingDialog* d = new DebuggerTracingDialog(
+ btr->breakpoint(), m_table, "");
+
+ int r = d->exec();
+
+ // Note: change cell text here and explicitly call slotNewValue here.
+ // We want this signal to be emitted when we close the tracing dialog
+ // and not when we select some other cell, as happens in Qt by default.
+ if (r == QDialog::Accepted)
+ {
+ // The dialog has modified "btr->breakpoint()" already.
+ // Calling 'slotNewValue' will flush the changes back
+ // to the table.
+ slotNewValue(item->row(), item->col());
+ }
+
+ delete d;
+}
+
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::savePartialProjectSession(QDomElement* el)
+{
+ QDomDocument domDoc = el->ownerDocument();
+ if (domDoc.isNull())
+ return;
+
+ QDomElement breakpointListEl = domDoc.createElement("breakpointList");
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr =
+ (BreakpointTableRow *) m_table->item(row, Control);
+ Breakpoint* bp = btr->breakpoint();
+
+ QDomElement breakpointEl =
+ domDoc.createElement("breakpoint"+QString::number(row));
+
+ breakpointEl.setAttribute("type", bp->type());
+ breakpointEl.setAttribute("location", bp->location(false));
+ breakpointEl.setAttribute("enabled", bp->isEnabled());
+ breakpointEl.setAttribute("condition", bp->conditional());
+ breakpointEl.setAttribute("tracingEnabled",
+ QString::number(bp->tracingEnabled()));
+ breakpointEl.setAttribute("traceFormatStringEnabled",
+ QString::number(bp->traceFormatStringEnabled()));
+ breakpointEl.setAttribute("tracingFormatString",
+ bp->traceFormatString());
+
+ QDomElement tracedExpressions =
+ domDoc.createElement("tracedExpressions");
+
+ QStringList::const_iterator i, e;
+ for(i = bp->tracedExpressions().begin(),
+ e = bp->tracedExpressions().end();
+ i != e; ++i)
+ {
+ QDomElement expr = domDoc.createElement("expression");
+ expr.setAttribute("value", *i);
+ tracedExpressions.appendChild(expr);
+ }
+
+ breakpointEl.appendChild(tracedExpressions);
+
+ breakpointListEl.appendChild(breakpointEl);
+ }
+
+ if (!breakpointListEl.isNull())
+ el->appendChild(breakpointListEl);
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::restorePartialProjectSession(const QDomElement* el)
+{
+ /** Eventually, would be best to make each breakpoint type handle loading/
+ saving it's data. The only problem is that on load, we need to allocate
+ with new different objects, depending on type, and that requires some
+ kind of global registry. Gotta find out if a solution for that exists in
+ KDE (Boost.Serialization is too much dependency, and rolling my own is
+ boring).
+ */
+ QDomElement breakpointListEl = el->namedItem("breakpointList").toElement();
+ if (!breakpointListEl.isNull())
+ {
+ QDomElement breakpointEl;
+ for (breakpointEl = breakpointListEl.firstChild().toElement();
+ !breakpointEl.isNull();
+ breakpointEl = breakpointEl.nextSibling().toElement())
+ {
+ Breakpoint* bp=0;
+ BP_TYPES type = (BP_TYPES) breakpointEl.attribute( "type", "0").toInt();
+ switch (type)
+ {
+ case BP_TYPE_FilePos:
+ {
+ bp = new FilePosBreakpoint();
+ break;
+ }
+ case BP_TYPE_Watchpoint:
+ {
+ bp = new Watchpoint("");
+ break;
+ }
+ default:
+ break;
+ }
+
+ // Common settings for any type of breakpoint
+ if (bp)
+ {
+ bp->setLocation(breakpointEl.attribute( "location", ""));
+ if (type == BP_TYPE_Watchpoint)
+ {
+ bp->setEnabled(false);
+ }
+ else
+ {
+ bp->setEnabled(
+ breakpointEl.attribute( "enabled", "1").toInt());
+ }
+ bp->setConditional(breakpointEl.attribute( "condition", ""));
+
+ bp->setTracingEnabled(
+ breakpointEl.attribute("tracingEnabled", "0").toInt());
+ bp->setTraceFormatString(
+ breakpointEl.attribute("tracingFormatString", ""));
+ bp->setTraceFormatStringEnabled(
+ breakpointEl.attribute("traceFormatStringEnabled", "0")
+ .toInt());
+
+ QDomNode tracedExpr =
+ breakpointEl.namedItem("tracedExpressions");
+
+ if (!tracedExpr.isNull())
+ {
+ QStringList l;
+
+ for(QDomNode c = tracedExpr.firstChild(); !c.isNull();
+ c = c.nextSibling())
+ {
+ QDomElement el = c.toElement();
+ l.push_back(el.attribute("value", ""));
+ }
+ bp->setTracedExpressions(l);
+ }
+
+ // Now add the breakpoint. Don't try to check if
+ // breakpoint already exists.
+ // It's easy to check that breakpoint on the same
+ // line already exists, but it might have different condition,
+ // and checking conditions for equality is too complex thing.
+ // And anyway, it's will be suprising of realoading a project
+ // changes the set of breakpoints.
+ addBreakpoint(bp);
+ }
+ }
+ }
+}
+
+/***************************************************************************/
+
+void GDBBreakpointWidget::focusInEvent( QFocusEvent */* e*/ )
+{
+ // Without the following 'if', when we first open the breakpoints
+ // widget, the background is all black. This happens only with
+ // m_table->setFocusStyle(QTable::FollowStyle);
+ // in constructor, so I suspect Qt bug. But anyway, without
+ // current cell keyboard actions like Enter for edit won't work,
+ // so keyboard focus does not makes much sense.
+ if (m_table->currentRow() == -1 ||
+ m_table->currentColumn() == -1)
+ {
+ m_table->setCurrentCell(0, 0);
+ }
+ m_table->setFocus();
+}
+
+ComplexEditCell::
+ComplexEditCell(QTable* table)
+: QTableItem(table, QTableItem::WhenCurrent)
+{
+}
+
+
+QWidget* ComplexEditCell::createEditor() const
+{
+ QHBox* box = new QHBox( table()->viewport() );
+ box->setPaletteBackgroundColor(
+ table()->palette().active().highlight());
+
+ label_ = new QLabel(text(), box, "label");
+ label_->setBackgroundMode(Qt::PaletteHighlight);
+ // Sorry for hardcode, but '2' is already hardcoded in
+ // Qt source, in QTableItem::paint. Since I don't want the
+ // text to jump 2 pixels to the right when editor is activated,
+ // need to set the same indent for label.
+ label_->setIndent(2);
+ QPalette p = label_->palette();
+
+ p.setColor(QPalette::Active, QColorGroup::Foreground,
+ table()->palette().active().highlightedText());
+ p.setColor(QPalette::Inactive, QColorGroup::Foreground,
+ table()->palette().active().highlightedText());
+
+ label_->setPalette(p);
+
+ QPushButton* b = new QPushButton("...", box);
+ // This is exactly what is done in QDesigner source in the
+ // similar context. Haven't had any success making the good look
+ // with layout, I suppose that sizeHint for button is always larger
+ // than 20.
+ b->setFixedWidth( 20 );
+
+ connect(b, SIGNAL(clicked()), this, SLOT(slotEdit()));
+
+ return box;
+}
+
+void ComplexEditCell::updateValue()
+{
+ if (!label_.isNull())
+ {
+ label_->setText(table()->text(row(), col()));
+ }
+}
+
+void ComplexEditCell::slotEdit()
+{
+ emit edit(this);
+}
+
+}
+
+
+#include "gdbbreakpointwidget.moc"
diff --git a/languages/cpp/debugger/gdbbreakpointwidget.h b/languages/cpp/debugger/gdbbreakpointwidget.h
new file mode 100644
index 00000000..91dc40a5
--- /dev/null
+++ b/languages/cpp/debugger/gdbbreakpointwidget.h
@@ -0,0 +1,174 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _GDBBreakpointWidget_H_
+#define _GDBBreakpointWidget_H_
+
+#include <qhbox.h>
+#include <qpopupmenu.h>
+#include <qtable.h>
+#include <qguardedptr.h>
+#include <qvaluevector.h>
+
+#include "mi/gdbmi.h"
+#include "gdbcontroller.h"
+
+class QDomElement;
+class QToolButton;
+class QLabel;
+class KURL;
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace GDBDebugger
+{
+class Breakpoint;
+class BreakpointTableRow;
+class GDBTable;
+class GDBController;
+
+class GDBBreakpointWidget : public QHBox
+{
+ Q_OBJECT
+
+public:
+ GDBBreakpointWidget( GDBController* controller,
+ QWidget* parent=0, const char* name=0 );
+ virtual ~GDBBreakpointWidget();
+
+ void reset();
+
+ void savePartialProjectSession(QDomElement* el);
+ void restorePartialProjectSession(const QDomElement* el);
+
+ bool hasWatchpointForAddress(unsigned long long address) const;
+
+
+public slots:
+ // Connected to from the editor widget:
+ void slotToggleBreakpoint(const QString &filename, int lineNum);
+ void slotToggleBreakpointEnabled(const QString &fileName, int lineNum);
+
+ // Connected to from the variable widget:
+ void slotToggleWatchpoint(const QString &varName);
+
+ void slotBreakpointSet(Breakpoint*);
+
+ void slotRefreshBP(const KURL &filename);
+
+ void slotBreakpointHit(int id);
+
+
+protected:
+ virtual void focusInEvent(QFocusEvent *e);
+
+
+ friend class BreakpointActionCell; // for access to slotNewValue
+private slots:
+ void slotRemoveBreakpoint();
+ void slotRemoveAllBreakpoints();
+ void slotEditBreakpoint(const QString &fileName, int lineNum);
+ void slotEditBreakpoint();
+ void slotAddBlankBreakpoint(int idx);
+ void slotRowDoubleClicked(int row, int col, int button, const QPoint & mousePos);
+ void slotContextMenuShow( int row, int col, const QPoint &mousePos );
+ void slotContextMenuSelect( int item );
+ void slotEditRow(int row, int col, const QPoint & mousePos);
+ void slotNewValue(int row, int col);
+ void editTracing(QTableItem* item);
+ void slotBreakpointModified(Breakpoint*);
+
+ void slotEvent(GDBController::event_t);
+ void slotWatchpointHit(int id,
+ const QString& oldValue,
+ const QString& newValue);
+
+signals:
+ void publishBPState(const Breakpoint& brkpt);
+ void refreshBPState(const Breakpoint& brkpt);
+ void gotoSourcePosition(const QString &fileName, int lineNum);
+ // Emitted when output from yet another passed tracepoint is available.
+ void tracingOutput(const char*);
+
+private:
+ BreakpointTableRow* find(Breakpoint *bp);
+ BreakpointTableRow* findId(int id);
+ BreakpointTableRow* findKey(int BPKey);
+
+ void setActive();
+ BreakpointTableRow* addBreakpoint(Breakpoint *bp);
+ void removeBreakpoint(BreakpointTableRow* btr);
+
+ void sendToGdb(Breakpoint &);
+
+ void handleBreakpointList(const GDBMI::ResultRecord&);
+ void handleTracingPrintf(const QValueVector<QString>& s);
+
+private:
+ GDBController* controller_;
+
+ GDBTable* m_table;
+ QPopupMenu* m_ctxMenu;
+};
+
+class BreakpointTableRow;
+
+/** Custom table cell class for cells that require complex editing.
+ When current, the cell shows a "..." on the right. When clicked,
+ the 'edit' signal is emitted that can be be used to pop-up
+ a dialog box.
+
+ When editing is done, the receiver of 'edit' should change the
+ value in the table, and then call the 'updateValue' method.
+ */
+class ComplexEditCell : public QObject, public QTableItem
+{
+ Q_OBJECT
+public:
+
+ ComplexEditCell(QTable* table);
+
+ /** Called by Qt when the current cell should become editable.
+ In our case, when the item becomes current. Creates a widget
+ that will be shown in the cell and should be able to edit cell
+ content. In our case -- text plus "..." button that invokes
+ action dialog.
+ */
+ QWidget* createEditor() const;
+
+ void updateValue();
+
+private slots:
+
+ /** Called when the "..." button is clicked. */
+ void slotEdit();
+
+signals:
+ void edit(QTableItem*);
+
+private:
+ mutable QGuardedPtr<QLabel> label_;
+};
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/gdbcommand.cpp b/languages/cpp/debugger/gdbcommand.cpp
new file mode 100644
index 00000000..de5aeb9d
--- /dev/null
+++ b/languages/cpp/debugger/gdbcommand.cpp
@@ -0,0 +1,142 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "gdbcommand.h"
+#include "breakpoint.h"
+#include "variablewidget.h"
+
+namespace GDBDebugger
+{
+
+GDBCommand::GDBCommand(const QString &command)
+: command_(command), run(false), handler_this(0)
+{
+}
+
+QString GDBCommand::cmdToSend()
+{
+ return initialString() + "\n";
+}
+
+QString GDBCommand::initialString() const
+{
+ return command_;
+}
+
+bool GDBCommand::isUserCommand() const
+{
+ return false;
+}
+
+bool
+GDBCommand::invokeHandler(const GDBMI::ResultRecord& r)
+{
+ if (handler_this) {
+ (handler_this->*handler_method)(r);
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+
+void GDBCommand::newOutput(const QString& line)
+{
+ lines.push_back(line);
+}
+
+const QValueVector<QString>& GDBCommand::allStreamOutput() const
+{
+ return lines;
+}
+
+bool GDBCommand::handlesError() const
+{
+ return handlesError_;
+}
+
+GDBCommand::~GDBCommand()
+{
+}
+
+bool GDBCommand::isRun() const
+{
+ return run;
+}
+
+void GDBCommand::setRun(bool run)
+{
+ this->run = run;
+}
+
+
+UserCommand::UserCommand(const QString& s)
+: GDBCommand(s)
+{
+}
+
+bool UserCommand::isUserCommand() const
+{
+ return true;
+}
+
+
+ModifyBreakpointCommand::ModifyBreakpointCommand(
+ const QString& command, const Breakpoint* bp)
+: GDBCommand(command.local8Bit()),
+ bp_(bp)
+{}
+
+QString
+ModifyBreakpointCommand::cmdToSend()
+{
+ if (bp_->dbgId() > 0)
+ {
+ QString s(initialString());
+ s = s.arg(bp_->dbgId()) + "\n";
+ return s.local8Bit();
+ }
+ else
+ {
+ // The ID can be -1 either if breakpoint set command
+ // failed, or if breakpoint is somehow already deleted.
+ // In either case, should not do anything.
+ return "";
+ }
+}
+
+
+bool CliCommand::invokeHandler(const GDBMI::ResultRecord& r)
+{
+ // On error, do nothing.
+ if (r.reason != "done")
+ return true;
+
+ if (cli_handler_this) {
+ (cli_handler_this->*cli_handler_method)(allStreamOutput());
+ return true;
+ }
+ else {
+ return false;
+ }
+
+}
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
diff --git a/languages/cpp/debugger/gdbcommand.h b/languages/cpp/debugger/gdbcommand.h
new file mode 100644
index 00000000..8c928394
--- /dev/null
+++ b/languages/cpp/debugger/gdbcommand.h
@@ -0,0 +1,271 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _GDBCOMMAND_H_
+#define _GDBCOMMAND_H_
+
+#include <qobject.h>
+#include <qstring.h>
+#include <qvaluevector.h>
+
+#include "mi/gdbmi.h"
+#include <qguardedptr.h>
+
+namespace GDBDebugger
+{
+
+
+class Breakpoint;
+class VarItem;
+class ValueCallback;
+
+/**
+ * @author John Birch
+ */
+
+class GDBCommand
+{
+public:
+ GDBCommand(const QString& command);
+
+ template<class Handler>
+ GDBCommand(const QString& command,
+ Handler* handler_this,
+ void (Handler::* handler_method)(const GDBMI::ResultRecord&),
+ bool handlesError = false);
+
+ /* The command that should be sent to gdb.
+ This method is virtual so the command can compute this
+ dynamically, possibly using results of the previous
+ commands.
+ If the empty string is returned, nothing is sent. */
+ virtual QString cmdToSend();
+
+ /* Returns the initial string that was specified in
+ ctor invocation. The actual command will be
+ determined by cmdToSend above and the return
+ value of this method is only used in various
+ diagnostic messages emitted before actually
+ sending the command. */
+ QString initialString() const;
+
+ /* Returns true if this is command entered by the user
+ and so should be always shown in the gdb output window. */
+ virtual bool isUserCommand() const;
+
+ // If there's a handler for this command, invokes it and returns true.
+ // Otherwise, returns false.
+ virtual bool invokeHandler(const GDBMI::ResultRecord& r);
+
+ // Returns 'true' if 'invokeHandler' should be invoked even
+ // on MI errors.
+ bool handlesError() const;
+
+ virtual ~GDBCommand();
+
+ // Called by gdbcontroller for each new output string
+ // gdb emits for this command. In MI mode, this includes
+ // all "stream" messages, but does not include MI responses.
+ void newOutput(const QString&);
+
+ const QValueVector<QString>& allStreamOutput() const;
+
+ // True if this command run then target for
+ // unspecified period of time -- that is either 'run' or
+ // 'continue'.
+ bool isRun() const;
+
+ void setRun(bool run);
+
+private:
+ QString command_;
+ QGuardedPtr<QObject> handler_this;
+ typedef void (QObject::* handler_t)(const GDBMI::ResultRecord&);
+ handler_t handler_method;
+ QValueVector<QString> lines;
+ bool run;
+
+protected: // FIXME: should be private, after I kill the first ctor
+ // that is obsolete and no longer necessary.
+ bool handlesError_;
+
+};
+
+class UserCommand : public GDBCommand
+{
+public:
+ UserCommand(const QString& s);
+
+ bool isUserCommand() const;
+};
+
+/** This command is used to change some property of breakpoint.
+ It holds a pointer to a Breakpoint object and will substitute
+ breakpoint id into the command string.
+
+ So, the command can be issued before the breakpoint id is know. That
+ is, it's possible to queue add + modify pair. The add command will
+ set breakpoint id and modify command will use it.
+*/
+class ModifyBreakpointCommand : public GDBCommand
+{
+public:
+ /** The 'comamnd' should include a single format specifier "%1" that
+ will be replaced with the id of breakpoint.
+ */
+ ModifyBreakpointCommand(const QString& command, const Breakpoint* bp);
+
+public: // DbgCommand overrides
+ virtual QString cmdToSend();
+
+private:
+ const Breakpoint* bp_;
+};
+
+/** This is a class for raw CLI commands. Instead of invoking
+ user provided hook with MI response, it invokes the a hook
+ with lists of strings.
+*/
+class CliCommand : public GDBCommand
+{
+public:
+ template<class Handler>
+ CliCommand(const QString& command,
+ Handler* handler_this,
+ void (Handler::* handler_method)(const QValueVector<QString>&),
+ bool handlesError = false);
+
+
+
+public: // GDBCommand overrides
+ bool invokeHandler(const GDBMI::ResultRecord& r);
+
+private:
+ QGuardedPtr<QObject> cli_handler_this;
+ typedef void (QObject::* cli_handler_t)(const QValueVector<QString>&);
+ cli_handler_t cli_handler_method;
+};
+
+/** Command that does nothing and can be just used to invoke
+ a user provided handler when all preceeding commands are
+ executed.
+*/
+class SentinelCommand : public GDBCommand
+{
+public:
+ typedef void (QObject::*handler_method_t)();
+
+ template<class Handler>
+ SentinelCommand(Handler* handler_this,
+ void (Handler::* handler_method)())
+ : GDBCommand(""),
+ handler_this(handler_this),
+ handler_method(static_cast<handler_method_t>(handler_method))
+ {}
+
+ void invokeHandler()
+ {
+ (handler_this->*handler_method)();
+ }
+
+ QString cmdToSend()
+ {
+ return "";
+ }
+
+private:
+ QGuardedPtr<QObject> handler_this;
+ handler_method_t handler_method;
+
+};
+
+/* Command for which we don't want any reply. */
+class ResultlessCommand : public QObject, public GDBCommand
+{
+public:
+ ResultlessCommand(const QString& command, bool handlesError = false)
+ : GDBCommand(command, this, &ResultlessCommand::handle, handlesError)
+ {}
+
+private:
+ void handle(const GDBMI::ResultRecord&)
+ {}
+};
+
+class ExpressionValueCommand : public QObject, public GDBCommand
+{
+public:
+ typedef void (QObject::*handler_method_t)(const QString&);
+
+ template<class Handler>
+ ExpressionValueCommand(
+ const QString& expression,
+ Handler* handler_this,
+ void (Handler::* handler_method)(const QString&))
+ : GDBCommand(("-data-evaluate-expression " + expression).ascii(), this,
+ &ExpressionValueCommand::handleResponse),
+ handler_this(handler_this),
+ handler_method(static_cast<handler_method_t>(handler_method))
+ {}
+
+ void handleResponse(const GDBMI::ResultRecord& r)
+ {
+ (handler_this->*handler_method)(r["value"].literal());
+ }
+
+private:
+ QGuardedPtr<QObject> handler_this;
+ handler_method_t handler_method;
+};
+
+
+
+template<class Handler>
+GDBCommand::GDBCommand(
+ const QString& command,
+ Handler* handler_this,
+ void (Handler::* handler_method)(const GDBMI::ResultRecord&),
+ bool handlesError)
+: command_(command),
+ handler_this(handler_this),
+ handler_method(static_cast<handler_t>(handler_method)),
+ run(false),
+ handlesError_(handlesError)
+{
+}
+
+template<class Handler>
+CliCommand::CliCommand(
+ const QString& command,
+ Handler* handler_this,
+ void (Handler::* handler_method)(const QValueVector<QString>&),
+ bool handlesError)
+: GDBCommand(command.latin1()),
+ cli_handler_this(handler_this),
+ cli_handler_method(static_cast<cli_handler_t>(handler_method))
+{
+ handlesError_ = handlesError;
+}
+
+
+
+
+}
+
+
+
+
+
+#endif
diff --git a/languages/cpp/debugger/gdbcontroller.cpp b/languages/cpp/debugger/gdbcontroller.cpp
new file mode 100644
index 00000000..05954069
--- /dev/null
+++ b/languages/cpp/debugger/gdbcontroller.cpp
@@ -0,0 +1,1860 @@
+// *************************************************************************
+// gdbcontroller.cpp - description
+// -------------------
+// begin : Sun Aug 8 1999
+// copyright : (C) 1999 by John Birch
+// email : jbb@kdevelop.org
+// **************************************************************************
+//
+// **************************************************************************
+// * *
+// * 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. *
+// * *
+// **************************************************************************
+
+#include "gdbcontroller.h"
+
+#include "breakpoint.h"
+#include "gdbcommand.h"
+#include "stty.h"
+#include "domutil.h"
+#include "settings.h"
+#include "mi/miparser.h"
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kwin.h>
+
+#include <qdatetime.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qdir.h>
+#include <qvaluevector.h>
+#include <qeventloop.h>
+
+#include <iostream>
+#include <ctype.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <typeinfo>
+using namespace std;
+
+// **************************************************************************
+//
+// Does all the communication between gdb and the kdevelop's debugger code.
+// Significatant classes being used here are
+//
+// GDBParser - parses the "variable" data using the vartree and varitems
+// VarTree - where the variable data will end up
+// FrameStack - tracks the program frames and allows the user to switch between
+// and therefore view the calling funtions and their data
+// Breakpoint - Where and what to do with breakpoints.
+// STTY - the tty that the _application_ will run on.
+//
+// Significant variables
+// state_ - be very careful setting this. The controller is totally
+// dependent on this reflecting the correct state. For instance,
+// if the app is busy but we don't think so, then we lose control
+// of the app. The only way to get out of these situations is to
+// delete (stop) the controller.
+// currentFrame_
+// - Holds the frame number where and locals/variable information will
+// go to
+//
+// Certain commands need to be "wrapped", so that the output gdb produces is
+// of the form "\032data_id gdb output \032data_id"
+// Then a very simple parse can extract this gdb output and hand it off
+// to its' respective parser.
+// To do this we set the prompt to be \032data_id before the command and then
+// reset to \032i to indicate the "idle".
+//
+// Note that the following does not work because in certain situations
+// gdb can get an error in performing the command and therefore will not
+// output the final echo. Hence the data will be thrown away.
+// (certain "info locals" will generate this error.
+//
+// queueCmd(new GDBCommand(QString().sprintf("define printlocal\n"
+// "echo \32%c\ninfo locals\necho \32%c\n"
+// "end",
+// LOCALS, LOCALS)));
+// (although replacing echo with "set prompt" appropriately could work Hmmmm.)
+//
+// Shared libraries and breakpoints
+// ================================
+// Shared libraries and breakpoints have a problem that has a reasonable solution.
+// The problem is that gdb will not accept breakpoints in source that is in a
+// shared library that has _not_ _yet_ been opened but will be opened via a
+// dlopen.
+//
+// The solution is to get gdb to tell us when a shared library has been opened.
+// This means that when the user sets a breakpoint, we flag this breakpoint as
+// pending, try to set the breakpoint and if gdb says it succeeded then flag it
+// as active. If gdb is not successful then we leave the breakpoint as pending.
+//
+// This is known as "lazy breakpoints"
+//
+// If the user has selected a file that is really outside the program and tried to
+// set a breakpoint then this breakpoint will always be pending. I can't do
+// anything about that, because it _might_ be in a shared library. If not they
+// are either fools or just misguided...
+//
+// Now that the breakpoint is pending, we need gdb to tell us when a shared
+// library has been loaded. We use "set stop-on 1". This breaks on _any_
+// library event, and we just try to set the pending breakpoints. Once we're
+// done, we then "continue"
+//
+// Now here's the problem with all this. If the user "step"s over code that
+// contains a library dlopen then it'll just keep running, because we receive a
+// break and hence end up doing a continue. In this situation, I do _not_
+// do a continue but leave it stopped with the status line reflecting the
+// stopped state. The frame stack is in the dl routine that caused the stop.
+//
+// There isn't any way around this, but I could allievate the problem somewhat
+// by only doing a "set stop-on 1" when we have pending breakpoints.
+//
+// **************************************************************************
+
+namespace GDBDebugger
+{
+
+// This is here so we can check for startup /shutdown problems
+int debug_controllerExists = false;
+
+
+GDBController::GDBController(QDomDocument &projectDom)
+ : DbgController(),
+ currentFrame_(0),
+ viewedThread_(-1),
+ holdingZone_(),
+ currentCmd_(0),
+ tty_(0),
+ badCore_(QString()),
+ state_(s_dbgNotStarted|s_appNotStarted),
+ programHasExited_(false),
+ dom(projectDom),
+ config_breakOnLoadingLibrary_(true),
+ config_forceBPSet_(true),
+ config_displayStaticMembers_(false),
+ config_asmDemangle_(true),
+ config_dbgTerminal_(false),
+ config_gdbPath_(),
+ config_outputRadix_(10),
+ state_reload_needed(false),
+ stateReloadInProgress_(false)
+{
+ configure();
+ cmdList_.setAutoDelete(true);
+
+ Q_ASSERT(! debug_controllerExists);
+ debug_controllerExists = true;
+}
+
+// **************************************************************************
+
+// Deleting the controller involves shutting down gdb nicely.
+// When were attached to a process, we must first detach so that the process
+// can continue running as it was before being attached. gdb is quite slow to
+// detach from a process, so we must process events within here to get a "clean"
+// shutdown.
+GDBController::~GDBController()
+{
+ debug_controllerExists = false;
+}
+
+// **************************************************************************
+
+void GDBController::configure()
+{
+ // A a configure.gdb script will prevent these from uncontrolled growth...
+ config_configGdbScript_ = DomUtil::readEntry(dom, "/kdevdebugger/general/configGdbScript").latin1();
+ config_runShellScript_ = DomUtil::readEntry(dom, "/kdevdebugger/general/runShellScript").latin1();
+ config_runGdbScript_ = DomUtil::readEntry(dom, "/kdevdebugger/general/runGdbScript").latin1();
+
+// add macros for reading QStrings? or in configGdbScript?
+ config_forceBPSet_ = DomUtil::readBoolEntry(dom, "/kdevdebugger/general/allowforcedbpset", true);
+ config_dbgTerminal_ = DomUtil::readBoolEntry(dom, "/kdevdebugger/general/separatetty", false);
+ config_gdbPath_ = DomUtil::readEntry(dom, "/kdevdebugger/general/gdbpath");
+
+ bool old_displayStatic = config_displayStaticMembers_;
+ config_displayStaticMembers_ = DomUtil::readBoolEntry(dom, "/kdevdebugger/display/staticmembers",false);
+
+ bool old_asmDemangle = config_asmDemangle_;
+ config_asmDemangle_ = DomUtil::readBoolEntry(dom, "/kdevdebugger/display/demanglenames",true);
+
+ bool old_breakOnLoadingLibrary_ = config_breakOnLoadingLibrary_;
+ config_breakOnLoadingLibrary_ = DomUtil::readBoolEntry(dom, "/kdevdebugger/general/breakonloadinglibs",true);
+
+ // FIXME: should move this into debugger part or variable widget.
+ int old_outputRadix = config_outputRadix_;
+#if 0
+ config_outputRadix_ = DomUtil::readIntEntry(dom, "/kdevdebugger/display/outputradix", 10);
+ varTree_->setRadix(config_outputRadix_);
+#endif
+
+
+ if (( old_displayStatic != config_displayStaticMembers_ ||
+ old_asmDemangle != config_asmDemangle_ ||
+ old_breakOnLoadingLibrary_ != config_breakOnLoadingLibrary_ ||
+ old_outputRadix != config_outputRadix_) &&
+ dbgProcess_)
+ {
+ bool restart = false;
+ if (stateIsOn(s_dbgBusy))
+ {
+ pauseApp();
+ restart = true;
+ }
+
+ if (old_displayStatic != config_displayStaticMembers_)
+ {
+ if (config_displayStaticMembers_)
+ queueCmd(new GDBCommand("set print static-members on"));
+ else
+ queueCmd(new GDBCommand("set print static-members off"));
+ }
+ if (old_asmDemangle != config_asmDemangle_)
+ {
+ if (config_asmDemangle_)
+ queueCmd(new GDBCommand("set print asm-demangle on"));
+ else
+ queueCmd(new GDBCommand("set print asm-demangle off"));
+ }
+
+ // Disabled for MI port.
+ if (old_outputRadix != config_outputRadix_)
+ {
+ queueCmd(new GDBCommand(QCString().sprintf("set output-radix %d",
+ config_outputRadix_)));
+
+ // FIXME: should do this in variable widget anyway.
+ // After changing output radix, need to refresh variables view.
+ raiseEvent(program_state_changed);
+
+ }
+
+ if (!config_configGdbScript_.isEmpty())
+ queueCmd(new GDBCommand("source " + config_configGdbScript_));
+
+ if (restart)
+ queueCmd(new GDBCommand("-exec-continue"));
+ }
+}
+
+// **************************************************************************
+
+void GDBController::addCommand(GDBCommand* cmd)
+{
+ queueCmd(cmd);
+}
+
+void GDBController::addCommand(const QString& str)
+{
+ queueCmd(new GDBCommand(str));
+}
+
+void GDBController::addCommandToFront(GDBCommand* cmd)
+{
+ queueCmd(cmd, queue_at_front);
+}
+
+void GDBController::addCommandBeforeRun(GDBCommand* cmd)
+{
+ queueCmd(cmd, queue_before_run);
+}
+
+int GDBController::currentThread() const
+{
+ return viewedThread_;
+}
+
+int GDBController::currentFrame() const
+{
+ return currentFrame_;
+}
+
+// Fairly obvious that we'll add whatever command you give me to a queue
+// If you tell me to, I'll put it at the head of the queue so it'll run ASAP
+// Not quite so obvious though is that if we are going to run again. then any
+// information requests become redundent and must be removed.
+// We also try and run whatever command happens to be at the head of
+// the queue.
+void GDBController::queueCmd(GDBCommand *cmd, enum queue_where queue_where)
+{
+ if (stateIsOn(s_dbgNotStarted))
+ {
+ KMessageBox::information(
+ 0,
+ i18n("<b>Gdb command sent when debugger is not running</b><br>"
+ "The command was:<br> %1").arg(cmd->initialString()),
+ i18n("Internal error"), "gdb_error");
+ return;
+ }
+
+ if (stateReloadInProgress_)
+ stateReloadingCommands_.insert(cmd);
+
+ if (queue_where == queue_at_front)
+ cmdList_.insert(0, cmd);
+ else if (queue_where == queue_at_end)
+ cmdList_.append (cmd);
+ else if (queue_where == queue_before_run)
+ {
+ unsigned i;
+ for (i = 0; i < cmdList_.count(); ++i)
+ if (cmdList_.at(i)->isRun())
+ break;
+
+ cmdList_.insert(i, cmd);
+ }
+
+ kdDebug(9012) << "QUEUE: " << cmd->initialString()
+ << (stateReloadInProgress_ ? " (state reloading)\n" : "\n");
+
+ setStateOn(s_dbgBusy);
+ emit dbgStatus("", state_);
+ raiseEvent(debugger_busy);
+
+ executeCmd();
+}
+
+// **************************************************************************
+
+// If the appliction can accept a command and we've got one waiting
+// then send it.
+// Commands can be just request for data (or change gdbs state in someway)
+// or they can be "run" commands. If a command is sent to gdb our internal
+// state will get updated.
+void GDBController::executeCmd()
+{
+ if (stateIsOn(s_dbgNotStarted|s_waitForWrite|s_shuttingDown) || !dbgProcess_)
+ {
+ return;
+ }
+
+ if (!currentCmd_)
+ {
+ if (cmdList_.isEmpty())
+ return;
+
+ currentCmd_ = cmdList_.take(0);
+ }
+ else
+ {
+ return;
+ }
+
+ QString commandText = currentCmd_->cmdToSend();
+ bool bad_command = false;
+ QString message;
+
+ unsigned length = commandText.length();
+ // No i18n for message since it's mainly for debugging.
+ if (length == 0)
+ {
+ // The command might decide it's no longer necessary to send
+ // it.
+ if (SentinelCommand* sc = dynamic_cast<SentinelCommand*>(currentCmd_))
+ {
+ kdDebug(9012) << "SEND: sentinel command, not sending\n";
+ sc->invokeHandler();
+ }
+ else
+ {
+ kdDebug(9012) << "SEND: command " << currentCmd_->initialString()
+ << " changed its mind, not sending\n";
+ }
+
+ destroyCurrentCommand();
+ executeCmd();
+ commandDone();
+ return;
+ }
+ else
+ {
+ if (commandText[length-1] != '\n')
+ {
+ bad_command = true;
+ message = "Debugger command does not end with newline";
+ }
+ }
+ if (bad_command)
+ {
+ KMessageBox::information(0, i18n("<b>Invalid debugger command</b><br>")
+ + message,
+ i18n("Invalid debugger command"), "gdb_error");
+ return;
+ }
+
+ kdDebug(9012) << "SEND: " << commandText;
+
+ dbgProcess_->writeStdin(commandText.local8Bit(),
+ commandText.length());
+ setStateOn(s_waitForWrite);
+
+ QString prettyCmd = currentCmd_->cmdToSend();
+ prettyCmd.replace( QRegExp("set prompt \032.\n"), "" );
+ prettyCmd = "(gdb) " + prettyCmd;
+
+ if (currentCmd_->isUserCommand())
+ emit gdbUserCommandStdout( prettyCmd.latin1() );
+ else
+ emit gdbInternalCommandStdout( prettyCmd.latin1() );
+
+ emit dbgStatus ("", state_);
+}
+
+// **************************************************************************
+
+void GDBController::destroyCmds()
+{
+ if (currentCmd_)
+ {
+ destroyCurrentCommand();
+ }
+
+ while (!cmdList_.isEmpty())
+ delete cmdList_.take(0);
+}
+
+// Pausing an app removes any pending run commands so that the app doesn't
+// start again. If we want to be silent then we remove any pending info
+// commands as well.
+void GDBController::pauseApp()
+{
+ setStateOn(s_explicitBreakInto);
+
+ /* FIXME: need to decide if we really
+ need this, and the consistenly mark
+ info commands as such.
+ int i = cmdList_.count();
+ while (i)
+ {
+ i--;
+ DbgCommand *cmd = cmdList_.at(i);
+ if (cmd->isAnInfoCmd())
+ delete cmdList_.take(i);
+ }
+ */
+
+ if (dbgProcess_)
+ dbgProcess_->kill(SIGINT);
+}
+
+void GDBController::actOnProgramPauseMI(const GDBMI::ResultRecord& r)
+{
+ // Is this stop on shared library load? Gdb smartly does not
+ // print any 'reason' field in this case.
+ bool shared_library_load = false;
+ if (currentCmd_)
+ {
+ const QValueVector<QString>& lines = currentCmd_->allStreamOutput();
+ for(unsigned int i = 0; i < lines.count(); ++i)
+ {
+ if (lines[i].startsWith("Stopped due to shared library event"))
+ {
+ shared_library_load = true;
+ break;
+ }
+ }
+ }
+
+ if (shared_library_load)
+ {
+ raiseEvent(shared_library_loaded);
+ queueCmd(new GDBCommand("-exec-continue"));
+ return;
+ }
+
+ if (!r.hasField("reason"))
+ {
+ // FIXME: throw an exception, and add the gdb reply in the
+ // caller. Show message box in the caller, not here.
+ // FIXME: remove this 'bla-bla-bla'.
+ KMessageBox::detailedSorry(
+ 0,
+ i18n("<b>Invalid gdb reply</b>"
+ "<p>The 'stopped' packet does not include the 'reason' field'."),
+ i18n("The gdb reply is: bla-bla-bla"),
+ i18n("Invalid gdb reply"));
+ return;
+ }
+
+ QString reason = r["reason"].literal();
+ if (reason == "exited-normally" || reason == "exited")
+ {
+ programNoApp("Exited normally", false);
+ programHasExited_ = true;
+ state_reload_needed = false;
+ return;
+ }
+
+ if (reason == "exited-signalled")
+ {
+ programNoApp(i18n("Exited on signal %1")
+ .arg(r["signal-name"].literal()), false);
+ // FIXME: figure out why this variable is needed.
+ programHasExited_ = true;
+ state_reload_needed = false;
+ return;
+ }
+
+ if (reason == "watchpoint-scope")
+ {
+ QString number = r["wpnum"].literal();
+
+ // FIXME: shuld remove this watchpoint
+ // But first, we should consider if removing all
+ // watchpoinst on program exit is the right thing to
+ // do.
+
+ queueCmd(new GDBCommand("-exec-continue"));
+
+ state_reload_needed = false;
+ return;
+ }
+
+ if (reason == "signal-received")
+ {
+ QString name = r["signal-name"].literal();
+ QString user_name = r["signal-meaning"].literal();
+
+ // SIGINT is a "break into running program".
+ // We do this when the user set/mod/clears a breakpoint but the
+ // application is running.
+ // And the user does this to stop the program also.
+ bool suppress_reporting = false;
+ if (name == "SIGINT" && stateIsOn(s_explicitBreakInto))
+ {
+ suppress_reporting = true;
+ // TODO: check that we do something reasonable on
+ // implicit break into program (for setting breakpoints,
+ // or whatever).
+
+ setStateOff(s_explicitBreakInto);
+ emit dbgStatus("Application interrupted", state_);
+ // Will show the source line in the code
+ // handling non-special stop kinds, below.
+ }
+
+ if (!suppress_reporting)
+ {
+ // Whenever we have a signal raised then tell the user, but don't
+ // end the program as we want to allow the user to look at why the
+ // program has a signal that's caused the prog to stop.
+ // Continuing from SIG FPE/SEGV will cause a "Cannot ..." and
+ // that'll end the program.
+ KMessageBox::information(0,
+ i18n("Program received signal %1 (%2)")
+ .arg(name).arg(user_name),
+ i18n("Received signal"));
+ }
+ }
+
+ if (reason == "breakpoint-hit")
+ {
+ int id = r["bkptno"].literal().toInt();
+ emit breakpointHit(id);
+ }
+
+
+}
+
+
+void GDBController::reloadProgramState()
+{
+ const GDBMI::ResultRecord& r = *last_stop_result;
+
+ // In gdb 6.3, the *stopped reply does not include full
+ // name of the source file. Need to send extra command.
+ // Don't send it unless there was 'line' field in last *stopped response.
+ // The command has a bug that makes it always returns some file/line,
+ // even if we're not in one.
+ //
+ // FIXME: For gdb 6.4, should not send extra commands.
+ // That's for later, so that I verify that this three-command
+ // approach works fine.
+ if (r.hasField("frame") && r["frame"].hasField("line"))
+ queueCmd(new GDBCommand(
+ "-file-list-exec-source-file",
+ this,
+ &GDBController::handleMiFileListExecSourceFile));
+ else
+ {
+ maybeAnnounceWatchpointHit();
+ }
+
+ emit dbgStatus ("", state_);
+
+ // We're always at frame zero when the program stops
+ // and we must reset the active flag
+ if (r.hasField("thread-id"))
+ viewedThread_ = r["thread-id"].literal().toInt();
+ else
+ viewedThread_ = -1;
+ currentFrame_ = 0;
+
+ raiseEvent(program_state_changed);
+ state_reload_needed = false;
+}
+
+
+// **************************************************************************
+
+// There is no app anymore. This can be caused by program exiting
+// an invalid program specified or ...
+// gdb is still running though, but only the run command (may) make sense
+// all other commands are disabled.
+void GDBController::programNoApp(const QString &msg, bool msgBox)
+{
+ setState(s_appNotStarted|s_programExited|(state_&s_shuttingDown));
+
+ destroyCmds();
+
+ // We're always at frame zero when the program stops
+ // and we must reset the active flag
+ viewedThread_ = -1;
+ currentFrame_ = 0;
+
+ // The application has existed, but it's possible that
+ // some of application output is still in the pipe. We use
+ // different pipes to communicate with gdb and to get application
+ // output, so "exited" message from gdb might have arrived before
+ // last application output. Get this last bit.
+
+ // Note: this method can be called when we open an invalid
+ // core file. In that case, tty_ won't be set.
+ if (tty_)
+ tty_->readRemaining();
+
+ // Tty is no longer usable, delete it. Without this, QSocketNotifier
+ // will continiously bomd STTY with signals, so we need to either disable
+ // QSocketNotifier, or delete STTY. The latter is simpler, since we can't
+ // reuse it for future debug sessions anyway.
+
+ delete tty_;
+ tty_ = 0;
+
+ raiseEvent(program_exited);
+
+ if (msgBox)
+ KMessageBox::information(0, i18n("gdb message:\n")+msg,"Warning", "gdb_error");
+
+ emit dbgStatus (msg, state_);
+ /* Also show message in gdb window, so that users who
+ prefer to look at gdb window know what's up. */
+ emit gdbUserCommandStdout(msg.ascii());
+}
+
+void GDBController::parseCliLine(const QString& line)
+{
+ if (line.startsWith("The program no longer exists")
+ || line.startsWith("Program exited")
+ || line.startsWith("Program terminated"))
+ {
+ programNoApp(line, false);
+ return;
+ }
+
+#if 0
+ if (strncmp(buf, "No symbol", 9) == 0 || // watch point failed
+ strncmp(buf, "Single", 6) == 0 || // Single stepping
+ strncmp(buf, "No source file named", 20) == 0 || // breakpoint not set
+ strncmp(buf, "[Switching to Thread", 20) == 0 || //
+ strncmp(buf, "[Thread debugging using", 23) == 0 ||
+ strncmp(buf, "Current language:", 17) == 0 ||
+ strncmp(buf, "Error while mapping shared library sections:", 44) == 0 ||
+ strncmp(buf, "Error while reading shared library symbols:", 43) == 0 ||
+ *buf == ':' )
+ {
+ // We don't change state, because this falls out when a run command
+ // starts rather than when a run command stops.
+ // Or.... it falls out with other messages that _are_ handled.
+ return;
+ }
+#endif
+
+#if 0
+
+ /// @todo - Only do this at start up
+ if (
+ strstr(buf, "not in executable format:") ||
+ strstr(buf, "No such file or directory.") || // does this fall out?
+ strstr(buf, i18n("No such file or directory.").local8Bit())|| // from system via gdb
+ strstr(buf, "is not a core dump:") ||
+ strncmp(buf, "ptrace: No such process.", 24)==0 ||
+ strncmp(buf, "ptrace: Operation not permitted.", 32)==0 ||
+ strncmp(buf, "No executable file specified.", 29)==0)
+ {
+ programNoApp(QString(buf), true);
+ kdDebug(9012) << "Bad file <" << buf << ">" << endl;
+ return;
+ }
+#endif
+}
+
+void GDBController::handleMiFileListExecSourceFile(const GDBMI::ResultRecord& r)
+{
+ if (r.reason != "done")
+ {
+ return;
+
+ // FIXME: throw an exception here. Move reporting
+ // to the caller, who knows the gdb output.
+#if 0
+ KMessageBox::information(
+ 0,
+ i18n("Invalid gdb reply\n"
+ "Command was: %1\n"
+ "Response is: %2\n"
+ "Invalid response kind: \"%3\"")
+ .arg(currentCmd_->rawDbgCommand())
+ .arg(buf)
+ .arg(r.reason),
+ i18n("Invalid gdb reply"), "gdb_error");
+#endif
+ }
+
+ QString fullname = "";
+ if (r.hasField("fullname"))
+ fullname = r["fullname"].literal();
+
+ showStepInSource(fullname,
+ r["line"].literal().toInt(),
+ (*last_stop_result)["frame"]["addr"].literal());
+
+ /* Watchpoint hit is announced only after we've highlighted
+ the current line. */
+ maybeAnnounceWatchpointHit();
+
+ last_stop_result.reset();
+}
+
+void GDBController::maybeAnnounceWatchpointHit()
+{
+ /* For some cases, for example catchpoints,
+ gdb does not report any reason at all. */
+ if ((*last_stop_result).hasField("reason"))
+ {
+ QString last_stop_reason = (*last_stop_result)["reason"].literal();
+
+ if (last_stop_reason == "watchpoint-trigger")
+ {
+ emit watchpointHit((*last_stop_result)["wpt"]["number"]
+ .literal().toInt(),
+ (*last_stop_result)["value"]["old"].literal(),
+ (*last_stop_result)["value"]["new"].literal());
+ }
+ else if (last_stop_reason == "read-watchpoint-trigger")
+ {
+ emit dbgStatus ("Read watchpoint triggered", state_);
+ }
+ }
+}
+
+void GDBController::handleMiFrameSwitch(const GDBMI::ResultRecord& r)
+{
+ raiseEvent(thread_or_frame_changed);
+
+ const GDBMI::Value& frame = r["frame"];
+
+ QString file;
+ if (frame.hasField("fullname"))
+ file = frame["fullname"].literal();
+ else if (frame.hasField("file"))
+ file = frame["file"].literal();
+
+ int line = -1;
+ if (frame.hasField("line"))
+ line = frame["line"].literal().toInt();
+
+ showStepInSource(file,
+ line,
+ frame["addr"].literal());
+}
+
+// **************************************************************************
+// SLOTS
+// *****
+// For most of these slots data can only be sent to gdb when it
+// isn't busy and it is running.
+
+// **************************************************************************
+
+bool GDBController::start(const QString& shell, const DomUtil::PairList& run_envvars, const QString& run_directory, const QString &application, const QString& run_arguments)
+{
+ kdDebug(9012) << "Starting debugger controller\n";
+ badCore_ = QString();
+
+ Q_ASSERT (!dbgProcess_ && !tty_);
+
+ dbgProcess_ = new KProcess;
+
+ connect( dbgProcess_, SIGNAL(receivedStdout(KProcess *, char *, int)),
+ this, SLOT(slotDbgStdout(KProcess *, char *, int)) );
+
+ connect( dbgProcess_, SIGNAL(receivedStderr(KProcess *, char *, int)),
+ this, SLOT(slotDbgStderr(KProcess *, char *, int)) );
+
+ connect( dbgProcess_, SIGNAL(wroteStdin(KProcess *)),
+ this, SLOT(slotDbgWroteStdin(KProcess *)) );
+
+ connect( dbgProcess_, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotDbgProcessExited(KProcess*)) );
+
+ application_ = application;
+
+ QString gdb = "gdb";
+ // Prepend path to gdb, if needed. Using QDir,
+ // path can either end with slash, or not.
+ if (!config_gdbPath_.isEmpty())
+ {
+ gdb = config_gdbPath_;
+ }
+
+ if (!shell.isEmpty())
+ {
+ *dbgProcess_ << "/bin/sh" << "-c" << shell + " " + gdb +
+ + " " + application + " --interpreter=mi2 -quiet";
+ emit gdbUserCommandStdout(
+ QString( "/bin/sh -c " + shell + " " + gdb
+ + " " + application
+ + " --interpreter=mi2 -quiet\n" ).latin1());
+ }
+ else
+ {
+ *dbgProcess_ << gdb << application
+ << "-interpreter=mi2" << "-quiet";
+ emit gdbUserCommandStdout(
+ QString( gdb + " " + application +
+ " --interpreter=mi2 -quiet\n" ).latin1());
+ }
+
+ if (!dbgProcess_->start( KProcess::NotifyOnExit,
+ KProcess::Communication(KProcess::All)))
+ {
+ KMessageBox::information(
+ 0,
+ i18n("<b>Could not start debugger.</b>"
+ "<p>Could not run '%1'. "
+ "Make sure that the path name is specified correctly."
+ ).arg(dbgProcess_->args()[0]),
+ i18n("Could not start debugger"), "gdb_error");
+
+ return false;
+ }
+
+ setStateOff(s_dbgNotStarted);
+ emit dbgStatus ("", state_);
+
+ saw_gdb_prompt_ = false;
+
+ // Initialise gdb. At this stage gdb is sitting wondering what to do,
+ // and to whom. Organise a few things, then set up the tty for the application,
+ // and the application itself
+
+ // The following two are not necessary in MI, and the first one
+ // just breaks MI completely.
+ // queueCmd(new GDBCommand("set edit off", NOTRUNCMD, NOTINFOCMD, 0));
+ // queueCmd(new GDBCommand("set confirm off", NOTRUNCMD, NOTINFOCMD));
+
+ if (config_displayStaticMembers_)
+ queueCmd(new GDBCommand("set print static-members on"));
+ else
+ queueCmd(new GDBCommand("set print static-members off"));
+
+ // This makes gdb pump a variable out on one line.
+ queueCmd(new GDBCommand("set width 0"));
+ queueCmd(new GDBCommand("set height 0"));
+
+ queueCmd(new GDBCommand("handle SIG32 pass nostop noprint"));
+ queueCmd(new GDBCommand("handle SIG41 pass nostop noprint"));
+ queueCmd(new GDBCommand("handle SIG42 pass nostop noprint"));
+ queueCmd(new GDBCommand("handle SIG43 pass nostop noprint"));
+
+ // Print some nicer names in disassembly output. Although for an assembler
+ // person this may actually be wrong and the mangled name could be better.
+ if (config_asmDemangle_)
+ queueCmd(new GDBCommand("set print asm-demangle on"));
+ else
+ queueCmd(new GDBCommand("set print asm-demangle off"));
+
+ // make sure output radix is always set to users view.
+ queueCmd(new GDBCommand(QCString().sprintf("set output-radix %d", config_outputRadix_)));
+
+ // Change the "Working directory" to the correct one
+ QCString tmp( "cd " + QFile::encodeName( run_directory ));
+ queueCmd(new GDBCommand(tmp));
+
+ // Set the run arguments
+ if (!run_arguments.isEmpty())
+ queueCmd(
+ new GDBCommand(QCString("set args ") + run_arguments.local8Bit()));
+
+ // Get the run environment variables pairs into the environstr string
+ // in the form of: "ENV_VARIABLE=ENV_VALUE" and send to gdb using the
+ // "set enviroment" command
+ // Note that we quote the variable value due to the possibility of
+ // embedded spaces
+ QString environstr;
+ DomUtil::PairList::ConstIterator it;
+ for (it = run_envvars.begin(); it != run_envvars.end(); ++it)
+ {
+ environstr = "set environment ";
+ environstr += (*it).first;
+ environstr += "=";
+ environstr += (*it).second;
+ queueCmd(new GDBCommand(environstr.latin1()));
+ }
+
+ queueCmd(new GDBCommand(
+ "-list-features", this,
+ &GDBController::handleListFeatures, true /* handles error */));
+
+
+ queueCmd(new SentinelCommand(this, &GDBController::startDone));
+
+ // Now gdb has been started and the application has been loaded,
+ // BUT the app hasn't been started yet! A run command is about to be issued
+ // by whoever is controlling us. Or we might be asked to load a core, or
+ // attach to a running process.
+
+ return true;
+}
+
+void GDBController::startDone()
+{
+ // Needed so that breakpoint widget has a chance to insert breakpoints.
+ // FIXME: a bit hacky, as we're really not ready for new commands.
+ setStateOn(s_dbgBusy);
+ raiseEvent(debugger_ready);
+ raiseEvent(connected_to_program);
+}
+
+void GDBController::handleListFeatures(const GDBMI::ResultRecord& r)
+{
+ mi_pending_breakpoints_ = false;
+ if (r.reason == "done")
+ {
+ const GDBMI::Value& features = r["features"];
+ for (unsigned i = 0; i < features.size(); ++i)
+ if (features[i].literal() == "pending-breakpoints")
+ {
+ mi_pending_breakpoints_ = true;
+ }
+ }
+
+ if (!mi_pending_breakpoints_)
+ {
+ // This version of GDB does not support pending breakpoints in MI,
+ // so use a workaround.
+ // The below command makes GDB notify us about shared library
+ // events, and on each stop we'll try to set breakpoint again.
+ addCommandToFront(new GDBCommand("set stop-on-solib-events 1"));
+ }
+}
+// **************************************************************************
+
+void GDBController::slotStopDebugger()
+{
+ kdDebug(9012) << "GDBController::slotStopDebugger() called" << endl;
+ if (stateIsOn(s_shuttingDown) || !dbgProcess_)
+ return;
+
+ setStateOn(s_shuttingDown);
+ kdDebug(9012) << "GDBController::slotStopDebugger() executing" << endl;
+
+ QTime start;
+ QTime now;
+
+ // Get gdb's attention if it's busy. We need gdb to be at the
+ // command line so we can stop it.
+ if (stateIsOn(s_dbgBusy))
+ {
+ kdDebug(9012) << "gdb busy on shutdown - stopping gdb (SIGINT)" << endl;
+ dbgProcess_->kill(SIGINT);
+ start = QTime::currentTime();
+ while (-1)
+ {
+ kapp->eventLoop()->processEvents( QEventLoop::ExcludeUserInput, 20 );
+ now = QTime::currentTime();
+ if (!stateIsOn(s_dbgBusy) || start.msecsTo( now ) > 2000)
+ break;
+ }
+ }
+
+ // If the app is attached then we release it here. This doesn't stop
+ // the app running.
+ if (stateIsOn(s_attached))
+ {
+ const char *detach="detach\n";
+ if (!dbgProcess_->writeStdin(detach, strlen(detach)))
+ kdDebug(9012) << "failed to write 'detach' to gdb" << endl;
+ emit gdbUserCommandStdout("(gdb) detach\n");
+ start = QTime::currentTime();
+ while (-1)
+ {
+ kapp->eventLoop()->processEvents( QEventLoop::ExcludeUserInput, 20 );
+ now = QTime::currentTime();
+ if (!stateIsOn(s_attached) || start.msecsTo( now ) > 2000)
+ break;
+ }
+ }
+
+ // Now try to stop gdb running.
+ const char *quit="quit\n";
+ if (!dbgProcess_->writeStdin(quit, strlen(quit)))
+ kdDebug(9012) << "failed to write 'quit' to gdb" << endl;
+
+ emit gdbUserCommandStdout("(gdb) quit");
+ start = QTime::currentTime();
+ while (-1)
+ {
+ kapp->eventLoop()->processEvents( QEventLoop::ExcludeUserInput, 20 );
+ now = QTime::currentTime();
+ if (stateIsOn(s_programExited) || start.msecsTo( now ) > 2000)
+ break;
+ }
+
+ // We cannot wait forever.
+ if (!stateIsOn(s_programExited))
+ {
+ kdDebug(9012) << "gdb not shutdown - killing" << endl;
+ dbgProcess_->kill(SIGKILL);
+ }
+
+ destroyCmds();
+ delete dbgProcess_; dbgProcess_ = 0;
+ delete tty_; tty_ = 0;
+
+ // The gdb output buffer might contain start marker of some
+ // previously issued command that crashed gdb (so there's no end marker)
+ // If we don't clear this, then after restart, we'll be trying to search
+ // for the end marker of the command issued in previous gdb session,
+ // and never succeed.
+ gdbOutput_ = "";
+
+ setState(s_dbgNotStarted | s_appNotStarted);
+ emit dbgStatus (i18n("Debugger stopped"), state_);
+
+ raiseEvent(debugger_exited);
+}
+
+// **************************************************************************
+
+void GDBController::slotCoreFile(const QString &coreFile)
+{
+ setStateOff(s_programExited|s_appNotStarted);
+ setStateOn(s_core);
+
+ queueCmd(new GDBCommand(QCString("core ") + coreFile.latin1()));
+
+ raiseEvent(connected_to_program);
+ raiseEvent(program_state_changed);
+}
+
+// **************************************************************************
+
+void GDBController::slotAttachTo(int pid)
+{
+ setStateOff(s_appNotStarted|s_programExited);
+ setStateOn(s_attached);
+
+ // Currently, we always start debugger with a name of binary,
+ // we might be connecting to a different binary completely,
+ // so cancel all symbol tables gdb has.
+ // We can't omit application name from gdb invocation
+ // because for libtool binaries, we have no way to guess
+ // real binary name.
+ queueCmd(new GDBCommand(QString("file")));
+
+ // The MI interface does not implements -target-attach yet,
+ // and we don't recognize whatever gibberish 'attach' pours out, so...
+ queueCmd(new GDBCommand(
+ QCString().sprintf("attach %d", pid)));
+
+ raiseEvent(connected_to_program);
+
+ // ...emit a separate MI command to step one instruction more. We'll
+ // notice the '*stopped' response from it and proceed as usual.
+ queueCmd(new GDBCommand("-exec-step-instruction"));
+}
+
+// **************************************************************************
+
+void GDBController::slotRun()
+{
+ if (stateIsOn(s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ if (stateIsOn(s_appNotStarted)) {
+
+ delete tty_;
+ tty_ = new STTY(config_dbgTerminal_, Settings::terminalEmulatorName( *kapp->config() ));
+ if (!config_dbgTerminal_)
+ {
+ connect( tty_, SIGNAL(OutOutput(const char*)), SIGNAL(ttyStdout(const char*)) );
+ connect( tty_, SIGNAL(ErrOutput(const char*)), SIGNAL(ttyStderr(const char*)) );
+ }
+
+ QString tty(tty_->getSlave());
+ if (tty.isEmpty())
+ {
+ KMessageBox::information(0, i18n("GDB cannot use the tty* or pty* devices.\n"
+ "Check the settings on /dev/tty* and /dev/pty*\n"
+ "As root you may need to \"chmod ug+rw\" tty* and pty* devices "
+ "and/or add the user to the tty group using "
+ "\"usermod -G tty username\"."), "Warning", "gdb_error");
+
+ delete tty_;
+ tty_ = 0;
+ return;
+ }
+
+ queueCmd(new GDBCommand(QCString("tty ")+tty.latin1()));
+
+ if (!config_runShellScript_.isEmpty()) {
+ // Special for remote debug...
+ QCString tty(tty_->getSlave().latin1());
+ QCString options = QCString(">") + tty + QCString(" 2>&1 <") + tty;
+
+ KProcess *proc = new KProcess;
+
+ *proc << "sh" << "-c";
+ *proc << config_runShellScript_ +
+ " " + application_.latin1() + options;
+ proc->start(KProcess::DontCare);
+ }
+
+ if (!config_runGdbScript_.isEmpty()) {// gdb script at run is requested
+
+ // Race notice: wait for the remote gdbserver/executable
+ // - but that might be an issue for this script to handle...
+
+ // Future: the shell script should be able to pass info (like pid)
+ // to the gdb script...
+
+ queueCmd(new GDBCommand("source " + config_runGdbScript_));
+
+ // Note: script could contain "run" or "continue"
+ }
+ else {
+
+ QFileInfo app(application_);
+
+ if (!app.exists())
+ {
+ KMessageBox::error(
+ 0,
+ i18n("<b>Application does not exist</b>"
+ "<p>The application you are trying to debug,<br>"
+ " %1\n"
+ "<br>does not exist. Check that you have specified "
+ "the right application in the debugger configuration."
+ ).arg(app.fileName()),
+ i18n("Application does not exist"));
+
+ // FIXME: after this, KDevelop will still show that debugger
+ // is running, because DebuggerPart::slotStopDebugger won't be
+ // called, and core()->running(this, false) won't be called too.
+ slotStopDebugger();
+ return;
+ }
+ if (!app.isExecutable())
+ {
+ KMessageBox::error(
+ 0,
+ i18n("<b>Could not run application '%1'.</b>"
+ "<p>The application does not have the executable bit set. "
+ "Try rebuilding the project, or change permissions "
+ "manually."
+ ).arg(app.fileName()),
+ i18n("Could not run application"));
+ slotStopDebugger();
+ }
+ else
+ {
+ GDBCommand *cmd = new GDBCommand("-exec-run");
+ cmd->setRun(true);
+ queueCmd(cmd);
+ }
+ }
+ }
+ else {
+ removeStateReloadingCommands();
+
+ queueCmd(new GDBCommand("-exec-continue"));
+ }
+ setStateOff(s_appNotStarted|s_programExited);
+}
+
+
+void GDBController::slotKill()
+{
+ if (stateIsOn(s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ if (stateIsOn(s_dbgBusy))
+ {
+ pauseApp();
+ }
+
+ queueCmd(new GDBCommand("kill"));
+
+ setStateOn(s_appNotStarted);
+}
+
+// **************************************************************************
+
+void GDBController::slotRunUntil(const QString &fileName, int lineNum)
+{
+ if (stateIsOn(s_dbgBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ removeStateReloadingCommands();
+
+ if (fileName.isEmpty())
+ queueCmd(new GDBCommand(
+ QCString().sprintf("-exec-until %d", lineNum)));
+ else
+ queueCmd(new GDBCommand(
+ QCString().
+ sprintf("-exec-until %s:%d", fileName.latin1(), lineNum)));
+}
+
+// **************************************************************************
+
+void GDBController::slotJumpTo(const QString &fileName, int lineNum)
+{
+ if (stateIsOn(s_dbgBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ if (!fileName.isEmpty()) {
+ queueCmd(new GDBCommand(QCString().sprintf("tbreak %s:%d", fileName.latin1(), lineNum)));
+ queueCmd(new GDBCommand(QCString().sprintf("jump %s:%d", fileName.latin1(), lineNum)));
+ }
+}
+
+// **************************************************************************
+
+void GDBController::slotStepInto()
+{
+ if (stateIsOn(s_dbgBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ removeStateReloadingCommands();
+
+ queueCmd(new GDBCommand("-exec-step"));
+}
+
+// **************************************************************************
+
+void GDBController::slotStepIntoIns()
+{
+ if (stateIsOn(s_dbgBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ removeStateReloadingCommands();
+
+ queueCmd(new GDBCommand("-exec-step-instruction"));
+}
+
+// **************************************************************************
+
+void GDBController::slotStepOver()
+{
+ if (stateIsOn(s_dbgBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ removeStateReloadingCommands();
+
+ queueCmd(new GDBCommand("-exec-next"));
+}
+
+// **************************************************************************
+
+void GDBController::slotStepOverIns()
+{
+ if (stateIsOn(s_dbgBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ removeStateReloadingCommands();
+
+ queueCmd(new GDBCommand("-exec-next-instruction"));
+}
+
+// **************************************************************************
+
+void GDBController::slotStepOutOff()
+{
+ if (stateIsOn(s_dbgBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ removeStateReloadingCommands();
+
+ queueCmd(new GDBCommand("-exec-finish"));
+}
+
+// **************************************************************************
+
+// Only interrupt a running program.
+void GDBController::slotBreakInto()
+{
+ pauseApp();
+}
+
+// **************************************************************************
+
+void GDBController::selectFrame(int frameNo, int threadNo)
+{
+ // FIXME: this either should be removed completely, or
+ // trigger an error message.
+ if (stateIsOn(s_dbgBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ if (threadNo != -1)
+ {
+ if (viewedThread_ != threadNo)
+ queueCmd(new GDBCommand(
+ QString("-thread-select %1").arg(threadNo).ascii()));
+ }
+
+ queueCmd(new GDBCommand(
+ QString("-stack-select-frame %1").arg(frameNo).ascii()));
+
+ // Will emit the 'thread_or_frame_changed' event.
+ queueCmd(new GDBCommand("-stack-info-frame",
+ this, &GDBController::handleMiFrameSwitch));
+
+
+ // FIXME: the above commands might not be the first in queue, and
+ // previous commands might using values of 'viewedThread_' or
+ // 'currentFrame_'. Ideally, should change the values only after
+ // response from gdb.
+ viewedThread_ = threadNo;
+ currentFrame_ = frameNo;
+}
+
+// **************************************************************************
+
+void GDBController::defaultErrorHandler(const GDBMI::ResultRecord& result)
+{
+ QString msg = result["msg"].literal();
+
+ if (msg.contains("No such process"))
+ {
+ setState(s_appNotStarted|s_programExited);
+ emit dbgStatus (i18n("Process exited"), state_);
+ raiseEvent(program_exited);
+ return;
+ }
+
+ KMessageBox::information(
+ 0,
+ i18n("<b>Debugger error</b>"
+ "<p>Debugger reported the following error:"
+ "<p><tt>") + result["msg"].literal(),
+ i18n("Debugger error"), "gdb_error");
+
+ // Error most likely means that some change made in GUI
+ // was not communicated to the gdb, so GUI is now not
+ // in sync with gdb. Resync it.
+ //
+ // Another approach is to make each widget reload it content
+ // on errors from commands that it sent, but that's too complex.
+ // Errors are supposed to happen rarely, so full reload on error
+ // is not a big deal. Well, maybe except for memory view, but
+ // it's no auto-reloaded anyway.
+ //
+ // Also, don't reload state on errors appeared during state
+ // reloading!
+ if (stateReloadingCommands_.count(currentCmd_) == 0)
+ raiseEvent(program_state_changed);
+}
+
+void GDBController::processMICommandResponse(const GDBMI::ResultRecord& result)
+{
+ kdDebug(9012) << "MI stop reason " << result.reason << "\n";
+ if (result.reason == "stopped")
+ {
+ actOnProgramPauseMI(result);
+ }
+ else if (result.reason == "done")
+ {
+ // At least in one case, for 'detach', debuger write
+ // command directly, and 'currentCmd_' will be unset.
+ // Checking for currentCmd_ is safer in any case.
+ if (currentCmd_)
+ {
+ // Assume that if this command is part of state reloading,
+ // then any further commands issued in command handler
+ // are part of state reloading as well.
+ if (stateReloadingCommands_.count(currentCmd_))
+ {
+ stateReloadInProgress_ = true;
+ }
+ currentCmd_->invokeHandler(result);
+ stateReloadInProgress_ = false;
+ }
+ }
+ else if (result.reason == "error")
+ {
+ // Some commands want to handle errors themself.
+ if (currentCmd_ && currentCmd_->handlesError() &&
+ currentCmd_->invokeHandler(result))
+ {
+ // Done, nothing more needed
+ }
+ else
+ {
+ defaultErrorHandler(result);
+ }
+ }
+}
+
+// Data from gdb gets processed here.
+void GDBController::slotDbgStdout(KProcess *, char *buf, int buflen)
+{
+ static bool parsing = false;
+
+ QCString msg(buf, buflen+1);
+
+ // Copy the data out of the KProcess buffer before it gets overwritten
+ // Append to the back of the holding zone.
+ holdingZone_ += QCString(buf, buflen+1);
+
+ // Already parsing? then get out quick.
+ // VP, 2006-01-30. I'm not sure how this could happen, since
+ // parsing of gdb reply should not ever execute Qt message loop. Except,
+ // maybe, when we pop up a message box. But even in that case,
+ // it's likely we won't return to slotDbgStdout again.
+ if (parsing)
+ {
+ kdDebug(9012) << "Already parsing" << endl;
+ return;
+ }
+
+ bool ready_for_next_command = false;
+
+ int i;
+ bool got_any_command = false;
+ // For each gdb reply. In MI mode, each reply is one string.
+ while((i = holdingZone_.find('\n')) != -1)
+ {
+ got_any_command = true;
+
+ QCString reply(holdingZone_.left(i));
+ holdingZone_ = holdingZone_.mid(i+1);
+
+ kdDebug(9012) << "REPLY: " << reply << "\n";
+
+ FileSymbol file;
+ file.contents = reply;
+
+ std::auto_ptr<GDBMI::Record> r(mi_parser_.parse(&file));
+
+ if (r.get() == 0)
+ {
+ // FIXME: Issue an error!
+ kdDebug(9012) << "Invalid MI message: " << reply << "\n";
+ ready_for_next_command = true;
+ continue;
+ }
+
+ try {
+
+ switch(r->kind)
+ {
+ case GDBMI::Record::Result: {
+
+ GDBMI::ResultRecord& result = static_cast<GDBMI::ResultRecord&>(*r);
+
+ if (result.reason != "running")
+ {
+ kdDebug(9012) << "Command execution time "
+ << commandExecutionTime.elapsed() << " ms.\n";
+ }
+
+ /* The currentCmd_ may be NULL here, because when detaching
+ from debugger, we directly write "detach" to gdb and
+ busy-wait for a reply. Uisng the commands mechanism
+ won't work there, because command result are
+ communicated asynchronously.
+ This is will be fixed in KDevelop4. */
+ if (currentCmd_ && currentCmd_->isUserCommand())
+ emit gdbUserCommandStdout(reply);
+ else
+ emit gdbInternalCommandStdout(reply + "\n");
+
+ if (result.reason == "stopped")
+ {
+ // Transfers ownership.
+ // Needed so that in
+ // handleMiFileListExecSourceFile(GDBMI::ResultRecord& r);
+ // we can use the last stop reason.
+ last_stop_result.reset(static_cast<GDBMI::ResultRecord*>(r.get()));
+ r.release();
+ state_reload_needed = true;
+ }
+ else if (result.reason == "running")
+ {
+ setStateOn(s_appRunning);
+ raiseEvent(program_running);
+ }
+
+ // All MI commands have just one response, except for
+ // run-like command, which result in
+ //
+ // ^running
+ //
+ // followed by
+ //
+ // stopped.
+
+ ready_for_next_command = (result.reason != "running");
+ if (ready_for_next_command)
+ {
+ // Need to do this before procesing response,
+ // so that when processing response we don't
+ // think that application is running.
+ setStateOff(s_appRunning);
+ }
+
+ processMICommandResponse(result);
+
+
+ if (ready_for_next_command)
+ {
+ destroyCurrentCommand();
+ }
+
+
+ break;
+ }
+
+ case GDBMI::Record::Stream: {
+
+ GDBMI::StreamRecord& s = dynamic_cast<GDBMI::StreamRecord&>(*r);
+ /* The way current code works is that we start gdb,
+ and immediately send commands to it without waiting for
+ a prompt. As result, when we return back to the event
+ loop and read the first line from GDB, currentCmd_ is
+ already set. But really, we want to output everything
+ that gdb prints prior to prompt -- it might be
+ output from user's .gdbinit that user cares about. */
+ if (!saw_gdb_prompt_
+ || !currentCmd_ || currentCmd_->isUserCommand())
+ emit gdbUserCommandStdout(s.message.ascii());
+ else
+ emit gdbInternalCommandStdout(s.message.ascii());
+
+ if (currentCmd_)
+ currentCmd_->newOutput(s.message);
+
+ parseCliLine(s.message);
+
+ static QRegExp print_output("^\\$(\\d+) = ");
+ if (print_output.search(s.message) != -1)
+ {
+ kdDebug(9012) << "Found 'print' output: " << s.message << "\n";
+ print_command_result = s.message.ascii();
+ }
+
+ /* This is output from the program. Route it to
+ the Application window. */
+ if (s.reason == '@')
+ emit ttyStderr(s.message.ascii());
+
+ break;
+ }
+
+
+ case GDBMI::Record::Prompt:
+ saw_gdb_prompt_ = true;
+ break;
+ }
+ }
+ catch(const std::exception& e)
+ {
+ KMessageBox::detailedSorry(
+ 0,
+ i18n("<b>Internal debugger error</b>",
+ "<p>The debugger component encountered an internal error while "
+ "processing a reply from gdb. Please submit a bug report."),
+ i18n("The exception is: %1\n"
+ "The MI response is: %2").arg(e.what()).arg(reply),
+ i18n("Internal debugger error"));
+
+ destroyCurrentCommand();
+ ready_for_next_command = true;
+ }
+ }
+
+ // check the queue for any commands to send
+ if (ready_for_next_command)
+ {
+ executeCmd();
+ }
+
+ if (got_any_command)
+ kdDebug(9012) << "COMMANDS: " << cmdList_.count() << " in queue, "
+ << int(bool(currentCmd_)) << " executing\n";
+
+ commandDone();
+}
+
+void GDBController::commandDone()
+{
+ bool no_more_commands = (cmdList_.isEmpty() && !currentCmd_);
+
+ if (no_more_commands && state_reload_needed)
+ {
+ kdDebug(9012) << "Finishing program stop\n";
+ // Set to false right now, so that if 'actOnProgramPauseMI_part2'
+ // sends some commands, we won't call it again when handling replies
+ // from that commands.
+ state_reload_needed = false;
+ reloadProgramState();
+ }
+
+ if (no_more_commands)
+ {
+ kdDebug(9012) << "No more commands\n";
+ setStateOff(s_dbgBusy);
+ emit dbgStatus("", state_);
+ raiseEvent(debugger_ready);
+ }
+}
+
+void GDBController::destroyCurrentCommand()
+{
+ stateReloadingCommands_.erase(currentCmd_);
+ delete currentCmd_;
+ currentCmd_ = 0;
+}
+
+void GDBController::removeStateReloadingCommands()
+{
+ int i = cmdList_.count();
+ while (i)
+ {
+ i--;
+ GDBCommand* cmd = cmdList_.at(i);
+ if (stateReloadingCommands_.count(cmd))
+ {
+ kdDebug(9012) << "UNQUEUE: " << cmd->initialString() << "\n";
+ delete cmdList_.take(i);
+ }
+ }
+
+ if (stateReloadingCommands_.count(currentCmd_))
+ {
+ // This effectively prevents handler for this command
+ // to be ever invoked.
+ destroyCurrentCommand();
+ }
+}
+
+void GDBController::raiseEvent(event_t e)
+{
+ if (e == program_exited || e == debugger_exited)
+ {
+ stateReloadInProgress_ = false;
+ }
+
+ if (e == program_state_changed)
+ {
+ stateReloadInProgress_ = true;
+ kdDebug(9012) << "State reload in progress\n";
+ }
+
+ emit event(e);
+
+ if (e == program_state_changed)
+ {
+ stateReloadInProgress_ = false;
+ }
+}
+
+
+void GDBController::slotDbgStderr(KProcess *proc, char *buf, int buflen)
+{
+ // At the moment, just drop a message out and redirect
+ kdDebug(9012) << "STDERR: " << QString::fromLatin1(buf, buflen+1) << endl;
+ slotDbgStdout(proc, buf, buflen);
+}
+
+// **************************************************************************
+
+void GDBController::slotDbgWroteStdin(KProcess *)
+{
+ commandExecutionTime.start();
+
+ setStateOff(s_waitForWrite);
+
+ // FIXME: need to remove s_waitForWrite flag completely.
+ executeCmd();
+}
+
+// **************************************************************************
+
+void GDBController::slotDbgProcessExited(KProcess* process)
+{
+ Q_ASSERT(process == dbgProcess_);
+ bool abnormal = !process->normalExit();
+ delete dbgProcess_;
+ dbgProcess_ = 0;
+ delete tty_;
+ tty_ = 0;
+
+ if (abnormal)
+ emit debuggerAbnormalExit();
+
+ raiseEvent(debugger_exited);
+
+ destroyCmds();
+ setState(s_dbgNotStarted|s_appNotStarted|s_programExited);
+ emit dbgStatus (i18n("Process exited"), state_);
+
+ emit gdbUserCommandStdout("(gdb) Process exited\n");
+}
+
+// **************************************************************************
+
+void GDBController::slotUserGDBCmd(const QString& cmd)
+{
+ queueCmd(new UserCommand(cmd.latin1()));
+
+ // User command can theoreticall modify absolutely everything,
+ // so need to force a reload.
+
+ // We can do it right now, and don't wait for user command to finish
+ // since commands used to reload all view will be executed after
+ // user command anyway.
+ //if (!stateIsOn(s_appNotStarted) && !stateIsOn(s_programExited))
+ // raiseEvent(program_state_changed);
+}
+
+void GDBController::explainDebuggerStatus()
+{
+ QString information("%1 commands in queue\n"
+ "%2 commands being processed by gdb\n"
+ "Debugger state: %3\n");
+ information =
+ information.arg(cmdList_.count()).arg(currentCmd_ ? 1 : 0)
+ .arg(state_);
+
+ if (currentCmd_)
+ {
+ QString extra("Current command class: '%1'\n"
+ "Current command text: '%2'\n"
+ "Current command origianl text: '%3'\n");
+
+ extra = extra.arg(
+ typeid(*currentCmd_).name()).arg(currentCmd_->cmdToSend()).
+ arg(currentCmd_->initialString());
+ information += extra;
+ }
+
+ KMessageBox::information(0, information, "Debugger status");
+}
+
+bool GDBController::stateIsOn(int state)
+{
+ return state_ & state;
+}
+
+void GDBController::setStateOn(int stateOn)
+{
+ debugStateChange(state_, state_ | stateOn);
+ state_ |= stateOn;
+}
+
+void GDBController::setStateOff(int stateOff)
+{
+ debugStateChange(state_, state_ & ~stateOff);
+ state_ &= ~stateOff;
+}
+
+void GDBController::setState(int newState)
+{
+ debugStateChange(state_, newState);
+ state_ = newState;
+}
+
+void GDBController::debugStateChange(int oldState, int newState)
+{
+ int delta = oldState ^ newState;
+ if (delta)
+ {
+ QString out = "STATE: ";
+ for(unsigned i = 1; i < s_lastDbgState; i <<= 1)
+ {
+ if (delta & i)
+ {
+ if (i & newState)
+ out += "+";
+ else
+ out += "-";
+
+ bool found = false;
+#define STATE_CHECK(name)\
+ if (i == name) { out += #name; found = true; }
+ STATE_CHECK(s_dbgNotStarted);
+ STATE_CHECK(s_appNotStarted);
+ STATE_CHECK(s_waitForWrite);
+ STATE_CHECK(s_programExited);
+ STATE_CHECK(s_viewBT);
+ STATE_CHECK(s_viewBP);
+ STATE_CHECK(s_attached);
+ STATE_CHECK(s_core);
+ STATE_CHECK(s_waitTimer);
+ STATE_CHECK(s_shuttingDown);
+ STATE_CHECK(s_explicitBreakInto);
+ STATE_CHECK(s_dbgBusy);
+ STATE_CHECK(s_appRunning);
+#undef STATE_CHECK
+
+ if (!found)
+ out += QString::number(i);
+ out += " ";
+
+ }
+ }
+ kdDebug(9012) << out << "\n";
+ }
+}
+
+int GDBController::qtVersion( ) const
+{
+ return DomUtil::readIntEntry( dom, "/kdevcppsupport/qt/version", 3 );
+}
+
+void GDBController::demandAttention() const
+{
+ if ( QWidget * w = kapp->mainWidget() )
+ {
+ KWin::demandAttention( w->winId(), true );
+ }
+}
+
+bool GDBController::miPendingBreakpoints() const
+{
+ return mi_pending_breakpoints_;
+}
+
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+#include "gdbcontroller.moc"
diff --git a/languages/cpp/debugger/gdbcontroller.h b/languages/cpp/debugger/gdbcontroller.h
new file mode 100644
index 00000000..6a9e3385
--- /dev/null
+++ b/languages/cpp/debugger/gdbcontroller.h
@@ -0,0 +1,358 @@
+/***************************************************************************
+ gdbcontroller.h - description
+ -------------------
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _GDBCONTROLLER_H_
+#define _GDBCONTROLLER_H_
+
+#include "dbgcontroller.h"
+#include "mi/gdbmi.h"
+#include "mi/miparser.h"
+
+#include <qcstring.h>
+#include <qdom.h>
+#include <qobject.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qmap.h>
+#include <qdatetime.h>
+
+#include <memory>
+#include <set>
+
+class KProcess;
+
+namespace GDBDebugger
+{
+
+class Breakpoint;
+class DbgCommand;
+class GDBCommand;
+class VarItem;
+class STTY;
+
+/**
+ * A front end implementation to the gdb command line debugger
+ * @author jbb
+ */
+
+class GDBController : public DbgController
+{
+ Q_OBJECT
+
+public:
+ GDBController(QDomDocument &projectDom);
+ ~GDBController();
+
+ enum event_t { program_state_changed = 1, program_exited, debugger_exited,
+ thread_or_frame_changed, debugger_busy, debugger_ready,
+ shared_library_loaded,
+ // Raised when debugger believe that program start running.
+ // Can be used to hide current line indicator.
+ // Don't count on this being raise in all cases where
+ // program is running.
+ program_running,
+ connected_to_program
+ };
+
+
+ /** Adds a command to the end of queue of commands to be executed
+ by gdb. The command will be actually sent to gdb only when
+ replies from all previous commands are received and full processed.
+
+ The literal command sent to gdb is obtained by calling
+ cmd->cmdToSend. The call is made immediately before sending the
+ command, so it's possible to use results of prior commands when
+ computing the exact command to send.
+ */
+ void addCommand(GDBCommand* cmd);
+
+ /** Same as above, but internally constructs new GDBCommand
+ instance from the string. */
+ void addCommand(const QString& cmd);
+
+ /** Adds command to the front of the commands queue. It will be executed
+ next.
+
+ This is usefull to implement 'atomic' command sequences. For example,
+ if one wants to switch to each thread in turn, asking gdb where that
+ thread stand, this should never be interrupted by other command, since
+ other commands might not expect that thread magically changes.
+
+ In this specific case, first -thread-list-ids commands is issued. The
+ handler for reply will add a number of command to front, and it will
+ guarantee that no other command will get in between.
+
+ Note that if you call:
+
+ addCommandToFront(cmd1);
+ addCommandToFront(cmd2);
+
+ The execution order will be 'cmd2', then 'cmd1'.
+
+ FIXME: is not used for now, maybe remove.
+ */
+ void addCommandToFront(GDBCommand* cmd);
+
+ /* If current command queue has any command
+ for which isRun is true, inserts 'cmd'
+ before the first such command. Otherwise,
+ works the same as addCommand. */
+ void addCommandBeforeRun(GDBCommand* cmd);
+
+ /** Selects the specified thread/frame. Immediately emits
+ thread_or_frame_changed event.
+ */
+ void selectFrame(int frameNo, int threadNo);
+
+
+ /** Returns the numerical identfier of the current thread,
+ or -1 if the program is not threaded (i.e. there's just
+ one thread.
+ */
+ int currentThread() const;
+
+ int currentFrame() const;
+
+ bool start(const QString& shell,
+ const DomUtil::PairList& run_envvars,
+ const QString& run_directory,
+ const QString &application,
+ const QString& run_arguments);
+
+ int qtVersion() const;
+
+ /**
+ * Call this when something very interesting happens that the user
+ * might be unaware of. It will make KDevelop's taskbar entry flash
+ * if the application doesn't already have focus.
+ * Typical use case: The debugger has stopped on a breakpoint.
+ */
+ void demandAttention() const;
+
+ void pauseApp();
+
+ bool miPendingBreakpoints() const;
+
+protected:
+ enum queue_where { queue_at_end, queue_at_front, queue_before_run };
+
+ void queueCmd(GDBCommand *cmd, enum queue_where queue_where = queue_at_end);
+
+private:
+ void parseLocals (char type, char *buf);
+ /** Parses the CLI output line, and catches interesting messages
+ like "Program exited". This is intended to allow using console
+ commands in the gdb window despite the fact that GDB does not
+ produce right MI notification for CLI commands. I.e. if you
+ run "continue" there will be no MI message if the application has
+ exited.
+ */
+ void parseCliLine (const QString&);
+
+ /** Handles a result response from a MI command -- that is
+ all MI responses except for Stream and Prompt responses.
+ Uses currentCmd to decide what to do with response and
+ calls appropriate method.
+ */
+ void processMICommandResponse(const GDBMI::ResultRecord& r);
+
+ void handleMiFileListExecSourceFile(const GDBMI::ResultRecord& r);
+
+ /** Handles reply from -stack-info-frame command issues
+ after switching the stack frame.
+ */
+ void handleMiFrameSwitch(const GDBMI::ResultRecord& r);
+
+ void executeCmd ();
+ void destroyCmds();
+ void removeInfoRequests();
+ void actOnProgramPauseMI(const GDBMI::ResultRecord& mi_record);
+ /** Called when there are no pending commands and 'state_reload_needed'
+ is true.
+ Issues commands to completely reload all program state shown
+ to the user.
+ */
+ void reloadProgramState();
+
+ void programNoApp(const QString &msg, bool msgBox);
+
+ void setStateOn(int stateOn);
+ void setStateOff(int stateOff);
+ void setState(int newState);
+
+ void debugStateChange(int oldState, int newState);
+ void commandDone();
+ void destroyCurrentCommand();
+
+ /** Removes all 'stateReloading' commands from the queue.
+ */
+ void removeStateReloadingCommands();
+
+ /** Raises the specified event. Should be used instead of
+ emitting 'event' directly, since this method can perform
+ additional book-keeping for events.
+ */
+ void raiseEvent(event_t e);
+
+ void maybeAnnounceWatchpointHit();
+
+ void handleListFeatures(const GDBMI::ResultRecord& result);
+ void startDone();
+
+ /** Default handler for errors.
+ Tries to guess is the error message is telling that target is
+ gone, if so, informs the user.
+ Otherwise, shows a dialog box and reloads view state. */
+ void defaultErrorHandler(const GDBMI::ResultRecord& result);
+
+public:
+ bool stateIsOn(int state);
+
+public slots:
+ void configure();
+
+
+ //void slotStart(const QString& shell, const QString &application);
+ void slotCoreFile(const QString &coreFile);
+ void slotAttachTo(int pid);
+
+ void slotStopDebugger();
+
+ void slotRun();
+ void slotKill();
+ void slotRunUntil(const QString &filename, int lineNum);
+ void slotJumpTo(const QString &filename, int lineNum);
+ void slotStepInto();
+ void slotStepOver();
+ void slotStepIntoIns();
+ void slotStepOverIns();
+ void slotStepOutOff();
+
+ void slotBreakInto();
+
+ void slotUserGDBCmd(const QString&);
+
+ // Pops up a dialog box with some hopefully
+ // detailed information about which state debugger
+ // is in, which commands were sent and so on.
+ void explainDebuggerStatus();
+
+
+protected slots:
+ void slotDbgStdout(KProcess *proc, char *buf, int buflen);
+ void slotDbgStderr(KProcess *proc, char *buf, int buflen);
+ void slotDbgWroteStdin(KProcess *proc);
+ void slotDbgProcessExited(KProcess *proc);
+
+signals:
+
+ /** This signal is emitted whenever the given event in a program
+ happens. See DESIGN.txt for expected handled of each event.
+
+ NOTE: this signal should never be emitted directly. Instead,
+ use raiseEvent.
+ */
+ void event(GDBController::event_t e);
+
+ void debuggerAbnormalExit();
+
+
+ /** Emitted immediately after breakpoint is hit, before any commands
+ are sent and before current line indicator is shown. */
+ void breakpointHit(int id);
+ /** Emitted for watchpoint hit, after line indicator is shown. */
+ void watchpointHit(int id,
+ const QString& oldValue, const QString& newValue);
+
+private:
+ int currentFrame_;
+ int viewedThread_;
+
+ // The output from gdb that was not parsed yet
+ QCString gdbOutput_;
+ // The output from gdb that arrived where we was
+ // parsing the previous output. To avoid messing
+ // things up, it's not directly added to
+ // gdbOutput_ but stored for future use.
+ // VP: It's not clear why the previous code was doing
+ // this, and holdingZone_ won't be processed until
+ // next output arrives, so probably should be just removed.
+ QCString holdingZone_;
+
+ QPtrList<GDBCommand> cmdList_;
+ GDBCommand* currentCmd_;
+
+ STTY* tty_;
+ QString badCore_;
+ QString application_;
+
+ // Gdb command that should be issued when we stop on breakpoint
+ // with the given gdb breakpoint id.
+ QMap<int, const Breakpoint*> tracedBreakpoints_;
+
+ // Some state variables
+ int state_;
+ bool programHasExited_;
+
+ // Configuration values
+ QDomDocument &dom;
+ bool config_breakOnLoadingLibrary_;
+ bool config_forceBPSet_;
+ bool config_displayStaticMembers_;
+ bool config_asmDemangle_;
+ bool config_dbgTerminal_;
+ QString config_gdbPath_;
+ QString config_dbgShell_;
+ QCString config_configGdbScript_;
+ QCString config_runShellScript_;
+ QCString config_runGdbScript_;
+ int config_outputRadix_;
+
+ MIParser mi_parser_;
+ // As of gdb 6.3, the *stopped packet does not contain
+ // full file name. So we need to send another command to
+ // fetch that, to highlight current line.
+ // After highting current line we need to do something more,
+ // like announcing write watchpoints, and so need to have
+ // access to the stop packet. So store it here.
+ std::auto_ptr<GDBMI::ResultRecord> last_stop_result;
+
+ // Gdb 6.4 (and 6.3) does not support "character" format with MI,
+ // so the only way it can work is via the "print" command. As gdb
+ // outputs things, we'll grep for lines that look like output from
+ // print, and store such lines in this variable, so later use.
+ QCString print_command_result;
+
+ bool state_reload_needed;
+
+ QTime commandExecutionTime;
+
+ bool stateReloadInProgress_;
+
+ /** Commands issues as result of the 'program_state_changed'
+ event. */
+ std::set<GDBCommand*> stateReloadingCommands_;
+
+ bool saw_gdb_prompt_;
+
+ /** Does the used GDB supports pending breakpoints in MI? */
+ bool mi_pending_breakpoints_;
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/gdboutputwidget.cpp b/languages/cpp/debugger/gdboutputwidget.cpp
new file mode 100644
index 00000000..817f8692
--- /dev/null
+++ b/languages/cpp/debugger/gdboutputwidget.cpp
@@ -0,0 +1,376 @@
+// *************************************************************************
+// gdboutputwidget.cpp - description
+// -------------------
+// begin : 10th April 2003
+// copyright : (C) 2003 by John Birch
+// email : jbb@kdevelop.org
+// **************************************************************************
+//
+// **************************************************************************
+// * *
+// * 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. *
+// * *
+// **************************************************************************
+
+#include "gdboutputwidget.h"
+#include "dbgcontroller.h"
+
+#include <kcombobox.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtextedit.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+#include <qapplication.h>
+#include <qclipboard.h>
+#include <qdom.h>
+
+
+namespace GDBDebugger
+{
+
+/***************************************************************************/
+
+GDBOutputWidget::GDBOutputWidget( QWidget *parent, const char *name) :
+ QWidget(parent, name),
+ m_userGDBCmdEditor(0),
+ m_Interrupt(0),
+ m_gdbView(0),
+ showInternalCommands_(false),
+ maxLines_(5000)
+{
+
+ m_gdbView = new OutputText(this);
+ m_gdbView->setTextFormat(QTextEdit::LogText);
+
+ QBoxLayout *userGDBCmdEntry = new QHBoxLayout();
+ m_userGDBCmdEditor = new KHistoryCombo (this, "gdb-user-cmd-editor");
+
+ QLabel *label = new QLabel(i18n("&GDB cmd:"), this);
+ label->setBuddy(m_userGDBCmdEditor);
+ userGDBCmdEntry->addWidget(label);
+
+ userGDBCmdEntry->addWidget(m_userGDBCmdEditor);
+ userGDBCmdEntry->setStretchFactor(m_userGDBCmdEditor, 1);
+
+ m_Interrupt = new QToolButton( this, "add breakpoint" );
+ m_Interrupt->setSizePolicy ( QSizePolicy ( (QSizePolicy::SizeType)0,
+ ( QSizePolicy::SizeType)0,
+ 0,
+ 0,
+ m_Interrupt->sizePolicy().hasHeightForWidth())
+ );
+ m_Interrupt->setPixmap ( SmallIcon ( "player_pause" ) );
+ userGDBCmdEntry->addWidget(m_Interrupt);
+ QToolTip::add ( m_Interrupt, i18n ( "Pause execution of the app to enter gdb commands" ) );
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this, 2);
+ topLayout->addWidget(m_gdbView, 10);
+ topLayout->addLayout(userGDBCmdEntry);
+
+ slotDbgStatus( "", s_dbgNotStarted);
+
+ connect( m_userGDBCmdEditor, SIGNAL(returnPressed()), SLOT(slotGDBCmd()) );
+ connect( m_Interrupt, SIGNAL(clicked()), SIGNAL(breakInto()));
+
+ connect( &updateTimer_, SIGNAL(timeout()),
+ this, SLOT(flushPending()));
+}
+
+/***************************************************************************/
+
+GDBOutputWidget::~GDBOutputWidget()
+{
+ delete m_gdbView;
+ delete m_userGDBCmdEditor;
+}
+
+/***************************************************************************/
+
+void GDBOutputWidget::clear()
+{
+ if (m_gdbView)
+ m_gdbView->clear();
+
+ userCommands_.clear();
+ allCommands_.clear();
+}
+
+/***************************************************************************/
+
+void GDBOutputWidget::slotInternalCommandStdout(const char* line)
+{
+ newStdoutLine(line, true);
+}
+
+void GDBOutputWidget::slotUserCommandStdout(const char* line)
+{
+ newStdoutLine(line, false);
+}
+
+namespace {
+ QString colorify(QString text, const QString& color)
+ {
+ // Make sure the newline is at the end of the newly-added
+ // string. This is so that we can always correctly remove
+ // newline inside 'flushPending'.
+ Q_ASSERT(text.endsWith("\n"));
+ if (text.endsWith("\n"))
+ {
+ text.remove(text.length()-1, 1);
+ }
+ text = "<font color=\"" + color + "\">" + text + "</font>\n";
+ return text;
+ }
+}
+
+
+void GDBOutputWidget::newStdoutLine(const QString& line,
+ bool internal)
+{
+ QString s = html_escape(line);
+ if (s.startsWith("(gdb)"))
+ {
+ s = colorify(s, "blue");
+ }
+
+ allCommands_.append(s);
+ allCommandsRaw_.append(line);
+ trimList(allCommands_, maxLines_);
+ trimList(allCommandsRaw_, maxLines_);
+
+ if (!internal)
+ {
+ userCommands_.append(s);
+ userCommandsRaw_.append(line);
+ trimList(userCommands_, maxLines_);
+ trimList(userCommandsRaw_, maxLines_);
+ }
+
+ if (!internal || showInternalCommands_)
+ showLine(s);
+}
+
+
+void GDBOutputWidget::showLine(const QString& line)
+{
+ pendingOutput_ += line;
+
+ // To improve performance, we update the view after some delay.
+ if (!updateTimer_.isActive())
+ {
+ updateTimer_.start(100, true /* single shot */);
+ }
+}
+
+void GDBOutputWidget::trimList(QStringList& l, unsigned max_size)
+{
+ unsigned int length = l.count();
+ if (length > max_size)
+ {
+ for(int to_delete = length - max_size; to_delete; --to_delete)
+ {
+ l.erase(l.begin());
+ }
+ }
+}
+
+void GDBOutputWidget::setShowInternalCommands(bool show)
+{
+ if (show != showInternalCommands_)
+ {
+ showInternalCommands_ = show;
+
+ // Set of strings to show changes, text edit still has old
+ // set. Refresh.
+ m_gdbView->clear();
+ QStringList& newList =
+ showInternalCommands_ ? allCommands_ : userCommands_;
+
+ QStringList::iterator i = newList.begin(), e = newList.end();
+ for(; i != e; ++i)
+ {
+ // Note that color formatting is already applied to '*i'.
+ showLine(*i);
+ }
+ }
+}
+
+/***************************************************************************/
+
+void GDBOutputWidget::slotReceivedStderr(const char* line)
+{
+ QString colored = colorify(html_escape(line), "red");
+ // Errors are shown inside user commands too.
+ allCommands_.append(colored);
+ trimList(allCommands_, maxLines_);
+ userCommands_.append(colored);
+ trimList(userCommands_, maxLines_);
+
+ allCommandsRaw_.append(line);
+ trimList(allCommandsRaw_, maxLines_);
+ userCommandsRaw_.append(line);
+ trimList(userCommandsRaw_, maxLines_);
+
+ showLine(colored);
+}
+
+/***************************************************************************/
+
+void GDBOutputWidget::slotGDBCmd()
+{
+ QString GDBCmd(m_userGDBCmdEditor->currentText());
+ if (!GDBCmd.isEmpty())
+ {
+ m_userGDBCmdEditor->addToHistory(GDBCmd);
+ m_userGDBCmdEditor->clearEdit();
+ emit userGDBCmd(GDBCmd);
+ }
+}
+
+void GDBOutputWidget::flushPending()
+{
+ m_gdbView->setUpdatesEnabled(false);
+
+ // QTextEdit adds newline after paragraph automatically.
+ // So, remove trailing newline to avoid double newlines.
+ if (pendingOutput_.endsWith("\n"))
+ pendingOutput_.remove(pendingOutput_.length()-1, 1);
+ Q_ASSERT(!pendingOutput_.endsWith("\n"));
+
+ m_gdbView->append(pendingOutput_);
+ pendingOutput_ = "";
+
+ m_gdbView->scrollToBottom();
+ m_gdbView->setUpdatesEnabled(true);
+ m_gdbView->update();
+ m_userGDBCmdEditor->setFocus();
+}
+
+/***************************************************************************/
+
+void GDBOutputWidget::slotDbgStatus(const QString &, int statusFlag)
+{
+ if (statusFlag & s_dbgNotStarted)
+ {
+ m_Interrupt->setEnabled(false);
+ m_userGDBCmdEditor->setEnabled(false);
+ return;
+ }
+ else
+ {
+ m_Interrupt->setEnabled(true);
+ }
+
+ if (statusFlag & s_dbgBusy)
+ {
+ m_userGDBCmdEditor->setEnabled(false);
+ }
+ else
+ {
+ m_userGDBCmdEditor->setEnabled(true);
+ }
+}
+
+/***************************************************************************/
+
+void GDBOutputWidget::focusInEvent(QFocusEvent */*e*/)
+{
+ m_gdbView->scrollToBottom();
+ m_userGDBCmdEditor->setFocus();
+}
+
+QString GDBOutputWidget::html_escape(const QString& s)
+{
+ QString r(s);
+ r.replace("<", "&lt;");
+ r.replace(">", "&gt;");
+ return r;
+}
+
+void GDBOutputWidget::savePartialProjectSession(QDomElement* el)
+{
+ QDomDocument doc = el->ownerDocument();
+
+ QDomElement showInternal = doc.createElement("showInternalCommands");
+ showInternal.setAttribute("value", QString::number(showInternalCommands_));
+
+ el->appendChild(showInternal);
+}
+
+void GDBOutputWidget::restorePartialProjectSession(const QDomElement* el)
+{
+ QDomElement showInternal =
+ el->namedItem("showInternalCommands").toElement();
+
+ if (!showInternal.isNull())
+ {
+ showInternalCommands_ = showInternal.attribute("value", "0").toInt();
+ }
+}
+
+
+//void OutputText::contextMenuEvent(QContextMenuEvent* e)
+QPopupMenu* OutputText::createPopupMenu(const QPoint&)
+{
+ KPopupMenu* popup = new KPopupMenu;
+
+ int id = popup->insertItem(i18n("Show Internal Commands"),
+ this,
+ SLOT(toggleShowInternalCommands()));
+
+ popup->setItemChecked(id, parent_->showInternalCommands_);
+ popup->setWhatsThis(
+ id,
+ i18n(
+ "Controls if commands issued internally by KDevelop "
+ "will be shown or not.<br>"
+ "This option will affect only future commands, it will not "
+ "add or remove already issued commands from the view."));
+
+ popup->insertItem(i18n("Copy All"),
+ this,
+ SLOT(copyAll()));
+
+
+ return popup;
+}
+
+void OutputText::copyAll()
+{
+ /* See comments for allCommandRaw_ for explanations of
+ this complex logic, as opposed to calling text(). */
+ QStringList& raw = parent_->showInternalCommands_ ?
+ parent_->allCommandsRaw_ : parent_->userCommandsRaw_;
+ QString text;
+ for (unsigned i = 0; i < raw.size(); ++i)
+ text += raw[i];
+
+ // Make sure the text is pastable both with Ctrl-C and with
+ // middle click.
+ QApplication::clipboard()->setText(text, QClipboard::Clipboard);
+ QApplication::clipboard()->setText(text, QClipboard::Selection);
+}
+
+void OutputText::toggleShowInternalCommands()
+{
+ parent_->setShowInternalCommands(!parent_->showInternalCommands_);
+}
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+}
+
+
+#include "gdboutputwidget.moc"
+
diff --git a/languages/cpp/debugger/gdboutputwidget.h b/languages/cpp/debugger/gdboutputwidget.h
new file mode 100644
index 00000000..ddf79823
--- /dev/null
+++ b/languages/cpp/debugger/gdboutputwidget.h
@@ -0,0 +1,137 @@
+// *************************************************************************
+// gdboutputwidget.cpp - description
+// -------------------
+// begin : 10th April 2003
+// copyright : (C) 2003 by John Birch
+// email : jbb@kdevelop.org
+// **************************************************************************
+//
+// **************************************************************************
+// * *
+// * 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. *
+// * *
+// **************************************************************************
+
+#ifndef _GDBOUTPUTWIDGET_H_
+#define _GDBOUTPUTWIDGET_H_
+
+#include <qwidget.h>
+#include <qtextedit.h>
+#include <qtimer.h>
+#include <qstringlist.h>
+
+class KHistoryCombo;
+
+class QTextEdit;
+class QToolButton;
+class QDomElement;
+
+namespace GDBDebugger
+{
+
+class GDBOutputWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ GDBOutputWidget( QWidget *parent=0, const char *name=0 );
+ ~GDBOutputWidget();
+
+ void savePartialProjectSession(QDomElement* el);
+ void restorePartialProjectSession(const QDomElement* el);
+
+ void clear();
+
+public slots:
+ void slotInternalCommandStdout(const char* line);
+ void slotUserCommandStdout(const char* line);
+ void slotReceivedStderr(const char* line);
+ void slotDbgStatus (const QString &status, int statusFlag);
+
+ void slotGDBCmd();
+
+ void flushPending();
+
+protected:
+ virtual void focusInEvent(QFocusEvent *e);
+
+signals:
+ void userGDBCmd(const QString &cmd);
+ void breakInto();
+
+private:
+
+ QString html_escape(const QString& s);
+
+ void newStdoutLine(const QString& line, bool internal);
+
+ /** Arranges for 'line' to be shown to the user.
+ Adds 'line' to pendingOutput_ and makes sure
+ updateTimer_ is running. */
+ void showLine(const QString& line);
+
+ /** Makes 'l' no longer then 'max_size' by
+ removing excessive elements from the top.
+ */
+ void trimList(QStringList& l, unsigned max_size);
+
+ KHistoryCombo* m_userGDBCmdEditor;
+ QToolButton* m_Interrupt;
+ QTextEdit* m_gdbView;
+
+ void setShowInternalCommands(bool);
+ friend class OutputText;
+
+ /** The output from user commands only and from
+ all commands. We keep it here so that if we switch
+ "Show internal commands" on, we can show previous
+ internal commands.
+ */
+ QStringList userCommands_, allCommands_;
+ /** Same output, without any fancy formatting. Keeping it
+ here because I can't find any way to extract raw text,
+ without formatting, out of QTextEdit except for
+ selecting everything and calling 'copy()'. The latter
+ approach is just ugly. */
+ QStringList userCommandsRaw_, allCommandsRaw_;
+
+
+ /** For performance reasons, we don't immediately add new text
+ to QTExtEdit. Instead we add it to pendingOutput_ and
+ flush it on timer.
+ */
+ QString pendingOutput_;
+ QTimer updateTimer_;
+
+ bool showInternalCommands_;
+
+ int maxLines_;
+};
+
+/** Add popup menu specific to gdb output window to QTextEdit.
+*/
+class OutputText : public QTextEdit
+{
+ Q_OBJECT
+public:
+ OutputText(GDBOutputWidget* parent)
+ : QTextEdit(parent),
+ parent_(parent)
+ {}
+
+ QPopupMenu* createPopupMenu(const QPoint& pos);
+
+private slots:
+ void copyAll();
+ void toggleShowInternalCommands();
+
+private:
+ GDBOutputWidget* parent_;
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/gdbparser.cpp b/languages/cpp/debugger/gdbparser.cpp
new file mode 100644
index 00000000..79057af5
--- /dev/null
+++ b/languages/cpp/debugger/gdbparser.cpp
@@ -0,0 +1,432 @@
+// **************************************************************************
+// begin : Tue Aug 17 1999
+// copyright : (C) 1999 by John Birch
+// email : jbb@kdevelop.org
+// **************************************************************************
+
+// **************************************************************************
+// *
+// 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. *
+// *
+// **************************************************************************
+
+#include "gdbparser.h"
+#include "variablewidget.h"
+#include <kdebug.h>
+
+#include <qregexp.h>
+
+#include <ctype.h>
+#include <stdlib.h>
+
+namespace GDBDebugger
+{
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+GDBParser *GDBParser::GDBParser_ = 0;
+
+GDBParser *GDBParser::getGDBParser()
+{
+ if (!GDBParser_)
+ GDBParser_ = new GDBParser();
+
+ return GDBParser_;
+}
+
+// **************************************************************************
+
+void GDBParser::destroy()
+{
+ delete GDBParser_;
+ GDBParser_ = 0;
+}
+
+// **************************************************************************
+
+GDBParser::GDBParser()
+{
+}
+
+// **************************************************************************
+
+GDBParser::~GDBParser()
+{
+}
+
+
+// **************************************************************************
+
+QString GDBParser::getName(const char **buf)
+{
+ const char *start = skipNextTokenStart(*buf);
+ if (*start) {
+ *buf = skipTokenValue(start);
+ return QCString(start, *buf - start + 1);
+ } else
+ *buf = start;
+
+ return QString();
+}
+
+// **************************************************************************
+
+QString GDBParser::getValue(const char **buf)
+{
+ const char *start = skipNextTokenStart(*buf);
+ *buf = skipTokenValue(start);
+
+ QString value(QCString(start, *buf - start + 1).data());
+ return value;
+}
+
+QString GDBParser::undecorateValue(DataType type, const QString& s)
+{
+ QCString l8 = s.local8Bit();
+ const char* start = l8;
+ const char* end = start + s.length();
+
+ if (*start == '{')
+ {
+ // Gdb uses '{' in two cases:
+ // - composites (arrays and structures)
+ // - pointers to functions. In this case type is
+ // enclosed in "{}". Not sure why it's so, as
+ // when printing pointer, type is in parenthesis.
+ if (type == typePointer)
+ {
+ // Looks like type in braces at the beginning. Strip it.
+ start = skipDelim(start, '{', '}');
+ }
+ else
+ {
+ // Looks like composite, strip the braces and return.
+ return QCString(start+1, end - start -1);
+ }
+ }
+ else if (*start == '(')
+ {
+ // Strip the type of the pointer from the value.
+ //
+ // When printing values of pointers, gdb prints the pointer
+ // type as well. This is not necessary for kdevelop -- after
+ // all, there's separate column with value type. But that behaviour
+ // is not configurable. The only way to change it is to explicitly
+ // pass the 'x' format specifier to the 'print' command.
+ //
+ // We probably can achieve that by sending an 'print in hex' request
+ // as soon as we know the type of variable, but that would be complex
+ // and probably conflict with 'toggle hex/decimal' command.
+ // So, address this problem as close to debugger as possible.
+
+ // We can't find the first ')', because type can contain '(' and ')'
+ // characters if its function pointer. So count opening and closing
+ // parentheses.
+
+ start = skipDelim(start, '(', ')');
+ }
+
+ QString value(QCString(start, end - start + 1).data());
+
+ value = value.stripWhiteSpace();
+
+ if (value[0] == '@')
+ {
+ // It's a reference, we need to show just the value.
+ if (int i = value.find(":"))
+ {
+ value = value.mid(i+2);
+ }
+ else
+ {
+ // Just reference, no value at all, remove all
+ value = "";
+ }
+ }
+
+ if (value.find("Cannot access memory") == 0)
+ value = "(inaccessible)";
+
+ return value.stripWhiteSpace();
+}
+
+QString GDBParser::undecorateValue(const QString& s)
+{
+ DataType dataType = determineType(s.local8Bit());
+ QString r = undecorateValue(dataType, s.local8Bit());
+ return r;
+}
+
+// Given a value that starts with 0xNNNNNN determines if
+// it looks more like pointer, or a string value.
+DataType pointerOrValue(const char *buf)
+{
+ while (*buf) {
+ if (!isspace(*buf))
+ buf++;
+ else if (*(buf+1) == '\"')
+ return typeValue;
+ else
+ break;
+ }
+
+ return typePointer;
+}
+
+
+DataType GDBParser::determineType(const char *buf) const
+{
+ if (!buf || !*(buf= skipNextTokenStart(buf)))
+ return typeUnknown;
+
+ // A reference, probably from a parameter value.
+ if (*buf == '@')
+ return typeReference;
+
+ // Structures and arrays - (but which one is which?)
+ // {void (void)} 0x804a944 <__builtin_new+41> - this is a fn pointer
+ // (void (*)(void)) 0x804a944 <f(E *, char)> - so is this - ugly!!!
+ if (*buf == '{') {
+ if (strncmp(buf, "{{", 2) == 0)
+ return typeArray;
+
+ if (strncmp(buf, "{<No data fields>}", 18) == 0)
+ return typeValue;
+
+ buf++;
+ while (*buf) {
+ switch (*buf) {
+ case '=':
+ return typeStruct;
+ case '"':
+ buf = skipString(buf);
+ break;
+ case '\'':
+ buf = skipQuotes(buf, '\'');
+ break;
+ case ',':
+ if (*(buf-1) == '}')
+ Q_ASSERT(false);
+ return typeArray;
+ case '}':
+ if (*(buf+1) == ',' || *(buf+1) == '\n' || !*(buf+1))
+ return typeArray; // Hmm a single element array??
+ if (strncmp(buf+1, " 0x", 3) == 0)
+ return typePointer; // What about references?
+ return typeUnknown; // very odd?
+ case '(':
+ buf = skipDelim(buf, '(', ')');
+ break;
+ case '<':
+ buf = skipDelim(buf, '<', '>');
+ // gdb may produce this output:
+ // $1 = 0x804ddf3 ' ' <repeats 20 times>, "TESTSTRING"
+ // after having finished with the "repeats"-block we need
+ // to check if the string continues
+ if ( buf[0] == ',' && (buf[2] == '\"' || buf[2] == '\'') ) {
+ buf++; //set the buffer behind the comma to indicate that the string continues
+ }
+ break;
+ default:
+ buf++;
+ break;
+ }
+ }
+ return typeUnknown;
+ }
+
+ // some sort of address. We need to sort out if we have
+ // a 0x888888 "this is a char*" type which we'll term a value
+ // or whether we just have an address
+ if (strncmp(buf, "0x", 2) == 0) {
+ return pointerOrValue(buf);
+ }
+
+ // Pointers and references - references are a bit odd
+ // and cause GDB to fail to produce all the local data
+ // if they haven't been initialised. but that's not our problem!!
+ // (void (*)(void)) 0x804a944 <f(E *, char)> - this is a fn pointer
+ if (*buf == '(') {
+ buf = skipDelim(buf, '(', ')');
+ // This 'if' handles values like this:
+ // (int (&)[3]) @0xbffff684: {5, 6, 7}
+ // which is a reference to array.
+ if (buf[1] == '@')
+ return typeReference;
+ // This 'if' handles values like this:
+ // (int (*)[3]) 0xbffff810
+ if (strncmp(buf, " 0x", 3) == 0)
+ {
+ ++buf;
+ return pointerOrValue(buf);
+ }
+
+ switch (*(buf-2)) {
+ case '*':
+ return typePointer;
+ case '&':
+ return typeReference;
+ default:
+ switch (*(buf-8)) {
+ case '*':
+ return typePointer;
+ case '&':
+ return typeReference;
+ }
+ return typeUnknown;
+ }
+ }
+
+ buf = skipTokenValue(buf);
+ if ((strncmp(buf, " = ", 3) == 0) || (*buf == '='))
+ return typeName;
+
+ return typeValue;
+}
+
+// **************************************************************************
+
+const char *GDBParser::skipString(const char *buf) const
+{
+ if (buf && *buf == '\"') {
+ buf = skipQuotes(buf, *buf);
+ while (*buf) {
+ if ((strncmp(buf, ", \"", 3) == 0) ||
+ (strncmp(buf, ", '", 3) == 0))
+ buf = skipQuotes(buf+2, *(buf+2));
+ else if (strncmp(buf, " <", 2) == 0) // take care of <repeats
+ buf = skipDelim(buf+1, '<', '>');
+ else
+ break;
+ }
+
+ // If the string is long then it's chopped and has ... after it.
+ while (*buf && *buf == '.')
+ buf++;
+ }
+
+ return buf;
+}
+
+// ***************************************************************************
+
+const char *GDBParser::skipQuotes(const char *buf, char quotes) const
+{
+ if (buf && *buf == quotes) {
+ buf++;
+
+ while (*buf) {
+ if (*buf == '\\')
+ buf++; // skips \" or \' problems
+ else if (*buf == quotes)
+ return buf+1;
+
+ buf++;
+ }
+ }
+
+ return buf;
+}
+
+// **************************************************************************
+
+const char *GDBParser::skipDelim(const char *buf, char open, char close) const
+{
+ if (buf && *buf == open) {
+ buf++;
+
+ while (*buf) {
+ if (*buf == open)
+ buf = skipDelim(buf, open, close);
+ else if (*buf == close)
+ return buf+1;
+ else if (*buf == '\"')
+ buf = skipString(buf);
+ else if (*buf == '\'')
+ buf = skipQuotes(buf, *buf);
+ else if (*buf)
+ buf++;
+ }
+ }
+ return buf;
+}
+
+// **************************************************************************
+
+const char *GDBParser::skipTokenValue(const char *buf) const
+{
+ if (buf) {
+ while (true) {
+ buf = skipTokenEnd(buf);
+
+ const char *end = buf;
+ while (*end && isspace(*end) && *end != '\n')
+ end++;
+
+ if (*end == 0 || *end == ',' || *end == '\n' || *end == '=' || *end == '}')
+ break;
+
+ if (buf == end)
+ break;
+
+ buf = end;
+ }
+ }
+
+ return buf;
+}
+
+// **************************************************************************
+
+const char *GDBParser::skipTokenEnd(const char *buf) const
+{
+ if (buf) {
+ switch (*buf) {
+ case '"':
+ return skipString(buf);
+ case '\'':
+ return skipQuotes(buf, *buf);
+ case '{':
+ return skipDelim(buf, '{', '}');
+ case '<':
+ buf = skipDelim(buf, '<', '>');
+ // gdb may produce this output:
+ // $1 = 0x804ddf3 ' ' <repeats 20 times>, "TESTSTRING"
+ // after having finished with the "repeats"-block we need
+ // to check if the string continues
+ if ( buf[0] == ',' && (buf[2] == '\"' || buf[2] == '\'') ) {
+ buf++; //set the buffer behind the comma to indicate that the string continues
+ }
+ return buf;
+ case '(':
+ return skipDelim(buf, '(', ')');
+ }
+
+ while (*buf && !isspace(*buf) && *buf != ',' && *buf != '}' && *buf != '=')
+ buf++;
+ }
+
+ return buf;
+}
+
+// **************************************************************************
+
+const char *GDBParser::skipNextTokenStart(const char *buf) const
+{
+ if (buf)
+ while (*buf && (isspace(*buf) || *buf == ',' || *buf == '}' || *buf == '='))
+ buf++;
+
+ return buf;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+}
diff --git a/languages/cpp/debugger/gdbparser.h b/languages/cpp/debugger/gdbparser.h
new file mode 100644
index 00000000..8972e5df
--- /dev/null
+++ b/languages/cpp/debugger/gdbparser.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ begin : Tue Aug 17 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _GDBPARSER_H_
+#define _GDBPARSER_H_
+
+#include "variablewidget.h"
+
+namespace GDBDebugger
+{
+
+class GDBParser
+{
+public:
+ DataType determineType(const char *buf) const;
+ QString undecorateValue(const QString& s);
+
+ const char *skipString(const char *buf) const;
+ const char *skipQuotes(const char *buf, char quote) const;
+ const char *skipDelim(const char *buf, char open, char close) const;
+
+ static GDBParser *getGDBParser();
+ static void destroy();
+
+private:
+ void parseArray(TrimmableItem *parent, const char *buf);
+
+ const char *skipTokenEnd(const char *buf) const;
+ const char *skipTokenValue(const char *buf) const;
+ const char *skipNextTokenStart(const char *buf) const;
+
+ QString getName(const char **buf);
+ /** Assuming 'buf' points to a value, return a pointer
+ to the position right after the value.
+ */
+ QString getValue(const char **buf);
+ QString undecorateValue(DataType type, const QString& s);
+
+protected:
+ GDBParser();
+ ~GDBParser();
+ static GDBParser *GDBParser_;
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/gdbtable.cpp b/languages/cpp/debugger/gdbtable.cpp
new file mode 100644
index 00000000..c4d75f3a
--- /dev/null
+++ b/languages/cpp/debugger/gdbtable.cpp
@@ -0,0 +1,55 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* cloudtemple@mksat.net *
+* *
+* 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. *
+***************************************************************************/
+#include "gdbtable.h"
+
+namespace GDBDebugger {
+
+GDBTable::GDBTable(QWidget *parent, const char *name)
+ : QTable(parent, name)
+{
+}
+
+GDBTable::GDBTable(int nr, int nc, QWidget * parent, const char * name)
+ : QTable(nr, nc, parent, name)
+{
+}
+
+GDBTable::~GDBTable()
+{
+}
+
+void GDBTable::keyPressEvent( QKeyEvent * e )
+{
+ emit keyPressed(e->key());
+
+ if (e->key() == Key_Return)
+ emit returnPressed();
+ else if (e->key() == Key_F2)
+ emit f2Pressed();
+ else if ((e->text() == QString("a")) && (e->state() == AltButton))
+ {
+ emit insertPressed();
+ return;
+ }
+ else if ((e->text() == QString("A")) && (e->state() == AltButton))
+ {
+ emit insertPressed();
+ return;
+ }
+ else if (e->key() == Key_Delete)
+ emit deletePressed();
+
+ QTable::keyPressEvent(e);
+}
+
+}
+
+#include "gdbtable.moc"
+
diff --git a/languages/cpp/debugger/gdbtable.h b/languages/cpp/debugger/gdbtable.h
new file mode 100644
index 00000000..f8741e26
--- /dev/null
+++ b/languages/cpp/debugger/gdbtable.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* cloudtemple@mksat.net *
+* *
+* 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. *
+***************************************************************************/
+#ifndef GDBDEBUGGERGDBTABLE_H
+#define GDBDEBUGGERGDBTABLE_H
+
+#include <qtable.h>
+
+namespace GDBDebugger {
+
+class GDBTable : public QTable
+{
+Q_OBJECT
+public:
+ GDBTable(QWidget *parent = 0, const char *name = 0);
+ GDBTable( int numRows, int numCols, QWidget * parent = 0, const char * name = 0 );
+ ~GDBTable();
+
+ virtual void keyPressEvent ( QKeyEvent * e );
+
+signals:
+ void keyPressed(int key);
+
+ void returnPressed();
+ void f2Pressed();
+ void insertPressed();
+ void deletePressed();
+};
+
+}
+
+#endif
+
diff --git a/languages/cpp/debugger/hi16-action-breakpoint_add.png b/languages/cpp/debugger/hi16-action-breakpoint_add.png
new file mode 100644
index 00000000..1b41040c
--- /dev/null
+++ b/languages/cpp/debugger/hi16-action-breakpoint_add.png
Binary files differ
diff --git a/languages/cpp/debugger/hi16-action-breakpoint_delete.png b/languages/cpp/debugger/hi16-action-breakpoint_delete.png
new file mode 100644
index 00000000..c35e039f
--- /dev/null
+++ b/languages/cpp/debugger/hi16-action-breakpoint_delete.png
Binary files differ
diff --git a/languages/cpp/debugger/hi16-action-breakpoint_delete_all.png b/languages/cpp/debugger/hi16-action-breakpoint_delete_all.png
new file mode 100644
index 00000000..c35e039f
--- /dev/null
+++ b/languages/cpp/debugger/hi16-action-breakpoint_delete_all.png
Binary files differ
diff --git a/languages/cpp/debugger/hi16-action-breakpoint_edit.png b/languages/cpp/debugger/hi16-action-breakpoint_edit.png
new file mode 100644
index 00000000..ec92ced2
--- /dev/null
+++ b/languages/cpp/debugger/hi16-action-breakpoint_edit.png
Binary files differ
diff --git a/languages/cpp/debugger/kdevdebugger.desktop b/languages/cpp/debugger/kdevdebugger.desktop
new file mode 100644
index 00000000..69b5646c
--- /dev/null
+++ b/languages/cpp/debugger/kdevdebugger.desktop
@@ -0,0 +1,86 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=This plugin provides a frontend for GDB, a source-level debugger for C, C++ and more. http://sources.redhat.com/gdb/
+Comment[ca]=Aquest connector proveeix una interfície per a GDB, un depurador a nivell de codi per a C, C++ i d'altres. http://sources.redhat.com/gdb/
+Comment[da]=Dette plugin sørger for en brugerflade til GDB, en fejlretter til C, C++ og mere. http://sources.redhat.com/gdb/
+Comment[de]=Dieses Modul bietet eine Oberfläche für GDB, einen Quellcode-Debugger für C, C++ und andere Sprachen. http://sources.redhat.com/gdb/
+Comment[el]=Αυτό το Ï€Ïόσθετο Ï€ÏοσφέÏει ένα Ï€ÏόγÏαμμα για το GDB, έναν αποσφαλματωτή πηγαίου κώδικα για C, C++ και άλλες γλώσσες. http://sources.redhat.com/gdb/
+Comment[es]=Este complemento proporciona un entorno para GDB, un depurador a nivel de código para C, C++ y otros (http://sources.redhat.com/gdb/)
+Comment[et]=See plugin pakub GDB kasutajaliidest. GDB on C, C++ ja veel mitme keele lähtekoodi tasandil tegutsev siluja. http://sources.redhat.com/gdb/
+Comment[eu]=Plugin honek GDB-rako interfaze bat eskeintzen du. GDB, C eta C++-rako iturburu-mailako araztaile bat da. http://sources.redhat.com/gdb/
+Comment[fa]=این وصله پایانه‌ای برای GDB، اشکال‌زدای سطح منبع برای سی، C++ و بیشتر تولید می‌کند. http://sources.redhat.com/gdb/
+Comment[fr]=Ce module externe fournit une interface pour GDB, un débogueur au niveau source pour C, C++ et autres. http://sources.redhat.com/gdb/
+Comment[gl]=Esta extensión proporciona un frontal para GDB, un depurador a nivel de código para C, C++ e outras linguaxes. http://sources.redhat.com/gdb/
+Comment[hi]=यह पà¥à¤²à¤—इन जीडीबी के लिठफà¥à¤°à¤¨à¥à¤Ÿà¤à¤£à¥à¤¡ पà¥à¤°à¤¦à¤¾à¤¨ करता है, जो सी, सी++ तथा और भी के लिठसà¥à¤°à¥‹à¤¤-सà¥à¤¤à¤° पर डिबगर हैhttp://sources.redhat.com/gdb/
+Comment[hu]=Ez a bővítőmodul grafikus felületet biztosít a GDB nyomkövető használatához, C/C++-hoz és más nyelvekhez, forrásszinten. http://sources.redhat.com/gdb/
+Comment[is]=Þetta íforrit útvegar framhlið fyrir GDB, frumkóða-aflúsara fyrir C, C++ og fleira. http://sources.redhat.com/gdb/
+Comment[it]=Questo plugin fornisce un'interfaccia per GDB, un debugger a livello sorgente per C, C++ e altro. http://sources.redhat.com/gdb/
+Comment[ja]=ã“ã®ãƒ—ラグインã¯ã€C, C++ ãªã©ã®ã‚½ãƒ¼ã‚¹ãƒ¬ãƒ™ãƒ«ãƒ‡ãƒãƒƒã‚¬ GDB ã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã‚’æä¾›ã—ã¾ã™ã€‚http://sources.redhat.com/gdb/
+Comment[nds]=Dit Moduul stellt en Böversiet för GDB praat, en Bornkode-Fehlersöker för C, C++ un annerswat. http://sources.redhat.com/gdb/
+Comment[ne]=यो पà¥à¤²à¤—इनले C, C++ र बढीका लागि सà¥à¤°à¥‹à¤¤-तह डिबगर,GDB का लागि फà¥à¤°à¤¨à¥à¤Ÿà¤‡à¤¨à¥à¤¡ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¦à¤› । http://sources.redhat.com/gdb/
+Comment[nl]=Deze plugin biedt een grafische schil voor GDB, een broncode-debugger voor C, C++ en meer. http://sources.redhat.com/gdb/
+Comment[pl]=Ta wtyczka udostępnia interfejs do GDB, debugera poziomu źródłowego dla C, C++ i innych. http://sources.redhat.com/gdb/
+Comment[pt]=Este 'plugin' oferece uma interface para o GDB, um depurador ao nível do código para C, C++ entre outros. http://sources.redhat.com/gdb/
+Comment[pt_BR]=Este plug-in fornece um frontend para o GDB, um depurador a nível de código para C, C++ e mais. http://sources.redhat.com/gdb/
+Comment[ru]=Этот модуль предоÑтавлÑет Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ðº GDB, отладчику иÑходного кода Ð´Ð»Ñ C, C++ и других Ñзыков. http://sources.redhat.com/gdb/
+Comment[sk]=Tento modul poskytuje rozhranie pre GDB, debuger pre C, C++ a ÄalÅ¡ie. http://sources.redhat.com/gdb/
+Comment[sl]=Ta vstavek omogoÄa vmesnik za GDB, razhroÅ¡Äevalnik na ravni izvorne kode za C, C++ in veÄ. http://sourcs.redhat.com/gdb/
+Comment[sr]=Овај прикључак обезбеђује Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð·Ð° GDB, иÑправљач на нивоу изворног кода за C, C++ и више. http://sources.redhat.com/gdb/
+Comment[sr@Latn]=Ovaj prikljuÄak obezbeÄ‘uje interfejs za GDB, ispravljaÄ na nivou izvornog koda za C, C++ i viÅ¡e. http://sources.redhat.com/gdb/
+Comment[sv]=Insticksprogrammet tillhandahåller ett gränssnitt till GDB, en källkodsavlusare för C, C++ med mera. http://sources.redhat.com/gdb/
+Comment[ta]=GDB கà¯à®•à¯ இநà¯à®¤ சொரà¯à®•à¯ ஒர௠மà¯à®©à¯à®¨à®¿à®±à¯à®¤à¯à®¤à®²à¯ , C, C++ மறà¯à®±à¯à®®à¯ பலவறà¯à®±à®¿à®±à¯à®•à¯ ஒர௠மூல-நிலை டிபகà¯à®•à®°à¯
+Comment[tg]=Ин модул дар GDB интерфейÑро ба ихтиёр мегузорад, Ñозгузори код барои C, C++ ибтидоӣва барои дигар забонҳо. http://sources.redhat.com/gdb/
+Comment[tr]=Bu eklenti, C, C++ ve daha fazlası için bir kaynak-düzeyinde hata ayıklayıcı olan GDB için bir önucu sağlar. http://sources.redhat.com/gdb/
+Comment[zh_CN]=这个æ’件是一个 GDB å‰ç«¯ï¼Œä¸€ä¸ª Cã€C++ 和其它语言的æºä»£ç è°ƒè¯•å™¨ã€‚http://sources.redhat.com/gdb/
+Comment[zh_TW]=這個外掛程å¼æä¾› GDB çš„å‰ç«¯ä»‹é¢ã€‚GDB 是一個 C/C++ 還有其它語言的除錯器。http://sources.redhat.com/gdb/
+Name=KDevDebugger
+Name[da]=KDevelop Debugger
+Name[de]=Debugger (KDevelop)
+Name[hi]=के-डेव-डिबगर
+Name[nds]=KDevelop-Fehlersöker
+Name[ne]=केडीई विकास डिबगर
+Name[pl]=KDevDebuger
+Name[sk]=KDev debuger
+Name[sv]=KDevelop avlusare
+Name[ta]=கெடெவ௠டிபகà¯à®•à®°à¯
+Name[zh_TW]=KDevelop 除錯器
+GenericName=Debugger Frontend
+GenericName[ca]=Interfície per al depurador
+GenericName[da]=Fejlsøgningsbrugerflade
+GenericName[de]=Debugger-Oberfläche
+GenericName[el]=ΠÏόγÏαμμα Αποσφαλματωτή
+GenericName[es]=Entorno del depurador
+GenericName[et]=Siluja kasutajaliides
+GenericName[eu]=Araztaile-interfazea
+GenericName[fa]=پایانۀ اشکال‌زدا
+GenericName[fr]=Interface du débogueur
+GenericName[ga]=Comhéadan Dífhabhtóra
+GenericName[gl]=Frontal de depuración
+GenericName[hi]=डिबगर फà¥à¤°à¤¨à¥à¤Ÿà¤à¤£à¥à¤¡
+GenericName[hu]=Grafikus felület nyomkövetéshez
+GenericName[it]=Interfaccia al debugger
+GenericName[ja]=デãƒãƒƒã‚¬ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰
+GenericName[nds]=Fehlersöker-Böversiet
+GenericName[ne]=डिबगर फà¥à¤°à¤¨à¥à¤Ÿà¤‡à¤¨à¥à¤¡
+GenericName[nl]=Grafische schil voor debugger
+GenericName[pl]=Interfejs do debugera
+GenericName[pt]=Interface de Depuração
+GenericName[pt_BR]=Frontend do Depurador
+GenericName[ru]=Интегрированный отладчик
+GenericName[sk]=Debuger rozhranie
+GenericName[sl]=Vmesnik razhroÅ¡Äevalnika
+GenericName[sr]=Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð¸Ñправљача
+GenericName[sr@Latn]=Interfejs ispravljaÄa
+GenericName[sv]=Gränssnitt för avlusare
+GenericName[ta]=டிபகà¯à®•à®°à¯ பிரானà¯à®Ÿà®Ÿà¯
+GenericName[tg]=Интеграл ёфтани Ñозгузор
+GenericName[tr]=Hata Ayıklayıcı Önucu
+GenericName[zh_CN]=调试器å‰ç«¯
+GenericName[zh_TW]=除錯器å‰ç«¯
+Icon=debugger
+ServiceTypes=KDevelop/Plugin
+X-KDE-Library=libkdevdebugger
+X-KDevelop-Version=5
+X-KDevelop-Scope=Project
+X-KDevelop-Properties=CompiledDevelopment
diff --git a/languages/cpp/debugger/kdevdebugger.rc b/languages/cpp/debugger/kdevdebugger.rc
new file mode 100644
index 00000000..801cadb8
--- /dev/null
+++ b/languages/cpp/debugger/kdevdebugger.rc
@@ -0,0 +1,93 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevDebugger" version="11">
+<MenuBar>
+ <Menu name="debug">
+ <text>&amp;Debug</text>
+ <Action name="debug_run" group="debug"/>
+ <Action name="debug_stop" group="debug"/>
+ <Action name="debug_pause" group="debug"/>
+ <Action name="debug_runtocursor" group="debug"/>
+ <Action name="debug_jumptocursor" group="debug"/>
+ <Separator group="debug"/>
+ <Action name="debug_stepover" group="debug"/>
+ <Action name="debug_stepoverinst" group="debug"/>
+ <Action name="debug_stepinto" group="debug"/>
+ <Action name="debug_stepintoinst" group="debug"/>
+ <Action name="debug_stepout" group="debug"/>
+ <Action name="debug_restart" group="debug"/>
+ <Separator group="debug"/>
+ <Action name="debug_toggle_breakpoint" group="debug"/>
+ <Action name="debug_disable_breakpoint" group="debug"/>
+ <Separator group="debug"/>
+ <Action name="debug_memview" group="debug"/>
+ <Action name="debug_core" group="debug"/>
+ <Action name="debug_attach" group="debug"/>
+ <Separator group="debug"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="debugToolBar">
+ <text>Debugger Toolbar</text>
+ <Action name="debug_run"/>
+ <Action name="debug_restart"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepout"/>
+ <Separator/>
+ <Action name="debug_memview"/>
+ <WeakSeparator/>
+</ToolBar>
+<State name="stopped">
+ <enable>
+ <Action name="debug_run"/>
+ <Action name="debug_core"/>
+ <Action name="debug_attach"/>
+ </enable>
+ <disable>
+ <Action name="debug_stop"/>
+ <Action name="debug_pause"/>
+ <Action name="debug_runtocursor"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepoverinst"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepintoinst"/>
+ <Action name="debug_stepout"/>
+ <Action name="debug_memview"/>
+ </disable>
+</State>
+<State name="paused">
+ <enable>
+ <Action name="debug_run"/>
+ <Action name="debug_stop"/>
+ <Action name="debug_runtocursor"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepoverinst"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepintoinst"/>
+ <Action name="debug_stepout"/>
+ <Action name="debug_memview"/>
+ </enable>
+ <disable>
+ <Action name="debug_core"/>
+ <Action name="debug_attach"/>
+ </disable>
+</State>
+<State name="active">
+ <enable>
+ <Action name="debug_pause"/>
+ <Action name="debug_stop"/>
+ </enable>
+ <disable>
+ <Action name="debug_run"/>
+ <Action name="debug_runtocursor"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepoverinst"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepintoinst"/>
+ <Action name="debug_stepout"/>
+ <Action name="debug_memview"/>
+ <Action name="debug_core"/>
+ <Action name="debug_attach"/>
+ </disable>
+</State>
+</kpartgui>
+
diff --git a/languages/cpp/debugger/label_with_double_click.cpp b/languages/cpp/debugger/label_with_double_click.cpp
new file mode 100644
index 00000000..a0a2014b
--- /dev/null
+++ b/languages/cpp/debugger/label_with_double_click.cpp
@@ -0,0 +1,14 @@
+
+#include "label_with_double_click.h"
+
+LabelWithDoubleClick::LabelWithDoubleClick(const QString& s, QWidget* parent)
+: QLabel(s, parent)
+{}
+
+void LabelWithDoubleClick::mouseDoubleClickEvent(QMouseEvent*)
+{
+ emit doubleClicked();
+}
+
+
+#include "label_with_double_click.moc"
diff --git a/languages/cpp/debugger/label_with_double_click.h b/languages/cpp/debugger/label_with_double_click.h
new file mode 100644
index 00000000..11dec898
--- /dev/null
+++ b/languages/cpp/debugger/label_with_double_click.h
@@ -0,0 +1,20 @@
+
+#ifndef LABEL_WITH_DOUBLE_CLICK_HPP_VP_2006_04_04
+#define LABEL_WITH_DOUBLE_CLICK_HPP_VP_2006_04_04
+
+#include <qlabel.h>
+
+class LabelWithDoubleClick : public QLabel
+{
+ Q_OBJECT
+public:
+ LabelWithDoubleClick(const QString& s, QWidget* parent);
+
+signals:
+ void doubleClicked();
+
+protected:
+ void mouseDoubleClickEvent(QMouseEvent*);
+};
+
+#endif
diff --git a/languages/cpp/debugger/memviewdlg.cpp b/languages/cpp/debugger/memviewdlg.cpp
new file mode 100644
index 00000000..5316aa91
--- /dev/null
+++ b/languages/cpp/debugger/memviewdlg.cpp
@@ -0,0 +1,486 @@
+/***************************************************************************
+ begin : Tue Oct 5 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "memviewdlg.h"
+#include "gdbcontroller.h"
+#include "gdbcommand.h"
+
+#include <kbuttonbox.h>
+#include <klineedit.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kstdguiitem.h>
+#include <kdeversion.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qmultilineedit.h>
+#include <qpushbutton.h>
+#include <qvariant.h>
+#include <qpopupmenu.h>
+#include <qhbox.h>
+#include <qtoolbox.h>
+#include <qtextedit.h>
+
+#include <kmessagebox.h>
+
+#include <khexedit/byteseditinterface.h>
+
+#include <ctype.h>
+
+// **************************************************************************
+//
+// Dialog allows the user to enter
+// - A starting address
+// - An ending address
+//
+// this can be in the form
+// functiom/method name
+// variable address (ie &Var, str)
+// Memory address 0x8040abc
+//
+// When disassembling and you enter a method name without an
+// ending address then the whole method is disassembled.
+// No data means disassemble the method we're curently in.(from the
+// start of the method)
+//
+// click ok buton to send the request to gdb
+// the output is returned (some time later) in the raw data slot
+// and displayed as is, so it's rather crude, but it works!
+// **************************************************************************
+
+namespace GDBDebugger
+{
+ /** Container for controls that select memory range.
+
+ The memory range selection is embedded into memory view widget,
+ it's not a standalone dialog. However, we want to have easy way
+ to hide/show all controls, so we group them in this class.
+ */
+ class MemoryRangeSelector : public QWidget
+ {
+ public:
+ KLineEdit* startAddressLineEdit;
+ KLineEdit* amountLineEdit;
+ QPushButton* okButton;
+ QPushButton* cancelButton;
+
+ MemoryRangeSelector(QWidget* parent)
+ : QWidget(parent)
+ {
+ QVBoxLayout* l = new QVBoxLayout(this);
+
+ // Grid layout: labels + address field
+ QGridLayout* gl = new QGridLayout(l);
+
+ gl->setColSpacing(0, 2);
+ gl->setColSpacing(1, 4);
+ gl->setRowSpacing(1, 2);
+
+ QLabel* l1 = new QLabel(i18n("Start"), this);
+ gl->addWidget(l1, 0, 1);
+
+ startAddressLineEdit = new KLineEdit(this);
+ gl->addWidget(startAddressLineEdit, 0, 3);
+
+ QLabel* l2 = new QLabel(i18n("Amount"), this);
+ gl->addWidget(l2, 2, 1);
+
+ amountLineEdit = new KLineEdit(this);
+ gl->addWidget(amountLineEdit, 2, 3);
+
+ l->addSpacing(2);
+
+ QHBoxLayout* hb = new QHBoxLayout(l);
+ hb->addStretch();
+
+ okButton = new QPushButton(i18n("OK"), this);
+ hb->addWidget(okButton);
+
+ cancelButton = new QPushButton(i18n("Cancel"), this);
+ hb->addWidget(cancelButton);
+
+ l->addSpacing(2);
+
+ connect(startAddressLineEdit, SIGNAL(returnPressed()),
+ okButton, SLOT(animateClick()));
+
+ connect(amountLineEdit, SIGNAL(returnPressed()),
+ okButton, SLOT(animateClick()));
+ }
+ };
+
+
+
+ MemoryView::MemoryView(GDBController* controller,
+ QWidget* parent, const char* name)
+ : QWidget(parent, name),
+ controller_(controller),
+ // New memory view can be created only when debugger is active,
+ // so don't set s_appNotStarted here.
+ khexedit2_real_widget(0),
+ amount_(0), data_(0),
+ debuggerState_(0)
+ {
+ setCaption(i18n("Memory view"));
+ emit captionChanged(caption());
+
+ initWidget();
+
+ if (isOk())
+ slotEnableOrDisable();
+ }
+
+ void MemoryView::initWidget()
+ {
+ QVBoxLayout *l = new QVBoxLayout(this, 0, 0);
+
+ khexedit2_widget = KHE::createBytesEditWidget(this);
+
+ bool ok_ = false;
+
+ if (khexedit2_widget)
+ {
+ QWidget* real_widget = (QWidget*)
+ khexedit2_widget->child("BytesEdit");
+
+ if (real_widget)
+ {
+ ok_ = true;
+
+ connect(real_widget, SIGNAL(bufferChanged(int, int)),
+ this, SLOT(memoryEdited(int, int)));
+
+ khexedit2_real_widget = real_widget;
+
+ QVariant resize_style(2); // full size usage.
+ real_widget->setProperty("ResizeStyle", resize_style);
+
+ //QVariant group(8);
+ //real_widget->setProperty("StartOffset", start);
+ //real_widget->setProperty("NoOfBytesPerLine", group);
+
+ // HACK: use hardcoded constant taht should match
+ // khexedit2
+ // 3 -- binary
+ // 1 -- decimal
+ // 0 -- hex
+ //QVariant coding(3);
+ //real_widget->setProperty("Coding", coding);
+
+ //QVariant gap(32);
+ //real_widget->setProperty("BinaryGapWidth", gap);
+
+ }
+ else
+ {
+ delete khexedit2_widget;
+ }
+ }
+
+ if (ok_) {
+
+ rangeSelector_ = new MemoryRangeSelector(this);
+ l->addWidget(rangeSelector_);
+
+ connect(rangeSelector_->okButton, SIGNAL(clicked()),
+ this, SLOT(slotChangeMemoryRange()));
+
+
+ connect(rangeSelector_->cancelButton, SIGNAL(clicked()),
+ this, SLOT(slotHideRangeDialog()));
+
+ connect(rangeSelector_->startAddressLineEdit,
+ SIGNAL(textChanged(const QString&)),
+ this,
+ SLOT(slotEnableOrDisable()));
+
+ connect(rangeSelector_->amountLineEdit,
+ SIGNAL(textChanged(const QString&)),
+ this,
+ SLOT(slotEnableOrDisable()));
+
+ l->addWidget(khexedit2_widget);
+
+ } else {
+
+ QTextEdit* edit = new QTextEdit(this);
+ l->addWidget(edit);
+
+ edit->setText(
+ "<h1>Not available</h1>"
+ "<p>Could not open the khexedit2 library. "
+ "Make sure that the KHexEdit package (part of kdeutils) is installed. "
+ "Specifically, check for the following files:"
+ "<ul><li>libkhexeditcommon.so.0.0.0\n"
+ "<li>libkbyteseditwidget.so\n"
+ "<li>kbyteseditwidget.desktop\n"
+ "</ul>");
+ }
+
+ }
+
+ void MemoryView::debuggerStateChanged(int state)
+ {
+ if (isOk())
+ {
+ debuggerState_ = state;
+ slotEnableOrDisable();
+ }
+ }
+
+
+ void MemoryView::slotHideRangeDialog()
+ {
+ rangeSelector_->hide();
+ }
+
+ void MemoryView::slotChangeMemoryRange()
+ {
+ controller_->addCommand(
+ new ExpressionValueCommand(
+ rangeSelector_->amountLineEdit->text(),
+ this, &MemoryView::sizeComputed));
+ }
+
+ void MemoryView::sizeComputed(const QString& size)
+ {
+ controller_->addCommand(
+ new
+ GDBCommand(
+ QString("-data-read-memory %1 x 1 1 %2")
+ .arg(rangeSelector_->startAddressLineEdit->text())
+ .arg(size).ascii(),
+ this,
+ &MemoryView::memoryRead));
+ }
+
+ void MemoryView::memoryRead(const GDBMI::ResultRecord& r)
+ {
+ const GDBMI::Value& content = r["memory"][0]["data"];
+
+ amount_ = content.size();
+
+ startAsString_ = rangeSelector_->startAddressLineEdit->text();
+ amountAsString_ = rangeSelector_->amountLineEdit->text();
+ start_ = startAsString_.toUInt(0, 0);
+
+ setCaption(QString("%1 (%2 bytes)")
+ .arg(startAsString_).arg(amount_));
+ emit captionChanged(caption());
+
+ KHE::BytesEditInterface* bytesEditor
+ = KHE::bytesEditInterface(khexedit2_widget);
+
+ delete[] this->data_;
+ this->data_ = new char[amount_];
+ for(unsigned i = 0; i < content.size(); ++i)
+ {
+ this->data_[i] = content[i].literal().toInt(0, 16);
+ }
+
+
+ bytesEditor->setData( this->data_, amount_ );
+ bytesEditor->setReadOnly(false);
+ // Overwrite data, not insert new
+ bytesEditor->setOverwriteMode( true );
+ // Not sure this is needed, but prevent
+ // inserting new data.
+ bytesEditor->setOverwriteOnly( true );
+
+ QVariant start_v(start_);
+ khexedit2_real_widget->setProperty("FirstLineOffset", start_v);
+
+ //QVariant bsw(0);
+ //khexedit2_real_widget->setProperty("ByteSpacingWidth", bsw);
+
+ // HACK: use hardcoded constant taht should match
+ // khexedit2
+ // 3 -- binary
+ // 1 -- decimal
+ // 0 -- hex
+ //QVariant coding(1);
+ //khexedit2_real_widget->setProperty("Coding", coding);
+
+
+ slotHideRangeDialog();
+ }
+
+
+ void MemoryView::memoryEdited(int start, int end)
+ {
+ for(int i = start; i <= end; ++i)
+ {
+ controller_->addCommand(
+ new GDBCommand(
+ QString("set *(char*)(%1 + %2) = %3")
+ .arg(start_)
+ .arg(i)
+ .arg(QString::number(data_[i]))));
+ }
+ }
+
+ void MemoryView::contextMenuEvent ( QContextMenuEvent * e )
+ {
+ if (!isOk())
+ return;
+
+ QPopupMenu menu;
+
+ bool app_running = !(debuggerState_ & s_appNotStarted);
+
+ int idRange = menu.insertItem(i18n("Change memory range"));
+ // If address selector is show, 'set memory range' can't
+ // do anything more.
+ menu.setItemEnabled(idRange,
+ app_running && !rangeSelector_->isShown());
+ int idReload = menu.insertItem(i18n("Reload"));
+ // If amount is zero, it means there's not data yet, so
+ // reloading does not make sense.
+ menu.setItemEnabled(idReload, app_running && amount_ != 0);
+ int idClose = menu.insertItem(i18n("Close this view"));
+
+ int result = menu.exec(e->globalPos());
+
+ if (result == idRange)
+ {
+ rangeSelector_->startAddressLineEdit->setText(startAsString_);
+ rangeSelector_->amountLineEdit->setText(amountAsString_);
+
+ rangeSelector_->show();
+ rangeSelector_->startAddressLineEdit->setFocus();
+ }
+ if (result == idReload)
+ {
+ // We use numeric start_ and amount_ stored in this,
+ // not textual startAsString_ and amountAsString_,
+ // because program position might have changes and expressions
+ // are no longer valid.
+ controller_->addCommand(
+ new
+ GDBCommand(
+ QString("-data-read-memory %1 x 1 1 %2")
+ .arg(start_).arg(amount_).ascii(),
+ this,
+ &MemoryView::memoryRead));
+ }
+
+ if (result == idClose)
+ delete this;
+
+
+ }
+
+ bool MemoryView::isOk() const
+ {
+ return khexedit2_real_widget;
+ }
+
+ void MemoryView::slotEnableOrDisable()
+ {
+ bool app_started = !(debuggerState_ & s_appNotStarted);
+
+ bool enabled_ = app_started &&
+ !rangeSelector_->startAddressLineEdit->text().isEmpty() &&
+ !rangeSelector_->amountLineEdit->text().isEmpty();
+
+ rangeSelector_->okButton->setEnabled(enabled_);
+ }
+
+
+ ViewerWidget::ViewerWidget(GDBController* controller,
+ QWidget* parent,
+ const char* name)
+ : QWidget(parent, name),
+ controller_(controller)
+ {
+ setIcon(SmallIcon("math_brace"));
+
+ QVBoxLayout *l = new QVBoxLayout(this, 0, 0);
+
+ toolBox_ = new QToolBox(this);
+ l->addWidget(toolBox_);
+ }
+
+ void ViewerWidget::slotAddMemoryView()
+ {
+ // For unclear reasons, this call, that indirectly
+ // does
+ //
+ // mainWindow()->setViewAvailable(this)
+ // mainWindow()->raiseView(this)
+ //
+ // should be done before creating the child widget.
+ // Otherwise, the child widget won't be freely resizable --
+ // there will be not-so-small minimum size.
+ // Problem exists both with KMDI and S/IDEAL.
+
+ setViewShown(true);
+
+ MemoryView* widget = new MemoryView(controller_, this);
+ toolBox_->addItem(widget, widget->caption());
+ toolBox_->setCurrentItem(widget);
+ memoryViews_.push_back(widget);
+
+ connect(widget, SIGNAL(captionChanged(const QString&)),
+ this, SLOT(slotChildCaptionChanged(const QString&)));
+
+ connect(widget, SIGNAL(destroyed(QObject*)),
+ this, SLOT(slotChildDestroyed(QObject*)));
+ }
+
+ void ViewerWidget::slotDebuggerState(const QString&, int state)
+ {
+ for(unsigned i = 0; i < memoryViews_.size(); ++i)
+ {
+ memoryViews_[i]->debuggerStateChanged(state);
+ }
+ }
+
+ void ViewerWidget::slotChildCaptionChanged(const QString& caption)
+ {
+ const QWidget* s = static_cast<const QWidget*>(sender());
+ QWidget* ncs = const_cast<QWidget*>(s);
+ QString cap = caption;
+ // Prevent intepreting '&' as accelerator specifier.
+ cap.replace("&", "&&");
+ toolBox_->setItemLabel(toolBox_->indexOf(ncs), cap);
+ }
+
+ void ViewerWidget::slotChildDestroyed(QObject* child)
+ {
+ QValueVector<MemoryView*>::iterator i, e;
+ for(i = memoryViews_.begin(), e = memoryViews_.end(); i != e; ++i)
+ {
+ if (*i == child)
+ {
+ memoryViews_.erase(i);
+ break;
+ }
+ }
+
+ if (toolBox_->count() == 0)
+ setViewShown(false);
+ }
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+}
+
+#include "memviewdlg.moc"
diff --git a/languages/cpp/debugger/memviewdlg.h b/languages/cpp/debugger/memviewdlg.h
new file mode 100644
index 00000000..a29de924
--- /dev/null
+++ b/languages/cpp/debugger/memviewdlg.h
@@ -0,0 +1,118 @@
+/***************************************************************************
+ begin : Tue Oct 5 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _MEMVIEW_H_
+#define _MEMVIEW_H_
+
+#include "mi/gdbmi.h"
+
+#include <kdialog.h>
+
+#include <qvaluevector.h>
+
+class KLineEdit;
+class QMultiLineEdit;
+class QToolBox;
+
+namespace GDBDebugger
+{
+ class MemoryView;
+ class GDBController;
+
+ class ViewerWidget : public QWidget
+ {
+ Q_OBJECT
+ public:
+ ViewerWidget(GDBController* controller,
+ QWidget* parent, const char* name);
+
+ public slots:
+ /** Adds a new memory view to *this, initially showing
+ no data. */
+ void slotAddMemoryView();
+ /** Informs *this about change in debugger state. Should always
+ be connected to, so that *this can disable itself when
+ debugger is not running. */
+ void slotDebuggerState(const QString&, int state);
+
+ signals:
+ void setViewShown(bool shown);
+
+
+ private slots:
+ void slotChildCaptionChanged(const QString& caption);
+ void slotChildDestroyed(QObject* child);
+
+ private: // Data
+ GDBController* controller_;
+ QToolBox* toolBox_;
+ QValueVector<MemoryView*> memoryViews_;
+ };
+
+ class MemoryView : public QWidget
+ {
+ Q_OBJECT
+ public:
+ MemoryView(GDBController* controller,
+ QWidget* parent, const char* name = 0);
+
+ void debuggerStateChanged(int state);
+
+ signals:
+ void captionChanged(const QString& caption);
+
+ private: // Callbacks
+ void sizeComputed(const QString& value);
+
+ void memoryRead(const GDBMI::ResultRecord& r);
+
+ private slots:
+ void memoryEdited(int start, int end);
+
+ private:
+ // Returns true is we successfully created the hexeditor, and so
+ // can work.
+ bool isOk() const;
+
+
+
+ private slots:
+ /** Invoked when user has changed memory range.
+ Gets memory for the new range. */
+ void slotChangeMemoryRange();
+ void slotHideRangeDialog();
+ void slotEnableOrDisable();
+
+ private: // QWidget overrides
+ void contextMenuEvent(QContextMenuEvent* e);
+
+ private:
+ void initWidget();
+
+ private:
+ GDBController* controller_;
+ class MemoryRangeSelector* rangeSelector_;
+ QWidget* khexedit2_widget;
+ QWidget* khexedit2_real_widget;
+
+ uint start_, amount_;
+ QString startAsString_, amountAsString_;
+ char* data_;
+
+ int debuggerState_;
+ };
+}
+
+#endif
diff --git a/languages/cpp/debugger/mi/Makefile.am b/languages/cpp/debugger/mi/Makefile.am
new file mode 100644
index 00000000..d6cdf5f7
--- /dev/null
+++ b/languages/cpp/debugger/mi/Makefile.am
@@ -0,0 +1,12 @@
+
+# We need exceptions since they are used to report all MI access errors.
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+
+METASOURCES = AUTO
+INCLUDES = $(all_includes)
+
+lib_LTLIBRARIES = libgdbmi_parser.la
+libgdbmi_parser_la_LDFLAGS = $(all_libraries)
+libgdbmi_parser_la_LIBADD = $(LIB_QT)
+libgdbmi_parser_la_SOURCES = gdbmi.cpp miparser.cpp milexer.cpp
+
diff --git a/languages/cpp/debugger/mi/gdbmi.cpp b/languages/cpp/debugger/mi/gdbmi.cpp
new file mode 100644
index 00000000..534a0cad
--- /dev/null
+++ b/languages/cpp/debugger/mi/gdbmi.cpp
@@ -0,0 +1,128 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * Copyright (C) 2005-2006 by Vladimir Prus *
+ * ghost@cs.msu.su *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "gdbmi.h"
+
+using namespace GDBMI;
+
+
+type_error::type_error()
+: std::logic_error("MI type error")
+{}
+
+QString Value::literal() const
+{
+ throw type_error();
+}
+
+int Value::toInt(int /*base*/) const
+{
+ throw type_error();
+}
+
+bool Value::hasField(const QString&) const
+{
+ throw type_error();
+}
+
+const Value& Value::operator[](const QString&) const
+{
+ throw type_error();
+}
+
+bool Value::empty() const
+{
+ throw type_error();
+}
+
+unsigned Value::size() const
+{
+ throw type_error();
+}
+
+
+const Value& Value::operator[](unsigned) const
+{
+ throw type_error();
+}
+
+QString StringLiteralValue::literal() const
+{
+ return literal_;
+}
+
+int StringLiteralValue::toInt(int base) const
+{
+ bool ok;
+ int result = literal_.toInt(&ok, base);
+ if (!ok)
+ throw type_error();
+ return result;
+}
+
+TupleValue::~TupleValue()
+{
+ for (QValueListIterator<Result*> it=results.begin(); it!=results.end(); ++it)
+ delete *it;
+}
+
+bool TupleValue::hasField(const QString& variable) const
+{
+ return results_by_name.count(variable);
+}
+
+const Value& TupleValue::operator[](const QString& variable) const
+{
+ if (results_by_name.count(variable))
+ return *results_by_name[variable]->value;
+ else
+ throw type_error();
+}
+
+ListValue::~ListValue()
+{
+ for (QValueListIterator<Result*> it=results.begin(); it!=results.end(); ++it)
+ delete *it;
+}
+
+bool ListValue::empty() const
+{
+ return results.isEmpty();
+}
+
+unsigned ListValue::size() const
+{
+ return results.size();
+}
+
+const Value& ListValue::operator[](unsigned index) const
+{
+ if (index < results.size())
+ {
+ return *results[index]->value;
+ }
+ else
+ throw type_error();
+}
+
+
+
+
diff --git a/languages/cpp/debugger/mi/gdbmi.h b/languages/cpp/debugger/mi/gdbmi.h
new file mode 100644
index 00000000..7a193e91
--- /dev/null
+++ b/languages/cpp/debugger/mi/gdbmi.h
@@ -0,0 +1,221 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * Copyright (C) 2005-2006 by Vladimir Prus *
+ * ghost@cs.msu.su *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef GDBMI_H
+#define GDBMI_H
+
+#include <qstring.h>
+#include <qvaluelist.h>
+#include <qmap.h>
+
+#include <stdexcept>
+
+/**
+@author Roberto Raggi
+@author Vladimir Prus
+*/
+namespace GDBMI
+{
+ /** Exception that is thrown when we're trying to invoke an
+ operation that is not supported by specific MI value. For
+ example, trying to index a string literal.
+
+ Such errors are conceptually the same as assert, but in GUI
+ we can't use regular assert, and Q_ASSERT, which only prints
+ a message, is not suitable either. We need to break processing,
+ and the higher-level code can report "Internal parsing error",
+ or something.
+
+ Being glorified assert, this exception does not cary any
+ useful information.
+ */
+ class type_error : public std::logic_error
+ {
+ public:
+ type_error();
+ };
+
+ /** Base class for all MI values.
+ MI values are of three kinds:
+ - String literals
+ - Lists (indexed by integer)
+ - Tuple (set of named values, indexed by name)
+
+ The structure of response to a specific gdb command is fixed.
+ While any tuples in response may omit certain named fields, the
+ kind of each item never changes. That is, response to specific
+ command can't contains sometimes string and sometimes tuple in
+ specific position.
+
+ Because of that static structure, it's almost never needed to query
+ dynamic type of a MI value. Most often we know it's say, tuple, and
+ can subscripts it.
+
+ So, the Value class has methods for accessing all kinds of values.
+ Attempting to call a method that is not applicable to specific value
+ will result in exception. The client code will almost never need to
+ cast from 'Value' to its derived classes.
+
+ Note also that all methods in this class are const and return
+ const Value&. That's by design -- there's no need to modify gdb
+ responses in GUI.
+ */
+ struct Value
+ {
+ Value() {}
+ private: // Copy disabled to prevent slicing.
+ Value(const Value&);
+ Value& operator=(const Value&);
+
+ public:
+
+ virtual ~Value() {}
+
+ enum { StringLiteral, Tuple, List } kind;
+
+ /** If this value is a string literals, returns the string value.
+ Othewise, throws type_error.
+ */
+ virtual QString literal() const;
+
+ /** If the value is a string literal, converts it to int and
+ returns. If conversion fails, or the value cannot be
+ converted to int, throws type_error.
+ */
+ virtual int toInt(int base = 10) const;
+
+ /** If this value is a tuple, returns true if the tuple
+ has a field named 'variable'. Otherwise,
+ throws type_error.
+ */
+ virtual bool hasField(const QString& variable) const;
+
+ /** If this value is a tuple, and contains named field 'variable',
+ returns it. Otherwise, throws 'type_error'.
+ This method is virtual, and derived in base class, so that
+ we can save on casting, when we know for sure that instance
+ is TupleValue, or ListValue.
+ */
+ virtual const Value& operator[](const QString& variable) const;
+
+ /** If this value is a list, returns true if the list is empty.
+ If this value is not a list, throws 'type_error'.
+ */
+ virtual bool empty() const;
+
+ /** If this value is a list, returns it's size.
+ Otherwise, throws 'type_error'.
+ */
+ virtual unsigned size() const;
+
+ /** If this value is a list, returns the element at
+ 'index'. Otherwise, throws 'type_error'.
+ */
+ virtual const Value& operator[](unsigned index) const;
+ };
+
+ /** @internal
+ Internal class to represent name-value pair in tuples.
+ */
+ struct Result
+ {
+ Result() : value(0) {}
+ ~Result() { delete value; value = 0; }
+
+ QString variable;
+ Value *value;
+ };
+
+ struct StringLiteralValue : public Value
+ {
+ StringLiteralValue(const QString &lit)
+ : literal_(lit) { Value::kind = StringLiteral; }
+
+ public: // Value overrides
+
+ QString literal() const;
+ int toInt(int base) const;
+
+ private:
+ QString literal_;
+ };
+
+ struct TupleValue : public Value
+ {
+ TupleValue() { Value::kind = Tuple; }
+ ~TupleValue();
+
+ bool hasField(const QString&) const;
+ const Value& operator[](const QString& variable) const;
+
+
+ QValueList<Result*> results;
+ QMap<QString, GDBMI::Result*> results_by_name;
+ };
+
+ struct ListValue : public Value
+ {
+ ListValue() { Value::kind = List; }
+ ~ListValue();
+
+ bool empty() const;
+
+ unsigned size() const;
+
+ const Value& operator[](unsigned index) const;
+
+ QValueList<Result*> results;
+
+ };
+
+ struct Record
+ {
+ virtual ~Record() {}
+ virtual QString toString() const { Q_ASSERT( 0 ); return QString::null; }
+
+ enum { Prompt, Stream, Result } kind;
+ };
+
+ struct ResultRecord : public Record, public TupleValue
+ {
+ ResultRecord() { Record::kind = Result; }
+
+ QString reason;
+ };
+
+ struct PromptRecord : public Record
+ {
+ inline PromptRecord() { Record::kind = Prompt; }
+
+ virtual QString toString() const
+ { return "(prompt)\n"; }
+ };
+
+ struct StreamRecord : public Record
+ {
+ inline StreamRecord() : reason(0) { Record::kind = Stream; }
+
+ char reason;
+ QString message;
+ };
+}
+
+#endif
diff --git a/languages/cpp/debugger/mi/milexer.cpp b/languages/cpp/debugger/mi/milexer.cpp
new file mode 100644
index 00000000..ecf18373
--- /dev/null
+++ b/languages/cpp/debugger/mi/milexer.cpp
@@ -0,0 +1,290 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+
+#include "milexer.h"
+#include "tokens.h"
+#include <cctype>
+#include <iostream>
+
+bool MILexer::s_initialized = false;
+scan_fun_ptr MILexer::s_scan_table[];
+
+
+MILexer::MILexer()
+{
+ if (!s_initialized)
+ setupScanTable();
+}
+
+MILexer::~MILexer()
+{
+}
+
+void MILexer::setupScanTable()
+{
+ s_initialized = true;
+
+ for (int i=0; i<128; ++i) {
+ switch (i) {
+ case '\n':
+ s_scan_table[i] = &MILexer::scanNewline;
+ break;
+
+ case '"':
+ s_scan_table[i] = &MILexer::scanStringLiteral;
+ break;
+
+ default:
+ if (isspace(i))
+ s_scan_table[i] = &MILexer::scanWhiteSpaces;
+ else if (isalpha(i) || i == '_')
+ s_scan_table[i] = &MILexer::scanIdentifier;
+ else if (isdigit(i))
+ s_scan_table[i] = &MILexer::scanNumberLiteral;
+ else
+ s_scan_table[i] = &MILexer::scanChar;
+ }
+ }
+
+ s_scan_table[128] = &MILexer::scanUnicodeChar;
+}
+
+/*
+
+ m_firstToken = m_tokens.data();
+ m_currentToken = 0;
+
+ m_firstToken = m_tokens.data();
+ m_currentToken = m_firstToken;
+ */
+
+TokenStream *MILexer::tokenize(const FileSymbol *fileSymbol)
+{
+ m_tokensCount = 0;
+ m_tokens.resize(64);
+
+ m_contents = fileSymbol->contents;
+ m_length = m_contents.length();
+ m_ptr = 0;
+
+ m_lines.resize(8);
+ m_line = 0;
+
+ m_lines[m_line++] = 0;
+
+ m_cursor = 0;
+
+ // tokenize
+ int pos, len;
+
+ for (;;) {
+ if (m_tokensCount == (int)m_tokens.size())
+ m_tokens.resize(m_tokensCount * 2);
+
+ Token &tk = m_tokens[m_tokensCount++];
+ tk.kind = nextToken(pos, len);
+ tk.position = pos;
+ tk.length = len;
+
+ if (tk.kind == 0)
+ break;
+ }
+
+ TokenStream *tokenStream = new TokenStream;
+ tokenStream->m_contents = m_contents;
+
+ tokenStream->m_lines = m_lines;
+ tokenStream->m_line = m_line;
+
+ tokenStream->m_tokens = m_tokens;
+ tokenStream->m_tokensCount = m_tokensCount;
+
+ tokenStream->m_firstToken = tokenStream->m_tokens.data();
+ tokenStream->m_currentToken = tokenStream->m_firstToken;;
+
+ tokenStream->m_cursor = m_cursor;
+
+ return tokenStream;
+}
+
+int MILexer::nextToken(int &pos, int &len)
+{
+ int start = 0;
+ int kind = 0;
+ unsigned char ch = 0;
+
+ while (m_ptr < m_length) {
+ start = m_ptr;
+
+ ch = (unsigned char)m_contents[m_ptr];
+ (this->*s_scan_table[ch < 128 ? ch : 128])(&kind);
+
+ switch (kind) {
+ case Token_whitespaces:
+ case '\n':
+ break;
+
+ default:
+ pos = start;
+ len = m_ptr - start;
+ return kind;
+ }
+
+ if (kind == 0)
+ break;
+ }
+
+ return 0;
+}
+
+void MILexer::scanChar(int *kind)
+{
+ *kind = m_contents[m_ptr++];
+}
+
+void MILexer::scanWhiteSpaces(int *kind)
+{
+ *kind = Token_whitespaces;
+
+ char ch;
+ while (m_ptr < m_length) {
+ ch = m_contents[m_ptr];
+ if (!(isspace(ch) && ch != '\n'))
+ break;
+
+ ++m_ptr;
+ }
+}
+
+void MILexer::scanNewline(int *kind)
+{
+ if (m_line == (int)m_lines.size())
+ m_lines.resize(m_lines.size() * 2);
+
+ if (m_lines.at(m_line) < m_ptr)
+ m_lines[m_line++] = m_ptr;
+
+ *kind = m_contents[m_ptr++];
+}
+
+void MILexer::scanUnicodeChar(int *kind)
+{
+ *kind = m_contents[m_ptr++];
+}
+
+void MILexer::scanStringLiteral(int *kind)
+{
+ ++m_ptr;
+ while (char c = m_contents[m_ptr]) {
+ switch (c) {
+ case '\n':
+ // ### error
+ *kind = Token_string_literal;
+ return;
+ case '\\':
+ {
+ char next = m_contents.at(m_ptr+1);
+ if (next == '"' || next == '\\')
+ m_ptr += 2;
+ else
+ ++m_ptr;
+ }
+ break;
+ case '"':
+ ++m_ptr;
+ *kind = Token_string_literal;
+ return;
+ default:
+ ++m_ptr;
+ break;
+ }
+ }
+
+ // ### error
+ *kind = Token_string_literal;
+}
+
+void MILexer::scanIdentifier(int *kind)
+{
+ char ch;
+ while (m_ptr < m_length) {
+ ch = m_contents[m_ptr];
+ if (!(isalnum(ch) || ch == '-' || ch == '_'))
+ break;
+
+ ++m_ptr;
+ }
+
+ *kind = Token_identifier;
+}
+
+void MILexer::scanNumberLiteral(int *kind)
+{
+ char ch;
+ while (m_ptr < m_length) {
+ ch = m_contents[m_ptr];
+ if (!(isalnum(ch) || ch == '.'))
+ break;
+
+ ++m_ptr;
+ }
+
+ // ### finish to implement me!!
+ *kind = Token_number_literal;
+}
+
+void TokenStream::positionAt(int position, int *line, int *column) const
+{
+ if (!(line && column && !m_lines.isEmpty()))
+ return;
+
+ int first = 0;
+ int len = m_line;
+ int half;
+ int middle;
+
+ while (len > 0) {
+ half = len >> 1;
+ middle = first;
+
+ middle += half;
+
+ if (m_lines[middle] < position) {
+ first = middle;
+ ++first;
+ len = len - half - 1;
+ }
+ else
+ len = half;
+ }
+
+ *line = QMAX(first - 1, 0);
+ *column = position - m_lines.at(*line);
+
+ Q_ASSERT( *column >= 0 );
+}
+
+QCString TokenStream::tokenText(int index) const
+{
+ Token *t = index < 0 ? m_currentToken : m_firstToken + index;
+ const char* data = m_contents;
+ return QCString(data + t->position, t->length+1);
+}
+
diff --git a/languages/cpp/debugger/mi/milexer.h b/languages/cpp/debugger/mi/milexer.h
new file mode 100644
index 00000000..bc0deead
--- /dev/null
+++ b/languages/cpp/debugger/mi/milexer.h
@@ -0,0 +1,147 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef MILEXER_H
+#define MILEXER_H
+
+#include <qmemarray.h>
+#include <qmap.h>
+#include <qstring.h>
+
+class MILexer;
+class TokenStream;
+
+typedef void (MILexer::*scan_fun_ptr)(int *kind);
+
+struct Token
+{
+ int kind;
+ int position;
+ int length;
+};
+
+struct FileSymbol
+{
+ QCString contents;
+ TokenStream *tokenStream;
+
+ inline FileSymbol()
+ : tokenStream(0) {}
+
+ inline ~FileSymbol();
+};
+
+struct TokenStream
+{
+ inline int lookAhead(int n = 0) const
+ { return (m_currentToken + n)->kind; }
+
+ inline int currentToken() const
+ { return m_currentToken->kind; }
+
+ inline QCString currentTokenText() const
+ { return tokenText(-1); }
+
+ QCString tokenText(int index = 0) const;
+
+ inline int lineOffset(int line) const
+ { return m_lines.at(line); }
+
+ void positionAt(int position, int *line, int *column) const;
+
+ inline void getTokenStartPosition(int index, int *line, int *column) const
+ { positionAt((m_firstToken + index)->position, line, column); }
+
+ inline void getTokenEndPosition(int index, int *line, int *column) const
+ {
+ Token *tk = m_firstToken + index;
+ positionAt(tk->position + tk->length, line, column);
+ }
+
+ inline void rewind(int index)
+ { m_currentToken = m_firstToken + index; }
+
+ inline int cursor() const
+ { return m_currentToken - m_firstToken; }
+
+ inline void nextToken()
+ { m_currentToken++; m_cursor++; }
+
+//private:
+ QCString m_contents;
+
+ QMemArray<int> m_lines;
+ int m_line;
+
+ QMemArray<Token> m_tokens;
+ int m_tokensCount;
+
+ Token *m_firstToken;
+ Token *m_currentToken;
+
+ int m_cursor;
+};
+
+class MILexer
+{
+public:
+ MILexer();
+ ~MILexer();
+
+ TokenStream *tokenize(const FileSymbol *fileSymbol);
+
+private:
+ int nextToken(int &position, int &len);
+
+ void scanChar(int *kind);
+ void scanUnicodeChar(int *kind);
+ void scanNewline(int *kind);
+ void scanWhiteSpaces(int *kind);
+ void scanStringLiteral(int *kind);
+ void scanNumberLiteral(int *kind);
+ void scanIdentifier(int *kind);
+
+ void setupScanTable();
+
+private:
+ static bool s_initialized;
+ static scan_fun_ptr s_scan_table[128 + 1];
+
+ QCString m_contents;
+ int m_ptr;
+ // Cached 'm_contents.length()'
+ int m_length;
+
+ QMemArray<int> m_lines;
+ int m_line;
+
+ QMemArray<Token> m_tokens;
+ int m_tokensCount;
+
+ int m_cursor;
+};
+
+inline FileSymbol::~FileSymbol()
+{
+ delete tokenStream;
+ tokenStream = 0;
+}
+
+
+#endif
diff --git a/languages/cpp/debugger/mi/miparser.cpp b/languages/cpp/debugger/mi/miparser.cpp
new file mode 100644
index 00000000..876bfa47
--- /dev/null
+++ b/languages/cpp/debugger/mi/miparser.cpp
@@ -0,0 +1,345 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * Copyright (C) 2005-2006 by Vladimir Prus *
+ * ghost@cs.msu.su *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "miparser.h"
+#include "tokens.h"
+#include <memory>
+
+using namespace GDBMI;
+
+#define MATCH(tok) \
+ do { \
+ if (lex->lookAhead(0) != (tok)) \
+ return false; \
+ } while (0)
+
+#define ADVANCE(tok) \
+ do { \
+ MATCH(tok); \
+ lex->nextToken(); \
+ } while (0)
+
+MIParser::MIParser()
+ : lex(0)
+{
+}
+
+MIParser::~MIParser()
+{
+}
+
+Record *MIParser::parse(FileSymbol *file)
+{
+ lex = 0;
+
+ Record *record = 0;
+
+ TokenStream *tokenStream = lexer.tokenize(file);
+ if (!tokenStream)
+ return false;
+
+ lex = file->tokenStream = tokenStream;
+
+ switch (lex->lookAhead()) {
+ case '~':
+ case '@':
+ case '&':
+ parseStreamRecord(record);
+ break;
+ case '(':
+ parsePrompt(record);
+ break;
+ case '^':
+ parseResultRecord(record);
+ break;
+ case '*':
+ // Same as result, only differs in start
+ // marker.
+ parseResultRecord(record);
+ break;
+ default:
+ break;
+ }
+
+ return record;
+}
+
+bool MIParser::parsePrompt(Record *&record)
+{
+ ADVANCE('(');
+ MATCH(Token_identifier);
+ if (lex->currentTokenText() != "gdb")
+ return false;
+ lex->nextToken();
+ ADVANCE(')');
+
+ record = new PromptRecord;
+ return true;
+}
+
+bool MIParser::parseStreamRecord(Record *&record)
+{
+ std::auto_ptr<StreamRecord> stream(new StreamRecord);
+
+ switch (lex->lookAhead()) {
+ case '~':
+ case '@':
+ case '&': {
+ stream->reason = lex->lookAhead();
+ lex->nextToken();
+ MATCH(Token_string_literal);
+ stream->message = parseStringLiteral();
+ record = stream.release();
+ }
+ return true;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+bool MIParser::parseResultRecord(Record *&record)
+{
+ if (lex->lookAhead() != '^' && lex->lookAhead() != '*')
+ return false;
+ lex->nextToken();
+
+ MATCH(Token_identifier);
+ QString reason = lex->currentTokenText();
+ lex->nextToken();
+
+ std::auto_ptr<ResultRecord> res(new ResultRecord);
+ res->reason = reason;
+
+ if (lex->lookAhead() != ',') {
+ record = res.release();
+ return true;
+ }
+
+ lex->nextToken();
+
+ if (!parseCSV(*res))
+ return false;
+
+ record = res.release();
+ return true;
+}
+
+bool MIParser::parseResult(Result *&result)
+{
+ MATCH(Token_identifier);
+ QString variable = lex->currentTokenText();
+ lex->nextToken();
+
+ std::auto_ptr<Result> res(new Result);
+ res->variable = variable;
+
+ if (lex->lookAhead() != '=')
+ return true;
+
+ lex->nextToken();
+
+ Value *value = 0;
+ if (!parseValue(value))
+ return false;
+
+ res->value = value;
+ result = res.release();
+
+ return true;
+}
+
+bool MIParser::parseValue(Value *&value)
+{
+ value = 0;
+
+ switch (lex->lookAhead()) {
+ case Token_string_literal: {
+ value = new StringLiteralValue(parseStringLiteral());
+ }
+ return true;
+
+ case '{':
+ return parseTuple(value);
+
+ case '[':
+ return parseList(value);
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+bool MIParser::parseTuple(Value *&value)
+{
+ TupleValue* val;
+
+ if (!parseCSV(&val, '{', '}'))
+ return false;
+
+ value = val;
+ return true;
+}
+
+bool MIParser::parseList(Value *&value)
+{
+ ADVANCE('[');
+
+ std::auto_ptr<ListValue> lst(new ListValue);
+
+ // Note: can't use parseCSV here because of nested
+ // "is this Value or Result" guessing. Too lazy to factor
+ // that out too using function pointers.
+ int tok = lex->lookAhead();
+ while (tok && tok != ']') {
+ Result *result = 0;
+ Value *val = 0;
+
+ if (tok == Token_identifier)
+ {
+ if (!parseResult(result))
+ return false;
+ }
+ else if (!parseValue(val))
+ return false;
+
+ Q_ASSERT(result || val);
+
+ if (!result) {
+ result = new Result;
+ result->value = val;
+ }
+ lst->results.append(result);
+
+ if (lex->lookAhead() == ',')
+ lex->nextToken();
+
+ tok = lex->lookAhead();
+ }
+ ADVANCE(']');
+
+ value = lst.release();
+
+ return true;
+}
+
+bool MIParser::parseCSV(TupleValue** value,
+ char start, char end)
+{
+ std::auto_ptr<TupleValue> tuple(new TupleValue);
+
+ if (!parseCSV(*tuple, start, end))
+ return false;
+
+ *value = tuple.get();
+ tuple.release();
+ return true;
+}
+
+bool MIParser::parseCSV(GDBMI::TupleValue& value,
+ char start, char end)
+{
+ if (start)
+ ADVANCE(start);
+
+ int tok = lex->lookAhead();
+ while (tok) {
+ if (end && tok == end)
+ break;
+
+ Result *result;
+ if (!parseResult(result))
+ return false;
+
+ value.results.append(result);
+ value.results_by_name.insert(result->variable, result);
+
+ if (lex->lookAhead() == ',')
+ lex->nextToken();
+
+ tok = lex->lookAhead();
+ }
+
+ if (end)
+ ADVANCE(end);
+
+ return true;
+}
+
+
+QString MIParser::parseStringLiteral()
+{
+ QCString message = lex->currentTokenText();
+
+ unsigned int length = message.length();
+ QString message2;
+ message2.setLength(length);
+ // The [1,length-1] range removes quotes without extra
+ // call to 'mid'
+ unsigned target_index = 0;
+ for(unsigned i = 1, e = length-1; i != e; ++i)
+ {
+ int translated = -1;
+ if (message[i] == '\\')
+ {
+ if (i+1 < length)
+ {
+ // TODO: implement all the other escapes, maybe
+ if (message[i+1] == 'n')
+ {
+ translated = '\n';
+ }
+ else if (message[i+1] == '\\')
+ {
+ translated = '\\';
+ }
+ else if (message[i+1] == '"')
+ {
+ translated = '"';
+ }
+ else if (message[i+1] == 't')
+ {
+ translated = '\t';
+ }
+
+ }
+ }
+
+ if (translated != -1)
+ {
+ message2[target_index++] = (char)translated;
+ ++i;
+ }
+ else
+ {
+ message2[target_index++] = message[i];
+ }
+ }
+ message2.setLength(target_index);
+
+ lex->nextToken();
+ return message2;
+}
+
diff --git a/languages/cpp/debugger/mi/miparser.h b/languages/cpp/debugger/mi/miparser.h
new file mode 100644
index 00000000..524dba7c
--- /dev/null
+++ b/languages/cpp/debugger/mi/miparser.h
@@ -0,0 +1,82 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef MIPARSER_H
+#define MIPARSER_H
+
+#include "milexer.h"
+#include "gdbmi.h"
+
+#include <qstring.h>
+#include <qvaluelist.h>
+
+/**
+@author Roberto Raggi
+*/
+class MIParser
+{
+public:
+ MIParser();
+ ~MIParser();
+
+ GDBMI::Record *parse(FileSymbol *file);
+
+protected: // rules
+ bool parseResultRecord(GDBMI::Record *&record);
+ bool parsePrompt(GDBMI::Record *&record);
+ bool parseStreamRecord(GDBMI::Record *&record);
+
+ bool parseResult(GDBMI::Result *&result);
+ bool parseValue(GDBMI::Value *&value);
+ bool parseTuple(GDBMI::Value *&value);
+ bool parseList(GDBMI::Value *&value);
+
+ /** Creates new TupleValue object, writes its address
+ into *value, parses a comma-separated set of values,
+ and adds each new value into (*value)->results.
+ If 'start' and 'end' are not zero, they specify
+ start and end delimiter of the list.
+ Parsing stops when we see 'end' character, or, if
+ 'end' is zero, at the end of input.
+ */
+ bool parseCSV(GDBMI::TupleValue** value,
+ char start = 0, char end = 0);
+
+ /** @overload
+ Same as above, but writes into existing tuple.
+ */
+ bool parseCSV(GDBMI::TupleValue& value,
+ char start = 0, char end = 0);
+
+
+ /** Parses a string literal and returns it. Advances
+ the lexer past the literal. Processes C escape sequences
+ in the string.
+ @pre lex->lookAhead(0) == Token_string_literal
+ */
+ QString parseStringLiteral();
+
+
+
+private:
+ MILexer lexer;
+ TokenStream *lex;
+};
+
+#endif
diff --git a/languages/cpp/debugger/mi/tokens.h b/languages/cpp/debugger/mi/tokens.h
new file mode 100644
index 00000000..c9ab283d
--- /dev/null
+++ b/languages/cpp/debugger/mi/tokens.h
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+
+#ifndef TOKENS_H
+#define TOKENS_H
+
+enum Type
+{
+ Token_eof = 0,
+ Token_identifier = 1000,
+ Token_number_literal,
+ Token_string_literal,
+ Token_whitespaces
+};
+
+#endif
+
diff --git a/languages/cpp/debugger/stty.cpp b/languages/cpp/debugger/stty.cpp
new file mode 100644
index 00000000..f0bc2627
--- /dev/null
+++ b/languages/cpp/debugger/stty.cpp
@@ -0,0 +1,386 @@
+/***************************************************************************
+ begin : Mon Sep 13 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ This code was originally written by Judin Maxim, from the
+ KDEStudio project.
+
+ It was then updated with later code from konsole (KDE).
+
+ It has also been enhanced with an idea from the code in kdbg
+ written by Johannes Sixt<Johannes.Sixt@telecom.at>
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef __osf__
+#define _XOPEN_SOURCE_EXTENDED
+#define O_NDELAY O_NONBLOCK
+#endif
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#ifdef HAVE_SYS_STROPTS_H
+#include <sys/stropts.h>
+#define _NEW_TTY_CTRL
+#endif
+
+#include <assert.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <termios.h>
+#include <time.h>
+#include <unistd.h>
+#include <errno.h>
+
+#if defined (_HPUX_SOURCE)
+#define _TERMIOS_INCLUDED
+#include <bsdtty.h>
+#endif
+
+#include <qintdict.h>
+#include <qsocketnotifier.h>
+#include <qstring.h>
+#include <qfile.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kapplication.h>
+
+#include "stty.h"
+
+#define PTY_FILENO 3
+#define BASE_CHOWN "konsole_grantpty"
+
+namespace GDBDebugger
+{
+
+static int chownpty(int fd, int grant)
+// param fd: the fd of a master pty.
+// param grant: 1 to grant, 0 to revoke
+// returns 1 on success 0 on fail
+{
+ void(*tmp)(int) = signal(SIGCHLD,SIG_DFL);
+ pid_t pid = fork();
+ if (pid < 0) {
+ signal(SIGCHLD,tmp);
+ return 0;
+ }
+ if (pid == 0) {
+ /* We pass the master pseudo terminal as file descriptor PTY_FILENO. */
+ if (fd != PTY_FILENO && dup2(fd, PTY_FILENO) < 0)
+ ::exit(1);
+
+ QString path = locate("exe", BASE_CHOWN);
+ execle(QFile::encodeName(path), BASE_CHOWN, grant?"--grant":"--revoke", (void *)0, NULL);
+ ::exit(1); // should not be reached
+ }
+ if (pid > 0) {
+ int w;
+ // retry:
+ int rc = waitpid (pid, &w, 0);
+ if (rc != pid)
+ ::exit(1);
+
+ // { // signal from other child, behave like catchChild.
+ // // guess this gives quite some control chaos...
+ // Shell* sh = shells.find(rc);
+ // if (sh) { shells.remove(rc); sh->doneShell(w); }
+ // goto retry;
+ // }
+ signal(SIGCHLD,tmp);
+ return (rc != -1 && WIFEXITED(w) && WEXITSTATUS(w) == 0);
+ }
+ signal(SIGCHLD,tmp);
+ return 0; //dummy.
+}
+
+// **************************************************************************
+
+STTY::STTY(bool ext, const QString &termAppName)
+ : QObject(),
+ out(0),
+ ttySlave(""),
+ pid_(0),
+ external_(ext)
+{
+ if (ext) {
+ findExternalTTY(termAppName);
+ } else {
+ fout = findTTY();
+ if (fout >= 0) {
+ ttySlave = QString(tty_slave);
+ out = new QSocketNotifier(fout, QSocketNotifier::Read, this);
+ connect( out, SIGNAL(activated(int)), this, SLOT(OutReceived(int)) );
+ }
+ }
+}
+
+// **************************************************************************
+
+STTY::~STTY()
+{
+ if (pid_)
+ ::kill(pid_, SIGTERM);
+
+ if (out) {
+ ::close(fout);
+ delete out;
+ }
+}
+
+// **************************************************************************
+
+int STTY::findTTY()
+{
+ int ptyfd = -1;
+ bool needGrantPty = TRUE;
+
+ // Find a master pty that we can open ////////////////////////////////
+
+#ifdef __sgi__
+ ptyfd = open("/dev/ptmx",O_RDWR);
+ if (ptyfd < 0) {
+ perror("Can't open a pseudo teletype");
+ return(-1);
+ }
+ strncpy(tty_slave, ptsname(ptyfd), 50);
+ grantpt(ptyfd);
+ unlockpt(ptyfd);
+ needGrantPty = FALSE;
+#endif
+
+ // first we try UNIX PTY's
+#ifdef TIOCGPTN
+ strcpy(pty_master,"/dev/ptmx");
+ strcpy(tty_slave,"/dev/pts/");
+ ptyfd = open(pty_master,O_RDWR);
+ if (ptyfd >= 0) { // got the master pty
+ int ptyno;
+ if (ioctl(ptyfd, TIOCGPTN, &ptyno) == 0) {
+ struct stat sbuf;
+ sprintf(tty_slave,"/dev/pts/%d",ptyno);
+ if (stat(tty_slave,&sbuf) == 0 && S_ISCHR(sbuf.st_mode))
+ needGrantPty = FALSE;
+ else {
+ close(ptyfd);
+ ptyfd = -1;
+ }
+ } else {
+ close(ptyfd);
+ ptyfd = -1;
+ }
+ }
+#endif
+
+#if defined(_SCO_DS) || defined(__USLC__) /* SCO OSr5 and UnixWare */
+ if (ptyfd < 0) {
+ for (int idx = 0; idx < 256; idx++)
+ { sprintf(pty_master, "/dev/ptyp%d", idx);
+ sprintf(tty_slave, "/dev/ttyp%d", idx);
+ if (access(tty_slave, F_OK) < 0) { idx = 256; break; }
+ if ((ptyfd = open (pty_master, O_RDWR)) >= 0)
+ { if (access (tty_slave, R_OK|W_OK) == 0) break;
+ close(ptyfd); ptyfd = -1;
+ }
+ }
+ }
+#endif
+ if (ptyfd < 0) { /// \FIXME Linux, Trouble on other systems?
+ for (const char* s3 = "pqrstuvwxyzabcde"; *s3 != 0; s3++) {
+ for (const char* s4 = "0123456789abcdef"; *s4 != 0; s4++) {
+ sprintf(pty_master,"/dev/pty%c%c",*s3,*s4);
+ sprintf(tty_slave,"/dev/tty%c%c",*s3,*s4);
+ if ((ptyfd = open(pty_master, O_RDWR)) >= 0) {
+ if (geteuid() == 0 || access(tty_slave, R_OK|W_OK) == 0)
+ break;
+
+ close(ptyfd);
+ ptyfd = -1;
+ }
+ }
+
+ if (ptyfd >= 0)
+ break;
+ }
+ }
+
+ if (ptyfd >= 0) {
+ if (needGrantPty && !chownpty(ptyfd, TRUE)) {
+ fprintf(stderr,"kdevelop: chownpty failed for device %s::%s.\n",pty_master,tty_slave);
+ fprintf(stderr," : This means the session can be eavesdroped.\n");
+ fprintf(stderr," : Make sure konsole_grantpty is installed and setuid root.\n");
+ }
+
+ ::fcntl(ptyfd, F_SETFL, O_NDELAY);
+#ifdef TIOCSPTLCK
+ int flag = 0;
+ ioctl(ptyfd, TIOCSPTLCK, &flag); // unlock pty
+#endif
+ }
+
+ return ptyfd;
+}
+
+// **************************************************************************
+
+void STTY::OutReceived(int f)
+{
+ char buf[1024];
+ int n;
+
+ // read until socket is empty. We shouldn't be receiving a continuous
+ // stream of data, so the loop is unlikely to cause problems.
+ while ((n = ::read(f, buf, sizeof(buf)-1)) > 0) {
+ *(buf+n) = 0; // a standard string
+ emit OutOutput(buf);
+ }
+ // Note: for some reason, n can be 0 here.
+ // I can understand that non-blocking read returns 0,
+ // but I don't understand how OutRecieved can be even
+ // called when there's no input.
+ if (n == 0 /* eof */
+ || (n == -1 && errno != EAGAIN))
+ {
+ // Found eof or error. Disable socket notifier, otherwise Qt
+ // will repeatedly call this method, eating CPU
+ // cycles.
+ out->setEnabled(false);
+ }
+
+}
+
+void STTY::readRemaining()
+{
+ if (!external_)
+ OutReceived(fout);
+}
+
+// **************************************************************************
+
+#define FIFO_FILE "/tmp/debug_tty.XXXXXX"
+
+bool STTY::findExternalTTY(const QString &termApp)
+{
+ QString appName(termApp.isEmpty() ? QString("xterm") : termApp);
+
+ if ( KStandardDirs::findExe( termApp ).isEmpty() )
+ {
+ return false;
+ }
+
+ char fifo[] = FIFO_FILE;
+ int fifo_fd;
+ if ((fifo_fd = mkstemp(fifo)) == -1)
+ return false;
+
+ ::close(fifo_fd);
+ ::unlink(fifo);
+
+ // create a fifo that will pass in the tty name
+#ifdef HAVE_MKFIFO
+ if (::mkfifo(fifo, S_IRUSR|S_IWUSR) < 0)
+#else
+ if (::mknod(fifo, S_IFIFO | S_IRUSR|S_IWUSR, 0) < 0)
+#endif
+ return false;
+
+ int pid = ::fork();
+ if (pid < 0) { // No process
+ ::unlink(fifo);
+ return false;
+ }
+
+ if (pid == 0) { // child process
+ /*
+ * Spawn a console that in turn runs a shell script that passes us
+ * back the terminal name and then only sits and waits.
+ */
+
+ const char* prog = appName.latin1();
+ QString script = QString("tty>") + QString(fifo) +
+ QString(";" // fifo name
+ "trap \"\" INT QUIT TSTP;" // ignore various signals
+ "exec<&-;exec>&-;" // close stdin and stdout
+ "while :;do sleep 3600;done");
+ const char* scriptStr = script.latin1();
+ const char* end = 0;
+
+ if ( termApp == "konsole" )
+ {
+ ::execlp( prog, prog,
+ "-caption", i18n("kdevelop: Debug application console").local8Bit().data(),
+ "-e", "sh",
+ "-c", scriptStr,
+ end);
+ }
+ else
+ {
+ ::execlp( prog, prog,
+ "-e", "sh",
+ "-c", scriptStr,
+ end);
+ }
+
+ // Should not get here, as above should always work
+ ::exit(1);
+ }
+
+ // parent process
+ if (pid <= 0)
+ ::exit(1);
+
+ // Open the communication between us (the parent) and the
+ // child (the process running on a tty console)
+ fifo_fd = ::open(fifo, O_RDONLY);
+ if (fifo_fd < 0)
+ return false;
+
+ // Get the ttyname from the fifo buffer that the child process
+ // has sent.
+ char ttyname[50];
+ int n = ::read(fifo_fd, ttyname, sizeof(ttyname)-sizeof(char));
+
+ ::close(fifo_fd);
+ ::unlink(fifo);
+
+ // No name??
+ if (n <= 0)
+ return false;
+
+ // remove whitespace
+ ttyname[n] = 0;
+ if (char* newline = strchr(ttyname, '\n'))
+ *newline = 0; // clobber the new line
+
+ ttySlave = ttyname;
+ pid_ = pid;
+
+ return true;
+}
+
+}
+
+// **************************************************************************
+#include "stty.moc"
diff --git a/languages/cpp/debugger/stty.h b/languages/cpp/debugger/stty.h
new file mode 100644
index 00000000..639e8417
--- /dev/null
+++ b/languages/cpp/debugger/stty.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ begin : Mon Sep 13 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ This code was originally written by Judin Maxim, from the
+ KDEStudio project.
+
+ It was then updated with later code from konsole (KDE).
+
+ It has also been enhanced with an idea from the code in kdbg
+ written by Johannes Sixt<Johannes.Sixt@telecom.at>
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _STTY_H_
+#define _STTY_H_
+
+class QSocketNotifier;
+
+#include <qobject.h>
+#include <qstring.h>
+
+namespace GDBDebugger
+{
+
+class STTY : public QObject
+{
+ Q_OBJECT
+
+public:
+ STTY(bool ext=false, const QString &termAppName=QString());
+ ~STTY();
+
+ QString getSlave() { return ttySlave; };
+ void readRemaining();
+
+private slots:
+ void OutReceived(int);
+
+signals:
+ void OutOutput(const char *);
+ void ErrOutput(const char*);
+
+private:
+ int findTTY();
+ bool findExternalTTY(const QString &termApp);
+
+private:
+ int fout;
+ int ferr;
+ QSocketNotifier *out;
+ QString ttySlave;
+ int pid_;
+ bool external_;
+
+ char pty_master[50]; // "/dev/ptyxx" | "/dev/ptmx"
+ char tty_slave[50]; // "/dev/ttyxx" | "/dev/pts/########..."
+};
+
+}
+
+#endif
diff --git a/languages/cpp/debugger/tests/README.txt b/languages/cpp/debugger/tests/README.txt
new file mode 100644
index 00000000..1764b029
--- /dev/null
+++ b/languages/cpp/debugger/tests/README.txt
@@ -0,0 +1,4 @@
+
+This directory contains some tests for debugger. They are not
+automated, and most test have no description of expected behaviour,
+but still it's better than nothing. \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/breakpoints/Makefile b/languages/cpp/debugger/tests/breakpoints/Makefile
new file mode 100644
index 00000000..77d481f8
--- /dev/null
+++ b/languages/cpp/debugger/tests/breakpoints/Makefile
@@ -0,0 +1,4 @@
+
+breakpoints: main.cpp foo.cpp
+ g++ -g -obreakpoints main.cpp foo.cpp
+ \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/breakpoints/README.txt b/languages/cpp/debugger/tests/breakpoints/README.txt
new file mode 100644
index 00000000..5c441631
--- /dev/null
+++ b/languages/cpp/debugger/tests/breakpoints/README.txt
@@ -0,0 +1,2 @@
+
+Supposed to test various kinds of breakpoints. \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/breakpoints/breakpoints.kdevelop b/languages/cpp/debugger/tests/breakpoints/breakpoints.kdevelop
new file mode 100644
index 00000000..4b3b07c9
--- /dev/null
+++ b/languages/cpp/debugger/tests/breakpoints/breakpoints.kdevelop
@@ -0,0 +1,163 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Vladimir Prus</author>
+ <email>ghost@ghostwalk</email>
+ <version>$VERSION$</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <ignoreparts/>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>breakpoints</mainprogram>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <programargs/>
+ <terminal>false</terminal>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir/>
+ </build>
+ <make>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <prio>0</prio>
+ <dontact>false</dontact>
+ <makebin/>
+ <defaulttarget/>
+ <makeoptions/>
+ <selectedenvironment>default</selectedenvironment>
+ <environments>
+ <default/>
+ </environments>
+ </make>
+ </kdevcustomproject>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ <programargs/>
+ <gdbpath/>
+ <configGdbScript/>
+ <runShellScript/>
+ <runGdbScript/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcppsupport>
+ <references/>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ <qt>
+ <used>false</used>
+ <version>3</version>
+ <root>/usr/share/qt3</root>
+ </qt>
+ <creategettersetter>
+ <prefixGet/>
+ <prefixSet>set</prefixSet>
+ <prefixVariable>m_,_</prefixVariable>
+ <parameterName>theValue</parameterName>
+ <inlineGet>true</inlineGet>
+ <inlineSet>true</inlineSet>
+ </creategettersetter>
+ <splitheadersource>
+ <enabled>false</enabled>
+ <synchronize>true</synchronize>
+ <orientation>Vertical</orientation>
+ </splitheadersource>
+ </kdevcppsupport>
+ <kdevfileview>
+ <groups>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+</kdevelop>
diff --git a/languages/cpp/debugger/tests/breakpoints/foo.cpp b/languages/cpp/debugger/tests/breakpoints/foo.cpp
new file mode 100644
index 00000000..a3cf399d
--- /dev/null
+++ b/languages/cpp/debugger/tests/breakpoints/foo.cpp
@@ -0,0 +1,10 @@
+
+#include <stdio.h>
+
+void foo(int a)
+{
+ int i = 10;
+ int i2 = 12;
+ int i3 = i + i2;
+ printf("i3 = %d\n", i3);
+} \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/breakpoints/main.cpp b/languages/cpp/debugger/tests/breakpoints/main.cpp
new file mode 100644
index 00000000..81a5851f
--- /dev/null
+++ b/languages/cpp/debugger/tests/breakpoints/main.cpp
@@ -0,0 +1,38 @@
+
+void foo(int);
+
+void set_value(int* i)
+{
+ *i = 10;
+}
+
+void modify(int* i)
+{
+ *i = 15;
+}
+
+void read(int* i)
+{
+ static int i2;
+ i2 = *i;
+}
+
+int test_main(int* i)
+{
+ foo(5);
+ set_value(i);
+
+ modify(i);
+ read(i);
+
+ for(unsigned j = 0; j < 10; ++j)
+ foo(j);
+
+ return 0;
+}
+
+int main()
+{
+ int var;
+ return test_main(&var);
+}
diff --git a/languages/cpp/debugger/tests/dll/Makefile b/languages/cpp/debugger/tests/dll/Makefile
new file mode 100644
index 00000000..b49c732d
--- /dev/null
+++ b/languages/cpp/debugger/tests/dll/Makefile
@@ -0,0 +1,8 @@
+
+all: main libhelper.so
+
+main: main.cpp
+ g++ -g -o main main.cpp -ldl
+
+libhelper.so: helper.cpp
+ g++ -g -o libhelper.so -fPIC -shared helper.cpp \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/dll/README.txt b/languages/cpp/debugger/tests/dll/README.txt
new file mode 100644
index 00000000..52b39e46
--- /dev/null
+++ b/languages/cpp/debugger/tests/dll/README.txt
@@ -0,0 +1,3 @@
+
+Simple test that we can set breakpoint in dynamic library
+loaded with 'dlopen' before the library is actually loaded. \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/dll/dll.kdevelop b/languages/cpp/debugger/tests/dll/dll.kdevelop
new file mode 100644
index 00000000..dbeb12b3
--- /dev/null
+++ b/languages/cpp/debugger/tests/dll/dll.kdevelop
@@ -0,0 +1,158 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Vladimir Prus</author>
+ <email>ghost@ghostwalk</email>
+ <version>$VERSION$</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <ignoreparts/>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>main</mainprogram>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <programargs/>
+ <terminal>false</terminal>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir/>
+ </build>
+ <make>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <prio>0</prio>
+ <dontact>false</dontact>
+ <makebin/>
+ <defaulttarget/>
+ <makeoptions/>
+ <selectedenvironment>default</selectedenvironment>
+ <environments>
+ <default/>
+ </environments>
+ </make>
+ </kdevcustomproject>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ <programargs/>
+ <gdbpath/>
+ <configGdbScript/>
+ <runShellScript/>
+ <runGdbScript/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevcppsupport>
+ <qt>
+ <used>false</used>
+ <version>3</version>
+ <root/>
+ </qt>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ <creategettersetter>
+ <prefixGet/>
+ <prefixSet>set</prefixSet>
+ <prefixVariable>m_,_</prefixVariable>
+ <parameterName>theValue</parameterName>
+ <inlineGet>true</inlineGet>
+ <inlineSet>true</inlineSet>
+ </creategettersetter>
+ <references/>
+ </kdevcppsupport>
+ <kdevfileview>
+ <groups>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+</kdevelop>
diff --git a/languages/cpp/debugger/tests/dll/helper.cpp b/languages/cpp/debugger/tests/dll/helper.cpp
new file mode 100644
index 00000000..eb59e95b
--- /dev/null
+++ b/languages/cpp/debugger/tests/dll/helper.cpp
@@ -0,0 +1,6 @@
+
+extern "C" int helper(int i)
+{
+ int j = i;
+ return j+10;
+}
diff --git a/languages/cpp/debugger/tests/dll/main.cpp b/languages/cpp/debugger/tests/dll/main.cpp
new file mode 100644
index 00000000..ee91d5a2
--- /dev/null
+++ b/languages/cpp/debugger/tests/dll/main.cpp
@@ -0,0 +1,15 @@
+#include <dlfcn.h>
+
+typedef int (*ft)(int);
+
+int main()
+{
+ void* handle = dlopen("./libhelper.so", RTLD_LAZY);
+ void* sym = dlsym(handle, "helper");
+
+ ft f = (ft)sym;
+
+ f(10);
+ f(15);
+ return 0;
+}
diff --git a/languages/cpp/debugger/tests/infinite_loop/Makefile b/languages/cpp/debugger/tests/infinite_loop/Makefile
new file mode 100644
index 00000000..7d32cd85
--- /dev/null
+++ b/languages/cpp/debugger/tests/infinite_loop/Makefile
@@ -0,0 +1,4 @@
+
+infinite_loop: infinite_loop.cpp
+ g++ -g -oinfinite_loop infinite_loop.cpp
+ \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/infinite_loop/README.txt b/languages/cpp/debugger/tests/infinite_loop/README.txt
new file mode 100644
index 00000000..1c008ee6
--- /dev/null
+++ b/languages/cpp/debugger/tests/infinite_loop/README.txt
@@ -0,0 +1,3 @@
+
+Tests that we can stop a program with the "Interrupt" command.
+
diff --git a/languages/cpp/debugger/tests/infinite_loop/infinite_loop.cpp b/languages/cpp/debugger/tests/infinite_loop/infinite_loop.cpp
new file mode 100644
index 00000000..ca90a055
--- /dev/null
+++ b/languages/cpp/debugger/tests/infinite_loop/infinite_loop.cpp
@@ -0,0 +1,17 @@
+
+int foo()
+{
+ int i = 0;
+ for(;;)
+ {
+ i = i+1;
+ }
+ return i;
+}
+
+int main()
+{
+ int r = 10;
+ r += foo();
+ return r;
+} \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/infinite_loop/infinite_loop.kdevelop b/languages/cpp/debugger/tests/infinite_loop/infinite_loop.kdevelop
new file mode 100644
index 00000000..24055c6f
--- /dev/null
+++ b/languages/cpp/debugger/tests/infinite_loop/infinite_loop.kdevelop
@@ -0,0 +1,109 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Vladimir Prus</author>
+ <email>ghost@zigzag</email>
+ <version>$VERSION$</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <ignoreparts/>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>infinite_loop</mainprogram>
+ <directoryradio>executable</directoryradio>
+ </run>
+ </kdevcustomproject>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ </general>
+ </kdevdebugger>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcppsupport>
+ <references/>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ <showOnlyAccessibleItems>false</showOnlyAccessibleItems>
+ <completionBoxItemOrder>0</completionBoxItemOrder>
+ <howEvaluationContextMenu>true</howEvaluationContextMenu>
+ <showCommentWithArgumentHint>true</showCommentWithArgumentHint>
+ <statusBarTypeEvaluation>false</statusBarTypeEvaluation>
+ <namespaceAliases>std=_GLIBCXX_STD;__gnu_cxx=std</namespaceAliases>
+ <processPrimaryTypes>true</processPrimaryTypes>
+ <processFunctionArguments>false</processFunctionArguments>
+ </codecompletion>
+ </kdevcppsupport>
+ <kdevfileview>
+ <groups>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+</kdevelop>
diff --git a/languages/cpp/debugger/tests/print_pointers/Makefile b/languages/cpp/debugger/tests/print_pointers/Makefile
new file mode 100644
index 00000000..0eafe22f
--- /dev/null
+++ b/languages/cpp/debugger/tests/print_pointers/Makefile
@@ -0,0 +1,3 @@
+
+print_pointers: print_pointers.cpp
+ g++ -g -o print_pointers -I/usr/share/qt3/include print_pointers.cpp -lqt-mt \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/print_pointers/print_pointers.cpp b/languages/cpp/debugger/tests/print_pointers/print_pointers.cpp
new file mode 100644
index 00000000..09053b51
--- /dev/null
+++ b/languages/cpp/debugger/tests/print_pointers/print_pointers.cpp
@@ -0,0 +1,95 @@
+
+#include <qstring.h>
+#include <vector>
+
+struct B { int i; int j; static int k; };
+struct C { int a[3]; };
+struct D { int *ptr; };
+int B::k = 11;
+typedef int (*fp)(int);
+
+int g = 10;
+int g2 = 23;
+
+void func2()
+{
+ int foobar = 123;
+ printf("func2\n");
+}
+
+void func(QString& xs)
+{
+ int ac = 10;
+ std::string s;
+ func2();
+ g = 10;
+ xs = "foo";
+
+}
+
+class Test
+{
+ public:
+ QString n;
+ int b;
+};
+
+int test_main(int ac, char* av[])
+{
+ printf("Hello world\n");
+ int i = 10;
+ int* p1 = 0x00000000;
+ int** p1_p = &p1;
+ p1 = &g;
+
+ B* p2 = (B*)0x12345678;
+ g = 77;
+ int (*p3)(int) = (fp)0x000000AE;
+ B p4 = {1, 3};
+ p2 = &p4;
+ int p5[] = {5, 6, 7};
+ int* p6[] = {&g, &g2};
+ int p7[][2] = {{1,2}, {5,6}};
+ B p8[] = {{1,2}, {3,4}};
+ C p9 = {{7, 8, 9}};
+ g = 77;
+ const D p9_1 = {&g};
+ {
+ B p9_1;
+ int i = 15;
+ printf("p9_1\n");
+ }
+ B& p10 = p4;
+ int& p11 = *p1;
+ int (*p12)[3] = &p5;
+ int (&p13)[3] = p5;
+ char p14[6] = "abc";
+ wchar_t* p15 = L"test1";
+
+
+ QString s = "test test test test";
+ QString* sp = &s;
+ const QString& sr = s;
+ func(s);
+ i = 15;
+
+ std::vector<int> v;
+
+ Test* test = new Test;
+ Test& test2 = *test;
+ test->n = "foo";
+ printf("hi\n");
+ test = 0;
+ printf("hi2\n");
+ printf("hi %d\n", test->b);
+
+
+
+ p5[1] = 14;
+ return 0;
+}
+
+int main(int ac, char* av[])
+{
+ return test_main(ac, av);
+}
diff --git a/languages/cpp/debugger/tests/print_pointers/print_pointers.kdevelop b/languages/cpp/debugger/tests/print_pointers/print_pointers.kdevelop
new file mode 100644
index 00000000..03faba9a
--- /dev/null
+++ b/languages/cpp/debugger/tests/print_pointers/print_pointers.kdevelop
@@ -0,0 +1,218 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Vladimir Prus</author>
+ <email>ghost@cs.msu.su</email>
+ <version>$VERSION$</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <ignoreparts>
+ <part>kdevsecurity</part>
+ <part>kdevkonsoleview</part>
+ <part>kdevreplace</part>
+ <part>kdevctags2</part>
+ <part>kdevvalgrind</part>
+ </ignoreparts>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <projectname>print_pointers</projectname>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>print_pointers</mainprogram>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <programargs/>
+ <terminal>false</terminal>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir/>
+ </build>
+ <make>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <prio>0</prio>
+ <dontact>false</dontact>
+ <makebin/>
+ <defaulttarget/>
+ <makeoptions/>
+ <selectedenvironment>default</selectedenvironment>
+ <environments>
+ <default/>
+ </environments>
+ </make>
+ <filetypes>
+ <filetype>*.java</filetype>
+ <filetype>*.h</filetype>
+ <filetype>*.H</filetype>
+ <filetype>*.hh</filetype>
+ <filetype>*.hxx</filetype>
+ <filetype>*.hpp</filetype>
+ <filetype>*.c</filetype>
+ <filetype>*.C</filetype>
+ <filetype>*.cc</filetype>
+ <filetype>*.cpp</filetype>
+ <filetype>*.c++</filetype>
+ <filetype>*.cxx</filetype>
+ <filetype>Makefile</filetype>
+ <filetype>CMakeLists.txt</filetype>
+ </filetypes>
+ <blacklist/>
+ </kdevcustomproject>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ <programargs/>
+ <gdbpath/>
+ <configGdbScript/>
+ <runShellScript/>
+ <runGdbScript/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>true</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevcppsupport>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ <showOnlyAccessibleItems>false</showOnlyAccessibleItems>
+ <completionBoxItemOrder>0</completionBoxItemOrder>
+ <howEvaluationContextMenu>true</howEvaluationContextMenu>
+ <showCommentWithArgumentHint>true</showCommentWithArgumentHint>
+ <statusBarTypeEvaluation>false</statusBarTypeEvaluation>
+ <namespaceAliases>std=_GLIBCXX_STD;__gnu_cxx&lt;&lt;std</namespaceAliases>
+ <processPrimaryTypes>true</processPrimaryTypes>
+ <processFunctionArguments>false</processFunctionArguments>
+ <preProcessAllHeaders>false</preProcessAllHeaders>
+ <parseMissingHeaders>false</parseMissingHeaders>
+ <resolveIncludePaths>true</resolveIncludePaths>
+ <alwaysParseInBackground>true</alwaysParseInBackground>
+ <usePermanentCaching>true</usePermanentCaching>
+ <alwaysIncludeNamespaces>false</alwaysIncludeNamespaces>
+ <includePaths>.;</includePaths>
+ <parseMissingHeadersExperimental>false</parseMissingHeadersExperimental>
+ <resolveIncludePathsUsingMakeExperimental>false</resolveIncludePathsUsingMakeExperimental>
+ </codecompletion>
+ <creategettersetter>
+ <prefixGet/>
+ <prefixSet>set</prefixSet>
+ <prefixVariable>m_,_</prefixVariable>
+ <parameterName>theValue</parameterName>
+ <inlineGet>true</inlineGet>
+ <inlineSet>true</inlineSet>
+ </creategettersetter>
+ <references/>
+ <qt>
+ <used>false</used>
+ <version>3</version>
+ <root>/usr/share/qt3</root>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ <qmake>/usr/bin/qmake-qt3</qmake>
+ <designer>/usr/bin/designer</designer>
+ <designerpluginpaths/>
+ </qt>
+ <splitheadersource>
+ <enabled>false</enabled>
+ <synchronize>true</synchronize>
+ <orientation>Vertical</orientation>
+ </splitheadersource>
+ </kdevcppsupport>
+ <kdevfileview>
+ <groups>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+ <kdevvisualadvance>
+ <emulator>VisualBoyAdvance</emulator>
+ <binary/>
+ <addOptions/>
+ <terminal>false</terminal>
+ <fullscreen>false</fullscreen>
+ <graphicFilter>-f0</graphicFilter>
+ <scaling>-1</scaling>
+ </kdevvisualadvance>
+</kdevelop>
diff --git a/languages/cpp/debugger/tests/segfault/Makefile b/languages/cpp/debugger/tests/segfault/Makefile
new file mode 100644
index 00000000..eebc5385
--- /dev/null
+++ b/languages/cpp/debugger/tests/segfault/Makefile
@@ -0,0 +1,4 @@
+
+segfault: segfault.cpp
+ g++ -g -osegfault segfault.cpp
+ \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/segfault/README.txt b/languages/cpp/debugger/tests/segfault/README.txt
new file mode 100644
index 00000000..c36254de
--- /dev/null
+++ b/languages/cpp/debugger/tests/segfault/README.txt
@@ -0,0 +1,3 @@
+
+Tests that we correctly report segfault in a debugged program.
+
diff --git a/languages/cpp/debugger/tests/segfault/segfault.cpp b/languages/cpp/debugger/tests/segfault/segfault.cpp
new file mode 100644
index 00000000..3a77e500
--- /dev/null
+++ b/languages/cpp/debugger/tests/segfault/segfault.cpp
@@ -0,0 +1,7 @@
+
+
+int main()
+{
+ int* ptr = 0;
+ *ptr = 10;
+} \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/segfault/segfault.kdevelop b/languages/cpp/debugger/tests/segfault/segfault.kdevelop
new file mode 100644
index 00000000..0135e84b
--- /dev/null
+++ b/languages/cpp/debugger/tests/segfault/segfault.kdevelop
@@ -0,0 +1,163 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Vladimir Prus</author>
+ <email>ghost@zigzag</email>
+ <version>$VERSION$</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <ignoreparts/>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description></description>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>segfault</mainprogram>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <programargs></programargs>
+ <terminal>false</terminal>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir></builddir>
+ </build>
+ <make>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <prio>0</prio>
+ <dontact>false</dontact>
+ <makebin></makebin>
+ <defaulttarget></defaulttarget>
+ <makeoptions></makeoptions>
+ <selectedenvironment>default</selectedenvironment>
+ <environments>
+ <default/>
+ </environments>
+ </make>
+ </kdevcustomproject>
+ <kdevdebugger>
+ <general>
+ <dbgshell></dbgshell>
+ <programargs></programargs>
+ <gdbpath></gdbpath>
+ <configGdbScript></configGdbScript>
+ <runShellScript></runShellScript>
+ <runGdbScript></runGdbScript>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcppsupport>
+ <references/>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ <qt>
+ <used>false</used>
+ <version>3</version>
+ <root>/usr/share/qt3</root>
+ </qt>
+ <creategettersetter>
+ <prefixGet></prefixGet>
+ <prefixSet>set</prefixSet>
+ <prefixVariable>m_,_</prefixVariable>
+ <parameterName>theValue</parameterName>
+ <inlineGet>true</inlineGet>
+ <inlineSet>true</inlineSet>
+ </creategettersetter>
+ <splitheadersource>
+ <enabled>false</enabled>
+ <synchronize>true</synchronize>
+ <orientation>Vertical</orientation>
+ </splitheadersource>
+ </kdevcppsupport>
+ <kdevfileview>
+ <groups>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+</kdevelop>
diff --git a/languages/cpp/debugger/tests/threads/Makefile b/languages/cpp/debugger/tests/threads/Makefile
new file mode 100644
index 00000000..8db14799
--- /dev/null
+++ b/languages/cpp/debugger/tests/threads/Makefile
@@ -0,0 +1,4 @@
+
+threads: threads.cpp
+ g++ -g -othreads threads.cpp -pthread
+ \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/threads/README.txt b/languages/cpp/debugger/tests/threads/README.txt
new file mode 100644
index 00000000..3d84fae1
--- /dev/null
+++ b/languages/cpp/debugger/tests/threads/README.txt
@@ -0,0 +1,4 @@
+
+Tests with a threaded application. Makes sure that the
+list of threads is shown that that switching threads works.
+
diff --git a/languages/cpp/debugger/tests/threads/threads.cpp b/languages/cpp/debugger/tests/threads/threads.cpp
new file mode 100644
index 00000000..f412ef7c
--- /dev/null
+++ b/languages/cpp/debugger/tests/threads/threads.cpp
@@ -0,0 +1,26 @@
+
+#include <pthread.h>
+
+void runner(int i)
+{
+ for(int i = 0; i < 1000000;)
+ ++i;
+}
+
+void* thread(void* p)
+{
+ runner((int)p);
+}
+
+int main()
+{
+ pthread_t p1, p2;
+
+ pthread_create(&p1, 0, &thread, (void*)1);
+ pthread_create(&p2, 0, &thread, (void*)2);
+
+ pthread_join(p1, 0);
+ pthread_join(p2, 0);
+
+ return 0;
+} \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/threads/threads.kdevelop b/languages/cpp/debugger/tests/threads/threads.kdevelop
new file mode 100644
index 00000000..3cd806b8
--- /dev/null
+++ b/languages/cpp/debugger/tests/threads/threads.kdevelop
@@ -0,0 +1,101 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Vladimir Prus</author>
+ <email>ghost@zigzag</email>
+ <version>$VERSION$</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <ignoreparts/>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>threads</mainprogram>
+ <directoryradio>executable</directoryradio>
+ </run>
+ </kdevcustomproject>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ </general>
+ </kdevdebugger>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcppsupport>
+ <references/>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ </kdevcppsupport>
+ <kdevfileview>
+ <groups>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+</kdevelop>
diff --git a/languages/cpp/debugger/tests/tracing/Makefile b/languages/cpp/debugger/tests/tracing/Makefile
new file mode 100644
index 00000000..22333f01
--- /dev/null
+++ b/languages/cpp/debugger/tests/tracing/Makefile
@@ -0,0 +1,4 @@
+
+tracing: main.cpp
+ g++ -g -otracing main.cpp
+ \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/tracing/main.cpp b/languages/cpp/debugger/tests/tracing/main.cpp
new file mode 100644
index 00000000..4a1a38d7
--- /dev/null
+++ b/languages/cpp/debugger/tests/tracing/main.cpp
@@ -0,0 +1,15 @@
+
+// áÌÇÏÒÉÔÍ å×ËÌÉÄÁ ×ÙÞÉÓÌÅÎÉÑ ÎÁÉÂÏÌØÛÅÇÏ ÏÂÝÅÇÏ ÄÅÌÉÔÅÌÑ
+int main()
+{
+ int i, j;
+ i = 157;
+ j = 312;
+
+ while( i != j )
+ {
+ if( i > j ) i = i-j;
+ else j = j-i;
+ }
+ return 0;
+}
diff --git a/languages/cpp/debugger/tests/tracing/tracing.kdevelop b/languages/cpp/debugger/tests/tracing/tracing.kdevelop
new file mode 100644
index 00000000..94d39c6f
--- /dev/null
+++ b/languages/cpp/debugger/tests/tracing/tracing.kdevelop
@@ -0,0 +1,163 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Vladimir Prus</author>
+ <email>ghost@ghostwalk</email>
+ <version>$VERSION$</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <ignoreparts/>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>tracing</mainprogram>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <programargs/>
+ <terminal>false</terminal>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir/>
+ </build>
+ <make>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <prio>0</prio>
+ <dontact>false</dontact>
+ <makebin/>
+ <defaulttarget/>
+ <makeoptions/>
+ <selectedenvironment>default</selectedenvironment>
+ <environments>
+ <default/>
+ </environments>
+ </make>
+ </kdevcustomproject>
+ <kdevdebugger>
+ <general>
+ <dbgshell/>
+ <programargs/>
+ <gdbpath/>
+ <configGdbScript/>
+ <runShellScript/>
+ <runGdbScript/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcppsupport>
+ <references/>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ <qt>
+ <used>false</used>
+ <version>3</version>
+ <root>/usr/share/qt3</root>
+ </qt>
+ <creategettersetter>
+ <prefixGet/>
+ <prefixSet>set</prefixSet>
+ <prefixVariable>m_,_</prefixVariable>
+ <parameterName>theValue</parameterName>
+ <inlineGet>true</inlineGet>
+ <inlineSet>true</inlineSet>
+ </creategettersetter>
+ <splitheadersource>
+ <enabled>false</enabled>
+ <synchronize>true</synchronize>
+ <orientation>Vertical</orientation>
+ </splitheadersource>
+ </kdevcppsupport>
+ <kdevfileview>
+ <groups>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+</kdevelop>
diff --git a/languages/cpp/debugger/tests/two_module/Makefile b/languages/cpp/debugger/tests/two_module/Makefile
new file mode 100644
index 00000000..edd1a242
--- /dev/null
+++ b/languages/cpp/debugger/tests/two_module/Makefile
@@ -0,0 +1,4 @@
+
+two_module: main.cpp src/foo.cpp
+ g++ -g -I/usr/share/qt3/include -otwo_module main.cpp src/foo.cpp -lqt-mt
+ \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/two_module/README.txt b/languages/cpp/debugger/tests/two_module/README.txt
new file mode 100644
index 00000000..31bb0249
--- /dev/null
+++ b/languages/cpp/debugger/tests/two_module/README.txt
@@ -0,0 +1,2 @@
+
+Very basic tests containing two modules. \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/two_module/main.cpp b/languages/cpp/debugger/tests/two_module/main.cpp
new file mode 100644
index 00000000..30863389
--- /dev/null
+++ b/languages/cpp/debugger/tests/two_module/main.cpp
@@ -0,0 +1,8 @@
+
+void foo(int);
+
+int main(int ac, char* av[])
+{
+ foo(5);
+ return 0;
+}
diff --git a/languages/cpp/debugger/tests/two_module/src/foo.cpp b/languages/cpp/debugger/tests/two_module/src/foo.cpp
new file mode 100644
index 00000000..b66f9924
--- /dev/null
+++ b/languages/cpp/debugger/tests/two_module/src/foo.cpp
@@ -0,0 +1,12 @@
+
+#include <stdio.h>
+#include <qstring.h>
+
+void foo(int a)
+{
+ QString s = "foo";
+ int i = 10;
+ int i2 = 12;
+ int i3 = i + i2;
+ printf("i3 = %d\n", i3);
+} \ No newline at end of file
diff --git a/languages/cpp/debugger/tests/two_module/two_module.kdevelop b/languages/cpp/debugger/tests/two_module/two_module.kdevelop
new file mode 100644
index 00000000..a9ecc5ad
--- /dev/null
+++ b/languages/cpp/debugger/tests/two_module/two_module.kdevelop
@@ -0,0 +1,163 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Vladimir Prus</author>
+ <email>ghost@ghostwalk</email>
+ <version>$VERSION$</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <ignoreparts/>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description></description>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>two_module</mainprogram>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <programargs></programargs>
+ <terminal>false</terminal>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir></builddir>
+ </build>
+ <make>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <prio>0</prio>
+ <dontact>false</dontact>
+ <makebin></makebin>
+ <defaulttarget></defaulttarget>
+ <makeoptions></makeoptions>
+ <selectedenvironment>default</selectedenvironment>
+ <environments>
+ <default/>
+ </environments>
+ </make>
+ </kdevcustomproject>
+ <kdevdebugger>
+ <general>
+ <dbgshell></dbgshell>
+ <programargs></programargs>
+ <gdbpath></gdbpath>
+ <configGdbScript></configGdbScript>
+ <runShellScript></runShellScript>
+ <runGdbScript></runGdbScript>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcppsupport>
+ <references/>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ <qt>
+ <used>false</used>
+ <version>3</version>
+ <root>/usr/share/qt3</root>
+ </qt>
+ <creategettersetter>
+ <prefixGet></prefixGet>
+ <prefixSet>set</prefixSet>
+ <prefixVariable>m_,_</prefixVariable>
+ <parameterName>theValue</parameterName>
+ <inlineGet>true</inlineGet>
+ <inlineSet>true</inlineSet>
+ </creategettersetter>
+ <splitheadersource>
+ <enabled>false</enabled>
+ <synchronize>true</synchronize>
+ <orientation>Vertical</orientation>
+ </splitheadersource>
+ </kdevcppsupport>
+ <kdevfileview>
+ <groups>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ </tree>
+ </kdevfileview>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+</kdevelop>
diff --git a/languages/cpp/debugger/variablewidget.cpp b/languages/cpp/debugger/variablewidget.cpp
new file mode 100644
index 00000000..263afdf9
--- /dev/null
+++ b/languages/cpp/debugger/variablewidget.cpp
@@ -0,0 +1,2002 @@
+// **************************************************************************
+// begin : Sun Aug 8 1999
+// copyright : (C) 1999 by John Birch
+// email : jbb@kdevelop.org
+// **************************************************************************
+
+// **************************************************************************
+// * *
+// * 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. *
+// * *
+// **************************************************************************
+
+#include "variablewidget.h"
+#include "gdbparser.h"
+#include "gdbcommand.h"
+#include "gdbbreakpointwidget.h"
+
+#include <kdebug.h>
+#include <kpopupmenu.h>
+#include <klineedit.h>
+#include <kdeversion.h>
+#include <kiconloader.h>
+
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qpainter.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qcursor.h>
+#include <qwhatsthis.h>
+#include <klocale.h>
+
+#include <qpoint.h>
+#include <qclipboard.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+
+#include <cctype>
+#include <set>
+#include <typeinfo>
+#include <cctype>
+
+/** The variables widget is passive, and is invoked by the rest of the
+ code via two main slots:
+ - slotDbgStatus
+ - slotCurrentFrame
+
+ The first is received the program status changes and the second is
+ recieved after current frame in the debugger can possibly changes.
+
+ The widget has a list item for each frame/thread combination, with
+ variables as children. However, at each moment only one item is shown.
+ When handling the slotCurrentFrame, we check if variables for the
+ current frame are available. If yes, we simply show the corresponding item.
+ Otherwise, we fetch the new data from debugger.
+
+ Fetching the data is done by emitting the produceVariablesInfo signal.
+ In response, we get slotParametersReady and slotLocalsReady signal,
+ in that order.
+
+ The data is parsed and changed variables are highlighted. After that,
+ we 'trim' variable items that were not reported by gdb -- that is, gone
+ out of scope.
+*/
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+namespace GDBDebugger
+{
+
+VariableWidget::VariableWidget(GDBController* controller,
+ GDBBreakpointWidget* breakpointWidget,
+ QWidget *parent, const char *name)
+: QWidget(parent, name)
+{
+ setIcon(SmallIcon("math_brace"));
+ setCaption(i18n("Variable Tree"));
+
+ varTree_ = new VariableTree(this, controller, breakpointWidget);
+
+ watchVarEditor_ = new KHistoryCombo( this,
+ "var-to-watch editor");
+
+ QHBoxLayout* buttons = new QHBoxLayout();
+
+ buttons->addStretch();
+
+ QPushButton *evalButton = new QPushButton(i18n("&Evaluate"), this );
+ buttons->addWidget(evalButton);
+
+ QPushButton *addButton = new QPushButton(i18n("&Watch"), this );
+ buttons->addWidget(addButton);
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this, 2);
+ topLayout->addWidget(varTree_, 10);
+ topLayout->addWidget(watchVarEditor_);
+ topLayout->addItem(buttons);
+
+
+ connect( addButton, SIGNAL(clicked()), SLOT(slotAddWatchVariable()) );
+ connect( evalButton, SIGNAL(clicked()), SLOT(slotEvaluateExpression()) );
+
+ connect( watchVarEditor_, SIGNAL(returnPressed()),
+ SLOT(slotEvaluateExpression()) );
+
+ connect(controller, SIGNAL(event(GDBController::event_t)),
+ varTree_, SLOT(slotEvent(GDBController::event_t)));
+
+
+ // Setup help items.
+
+ QWhatsThis::add(this, i18n(
+ "<b>Variable tree</b><p>"
+ "The variable tree allows you to see the values of local "
+ "variables and arbitrary expressions."
+ "<p>Local variables are displayed automatically and are updated "
+ "as you step through your program. "
+ "For each expression you enter, you can either evaluate it once, "
+ "or \"watch\" it (make it auto-updated). Expressions that are not "
+ "auto-updated can be updated manually from the context menu. "
+ "Expressions can be renamed to more descriptive names by clicking "
+ "on the name column."
+ "<p>To change the value of a variable or an expression, "
+ "click on the value."));
+
+ QWhatsThis::add(watchVarEditor_,
+ i18n("<b>Expression entry</b>"
+ "<p>Type in expression to evaluate."));
+
+ QWhatsThis::add(evalButton,
+ i18n("Evaluate the expression."));
+
+ QWhatsThis::add(addButton,
+ i18n("Evaluate the expression and "
+ "auto-update the value when stepping."));
+}
+
+void VariableWidget::slotAddWatchVariable()
+{
+// QString watchVar(watchVarEntry_->text());
+ QString watchVar(watchVarEditor_->currentText());
+ if (!watchVar.isEmpty())
+ {
+ slotAddWatchVariable(watchVar);
+ }
+}
+
+// **************************************************************************
+
+void VariableWidget::slotAddWatchVariable(const QString &ident)
+{
+ if (!ident.isEmpty())
+ {
+ watchVarEditor_->addToHistory(ident);
+ varTree_->slotAddWatchVariable(ident);
+ watchVarEditor_->clearEdit();
+ }
+}
+
+void VariableWidget::slotEvaluateExpression()
+{
+ QString exp(watchVarEditor_->currentText());
+ if (!exp.isEmpty())
+ {
+ slotEvaluateExpression(exp);
+ }
+}
+
+void VariableWidget::slotEvaluateExpression(const QString &ident)
+{
+ if (!ident.isEmpty())
+ {
+ watchVarEditor_->addToHistory(ident);
+ varTree_->slotEvaluateExpression(ident);
+ watchVarEditor_->clearEdit();
+ }
+}
+
+// **************************************************************************
+
+void VariableWidget::focusInEvent(QFocusEvent */*e*/)
+{
+ varTree_->setFocus();
+}
+
+
+
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+VariableTree::VariableTree(VariableWidget *parent,
+ GDBController* controller,
+ GDBBreakpointWidget* breakpointWidget,
+ const char *name)
+ : KListView(parent, name),
+ QToolTip( viewport() ),
+ controller_(controller),
+ breakpointWidget_(breakpointWidget),
+ activeFlag_(0),
+ recentExpressions_(0),
+ currentFrameItem(0),
+ activePopup_(0)
+{
+ setRootIsDecorated(true);
+ setAllColumnsShowFocus(true);
+ setSorting(-1);
+ QListView::setSelectionMode(QListView::Single);
+
+ // Note: it might be reasonable to set width of value
+ // column to 10 characters ('0x12345678'), and rely on
+ // tooltips for showing larger values. Currently, both
+ // columns will get roughly equal width.
+ addColumn(i18n("Variable"));
+ addColumn(i18n("Value"));
+// setResizeMode(AllColumns);
+
+ connect( this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)),
+ SLOT(slotContextMenu(KListView*, QListViewItem*)) );
+ connect( this, SIGNAL(itemRenamed( QListViewItem*, int, const QString&)),
+ this, SLOT(slotItemRenamed( QListViewItem*, int, const QString&)));
+}
+
+// **************************************************************************
+
+VariableTree::~VariableTree()
+{
+}
+
+// **************************************************************************
+
+void VariableTree::slotContextMenu(KListView *, QListViewItem *item)
+{
+ if (!item)
+ return;
+
+ setSelected(item, true); // Need to select this item.
+
+ if (item->parent())
+ {
+ KPopupMenu popup(this);
+ KPopupMenu format(this);
+
+ int idRemember = -2;
+ int idRemove = -2;
+ int idReevaluate = -2;
+ int idWatch = -2;
+
+ int idNatural = -2;
+ int idHex = -2;
+ int idDecimal = -2;
+ int idCharacter = -2;
+ int idBinary = -2;
+
+#define MAYBE_DISABLE(id) if (!var->isAlive()) popup.setItemEnabled(id, false)
+
+ VarItem* var;
+ if ((var = dynamic_cast<VarItem*>(item)))
+ {
+ popup.insertTitle(var->gdbExpression());
+
+
+ format.setCheckable(true);
+ idNatural = format.insertItem(i18n("Natural"),
+ (int)VarItem::natural);
+ format.setAccel(Qt::Key_N, idNatural);
+ idHex = format.insertItem(i18n("Hexadecimal"),
+ (int)VarItem::hexadecimal);
+ format.setAccel(Qt::Key_X, idHex);
+ idDecimal = format.insertItem(i18n("Decimal"),
+ (int)VarItem::decimal);
+ format.setAccel(Qt::Key_D, idDecimal);
+ idCharacter = format.insertItem(i18n("Character"),
+ (int)VarItem::character);
+ format.setAccel(Qt::Key_C, idCharacter);
+ idBinary = format.insertItem(i18n("Binary"),
+ (int)VarItem::binary);
+ format.setAccel(Qt::Key_T, idBinary);
+
+
+ format.setItemChecked((int)(var->format()), true);
+
+ int id = popup.insertItem(i18n("Format"), &format);
+ MAYBE_DISABLE(id);
+ }
+
+
+ QListViewItem* root = findRoot(item);
+
+ if (root != recentExpressions_)
+ {
+ idRemember = popup.insertItem(
+ SmallIcon("pencil"), i18n("Remember Value"));
+ MAYBE_DISABLE(idRemember);
+ }
+
+ if (dynamic_cast<WatchRoot*>(root)) {
+ idRemove = popup.insertItem(
+ SmallIcon("editdelete"), i18n("Remove Watch Variable") );
+ popup.setAccel(Qt::Key_Delete, idRemove);
+ } else if (root != recentExpressions_) {
+ idWatch = popup.insertItem(
+ i18n("Watch Variable"));
+ MAYBE_DISABLE(idWatch);
+ }
+ if (root == recentExpressions_) {
+ idReevaluate = popup.insertItem(
+ SmallIcon("reload"), i18n("Reevaluate Expression") );
+ MAYBE_DISABLE(idReevaluate);
+ idRemove = popup.insertItem(
+ SmallIcon("editdelete"), i18n("Remove Expression") );
+ popup.setAccel(Qt::Key_Delete, idRemove);
+ }
+
+ if (var)
+ {
+ popup.insertItem( i18n("Data write breakpoint"), idToggleWatch );
+ popup.setItemEnabled(idToggleWatch, false);
+ }
+
+ int idCopyToClipboard = popup.insertItem(
+ SmallIcon("editcopy"), i18n("Copy Value") );
+ popup.setAccel(Qt::CTRL + Qt::Key_C, idCopyToClipboard);
+
+ activePopup_ = &popup;
+ /* This code can be executed when debugger is stopped,
+ and we invoke popup menu on a var under "recent expressions"
+ just to delete it. */
+ if (var && var->isAlive() && !controller()->stateIsOn(s_dbgNotStarted))
+ controller_->addCommand(
+ new GDBCommand(
+ QString("-data-evaluate-expression &%1")
+ .arg(var->gdbExpression()),
+ this,
+ &VariableTree::handleAddressComputed,
+ true /*handles error*/));
+
+
+ int res = popup.exec(QCursor::pos());
+
+ activePopup_ = 0;
+
+
+ if (res == idNatural || res == idHex || res == idDecimal
+ || res == idCharacter || res == idBinary)
+ {
+ // Change format.
+ VarItem* var_item = static_cast<VarItem*>(item);
+ var_item->setFormat(static_cast<VarItem::format_t>(res));
+ }
+ else if (res == idRemember)
+ {
+ if (VarItem *item = dynamic_cast<VarItem*>(currentItem()))
+ {
+ ((VariableWidget*)parent())->
+ slotEvaluateExpression(item->gdbExpression());
+ }
+ }
+ else if (res == idWatch)
+ {
+ if (VarItem *item = dynamic_cast<VarItem*>(currentItem()))
+ {
+ ((VariableWidget*)parent())->
+ slotAddWatchVariable(item->gdbExpression());
+ }
+ }
+ else if (res == idRemove)
+ delete item;
+ else if (res == idCopyToClipboard)
+ {
+ copyToClipboard(item);
+ }
+ else if (res == idToggleWatch)
+ {
+ if (VarItem *item = dynamic_cast<VarItem*>(currentItem()))
+ emit toggleWatchpoint(item->gdbExpression());
+ }
+ else if (res == idReevaluate)
+ {
+ if (VarItem* item = dynamic_cast<VarItem*>(currentItem()))
+ {
+ item->recreate();
+ }
+ }
+ }
+ else if (item == recentExpressions_)
+ {
+ KPopupMenu popup(this);
+ popup.insertTitle(i18n("Recent Expressions"));
+ int idRemove = popup.insertItem(
+ SmallIcon("editdelete"), i18n("Remove All"));
+ int idReevaluate = popup.insertItem(
+ SmallIcon("reload"), i18n("Reevaluate All"));
+ if (controller()->stateIsOn(s_dbgNotStarted))
+ popup.setItemEnabled(idReevaluate, false);
+ int res = popup.exec(QCursor::pos());
+
+ if (res == idRemove)
+ {
+ delete recentExpressions_;
+ recentExpressions_ = 0;
+ }
+ else if (res == idReevaluate)
+ {
+ for(QListViewItem* child = recentExpressions_->firstChild();
+ child; child = child->nextSibling())
+ {
+ static_cast<VarItem*>(child)->recreate();
+ }
+ }
+ }
+}
+
+void VariableTree::slotEvent(GDBController::event_t event)
+{
+ switch(event)
+ {
+ case GDBController::program_exited:
+ case GDBController::debugger_exited:
+ {
+ // Remove all locals.
+ QListViewItem *child = firstChild();
+
+ while (child) {
+ QListViewItem *nextChild = child->nextSibling();
+
+ // don't remove the watch root, or 'recent expressions' root.
+ if (!(dynamic_cast<WatchRoot*> (child))
+ && child != recentExpressions_)
+ {
+ delete child;
+ }
+ child = nextChild;
+ }
+ currentFrameItem = 0;
+
+ if (recentExpressions_)
+ {
+ for(QListViewItem* child = recentExpressions_->firstChild();
+ child; child = child->nextSibling())
+ {
+ static_cast<VarItem*>(child)->unhookFromGdb();
+ }
+ }
+
+ if (WatchRoot* w = findWatch())
+ {
+ for(QListViewItem* child = w->firstChild();
+ child; child = child->nextSibling())
+ {
+ static_cast<VarItem*>(child)->unhookFromGdb();
+ }
+ }
+
+ break;
+ }
+
+ case GDBController::program_state_changed:
+
+ // Fall-through intended.
+
+ case GDBController::thread_or_frame_changed:
+ {
+ VarFrameRoot *frame = demand_frame_root(
+ controller_->currentFrame(), controller_->currentThread());
+
+ if (frame->isOpen())
+ {
+ updateCurrentFrame();
+ }
+ else
+ {
+ frame->setDirty();
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void VariableTree::updateCurrentFrame()
+{
+ // In GDB 6.4, the -stack-list-locals command is broken.
+ // If there's any local reference variable which is not
+ // initialized yet, for example because it's in the middle
+ // of function, gdb will still print it and try to dereference
+ // it. If the address in not accessible, the MI command will
+ // exit with an error, and we won't be able to see *any*
+ // locals. A patch is submitted:
+ // http://sourceware.org/ml/gdb-patches/2006-04/msg00069.html
+ // but we need to work with 6.4, not with some future version. So,
+ // we just -stack-list-locals to get just names of the locals,
+ // but not their values.
+ // We'll fetch values separately:
+
+ controller_->addCommand(
+ new GDBCommand(QString("-stack-list-arguments 0 %1 %2")
+ .arg(controller_->currentFrame())
+ .arg(controller_->currentFrame())
+ .ascii(),
+ this,
+ &VariableTree::argumentsReady));
+
+
+ controller_->addCommand(
+ new GDBCommand("-stack-list-locals 0",
+ this,
+ &VariableTree::localsReady));
+
+}
+
+
+// **************************************************************************
+
+void VariableTree::slotAddWatchVariable(const QString &watchVar)
+{
+ VarItem *varItem = 0;
+ varItem = new VarItem(findWatch(), watchVar);
+}
+
+void VariableTree::slotEvaluateExpression(const QString &expression)
+{
+ if (recentExpressions_ == 0)
+ {
+ recentExpressions_ = new TrimmableItem(this);
+ recentExpressions_->setText(0, "Recent");
+ recentExpressions_->setOpen(true);
+ }
+
+ VarItem *varItem = new VarItem(recentExpressions_,
+ expression,
+ true /* freeze */);
+ varItem->setRenameEnabled(0, 1);
+}
+
+// **************************************************************************
+
+QListViewItem *VariableTree::findRoot(QListViewItem *item) const
+{
+ while (item->parent())
+ item = item->parent();
+
+ return item;
+}
+
+// **************************************************************************
+
+VarFrameRoot *VariableTree::findFrame(int frameNo, int threadNo) const
+{
+ QListViewItem *sibling = firstChild();
+
+ // frames only exist on th top level so we only need to
+ // check the siblings
+ while (sibling) {
+ VarFrameRoot *frame = dynamic_cast<VarFrameRoot*> (sibling);
+ if (frame && frame->matchDetails(frameNo, threadNo))
+ return frame;
+
+ sibling = sibling->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+
+WatchRoot *VariableTree::findWatch()
+{
+ QListViewItem *sibling = firstChild();
+
+ while (sibling) {
+ if (WatchRoot *watch = dynamic_cast<WatchRoot*> (sibling))
+ return watch;
+
+ sibling = sibling->nextSibling();
+ }
+
+ return new WatchRoot(this);
+}
+
+// **************************************************************************
+
+QListViewItem *VariableTree::lastChild() const
+{
+ QListViewItem *child = firstChild();
+ if (child)
+ while (QListViewItem *nextChild = child->nextSibling())
+ child = nextChild;
+
+ return child;
+}
+
+// **************************************************************************
+
+void VariableTree::maybeTip(const QPoint &p)
+{
+ VarItem * item = dynamic_cast<VarItem*>( itemAt( p ) );
+ if ( item )
+ {
+ QRect r = itemRect( item );
+ if ( r.isValid() )
+ tip( r, item->tipText() );
+ }
+}
+
+class ValueSpecialRepresentationCommand : public QObject, public CliCommand
+{
+public:
+ ValueSpecialRepresentationCommand(VarItem* item, const QString& command)
+ : CliCommand(command.ascii(),
+ this,
+ &ValueSpecialRepresentationCommand::handleReply,
+ true),
+ item_(item)
+ {}
+
+private:
+
+ VarItem* item_;
+
+ void handleReply(const QValueVector<QString>& lines)
+ {
+ QString s;
+ for(unsigned i = 1; i < lines.count(); ++i)
+ s += lines[i];
+ item_->updateSpecialRepresentation(s.local8Bit());
+ }
+};
+
+void VariableTree::slotVarobjNameChanged(
+ const QString& from, const QString& to)
+{
+ if (!from.isEmpty())
+ varobj2varitem.erase(from);
+
+ if (!to.isEmpty())
+ varobj2varitem[to] =
+ const_cast<VarItem*>(
+ static_cast<const VarItem*>(sender()));
+}
+
+
+
+VarFrameRoot* VariableTree::demand_frame_root(int frameNo, int threadNo)
+{
+ VarFrameRoot *frame = findFrame(frameNo, threadNo);
+ if (!frame)
+ {
+ frame = new VarFrameRoot(this, frameNo, threadNo);
+ frame->setFrameName(i18n("Locals"));
+ // Make sure "Locals" item is always the top item, before
+ // "watch" and "recent experessions" items.
+ this->takeItem(frame);
+ this->insertItem(frame);
+ frame->setOpen(true);
+ }
+ return frame;
+}
+
+void VariableTree::argumentsReady(const GDBMI::ResultRecord& r)
+{
+ const GDBMI::Value& args = r["stack-args"][0]["args"];
+
+ fetch_time.start();
+
+ locals_and_arguments.clear();
+ for(unsigned i = 0; i < args.size(); ++i)
+ {
+ locals_and_arguments.push_back(args[i].literal());
+ }
+}
+
+void VariableTree::localsReady(const GDBMI::ResultRecord& r)
+{
+ const GDBMI::Value& locals = r["locals"];
+
+ for(unsigned i = 0; i < locals.size(); ++i)
+ {
+ QString val = locals[i].literal();
+
+ // Check ada internal variables like <R45b>, <L23R> ...
+ bool is_ada_variable = (val[0] == '<' && val[val.length() - 1] == '>');
+
+ if (!is_ada_variable)
+ {
+ locals_and_arguments.push_back(val);
+ }
+ }
+
+ controller_->addCommand(new CliCommand("info frame",
+ this,
+ &VariableTree::frameIdReady));
+}
+
+void VariableTree::frameIdReady(const QValueVector<QString>& lines)
+{
+ //kdDebug(9012) << "localAddresses: " << lines[1] << "\n";
+
+ QString frame_info;
+ for(unsigned i = 1; i < lines.size(); ++i)
+ frame_info += lines[i];
+
+ kdDebug(9012) << "frame info: " << frame_info << "\n";
+ frame_info.replace('\n', "");
+
+ static QRegExp frame_base_rx("frame at 0x([0-9a-fA-F]*)");
+ static QRegExp frame_code_rx("saved [a-zA-Z0-9]* 0x([0-9a-fA-F]*)");
+
+ int i = frame_base_rx.search(frame_info);
+ int i2 = frame_code_rx.search(frame_info);
+
+ bool frameIdChanged = false;
+
+ VarFrameRoot *frame = demand_frame_root(
+ controller_->currentFrame(), controller_->currentThread());
+
+ if (frame != currentFrameItem)
+ {
+ if (currentFrameItem)
+ {
+ currentFrameItem->setVisible(false);
+ }
+ }
+ currentFrameItem = frame;
+ currentFrameItem->setVisible(true);
+
+
+ if (i != -1 && i2 != -1)
+ {
+ unsigned long long new_frame_base =
+ frame_base_rx.cap(1).toULongLong(0, 16);
+ unsigned long long new_code_address =
+ frame_code_rx.cap(1).toULongLong(0, 16);
+ kdDebug(9012) << "Frame base = " << QString::number(new_frame_base, 16)
+ << " code = " << QString::number(new_code_address, 16)
+ << "\n";
+ kdDebug(9012) << "Previous frame " <<
+ QString::number(frame->currentFrameBase, 16)
+ << " code = " << QString::number(
+ frame->currentFrameCodeAddress, 16)
+ << "\n";
+
+ frameIdChanged = (new_frame_base != frame->currentFrameBase ||
+ new_code_address != frame->currentFrameCodeAddress);
+
+ frame->currentFrameBase = new_frame_base;
+ frame->currentFrameCodeAddress = new_code_address;
+ }
+ else
+ {
+ KMessageBox::information(
+ 0,
+ "<b>Can't get frame id</b>"
+ "Could not found frame id from output of 'info frame'. "
+ "Further debugging can be unreliable. ",
+ i18n("Internal error"), "gdb_error");
+ }
+
+ if (frameIdChanged)
+ {
+ // Remove all variables.
+ // FIXME: probably, need to do this in all frames.
+ QListViewItem* child = frame->firstChild();
+ QListViewItem* next;
+ for(; child; child = next)
+ {
+ next = child->nextSibling();
+ delete child;
+ }
+ }
+
+ setUpdatesEnabled(false);
+
+ std::set<QListViewItem*> alive;
+
+ for(unsigned i = 0; i < locals_and_arguments.size(); ++i)
+ {
+ QString name = locals_and_arguments[i];
+
+ // See if we've got VarItem for this one already.
+ VarItem* var = 0;
+ for(QListViewItem *child = frame->firstChild();
+ child;
+ child = child->nextSibling())
+ {
+ if (child->text(VarNameCol) == name)
+ {
+ var = dynamic_cast<VarItem*>(child);
+ break;
+ }
+ }
+ if (!var)
+ {
+ var = new VarItem(frame, name);
+ }
+ alive.insert(var);
+
+ var->clearHighlight();
+ }
+
+ // Remove VarItems that don't correspond to any local
+ // variables any longer. Perform type/address updates
+ // for others.
+ for(QListViewItem* child = frame->firstChild(); child;)
+ {
+ QListViewItem* current = child;
+ child = current->nextSibling();
+ if (!alive.count(current))
+ delete current;
+ else
+ static_cast<VarItem*>(current)->recreateLocallyMaybe();
+ }
+
+ for(QListViewItem* child = findWatch()->firstChild();
+ child; child = child->nextSibling())
+ {
+ VarItem* var = static_cast<VarItem*>(child);
+ var->clearHighlight();
+ // For watched expressions, we don't have an easy way
+ // to check if their meaning is still the same, so
+ // unconditionally recreate them.
+ var->recreate();
+ }
+
+ // Note: can't use --all-values in this command, because gdb will
+ // die if there's any uninitialized variable. Ouch!
+ controller_->addCommand(new GDBCommand(
+ "-var-update *",
+ this,
+ &VariableTree::handleVarUpdate));
+
+ controller_->addCommand(new SentinelCommand(
+ this,
+ &VariableTree::variablesFetchDone));
+}
+
+void VariableTree::handleVarUpdate(const GDBMI::ResultRecord& r)
+{
+ const GDBMI::Value& changed = r["changelist"];
+
+ std::set<QString> names_to_update;
+
+ for(unsigned i = 0; i < changed.size(); ++i)
+ {
+ const GDBMI::Value& c = changed[i];
+
+ QString name = c["name"].literal();
+ if (c.hasField("in_scope") && c["in_scope"].literal() == "false")
+ continue;
+
+ names_to_update.insert(name);
+ }
+
+ QMap<QString, VarItem*>::iterator i, e;
+ for (i = varobj2varitem.begin(), e = varobj2varitem.end(); i != e; ++i)
+ {
+ if (names_to_update.count(i.key())
+ || i.data()->updateUnconditionally())
+ {
+ i.data()->updateValue();
+ }
+ }
+}
+
+void VarItem::handleCliPrint(const QValueVector<QString>& lines)
+{
+ static QRegExp r("(\\$[0-9]+)");
+ if (lines.size() >= 2)
+ {
+ int i = r.search(lines[1]);
+ if (i == 0)
+ {
+ controller_->addCommand(
+ new GDBCommand(QString("-var-create %1 * \"%2\"")
+ .arg(varobjName_)
+ .arg(r.cap(1)),
+ this,
+ &VarItem::varobjCreated,
+ // On initial create, errors get reported
+ // by generic code. After then, errors
+ // are swallowed by varobjCreated.
+ initialCreation_ ? false : true));
+ }
+ else
+ {
+ // FIXME: merge all output lines together.
+ // FIXME: add 'debuggerError' to debuggerpart.
+ KMessageBox::information(
+ 0,
+ i18n("<b>Debugger error</b><br>") + lines[1],
+ i18n("Debugger error"), "gdb_error");
+ }
+ }
+}
+
+
+void VariableTree::variablesFetchDone()
+{
+ // During parsing of fetched variable values, we might have issued
+ // extra command to handle 'special values', like QString.
+ // We don't want to enable updates just yet, because this will cause
+ // flicker, so add a sentinel command just to enable updates.
+ //
+ // We need this intermediate hook because commands for special
+ // representation are issues when responses to orginary fetch
+ // values commands are received, so we can add sentinel command after
+ // special representation fetch only when commands for ordinary
+ // fetch are all executed.
+ controller_->addCommand(new SentinelCommand(
+ this,
+ &VariableTree::fetchSpecialValuesDone));
+
+}
+
+void VariableTree::fetchSpecialValuesDone()
+{
+ // FIXME: can currentFrame_ or currentThread_ change between
+ // start of var fetch and call of 'variablesFetchDone'?
+ VarFrameRoot *frame = demand_frame_root(
+ controller_->currentFrame(), controller_->currentThread());
+
+// frame->trim();
+
+ frame->needLocals_ = false;
+
+ setUpdatesEnabled(true);
+ triggerUpdate();
+
+ kdDebug(9012) << "Time to fetch variables: " << fetch_time.elapsed() <<
+ "ms\n";
+}
+
+void
+VariableTree::slotItemRenamed(QListViewItem* item, int col, const QString& text)
+{
+ if (col == ValueCol)
+ {
+ VarItem* v = dynamic_cast<VarItem*>(item);
+ Q_ASSERT(v);
+ if (v)
+ {
+ v->setValue(text);
+ }
+ }
+}
+
+
+void VariableTree::keyPressEvent(QKeyEvent* e)
+{
+ if (VarItem* item = dynamic_cast<VarItem*>(currentItem()))
+ {
+ QString text = e->text();
+
+ if (text == "n" || text == "x" || text == "d" || text == "c"
+ || text == "t")
+ {
+ item->setFormat(
+ item->formatFromGdbModifier(text[0].latin1()));
+ }
+
+ if (e->key() == Qt::Key_Delete)
+ {
+ QListViewItem* root = findRoot(item);
+
+ if (dynamic_cast<WatchRoot*>(root) || root == recentExpressions_)
+ {
+ delete item;
+ }
+ }
+
+ if (e->key() == Qt::Key_C && e->state() == Qt::ControlButton)
+ {
+ copyToClipboard(item);
+ }
+ }
+}
+
+
+void VariableTree::copyToClipboard(QListViewItem* item)
+{
+ QClipboard *qb = KApplication::clipboard();
+ QString text = item->text( 1 );
+
+ qb->setText( text, QClipboard::Clipboard );
+}
+
+void VariableTree::handleAddressComputed(const GDBMI::ResultRecord& r)
+{
+ if (r.reason == "error")
+ {
+ // Not lvalue, leave item disabled.
+ return;
+ }
+
+ if (activePopup_)
+ {
+ activePopup_->setItemEnabled(idToggleWatch, true);
+
+ unsigned long long address = r["value"].literal().toULongLong(0, 16);
+ if (breakpointWidget_->hasWatchpointForAddress(address))
+ {
+ activePopup_->setItemChecked(idToggleWatch, true);
+ }
+ }
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+TrimmableItem::TrimmableItem(VariableTree *parent)
+ : KListViewItem (parent, parent->lastChild())
+{
+}
+
+// **************************************************************************
+
+TrimmableItem::TrimmableItem(TrimmableItem *parent)
+ : KListViewItem (parent, parent->lastChild())
+{
+}
+
+// **************************************************************************
+
+TrimmableItem::~TrimmableItem()
+{
+}
+
+// **************************************************************************
+
+void TrimmableItem::paintCell(QPainter *p, const QColorGroup &cg,
+ int column, int width, int align)
+{
+ if ( !p )
+ return;
+ // make toplevel item (watch and frame items) names bold
+ if (column == 0 && !parent())
+ {
+ QFont f = p->font();
+ f.setBold(true);
+ p->setFont(f);
+ }
+ QListViewItem::paintCell( p, cg, column, width, align );
+}
+
+QListViewItem *TrimmableItem::lastChild() const
+{
+ QListViewItem *child = firstChild();
+ if (child)
+ while (QListViewItem *nextChild = child->nextSibling())
+ child = nextChild;
+
+ return child;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+int VarItem::varobjIndex = 0;
+
+VarItem::VarItem(TrimmableItem *parent,
+ const QString& expression,
+ bool frozen)
+ : TrimmableItem (parent),
+ expression_(expression),
+ highlight_(false),
+ oldSpecialRepresentationSet_(false),
+ format_(natural),
+ numChildren_(0),
+ childrenFetched_(false),
+ updateUnconditionally_(false),
+ frozen_(frozen),
+ initialCreation_(true),
+ baseClassMember_(false),
+ alive_(true)
+{
+ connect(this, SIGNAL(varobjNameChange(const QString&, const QString&)),
+ varTree(),
+ SLOT(slotVarobjNameChanged(const QString&, const QString&)));
+
+
+ // User might have entered format together with expression: like
+ // /x i1+i2
+ // If we do nothing, it will be impossible to watch the variable in
+ // different format, as we'll just add extra format specifier.
+ // So:
+ // - detect initial value of format_
+ // - remove the format specifier from the string.
+
+ static QRegExp explicit_format("^\\s*/(.)\\s*(.*)");
+ if (explicit_format.search(expression_) == 0)
+ {
+ format_ = formatFromGdbModifier(explicit_format.cap(1)[0].latin1());
+ expression_ = explicit_format.cap(2);
+ }
+
+ setText(VarNameCol, expression_);
+ // Allow to change variable name by editing.
+ setRenameEnabled(ValueCol, true);
+
+ // Need to store this locally, since varTree() is 0 in
+ // destructor.
+ controller_ = varTree()->controller();
+
+ createVarobj();
+}
+
+VarItem::VarItem(TrimmableItem *parent, const GDBMI::Value& varobj,
+ format_t format, bool baseClassMember)
+: TrimmableItem (parent),
+ highlight_(false),
+ oldSpecialRepresentationSet_(false),
+ format_(format),
+ numChildren_(0),
+ childrenFetched_(false),
+ updateUnconditionally_(false),
+ frozen_(false),
+ initialCreation_(false),
+ baseClassMember_(baseClassMember),
+ alive_(true)
+{
+ connect(this, SIGNAL(varobjNameChange(const QString&, const QString&)),
+ varTree(),
+ SLOT(slotVarobjNameChanged(const QString&, const QString&)));
+
+ expression_ = varobj["exp"].literal();
+ varobjName_ = varobj["name"].literal();
+
+ varobjNameChange("", varobjName_);
+
+ setText(VarNameCol, displayName());
+
+ // Allow to change variable name by editing.
+ setRenameEnabled(ValueCol, true);
+
+ controller_ = varTree()->controller();
+
+ // Set type and children.
+ originalValueType_ = varobj["type"].literal();
+ numChildren_ = varobj["numchild"].literal().toInt();
+ setExpandable(numChildren_ != 0);
+
+
+ // Get the initial value.
+ updateValue();
+}
+
+void VarItem::createVarobj()
+{
+ QString old = varobjName_;
+ varobjName_ = QString("KDEV%1").arg(varobjIndex++);
+ emit varobjNameChange(old, varobjName_);
+
+ if (frozen_)
+ {
+ // MI has no way to freeze a variable object. So, we
+ // issue print command that returns $NN convenience
+ // variable and we create variable object from that.
+ controller_->addCommand(
+ new CliCommand(
+ QString("print %1").arg(expression_),
+ this,
+ &VarItem::handleCliPrint));
+ }
+ else
+ {
+ controller_->addCommand(
+ new CliCommand(
+ QString("print /x &%1").arg(expression_),
+ this,
+ &VarItem::handleCurrentAddress,
+ true));
+
+ controller_->addCommand(
+ // Need to quote expression, otherwise gdb won't like
+ // spaces inside it.
+ new GDBCommand(QString("-var-create %1 * \"%2\"")
+ .arg(varobjName_)
+ .arg(expression_),
+ this,
+ &VarItem::varobjCreated,
+ initialCreation_ ? false : true));
+ }
+}
+
+void VarItem::varobjCreated(const GDBMI::ResultRecord& r)
+{
+ // If we've tried to recreate varobj (for example for watched expression)
+ // after step, and it's no longer valid, it's fine.
+ if (r.reason == "error")
+ {
+ varobjName_ = "";
+ return;
+ }
+ setAliveRecursively(true);
+
+ QString oldType = originalValueType_;
+ originalValueType_ = r["type"].literal();
+ if (!oldType.isEmpty() && oldType != originalValueType_)
+ {
+ // Type changed, the children might be no longer valid,
+ // so delete them.
+ for(QListViewItem* child = firstChild(); child; )
+ {
+ QListViewItem* cur = child;
+ child = child->nextSibling();
+ delete cur;
+ }
+ }
+
+ if (r.hasField("exp"))
+ expression_ = r["exp"].literal();
+ numChildren_ = r["numchild"].literal().toInt();
+ setExpandable(numChildren_ != 0);
+ currentAddress_ = lastObtainedAddress_;
+
+ setVarobjName(varobjName_);
+}
+
+void VarItem::setVarobjName(const QString& name)
+{
+ if (varobjName_ != name)
+ emit varobjNameChange(varobjName_, name);
+
+ varobjName_ = name;
+
+ if (format_ != natural)
+ {
+ controller_->addCommand(
+ new GDBCommand(QString("-var-set-format \"%1\" %2")
+ .arg(varobjName_).arg(varobjFormatName())));
+ }
+
+ // Get the initial value.
+ updateValue();
+
+ if (isOpen())
+ {
+ // This regets children list.
+ setOpen(true);
+ }
+}
+
+void VarItem::valueDone(const GDBMI::ResultRecord& r)
+{
+ if (r.reason == "done")
+ {
+ QString s = GDBParser::getGDBParser()->undecorateValue(
+ r["value"].literal());
+
+ if (format_ == character)
+ {
+ QString encoded = s;
+ bool ok;
+ int value = s.toInt(&ok);
+ if (ok)
+ {
+ char c = (char)value;
+ encoded += " '";
+ if (std::isprint(c))
+ encoded += c;
+ else {
+ // Try common escape characters.
+ static char backslashed[] = {'a', 'b', 'f', 'n',
+ 'r', 't', 'v', '0'};
+ static char represented[] = "\a\b\f\n\r\t\v";
+
+ const char* ix = strchr (represented, c);
+ if (ix) {
+ encoded += "\\";
+ encoded += backslashed[ix - represented];
+ }
+ else
+ encoded += "\\" + s;
+ }
+ encoded += "'";
+ s = encoded;
+ }
+ }
+
+ if (format_ == binary)
+ {
+ // For binary format, split the value at 4-bit boundaries
+ static QRegExp r("^[01]+$");
+ int i = r.search(s);
+ if (i == 0)
+ {
+ QString split;
+ for(unsigned i = 0; i < s.length(); ++i)
+ {
+ // For string 11111, we should split it as
+ // 1 1111, not as 1111 1.
+
+ // 0 is past the end character
+ int distance = i - s.length();
+
+ if (distance % 4 == 0 && !split.isEmpty())
+ split.append(' ');
+ split.append(s[i]);
+ }
+ s = split;
+ }
+ }
+
+ setText(ValueCol, s);
+ }
+ else
+ {
+ QString s = r["msg"].literal();
+ // Error response.
+ if (s.startsWith("Cannot access memory"))
+ {
+ s = "(inaccessible)";
+ setExpandable(false);
+ }
+ else
+ {
+ setExpandable(numChildren_ != 0);
+ }
+ setText(ValueCol, s);
+ }
+}
+
+void VarItem::createChildren(const GDBMI::ResultRecord& r,
+ bool children_of_fake)
+{
+ const GDBMI::Value& children = r["children"];
+
+ /* In order to figure out which variable objects correspond
+ to base class subobject, we first must detect if *this
+ is a structure type. We use present of 'public'/'private'/'protected'
+ fake child as an indicator. */
+ bool structureType = false;
+ if (!children_of_fake && children.size() > 0)
+ {
+ QString exp = children[0]["exp"].literal();
+ bool ok = false;
+ exp.toInt(&ok);
+ if (!ok || exp[0] != '*')
+ {
+ structureType = true;
+ }
+ }
+
+ for (unsigned i = 0; i < children.size(); ++i)
+ {
+ QString exp = children[i]["exp"].literal();
+ // For artificial accessibility nodes,
+ // fetch their children.
+ if (exp == "public" || exp == "protected" || exp == "private")
+ {
+ QString name = children[i]["name"].literal();
+ controller_->addCommand(new GDBCommand(
+ "-var-list-children \"" +
+ name + "\"",
+ this,
+ &VarItem::childrenOfFakesDone));
+ }
+ else
+ {
+ /* All children of structures that are not artifical
+ are base subobjects. */
+ bool baseObject = structureType;
+
+ VarItem* existing = 0;
+ for(QListViewItem* child = firstChild();
+ child; child = child->nextSibling())
+ {
+ VarItem* v = static_cast<VarItem*>(child);
+ kdDebug(9012) << "Child exp : " << v->expression_ <<
+ " new exp " << exp << "\n";
+
+ if (v->expression_ == exp)
+ {
+ existing = v;
+ }
+ }
+ if (existing)
+ {
+ existing->setVarobjName(children[i]["name"].literal());
+ }
+ else
+ {
+ kdDebug(9012) << "Creating new varobj "
+ << exp << " " << baseObject << "\n";
+ // Propagate format from parent.
+ VarItem* v = 0;
+ v = new VarItem(this, children[i], format_, baseObject);
+ }
+ }
+ }
+}
+
+
+void VarItem::childrenDone(const GDBMI::ResultRecord& r)
+{
+ createChildren(r, false);
+ childrenFetched_ = true;
+}
+
+void VarItem::childrenOfFakesDone(const GDBMI::ResultRecord& r)
+{
+ createChildren(r, true);
+}
+
+void VarItem::handleCurrentAddress(const QValueVector<QString>& lines)
+{
+ lastObtainedAddress_ = "";
+ if (lines.count() > 1)
+ {
+ static QRegExp r("\\$\\d+ = ([^\n]*)");
+ int i = r.search(lines[1]);
+ if (i == 0)
+ {
+ lastObtainedAddress_ = r.cap(1);
+ kdDebug(9012) << "new address " << lastObtainedAddress_ << "\n";
+ }
+ }
+}
+
+void VarItem::handleType(const QValueVector<QString>& lines)
+{
+ bool recreate = false;
+
+ if (lastObtainedAddress_ != currentAddress_)
+ {
+ kdDebug(9012) << "Address changed from " << currentAddress_
+ << " to " << lastObtainedAddress_ << "\n";
+ recreate = true;
+ }
+ else
+ {
+ // FIXME: add error diagnostic.
+ if (lines.count() > 1)
+ {
+ static QRegExp r("type = ([^\n]*)");
+ int i = r.search(lines[1]);
+ if (i == 0)
+ {
+ kdDebug(9012) << "found type: " << r.cap(1) << "\n";
+ kdDebug(9012) << "original Type: " << originalValueType_ << "\n";
+
+ if (r.cap(1) != originalValueType_)
+ {
+ recreate = true;
+ }
+ }
+ }
+ }
+ if (recreate)
+ {
+ this->recreate();
+ }
+}
+
+QString VarItem::displayName() const
+{
+ if (expression_[0] != '*')
+ return expression_;
+
+ if (const VarItem* parent =
+ dynamic_cast<const VarItem*>(TrimmableItem::parent()))
+ {
+ return "*" + parent->displayName();
+ }
+ else
+ {
+ return expression_;
+ }
+}
+
+void VarItem::setAliveRecursively(bool enable)
+{
+ setEnabled(enable);
+ alive_ = true;
+
+ for(QListViewItem* child = firstChild();
+ child; child = child->nextSibling())
+ {
+ static_cast<VarItem*>(child)->setAliveRecursively(enable);
+ }
+}
+
+
+VarItem::~VarItem()
+{
+ unhookFromGdb();
+}
+
+QString VarItem::gdbExpression() const
+{
+ // The expression for this item can be either:
+ // - number, for array element
+ // - identifier, for member,
+ // - ***intentifier, for derefenreced pointer.
+ const VarItem* parent = dynamic_cast<const VarItem*>(TrimmableItem::parent());
+
+ bool ok = false;
+ expression_.toInt(&ok);
+ if (ok)
+ {
+ // Array, parent always exists.
+ return parent->gdbExpression() + "[" + expression_ + "]";
+ }
+ else if (expression_[0] == '*')
+ {
+ if (parent)
+ {
+ // For MI, expression_ can be "*0" (meaing
+ // references 0-th element of some array).
+ // So, we really need to get to the parent to computed the right
+ // gdb expression.
+ return "*" + parent->gdbExpression();
+ }
+ else
+ {
+ // Parent can be null for watched expressions. In that case,
+ // expression_ should be a valid C++ expression.
+ return expression_;
+ }
+ }
+ else
+ {
+ if (parent)
+ /* This is varitem corresponds to a base suboject,
+ the expression should cast parent to the base's
+ type. */
+ if (baseClassMember_)
+ return "((" + expression_ + ")" + parent->gdbExpression() + ")";
+ else
+ return parent->gdbExpression() + "." + expression_;
+ else
+ return expression_;
+ }
+}
+
+// **************************************************************************
+
+
+// FIXME: we have two method to set VarItem: this one
+// and updateValue below. That's bad, must have just one.
+void VarItem::setText(int column, const QString &data)
+{
+ QString strData=data;
+
+ if (column == ValueCol) {
+ QString oldValue(text(column));
+ if (!oldValue.isEmpty()) // Don't highlight new items
+ {
+ highlight_ = (oldValue != QString(data));
+ }
+ }
+
+ QListViewItem::setText(column, strData);
+}
+
+void VarItem::clearHighlight()
+{
+ highlight_ = false;
+
+ for(QListViewItem* child = firstChild();
+ child; child = child->nextSibling())
+ {
+ static_cast<VarItem*>(child)->clearHighlight();
+ }
+}
+
+// **************************************************************************
+
+void VarItem::updateValue()
+{
+ if (handleSpecialTypes())
+ {
+ // 1. Gdb never includes structures in output from -var-update
+ // 2. Even if it did, the internal state of object can be
+ // arbitrary complex and gdb can't detect if pretty-printed
+ // value remains the same.
+ // So, we need to reload value on each step.
+ updateUnconditionally_ = true;
+ return;
+ }
+ updateUnconditionally_ = false;
+
+ controller_->addCommand(
+ new GDBCommand(
+ "-var-evaluate-expression \"" + varobjName_ + "\"",
+ this,
+ &VarItem::valueDone,
+ true /* handle error */));
+}
+
+void VarItem::setValue(const QString& new_value)
+{
+ controller_->addCommand(
+ new GDBCommand(QString("-var-assign \"%1\" %2").arg(varobjName_)
+ .arg(new_value)));
+
+ // And immediately reload it from gdb,
+ // so that it's display format is the one gdb uses,
+ // not the one user has typed. Otherwise, on the next
+ // step, the visible value might change and be highlighted
+ // as changed, which is bogus.
+ updateValue();
+}
+
+void VarItem::updateSpecialRepresentation(const QString& xs)
+{
+ QString s(xs);
+ if (s[0] == '$')
+ {
+ int i = s.find('=');
+ if (i != -1)
+ s = s.mid(i+2);
+ }
+
+ // A hack to nicely display QStrings. The content of QString is unicode
+ // for for ASCII only strings we get ascii character mixed with \000.
+ // Remove those \000 now.
+
+ // This is not very nice, becuse we're doing this unconditionally
+ // and this method can be called twice: first with data that gdb sends
+ // for a variable, and second after we request the string data. In theory
+ // the data sent by gdb might contain \000 that should not be translated.
+ //
+ // What's even worse, ideally we should convert the string data from
+ // gdb into a QString again, handling all other escapes and composing
+ // one QChar from two characters from gdb. But to do that, we *should*
+ // now if the data if generic gdb value, and result of request for string
+ // data. Fixing is is for later.
+ s.replace( QRegExp("\\\\000|\\\\0"), "" );
+
+ // FIXME: for now, assume that all special representations are
+ // just strings.
+
+ s = GDBParser::getGDBParser()->undecorateValue(s);
+
+ setText(ValueCol, s);
+ // On the first stop, when VarItem was just created,
+ // don't show it in red.
+ if (oldSpecialRepresentationSet_)
+ highlight_ = (oldSpecialRepresentation_ != s);
+ else
+ highlight_ = false;
+
+ oldSpecialRepresentationSet_ = true;
+ oldSpecialRepresentation_ = s;
+}
+
+void VarItem::recreateLocallyMaybe()
+{
+ controller_->addCommand(
+ new CliCommand(
+ QString("print /x &%1").arg(expression_),
+ this,
+ &VarItem::handleCurrentAddress,
+ true));
+
+ controller_->addCommand(
+ new CliCommand(
+ QString("whatis %1").arg(expression_),
+ this,
+ &VarItem::handleType));
+}
+
+void VarItem::recreate()
+{
+ unhookFromGdb();
+
+ initialCreation_ = false;
+ createVarobj();
+}
+
+
+// **************************************************************************
+
+void VarItem::setOpen(bool open)
+{
+ QListViewItem::setOpen(open);
+
+ if (open && !childrenFetched_)
+ {
+ controller_->addCommand(new GDBCommand(
+ "-var-list-children \"" + varobjName_ + "\"",
+ this,
+ &VarItem::childrenDone));
+ }
+}
+
+bool VarItem::handleSpecialTypes()
+{
+ kdDebug(9012) << "handleSpecialTypes: " << originalValueType_ << "\n";
+ if (originalValueType_.isEmpty())
+ return false;
+
+ static QRegExp qstring("^(const)?[ ]*QString[ ]*&?$");
+
+ if (qstring.exactMatch(originalValueType_)) {
+
+ VariableTree* varTree = static_cast<VariableTree*>(listView());
+ if( !varTree->controller() )
+ return false;
+ varTree->controller()->addCommand(
+ new ResultlessCommand(QString("print $kdev_d=%1.d")
+ .arg(gdbExpression()),
+ true /* ignore error */));
+
+ if (varTree->controller()->qtVersion() >= 4)
+ varTree->controller()->addCommand(
+ new ResultlessCommand(QString("print $kdev_s=$kdev_d.size"),
+ true));
+ else
+ varTree->controller()->addCommand(
+ new ResultlessCommand(QString("print $kdev_s=$kdev_d.len"),
+ true));
+
+ varTree->controller()->addCommand(
+ new ResultlessCommand(
+ QString("print $kdev_s= ($kdev_s > 0)? ($kdev_s > 100 ? 200 : 2*$kdev_s) : 0"),
+ true));
+
+ if (varTree->controller()->qtVersion() >= 4)
+ varTree->controller()->addCommand(
+ new ValueSpecialRepresentationCommand(
+ this, "print ($kdev_s>0) ? (*((char*)&$kdev_d.data[0])@$kdev_s) : \"\""));
+ else
+ varTree->controller()->addCommand(
+ new ValueSpecialRepresentationCommand(
+ this, "print ($kdev_s>0) ? (*((char*)&$kdev_d.unicode[0])@$kdev_s) : \"\""));
+
+ return true;
+ }
+
+ return false;
+}
+
+// **************************************************************************
+
+VarItem::format_t VarItem::format() const
+{
+ return format_;
+}
+
+void VarItem::setFormat(format_t f)
+{
+ if (f == format_)
+ return;
+
+ format_ = f;
+
+ if (numChildren_)
+ {
+ // If variable has children, change format for children.
+ // - for structures, that's clearly right
+ // - for arrays, that's clearly right
+ // - for pointers, this can be confusing, but nobody ever wants to
+ // see the pointer in decimal!
+ for(QListViewItem* child = firstChild();
+ child; child = child->nextSibling())
+ {
+ static_cast<VarItem*>(child)->setFormat(f);
+ }
+ }
+ else
+ {
+ controller_->addCommand(
+ new GDBCommand(QString("-var-set-format \"%1\" %2")
+ .arg(varobjName_).arg(varobjFormatName())));
+
+ updateValue();
+ }
+}
+
+VarItem::format_t VarItem::formatFromGdbModifier(char c) const
+{
+ format_t nf;
+ switch(c)
+ {
+ case 'n': // Not quite gdb modifier, but used in our UI.
+ nf = natural; break;
+ case 'x':
+ nf = hexadecimal; break;
+ case 'd':
+ nf = decimal; break;
+ case 'c':
+ nf = character; break;
+ case 't':
+ nf = binary; break;
+ default:
+ nf = natural; break;
+ }
+ return nf;
+}
+
+QString VarItem::varobjFormatName() const
+{
+ switch(format_)
+ {
+ case natural:
+ return "natural";
+ break;
+
+ case hexadecimal:
+ return "hexadecimal";
+ break;
+
+ case decimal:
+ return "decimal";
+ break;
+
+ // Note: gdb does not support 'character' natively,
+ // so we'll generate appropriate representation
+ // ourselfs.
+ case character:
+ return "decimal";
+ break;
+
+ case binary:
+ return "binary";
+ break;
+ }
+ return "<undefined>";
+}
+
+
+// **************************************************************************
+
+// Overridden to highlight the changed items
+void VarItem::paintCell(QPainter *p, const QColorGroup &cg,
+ int column, int width, int align)
+{
+ if ( !p )
+ return;
+
+ // Draw values in fixed font. For example, when there are several
+ // pointer variables, it's nicer if they are aligned -- it allows
+ // to easy see the diferrence between the pointers.
+ if (column == ValueCol)
+ {
+ p->setFont(KGlobalSettings::fixedFont());
+ }
+
+ if (!alive_)
+ {
+ /* Draw this as disabled. */
+ QListViewItem::paintCell(p, varTree()->QWidget::palette().disabled(),
+ column, width, align);
+ }
+ else
+ {
+ if (column == ValueCol && highlight_)
+ {
+ QColorGroup hl_cg( cg.foreground(), cg.background(), cg.light(),
+ cg.dark(), cg.mid(), red, cg.base());
+ QListViewItem::paintCell( p, hl_cg, column, width, align );
+ } else
+ QListViewItem::paintCell( p, cg, column, width, align );
+ }
+}
+
+
+VariableTree* VarItem::varTree() const
+{
+ return static_cast<VariableTree*>(listView());
+}
+
+void VarItem::unhookFromGdb()
+{
+ // Unhook children first, so that child varitems are deleted
+ // before parent. Strictly speaking, we can avoid calling
+ // -var-delete on child varitems, but that's a bit cheesy,
+ for(QListViewItem* child = firstChild();
+ child; child = child->nextSibling())
+ {
+ static_cast<VarItem*>(child)->unhookFromGdb();
+ }
+
+ alive_ = false;
+ childrenFetched_ = false;
+
+ emit varobjNameChange(varobjName_, "");
+
+ if (!controller_->stateIsOn(s_dbgNotStarted) && !varobjName_.isEmpty())
+ {
+ controller_->addCommand(
+ new GDBCommand(
+ QString("-var-delete \"%1\"").arg(varobjName_)));
+ }
+
+ varobjName_ = "";
+}
+
+// **************************************************************************
+
+QString VarItem::tipText() const
+{
+ const unsigned int maxTooltipSize = 70;
+ QString tip = text( ValueCol );
+
+ if (tip.length() > maxTooltipSize)
+ tip = tip.mid(0, maxTooltipSize - 1 ) + " [...]";
+
+ if (!tip.isEmpty())
+ tip += "\n" + originalValueType_;
+
+ return tip;
+}
+
+bool VarItem::updateUnconditionally() const
+{
+ return updateUnconditionally_;
+}
+
+bool VarItem::isAlive() const
+{
+ return alive_;
+}
+
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+VarFrameRoot::VarFrameRoot(VariableTree *parent, int frameNo, int threadNo)
+ : TrimmableItem (parent),
+ needLocals_(false),
+ frameNo_(frameNo),
+ threadNo_(threadNo),
+ currentFrameBase((unsigned long long)-1),
+ currentFrameCodeAddress((unsigned long long)-1)
+{
+ setExpandable(true);
+}
+
+// **************************************************************************
+
+VarFrameRoot::~VarFrameRoot()
+{
+}
+
+void VarFrameRoot::setOpen(bool open)
+{
+ bool frameOpened = ( isOpen()==false && open==true );
+ QListViewItem::setOpen(open);
+
+ if (frameOpened && needLocals_)
+ {
+ needLocals_ = false;
+ VariableTree* parent = static_cast<VariableTree*>(listView());
+ parent->updateCurrentFrame();
+ }
+}
+
+// **************************************************************************
+
+bool VarFrameRoot::matchDetails(int frameNo, int threadNo)
+{
+ return frameNo == frameNo_ && threadNo == threadNo_;
+}
+
+void VarFrameRoot::setDirty()
+{
+ needLocals_ = true;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+WatchRoot::WatchRoot(VariableTree *parent)
+ : TrimmableItem(parent)
+{
+ setText(0, i18n("Watch"));
+ setOpen(true);
+}
+
+// **************************************************************************
+
+WatchRoot::~WatchRoot()
+{
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+}
+
+
+#include "variablewidget.moc"
+
diff --git a/languages/cpp/debugger/variablewidget.h b/languages/cpp/debugger/variablewidget.h
new file mode 100644
index 00000000..369f5748
--- /dev/null
+++ b/languages/cpp/debugger/variablewidget.h
@@ -0,0 +1,466 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _VARIABLEWIDGET_H_
+#define _VARIABLEWIDGET_H_
+
+#include "gdbcontroller.h"
+#include "mi/gdbmi.h"
+
+#include <klistview.h>
+#include <kcombobox.h>
+#include <qwidget.h>
+#include <qtooltip.h>
+#include <qvaluevector.h>
+#include <qdatetime.h>
+#include <qguardedptr.h>
+#include <qmap.h>
+
+#include <vector>
+
+class KLineEdit;
+class KPopupMenu;
+
+namespace GDBDebugger
+{
+
+class TrimmableItem;
+class VarFrameRoot;
+class WatchRoot;
+class VarItem;
+class VariableTree;
+class DbgController;
+class GDBBreakpointWidget;
+
+enum { VarNameCol = 0, ValueCol = 1, VarTypeCol = 2};
+enum DataType { typeUnknown, typeValue, typePointer, typeReference,
+ typeStruct, typeArray, typeQString, typeWhitespace,
+ typeName };
+
+class VariableWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ VariableWidget( GDBController* controller,
+ GDBBreakpointWidget* breakpointWidget,
+ QWidget *parent=0, const char *name=0 );
+
+ VariableTree *varTree() const
+ { return varTree_; }
+
+protected: // QWidget overrides
+ void focusInEvent(QFocusEvent *e);
+
+public slots:
+ void slotAddWatchVariable();
+ void slotAddWatchVariable(const QString &ident);
+ void slotEvaluateExpression();
+ void slotEvaluateExpression(const QString &ident);
+
+private:
+ VariableTree *varTree_;
+// KLineEdit *watchVarEntry_;
+ friend class VariableTree;
+
+ KHistoryCombo *watchVarEditor_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VariableTree : public KListView, public QToolTip
+{
+ Q_OBJECT
+public:
+ VariableTree(VariableWidget *parent,
+ GDBController* controller,
+ GDBBreakpointWidget* breakpointWidget,
+ const char *name=0 );
+ virtual ~VariableTree();
+
+ QListViewItem *lastChild() const;
+
+ QListViewItem *findRoot(QListViewItem *item) const;
+ VarFrameRoot *findFrame(int frameNo, int threadNo) const;
+ WatchRoot *findWatch();
+
+
+ // (from QToolTip) Display a tooltip when the cursor is over an item
+ virtual void maybeTip(const QPoint &);
+
+ GDBController* controller() const { return controller_; }
+
+signals:
+ void toggleWatchpoint(const QString &varName);
+
+public slots:
+ void slotAddWatchVariable(const QString& watchVar);
+ void slotEvaluateExpression(const QString& expression);
+
+ void slotEvent(GDBController::event_t);
+ void slotItemRenamed(QListViewItem* item, int col, const QString& text);
+
+private slots:
+ void slotContextMenu(KListView *, QListViewItem *item);
+ void slotVarobjNameChanged(const QString& from, const QString& to);
+
+private: // Callbacks for gdb commands;
+ void argumentsReady(const GDBMI::ResultRecord&);
+ void localsReady(const GDBMI::ResultRecord&);
+ void frameIdReady(const QValueVector<QString>&);
+ void handleVarUpdate(const GDBMI::ResultRecord&);
+ void handleEvaluateExpression(const QValueVector<QString>&);
+ void variablesFetchDone();
+ void fetchSpecialValuesDone();
+
+ /** This is called when address of expression for which
+ popup is created is known.
+
+ If there's no address (for rvalue), does nothing
+ (leaving "Data breakpoint" item disabled).
+ Otherwise, enabled that item, and check is we
+ have data breakpoint for that address already.
+ */
+ void handleAddressComputed(const GDBMI::ResultRecord& r);
+
+private: // helper functions
+ /** Get (if exists) and create (otherwise) frame root for
+ the specified frameNo/threadNo combination.
+ */
+ VarFrameRoot* demand_frame_root(int frameNo, int threadNo);
+
+ void updateCurrentFrame();
+
+ /** Copies the value (second column) of the specified item to
+ the clipboard.
+ */
+ void copyToClipboard(QListViewItem*);
+
+private: // QWidget overrides
+ void keyPressEvent(QKeyEvent* e);
+
+private:
+ GDBController* controller_;
+ GDBBreakpointWidget* breakpointWidget_;
+
+ int activeFlag_;
+ int iOutRadix;
+ bool justPaused_;
+
+ // Root of all recently printed expressions.
+ TrimmableItem* recentExpressions_;
+ VarFrameRoot* currentFrameItem;
+
+ QTime fetch_time;
+ // Names of locals and arguments as reported by
+ // gdb.
+ std::vector<QString> locals_and_arguments;
+
+ QMap<QString, VarItem*> varobj2varitem;
+
+ KPopupMenu* activePopup_;
+ static const int idToggleWatch = 10;
+
+ friend class VarFrameRoot;
+ friend class VarItem;
+ friend class WatchRoot;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+/** List view item that can 'trim' outdated children.
+
+ The instances of this class hold a number of children corresponding
+ to variables. When program state changes, such as after a step in source,
+ some variable values can change, and some variables can go out of scope.
+ We need
+ - highlight modified variables
+ - remove gone variables
+
+ We could just remove all children and repopulate the list from
+ the data from debugger, but then we'd loose information about previous
+ variable values.
+
+ So, we first update the values, highlighting the modified variables, and
+ keeping track which variables were recieved from gdb. After that, the
+ 'trim' method is called, removing all variables which were not recieved
+ from gdbr.
+ */
+class TrimmableItem : public KListViewItem
+{
+public:
+ TrimmableItem(VariableTree *parent);
+ TrimmableItem(TrimmableItem *parent);
+
+ virtual ~TrimmableItem();
+
+ QListViewItem *lastChild() const;
+
+protected:
+
+ void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int align );
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VarItem : public QObject,
+ public TrimmableItem
+{
+ Q_OBJECT
+public:
+ enum format_t { natural, hexadecimal, decimal, character, binary };
+
+ /** Creates top-level variable item from the specified expression.
+ Optionally, alternative display name can be provided.
+ */
+ VarItem( TrimmableItem *parent,
+ const QString& expression,
+ bool frozen = false);
+
+ VarItem( TrimmableItem *parent, const GDBMI::Value& varobj,
+ format_t format, bool baseClassMember);
+
+ virtual ~VarItem();
+
+ /// Returns the gdb expression for *this.
+ QString gdbExpression() const;
+
+ /** Returns true is this VarItem should be unconditionally
+ updated on each step, not matter what's the result of
+ -var-update command.
+ */
+ bool updateUnconditionally() const;
+
+ void updateValue();
+ void updateSpecialRepresentation(const QString& s);
+
+ /** Creates a fresh gdbs "variable object", if needed.
+ Preconditions:
+ - frame id did not change
+ - this is a root variable
+
+ If the current type of expression, or it's address, it different
+ from it was previously, creates new "variable object" and
+ fetches new value.
+
+ Otherwise, does nothing.
+ */
+ void recreateLocallyMaybe();
+
+ /** Tries to create new gdb variable object for this expression.
+ If successfull, updates all values. Otherwise, makes
+ itself disabled.
+ */
+ void recreate();
+
+ void setOpen(bool open);
+ void setText (int column, const QString& text);
+
+ /** Mark the variable as alive, or not alive.
+ Variables that are not alive a shown as "gray",
+ and nothing can be done about them except for
+ removing. */
+ void setAliveRecursively(bool enable);
+
+ /** Recursively clears the varobjName_ field, making
+ *this completely disconnected from gdb.
+ Automatically makes *this and children disables,
+ since there's no possible interaction with unhooked
+ object.
+ */
+ void unhookFromGdb();
+
+ // Returns the text to be displayed as tooltip (the value)
+ QString tipText() const;
+
+ format_t format() const;
+ void setFormat(format_t f);
+ format_t formatFromGdbModifier(char c) const;
+
+ /** Clears highliting for this variable and
+ all its children. */
+ void clearHighlight();
+
+ /** Sets new top-level textual value of this variable.
+ */
+ void setValue(const QString& new_value);
+
+ bool isAlive() const;
+
+signals:
+ /** Emitted whenever the name of varobj associated with *this changes:
+ - when we've created initial varobj
+ - when we've changed varobj name as part of 'recreate' method
+ - when *this is destroyed and no longer uses any varobj.
+
+ Either 'from' or 'to' can be empty string.
+ */
+ void varobjNameChange(const QString& from, const QString& to);
+
+private:
+
+ /** Creates new gdb "variable object". The controller_,
+ expression_ and format_ member variables should already
+ be set.
+ */
+ void createVarobj();
+
+ /** Precondition: 'name' is a name of existing
+ gdb variable object.
+ Effects:
+ - sets varobjName_ to 'name'
+ - sets format, if it's not default one
+ - gets initial value
+ - if item is open, gets children.
+ */
+ void setVarobjName(const QString& name);
+
+
+ /** Handle types that require special dispay, such as
+ QString. Return true if this is such a type.
+ The 'originalValueType_' is already initialized
+ by the time this method is called.
+ */
+ bool handleSpecialTypes();
+ void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int align );
+ void varobjCreated(const GDBMI::ResultRecord& r);
+ void valueDone(const GDBMI::ResultRecord& r);
+ void childrenDone(const GDBMI::ResultRecord& r);
+ void childrenOfFakesDone(const GDBMI::ResultRecord& r);
+ void handleCurrentAddress(const QValueVector<QString>& lines);
+ void handleType(const QValueVector<QString>& lines);
+
+ void createChildren(const GDBMI::ResultRecord& r, bool children_of_fake);
+
+ /** Called to handle the output of the cli print command.
+ */
+ void handleCliPrint(const QValueVector<QString>& lines);
+
+ // Assuming 'expression_' is already set, returns the
+ // displayName to use when showing this to the user.
+ // This function exists because if we have item with
+ // gdb expression '$1' and displayName 'P4', we want the child
+ // to show up as *P4, not as '*$1', so we can't uncondionally
+ // use expression gdb reports to us.
+ QString displayName() const;
+
+ VariableTree* varTree() const;
+
+ QString varobjFormatName() const;
+
+private:
+ // The gdb expression for this varItem relatively to
+ // parent VarItem.
+ QString expression_;
+
+ bool highlight_;
+ GDBController* controller_;
+
+ QString varobjName_;
+
+ // the non-cast type of the variable
+ QString originalValueType_;
+ bool oldSpecialRepresentationSet_;
+ QString oldSpecialRepresentation_;
+
+ format_t format_;
+
+ static int varobjIndex;
+
+ int numChildren_;
+ bool childrenFetched_;
+
+ QString currentAddress_;
+ QString lastObtainedAddress_;
+
+ bool updateUnconditionally_;
+ bool frozen_;
+
+ /* Set to true whan calling createVarobj for the
+ first time, and to false other time. */
+ bool initialCreation_;
+
+ /* Set if this VarItem corresponds to base class suboject. */
+ bool baseClassMember_;
+
+ bool alive_;
+};
+
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VarFrameRoot : public TrimmableItem
+{
+public:
+ VarFrameRoot(VariableTree *parent, int frameNo, int threadNo);
+ virtual ~VarFrameRoot();
+
+ void setOpen(bool open);
+
+ // Marks the frame as dirty, that is as having
+ // out of date values. As soon as we try to open
+ // this item, it will fetch new data.
+ void setDirty();
+
+ void setFrameName(const QString &frameName)
+ { setText(VarNameCol, frameName); setText(ValueCol, ""); }
+
+ bool needLocals() const { return needLocals_; }
+ bool matchDetails(int frameNo, int threadNo);
+
+private:
+ bool needLocals_;
+ int frameNo_;
+ int threadNo_;
+
+ // Frame base and code address of the current inner-most
+ // frame. Needed so that if we can know when 'frame N' no longer
+ // is the same as 'frame N' when this 'VarFrameRoot' was created.
+ unsigned long long currentFrameBase;
+ unsigned long long currentFrameCodeAddress;
+
+ friend class VariableTree;
+
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class WatchRoot : public TrimmableItem
+{
+public:
+ WatchRoot(VariableTree *parent);
+ virtual ~WatchRoot();
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#endif
diff --git a/languages/cpp/declarationinfo.h b/languages/cpp/declarationinfo.h
new file mode 100644
index 00000000..f1d28f26
--- /dev/null
+++ b/languages/cpp/declarationinfo.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ begin : Sat Jul 21 2001
+ copyright : (C) 2001 by Victor R�er
+ email : victor_roeder@gmx.de
+ copyright : (C) 2002,2003 by Roberto Raggi
+ email : roberto@kdevelop.org
+ copyright : (C) 2005 by Adam Treat
+ email : manyoso@yahoo.com
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef DECLARATIONINFO_H
+#define DECLARATIONINFO_H
+
+#include <qstring.h>
+
+struct DeclarationInfo {
+ class File {
+ QString m_file;
+ public:
+ File( const QString& file = "" ) : m_file( file ) {
+ }
+
+ operator QString() const {
+ return m_file;
+ }
+ };
+
+ DeclarationInfo() : startLine(0), startCol(0), endLine(0), endCol(0) {
+ }
+
+ operator bool() {
+ return !name.isEmpty();
+ }
+
+ QString locationToText() const {
+ return QString("line %1 col %2 - line %3 col %4\nfile: %5").arg(startLine).arg(startCol).arg(endLine).arg(endCol).arg(file);
+ }
+
+ QString toText() const {
+ if( name.isEmpty() ) return "";
+
+ QString ret;
+ ret = QString("name: " + name + "\n" ) + locationToText();
+ if( !comment.isEmpty() ) {
+ ret += "\n\"" + comment + "\"";
+ }
+ return ret;
+ }
+
+ int startLine, startCol;
+ int endLine, endCol;
+
+ File file;
+ QString name;
+ QString comment;
+};
+
+
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/doc/Makefile.am b/languages/cpp/doc/Makefile.am
new file mode 100644
index 00000000..55571124
--- /dev/null
+++ b/languages/cpp/doc/Makefile.am
@@ -0,0 +1,7 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = libc.toc libstdc++.toc kdetemplates.toc stl.toc qt-kdev3.toc kde2book.toc \
+ gnustep.toc gnome1.toc clanlib.toc c++_bugs_gcc.toc gtk_bugs.toc wxwidgets_bugs.toc \
+ cppannotations.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA = libc.index libstdc++.index stl.index kde2book.index
diff --git a/languages/cpp/doc/c++_bugs_gcc.toc b/languages/cpp/doc/c++_bugs_gcc.toc
new file mode 100644
index 00000000..758b6675
--- /dev/null
+++ b/languages/cpp/doc/c++_bugs_gcc.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>C++ bugs (GCC)</title>
+<base href="http://gcc.gnu.org/bugzilla/"/>
+<tocsect1 name="Query" url="query.cgi">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/cpp/doc/clanlib.toc b/languages/cpp/doc/clanlib.toc
new file mode 100644
index 00000000..04ed2041
--- /dev/null
+++ b/languages/cpp/doc/clanlib.toc
@@ -0,0 +1,384 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Clanlib</title>
+<base href="http://www.clanlib.org/docs/" />
+<tocsect1 name="Overview" url="overview/index.html">
+ <tocsect2 name="Getting started" url="overview/getting_started.html" />
+ <tocsect2 name="Display overview" url="overview/display-1.html" />
+ <tocsect2 name="Resources" url="overview/resources-1.html" />
+ <tocsect2 name="Sound overview" url="overview/sound_overview.html" />
+ <tocsect2 name="Signals &amp; Slots overview" url="overview/signals.html" />
+ <tocsect2 name="Sprites overview" url="overview/sprites_overview.html" />
+ <tocsect2 name="Font overview" url="overview/font_overview-1.html" />
+ <tocsect2 name="Loading graphics overview" url="overview/loading_graphics.html" />
+ <tocsect2 name="OpenGL overview" url="overview/opengl_overview.html" />
+ <tocsect2 name="GUI overview" url="overview/gui_overview.html" />
+ <tocsect2 name="GUI Theme/Style creation" url="overview/gui_theme.html" />
+ <tocsect2 name="GUI XML creation" url="overview/gui_resources.html" />
+ <tocsect2 name="Network overview" url="overview/network_overview.html" />
+ <tocsect2 name="Smart pointers" url="overview/pointers.html" />
+ <tocsect2 name="Post-Mortem Debugging" url="overview/crash_reporter.html" />
+ <tocsect2 name="Core resources" url="overview/core_resources.html" />
+ <tocsect2 name="Font resources" url="overview/font_resources.html" />
+ <tocsect2 name="Sprites resources" url="overview/sprites_resources.html" />
+ <tocsect2 name="Surface resources" url="overview/surface_resources.html" />
+ <tocsect2 name="Sample resources" url="overview/sample_resources.html" />
+ <tocsect2 name="Tips &amp; Tricks" url="overview/tipsandtricks.html" />
+</tocsect1>
+<tocsect1 name="API Reference" url="reference/index.html">
+ <tocsect2 name="App" url="">
+ <tocsect3 name="System" url="">
+ <tocsect4 name="CL_ClanApplication" url="reference/CL_ClanApplication.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="Core">
+ <tocsect3 name="I/O Data">
+ <tocsect4 name="CL_Directory" url="reference/CL_Directory.html" />
+ <tocsect4 name="CL_DirectoryScanner" url="reference/CL_DirectoryScanner.html" />
+ <tocsect4 name="CL_Endian" url="reference/CL_Endian.html" />
+ <tocsect4 name="CL_InputSource" url="reference/CL_InputSource.html" />
+ <tocsect4 name="CL_InputSourceProvider" url="reference/CL_InputSourceProvider.html" />
+ <tocsect4 name="CL_InputSourceProvider_File" url="reference/CL_InputSourceProvider_File.html" />
+ <tocsect4 name="CL_InputSource_File" url="reference/CL_InputSource_File.html" />
+ <tocsect4 name="CL_InputSource_Memory" url="reference/CL_InputSource_Memory.html" />
+ <tocsect4 name="CL_InputSource_Zipped" url="reference/CL_InputSource_Zipped.html" />
+ <tocsect4 name="CL_OutputSource" url="reference/CL_OutputSource.html" />
+ <tocsect4 name="CL_OutputSourceProvider" url="reference/CL_OutputSourceProvider.html" />
+ <tocsect4 name="CL_OutputSource_File" url="reference/CL_OutputSource_File.html" />
+ <tocsect4 name="CL_OutputSource_Memory" url="reference/CL_OutputSource_Memory.html" />
+ <tocsect4 name="CL_OutputSource_Zipped" url="reference/CL_OutputSource_Zipped.html" />
+ <tocsect4 name="CL_Zip_Archive" url="reference/CL_Zip_Archive.html" />
+ <tocsect4 name="CL_Zip_FileEntry" url="reference/CL_Zip_FileEntry.html" />
+ </tocsect3>
+ <tocsect3 name="Library">
+ <tocsect4 name="CL_LibraryFactory" url="reference/CL_LibraryFactory.html" />
+ <tocsect4 name="CL_LibraryLoader" url="reference/CL_LibraryLoader.html" />
+ <tocsect4 name="CL_LibraryManager" url="reference/CL_LibraryManager.html" />
+ </tocsect3>
+ <tocsect3 name="Math">
+ <tocsect4 name="CL_DelauneyTriangulator" url="reference/CL_DelauneyTriangulator.html" />
+ <tocsect4 name="CL_DelauneyTriangulator_Triangle" url="reference/CL_DelauneyTriangulator_Triangle.html" />
+ <tocsect4 name="CL_DelauneyTriangulator_Vertex" url="reference/CL_DelauneyTriangulator_Vertex.html" />
+ <tocsect4 name="CL_LineMath" url="reference/CL_LineMath.html" />
+ <tocsect4 name="CL_Matrix4x4" url="reference/CL_Matrix4x4.html" />
+ <tocsect4 name="CL_NumberPool" url="reference/CL_NumberPool.html" />
+ <tocsect4 name="CL_OutlineTriangulator" url="reference/CL_OutlineTriangulator.html" />
+ <tocsect4 name="CL_Point" url="reference/CL_Point.html" />
+ <tocsect4 name="CL_Pointf" url="reference/CL_Pointf.html" />
+ <tocsect4 name="CL_Quad" url="reference/CL_Quad.html" />
+ <tocsect4 name="CL_Rect" url="reference/CL_Rect.html" />
+ <tocsect4 name="CL_Rectf" url="reference/CL_Rectf.html" />
+ <tocsect4 name="CL_Size" url="reference/CL_Size.html" />
+ <tocsect4 name="CL_Sizef" url="reference/CL_Sizef.html" />
+ <tocsect4 name="CL_TriangleMath" url="reference/CL_TriangleMath.html" />
+ <tocsect4 name="CL_Vector" url="reference/CL_Vector.html" />
+ <tocsect4 name="CL_Vector2" url="reference/CL_Vector2.html" />
+ </tocsect3>
+ <tocsect3 name="Resources">
+ <tocsect4 name="CL_Boolean" url="reference/CL_Boolean.html" />
+ <tocsect4 name="CL_Float" url="reference/CL_Float.html" />
+ <tocsect4 name="CL_InputSource_Raw" url="reference/CL_InputSource_Raw.html" />
+ <tocsect4 name="CL_Integer" url="reference/CL_Integer.html" />
+ <tocsect4 name="CL_Raw" url="reference/CL_Raw.html" />
+ <tocsect4 name="CL_Resource" url="reference/CL_Resource.html" />
+ <tocsect4 name="CL_ResourceData" url="reference/CL_ResourceData.html" />
+ <tocsect4 name="CL_ResourceData_Boolean" url="reference/CL_ResourceData_Boolean.html" />
+ <tocsect4 name="CL_ResourceData_Float" url="reference/CL_ResourceData_Float.html" />
+ <tocsect4 name="CL_ResourceData_Integer" url="reference/CL_ResourceData_Integer.html" />
+ <tocsect4 name="CL_ResourceData_Raw" url="reference/CL_ResourceData_Raw.html" />
+ <tocsect4 name="CL_ResourceData_String" url="reference/CL_ResourceData_String.html" />
+ <tocsect4 name="CL_ResourceManager" url="reference/CL_ResourceManager.html" />
+ </tocsect3>
+ <tocsect3 name="System">
+ <tocsect4 name="CL_Assert" url="reference/CL_Assert.html" />
+ <tocsect4 name="CL_CallStack" url="reference/CL_CallStack.html" />
+ <tocsect4 name="CL_Clonable" url="reference/CL_Clonable.html" />
+ <tocsect4 name="CL_CommandLine" url="reference/CL_CommandLine.html" />
+ <tocsect4 name="CL_ConsoleWindow" url="reference/CL_ConsoleWindow.html" />
+ <tocsect4 name="CL_CrashReporter" url="reference/CL_CrashReporter.html" />
+ <tocsect4 name="CL_Error" url="reference/CL_Error.html" />
+ <tocsect4 name="CL_EventListener" url="reference/CL_EventListener.html" />
+ <tocsect4 name="CL_EventTrigger" url="reference/CL_EventTrigger.html" />
+ <tocsect4 name="CL_KeepAlive" url="reference/CL_KeepAlive.html" />
+ <tocsect4 name="CL_Log" url="reference/CL_Log.html" />
+ <tocsect4 name="CL_Mutex" url="reference/CL_Mutex.html" />
+ <tocsect4 name="CL_MutexSection" url="reference/CL_MutexSection.html" />
+ <tocsect4 name="CL_Runnable" url="reference/CL_Runnable.html" />
+ <tocsect4 name="CL_SetupCore" url="reference/CL_SetupCore.html" />
+ <tocsect4 name="CL_String" url="reference/CL_String.html" />
+ <tocsect4 name="CL_System" url="reference/CL_System.html" />
+ <tocsect4 name="CL_Thread" url="reference/CL_Thread.html" />
+ <tocsect4 name="CL_Timer" url="reference/CL_Timer.html" />
+ </tocsect3>
+ <tocsect3 name="XML">
+ <tocsect4 name="CL_DomAttr" url="reference/CL_DomAttr.html" />
+ <tocsect4 name="CL_DomCDATASection" url="reference/CL_DomCDATASection.html" />
+ <tocsect4 name="CL_DomCharacterData" url="reference/CL_DomCharacterData.html" />
+ <tocsect4 name="CL_DomComment" url="reference/CL_DomComment.html" />
+ <tocsect4 name="CL_DomDocument" url="reference/CL_DomDocument.html" />
+ <tocsect4 name="CL_DomDocumentFragment" url="reference/CL_DomDocumentFragment.html" />
+ <tocsect4 name="CL_DomDocumentType" url="reference/CL_DomDocumentType.html" />
+ <tocsect4 name="CL_DomElement" url="reference/CL_DomElement.html" />
+ <tocsect4 name="CL_DomEntity" url="reference/CL_DomEntity.html" />
+ <tocsect4 name="CL_DomEntityReference" url="reference/CL_DomEntityReference.html" />
+ <tocsect4 name="CL_DomException" url="reference/CL_DomException.html" />
+ <tocsect4 name="CL_DomImplementation" url="reference/CL_DomImplementation.html" />
+ <tocsect4 name="CL_DomNamedNodeMap" url="reference/CL_DomNamedNodeMap.html" />
+ <tocsect4 name="CL_DomNode" url="reference/CL_DomNode.html" />
+ <tocsect4 name="CL_DomNodeList" url="reference/CL_DomNodeList.html" />
+ <tocsect4 name="CL_DomNotation" url="reference/CL_DomNotation.html" />
+ <tocsect4 name="CL_DomProcessingInstruction" url="reference/CL_DomProcessingInstruction.html" />
+ <tocsect4 name="CL_DomText" url="reference/CL_DomText.html" />
+ <tocsect4 name="CL_XMLToken" url="reference/CL_XMLToken.html" />
+ <tocsect4 name="CL_XMLTokenLoad" url="reference/CL_XMLTokenLoad.html" />
+ <tocsect4 name="CL_XMLTokenSave" url="reference/CL_XMLTokenSave.html" />
+ <tocsect4 name="CL_XMLTokenString" url="reference/CL_XMLTokenString.html" />
+ <tocsect4 name="CL_XMLTokenizer" url="reference/CL_XMLTokenizer.html" />
+ <tocsect4 name="CL_XMLWriter" url="reference/CL_XMLWriter.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="Display">
+ <tocsect3 name="Collision">
+ <tocsect4 name="CL_CollisionOutline" url="reference/CL_CollisionOutline.html" />
+ <tocsect4 name="CL_Contour" url="reference/CL_Contour.html" />
+ <tocsect4 name="CL_OutlineCircle" url="reference/CL_OutlineCircle.html" />
+ <tocsect4 name="CL_OutlineProvider" url="reference/CL_OutlineProvider.html" />
+ <tocsect4 name="CL_OutlineProviderBitmap" url="reference/CL_OutlineProviderBitmap.html" />
+ <tocsect4 name="CL_OutlineProviderFile" url="reference/CL_OutlineProviderFile.html" />
+ </tocsect3>
+ <tocsect3 name="Display 2D">
+ <tocsect4 name="CL_Canvas" url="reference/CL_Canvas.html" />
+ <tocsect4 name="CL_Color" url="reference/CL_Color.html" />
+ <tocsect4 name="CL_Display" url="reference/CL_Display.html" />
+ <tocsect4 name="CL_DisplayMode" url="reference/CL_DisplayMode.html" />
+ <tocsect4 name="CL_DisplayWindow" url="reference/CL_DisplayWindow.html" />
+ <tocsect4 name="CL_DisplayWindowDescription" url="reference/CL_DisplayWindowDescription.html" />
+ <tocsect4 name="CL_FramerateCounter" url="reference/CL_FramerateCounter.html" />
+ <tocsect4 name="CL_Gradient" url="reference/CL_Gradient.html" />
+ <tocsect4 name="CL_GraphicContext" url="reference/CL_GraphicContext.html" />
+ <tocsect4 name="CL_Palette" url="reference/CL_Palette.html" />
+ <tocsect4 name="CL_PixelBuffer" url="reference/CL_PixelBuffer.html" />
+ <tocsect4 name="CL_PixelFormat" url="reference/CL_PixelFormat.html" />
+ <tocsect4 name="CL_RLESurface" url="reference/CL_RLESurface.html" />
+ <tocsect4 name="CL_Surface" url="reference/CL_Surface.html" />
+ <tocsect4 name="CL_Surface_DrawParams1" url="reference/CL_Surface_DrawParams1.html" />
+ <tocsect4 name="CL_Surface_DrawParams2" url="reference/CL_Surface_DrawParams2.html" />
+ </tocsect3>
+ <tocsect3 name="Fonts">
+ <tocsect4 name="CL_Font" url="reference/CL_Font.html" />
+ <tocsect4 name="CL_GlyphBuffer" url="reference/CL_GlyphBuffer.html" />
+ <tocsect4 name="CL_TextStyler" url="reference/CL_TextStyler.html" />
+ </tocsect3>
+ <tocsect3 name="Input">
+ <tocsect4 name="CL_InputBuffer" url="reference/CL_InputBuffer.html" />
+ <tocsect4 name="CL_InputButton" url="reference/CL_InputButton.html" />
+ <tocsect4 name="CL_InputContext" url="reference/CL_InputContext.html" />
+ <tocsect4 name="CL_InputDevice" url="reference/CL_InputDevice.html" />
+ <tocsect4 name="CL_InputEvent" url="reference/CL_InputEvent.html" />
+ <tocsect4 name="CL_Joystick" url="reference/CL_Joystick.html" />
+ <tocsect4 name="CL_KeyBinding" url="reference/CL_KeyBinding.html" />
+ <tocsect4 name="CL_Keyboard" url="reference/CL_Keyboard.html" />
+ <tocsect4 name="CL_Mouse" url="reference/CL_Mouse.html" />
+ </tocsect3>
+ <tocsect3 name="Sprites">
+ <tocsect4 name="CL_Sprite" url="reference/CL_Sprite.html" />
+ <tocsect4 name="CL_SpriteDescription" url="reference/CL_SpriteDescription.html" />
+ <tocsect4 name="CL_SpritePacker" url="reference/CL_SpritePacker.html" />
+ </tocsect3>
+ <tocsect3 name="Surface Providers">
+ <tocsect4 name="CL_DeviceContextBuffer" url="reference/CL_DeviceContextBuffer.html" />
+ <tocsect4 name="CL_JPEGProvider" url="reference/CL_JPEGProvider.html" />
+ <tocsect4 name="CL_PCXProvider" url="reference/CL_PCXProvider.html" />
+ <tocsect4 name="CL_PNGProvider" url="reference/CL_PNGProvider.html" />
+ <tocsect4 name="CL_ProviderFactory" url="reference/CL_ProviderFactory.html" />
+ <tocsect4 name="CL_ProviderType" url="reference/CL_ProviderType.html" />
+ <tocsect4 name="CL_TargaProvider" url="reference/CL_TargaProvider.html" />
+ </tocsect3>
+ <tocsect3 name="System">
+ <tocsect4 name="CL_SetupDisplay" url="reference/CL_SetupDisplay.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="GL">
+ <tocsect3 name="Display 2D">
+ <tocsect4 name="CL_OpenGLSurface" url="reference/CL_OpenGLSurface.html" />
+ <tocsect4 name="CL_OpenGLWindow" url="reference/CL_OpenGLWindow.html" />
+ <tocsect4 name="CL_OpenGLWindowDescription" url="reference/CL_OpenGLWindowDescription.html" />
+ </tocsect3>
+ <tocsect3 name="Display 3D">
+ <tocsect4 name="CL_LightSource" url="reference/CL_LightSource.html" />
+ <tocsect4 name="CL_Material" url="reference/CL_Material.html" />
+ <tocsect4 name="CL_ProgramAttribute" url="reference/CL_ProgramAttribute.html" />
+ <tocsect4 name="CL_ProgramObject" url="reference/CL_ProgramObject.html" />
+ <tocsect4 name="CL_ProgramUniform" url="reference/CL_ProgramUniform.html" />
+ <tocsect4 name="CL_ShaderObject" url="reference/CL_ShaderObject.html" />
+ <tocsect4 name="CL_Texture" url="reference/CL_Texture.html" />
+ <tocsect4 name="CL_TextureUnit" url="reference/CL_TextureUnit.html" />
+ <tocsect4 name="CL_Viewpoint" url="reference/CL_Viewpoint.html" />
+ </tocsect3>
+ <tocsect3 name="System">
+ <tocsect4 name="CL_GLFunctions" url="reference/CL_GLFunctions.html" />
+ <tocsect4 name="CL_OpenGL" url="reference/CL_OpenGL.html" />
+ <tocsect4 name="CL_OpenGLState" url="reference/CL_OpenGLState.html" />
+ <tocsect4 name="CL_OpenGLStateData" url="reference/CL_OpenGLStateData.html" />
+ <tocsect4 name="CL_SetupGL" url="reference/CL_SetupGL.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="GUI">
+ <tocsect3 name="Controls">
+ <tocsect4 name="CL_Button" url="reference/CL_Button.html" />
+ <tocsect4 name="CL_CheckBox" url="reference/CL_CheckBox.html" />
+ <tocsect4 name="CL_FileDialog" url="reference/CL_FileDialog.html" />
+ <tocsect4 name="CL_Frame" url="reference/CL_Frame.html" />
+ <tocsect4 name="CL_Image" url="reference/CL_Image.html" />
+ <tocsect4 name="CL_InputBox" url="reference/CL_InputBox.html" />
+ <tocsect4 name="CL_InputDialog" url="reference/CL_InputDialog.html" />
+ <tocsect4 name="CL_Label" url="reference/CL_Label.html" />
+ <tocsect4 name="CL_ListBox" url="reference/CL_ListBox.html" />
+ <tocsect4 name="CL_Menu" url="reference/CL_Menu.html" />
+ <tocsect4 name="CL_MenuItem" url="reference/CL_MenuItem.html" />
+ <tocsect4 name="CL_MenuNode" url="reference/CL_MenuNode.html" />
+ <tocsect4 name="CL_MessageBox" url="reference/CL_MessageBox.html" />
+ <tocsect4 name="CL_ProgressBar" url="reference/CL_ProgressBar.html" />
+ <tocsect4 name="CL_RadioButton" url="reference/CL_RadioButton.html" />
+ <tocsect4 name="CL_RadioGroup" url="reference/CL_RadioGroup.html" />
+ <tocsect4 name="CL_ScrollBar" url="reference/CL_ScrollBar.html" />
+ <tocsect4 name="CL_TreeItem" url="reference/CL_TreeItem.html" />
+ <tocsect4 name="CL_TreeNode" url="reference/CL_TreeNode.html" />
+ <tocsect4 name="CL_TreeView" url="reference/CL_TreeView.html" />
+ <tocsect4 name="CL_Window" url="reference/CL_Window.html" />
+ </tocsect3>
+ <tocsect3 name="Framework">
+ <tocsect4 name="CL_Component" url="reference/CL_Component.html" />
+ <tocsect4 name="CL_ComponentManager" url="reference/CL_ComponentManager.html" />
+ <tocsect4 name="CL_ComponentMoveHandler" url="reference/CL_ComponentMoveHandler.html" />
+ <tocsect4 name="CL_ComponentResizeHandler" url="reference/CL_ComponentResizeHandler.html" />
+ <tocsect4 name="CL_ComponentStyle" url="reference/CL_ComponentStyle.html" />
+ <tocsect4 name="CL_ComponentType" url="reference/CL_ComponentType.html" />
+ <tocsect4 name="CL_Deck" url="reference/CL_Deck.html" />
+ <tocsect4 name="CL_GUIManager" url="reference/CL_GUIManager.html" />
+ <tocsect4 name="CL_Layout" url="reference/CL_Layout.html" />
+ <tocsect4 name="CL_ListItem" url="reference/CL_ListItem.html" />
+ <tocsect4 name="CL_StyleManager" url="reference/CL_StyleManager.html" />
+ </tocsect3>
+ <tocsect3 name="Style: Silver">
+ <tocsect4 name="CL_Button_Silver" url="reference/CL_Button_Silver.html" />
+ <tocsect4 name="CL_CheckBox_Silver" url="reference/CL_CheckBox_Silver.html" />
+ <tocsect4 name="CL_Frame_Silver" url="reference/CL_Frame_Silver.html" />
+ <tocsect4 name="CL_Image_Silver" url="reference/CL_Image_Silver.html" />
+ <tocsect4 name="CL_InputBox_Silver" url="reference/CL_InputBox_Silver.html" />
+ <tocsect4 name="CL_Label_Silver" url="reference/CL_Label_Silver.html" />
+ <tocsect4 name="CL_ListBox_Silver" url="reference/CL_ListBox_Silver.html" />
+ <tocsect4 name="CL_MenuItem_Silver" url="reference/CL_MenuItem_Silver.html" />
+ <tocsect4 name="CL_MenuNode_Silver" url="reference/CL_MenuNode_Silver.html" />
+ <tocsect4 name="CL_Menu_Silver" url="reference/CL_Menu_Silver.html" />
+ <tocsect4 name="CL_ProgressBar_Silver" url="reference/CL_ProgressBar_Silver.html" />
+ <tocsect4 name="CL_RadioButton_Silver" url="reference/CL_RadioButton_Silver.html" />
+ <tocsect4 name="CL_ScrollBar_Silver" url="reference/CL_ScrollBar_Silver.html" />
+ <tocsect4 name="CL_StyleManager_Silver" url="reference/CL_StyleManager_Silver.html" />
+ <tocsect4 name="CL_TreeItem_Silver" url="reference/CL_TreeItem_Silver.html" />
+ <tocsect4 name="CL_TreeView_Silver" url="reference/CL_TreeView_Silver.html" />
+ <tocsect4 name="CL_Window_Silver" url="reference/CL_Window_Silver.html" />
+ </tocsect3>
+ <tocsect3 name="System">
+ <tocsect4 name="CL_SetupGUI" url="reference/CL_SetupGUI.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="MikMod">
+ <tocsect3 name="Sound Providers">
+ <tocsect4 name="CL_SoundProvider_MikMod" url="reference/CL_SoundProvider_MikMod.html" />
+ </tocsect3>
+ <tocsect3 name="System">
+ <tocsect4 name="CL_SetupMikMod" url="reference/CL_SetupMikMod.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="Network">
+ <tocsect3 name="Internet Relay Chat">
+ <tocsect4 name="CL_DCCDownload" url="reference/CL_DCCDownload.html" />
+ <tocsect4 name="CL_IRCConnection" url="reference/CL_IRCConnection.html" />
+ </tocsect3>
+ <tocsect3 name="NetObjects">
+ <tocsect4 name="CL_NetObject_Client" url="reference/CL_NetObject_Client.html" />
+ <tocsect4 name="CL_NetObject_Controller" url="reference/CL_NetObject_Controller.html" />
+ <tocsect4 name="CL_NetObject_Server" url="reference/CL_NetObject_Server.html" />
+ <tocsect4 name="CL_NetVariables" url="reference/CL_NetVariables.html" />
+ </tocsect3>
+ <tocsect3 name="NetSessions">
+ <tocsect4 name="CL_InputSource_NetPacket" url="reference/CL_InputSource_NetPacket.html" />
+ <tocsect4 name="CL_InputSource_NetStream" url="reference/CL_InputSource_NetStream.html" />
+ <tocsect4 name="CL_NetComputer" url="reference/CL_NetComputer.html" />
+ <tocsect4 name="CL_NetGroup" url="reference/CL_NetGroup.html" />
+ <tocsect4 name="CL_NetPacket" url="reference/CL_NetPacket.html" />
+ <tocsect4 name="CL_NetSession" url="reference/CL_NetSession.html" />
+ <tocsect4 name="CL_NetStream" url="reference/CL_NetStream.html" />
+ <tocsect4 name="CL_OutputSource_NetPacket" url="reference/CL_OutputSource_NetPacket.html" />
+ <tocsect4 name="CL_OutputSource_NetStream" url="reference/CL_OutputSource_NetStream.html" />
+ </tocsect3>
+ <tocsect3 name="Sockets">
+ <tocsect4 name="CL_IPAddress" url="reference/CL_IPAddress.html" />
+ <tocsect4 name="CL_InputSource_Socket" url="reference/CL_InputSource_Socket.html" />
+ <tocsect4 name="CL_OutputSource_Socket" url="reference/CL_OutputSource_Socket.html" />
+ <tocsect4 name="CL_Socket" url="reference/CL_Socket.html" />
+ </tocsect3>
+ <tocsect3 name="System">
+ <tocsect4 name="CL_SetupNetwork" url="reference/CL_SetupNetwork.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="SDL">
+ <tocsect3 name="System">
+ <tocsect4 name="CL_SetupSDL" url="reference/CL_SetupSDL.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="Signal">
+ <tocsect3 name="System">
+ <tocsect4 name="CL_FunctionSlot_v0" url="reference/CL_FunctionSlot_v0.html" />
+ <tocsect4 name="CL_Signal" url="reference/CL_Signal.html" />
+ <tocsect4 name="CL_Signal_v0" url="reference/CL_Signal_v0.html" />
+ <tocsect4 name="CL_Signal_v0_Generic" url="reference/CL_Signal_v0_Generic.html" />
+ <tocsect4 name="CL_Slot" url="reference/CL_Slot.html" />
+ <tocsect4 name="CL_SlotBuffer_v0" url="reference/CL_SlotBuffer_v0.html" />
+ <tocsect4 name="CL_SlotContainer" url="reference/CL_SlotContainer.html" />
+ <tocsect4 name="CL_SlotParent_v0" url="reference/CL_SlotParent_v0.html" />
+ <tocsect4 name="CL_Slot_Generic" url="reference/CL_Slot_Generic.html" />
+ <tocsect4 name="CL_Slot_v0" url="reference/CL_Slot_v0.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="Sound">
+ <tocsect3 name="Audio Mixing">
+ <tocsect4 name="CL_Sound" url="reference/CL_Sound.html" />
+ <tocsect4 name="CL_SoundBuffer" url="reference/CL_SoundBuffer.html" />
+ <tocsect4 name="CL_SoundBuffer_Session" url="reference/CL_SoundBuffer_Session.html" />
+ <tocsect4 name="CL_SoundFilter" url="reference/CL_SoundFilter.html" />
+ <tocsect4 name="CL_SoundOutput" url="reference/CL_SoundOutput.html" />
+ <tocsect4 name="CL_SoundOutput_Description" url="reference/CL_SoundOutput_Description.html" />
+ <tocsect4 name="CL_SoundProvider" url="reference/CL_SoundProvider.html" />
+ <tocsect4 name="CL_SoundProvider_Session" url="reference/CL_SoundProvider_Session.html" />
+ </tocsect3>
+ <tocsect3 name="CD Audio">
+ <tocsect4 name="CL_CDDrive" url="reference/CL_CDDrive.html" />
+ </tocsect3>
+ <tocsect3 name="Filters">
+ <tocsect4 name="CL_EchoFilter" url="reference/CL_EchoFilter.html" />
+ <tocsect4 name="CL_FadeFilter" url="reference/CL_FadeFilter.html" />
+ <tocsect4 name="CL_InverseEchoFilter" url="reference/CL_InverseEchoFilter.html" />
+ </tocsect3>
+ <tocsect3 name="Sound Providers">
+ <tocsect4 name="CL_SoundProviderFactory" url="reference/CL_SoundProviderFactory.html" />
+ <tocsect4 name="CL_SoundProviderType" url="reference/CL_SoundProviderType.html" />
+ <tocsect4 name="CL_SoundProvider_Raw" url="reference/CL_SoundProvider_Raw.html" />
+ <tocsect4 name="CL_SoundProvider_Recorder" url="reference/CL_SoundProvider_Recorder.html" />
+ <tocsect4 name="CL_SoundProvider_Wave" url="reference/CL_SoundProvider_Wave.html" />
+ </tocsect3>
+ <tocsect3 name="System">
+ <tocsect4 name="CL_SetupSound" url="reference/CL_SetupSound.html" />
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="Vorbis">
+ <tocsect3 name="Sound Providers">
+ <tocsect4 name="CL_SoundProvider_Vorbis" url="reference/CL_SoundProvider_Vorbis.html" />
+ </tocsect3>
+ <tocsect3 name="System">
+ <tocsect4 name="CL_SetupVorbis" url="reference/CL_SetupVorbis.html" />
+ </tocsect3>
+ </tocsect2>
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/cpp/doc/cppannotations.toc b/languages/cpp/doc/cppannotations.toc
new file mode 100644
index 00000000..081ad646
--- /dev/null
+++ b/languages/cpp/doc/cppannotations.toc
@@ -0,0 +1,456 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>C++ Annotations</title>
+<base href="http://www.icce.rug.nl/documents/cplusplus/"/>
+
+<tocsect1 name="Chapter 1: Overview of the chapters" url="cplusplus01.html#l1" />
+<tocsect1 name="Chapter 2: Introduction" url="cplusplus02.html#l2">
+ <tocsect2 name="2.1: What's new in the C++ Annotations" url="cplusplus02.html#l3"/>
+ <tocsect2 name="2.2: Free Lectures in C++" url="cplusplus02.html#l4"/>
+ <tocsect2 name="2.3: The history of C++" url="cplusplus02.html#l5">
+ <tocsect3 name="2.3.1: History of the C++ Annotations" url="cplusplus02.html#l6"/>
+ <tocsect3 name="2.3.2: Compiling a C program by a C++ compiler" url="cplusplus02.html#l7"/>
+ <tocsect3 name="2.3.3: Compiling a C++ program" url="cplusplus02.html#l8">
+ <tocsect4 name="2.3.3.1: C++ under MS-Windows" url="cplusplus02.html#l9"/>
+ <tocsect4 name="2.3.3.2: Compiling a C++ source text" url="cplusplus02.html#l10"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="2.4: Advantages and pretensions of C++" url="cplusplus02.html#l11"/>
+ <tocsect2 name="2.5: What is Object-Oriented Programming?" url="cplusplus02.html#l12"/>
+ <tocsect2 name="2.6: Differences between C and C++" url="cplusplus02.html#l13">
+ </tocsect2>
+</tocsect1>
+
+<tocsect1 name="Chapter 3: A first impression of C++" url="cplusplus03.html#l32">
+ <tocsect2 name="3.1: More extensions to C in C++" url="cplusplus03.html#l33">
+ <tocsect3 name="3.1.1: The scope resolution operator ::" url="cplusplus03.html#l34"/>
+ <tocsect3 name="3.1.2: `cout', `cin' and `cerr'" url="cplusplus03.html#l35"/>
+ <tocsect3 name="3.1.3: The keyword `const'" url="cplusplus03.html#l36"/>
+ <tocsect3 name="3.1.4: References" url="cplusplus03.html#l37"/>
+ </tocsect2>
+ <tocsect2 name="3.2: Functions as part of structs" url="cplusplus03.html#l38"/>
+ <tocsect2 name="3.3: Several new data types" url="cplusplus03.html#l39">
+ <tocsect3 name="3.3.1: The `bool' data type" url="cplusplus03.html#l40"/>
+ <tocsect3 name="3.3.2: The `wchar_t' data type" url="cplusplus03.html#l41"/>
+ </tocsect2>
+ <tocsect2 name="3.4: Data hiding: public, private and class" url="cplusplus03.html#l42"/>
+ <tocsect2 name="3.5: Structs in C vs. structs in C++" url="cplusplus03.html#l43"/>
+ <tocsect2 name="3.6: Namespaces" url="cplusplus03.html#l44">
+ <tocsect3 name="3.6.1: Defining namespaces" url="cplusplus03.html#l45">
+ <tocsect4 name="3.6.1.1: Declaring entities in namespaces" url="cplusplus03.html#l46"/>
+ <tocsect4 name="3.6.1.2: A closed namespace " url="cplusplus03.html#l47"/>
+ </tocsect3>
+ <tocsect3 name="3.6.2: Referring to entities" url="cplusplus03.html#l48">
+ <tocsect4 name="3.6.2.1: The `using' directive " url="cplusplus03.html#l49"/>
+ <tocsect4 name="3.6.2.2: `Koenig lookup' " url="cplusplus03.html#l50"/>
+ </tocsect3>
+ <tocsect3 name="3.6.3: The standard namespace" url="cplusplus03.html#l51"/>
+ <tocsect3 name="3.6.4: Nesting namespaces and namespace aliasing" url="cplusplus03.html#l52">
+ <tocsect4 name="3.6.4.1: Defining entities outside of their namespaces" url="cplusplus03.html#l53"/>
+ </tocsect3>
+ </tocsect2>
+</tocsect1>
+
+<tocsect1 name="Chapter 4: The `string' data type" url="cplusplus04.html#l54">
+ <tocsect2 name="4.1: Operations on strings" url="cplusplus04.html#l55"/>
+ <tocsect2 name="4.2: Overview of operations on strings" url="cplusplus04.html#l56">
+ <tocsect3 name="4.2.1: The string initializers" url="cplusplus04.html#l57"/>
+ <tocsect3 name="4.2.2: The string iterators" url="cplusplus04.html#l58"/>
+ <tocsect3 name="4.2.3: The string operators" url="cplusplus04.html#l59"/>
+ <tocsect3 name="4.2.4: The string member functions" url="cplusplus04.html#l60"/>
+ </tocsect2>
+</tocsect1>
+
+<tocsect1 name="Chapter 5: The IO-stream Library" url="cplusplus05.html#l61">
+ <tocsect2 name="5.1: Iostream header files" url="cplusplus05.html#l62"/>
+ <tocsect2 name="5.2: The foundation: the class `ios_base'" url="cplusplus05.html#l63"/>
+ <tocsect2 name="5.3: Interfacing `streambuf' objects: the class `ios'" url="cplusplus05.html#l64">
+ <tocsect3 name="5.3.1: Condition states" url="cplusplus05.html#l65"/>
+ <tocsect3 name="5.3.2: Formatting output and input" url="cplusplus05.html#l66">
+ <tocsect4 name="5.3.2.1: Formatting flags" url="cplusplus05.html#l67"/>
+ <tocsect4 name="5.3.2.2: Format modifying member functions" url="cplusplus05.html#l68"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="5.4: Output" url="cplusplus05.html#l69">
+ <tocsect3 name="5.4.1: Basic output: the class `ostream'" url="cplusplus05.html#l70">
+ <tocsect4 name="5.4.1.1: Writing to `ostream' objects" url="cplusplus05.html#l71"/>
+ <tocsect4 name="5.4.1.2: `ostream' positioning" url="cplusplus05.html#l72"/>
+ <tocsect4 name="5.4.1.3: `ostream' flushing" url="cplusplus05.html#l73"/>
+ </tocsect3>
+ <tocsect3 name="5.4.2: Output to files: the class `ofstream'" url="cplusplus05.html#l74">
+ <tocsect4 name="5.4.2.1: Modes for opening stream objects" url="cplusplus05.html#l75"/>
+ </tocsect3>
+ <tocsect3 name="5.4.3: Output to memory: the class `ostringstream'" url="cplusplus05.html#l76"/>
+ </tocsect2>
+ <tocsect2 name="5.5: Input" url="cplusplus05.html#l77">
+ <tocsect3 name="5.5.1: Basic input: the class `istream'" url="cplusplus05.html#l78">
+ <tocsect4 name="5.5.1.1: Reading from `istream' objects" url="cplusplus05.html#l79"/>
+ <tocsect4 name="5.5.1.2: `istream' positioning" url="cplusplus05.html#l80"/>
+ </tocsect3>
+ <tocsect3 name="5.5.2: Input from streams: the class `ifstream'" url="cplusplus05.html#l81"/>
+ <tocsect3 name="5.5.3: Input from memory: the class `istringstream'" url="cplusplus05.html#l82"/>
+ </tocsect2>
+ <tocsect2 name="5.6: Manipulators" url="cplusplus05.html#l83"/>
+ <tocsect2 name="5.7: The `streambuf' class" url="cplusplus05.html#l84">
+ <tocsect3 name="5.7.1: Protected `streambuf' members" url="cplusplus05.html#l85"/>
+ <tocsect3 name="5.7.2: The class `filebuf'" url="cplusplus05.html#l86"/>
+ </tocsect2>
+ <tocsect2 name="5.8: Advanced topics" url="cplusplus05.html#l87">
+ <tocsect3 name="5.8.1: Copying streams" url="cplusplus05.html#l88"/>
+ <tocsect3 name="5.8.2: Coupling streams" url="cplusplus05.html#l89"/>
+ <tocsect3 name="5.8.3: Redirection using streams" url="cplusplus05.html#l90"/>
+ <tocsect3 name="5.8.4: Reading AND Writing to a stream" url="cplusplus05.html#l91"/>
+ </tocsect2>
+</tocsect1>
+
+<tocsect1 name="Chapter 6: Classes" url="cplusplus06.html#l92">
+ <tocsect2 name="6.1: The constructor" url="cplusplus06.html#l93">
+ <tocsect3 name="6.1.1: A first application" url="cplusplus06.html#l94"/>
+ <tocsect3 name="6.1.2: Constructors: with and without arguments" url="cplusplus06.html#l95">
+ <tocsect4 name="6.1.2.1: The order of construction" url="cplusplus06.html#l96"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="6.2: Const member functions and const objects" url="cplusplus06.html#l97"/>
+ <tocsect2 name="6.3: The keyword `inline'" url="cplusplus06.html#l98">
+ <tocsect3 name="6.3.1: Inline functions within class declarations" url="cplusplus06.html#l99"/>
+ <tocsect3 name="6.3.2: Inline functions outside of class declarations" url="cplusplus06.html#l100"/>
+ <tocsect3 name="6.3.3: When to use inline functions" url="cplusplus06.html#l101"/>
+ </tocsect2>
+ <tocsect2 name="6.4: Objects in objects: composition" url="cplusplus06.html#l102">
+ <tocsect3 name="6.4.1: Composition and const objects: const member initializers" url="cplusplus06.html#l103"/>
+ <tocsect3 name="6.4.2: Composition and reference objects: reference member initializers" url="cplusplus06.html#l104"/>
+ </tocsect2>
+ <tocsect2 name="6.5: Header file organization with classes" url="cplusplus06.html#l105">
+ <tocsect3 name="6.5.1: Using namespaces in header files" url="cplusplus06.html#l106"/>
+ </tocsect2>
+ <tocsect2 name="6.6: The keyword `mutable'" url="cplusplus06.html#l107"/>
+</tocsect1>
+
+<tocsect1 name="Chapter 7: Classes and memory allocation" url="cplusplus07.html#l108">
+ <tocsect2 name="7.1: The operators `new' and `delete'" url="cplusplus07.html#l109">
+ <tocsect3 name="7.1.1: Allocating arrays" url="cplusplus07.html#l110"/>
+ <tocsect3 name="7.1.2: Deleting arrays" url="cplusplus07.html#l111"/>
+ <tocsect3 name="7.1.3: Enlarging arrays" url="cplusplus07.html#l112"/>
+ </tocsect2>
+ <tocsect2 name="7.2: The destructor" url="cplusplus07.html#l113">
+ <tocsect3 name="7.2.1: New and delete and object pointers" url="cplusplus07.html#l114"/>
+ <tocsect3 name="7.2.2: The function set_new_handler()" url="cplusplus07.html#l115"/>
+ </tocsect2>
+ <tocsect2 name="7.3: The assignment operator" url="cplusplus07.html#l116">
+ <tocsect3 name="7.3.1: Overloading the assignment operator" url="cplusplus07.html#l117">
+ <tocsect4 name="7.3.1.1: The function 'operator=()'" url="cplusplus07.html#l118"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="7.4: The this pointer" url="cplusplus07.html#l119">
+ <tocsect3 name="7.4.1: Preventing self-destruction with this" url="cplusplus07.html#l120"/>
+ <tocsect3 name="7.4.2: Associativity of operators and this" url="cplusplus07.html#l121"/>
+ </tocsect2>
+ <tocsect2 name="7.5: The copy constructor: Initialization vs. Assignment" url="cplusplus07.html#l122">
+ <tocsect3 name="7.5.1: Similarities between the copy constructor and operator=()" url="cplusplus07.html#l123"/>
+ <tocsect3 name="7.5.2: Preventing the use of certain member functions" url="cplusplus07.html#l124"/>
+ </tocsect2>
+ <tocsect2 name="7.6: Conclusion" url="cplusplus07.html#l125"/>
+</tocsect1>
+
+<tocsect1 name="Chapter 8: Exceptions" url="cplusplus08.html#l126">
+ <tocsect2 name="8.1: Using exceptions: syntax elements" url="cplusplus08.html#l127"/>
+ <tocsect2 name="8.2: An example using exceptions" url="cplusplus08.html#l128">
+ <tocsect3 name="8.2.1: No exceptions: `setjmp()' and `longjmp()'" url="cplusplus08.html#l129"/>
+ <tocsect3 name="8.2.2: Exceptions: the preferred alternative" url="cplusplus08.html#l130"/>
+ </tocsect2>
+ <tocsect2 name="8.3: Throwing exceptions" url="cplusplus08.html#l131">
+ <tocsect3 name="8.3.1: The empty `throw' statement" url="cplusplus08.html#l132"/>
+ </tocsect2>
+ <tocsect2 name="8.4: The try block" url="cplusplus08.html#l133"/>
+ <tocsect2 name="8.5: Catching exceptions" url="cplusplus08.html#l134">
+ <tocsect3 name="8.5.1: The default catcher" url="cplusplus08.html#l135"/>
+ </tocsect2>
+ <tocsect2 name="8.6: Declaring exception throwers" url="cplusplus08.html#l136"/>
+ <tocsect2 name="8.7: Iostreams and exceptions" url="cplusplus08.html#l137"/>
+</tocsect1>
+
+<tocsect1 name="Chapter 9: More Operator Overloading" url="cplusplus09.html#l138">
+ <tocsect2 name="9.1: Overloading `operator[]()'" url="cplusplus09.html#l139"/>
+ <tocsect2 name="9.2: Overloading the insertion and extraction operators" url="cplusplus09.html#l140"/>
+ <tocsect2 name="9.3: Conversion operators" url="cplusplus09.html#l141"/>
+ <tocsect2 name="9.4: The `explicit' keyword" url="cplusplus09.html#l142"/>
+ <tocsect2 name="9.5: Overloading increment and decrement" url="cplusplus09.html#l143"/>
+ <tocsect2 name="9.6: Overloading `operator new(size_t)'" url="cplusplus09.html#l144"/>
+ <tocsect2 name="9.7: Overloading `operator delete(void *)'" url="cplusplus09.html#l145"/>
+ <tocsect2 name="9.8: Operators `new[]' and `delete[]'" url="cplusplus09.html#l146"/>
+ <tocsect2 name="9.9: Function Objects" url="cplusplus09.html#l147">
+ <tocsect3 name="9.9.1: Constructing manipulators" url="cplusplus09.html#l148">
+ <tocsect4 name="9.9.1.1: Manipulators requiring arguments" url="cplusplus09.html#l149"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="9.10: Overloadable Operators" url="cplusplus09.html#l150"/>
+</tocsect1>
+
+<tocsect1 name="Chapter 10: Static data and functions" url="cplusplus10.html#l151">
+ <tocsect2 name="10.1: Static data" url="cplusplus10.html#l152">
+ <tocsect3 name="10.1.1: Private static data" url="cplusplus10.html#l153"/>
+ <tocsect3 name="10.1.2: Public static data" url="cplusplus10.html#l154"/>
+ </tocsect2>
+ <tocsect2 name="10.2: Static member functions" url="cplusplus10.html#l155"/>
+</tocsect1>
+
+<tocsect1 name="Chapter 11: Friends" url="cplusplus11.html#l156">
+ <tocsect2 name="11.1: Friend-functions" url="cplusplus11.html#l157"/>
+ <tocsect2 name="11.2: Inline friends" url="cplusplus11.html#l158"/>
+</tocsect1>
+
+<tocsect1 name="Chapter 12: Abstract Containers" url="cplusplus12.html#l159">
+ <tocsect2 name="12.1: The `pair' container" url="cplusplus12.html#l160"/>
+ <tocsect2 name="12.2: Sequential Containers" url="cplusplus12.html#l161">
+ <tocsect3 name="12.2.1: The `vector' container" url="cplusplus12.html#l162"/>
+ <tocsect3 name="12.2.2: The `list' container" url="cplusplus12.html#l163"/>
+ <tocsect3 name="12.2.3: The `queue' container" url="cplusplus12.html#l164"/>
+ <tocsect3 name="12.2.4: The `priority_queue' container" url="cplusplus12.html#l165"/>
+ <tocsect3 name="12.2.5: The `deque' container" url="cplusplus12.html#l166"/>
+ <tocsect3 name="12.2.6: The `map' container" url="cplusplus12.html#l167"/>
+ <tocsect3 name="12.2.7: The `multimap' container" url="cplusplus12.html#l168"/>
+ <tocsect3 name="12.2.8: The `set' container" url="cplusplus12.html#l169"/>
+ <tocsect3 name="12.2.9: The `multiset' container" url="cplusplus12.html#l170"/>
+ <tocsect3 name="12.2.10: The `stack' container" url="cplusplus12.html#l171"/>
+ <tocsect3 name="12.2.11: The `hash_map' and other hashing-based containers" url="cplusplus12.html#l172"/>
+ </tocsect2>
+ <tocsect2 name="12.3: The `complex' container" url="cplusplus12.html#l173"/>
+</tocsect1>
+
+<tocsect1 name="Chapter 13: Inheritance" url="cplusplus13.html#l174">
+ <tocsect2 name="13.1: Related types" url="cplusplus13.html#l175"/>
+ <tocsect2 name="13.2: The constructor of a derived class" url="cplusplus13.html#l176"/>
+ <tocsect2 name="13.3: The destructor of a derived class" url="cplusplus13.html#l177"/>
+ <tocsect2 name="13.4: Redefining member functions" url="cplusplus13.html#l178"/>
+ <tocsect2 name="13.5: Multiple inheritance" url="cplusplus13.html#l179"/>
+ <tocsect2 name="13.6: Conversions between base classes and derived classes" url="cplusplus13.html#l180">
+ <tocsect3 name="13.6.1: Conversions in object assignments" url="cplusplus13.html#l181"/>
+ <tocsect3 name="13.6.2: Conversions in pointer assignments" url="cplusplus13.html#l182"/>
+ </tocsect2>
+</tocsect1>
+
+<tocsect1 name="Chapter 14: Polymorphism" url="cplusplus14.html#l183">
+ <tocsect2 name="14.1: Virtual functions" url="cplusplus14.html#l184"/>
+ <tocsect2 name="14.2: Virtual destructors" url="cplusplus14.html#l185"/>
+ <tocsect2 name="14.3: Pure virtual functions" url="cplusplus14.html#l186"/>
+ <tocsect2 name="14.4: Virtual functions in multiple inheritance" url="cplusplus14.html#l187">
+ <tocsect3 name="14.4.1: Ambiguity in multiple inheritance" url="cplusplus14.html#l188"/>
+ <tocsect3 name="14.4.2: Virtual base classes" url="cplusplus14.html#l189"/>
+ <tocsect3 name="14.4.3: When virtual derivation is not appropriate" url="cplusplus14.html#l190"/>
+ </tocsect2>
+ <tocsect2 name="14.5: Run-Time Type identification" url="cplusplus14.html#l191">
+ <tocsect3 name="14.5.1: The dynamic_cast operator" url="cplusplus14.html#l192"/>
+ <tocsect3 name="14.5.2: The typeid operator" url="cplusplus14.html#l193"/>
+ </tocsect2>
+ <tocsect2 name="14.6: Deriving classes from `streambuf'" url="cplusplus14.html#l194"/>
+ <tocsect2 name="14.7: A polymorphic exception class" url="cplusplus14.html#l195"/>
+ <tocsect2 name="14.8: How polymorphism is implemented" url="cplusplus14.html#l196"/>
+</tocsect1>
+
+<tocsect1 name="Chapter 15: Classes having pointers to members" url="cplusplus15.html#l197">
+ <tocsect2 name="15.1: Pointers to members: an example" url="cplusplus15.html#l198"/>
+ <tocsect2 name="15.2: Defining pointers to members" url="cplusplus15.html#l199"/>
+ <tocsect2 name="15.3: Using pointers to members" url="cplusplus15.html#l200"/>
+ <tocsect2 name="15.4: Pointers to static members" url="cplusplus15.html#l201"/>
+ <tocsect2 name="15.5: Sizes of pointers" url="cplusplus15.html#l202"/>
+</tocsect1>
+
+<tocsect1 name="Chapter 16: Nested Classes" url="cplusplus16.html#l203">
+ <tocsect2 name="16.1: Defining nested class members" url="cplusplus16.html#l204"/>
+ <tocsect2 name="16.2: Declaring nested classes" url="cplusplus16.html#l205"/>
+ <tocsect2 name="16.3: Accessing private members in nested classes" url="cplusplus16.html#l206"/>
+ <tocsect2 name="16.4: Nesting enumerations" url="cplusplus16.html#l207">
+ <tocsect3 name="16.4.1: Empty enumerations" url="cplusplus16.html#l208"/>
+ </tocsect2>
+</tocsect1>
+
+<tocsect1 name="Chapter 17: The Standard Template Library, generic algorithms" url="cplusplus17.html#l209">
+ <tocsect2 name="17.1: Predefined function objects" url="cplusplus17.html#l210">
+ <tocsect3 name="17.1.1: Arithmetic Function Objects" url="cplusplus17.html#l211"/>
+ <tocsect3 name="17.1.2: Relational Function Objects" url="cplusplus17.html#l212"/>
+ <tocsect3 name="17.1.3: Logical Function Objects" url="cplusplus17.html#l213"/>
+ <tocsect3 name="17.1.4: Function Adaptors" url="cplusplus17.html#l214"/>
+ </tocsect2>
+ <tocsect2 name="17.2: Iterators" url="cplusplus17.html#l215">
+ <tocsect3 name="17.2.1: Insert iterators" url="cplusplus17.html#l216"/>
+ <tocsect3 name="17.2.2: istream iterators" url="cplusplus17.html#l217">
+ <tocsect4 name="17.2.2.1: istreambuf iterators" url="cplusplus17.html#l218"/>
+ </tocsect3>
+ <tocsect3 name="17.2.3: ostream iterators" url="cplusplus17.html#l219">
+ <tocsect4 name="17.2.3.1: ostreambuf iterators" url="cplusplus17.html#l220"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="17.3: The 'auto_ptr' class" url="cplusplus17.html#l221">
+ <tocsect3 name="17.3.1: Defining auto_ptr variables" url="cplusplus17.html#l222"/>
+ <tocsect3 name="17.3.2: Pointing to a newly allocated object" url="cplusplus17.html#l223"/>
+ <tocsect3 name="17.3.3: Pointing to another auto_ptr" url="cplusplus17.html#l224"/>
+ <tocsect3 name="17.3.4: Creating a plain auto_ptr" url="cplusplus17.html#l225"/>
+ <tocsect3 name="17.3.5: Auto_ptr: operators and members" url="cplusplus17.html#l226"/>
+ </tocsect2>
+ <tocsect2 name="17.4: The Generic Algorithms" url="cplusplus17.html#l227">
+ <tocsect3 name="17.4.1: accumulate()" url="cplusplus17.html#l228"/>
+ <tocsect3 name="17.4.2: adjacent_difference()" url="cplusplus17.html#l229"/>
+ <tocsect3 name="17.4.3: adjacent_find()" url="cplusplus17.html#l230"/>
+ <tocsect3 name="17.4.4: binary_search()" url="cplusplus17.html#l231"/>
+ <tocsect3 name="17.4.5: copy()" url="cplusplus17.html#l232"/>
+ <tocsect3 name="17.4.6: copy_backward()" url="cplusplus17.html#l233"/>
+ <tocsect3 name="17.4.7: count()" url="cplusplus17.html#l234"/>
+ <tocsect3 name="17.4.8: count_if()" url="cplusplus17.html#l235"/>
+ <tocsect3 name="17.4.9: equal()" url="cplusplus17.html#l236"/>
+ <tocsect3 name="17.4.10: equal_range()" url="cplusplus17.html#l237"/>
+ <tocsect3 name="17.4.11: fill()" url="cplusplus17.html#l238"/>
+ <tocsect3 name="17.4.12: fill_n()" url="cplusplus17.html#l239"/>
+ <tocsect3 name="17.4.13: find()" url="cplusplus17.html#l240"/>
+ <tocsect3 name="17.4.14: find_end()" url="cplusplus17.html#l241"/>
+ <tocsect3 name="17.4.15: find_first_of()" url="cplusplus17.html#l242"/>
+ <tocsect3 name="17.4.16: find_if()" url="cplusplus17.html#l243"/>
+ <tocsect3 name="17.4.17: for_each()" url="cplusplus17.html#l244"/>
+ <tocsect3 name="17.4.18: generate()" url="cplusplus17.html#l245"/>
+ <tocsect3 name="17.4.19: generate_n()" url="cplusplus17.html#l246"/>
+ <tocsect3 name="17.4.20: includes()" url="cplusplus17.html#l247"/>
+ <tocsect3 name="17.4.21: inner_product()" url="cplusplus17.html#l248"/>
+ <tocsect3 name="17.4.22: inplace_merge()" url="cplusplus17.html#l249"/>
+ <tocsect3 name="17.4.23: iter_swap()" url="cplusplus17.html#l250"/>
+ <tocsect3 name="17.4.24: lexicographical_compare()" url="cplusplus17.html#l251"/>
+ <tocsect3 name="17.4.25: lower_bound()" url="cplusplus17.html#l252"/>
+ <tocsect3 name="17.4.26: max()" url="cplusplus17.html#l253"/>
+ <tocsect3 name="17.4.27: max_element()" url="cplusplus17.html#l254"/>
+ <tocsect3 name="17.4.28: merge()" url="cplusplus17.html#l255"/>
+ <tocsect3 name="17.4.29: min()" url="cplusplus17.html#l256"/>
+ <tocsect3 name="17.4.30: min_element()" url="cplusplus17.html#l257"/>
+ <tocsect3 name="17.4.31: mismatch()" url="cplusplus17.html#l258"/>
+ <tocsect3 name="17.4.32: next_permutation()" url="cplusplus17.html#l259"/>
+ <tocsect3 name="17.4.33: nth_element()" url="cplusplus17.html#l260"/>
+ <tocsect3 name="17.4.34: partial_sort()" url="cplusplus17.html#l261"/>
+ <tocsect3 name="17.4.35: partial_sort_copy()" url="cplusplus17.html#l262"/>
+ <tocsect3 name="17.4.36: partial_sum()" url="cplusplus17.html#l263"/>
+ <tocsect3 name="17.4.37: partition()" url="cplusplus17.html#l264"/>
+ <tocsect3 name="17.4.38: prev_permutation()" url="cplusplus17.html#l265"/>
+ <tocsect3 name="17.4.39: random_shuffle()" url="cplusplus17.html#l266"/>
+ <tocsect3 name="17.4.40: remove()" url="cplusplus17.html#l267"/>
+ <tocsect3 name="17.4.41: remove_copy()" url="cplusplus17.html#l268"/>
+ <tocsect3 name="17.4.42: remove_if()" url="cplusplus17.html#l269"/>
+ <tocsect3 name="17.4.43: remove_copy_if()" url="cplusplus17.html#l270"/>
+ <tocsect3 name="17.4.44: replace()" url="cplusplus17.html#l271"/>
+ <tocsect3 name="17.4.45: replace_copy()" url="cplusplus17.html#l272"/>
+ <tocsect3 name="17.4.46: replace_if()" url="cplusplus17.html#l273"/>
+ <tocsect3 name="17.4.47: replace_copy_if()" url="cplusplus17.html#l274"/>
+ <tocsect3 name="17.4.48: reverse()" url="cplusplus17.html#l275"/>
+ <tocsect3 name="17.4.49: reverse_copy()" url="cplusplus17.html#l276"/>
+ <tocsect3 name="17.4.50: rotate()" url="cplusplus17.html#l277"/>
+ <tocsect3 name="17.4.51: rotate_copy()" url="cplusplus17.html#l278"/>
+ <tocsect3 name="17.4.52: search()" url="cplusplus17.html#l279"/>
+ <tocsect3 name="17.4.53: search_n()" url="cplusplus17.html#l280"/>
+ <tocsect3 name="17.4.54: set_difference()" url="cplusplus17.html#l281"/>
+ <tocsect3 name="17.4.55: set_intersection()" url="cplusplus17.html#l282"/>
+ <tocsect3 name="17.4.56: set_symmetric_difference()" url="cplusplus17.html#l283"/>
+ <tocsect3 name="17.4.57: set_union()" url="cplusplus17.html#l284"/>
+ <tocsect3 name="17.4.58: sort()" url="cplusplus17.html#l285"/>
+ <tocsect3 name="17.4.59: stable_partition()" url="cplusplus17.html#l286"/>
+ <tocsect3 name="17.4.60: stable_sort()" url="cplusplus17.html#l287"/>
+ <tocsect3 name="17.4.61: swap()" url="cplusplus17.html#l288"/>
+ <tocsect3 name="17.4.62: swap_ranges()" url="cplusplus17.html#l289"/>
+ <tocsect3 name="17.4.63: transform()" url="cplusplus17.html#l290"/>
+ <tocsect3 name="17.4.64: unique()" url="cplusplus17.html#l291"/>
+ <tocsect3 name="17.4.65: unique_copy()" url="cplusplus17.html#l292"/>
+ <tocsect3 name="17.4.66: upper_bound()" url="cplusplus17.html#l293"/>
+ <tocsect3 name="17.4.67: Heap algorithms" url="cplusplus17.html#l294">
+ <tocsect4 name="17.4.67.1: make_heap()" url="cplusplus17.html#l295"/>
+ <tocsect4 name="17.4.67.2: pop_heap()" url="cplusplus17.html#l296"/>
+ <tocsect4 name="17.4.67.3: push_heap()" url="cplusplus17.html#l297"/>
+ <tocsect4 name="17.4.67.4: sort_heap()" url="cplusplus17.html#l298"/>
+ <tocsect4 name="17.4.67.5: An example using the heap algorithms" url="cplusplus17.html#l299"/>
+ </tocsect3>
+ </tocsect2>
+</tocsect1>
+
+<tocsect1 name="Chapter 18: Templates" url="cplusplus18.html#l300">
+ <tocsect2 name="18.1: Template functions" url="cplusplus18.html#l301">
+ <tocsect3 name="18.1.1: Template function definitions" url="cplusplus18.html#l302"/>
+ <tocsect3 name="18.1.2: Instantiations of template functions" url="cplusplus18.html#l303">
+ <tocsect4 name="18.1.2.1: Declaring template functions" url="cplusplus18.html#l304"/>
+ </tocsect3>
+ <tocsect3 name="18.1.3: Argument deduction" url="cplusplus18.html#l305">
+ <tocsect4 name="18.1.3.1: Lvalue transformations" url="cplusplus18.html#l306"/>
+ <tocsect4 name="18.1.3.2: Qualification conversions" url="cplusplus18.html#l307"/>
+ <tocsect4 name="18.1.3.3: Conversion to a base class" url="cplusplus18.html#l308"/>
+ <tocsect4 name="18.1.3.4: Summary: the template argument deduction algorithm" url="cplusplus18.html#l309"/>
+ </tocsect3>
+ <tocsect3 name="18.1.4: Explicit arguments" url="cplusplus18.html#l310">
+ <tocsect4 name="18.1.4.1: Template explicit instantiation declarations" url="cplusplus18.html#l311"/>
+ </tocsect3>
+ <tocsect3 name="18.1.5: Template explicit specialization " url="cplusplus18.html#l312"/>
+ <tocsect3 name="18.1.6: Overloading template functions" url="cplusplus18.html#l313"/>
+ <tocsect3 name="18.1.7: Selecting an overloaded (template) function" url="cplusplus18.html#l314"/>
+ <tocsect3 name="18.1.8: Name resolution within template functions" url="cplusplus18.html#l315"/>
+ </tocsect2>
+ <tocsect2 name="18.2: Template classes" url="cplusplus18.html#l316">
+ <tocsect3 name="18.2.1: Template class definitions" url="cplusplus18.html#l317"/>
+ <tocsect3 name="18.2.2: Template class instantiations" url="cplusplus18.html#l318"/>
+ <tocsect3 name="18.2.3: Non-type parameters" url="cplusplus18.html#l319"/>
+ <tocsect3 name="18.2.4: Template class member functions" url="cplusplus18.html#l320"/>
+ <tocsect3 name="18.2.5: Template classes and friend declarations" url="cplusplus18.html#l321">
+ <tocsect4 name="18.2.5.1: Non-template friends" url="cplusplus18.html#l322"/>
+ <tocsect4 name="18.2.5.2: Bound friends" url="cplusplus18.html#l323"/>
+ <tocsect4 name="18.2.5.3: Unbound friends" url="cplusplus18.html#l324"/>
+ </tocsect3>
+ <tocsect3 name="18.2.6: Template classes and static data" url="cplusplus18.html#l325"/>
+ <tocsect3 name="18.2.7: Derived Template Classes" url="cplusplus18.html#l326"/>
+ <tocsect3 name="18.2.8: Nesting and template classes" url="cplusplus18.html#l327"/>
+ <tocsect3 name="18.2.9: Member templates" url="cplusplus18.html#l328"/>
+ <tocsect3 name="18.2.10: Template class specializations" url="cplusplus18.html#l329"/>
+ <tocsect3 name="18.2.11: Template class partial specializations" url="cplusplus18.html#l330"/>
+ <tocsect3 name="18.2.12: Name resolution within template classes" url="cplusplus18.html#l331"/>
+ </tocsect2>
+ <tocsect2 name="18.3: Constructing iterators" url="cplusplus18.html#l332">
+ <tocsect3 name="18.3.0.1: The implementation of a Random Access Iterator " url="cplusplus18.html#l333"/>
+ <tocsect3 name="18.3.0.2: The implementation of a reverse_iterator" url="cplusplus18.html#l334"/>
+ </tocsect2>
+</tocsect1>
+
+<tocsect1 name="Chapter 19: Concrete examples of C++" url="cplusplus19.html#l335">
+ <tocsect2 name="19.1: Function objects performing bitwise operations" url="cplusplus19.html#l336"/>
+ <tocsect2 name="19.2: Implementing a reverse_iterator" url="cplusplus19.html#l337"/>
+ <tocsect2 name="19.3: A text to anything converter" url="cplusplus19.html#l338"/>
+ <tocsect2 name="19.4: `streambuf' classes using file descriptors" url="cplusplus19.html#l339">
+ <tocsect3 name="19.4.1: A class for output operations" url="cplusplus19.html#l340"/>
+ <tocsect3 name="19.4.2: Classes for input operations" url="cplusplus19.html#l341">
+ <tocsect4 name="19.4.2.1: Using a one-character buffer" url="cplusplus19.html#l342"/>
+ <tocsect4 name="19.4.2.2: Using an n-character buffer" url="cplusplus19.html#l343"/>
+ <tocsect4 name="19.4.2.3: Seeking positions in `streambuf' objects" url="cplusplus19.html#l344"/>
+ <tocsect4 name="19.4.2.4: Multiple `unget()' calls in `streambuf' objects" url="cplusplus19.html#l345"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="19.5: Using form() with ostream objects" url="cplusplus19.html#l346"/>
+ <tocsect2 name="19.6: Redirection revisited" url="cplusplus19.html#l347"/>
+ <tocsect2 name="19.7: The fork() system call" url="cplusplus19.html#l348">
+ <tocsect3 name="19.7.1: The `Daemon' program" url="cplusplus19.html#l349"/>
+ <tocsect3 name="19.7.2: The `Pipe' class" url="cplusplus19.html#l350"/>
+ <tocsect3 name="19.7.3: The `ParentSlurp' class" url="cplusplus19.html#l351"/>
+ <tocsect3 name="19.7.4: Communicating with multiple children" url="cplusplus19.html#l352">
+ <tocsect4 name="19.7.4.1: The `Select' class" url="cplusplus19.html#l353"/>
+ <tocsect4 name="19.7.4.2: The `Child' class" url="cplusplus19.html#l354"/>
+ <tocsect4 name="19.7.4.3: The `Monitor' class" url="cplusplus19.html#l355"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="19.8: Using Bison and Flex" url="cplusplus19.html#l356">
+ <tocsect3 name="19.8.1: Using Flex++ to create a scanner" url="cplusplus19.html#l357">
+ <tocsect4 name="19.8.1.1: The flex++ specification file" url="cplusplus19.html#l358"/>
+ <tocsect4 name="19.8.1.2: The derived class: Scanner" url="cplusplus19.html#l359"/>
+ <tocsect4 name="19.8.1.3: The main() function" url="cplusplus19.html#l360"/>
+ <tocsect4 name="19.8.1.4: Building the scanner-program" url="cplusplus19.html#l361"/>
+ </tocsect3>
+ <tocsect3 name="19.8.2: Using both bison++ and flex++" url="cplusplus19.html#l362">
+ <tocsect4 name="19.8.2.1: The bison++ specification file" url="cplusplus19.html#l363"/>
+ <tocsect4 name="19.8.2.2: The bison++ header section" url="cplusplus19.html#l364"/>
+ <tocsect4 name="19.8.2.3: The bison++ definition section" url="cplusplus19.html#l365"/>
+ <tocsect4 name="19.8.2.4: The bison++ grammar rules" url="cplusplus19.html#l366"/>
+ <tocsect4 name="19.8.2.5: The flex++ specification file" url="cplusplus19.html#l367"/>
+ <tocsect4 name="19.8.2.6: The generation of the code" url="cplusplus19.html#l368"/>
+ </tocsect3>
+ </tocsect2>
+</tocsect1>
+
+<tocsect1 name="Index" url="cppindex.html" />
+
+</kdeveloptoc>
diff --git a/languages/cpp/doc/gnome1.toc b/languages/cpp/doc/gnome1.toc
new file mode 100644
index 00000000..d996f1a0
--- /dev/null
+++ b/languages/cpp/doc/gnome1.toc
@@ -0,0 +1,424 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>GNOME 1.0 API Reference</title>
+<base href="http://developer.gnome.org/doc/API"/>
+<tocsect1 name="GLib" url="glib/index.html">
+ <tocsect2 name="GLib Fundamentals" url="glib/glib-fundamentals.html">
+ <tocsect3 name="Basic Types" url="glib/glib-basic-types.html"/>
+ <tocsect3 name="Limits of Basic Types" url="glib/glib-limits-of-basic-types.html"/>
+ <tocsect3 name="Standard Macros" url="glib/glib-standard-macros.html"/>
+ <tocsect3 name="Type Conversion Macros" url="glib/glib-type-conversion-macros.html"/>
+ <tocsect3 name="Byte Order Macros" url="glib/glib-type-conversion-macros.html"/>
+ <tocsect3 name="Miscellaneous Macros" url="glib/glib-miscellaneous-macros.html"/>
+ </tocsect2>
+ <tocsect2 name="GLib Core Application Support" url="glib/glib-core.html">
+ <tocsect3 name="The Main Event Loop" url="glib/glib-the-main-event-loop.html"/>
+ <tocsect3 name="Threads" url="glib/glib-threads.html"/>
+ <tocsect3 name="Dynamic Loading of Modules" url="glib/glib-dynamic-loading-of-modules.html"/>
+ <tocsect3 name="Memory Allocation" url="glib/glib-memory-allocation.html"/>
+ <tocsect3 name="IO Channels" url="glib/glib-io-channels.html"/>
+ <tocsect3 name="Message Output and Debugging Functions" url="glib/glib-warnings-and-assertions.html"/>
+ <tocsect3 name="Message Logging" url="glib/glib-message-logging.html"/>
+ </tocsect2>
+ <tocsect2 name="GLib Utilities" url="glib/glib-utilities.html">
+ <tocsect3 name="String Utility Functions" url="glib/glib-string-utility-functions.html"/>
+ <tocsect3 name="Date and Time Functions" url="glib/glib-date-and-time-functions.html"/>
+ <tocsect3 name="Hook Functions" url="glib/glib-hook-functions.html"/>
+ <tocsect3 name="Miscellaneous Utility Functions" url="glib/glib-miscellaneous-utility-functions.html"/>
+ <tocsect3 name="Lexical Scanner" url="glib/glib-lexical-scanner.html"/>
+ <tocsect3 name="Automatic String Completion" url="glib/glib-automatic-string-completion.html"/>
+ <tocsect3 name="Timers" url="glib/glib-timers.html"/>
+ <tocsect3 name="Windows Compatibility Functions" url="glib/glib-windows-compatability-functions.html"/>
+ </tocsect2>
+ <tocsect2 name="GLib Data Types" url="glib/glib-data-types.html">
+ <tocsect3 name="Memory Chunks" url="glib/glib-memory-chunks.html"/>
+ <tocsect3 name="Doubly-Linked Lists" url="glib/glib-doubly-linked-lists.html"/>
+ <tocsect3 name="Singly-Linked Lists" url="glib/glib-singly-linked-lists.html"/>
+ <tocsect3 name="Hash Tables" url="glib/glib-hash-tables.html"/>
+ <tocsect3 name="Strings" url="glib/glib-strings.html"/>
+ <tocsect3 name="String Chunks" url="glib/glib-string-chunks.html"/>
+ <tocsect3 name="Arrays" url="glib/glib-arrays.html"/>
+ <tocsect3 name="Pointer Arrays" url="glib/glib-pointer-arrays.html"/>
+ <tocsect3 name="Byte Arrays" url="glib/glib-byte-arrays.html"/>
+ <tocsect3 name="Balanced Binary Trees" url="glib/glib-balanced-binary-trees.html"/>
+ <tocsect3 name="N-ary Trees" url="glib/glib-n-ary-trees.html"/>
+ <tocsect3 name="Quarks" url="glib/glib-quarks.html"/>
+ <tocsect3 name="Keyed Data Lists" url="glib/glib-keyed-data-lists.html"/>
+ <tocsect3 name="Datasets" url="glib/glib-datasets.html"/>
+ <tocsect3 name="Relations and Tuples" url="glib/glib-relations-and-tuples.html"/>
+ <tocsect3 name="Caches" url="glib/glib-caches.html"/>
+ <tocsect3 name="Memory Allocators" url="glib/glib-memory-allocators.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="GDK" url="gdk/index.html">
+ <tocsect2 name="General" url="gdk/gdk-general.html"/>
+ <tocsect2 name="Points, Rectangles and Regions" url="gdk/gdk-points-rectangles-and-regions.html"/>
+ <tocsect2 name="Graphics Contexts" url="gdk/gdk-graphics-contexts.html"/>
+ <tocsect2 name="Drawing Primitives" url="gdk/gdk-drawing-primitives.html"/>
+ <tocsect2 name="Bitmaps and Pixmaps" url="gdk/gdk-bitmaps-and-pixmaps.html"/>
+ <tocsect2 name="Images" url="gdk/gdk-images.html"/>
+ <tocsect2 name="Colormaps and Colors" url="gdk/gdk-colormaps-and-colors.html"/>
+ <tocsect2 name="Color Contexts" url="gdk/gdk-color-contexts.html"/>
+ <tocsect2 name="Visuals" url="gdk/gdk-visuals.html"/>
+ <tocsect2 name="Fonts" url="gdk/gdk-fonts.html"/>
+ <tocsect2 name="Cursors" url="gdk/gdk-cursors.html"/>
+ <tocsect2 name="Windows" url="gdk/gdk-windows.html"/>
+ <tocsect2 name="Events" url="gdk/gdk-events.html"/>
+ <tocsect2 name="Event Structures" url="gdk/gdk-event-structures.html"/>
+ <tocsect2 name="Selections" url="gdk/gdk-selections.html"/>
+ <tocsect2 name="Drag and Drop" url="gdk/gdk-drag-and-drop.html"/>
+ <tocsect2 name="Properties and Atoms" url="gdk/gdk-properties-and-atoms.html"/>
+ <tocsect2 name="Threads" url="gdk/gdk-threads.html"/>
+ <tocsect2 name="Input" url="gdk/gdk-input.html"/>
+ <tocsect2 name="Input Devices" url="gdk/gdk-input-devices.html"/>
+ <tocsect2 name="Key Values" url="gdk/gdk-key-values.html"/>
+ <tocsect2 name="Input Methods" url="gdk/gdk-input-methods.html"/>
+ <tocsect2 name="Input Contexts" url="gdk/gdk-input-contexts.html"/>
+</tocsect1>
+<tocsect1 name="Gdk-Pixbuf" url="gdk-pixbuf/index.html">
+ <tocsect2 name="API Reference" url="gdk-pixbuf/r27.html">
+ <tocsect3 name="The GdkPixbuf Structure" url="gdk-pixbuf/gdk-pixbuf-gdk-pixbuf.html"/>
+ <tocsect3 name="Reference Counting and Memory Mangement" url="gdk-pixbuf/gdk-pixbuf-refcounting.html"/>
+ <tocsect3 name="File Loading" url="gdk-pixbuf/gdk-pixbuf-file-loading.html"/>
+ <tocsect3 name="Image Data in Memory" url="gdk-pixbuf/gdk-pixbuf-creating.html"/>
+ <tocsect3 name="Rendering" url="gdk-pixbuf/gdk-pixbuf-rendering.html"/>
+ <tocsect3 name="Scaling" url="gdk-pixbuf/gdk-pixbuf-scaling.html"/>
+ <tocsect3 name="Drawables to Pixbufs" url="gdk-pixbuf/gdk-pixbuf-from-drawables.html"/>
+ <tocsect3 name="Utilities" url="gdk-pixbuf/gdk-pixbuf-util.html"/>
+ <tocsect3 name="Animations" url="gdk-pixbuf/gdk-pixbuf-animation.html"/>
+ <tocsect3 name="GdkPixbufLoader" url="gdk-pixbuf/gdkpixbufloader.html"/>
+ <tocsect3 name="GnomeCanvasPixbuf" url="gdk-pixbuf/gnomecanvaspixbuf.html"/>
+ <tocsect3 name="Xlib initialization" url="gdk-pixbuf/gdk-pixbuf-gdk-pixbuf-xlib-init.html"/>
+ <tocsect3 name="Xlib Rendering" url="gdk-pixbuf/gdk-pixbuf-gdk-pixbuf-xlib-rendering.html"/>
+ <tocsect3 name="X Drawables to Pixbufs" url="gdk-pixbuf/gdk-pixbuf-gdk-pixbuf-xlib-from-drawables.html"/>
+ <tocsect3 name="XlibRGB" url="gdk-pixbuf/gdk-pixbuf-gdk-pixbuf-xlib-rgb.html"/>
+ </tocsect2>
+ <tocsect2 name="Porting applications from Imlib to gdk-pixbuf" url="gdk-pixbuf/a3652.html">
+ <tocsect3 name="Introduction" url="gdk-pixbuf/a3652.html#AEN3662"/>
+ <tocsect3 name="Differences between Imlib and gdk-pixbuf" url="gdk-pixbuf/x3671.html">
+ <tocsect4 name="Initialization" url="gdk-pixbuf/x3671.html#AEN3681"/>
+ <tocsect4 name="Memory management" url="gdk-pixbuf/x3671.html#AEN3694"/>
+ <tocsect4 name="The Rendering Process" url="gdk-pixbuf/x3671.html#AEN3712"/>
+ </tocsect3>
+ <tocsect3 name="Converting Applications to gdk-pixbuf" url="gdk-pixbuf/x3723.html">
+ <tocsect4 name="Image loading and creation" url="gdk-pixbuf/x3723.html#AEN3729"/>
+ <tocsect4 name="Rendering Images" url="gdk-pixbuf/x3723.html#AEN3746"/>
+ <tocsect4 name="Scaling Images" url="gdk-pixbuf/x3723.html#AEN3759"/>
+ <tocsect4 name="Getting Image Data from a Drawable" url="gdk-pixbuf/x3723.html#AEN3776"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="Compiling the gdk-pixbuf library" url="gdk-pixbuf/compiling.html">
+ <tocsect3 name="Building the Library" url="gdk-pixbuf/compiling.html#BUILDING"/>
+ <tocsect3 name="Extra Configuration Options" url="gdk-pixbuf/extra-configuration-options.html"/>
+ </tocsect2>
+ <tocsect2 name="License" url="gdk-pixbuf/license.html"/>
+</tocsect1>
+<tocsect1 name="GTK+" url="gtk/index.html">
+ <tocsect2 name="GTK+" url="gtk/gtk.html">
+ <tocsect3 name="General" url="gtk/gtk-general.html"/>
+ <tocsect3 name="Version Information" url="gtk/gtk-feature-test-macros.html"/>
+ <tocsect3 name="Graphics Contexts" url="gtk/gtk-graphics-contexts.html"/>
+ <tocsect3 name="Styles" url="gtk/gtk-styles.html"/>
+ <tocsect3 name="Themes" url="gtk/gtk-themes.html"/>
+ <tocsect3 name="Resource Files" url="gtk/gtk-resource-files.html"/>
+ <tocsect3 name="Keyboard Accelerators" url="gtk/gtk-keyboard-accelerators.html"/>
+ <tocsect3 name="Selections" url="gtk/gtk-selections.html"/>
+ <tocsect3 name="Drag and Drop" url="gtk/gtk-drag-and-drop.html"/>
+ <tocsect3 name="Signals" url="gtk/gtk-signals.html"/>
+ <tocsect3 name="Signal Marshallers" url="gtk/gtk-signal-marshallers.html"/>
+ <tocsect3 name="Implementation of Object Properties" url="gtk/gtk-object-properties.html"/>
+ <tocsect3 name="Types" url="gtk/gtk-types.html"/>
+ <tocsect3 name="Bindings" url="gtk/gtk-types.html"/>
+ <tocsect3 name="Standard Enumerations" url="gtk/gtk-standard-enumerations.html"/>
+ <tocsect3 name="Private Information" url="gtk/gtk-private-information.html"/>
+ </tocsect2>
+ <tocsect2 name="GTK+ Widgets and Objects" url="gtk/gtkobjects.html">
+ <tocsect3 name="GtkAccelLabel" url="gtk/gtkaccellabel.html"/>
+ <tocsect3 name="GtkAdjustment" url="gtk/gtkadjustment.html"/>
+ <tocsect3 name="GtkAlignment" url="gtk/gtkalignment.html"/>
+ <tocsect3 name="GtkArrow" url="gtk/gtkarrow.html"/>
+ <tocsect3 name="GtkAspectFrame" url="gtk/gtkaspectframe.html"/>
+ <tocsect3 name="GtkButtonBox" url="gtk/gtkbuttonbox.html"/>
+ <tocsect3 name="GtkBin" url="gtk/gtkbin.html"/>
+ <tocsect3 name="GtkBox" url="gtk/gtkbox.html"/>
+ <tocsect3 name="GtkButton" url="gtk/gtkbutton.html"/>
+ <tocsect3 name="GtkCalendar" url="gtk/gtkcalendar.html"/>
+ <tocsect3 name="GtkCheckButton" url="gtk/gtkcheckbutton.html"/>
+ <tocsect3 name="GtkCheckMenuItem" url="gtk/gtkcheckmenuitem.html"/>
+ <tocsect3 name="GtkCList" url="gtk/gtkclist.html"/>
+ <tocsect3 name="GtkColorSelection" url="gtk/gtkcolorselection.html"/>
+ <tocsect3 name="GtkColorSelectionDialog" url="gtk/gtkcolorselectiondialog.html"/>
+ <tocsect3 name="GtkCombo" url="gtk/gtkcombo.html"/>
+ <tocsect3 name="GtkContainer" url="gtk/gtkcontainer.html"/>
+ <tocsect3 name="GtkCTree" url="gtk/gtkctree.html"/>
+ <tocsect3 name="GtkCurve" url="gtk/gtkcurve.html"/>
+ <tocsect3 name="GtkData" url="gtk/gtkdata.html"/>
+ <tocsect3 name="GtkDialog" url="gtk/gtkdialog.html"/>
+ <tocsect3 name="GtkDrawingArea" url="gtk/gtkdrawingarea.html"/>
+ <tocsect3 name="GtkEditable" url="gtk/gtkeditable.html"/>
+ <tocsect3 name="GtkEntry" url="gtk/gtkentry.html"/>
+ <tocsect3 name="GtkEventBox" url="gtk/gtkeventbox.html"/>
+ <tocsect3 name="GtkFileSelection" url="gtk/gtkfileselection.html"/>
+ <tocsect3 name="GtkFixed" url="gtk/gtkfixed.html"/>
+ <tocsect3 name="GtkFontSelection" url="gtk/gtkfontselection.html"/>
+ <tocsect3 name="GtkFontSelectionDialog" url="gtk/gtkfontselectiondialog.html"/>
+ <tocsect3 name="GtkFrame" url="gtk/gtkframe.html"/>
+ <tocsect3 name="GtkGammaCurve" url="gtk/gtkgammacurve.html"/>
+ <tocsect3 name="GtkHandleBox" url="gtk/gtkhandlebox.html"/>
+ <tocsect3 name="GtkHButtonBox" url="gtk/gtkhbuttonbox.html"/>
+ <tocsect3 name="GtkHBox" url="gtk/gtkhbox.html"/>
+ <tocsect3 name="GtkHPaned" url="gtk/gtkhpaned.html"/>
+ <tocsect3 name="GtkHRuler" url="gtk/gtkhruler.html"/>
+ <tocsect3 name="GtkHScale" url="gtk/gtkhscale.html"/>
+ <tocsect3 name="GtkHScrollbar" url="gtk/gtkhscrollbar.html"/>
+ <tocsect3 name="GtkHSeparator" url="gtk/gtkhseparator.html"/>
+ <tocsect3 name="GtkImage" url="gtk/gtkimage.html"/>
+ <tocsect3 name="GtkInputDialog" url="gtk/gtkinputdialog.html"/>
+ <tocsect3 name="GtkInvisible" url="gtk/gtkinvisible.html"/>
+ <tocsect3 name="GtkItem" url="gtk/gtkitem.html"/>
+ <tocsect3 name="GtkItemFactory" url="gtk/gtkitemfactory.html"/>
+ <tocsect3 name="GtkLabel" url="gtk/gtklabel.html"/>
+ <tocsect3 name="GtkLayout" url="gtk/gtklayout.html"/>
+ <tocsect3 name="GtkList" url="gtk/gtklist.html"/>
+ <tocsect3 name="GtkListItem" url="gtk/gtklistitem.html"/>
+ <tocsect3 name="GtkMenu" url="gtk/gtkmenu.html"/>
+ <tocsect3 name="GtkMenuBar" url="gtk/gtkmenubar.html"/>
+ <tocsect3 name="GtkMenuItem" url="gtk/gtkmenuitem.html"/>
+ <tocsect3 name="GtkMenuShell" url="gtk/gtkmenushell.html"/>
+ <tocsect3 name="GtkMisc" url="gtk/gtkmisc.html"/>
+ <tocsect3 name="GtkNotebook" url="gtk/gtknotebook.html"/>
+ <tocsect3 name="GtkObject" url="gtk/gtkobject.html"/>
+ <tocsect3 name="GtkOptionMenu" url="gtk/gtkoptionmenu.html"/>
+ <tocsect3 name="GtkPacker" url="gtk/gtkpacker.html"/>
+ <tocsect3 name="GtkPaned" url="gtk/gtkpaned.html"/>
+ <tocsect3 name="GtkPixmap" url="gtk/gtkpixmap.html"/>
+ <tocsect3 name="GtkPlug" url="gtk/gtkplug.html"/>
+ <tocsect3 name="GtkPreview" url="gtk/gtkpreview.html"/>
+ <tocsect3 name="GtkProgress" url="gtk/gtkprogress.html"/>
+ <tocsect3 name="GtkProgressBar" url="gtk/gtkprogressbar.html"/>
+ <tocsect3 name="GtkRadioButton" url="gtk/gtkradiobutton.html"/>
+ <tocsect3 name="GtkRadioMenuItem" url="gtk/gtkradiomenuitem.html"/>
+ <tocsect3 name="GtkRange" url="gtk/gtkrange.html"/>
+ <tocsect3 name="GtkRuler" url="gtk/gtkruler.html"/>
+ <tocsect3 name="GtkScale" url="gtk/gtkscale.html"/>
+ <tocsect3 name="GtkScrollbar" url="gtk/gtkscrollbar.html"/>
+ <tocsect3 name="GtkScrollbar" url="gtk/gtkscrollbar.html"/>
+ <tocsect3 name="GtkSeparator" url="gtk/gtkseparator.html"/>
+ <tocsect3 name="GtkSocket" url="gtk/gtksocket.html"/>
+ <tocsect3 name="GtkSpinButton" url="gtk/gtkspinbutton.html"/>
+ <tocsect3 name="GtkStatusbar" url="gtk/gtkstatusbar.html"/>
+ <tocsect3 name="GtkTable" url="gtk/gtktable.html"/>
+ <tocsect3 name="GtkTearoffMenuItem" url="gtk/gtktearoffmenuitem.html"/>
+ <tocsect3 name="GtkText" url="gtk/gtktext.html"/>
+ <tocsect3 name="GtkTipsQuery" url="gtk/gtktipsquery.html"/>
+ <tocsect3 name="GtkToggleButton" url="gtk/gtktogglebutton.html"/>
+ <tocsect3 name="GtkToolbar" url="gtk/gtktoolbar.html"/>
+ <tocsect3 name="GtkTooltips" url="gtk/gtktooltips.html"/>
+ <tocsect3 name="GtkTree" url="gtk/gtktree.html"/>
+ <tocsect3 name="GtkTreeItem" url="gtk/gtktreeitem.html"/>
+ <tocsect3 name="GtkVButtonBox" url="gtk/gtkvbuttonbox.html"/>
+ <tocsect3 name="GtkVBox" url="gtk/gtkvbox.html"/>
+ <tocsect3 name="GtkViewport" url="gtk/gtkviewport.html"/>
+ <tocsect3 name="GtkVPaned" url="gtk/gtkvpaned.html"/>
+ <tocsect3 name="GtkVRuler" url="gtk/gtkvruler.html"/>
+ <tocsect3 name="GtkVScale" url="gtk/gtkvscale.html"/>
+ <tocsect3 name="GtkVScrollbar" url="gtk/gtkvscrollbar.html"/>
+ <tocsect3 name="GtkVSeparator" url="gtk/gtkvseparator.html"/>
+ <tocsect3 name="GtkWidget" url="gtk/gtkwidget.html"/>
+ <tocsect3 name="GtkWindow" url="gtk/gtkwindow.html"/>
+ </tocsect2>
+ <tocsect2 name="Index" url="gtk/gtk-index.html">
+ <tocsect3 name="Object Hierarchy" url="gtk/gtk-index.html#AEN49629"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Gnome Library" url="gnome/book1.html">
+ <tocsect2 name="gnome-config" url="gnome/gnome-gnome-config.html"/>
+ <tocsect2 name="gnome-defs" url="gnome/gnome-gnome-defs.html"/>
+ <tocsect2 name="gnome-dentry" url="gnome/gnome-gnome-dentry.html"/>
+ <tocsect2 name="gnome-exec" url="gnome/gnome-gnome-exec.html"/>
+ <tocsect2 name="gnome-fileconvert" url="gnome/gnome-gnome-fileconvert.html"/>
+ <tocsect2 name="gnome-help" url="gnome/gnome-gnome-help.html"/>
+ <tocsect2 name="gnome-history" url="gnome/gnome-gnome-history.html"/>
+ <tocsect2 name="gnome-i18n" url="gnome/gnome-gnome-i18n.html"/>
+ <tocsect2 name="gnome-metadata" url="gnome/gnome-gnome-metadata.html"/>
+ <tocsect2 name="gnome-mime-info" url="gnome/gnome-gnome-mime-info.html"/>
+ <tocsect2 name="gnome-mime" url="gnome/gnome-gnome-mime.html"/>
+ <tocsect2 name="gnome-paper" url="gnome/gnome-gnome-paper.html"/>
+ <tocsect2 name="gnome-popt" url="gnome/gnome-gnome-popt.html"/>
+ <tocsect2 name="gnome-regex" url="gnome/gnome-gnome-regex.html"/>
+ <tocsect2 name="gnome-remote" url="gnome/gnome-gnome-remote.html"/>
+ <tocsect2 name="gnome-score" url="gnome/gnome-gnome-score.html"/>
+ <tocsect2 name="gnome-sound" url="gnome/gnome-gnome-sound.html"/>
+ <tocsect2 name="gnome-triggers" url="gnome/gnome-gnome-triggers.html"/>
+ <tocsect2 name="gnome-url" url="gnome/gnome-gnome-url.html"/>
+ <tocsect2 name="gnome-util" url="gnome/gnome-gnome-util.html"/>
+ <tocsect2 name="libgnome" url="gnome/gnome-libgnome.html"/>
+</tocsect1>
+<tocsect1 name="Gnome User Interface Library" url="gnomeui/book1.html">
+ <tocsect2 name="Gnome User Interface Library" url="gnomeui/libgnomeui.html">
+ <tocsect3 name="gnome-app-helper" url="gnomeui/gnomeui-gnome-app-helper.html"/>
+ <tocsect3 name="gnome-app-util" url="gnomeui/gnomeui-gnome-app-util.html"/>
+ <tocsect3 name="gnome-canvas-util" url="gnomeui/gnomeui-gnome-canvas-util.html"/>
+ <tocsect3 name="gnome-dialog-util" url="gnomeui/gnomeui-gnome-dialog-util.html"/>
+ <tocsect3 name="gnome-dns" url="gnomeui/gnomeui-gnome-dns.html"/>
+ <tocsect3 name="gnome-geometry" url="gnomeui/gnomeui-gnome-geometry.html"/>
+ <tocsect3 name="gnome-ice" url="gnomeui/gnomeui-gnome-ice.html"/>
+ <tocsect3 name="gnome-icon-text" url="gnomeui/gnomeui-gnome-icon-text.html"/>
+ <tocsect3 name="gnome-init" url="gnomeui/gnomeui-gnome-init.html"/>
+ <tocsect3 name="gnome-mdi-session" url="gnomeui/gnomeui-gnome-mdi-session.html"/>
+ <tocsect3 name="gnome-popup-help" url="gnomeui/gnomeui-gnome-popup-help.html"/>
+ <tocsect3 name="gnome-popup-menu" url="gnomeui/gnomeui-gnome-popup-menu.html"/>
+ <tocsect3 name="gnome-preferences" url="gnomeui/gnomeui-gnome-preferences.html"/>
+ <tocsect3 name="gnome-properties" url="gnomeui/gnomeui-gnome-properties.html"/>
+ <tocsect3 name="gnome-property-entries" url="gnomeui/gnomeui-gnome-property-entries.html"/>
+ <tocsect3 name="gnome-startup" url="gnomeui/gnomeui-gnome-startup.html"/>
+ <tocsect3 name="gnome-types" url="gnomeui/gnomeui-gnome-types.html"/>
+ <tocsect3 name="gnome-uidefs" url="gnomeui/gnomeui-gnome-uidefs.html"/>
+ <tocsect3 name="gnome-window-icon" url="gnomeui/gnomeui-gnome-window-icon.html"/>
+ <tocsect3 name="gnome-winhints" url="gnomeui/gnomeui-gnome-winhints.html"/>
+ <tocsect3 name="gtkcauldron" url="gnomeui/gnomeui-gtkcauldron.html"/>
+ </tocsect2>
+ <tocsect2 name="GNOME Widgets and Objects" url="gnomeui/gnome-objects.html">
+ <tocsect3 name="GnomeAbout" url="gnomeui/gnomeabout.html"/>
+ <tocsect3 name="GnomeAnimator" url="gnomeui/gnomeanimator.html"/>
+ <tocsect3 name="GnomeApp" url="gnomeui/gnomeapp.html"/>
+ <tocsect3 name="GnomeAppBar" url="gnomeui/gnomeappbar.html"/>
+ <tocsect3 name="GnomeCalculator" url="gnomeui/gnomecalculator.html"/>
+ <tocsect3 name="GnomeCanvas" url="gnomeui/gnomecanvas.html"/>
+ <tocsect3 name="GnomeCanvasItem" url="gnomeui/gnomecanvasitem.html"/>
+ <tocsect3 name="GnomeCanvasGroup" url="gnomeui/gnomecanvasgroup.html"/>
+ <tocsect3 name="GnomeCanvasLine" url="gnomeui/gnomecanvasline.html"/>
+ <tocsect3 name="GnomeCanvasPolygon" url="gnomeui/gnomecanvaspolygon.html"/>
+ <tocsect3 name="GnomeCanvasRE" url="gnomeui/gnomecanvasre.html"/>
+ <tocsect3 name="GnomeCanvasRect" url="gnomeui/gnomecanvasrect.html"/>
+ <tocsect3 name="GnomeCanvasEllipse" url="gnomeui/gnomecanvasellipse.html"/>
+ <tocsect3 name="GnomeCanvasText" url="gnomeui/gnomecanvastext.html"/>
+ <tocsect3 name="GnomeCanvasImage" url="gnomeui/gnomecanvasimage.html"/>
+ <tocsect3 name="GnomeCanvasWidget" url="gnomeui/gnomecanvaswidget.html"/>
+ <tocsect3 name="GnomeClient" url="gnomeui/gnomeclient.html"/>
+ <tocsect3 name="GnomeColorPicker" url="gnomeui/gnomecolorpicker.html"/>
+ <tocsect3 name="GnomeDateEdit" url="gnomeui/gnomedateedit.html"/>
+ <tocsect3 name="GnomeDEntryEdit" url="gnomeui/gnomedentryedit.html"/>
+ <tocsect3 name="GnomeDialog" url="gnomeui/gnomedialog.html"/>
+ <tocsect3 name="GnomeDockBand" url="gnomeui/gnomedockband.html"/>
+ <tocsect3 name="GnomeDockItem" url="gnomeui/gnomedockitem.html"/>
+ <tocsect3 name="GnomeDock" url="gnomeui/gnomedock.html"/>
+ <tocsect3 name="GnomeDruid" url="gnomeui/gnomedruid.html"/>
+ <tocsect3 name="GnomeDruidPage" url="gnomeui/gnomedruidpage.html"/>
+ <tocsect3 name="GnomeDruidPageStart" url="gnomeui/gnomedruidpagestart.html"/>
+ <tocsect3 name="GnomeDruidPageStandard" url="gnomeui/gnomedruidpagestandard.html"/>
+ <tocsect3 name="GnomeDruidPageFinish" url="gnomeui/gnomedruidpagefinish.html"/>
+ <tocsect3 name="GnomeEntry" url="gnomeui/gnomeentry.html"/>
+ <tocsect3 name="GnomeFileEntry" url="gnomeui/gnomefileentry.html"/>
+ <tocsect3 name="GnomeFontPicker" url="gnomeui/gnomefontpicker.html"/>
+ <tocsect3 name="GnomeFontSelector" url="gnomeui/gnomefontselector.html"/>
+ <tocsect3 name="GnomeHRef" url="gnomeui/gnomehref.html"/>
+ <tocsect3 name="GnomeIconEntry" url="gnomeui/gnomeiconentry.html"/>
+ <tocsect3 name="GnomeIconTextItem" url="gnomeui/gnomeicontextitem.html"/>
+ <tocsect3 name="GnomeIconList" url="gnomeui/gnomeiconlist.html"/>
+ <tocsect3 name="GnomeIconSelection" url="gnomeui/gnomeiconselection.html"/>
+ <tocsect3 name="GnomeLess" url="gnomeui/gnomeless.html"/>
+ <tocsect3 name="GnomeMDIChild" url="gnomeui/gnomemdichild.html"/>
+ <tocsect3 name="GnomeMDIGenericChild" url="gnomeui/gnomemdigenericchild.html"/>
+ <tocsect3 name="GnomeMDI" url="gnomeui/gnomemdi.html"/>
+ <tocsect3 name="GnomeMessageBox" url="gnomeui/gnomemessagebox.html"/>
+ <tocsect3 name="GnomeNumberEntry" url="gnomeui/gnomenumberentry.html"/>
+ <tocsect3 name="GnomePaperSelector" url="gnomeui/gnomepaperselector.html"/>
+ <tocsect3 name="GnomePixmapEntry" url="gnomeui/gnomepixmapentry.html"/>
+ <tocsect3 name="GnomePixmap" url="gnomeui/gnomepixmap.html"/>
+ <tocsect3 name="GnomePropertyBox" url="gnomeui/gnomepropertybox.html"/>
+ <tocsect3 name="GnomeScores" url="gnomeui/gnomescores.html"/>
+ <tocsect3 name="GnomeStock" url="gnomeui/gnomestock.html"/>
+ <tocsect3 name="GtkClock" url="gnomeui/gtkclock.html"/>
+ <tocsect3 name="GtkTed" url="gnomeui/gtkted.html"/>
+ <tocsect3 name="GtkDial" url="gnomeui/gtkdial.html"/>
+ <tocsect3 name="GtkPixmapMenuItem" url="gnomeui/gtkpixmapmenuitem.html"/>
+ <tocsect3 name="GnomeSpell" url="gnomeui/gnomespell.html"/>
+ <tocsect3 name="GnomeDockLayout" url="gnomeui/gnomedocklayout.html"/>
+ <tocsect3 name="GnomeProcBar" url="gnomeui/gnomeprocbar.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Bonobo" url="bonobo/book1.html">
+ <tocsect2 name="Core Bonobo" url="bonobo/bonobo-core.html">
+ <tocsect3 name="Core Bonobo Objects" url="bonobo/bonobo-core.html#BONOBO-CORE-OBJECT">
+ <tocsect4 name="BonoboObject" url="bonobo/bonobo-bonobo-object.html"/>
+ <tocsect4 name="BonoboXObject" url="bonobo/bonobo-bonobo-xobject.html"/>
+ <tocsect4 name="bonobo-main" url="bonobo/bonobo-bonobo-main.html"/>
+ </tocsect3>
+ <tocsect3 name="Object Activation and Lifecycle" url="bonobo/bonobo-object-activation.html">
+ <tocsect4 name="bonobo-context" url="bonobo/bonobo-bonobo-context.html"/>
+ <tocsect4 name="bonobo-moniker-util" url="bonobo/bonobo-bonobo-moniker-util.html"/>
+ <tocsect4 name="BonoboObjectClient" url="bonobo/bonobo-bonobo-object-client.html"/>
+ <tocsect4 name="BonoboGenericFactory" url="bonobo/bonobo-bonobo-generic-factory.html"/>
+ <tocsect4 name="bonobo-exception" url="bonobo/bonobo-bonobo-exception.html"/>
+ </tocsect3>
+ <tocsect3 name="Properties" url="bonobo/bonobo-properties.html">
+ <tocsect4 name="BonoboPropertyBag" url="bonobo/bonobo-bonobo-property-bag.html"/>
+ <tocsect4 name="bonobo-property-bag-client" url="bonobo/bonobo-bonobo-property-bag-client.html"/>
+ <tocsect4 name="bonobo-arg" url="bonobo/bonobo-bonobo-arg.html"/>
+ <tocsect4 name="bonobo-property-bag-xml" url="bonobo/bonobo-bonobo-property-bag-xml.html"/>
+ <tocsect4 name="BonoboTransient" url="bonobo/bonobo-bonobo-transient.html"/>
+ </tocsect3>
+ <tocsect3 name="Notification and EventSources" url="bonobo/bonobo-notification.html">
+ <tocsect4 name="bonobo-event-source" url="bonobo/bonobo-bonobo-event-source.html"/>
+ <tocsect4 name="bonobo-listener" url="bonobo/bonobo-bonobo-listener.html"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="Storage and Persistance" url="bonobo/bonobo-storage.html">
+ <tocsect3 name="bonobo-storage" url="bonobo/bonobo-bonobo-storage.html"/>
+ <tocsect3 name="BonoboStream" url="bonobo/bonobo-bonobo-stream.html"/>
+ <tocsect3 name="BonoboStreamMem" url="bonobo/bonobo-bonobo-stream-memory.html"/>
+ <tocsect3 name="BonoboPersist" url="bonobo/bonobo-bonobo-persist.html"/>
+ <tocsect3 name="BonoboPersistFile" url="bonobo/bonobo-bonobo-persist-file.html"/>
+ <tocsect3 name="BonoboPersistStream" url="bonobo/bonobo-bonobo-persist-stream.html"/>
+ <tocsect3 name="bonobo-stream-client" url="bonobo/bonobo-bonobo-stream-client.html"/>
+ <tocsect3 name="bonobo-storage-plugin" url="bonobo/bonobo-bonobo-storage-plugin.html"/>
+ </tocsect2>
+ <tocsect2 name="Controls" url="bonobo/bonobo-controls.html">
+ <tocsect3 name="BonoboControl" url="bonobo/bonobo-bonobo-control.html"/>
+ <tocsect3 name="BonoboControlFrame" url="bonobo/bonobo-bonobo-control-frame.html"/>
+ <tocsect3 name="BonoboPropertyControl" url="bonobo/bonobo-bonobo-property-control.html"/>
+ </tocsect2>
+ <tocsect2 name="Bonobo Compound Documents" url="bonobo/bonobo-documents.html">
+ <tocsect3 name="Model interfaces" url="bonobo/bonobo-documents.html#BONOBO-EMBEDDABLE">
+ <tocsect4 name="BonoboClientSite" url="bonobo/bonobo-bonobo-client-site.html"/>
+ <tocsect4 name="BonoboEmbeddable" url="bonobo/bonobo-bonobo-embeddable.html"/>
+ <tocsect4 name="BonoboItemContainer" url="bonobo/bonobo-bonobo-item-container.html"/>
+ </tocsect3>
+ <tocsect3 name="View interfaces" url="bonobo/bonobo-view.html">
+ <tocsect4 name="BonoboView" url="bonobo/bonobo-bonobo-view.html"/>
+ <tocsect4 name="BonoboViewFrame" url="bonobo/bonobo-bonobo-view-frame.html"/>
+ <tocsect4 name="BonoboCanvasItem" url="bonobo/bonobo-bonobo-canvas-item.html"/>
+ <tocsect4 name="BonoboCanvasComponent" url="bonobo/bonobo-bonobo-canvas-component.html"/>
+ </tocsect3>
+ <tocsect3 name="Printing" url="bonobo/bonobo-print.html">
+ <tocsect4 name="BonoboPrint" url="bonobo/bonobo-bonobo-print.html"/>
+ <tocsect4 name="BonoboPrintClient" url="bonobo/bonobo-bonobo-print-client.html"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="Bonobo UI" url="bonobo/bonobo-ui.html">
+ <tocsect3 name="BonoboWidget" url="bonobo/bonobo-bonobo-widget.html"/>
+ <tocsect3 name="BonoboWindow" url="bonobo/bonobo-bonobo-win.html"/>
+ <tocsect3 name="BonoboUIComponent" url="bonobo/bonobo-bonobo-ui-component.html"/>
+ <tocsect3 name="BonoboUIContainer" url="bonobo/bonobo-bonobo-ui-container.html"/>
+ <tocsect3 name="bonobo-ui-util" url="bonobo/bonobo-bonobo-ui-util.html"/>
+ <tocsect3 name="bonobo-ui-node" url="bonobo/bonobo-bonobo-ui-node.html"/>
+ <tocsect3 name="BonoboUIEngine" url="bonobo/bonobo-bonobo-ui-engine.html"/>
+ <tocsect3 name="BonoboUISync" url="bonobo/bonobo-bonobo-ui-sync.html"/>
+ </tocsect2>
+ <tocsect2 name="Writing Monikers" url="bonobo/bonobo-moniker-handlers.html">
+ <tocsect3 name="BonoboMoniker" url="bonobo/bonobo-bonobo-moniker.html"/>
+ <tocsect3 name="BonoboMonikerSimple" url="bonobo/bonobo-bonobo-moniker-simple.html"/>
+ <tocsect3 name="BonoboMonikerExtender" url="bonobo/bonobo-bonobo-moniker-extender.html"/>
+ <tocsect3 name="BonoboItemHandler" url="bonobo/bonobo-bonobo-item-handler.html"/>
+ </tocsect2>
+ <tocsect2 name="Supporting Classes" url="bonobo/bonobo-support-utilities.html">
+ <tocsect3 name="BonoboPlug" url="bonobo/bonobo-bonobo-plug.html"/>
+ <tocsect3 name="BonoboSocket" url="bonobo/bonobo-bonobo-socket.html"/>
+ <tocsect3 name="BonoboWrapper" url="bonobo/bonobo-bonobo-wrapper.html"/>
+ <tocsect3 name="BonoboSelector" url="bonobo/bonobo-bonobo-selector.html"/>
+ <tocsect3 name="bonobo-async" url="bonobo/bonobo-bonobo-async.html"/>
+ </tocsect2>
+</tocsect1>
+</kdeveloptoc>
+
diff --git a/languages/cpp/doc/gnustep.toc b/languages/cpp/doc/gnustep.toc
new file mode 100644
index 00000000..ef477440
--- /dev/null
+++ b/languages/cpp/doc/gnustep.toc
@@ -0,0 +1,184 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>GNUstep</title>
+<base href="http://www.gnustep.org/resources/documentation"/>
+<tocsect1 name="Base" url="base/Base.html">
+ <tocsect2 name="NSArchiver" url="base/NSArchiver.html"/>
+ <tocsect2 name="NSArray" url="base/NSArray.html"/>
+ <tocsect2 name="NSAssertionHandler" url="base/NSAssertionHandler.html"/>
+ <tocsect2 name="NSAttributedString" url="base/NSAttributedString.html"/>
+ <tocsect2 name="NSAutoreleasePool" url="base/NSAutoreleasePool.html"/>
+ <tocsect2 name="NSBundle" url="base/NSBundle.html"/>
+ <tocsect2 name="NSCalendarDate" url="base/NSCalendarDate.html"/>
+ <tocsect2 name="NSCharacterSet" url="base/NSCharacterSet.html"/>
+ <tocsect2 name="NSCoder" url="base/NSCoder.html"/>
+ <tocsect2 name="NSConditionLock" url="base/NSConditionLock.html"/>
+ <tocsect2 name="NSConnection" url="base/NSConnection.html"/>
+ <tocsect2 name="NSCountedSet" url="base/NSCountedSet.html"/>
+ <tocsect2 name="NSDate" url="base/NSDate.html"/>
+ <tocsect2 name="NSDateFormatter" url="base/NSDateFormatter.html"/>
+ <tocsect2 name="NSDecimalNumber" url="base/NSDecimalNumber.html"/>
+ <tocsect2 name="NSDecimalNumberHandler" url="base/NSDecimalNumberHandler.html"/>
+ <tocsect2 name="NSDeserializer" url="base/NSDeserializer.html"/>
+ <tocsect2 name="NSDictionary" url="base/NSDictionary.html"/>
+ <tocsect2 name="NSDirectoryEnumerator" url="base/NSDirectoryEnumerator.html"/>
+ <tocsect2 name="NSDistantObject" url="base/NSDistantObject.html"/>
+ <tocsect2 name="NSDistantObjectRequest" url="base/NSDistantObjectRequest.html"/>
+ <tocsect2 name="NSDistributedLock" url="base/NSDistributedLock.html"/>
+ <tocsect2 name="NSDistributedNotificationCenter" url="base/NSDistributedNotificationCenter.html"/>
+ <tocsect2 name="NSEnumerator" url="base/NSEnumerator.html"/>
+ <tocsect2 name="NSException" url="base/NSException.html"/>
+ <tocsect2 name="NSFileHandle" url="base/NSFileHandle.html"/>
+ <tocsect2 name="NSFileManager" url="base/NSFileManager.html"/>
+ <tocsect2 name="NSFormatter" url="base/NSFormatter.html"/>
+ <tocsect2 name="NSHost" url="base/NSHost.html"/>
+ <tocsect2 name="NSInvocation" url="base/NSInvocation.html"/>
+ <tocsect2 name="NSLock" url="base/NSLock.html"/>
+ <tocsect2 name="NSMethodSignature" url="base/NSMethodSignature.html"/>
+ <tocsect2 name="NSMutableArray" url="base/NSMutableArray.html"/>
+ <tocsect2 name="NSMutableAttributedString" url="base/NSMutableAttributedString.html"/>
+ <tocsect2 name="NSMutableCharacterSet" url="base/NSMutableCharacterSet.html"/>
+ <tocsect2 name="NSMutableData" url="base/NSMutableData.html"/>
+ <tocsect2 name="NSMutableDictionary" url="base/NSMutableDictionary.html"/>
+ <tocsect2 name="NSMutableSet" url="base/NSMutableSet.html"/>
+ <tocsect2 name="NSMutableString" url="base/NSMutableString.html"/>
+ <tocsect2 name="NSNotification" url="base/NSNotification.html"/>
+ <tocsect2 name="NSNotificationCenter" url="base/NSNotificationCenter.html"/>
+ <tocsect2 name="NSNotificationQueue" url="base/NSNotificationQueue.html"/>
+ <tocsect2 name="NSNull" url="base/NSNull.html"/>
+ <tocsect2 name="NSNumber" url="base/NSNumber.html"/>
+ <tocsect2 name="NSNumberFormatter" url="base/NSNumberFormatter.html"/>
+ <tocsect2 name="NSObject" url="base/NSObject.html"/>
+ <tocsect2 name="NSPort" url="base/NSPort.html"/>
+ <tocsect2 name="NSPortCoder" url="base/NSPortCoder.html"/>
+ <tocsect2 name="NSPortMessage" url="base/NSPortMessage.html"/>
+ <tocsect2 name="NSPortNameServer" url="base/NSPortNameServer.html"/>
+ <tocsect2 name="NSProcessInfo" url="base/NSProcessInfo.html"/>
+ <tocsect2 name="NSProtocolChecker" url="base/NSProtocolChecker.html"/>
+ <tocsect2 name="NSProxy" url="base/NSProxy.html"/>
+ <tocsect2 name="NSRecursiveLock" url="base/NSRecursiveLock.html"/>
+ <tocsect2 name="NSRunLoop" url="base/NSRunLoop.html"/>
+ <tocsect2 name="NSScanner" url="base/NSScanner.html"/>
+ <tocsect2 name="NSSerializer" url="base/NSSerializer.html"/>
+ <tocsect2 name="NSSet" url="base/NSSet.html"/>
+ <tocsect2 name="NSString" url="base/NSString.html"/>
+ <tocsect2 name="NSTask" url="base/NSTask.html"/>
+ <tocsect2 name="NSThread" url="base/NSThread.html"/>
+ <tocsect2 name="NSTimeZone" url="base/NSTimeZone.html"/>
+ <tocsect2 name="NSTimer" url="base/NSTimer.html"/>
+ <tocsect2 name="NSURL" url="base/NSURL.html"/>
+ <tocsect2 name="NSURLHandle" url="base/NSURLHandle.html"/>
+ <tocsect2 name="NSUnarchiver" url="base/NSUnarchiver.html"/>
+ <tocsect2 name="NSUndoManager" url="base/NSUndoManager.html"/>
+ <tocsect2 name="NSUserDefaults" url="base/NSUserDefaults.html"/>
+ <tocsect2 name="NSValue" url="base/NSValue.html"/>
+ <tocsect2 name="NSFunctions" url="base/NSFunctions.html"/>
+ <tocsect2 name="GSMime" url="base/GSMime.html"/>
+ <tocsect2 name="GSXML" url="base/GSXML.html"/>
+</tocsect1>
+<tocsect1 name="Gui" url="gui/Gui.html">
+ <tocsect2 name="NSActionCell" url="gui/NSActionCell.html"/>
+ <tocsect2 name="NSAffineTransform" url="gui/NSAffineTransform.html"/>
+ <tocsect2 name="NSApplication" url="gui/NSApplication.html"/>
+ <tocsect2 name="NSAttributedStrngAdds" url="gui/NSAttributedStrngAdds.html"/>
+ <tocsect2 name="NSBezierPath" url="gui/NSBezierPath.html"/>
+ <tocsect2 name="NSBitmapImageRep" url="gui/NSBitmapImageRep.html"/>
+ <tocsect2 name="NSBox" url="gui/NSBox.html"/>
+ <tocsect2 name="NSBrowser" url="gui/NSBrowser.html"/>
+ <tocsect2 name="NSBrowserCell" url="gui/NSBrowserCell.html"/>
+ <tocsect2 name="NSBundleAdditions" url="gui/NSBundleAdditions.html"/>
+ <tocsect2 name="NSButton" url="gui/NSButton.html"/>
+ <tocsect2 name="NSButtonCell" url="gui/NSButtonCell.html"/>
+ <tocsect2 name="NSCachedImageRep" url="gui/NSCachedImageRep.html"/>
+ <tocsect2 name="NSCell" url="gui/NSCell.html"/>
+ <tocsect2 name="NSClipView" url="gui/NSClipView.html"/>
+ <tocsect2 name="NSCoderAdditions" url="gui/NSCoderAdditions.html"/>
+ <tocsect2 name="NSColor" url="gui/NSColor.html"/>
+ <tocsect2 name="NSColorList" url="gui/NSColorList.html"/>
+ <tocsect2 name="NSColorPanel" url="gui/NSColorPanel.html"/>
+ <tocsect2 name="NSColorPicker" url="gui/NSColorPicker.html"/>
+ <tocsect2 name="NSColorWell" url="gui/NSColorWell.html"/>
+ <tocsect2 name="NSComboBox" url="gui/NSComboBox.html"/>
+ <tocsect2 name="NSComboBoxCell" url="gui/NSComboBoxCell.html"/>
+ <tocsect2 name="NSControl" url="gui/NSControl.html"/>
+ <tocsect2 name="NSCursor" url="gui/NSCursor.html"/>
+ <tocsect2 name="NSCustomImageRep" url="gui/NSCustomImageRep.html"/>
+ <tocsect2 name="NSDPSContext" url="gui/NSDPSContext.html"/>
+ <tocsect2 name="NSDocument" url="gui/NSDocument.html"/>
+ <tocsect2 name="NSDocumentController" url="gui/NSDocumentController.html"/>
+ <tocsect2 name="NSEPSImageRep" url="gui/NSEPSImageRep.html"/>
+ <tocsect2 name="NSEvent" url="gui/NSEvent.html"/>
+ <tocsect2 name="NSFileWrapper" url="gui/NSFileWrapper.html"/>
+ <tocsect2 name="NSFont" url="gui/NSFont.html"/>
+ <tocsect2 name="NSFontManager" url="gui/NSFontManager.html"/>
+ <tocsect2 name="NSFontPanel" url="gui/NSFontPanel.html"/>
+ <tocsect2 name="NSForm" url="gui/NSForm.html"/>
+ <tocsect2 name="NSFormCell" url="gui/NSFormCell.html"/>
+ <tocsect2 name="NSGraphicsContext" url="gui/NSGraphicsContext.html"/>
+ <tocsect2 name="NSHelpManager" url="gui/NSHelpManager.html"/>
+ <tocsect2 name="NSImage" url="gui/NSImage.html"/>
+ <tocsect2 name="NSImageCell" url="gui/NSImageCell.html"/>
+ <tocsect2 name="NSImageRep" url="gui/NSImageRep.html"/>
+ <tocsect2 name="NSImageView" url="gui/NSImageView.html"/>
+ <tocsect2 name="NSInputManager" url="gui/NSInputManager.html"/>
+ <tocsect2 name="NSInputServer" url="gui/NSInputServer.html"/>
+ <tocsect2 name="NSLayoutManager" url="gui/NSLayoutManager.html"/>
+ <tocsect2 name="NSMatrix" url="gui/NSMatrix.html"/>
+ <tocsect2 name="NSMenu" url="gui/NSMenu.html"/>
+ <tocsect2 name="NSMenuItem" url="gui/NSMenuItem.html"/>
+ <tocsect2 name="NSMenuItemCell" url="gui/NSMenuItemCell.html"/>
+ <tocsect2 name="NSMenuView" url="gui/NSMenuView.html"/>
+ <tocsect2 name="NSMutableAttributedStringAdditions" url="gui/NSMutableAttributedStringAdditions.html"/>
+ <tocsect2 name="NSMutableParagraphStyle" url="gui/NSMutableParagraphStyle.html"/>
+ <tocsect2 name="NSOpenPanel" url="gui/NSOpenPanel.html"/>
+ <tocsect2 name="NSPICTImageRep" url="gui/NSPICTImageRep.html"/>
+ <tocsect2 name="NSPageLayout" url="gui/NSPageLayout.html"/>
+ <tocsect2 name="NSPanel" url="gui/NSPanel.html"/>
+ <tocsect2 name="NSParagraphStyle" url="gui/NSParagraphStyle.html"/>
+ <tocsect2 name="NSPasteboard" url="gui/NSPasteboard.html"/>
+ <tocsect2 name="NSPopUpButton" url="gui/NSPopUpButton.html"/>
+ <tocsect2 name="NSPopUpButtonCell" url="gui/NSPopUpButtonCell.html"/>
+ <tocsect2 name="NSPrintInfo" url="gui/NSPrintInfo.html"/>
+ <tocsect2 name="NSPrintOperation" url="gui/NSPrintOperation.html"/>
+ <tocsect2 name="NSPrintPanel" url="gui/NSPrintPanel.html"/>
+ <tocsect2 name="NSPrinter" url="gui/NSPrinter.html"/>
+ <tocsect2 name="NSProgressIndicator" url="gui/NSProgressIndicator.html"/>
+ <tocsect2 name="NSResponder" url="gui/NSResponder.html"/>
+ <tocsect2 name="NSRulerMarker" url="gui/NSRulerMarker.html"/>
+ <tocsect2 name="NSRulerView" url="gui/NSRulerView.html"/>
+ <tocsect2 name="NSSavePanel" url="gui/NSSavePanel.html"/>
+ <tocsect2 name="NSScreen" url="gui/NSScreen.html"/>
+ <tocsect2 name="NSScrollView" url="gui/NSScrollView.html"/>
+ <tocsect2 name="NSScroller" url="gui/NSScroller.html"/>
+ <tocsect2 name="NSSecureTextField" url="gui/NSSecureTextField.html"/>
+ <tocsect2 name="NSSecureTextFieldCell" url="gui/NSSecureTextFieldCell.html"/>
+ <tocsect2 name="NSSlider" url="gui/NSSlider.html"/>
+ <tocsect2 name="NSSliderCell" url="gui/NSSliderCell.html"/>
+ <tocsect2 name="NSSpellChecker" url="gui/NSSpellChecker.html"/>
+ <tocsect2 name="NSSpellServer" url="gui/NSSpellServer.html"/>
+ <tocsect2 name="NSSplitView" url="gui/NSSplitView.html"/>
+ <tocsect2 name="NSStringAdditions" url="gui/NSStringAdditions.html"/>
+ <tocsect2 name="NSTabView" url="gui/NSTabView.html"/>
+ <tocsect2 name="NSTabViewItem" url="gui/NSTabViewItem.html"/>
+ <tocsect2 name="NSTableColumn" url="gui/NSTableColumn.html"/>
+ <tocsect2 name="NSTableHeaderCell" url="gui/NSTableHeaderCell.html"/>
+ <tocsect2 name="NSTableHeaderView" url="gui/NSTableHeaderView.html"/>
+ <tocsect2 name="NSTableView" url="gui/NSTableView.html"/>
+ <tocsect2 name="NSText" url="gui/NSText.html"/>
+ <tocsect2 name="NSTextAttachment" url="gui/NSTextAttachment.html"/>
+ <tocsect2 name="NSTextAttachmentCell" url="gui/NSTextAttachmentCell.html"/>
+ <tocsect2 name="NSTextContainer" url="gui/NSTextContainer.html"/>
+ <tocsect2 name="NSTextField" url="gui/NSTextField.html"/>
+ <tocsect2 name="NSTextFieldCell" url="gui/NSTextFieldCell.html"/>
+ <tocsect2 name="NSTextStorage" url="gui/NSTextStorage.html"/>
+ <tocsect2 name="NSTextTab" url="gui/NSTextTab.html"/>
+ <tocsect2 name="NSTextView" url="gui/NSTextView.html"/>
+ <tocsect2 name="NSView" url="gui/NSView.html"/>
+ <tocsect2 name="NSWindow" url="gui/NSWindow.html"/>
+ <tocsect2 name="NSWindowController" url="gui/NSWindowController.html"/>
+ <tocsect2 name="NSWorkspace" url="gui/NSWorkspace.html"/>
+ <tocsect2 name="DPSOperators" url="gui/DPSOperators.html"/>
+</tocsect1>
+<tocsect1 name="Backend" url="back/Back.html"/>
+</kdeveloptoc>
+
diff --git a/languages/cpp/doc/gtk_bugs.toc b/languages/cpp/doc/gtk_bugs.toc
new file mode 100644
index 00000000..fd1aa962
--- /dev/null
+++ b/languages/cpp/doc/gtk_bugs.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>GTK bugs</title>
+<base href="http://bugzilla.gnome.org/"/>
+<tocsect1 name="Query" url="query.cgi">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/cpp/doc/kde2book.toc b/languages/cpp/doc/kde2book.toc
new file mode 100644
index 00000000..e7d5f4d2
--- /dev/null
+++ b/languages/cpp/doc/kde2book.toc
@@ -0,0 +1,2875 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>KDE2 Development Book (kde.org)</title>
+<base href="http://developer.kde.org/documentation/books/kde-2.0-development"/>
+<tocsect1 name="Foreword" url="f822.html">
+ <tocsect2 name="Lead Author" url="frm15.html"/>
+ <tocsect2 name="Contributing Authors" url="frm16.html"/>
+ <tocsect2 name="Acknowledgments" url="frm17.html"/>
+ <tocsect2 name="Tell Us What You Think!" url="frm17.html"/>
+</tocsect1>
+<tocsect1 name="Introduction" url="f915.html">
+ <tocsect2 name="Prerequisites" url="frm19.html"/>
+ <tocsect2 name="About the Open Publication License" url="frm20.html"/>
+ <tocsect2 name="Organization of This Book" url="frm21.html"/>
+ <tocsect2 name="Conventions Used in This Book" url="frm22.html"/>
+ <tocsect2 name="Time to Develop!" url="frm22.html"/>
+</tocsect1>
+<tocsect1 name="Fundamentals of KDE Application Programming" url="p01.html">
+ <tocsect2 name="The K Desktop Environment Background" url="ch01.html">
+ <tocsect3 name="Motivation for a Free Desktop" url="ch01lev1sec2.html"/>
+ <tocsect3 name="Why Develop with KDE?" url="ch01lev1sec3.html"/>
+ <tocsect3 name="KDE Organization and Resources" url="ch01lev1sec4.html"/>
+ <tocsect3 name="System Requirements" url="ch01lev1sec5.html"/>
+ <tocsect3 name="Obtaining and Installing KDE" url="ch01lev1sec6.html"/>
+ <tocsect3 name="Licenses and Legalities" url="ch01lev1sec7.html"/>
+ <tocsect3 name="Let's Code, Already!" url="ch01lev1sec7.html"/>
+ </tocsect2>
+ <tocsect2 name="A Simple KDE Application" url="ch02.html">
+ <tocsect3 name="The Linux/UNIX Programmer's Desktop" url="ch02lev1sec2.html"/>
+ <tocsect3 name="Compiling a KDE Program" url="ch02lev1sec3.html"/>
+ <tocsect3 name="KDE Application Structure" url="ch02lev1sec4.html"/>
+ <tocsect3 name="GUI Elements" url="ch02lev1sec5.html"/>
+ <tocsect3 name="Programming Conventions" url="ch02lev1sec6.html"/>
+ <tocsect3 name="Summary" url="ch02lev1sec7.html"/>
+ <tocsect3 name="Exercises" url="ch02lev1sec7.html"/>
+ </tocsect2>
+ <tocsect2 name="The Qt Toolkit" url="ch03.html">
+ <tocsect3 name="What It Is For (Look and Feel)" url=""/>
+ <tocsect3 name="Inside the Qt Toolkit" url="ch03lev1sec2.html"/>
+ <tocsect3 name="Signals and Slots" url="ch03lev1sec3.html"/>
+ <tocsect3 name="Meta Object Compiler (moc)" url="ch03lev1sec4.html"/>
+ <tocsect3 name="The Utility Classes" url="ch03lev1sec5.html"/>
+ <tocsect3 name="Special Features (ImageIO, OpenGL, Mesa)" url="ch03lev1sec6.html"/>
+ <tocsect3 name="Summary" url="ch03lev1sec7.html"/>
+ <tocsect3 name="Exercises" url="ch03lev1sec8.html"/>
+ </tocsect2>
+ <tocsect2 name="Creating Custom KDE Widgets" url="ch04.html">
+ <tocsect3 name="Widget Basics" url="ch04lev1sec2.html"/>
+ <tocsect3 name="Painting Widgets" url="ch04lev1sec3.html"/>
+ <tocsect3 name="Using Child Widgets" url="ch04lev1sec4.html"/>
+ <tocsect3 name="Handling User Input" url="ch04lev1sec5.html"/>
+ <tocsect3 name="Summary" url="ch04lev1sec6.html"/>
+ <tocsect3 name="Exercises" url="ch04lev1sec6.html"/>
+ </tocsect2>
+ <tocsect2 name="KDE User Interface Compliance" url="ch05.html">
+ <tocsect3 name="The KDE Document-Centric Interface" url="ch05lev1sec2.html"/>
+ <tocsect3 name="Helping the User Use Your Application" url="ch05lev1sec3.html"/>
+ <tocsect3 name="Standard Dialog Boxes" url="ch05lev1sec4.html"/>
+ <tocsect3 name="Summary" url="ch05lev1sec5.html"/>
+ <tocsect3 name="Exercises" url="ch05lev1sec5.html"/>
+ </tocsect2>
+ <tocsect2 name="KDE Style Reference" url="ch06.html">
+ <tocsect3 name="Accessing the Standard Actions" url="ch06lev1sec2.html"/>
+ <tocsect3 name="Session Management" url="ch06lev1sec3.html"/>
+ <tocsect3 name="The Standard KDE Icons" url="ch06lev1sec4.html"/>
+ <tocsect3 name="Internationalization" url="ch06lev1sec5.html"/>
+ <tocsect3 name="Playing Sounds" url="ch06lev1sec6.html"/>
+ <tocsect3 name="User Notifications" url="ch06lev1sec7.html"/>
+ <tocsect3 name="Executing Other Programs" url="ch06lev1sec8.html"/>
+ <tocsect3 name="Network Transparency" url="ch06lev1sec9.html"/>
+ <tocsect3 name="User Friendliness" url="ch06lev1sec10.html"/>
+ <tocsect3 name="Summary" url="ch06lev1sec11.html"/>
+ <tocsect3 name="Exercises" url="ch06lev1sec11.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Advanced KDE Widgets and UI Design Techniques" url="p02.html">
+ <tocsect2 name="Further KDE Compliance" url="ch07.html">
+ <tocsect3 name="Drag and Drop" url="ch07lev1sec2.html"/>
+ <tocsect3 name="Application Configuration Information" url="ch07lev1sec3.html"/>
+ <tocsect3 name="Session Management" url="ch07lev1sec4.html"/>
+ <tocsect3 name="Application Resources" url="ch07lev1sec5.html"/>
+ <tocsect3 name="Network Transparency" url="ch07lev1sec6.html"/>
+ <tocsect3 name="Summary" url="ch07lev1sec7.html"/>
+ <tocsect3 name="Exercises" url="ch07lev1sec7.html"/>
+ </tocsect2>
+ <tocsect2 name="Using Dialog Boxes" url="ch08.html">
+ <tocsect3 name="Getting Started with the Dialog Widgets" url="ch08lev1sec2.html"/>
+ <tocsect3 name="Dialog Layout the Simple Way" url="ch08lev1sec3.html"/>
+ <tocsect3 name="Dialog Modality-Modal or Modeless Dialogs" url="ch08lev1sec4.html"/>
+ <tocsect3 name="KDE User-Interface Library (kdeui)" url="ch08lev1sec5.html"/>
+ <tocsect3 name="KDE User-Interface Library (kdeui)" url="ch08lev1sec6.html"/>
+ <tocsect3 name="A Larger Example: The Option Dialog in KEdit" url="ch08lev1sec7.html"/>
+ <tocsect3 name="User Interface Design Rules for Dialogs" url="ch08lev1sec8.html"/>
+ <tocsect3 name="Summary" url="ch08lev1sec9.html"/>
+ <tocsect3 name="Exercises" url="ch08lev1sec9.html"/>
+ </tocsect2>
+ <tocsect2 name="Constructing A Responsive User Interface" url="ch09.html">
+ <tocsect3 name="The Importance of Responsiveness" url="ch09lev1sec2.html"/>
+ <tocsect3 name="Speeding Up Window Updates" url="ch09lev1sec3.html"/>
+ <tocsect3 name="Performing Long Jobs" url="ch09lev1sec4.html"/>
+ <tocsect3 name="Summary" url="ch09lev1sec5.html"/>
+ <tocsect3 name="Exercises" url="ch09lev1sec5.html"/>
+ </tocsect2>
+ <tocsect2 name="Complex-Function KDE Widgets" url="ch10.html">
+ <tocsect3 name="Rendering HTML Files" url="ch10lev1sec2.html"/>
+ <tocsect3 name="Manipulating Images" url="ch10lev1sec3.html"/>
+ <tocsect3 name="Checking Spelling" url="ch10lev1sec4.html"/>
+ <tocsect3 name="Accessing the Address Book" url="ch10lev1sec5.html"/>
+ <tocsect3 name="Summary" url="ch10lev1sec6.html"/>
+ <tocsect3 name="Exercises" url="ch10lev1sec6.html"/>
+ </tocsect2>
+ <tocsect2 name="Alternative Application Types" url="ch11.html">
+ <tocsect3 name="Dialog-Based Applications" url="ch11lev1sec2.html"/>
+ <tocsect3 name="Single-Instance Applications" url="ch11lev1sec3.html"/>
+ <tocsect3 name="Panel Applets" url="ch11lev1sec4.html"/>
+ <tocsect3 name="Summary" url="ch11lev1sec5.html"/>
+ <tocsect3 name="Exercises" url="ch11lev1sec5.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Application Interaction and Integration" url="p03.html">
+ <tocsect2 name="Creating and Using Components (KParts)" url="ch12.html">
+ <tocsect3 name="The Difference Between Components and Widgets" url="ch12lev1sec2.html"/>
+ <tocsect3 name="The KDE Component Framework" url="ch12lev1sec3.html"/>
+ <tocsect3 name="Describing User Interface in XML" url="ch12lev1sec4.html"/>
+ <tocsect3 name="Read-Only and Read/Write Parts" url="ch12lev1sec5.html"/>
+ <tocsect3 name="Creating a Part" url="ch12lev1sec6.html"/>
+ <tocsect3 name="Making a Part Available Using Shared Libraries" url="ch12lev1sec7.html"/>
+ <tocsect3 name="Creating a KParts Application" url="ch12lev1sec8.html"/>
+ <tocsect3 name="Embedding More Than One Part in the Same Window" url="ch12lev1sec9.html"/>
+ <tocsect3 name="Creating a KParts Plug-in" url="ch12lev1sec10.html"/>
+ <tocsect3 name="Summary" url="ch12lev1sec10.html"/>
+ </tocsect2>
+ <tocsect2 name="DCOP-Desktop Communication Protocol" url="ch13.html">
+ <tocsect3 name="Motivation" url="ch13lev1sec2.html"/>
+ <tocsect3 name="History" url="ch13lev1sec3.html"/>
+ <tocsect3 name="Underlying Technologies" url="ch13lev1sec4.html"/>
+ <tocsect3 name="Architecture" url="ch13lev1sec5.html"/>
+ <tocsect3 name="Description of DCOP's Programming Interface" url="ch13lev1sec6.html"/>
+ <tocsect3 name="Developer Concerns and Tools in DCOP" url="ch13lev1sec7.html"/>
+ <tocsect3 name="DCOP Use in KDE 2.0-A Few Examples" url="ch13lev1sec8.html"/>
+ <tocsect3 name="Summary" url="ch13lev1sec8.html"/>
+ </tocsect2>
+ <tocsect2 name="Multimedia" url="ch14.html">
+ <tocsect3 name="Introducing aRts/MCOP" url="ch14lev1sec2.html"/>
+ <tocsect3 name="A First Glance at Writing Modules" url="ch14lev1sec3.html"/>
+ <tocsect3 name="MCOP" url="ch14lev1sec4.html"/>
+ <tocsect3 name="Standard Interfaces" url="ch14lev1sec5.html"/>
+ <tocsect3 name="Standard Interfaces" url="ch14lev1sec6.html"/>
+ <tocsect3 name="KDE Multimedia Besides MCOP" url="ch14lev1sec7.html"/>
+ <tocsect3 name="The Future of MCOP" url="ch14lev1sec8.html"/>
+ <tocsect3 name="Summary" url="ch14lev1sec9.html"/>
+ <tocsect3 name="Exercises" url="ch14lev1sec9.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Developer Tools and Support" url="p04.html">
+ <tocsect2 name="Creating Documentation" url="ch15.html">
+ <tocsect3 name="Documenting Source Code" url="ch15lev1sec2.html"/>
+ <tocsect3 name="Documenting Applications" url="ch15lev1sec3.html"/>
+ <tocsect3 name="Summary" url="ch15lev1sec3.html"/>
+ </tocsect2>
+ <tocsect2 name="Packaging and Distributing Code" url="ch16.html">
+ <tocsect3 name="The Structure of a Package" url="ch16lev1sec2.html"/>
+ <tocsect3 name="Administrative Files" url="ch16lev1sec3.html"/>
+ <tocsect3 name="Distributing Your Application" url="ch16lev1sec4.html"/>
+ <tocsect3 name="Summary" url="ch16lev1sec4.html"/>
+ </tocsect2>
+ <tocsect2 name="Managing Source Code with CVS" url="ch17.html">
+ <tocsect3 name="What Is CVS?" url="ch17lev1sec2.html"/>
+ <tocsect3 name="CVS Organization" url="ch17lev1sec3.html"/>
+ <tocsect3 name="Accessing Source Code in CVS" url="ch17lev1sec4.html"/>
+ <tocsect3 name="Installing and Using CVSup" url="ch17lev1sec5.html"/>
+ <tocsect3 name="Installing and Using cvs" url="ch17lev1sec6.html"/>
+ <tocsect3 name="Summary" url="ch17lev1sec6.html"/>
+ </tocsect2>
+ <tocsect2 name="The KDevelop IDE: The Integrated Development Environment for KDE" url="ch18.html">
+ <tocsect3 name="General Issues" url="ch18lev1sec2.html"/>
+ <tocsect3 name="Creating KDE 2.0 Applications" url="ch18lev1sec3.html"/>
+ <tocsect3 name="Getting Started with the KDE 2.0 API" url="ch18lev1sec4.html"/>
+ <tocsect3 name="The Classbrowser and Your Project" url="ch18lev1sec5.html"/>
+ <tocsect3 name="The File Viewers-The Windows to Your Project Files" url="ch18lev1sec6.html"/>
+ <tocsect3 name="The KDevelop Debugger" url="ch18lev1sec7.html"/>
+ <tocsect3 name="KDevelop 2.0-A Preview" url="ch18lev1sec8.html"/>
+ <tocsect3 name="Summary" url="ch18lev1sec8.html"/>
+ </tocsect2>
+ <tocsect2 name="Licensing Issues" url="ch19.html">
+ <tocsect3 name="Licensing Issues" url="ch19lev1sec2.html"/>
+ <tocsect3 name="License Usage by KDE" url="ch19lev1sec3.html"/>
+ <tocsect3 name="The License Usage by Qt" url="ch19lev1sec4.html"/>
+ <tocsect3 name="The KDE/Qt License History" url="ch19lev1sec5.html"/>
+ <tocsect3 name="Summary" url="ch19lev1sec5.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Appendixes" url="p05.html">
+ <tocsect2 name="KDE-Related Licenses" url="ap-a.html">
+ <tocsect3 name="GNU Library General Public License (LGPL)" url="appa1.html"/>
+ <tocsect3 name="GNU General Public License" url="appa1.html"/>
+ </tocsect2>
+ <tocsect2 name="KDE Class Reference" url="ap-c.html"/>
+ <tocsect2 name="Answers" url="ap-c.html">
+ <tocsect3 name="Chapter 1" url="appc1.html"/>
+ <tocsect3 name="Chapter 2" url="appc3.html"/>
+ <tocsect3 name="Chapter 3" url="appc5.html"/>
+ <tocsect3 name="Chapter 4" url="appc7.html"/>
+ <tocsect3 name="Chapter 5" url="appc9.html"/>
+ <tocsect3 name="Chapter 6" url="appc11.html"/>
+ <tocsect3 name="Chapter 7" url="appc13.html"/>
+ <tocsect3 name="Chapter 8" url="appc15.html"/>
+ <tocsect3 name="Chapter 9" url="appc17.html"/>
+ <tocsect3 name="Chapter 10" url="appc19.html"/>
+ <tocsect3 name="Chapter 11" url="appc21.html"/>
+ <tocsect3 name="Chapter 12" url="appc22.html"/>
+ <tocsect3 name="Chapter 13" url="appc23.html"/>
+ <tocsect3 name="Chapter 14" url="ch14.html"/>
+ </tocsect2>
+</tocsect1>
+
+
+<index>
+<entry name="aboutApp action" url="ch06.html"/>
+<entry name="aboutKDE action" url="ch06.html"/>
+<entry name="Abstract tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="accessing, application configuration files" url="ch07lev1sec2.html"/>
+<entry name="accessing, resources" url="ch07lev1sec4.html"/>
+<entry name="accesssing, documentation" url="ch18.html"/>
+<entry name="accounts, CVS (Concurrent Version System) accounts" url="ch17lev1sec3.html"/>
+<entry name="acessing, streams" url="ch14lev1sec3.html"/>
+<entry name="actionCollection() function" url="ch05.html"/>
+<entry name="actions, aboutApp" url="ch06.html"/>
+<entry name="actions, aboutKDE" url="ch06.html"/>
+<entry name="actions, actualSize" url="ch06.html"/>
+<entry name="actions, addBookmark" url="ch06.html"/>
+<entry name="actions, back" url="ch06.html"/>
+<entry name="actions, configureToolbars" url="ch06.html"/>
+<entry name="actions, copy" url="ch06.html"/>
+<entry name="actions, custom actions, KCustomActions widget" url="ch05.html"/>
+<entry name="actions, custom actions" url="ch05.html"/>
+<entry name="actions, Cut" url="ch06.html"/>
+<entry name="actions, editBookmarks" url="ch06.html"/>
+<entry name="actions, findNext" url="ch06.html"/>
+<entry name="actions, findPrev" url="ch06.html"/>
+<entry name="actions, find" url="ch06.html"/>
+<entry name="actions, firstPage" url="ch06.html"/>
+<entry name="actions, fitToHeight" url="ch06.html"/>
+<entry name="actions, fitToPage" url="ch06.html"/>
+<entry name="actions, fitToWidth" url="ch06.html"/>
+<entry name="actions, forward" url="ch06.html"/>
+<entry name="actions, gotoLine" url="ch06.html"/>
+<entry name="actions, gotoPage" url="ch06.html"/>
+<entry name="actions, goTo" url="ch06.html"/>
+<entry name="actions, helpContents" url="ch06.html"/>
+<entry name="actions, help" url="ch06.html"/>
+<entry name="actions, home" url="ch06.html"/>
+<entry name="actions, KAction class" url="ch05.html"/>
+<entry name="actions, keyBindings" url="ch06.html"/>
+<entry name="actions, lastPage" url="ch06.html"/>
+<entry name="actions, mail" url="ch06.html"/>
+<entry name="actions, next" url="ch06.html"/>
+<entry name="actions, openNew" url="ch06.html"/>
+<entry name="actions, openRecent" url="ch06.html"/>
+<entry name="actions, open" url="ch06.html"/>
+<entry name="actions, paste" url="ch06.html"/>
+<entry name="actions, preferences" url="ch06.html"/>
+<entry name="actions, printPreview" url="ch06.html"/>
+<entry name="actions, print" url="ch06.html"/>
+<entry name="actions, prior" url="ch06.html"/>
+<entry name="actions, quit" url="ch06.html"/>
+<entry name="actions, redisplay" url="ch06.html"/>
+<entry name="actions, redo" url="ch06.html"/>
+<entry name="actions, replace" url="ch06.html"/>
+<entry name="actions, reportBug" url="ch06.html"/>
+<entry name="actions, revert" url="ch06.html"/>
+<entry name="actions, saveAs" url="ch06.html"/>
+<entry name="actions, saveOptions" url="ch06.html"/>
+<entry name="actions, save" url="ch06.html"/>
+<entry name="actions, selectAll" url="ch06.html"/>
+<entry name="actions, showMenubar" url="ch06.html"/>
+<entry name="actions, showStatusbar" url="ch06.html"/>
+<entry name="actions, showToolbar" url="ch06.html"/>
+<entry name="actions, spelling" url="ch06.html"/>
+<entry name="actions, standard actions, KStdAction class" url="ch05.html"/>
+<entry name="actions, standard actions, KStdActionsDemo widget" url="ch05.html"/>
+<entry name="actions, standard actions" url="ch05.html"/>
+<entry name="actions, undo" url="ch06.html"/>
+<entry name="actions, up" url="ch06.html"/>
+<entry name="actions" url="ch05.html"/>
+<entry name="actions, whatsThis" url="ch06.html"/>
+<entry name="actions, zoomIn" url="ch06.html"/>
+<entry name="actions, zoomOut" url="ch06.html"/>
+<entry name="actions, zoom" url="ch06.html"/>
+<entry name="Action tag (XML)" url="ch05.html"/>
+<entry name="actualSize action" url="ch06.html"/>
+<entry name="addAuthor() function" url="ch05.html"/>
+<entry name="addBookmark action" url="ch06.html"/>
+<entry name="Add Folder command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="add() function" url="ch05lev1sec2.html"/>
+<entry name="addGlobalReference function" url="ch14lev1sec3.html"/>
+<entry name="Add Member Function command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="Add Member Variable command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="add option (cvs command)" url="ch17lev1sec5.html"/>
+<entry name="address book, contacts, selecting" url="ch10lev1sec4.html"/>
+<entry name="address book" url="ch10lev1sec4.html"/>
+<entry name="administrative files (packages), config.cache" url="ch16lev1sec2.html"/>
+<entry name="administrative files (packages), config.h" url="ch16lev1sec2.html"/>
+<entry name="administrative files (packages), config.log" url="ch16lev1sec2.html"/>
+<entry name="administrative files (packages), config.status" url="ch16lev1sec2.html"/>
+<entry name="administrative files (packages), configure.in" url="ch16lev1sec2.html"/>
+<entry name="administrative files (packages), configure" url="ch16lev1sec2.html"/>
+<entry name="administrative files (packages), updating" url="ch16lev1sec2.html"/>
+<entry name="administrative files (packages)" url="ch16lev1sec2.html"/>
+<entry name="aKtion" url="ch14lev1sec6.html"/>
+<entry name="all target" url="ch16lev1sec2.html"/>
+<entry name="amin() method, KDialogApp" url="ch11.html"/>
+<entry name="&amp;, (ampersand)" url="ch02lev1sec4.html"/>
+<entry name="ampersand (&amp;)" url="ch02lev1sec4.html"/>
+<entry name="analog, real-time synthesis (aRts)" url="ch14.html"/>
+<entry name="announcing software" url="ch16lev1sec3.html"/>
+<entry name="API tools (DCOP), findObject() method" url="ch13lev1sec6.html"/>
+<entry name="API tools (DCOP), isApplicationRegistered() method" url="ch13lev1sec6.html"/>
+<entry name="API tools (DCOP), isRegistered() method" url="ch13lev1sec6.html"/>
+<entry name="API tools (DCOP), registeredApplications() method" url="ch13lev1sec6.html"/>
+<entry name="API tools (DCOP), remoteFunctions() method" url="ch13lev1sec6.html"/>
+<entry name="API tools (DCOP), remoteInterfaces() method" url="ch13lev1sec6.html"/>
+<entry name="API tools (DCOP), remoteObjects() method" url="ch13lev1sec6.html"/>
+<entry name="API tools (DCOP), senderId() method" url="ch13lev1sec6.html"/>
+<entry name="API tools (DCOP), socket() method" url="ch13lev1sec6.html"/>
+<entry name="API tools (DCOP)" url="ch13lev1sec6.html"/>
+<entry name="appdata resource type" url="ch07lev1sec4.html"/>
+<entry name="applets, panel applet (KWeather), kweather.cpp class definition" url="ch11lev1sec3.html"/>
+<entry name="applets, panel applet (KWeather), kweather.h class definition" url="ch11lev1sec3.html"/>
+<entry name="applets, panel applet (KWeather), main() method" url="ch11lev1sec3.html"/>
+<entry name="applets, panel applet (KWeather)" url="ch11lev1sec3.html"/>
+<entry name="application configuration files, accessing" url="ch07lev1sec2.html"/>
+<entry name="application configuration files, example of" url="ch07lev1sec2.html"/>
+<entry name="application configuration files" url="ch07lev1sec2.html"/>
+<entry name="application icons, specifications" url="ch06lev1sec3.html"/>
+<entry name="application resources, accessing" url="ch07lev1sec4.html"/>
+<entry name="application resources, .desktop files" url="ch07lev1sec4.html"/>
+<entry name="application resources, standard resource locations" url="ch07lev1sec4.html"/>
+<entry name="application resources, types" url="ch07lev1sec4.html"/>
+<entry name="applications, configuration, options/configuration comparison" url="ch06.html"/>
+<entry name="applications, creating, KDevelop Application Wizard" url="ch18lev1sec2.html"/>
+<entry name="applications, creating, project editing" url="ch18lev1sec2.html"/>
+<entry name="applications, creating, templates" url="ch18lev1sec2.html"/>
+<entry name="applications, dialog-based (KDialogApp), kdialogapp.cpp class declaration" url="ch11.html"/>
+<entry name="applications, dialog-based (KDialogApp), kdialogapp.h class definition" url="ch11.html"/>
+<entry name="applications, dialog-based (KDialogApp), main() method" url="ch11.html"/>
+<entry name="applications, dialog-based (KDialogApp)" url="ch11.html"/>
+<entry name="applications, documenting with DocBook tools, DocBook installation" url="ch15lev1sec2.html"/>
+<entry name="applications, documenting with DocBook tools, DocBook Web site" url="ch15lev1sec2.html"/>
+<entry name="applications, documenting with DocBook tools, processing documentation" url="ch15lev1sec2.html"/>
+<entry name="applications, documenting with DocBook tools, sample documentation" url="ch15lev1sec2.html"/>
+<entry name="applications, documenting with DocBook tools, tags" url="ch15lev1sec2.html"/>
+<entry name="applications, documenting with DocBook tools" url="ch15lev1sec2.html"/>
+<entry name="applications, interfaces, user friendliness" url="ch06lev1sec9.html"/>
+<entry name="applications, network transparency, classes" url="ch06lev1sec8.html"/>
+<entry name="applications, network transparency" url="ch06lev1sec8.html"/>
+<entry name="applications, options, configuration/options comparison" url="ch06.html"/>
+<entry name="applications, running, KRun class" url="ch06lev1sec7.html"/>
+<entry name="applications, single-instance, kunique.cpp call definition" url="ch11lev1sec2.html"/>
+<entry name="applications, single-instance, kunique.h class definition" url="ch11lev1sec2.html"/>
+<entry name="applications, single-instance, main() method" url="ch11lev1sec2.html"/>
+<entry name="applications" url="ch02lev1sec3.html"/>
+<entry name="Application tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="Application Wizard (KDevelop)" url="ch18lev1sec2.html"/>
+<entry name="apps resource type" url="ch07lev1sec4.html"/>
+<entry name="architecture, DCOP (Desktop Communication Protocol)" url="ch13lev1sec4.html"/>
+<entry name="archives, creating" url="ch16lev1sec3.html"/>
+<entry name="aRts (analog, real-time synthesis)" url="ch14.html"/>
+<entry name="artsbuilder" url="ch14lev1sec7.html"/>
+<entry name="async element (IDL)" url="ch14lev1sec3.html"/>
+<entry name="asynchronous streams" url="ch14lev1sec3.html"/>
+<entry name="at symbol (" url="ch15.html"/>
+<entry name="attach function" url="ch14lev1sec4.html"/>
+<entry name="attach() method" url="ch13lev1sec5.html"/>
+<entry name="attributes (IDL)" url="ch14lev1sec3.html"/>
+<entry name="attributes" url="ch05.html"/>
+<entry name="attributes, widget attributes" url="ch04.html"/>
+<entry name="AuthorGroup tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="Author tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="author (" url="ch15.html"/>
+<entry name="Autoconf tool" url="ch18.html"/>
+<entry name="Automake tool" url="ch18.html"/>
+<entry name="back action" url="ch06.html"/>
+<entry name="balance() function" url="ch14lev1sec5.html"/>
+<entry name="beginTransaction() method" url="ch13lev1sec5.html"/>
+<entry name="binary packages, installing" url="ch01lev1sec5.html"/>
+<entry name="blockUserInput() method" url="ch13lev1sec5.html"/>
+<entry name="Book ID tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="BookInfo tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="Bookmarks menu commands" url="ch06.html"/>
+<entry name="bounding boxes, drawing" url="ch04lev1sec2.html"/>
+<entry name="branches (CVS)" url="ch17lev1sec2.html"/>
+<entry name="Breakpoint page (KDevelop Output View" url="ch18.html"/>
+<entry name="Brown, Preston" url="ch13lev1sec2.html"/>
+<entry name="browsers, Classbrowser (KDevelop)" url="ch18lev1sec4.html"/>
+<entry name="browsers, simple browser application, ksimplebrowser.cpp class definition" url="ch10.html"/>
+<entry name="browsers, simple browser application, ksimplebrowser.h class declaration" url="ch10.html"/>
+<entry name="browsers, simple browser application, main() method" url="ch10.html"/>
+<entry name="calculateBlock function" url="ch14lev1sec2.html"/>
+<entry name="calculateBlock function" url="ch14lev1sec3.html"/>
+<entry name="callbacks" url="ch03lev1sec3.html"/>
+<entry name="call() method" url="ch13lev1sec5.html"/>
+<entry name="canDecode() function" url="ch07.html"/>
+<entry name="C/C++ Files window (KDevelop)" url="ch18.html"/>
+<entry name="CDE (Common Desktop Environment)" url="ch01.html"/>
+<entry name="cgi resource type" url="ch07lev1sec4.html"/>
+<entry name="CGotoDialog class, modeless dialog box" url="ch08lev1sec3.html"/>
+<entry name="CGotoDialog example, layout" url="ch08lev1sec2.html"/>
+<entry name="Chapter tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="checking out, applications (CVS)" url="ch17lev1sec5.html"/>
+<entry name="checking spelling" url="ch10lev1sec3.html"/>
+<entry name="checkList() method" url="ch10lev1sec3.html"/>
+<entry name="check() method" url="ch10lev1sec3.html"/>
+<entry name="checkWord() method" url="ch10lev1sec3.html"/>
+<entry name="Child Classes command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="child widgets, geometry management, QBoxLayout manager" url="ch04lev1sec3.html"/>
+<entry name="child widgets, geometry management, QGridLayout manager" url="ch04lev1sec3.html"/>
+<entry name="child widgets, geometry management" url="ch04lev1sec3.html"/>
+<entry name="child widgets, KChildren example, kchildren.cpp class definition" url="ch04lev1sec3.html"/>
+<entry name="child widgets, KChildren example, kchildren.h class declaration" url="ch04lev1sec3.html"/>
+<entry name="child widgets, KChildren example, main() method" url="ch04lev1sec3.html"/>
+<entry name="child widgets, KChildren example" url="ch04lev1sec3.html"/>
+<entry name="child widgets" url="ch04lev1sec3.html"/>
+<entry name="Classbrowser (KDevelop)" url="ch18lev1sec4.html"/>
+<entry name="class declarations, ***copy from declaring***" url="ch11lev1sec2.html"/>
+<entry name="class declarations" url="ch02lev1sec3.html"/>
+<entry name="class definitions, ***copy from defining***" url="ch11lev1sec2.html"/>
+<entry name="class definitions" url="ch02lev1sec4.html"/>
+<entry name="classes, CGotoDialog, modeless dialog box" url="ch08lev1sec3.html"/>
+<entry name="classes, documentation" url="ch02lev1sec5.html"/>
+<entry name="classes, documentation" url="ch15.html"/>
+<entry name="classes, KAction" url="ch05.html"/>
+<entry name="classes, KAction" url="ch06.html"/>
+<entry name="classes, KApplication" url="ch02lev1sec3.html"/>
+<entry name="classes, KAudioPlayer" url="ch14lev1sec6.html"/>
+<entry name="classes, KDE versus QT" url="ch03lev1sec2.html"/>
+<entry name="classes, KDialogBase" url="ch08lev1sec5.html"/>
+<entry name="classes, KEdit, Option dialog box" url="ch08lev1sec6.html"/>
+<entry name="classes, KNotifyClient" url="ch06lev1sec6.html"/>
+<entry name="classes, KNotify" url="ch13lev1sec7.html"/>
+<entry name="classes, KRun, opening files" url="ch06lev1sec7.html"/>
+<entry name="classes, KRun, running applications" url="ch06lev1sec7.html"/>
+<entry name="classes, KStdAction" url="ch05.html"/>
+<entry name="classes, KTMainWindow" url="ch02lev1sec3.html"/>
+<entry name="classes, KUniqueApplication, passing command-line parameters" url="ch13lev1sec7.html"/>
+<entry name="classes, KUniqueApplication, startup" url="ch13lev1sec7.html"/>
+<entry name="classes, KUniqueApplication" url="ch13lev1sec7.html"/>
+<entry name="classes, mainwindow" url="ch12lev1sec2.html"/>
+<entry name="classes, naming conventions" url="ch02lev1sec5.html"/>
+<entry name="classes, network transparency" url="ch06lev1sec8.html"/>
+<entry name="classes, part manager" url="ch12lev1sec2.html"/>
+<entry name="classes, part" url="ch12lev1sec2.html"/>
+<entry name="classes, plugin" url="ch12lev1sec2.html"/>
+<entry name="classes, QImage" url="ch10lev1sec2.html"/>
+<entry name="classes, QLayout, code example" url="ch08lev1sec2.html"/>
+<entry name="classes, QLayout, design issues" url="ch08lev1sec2.html"/>
+<entry name="classes, QLayout" url="ch08lev1sec2.html"/>
+<entry name="classes, QObject" url="ch03lev1sec2.html"/>
+<entry name="classes, QPainter, example usage (listing)" url="ch03lev1sec2.html"/>
+<entry name="classes, QPainter, functions" url="ch03lev1sec2.html"/>
+<entry name="classes, QPainter, methods" url="ch04lev1sec2.html"/>
+<entry name="classes, QPainter" url="ch03lev1sec2.html"/>
+<entry name="classes, QPainter" url="ch04lev1sec2.html"/>
+<entry name="classes, QPicture class, drawing commands, recording" url="ch04lev1sec2.html"/>
+<entry name="classes, QPixmap" url="ch10lev1sec2.html"/>
+<entry name="classes, QPushButton, functions" url="ch03lev1sec2.html"/>
+<entry name="classes, QPushButton, listing" url="ch03lev1sec2.html"/>
+<entry name="classes, QPushButton" url="ch03lev1sec2.html"/>
+<entry name="classes, QWidget, attributes" url="ch04.html"/>
+<entry name="classes, QWidget, documentation" url="ch04.html"/>
+<entry name="classes, QWidget, event handlers" url="ch04.html"/>
+<entry name="classes, QWidget, example (listing)" url="ch03lev1sec2.html"/>
+<entry name="classes, QWidget, functions" url="ch03lev1sec2.html"/>
+<entry name="classes, QWidget, sample class declaration" url="ch04.html"/>
+<entry name="classes, QWidget, signals" url="ch04.html"/>
+<entry name="classes, QWidget, slots" url="ch04.html"/>
+<entry name="classes, QWidget" url="ch03lev1sec2.html"/>
+<entry name="classes, QWidget" url="ch04.html"/>
+<entry name="classes, ReadOnlyPart" url="ch12lev1sec4.html"/>
+<entry name="classes, ReadWritePart" url="ch12lev1sec4.html"/>
+<entry name="classes, SelectDialog" url="ch08.html"/>
+<entry name="classes, slots in temporary classes" url="ch03lev1sec3.html"/>
+<entry name="classes, slots" url="ch03lev1sec3.html"/>
+<entry name="classes, template, QList" url="ch03lev1sec5.html"/>
+<entry name="classes, template" url="ch03lev1sec5.html"/>
+<entry name="classes, utility (Qt)" url="ch03lev1sec5.html"/>
+<entry name="Classparser (KDevelop)" url="ch18lev1sec4.html"/>
+<entry name="classses" url="ch09lev1sec2.html"/>
+<entry name="Classtool command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="Class Viewer (CV)" url="ch18.html"/>
+<entry name="clean target" url="ch16lev1sec2.html"/>
+<entry name="clients, dcop (DCOP shell client)" url="ch13lev1sec7.html"/>
+<entry name="clients, kdcop (DCOP shell client)" url="ch13lev1sec7.html"/>
+<entry name="closeEvent() event handler, widgets" url="ch04.html"/>
+<entry name="code, distribution, compressed archives" url="ch16lev1sec3.html"/>
+<entry name="code, distribution, informative text files" url="ch16lev1sec3.html"/>
+<entry name="code, distribution, software announcements" url="ch16lev1sec3.html"/>
+<entry name="code, distribution, uploads" url="ch16lev1sec3.html"/>
+<entry name="code, distribution" url="ch16lev1sec3.html"/>
+<entry name="code listings" url="ch04lev1sec3.html"/>
+<entry name="code, packages, administrative files" url="ch16lev1sec2.html"/>
+<entry name="code, packages, make targets" url="ch16lev1sec2.html"/>
+<entry name="code, packages, shared libraries" url="ch16lev1sec2.html"/>
+<entry name="code, packages, structure of" url="ch16.html"/>
+<entry name="code, packages, subdirectories" url="ch16lev1sec2.html"/>
+<entry name="code, packages, test results" url="ch16lev1sec2.html"/>
+<entry name="code, packages, top-level directories" url="ch16lev1sec2.html"/>
+<entry name="code, packages" url="ch16.html"/>
+<entry name="code" url="ch17lev1sec3.html"/>
+<entry name="color, icons, color depth" url="ch06lev1sec3.html"/>
+<entry name="commands, Bookmarks menu" url="ch06.html"/>
+<entry name="commands, Classbrowser pop-up menus, Add Folder" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, Add Member Function" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, Add Member Variable" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, Child Classes" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, Classtool" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, Go to Declaration" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, Graphical Classview" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, New Class" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, New File" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, Options" url="ch18lev1sec4.html"/>
+<entry name="commands, Classbrowser pop-up menus, Parent Classes" url="ch18lev1sec4.html"/>
+<entry name="commands, cvs, add" url="ch17lev1sec5.html"/>
+<entry name="commands, cvs, commit" url="ch17lev1sec5.html"/>
+<entry name="commands, cvs, -l" url="ch17lev1sec5.html"/>
+<entry name="commands, cvs, remove" url="ch17lev1sec5.html"/>
+<entry name="commands, cvs, update" url="ch17lev1sec5.html"/>
+<entry name="commands, cvs" url="ch17lev1sec5.html"/>
+<entry name="commands, Edit menu" url="ch06.html"/>
+<entry name="commands, File menu" url="ch06.html"/>
+<entry name="commands, gdb debugger" url="ch18lev1sec6.html"/>
+<entry name="commands, Go menu" url="ch06.html"/>
+<entry name="commands, Help menu" url="ch06.html"/>
+<entry name="commands, Settings menu" url="ch06.html"/>
+<entry name="commands, Tools menu" url="ch06.html"/>
+<entry name="commands, View menu" url="ch06.html"/>
+<entry name="comments, KDOC-formatted comments" url="ch15.html"/>
+<entry name="commit option (cvs command)" url="ch17lev1sec5.html"/>
+<entry name="Common Desktop Environment (CDE)" url="ch01.html"/>
+<entry name="Common Object Request Broker Architecture (CORBA)" url="ch13lev1sec2.html"/>
+<entry name="compiler (IDL), invoking" url="ch14lev1sec3.html"/>
+<entry name="compilers, dcopidl" url="ch13lev1sec5.html"/>
+<entry name="compiling programs, example" url="ch02lev1sec2.html"/>
+<entry name="compiling programs, g++ compiler" url="ch02lev1sec2.html"/>
+<entry name="compiling programs, make utility" url="ch02lev1sec2.html"/>
+<entry name="compiling programs" url="ch02lev1sec2.html"/>
+<entry name="components" url="ch12.html"/>
+<entry name="compressed archives, creating" url="ch16lev1sec3.html"/>
+<entry name="computeSome() method" url="ch09lev1sec3.html"/>
+<entry name="Concurrent Versions System" url="ch17.html"/>
+<entry name="config.cache file" url="ch16lev1sec2.html"/>
+<entry name="config.h file" url="ch16lev1sec2.html"/>
+<entry name="config.log file" url="ch16lev1sec2.html"/>
+<entry name="config resource type" url="ch07lev1sec4.html"/>
+<entry name="config.status file" url="ch16lev1sec2.html"/>
+<entry name="configuration, applications, defined" url="ch06.html"/>
+<entry name="configuration files, accessing" url="ch07lev1sec2.html"/>
+<entry name="configuration files;accessing" url="ch07lev1sec2.html"/>
+<entry name="configuration files, example of" url="ch07lev1sec2.html"/>
+<entry name="configuration files" url="ch07lev1sec2.html"/>
+<entry name="configure file" url="ch16lev1sec2.html"/>
+<entry name="configure.in file" url="ch16lev1sec2.html"/>
+<entry name="configureToolbars action" url="ch06.html"/>
+<entry name="configuring, cvsup utility" url="ch17lev1sec4.html"/>
+<entry name="configuring, cvs utility" url="ch17lev1sec5.html"/>
+<entry name="configuring, directories, subdirectories" url="ch16lev1sec2.html"/>
+<entry name="configuring, directories, top-level directories" url="ch16lev1sec2.html"/>
+<entry name="configuring, spell-checking" url="ch10lev1sec3.html"/>
+<entry name="connectDCOPSignal() method" url="ch13lev1sec6.html"/>
+<entry name="connect() function" url="ch14lev1sec3.html"/>
+<entry name="connecting, objects" url="ch14lev1sec3.html"/>
+<entry name="contacts (address book), selecting" url="ch10lev1sec4.html"/>
+<entry name="content areas, Konqueror" url="ch05.html"/>
+<entry name="content areas, KOrganizer" url="ch05.html"/>
+<entry name="content areas, KWrite" url="ch05.html"/>
+<entry name="content areas" url="ch05.html"/>
+<entry name="copy action" url="ch06.html"/>
+<entry name="CORBA (Common Object Request Broker Architecture)" url="ch13lev1sec2.html"/>
+<entry name="counting, references" url="ch14lev1sec3.html"/>
+<entry name="createGUI() function" url="ch12lev1sec7.html"/>
+<entry name="C++, templates" url="ch03lev1sec5.html"/>
+<entry name="custom actions, KCustomActions widget, kcustomactions.cpp class definition" url="ch05.html"/>
+<entry name="custom actions, KCustomActions widget, kcustomactions.h class declaration" url="ch05.html"/>
+<entry name="custom actions, KCustomActions widget, kcustomactions.h class definition" url="ch05.html"/>
+<entry name="custom actions, KCustomActions widget, kcustomui.rc file" url="ch05.html"/>
+<entry name="custom actions, KCustomActions widget, main() function" url="ch05.html"/>
+<entry name="custom actions, KCustomActions widget, toolbars" url="ch05.html"/>
+<entry name="Cut action" url="ch06.html"/>
+<entry name="CV (Class Viewer)" url="ch18.html"/>
+<entry name="CVS, accounts" url="ch17lev1sec3.html"/>
+<entry name="CVS, applications, checking out" url="ch17lev1sec5.html"/>
+<entry name="CVS, branches" url="ch17lev1sec2.html"/>
+<entry name="CVS, changes, committing" url="ch17lev1sec5.html"/>
+<entry name="CVS, (Concurrent Versions System)" url="ch17.html"/>
+<entry name="CVS, cvsup utility, advantages" url="ch17lev1sec3.html"/>
+<entry name="CVS, cvsup utility, configuring" url="ch17lev1sec4.html"/>
+<entry name="CVS, cvs utility, command-line optoins" url="ch17lev1sec5.html"/>
+<entry name="CVS, cvs utility, commands" url="ch17lev1sec5.html"/>
+<entry name="CVS, cvs utility, configuring" url="ch17lev1sec5.html"/>
+<entry name="CVS, directories, adding" url="ch17lev1sec5.html"/>
+<entry name="CVS, directories, removing" url="ch17lev1sec5.html"/>
+<entry name="CVS, files, adding" url="ch17lev1sec5.html"/>
+<entry name="CVS, files, removing" url="ch17lev1sec5.html"/>
+<entry name="CVS, modules, checking out" url="ch17lev1sec5.html"/>
+<entry name="CVS, modules, listing" url="ch17lev1sec5.html"/>
+<entry name="CVS, modules, names" url="ch17lev1sec2.html"/>
+<entry name="CVS, modules, updating" url="ch17lev1sec5.html"/>
+<entry name="CVS, snapshots" url="ch17lev1sec3.html"/>
+<entry name="cvsup utility, advantages" url="ch17lev1sec3.html"/>
+<entry name="cvsup utility, configuring" url="ch17lev1sec4.html"/>
+<entry name="CVS" url="ch17.html"/>
+<entry name="cvs utility, commands, add" url="ch17lev1sec5.html"/>
+<entry name="cvs utility, commands, commit" url="ch17lev1sec5.html"/>
+<entry name="cvs utility, commands, -l" url="ch17lev1sec5.html"/>
+<entry name="cvs utility, commands, remove" url="ch17lev1sec5.html"/>
+<entry name="cvs utility, commands, update" url="ch17lev1sec5.html"/>
+<entry name="cvs utility, commands" url="ch17lev1sec5.html"/>
+<entry name="cvs utility, configuring" url="ch17lev1sec5.html"/>
+<entry name="CVS, Web interface" url="ch17lev1sec3.html"/>
+<entry name="data resource type" url="ch07lev1sec4.html"/>
+<entry name="data streaming, reading devices" url="ch13lev1sec3.html"/>
+<entry name="data streaming" url="ch13lev1sec3.html"/>
+<entry name="data streaming, writing to devices" url="ch13lev1sec3.html"/>
+<entry name="data types (IDL)" url="ch14lev1sec3.html"/>
+<entry name="Date tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="DCOP, API tools, findObject() method" url="ch13lev1sec6.html"/>
+<entry name="DCOP, API tools, isApplicationRegistered() method" url="ch13lev1sec6.html"/>
+<entry name="DCOP, API tools, isRegistered() method" url="ch13lev1sec6.html"/>
+<entry name="DCOP, API tools, registeredApplications() method" url="ch13lev1sec6.html"/>
+<entry name="DCOP, API tools, remoteFunctions() method" url="ch13lev1sec6.html"/>
+<entry name="DCOP, API tools, remoteInterfaces() method" url="ch13lev1sec6.html"/>
+<entry name="DCOP, API tools, remoteObjects() method" url="ch13lev1sec6.html"/>
+<entry name="DCOP, API tools, senderId() method" url="ch13lev1sec6.html"/>
+<entry name="DCOP, API tools, socket() method" url="ch13lev1sec6.html"/>
+<entry name="DCOP, API tools" url="ch13lev1sec6.html"/>
+<entry name="DCOP, architecture" url="ch13lev1sec4.html"/>
+<entry name="dcopc interface" url="ch13lev1sec7.html"/>
+<entry name="dcopClient() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, dcopc interface" url="ch13lev1sec7.html"/>
+<entry name="dcop (DCOP shell client)" url="ch13lev1sec7.html"/>
+<entry name="DCOP, dcop (shell client)" url="ch13lev1sec7.html"/>
+<entry name="DCOP, (Desktop Communication Protocol)" url="ch13.html"/>
+<entry name="DCOP, embedded K instances" url="ch13lev1sec6.html"/>
+<entry name="DCOP, embedded KPart instances" url="ch13lev1sec6.html"/>
+<entry name="DCOP, goals" url="ch13.html"/>
+<entry name="DCOP, history of" url="ch13lev1sec2.html"/>
+<entry name="dcopIDL" url="ch13lev1sec5.html"/>
+<entry name="DCOP, kdcop (shell client)" url="ch13lev1sec7.html"/>
+<entry name="DCOP, KNotify example" url="ch13lev1sec7.html"/>
+<entry name="DCOP, KUniqueApplication example, passing command-line parameters" url="ch13lev1sec7.html"/>
+<entry name="DCOP, KUniqueApplication example, startup" url="ch13lev1sec7.html"/>
+<entry name="DCOP, KUniqueApplication example" url="ch13lev1sec7.html"/>
+<entry name="DCOP, KXMLRPC interface" url="ch13lev1sec7.html"/>
+<entry name="DCOP, message redirection technology (referencing)" url="ch13lev1sec6.html"/>
+<entry name="DCOP, performance and overhead" url="ch13lev1sec6.html"/>
+<entry name="DCOP, programming interface, attach() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, call() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, dcopClient() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, dcopIDL" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, detach() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, makefile rules" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, process() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, registerAs() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, resume() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, send() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, suspend() method" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface, transactions" url="ch13lev1sec5.html"/>
+<entry name="DCOP, programming interface" url="ch13lev1sec5.html"/>
+<entry name="DCOPRef objects" url="ch13lev1sec6.html"/>
+<entry name="DCOP, signals and slots" url="ch13lev1sec6.html"/>
+<entry name="DCOP, underlying technologies, data streaming" url="ch13lev1sec3.html"/>
+<entry name="DCOP, underlying technologies, ICE (Inter-Client Exchange) mechanism" url="ch13lev1sec3.html"/>
+<entry name="DCOP, underlying technologies" url="ch13lev1sec3.html"/>
+<entry name="DCOP" url="ch13.html"/>
+<entry name="DCOP" url="ch13lev1sec5.html"/>
+<entry name="DCOP" url="ch13lev1sec7.html"/>
+<entry name="DDD debugger" url="ch02.html"/>
+<entry name="debuggers, gdb, options" url="ch18lev1sec6.html"/>
+<entry name="debuggers, gdb" url="ch18lev1sec6.html"/>
+<entry name="debuggers" url="ch02.html"/>
+<entry name="declaring, widget classes, kabdemo.h class declaration" url="ch10lev1sec4.html"/>
+<entry name="declaring, widget classes, KChildren example" url="ch04lev1sec3.html"/>
+<entry name="declaring widget classes, KConfigDemo widget" url="ch07lev1sec2.html"/>
+<entry name="declaring widget classes, KCustomActions widget" url="ch05.html"/>
+<entry name="declaring, widget classes, KDialogApp" url="ch11.html"/>
+<entry name="declaring, widget classes, KDisc example" url="ch04lev1sec4.html"/>
+<entry name="declaring widget classes, KDragDemo widget" url="ch07.html"/>
+<entry name="declaring widget classes, KDropDemo widget" url="ch07.html"/>
+<entry name="declaring widget classes, KHelpers" url="ch05lev1sec2.html"/>
+<entry name="declaring, widget classes, KImageView" url="ch10lev1sec2.html"/>
+<entry name="declaring, widget classes, KLongJob example" url="ch09lev1sec3.html"/>
+<entry name="declaring, widget classes, KPushButton example" url="ch04.html"/>
+<entry name="declaring, widget classes, KQuickDraw" url="ch09lev1sec2.html"/>
+<entry name="declaring widget classes, KRemoteDemo widget" url="ch07lev1sec5.html"/>
+<entry name="declaring widget classes, KResourceDemo widget" url="ch07lev1sec4.html"/>
+<entry name="declaring widget classes, KSaveAcross widget" url="ch07lev1sec3.html"/>
+<entry name="declaring, widget classes, KSimpleApp example" url="ch02lev1sec3.html"/>
+<entry name="declaring, widget classes, KSpellDemo" url="ch10lev1sec3.html"/>
+<entry name="declaring widget classes, KStatusBarDemo widget" url="ch05.html"/>
+<entry name="declaring widget classes, KStdActionsDemo widget" url="ch05.html"/>
+<entry name="declaring, widget classes, KTicTacToe example" url="ch04lev1sec3.html"/>
+<entry name="declaring, widget classes, KXOSquare example" url="ch04lev1sec2.html"/>
+<entry name="declaring, widget classes" url="ch11lev1sec2.html"/>
+<entry name="defiing, widget classes, KChildren example" url="ch04lev1sec3.html"/>
+<entry name="defining, streams" url="ch14lev1sec3.html"/>
+<entry name="defining, widget classes, KabDemo" url="ch10lev1sec4.html"/>
+<entry name="defining widget classes, KConfigDemo widget" url="ch07lev1sec2.html"/>
+<entry name="defining widget classes, KCustomActions widget" url="ch05.html"/>
+<entry name="defining, widget classes, KDialogApp" url="ch11.html"/>
+<entry name="defining, widget classes, KDisc example" url="ch04lev1sec4.html"/>
+<entry name="defining widget classes, KDragDemo widget" url="ch07.html"/>
+<entry name="defining widget classes, KDropDemo widget" url="ch07.html"/>
+<entry name="defining widget classes, KHelpers" url="ch05lev1sec2.html"/>
+<entry name="defining, widget classes, KImageView" url="ch10lev1sec2.html"/>
+<entry name="defining, widget classes, KQuickDraw" url="ch09lev1sec2.html"/>
+<entry name="defining widget classes, KRemoteDemo widget" url="ch07lev1sec5.html"/>
+<entry name="defining widget classes, KResourceDemo widget" url="ch07lev1sec4.html"/>
+<entry name="defining widget classes, KSaveAcross widget" url="ch07lev1sec3.html"/>
+<entry name="defining, widget classes, KSimpleApp example" url="ch02lev1sec4.html"/>
+<entry name="defining, widget classes, KSpellDemo" url="ch10lev1sec3.html"/>
+<entry name="defining widget classes, KStatusBarDemo widget" url="ch05.html"/>
+<entry name="defining widget classes, KStdActionsDemo widget" url="ch05.html"/>
+<entry name="defining, widget classes, KTicTacToe example" url="ch04lev1sec3.html"/>
+<entry name="defining, widget classes, kunique.h" url="ch11lev1sec2.html"/>
+<entry name="defining, widget classes, kweather.cpp" url="ch11lev1sec3.html"/>
+<entry name="defining, widget classes, kweather.h" url="ch11lev1sec3.html"/>
+<entry name="defining, widget classes, KXOSquare example" url="ch04lev1sec2.html"/>
+<entry name="defining, widget classes" url="ch11lev1sec2.html"/>
+<entry name="deleting, CVS (Concurrent Version System) directories" url="ch17lev1sec5.html"/>
+<entry name="deleting, CVS (Concurrent Version System) files" url="ch17lev1sec5.html"/>
+<entry name="deprecated (" url="ch15.html"/>
+<entry name="design guidelines, dialog boxes, layout issues" url="ch08lev1sec2.html"/>
+<entry name="design guidelines, dialog boxes" url="ch08lev1sec7.html"/>
+<entry name="designing, icons" url="ch06lev1sec3.html"/>
+<entry name="Desktop Communication Protocol. See DCOP" url="ch13.html"/>
+<entry name=".desktop files" url="ch07lev1sec4.html"/>
+<entry name="detach function" url="ch14lev1sec4.html"/>
+<entry name="detach() method" url="ch13lev1sec5.html"/>
+<entry name="development, documentation" url="ch18.html"/>
+<entry name="development history of, DCOP (Desktop Communication Protocol)" url="ch13lev1sec2.html"/>
+<entry name="development, languages" url="ch18.html"/>
+<entry name="development, project management" url="ch18.html"/>
+<entry name="diagnostic tools, gdb debugger, commands" url="ch18lev1sec6.html"/>
+<entry name="diagnostic tools, gdb debugger, enabling debugging information" url="ch18lev1sec6.html"/>
+<entry name="diagnostic tools, gdb debugger, options" url="ch18lev1sec6.html"/>
+<entry name="diagnostic tools, gdb debugger, running" url="ch18lev1sec6.html"/>
+<entry name="diagnostic tools, gdb debugger" url="ch18lev1sec6.html"/>
+<entry name="dialog-based application (KDialogApp), kdialogapp.cpp class declaration" url="ch11.html"/>
+<entry name="dialog-based application (KDialogApp), kdialogapp.h class definition" url="ch11.html"/>
+<entry name="dialog-based application (KDialogApp), main() method" url="ch11.html"/>
+<entry name="dialog-based application (KDialogApp)" url="ch11.html"/>
+<entry name="dialog boxes, design guidelines" url="ch08lev1sec7.html"/>
+<entry name="dialog boxes, dialog-based application (KDialogApp), kdialogapp.cpp class declaration" url="ch11.html"/>
+<entry name="dialog boxes, dialog-based application (KDialogApp), kdialogapp.h class definition" url="ch11.html"/>
+<entry name="dialog boxes, dialog-based application (KDialogApp), main() method" url="ch11.html"/>
+<entry name="dialog boxes, dialog-based application (KDialogApp)" url="ch11.html"/>
+<entry name="dialog boxes, kdeui (KDE user-interface library), manager widgets" url="ch08lev1sec4.html"/>
+<entry name="dialog boxes, kdeui (KDE user-interface library), read-to-use dialog boxes" url="ch08lev1sec4.html"/>
+<entry name="dialog boxes, kdeui (KDE user-interface library)" url="ch08lev1sec4.html"/>
+<entry name="dialog boxes, KDialogBase class" url="ch08lev1sec5.html"/>
+<entry name="dialog boxes, KEdit Option dialog example" url="ch08lev1sec6.html"/>
+<entry name="dialog boxes, KSpellConfig configuration dialog" url="ch10lev1sec3.html"/>
+<entry name="dialog boxes, layout, CGotoDialog example" url="ch08lev1sec2.html"/>
+<entry name="dialog boxes, layout, design issues" url="ch08lev1sec2.html"/>
+<entry name="dialog boxes, layout, hierarchies of layouts" url="ch08lev1sec2.html"/>
+<entry name="dialog boxes, layout, manual placement" url="ch08lev1sec2.html"/>
+<entry name="dialog boxes, layout, nested layouts" url="ch08lev1sec2.html"/>
+<entry name="dialog boxes, layout, QLayout classes" url="ch08lev1sec2.html"/>
+<entry name="dialog boxes, layout, QVBox/QHBox widgets" url="ch08lev1sec2.html"/>
+<entry name="dialog boxes, modal, advantages/disadvantages" url="ch08lev1sec3.html"/>
+<entry name="dialog boxes, modal, modal dialog allocated from the heap" url="ch08lev1sec3.html"/>
+<entry name="dialog boxes, modal, modal dialog located on the stack" url="ch08lev1sec3.html"/>
+<entry name="dialog boxes, modeless, advantages/disadvantages" url="ch08lev1sec3.html"/>
+<entry name="dialog boxes, modeless, CGotoDialog class example" url="ch08lev1sec3.html"/>
+<entry name="dialog boxes, modeless, removing from memory" url="ch08lev1sec3.html"/>
+<entry name="dialog boxes, simple example" url="ch08.html"/>
+<entry name="dialog boxes, standard dialog boxes, KFileDialog" url="ch05lev1sec3.html"/>
+<entry name="dialog boxes, standard dialog boxes, KFontDialog" url="ch05lev1sec3.html"/>
+<entry name="dialog boxes, standard dialog boxes, KMessageBox" url="ch05lev1sec3.html"/>
+<entry name="dialog boxes, standard dialog boxes, sample application" url="ch05lev1sec3.html"/>
+<entry name="dialog boxes, standard dialog boxes" url="ch05lev1sec3.html"/>
+<entry name="dialog boxes" url="ch08.html"/>
+<entry name="dialog boxes" url="ch08lev1sec2.html"/>
+<entry name="dialog boxes" url="ch08lev1sec3.html"/>
+<entry name="Dialog Editor (KDevelop IDE), advantages" url="ch18.html"/>
+<entry name="Dialog Editor (KDevelop IDE)" url="ch18.html"/>
+<entry name="Dialog Editor (KDevelop IDE), weaknesses" url="ch18.html"/>
+<entry name="directories, CVS (Concurrent Version System), adding" url="ch17lev1sec5.html"/>
+<entry name="directories, CVS (Concurrent Version System), removing" url="ch17lev1sec5.html"/>
+<entry name="directories, subdirectories, configuring" url="ch16lev1sec2.html"/>
+<entry name="directories, top-level directories, configuring" url="ch16lev1sec2.html"/>
+<entry name="disableResize() method" url="ch08lev1sec2.html"/>
+<entry name="disabling, application functinos" url="ch09lev1sec3.html"/>
+<entry name="Disassemble page (KDevelop Output View" url="ch18.html"/>
+<entry name="disconnectDCOPSignal() method" url="ch13lev1sec6.html"/>
+<entry name="distclean target" url="ch16lev1sec2.html"/>
+<entry name="distribution, compressed archives" url="ch16lev1sec3.html"/>
+<entry name="distribution, informative text files" url="ch16lev1sec3.html"/>
+<entry name="distribution, packages" url="ch16lev1sec3.html"/>
+<entry name="distributions (KDE)" url="ch01lev1sec2.html"/>
+<entry name="distribution, software announcements" url="ch16lev1sec3.html"/>
+<entry name="distribution, uploads" url="ch16lev1sec3.html"/>
+<entry name="distribution" url="ch16lev1sec3.html"/>
+<entry name="DOC (Documentation Tree View)" url="ch18.html"/>
+<entry name="DOCTYPE tag (XML)" url="ch12lev1sec3.html"/>
+<entry name="documentation, accessing" url="ch18.html"/>
+<entry name="Documentation-Browser (KDevelop)" url="ch18lev1sec3.html"/>
+<entry name="Documentation-Browser window (KDevelop)" url="ch18.html"/>
+<entry name="documentation, DocBook tools, DocBook Web site" url="ch15lev1sec2.html"/>
+<entry name="documentation, DocBook tools, downloading" url="ch15lev1sec2.html"/>
+<entry name="documentation, DocBook tools, processing documentation" url="ch15lev1sec2.html"/>
+<entry name="documentation, DocBook tools, sample documentation" url="ch15lev1sec2.html"/>
+<entry name="documentation, DocBook tools, tags" url="ch15lev1sec2.html"/>
+<entry name="documentation, DocBook tools" url="ch15lev1sec2.html"/>
+<entry name="documentation, KDevelop IDE, API documentation" url="ch18lev1sec3.html"/>
+<entry name="documentation, KDevelop IDE, Documentation-Browser" url="ch18lev1sec3.html"/>
+<entry name="documentation, KDevelop IDE, online handbooks" url="ch18lev1sec3.html"/>
+<entry name="documentation, KDevelop IDE, searching" url="ch18lev1sec3.html"/>
+<entry name="documentation, KDevelop IDE" url="ch18lev1sec3.html"/>
+<entry name="documentation, KDOC, class documentation" url="ch15.html"/>
+<entry name="documentation, KDOC, comments" url="ch15.html"/>
+<entry name="documentation, KDOC, downloading" url="ch15.html"/>
+<entry name="documentation, KDOC, installing" url="ch15.html"/>
+<entry name="documentation, KDOC, library documentation" url="ch15.html"/>
+<entry name="documentation, KDOC, method documentation" url="ch15.html"/>
+<entry name="documentation, KDOC" url="ch15.html"/>
+<entry name="Documentation Tree View (DOC)" url="ch18.html"/>
+<entry name="documentation" url="ch02lev1sec5.html"/>
+<entry name="documentation" url="ch15.html"/>
+<entry name="documentation, widgets" url="ch04.html"/>
+<entry name="document-centric programs" url="ch02lev1sec3.html"/>
+<entry name="document-centric user interface, actions, custom actions" url="ch05.html"/>
+<entry name="document-centric user interface, actions, KAction class" url="ch05.html"/>
+<entry name="document-centric user interface, actions, standard actions" url="ch05.html"/>
+<entry name="document-centric user interface, actions" url="ch05.html"/>
+<entry name="document-centric user interface, content areas, Konqueror" url="ch05.html"/>
+<entry name="document-centric user interface, content areas, KOrganizer" url="ch05.html"/>
+<entry name="document-centric user interface, content areas, KWrite" url="ch05.html"/>
+<entry name="document-centric user interface, content areas" url="ch05.html"/>
+<entry name="document-centric user interface, menubars" url="ch05.html"/>
+<entry name="document-centric user interface, status bars, Konqueror status bar" url="ch05.html"/>
+<entry name="document-centric user interface, status bars, KWrite status bar" url="ch05.html"/>
+<entry name="document-centric user interface, status bars" url="ch05.html"/>
+<entry name="document-centric user interface, toolbars" url="ch05.html"/>
+<entry name="document-centric user interface" url="ch05.html"/>
+<entry name="document structure tags (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="double-buffering, advantages" url="ch09lev1sec2.html"/>
+<entry name="double-buffering, example of" url="ch09lev1sec2.html"/>
+<entry name="double-buffering, screen flicker" url="ch09lev1sec2.html"/>
+<entry name="double-buffering" url="ch09lev1sec2.html"/>
+<entry name="download() function" url="ch07lev1sec5.html"/>
+<entry name="downloading, DocBook tools" url="ch15lev1sec2.html"/>
+<entry name="downloading, KDOC" url="ch15.html"/>
+<entry name="drag and drop, responding to drop events" url="ch07.html"/>
+<entry name="drag and drop, starting a drag" url="ch07.html"/>
+<entry name="drag and drop" url="ch07.html"/>
+<entry name="drag and drop, XDND protocol" url="ch07.html"/>
+<entry name="DragCopy operations" url="ch07.html"/>
+<entry name="DragCopyOrMove operations" url="ch07.html"/>
+<entry name="DragDefault operations" url="ch07.html"/>
+<entry name="dragEnterEvent() event handler, widgets" url="ch04.html"/>
+<entry name="dragEnterEvent() function" url="ch07.html"/>
+<entry name="drag events, starting" url="ch07.html"/>
+<entry name="dragLeaveEvent() event handler, widgets" url="ch04.html"/>
+<entry name="dragMoveEvent() event handler, widgets" url="ch04.html"/>
+<entry name="DragMove operations" url="ch07.html"/>
+<entry name="drawEllipse() method" url="ch04lev1sec2.html"/>
+<entry name="drawing, bounding boxes" url="ch04lev1sec2.html"/>
+<entry name="drawing commands, recording, QPicture class" url="ch04lev1sec2.html"/>
+<entry name="drawing, ellipses" url="ch04lev1sec2.html"/>
+<entry name="drawing, lines" url="ch04lev1sec2.html"/>
+<entry name="drawLine() method" url="ch04lev1sec2.html"/>
+<entry name="drawRect() method" url="ch04lev1sec2.html"/>
+<entry name="dropEvent() event handler, widgets" url="ch04.html"/>
+<entry name="dropEvent() function" url="ch07.html"/>
+<entry name="drop events, responding to" url="ch07.html"/>
+<entry name="editBookmarks action" url="ch06.html"/>
+<entry name="editing, KEdit, session management code" url="ch06lev1sec2.html"/>
+<entry name="editing, projects" url="ch18lev1sec2.html"/>
+<entry name="editing, spell-checking (KSpell), configuring" url="ch10lev1sec3.html"/>
+<entry name="editing, spell-checking (KSpell), methods" url="ch10lev1sec3.html"/>
+<entry name="editing, spell-checking (KSpell), modal spell-checking" url="ch10lev1sec3.html"/>
+<entry name="editing, spell-checking (KSpell), sample application" url="ch10lev1sec3.html"/>
+<entry name="editing, spell-checking (KSpell)" url="ch10lev1sec3.html"/>
+<entry name="Edit menu commands" url="ch06.html"/>
+<entry name="editors, Dialog Editor (KDevelop), advantages" url="ch18.html"/>
+<entry name="editors, Dialog Editor (KDevelop)" url="ch18.html"/>
+<entry name="editors, Dialog Editor (KDevelop), weaknesses" url="ch18.html"/>
+<entry name="editors" url="ch02.html"/>
+<entry name="ellipses, drawing" url="ch04lev1sec2.html"/>
+<entry name="emacs editor" url="ch02.html"/>
+<entry name="email, mailing lists" url="ch01lev1sec3.html"/>
+<entry name="embedded KPart instances, DCOP (Desktop Communication Protocol)" url="ch13lev1sec6.html"/>
+<entry name="embedding, parts, mainwindow GUI" url="ch12lev1sec7.html"/>
+<entry name="embedding, parts, mainwindow header" url="ch12lev1sec7.html"/>
+<entry name="embedding, parts, mainwindow implementation" url="ch12lev1sec7.html"/>
+<entry name="embedding, parts, multiple parts" url="ch12lev1sec8.html"/>
+<entry name="embedding, parts" url="ch12lev1sec7.html"/>
+<entry name="emitDCOPSignal() method" url="ch13lev1sec6.html"/>
+<entry name="emitting signals" url="ch03lev1sec3.html"/>
+<entry name="Emphasis tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="enabling, application functions" url="ch09lev1sec3.html"/>
+<entry name="enabling, debugging, gdb debugger" url="ch18lev1sec6.html"/>
+<entry name="endTransaction() method" url="ch13lev1sec5.html"/>
+<entry name="enterEvent() event handler, widgets" url="ch04.html"/>
+<entry name="environment variables, KDEDIR" url="ch02lev1sec2.html"/>
+<entry name="environment variables, QTDIR" url="ch02lev1sec2.html"/>
+<entry name="error() function" url="ch05lev1sec3.html"/>
+<entry name="Ettrich, Matthias" url="ch01.html"/>
+<entry name="Ettrich, Matthias" url="ch13lev1sec2.html"/>
+<entry name="event() event handler, widgets" url="ch04.html"/>
+<entry name="event handling, drag events" url="ch07.html"/>
+<entry name="event handling, drop events" url="ch07.html"/>
+<entry name="event handling, Qt" url="ch03lev1sec2.html"/>
+<entry name="event handling, signals and slots" url="ch03lev1sec3.html"/>
+<entry name="event handling, widgets, closeEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, dragEnterEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, dragLeaveEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, dragMoveEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, dropEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, enterEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, event()" url="ch04.html"/>
+<entry name="event handling, widgets, focusInEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, focusOutEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, KDisc example" url="ch04lev1sec4.html"/>
+<entry name="event handling, widgets, keyPressEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, keyReleaseEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, keystrokes" url="ch04lev1sec4.html"/>
+<entry name="event handling, widgets, leaveEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, mouse clicks" url="ch04lev1sec4.html"/>
+<entry name="event handling, widgets, mouseDoubleClickEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, mouseMoveEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, mousePressEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, mouseReleaseEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, moveEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, paintEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, resizeEvent()" url="ch04.html"/>
+<entry name="event handling, widgets, showEvent()" url="ch04.html"/>
+<entry name="event handling, widgets" url="ch04.html"/>
+<entry name="event handling, widgets" url="ch04lev1sec4.html"/>
+<entry name="event handling, widgets, wheelEvent()" url="ch04.html"/>
+<entry name="Example_ADD module" url="ch14lev1sec2.html"/>
+<entry name="exception (" url="ch15.html"/>
+<entry name="exec() method, QDialog class" url="ch08lev1sec3.html"/>
+<entry name="exe resource type" url="ch07lev1sec4.html"/>
+<entry name="Exit command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="Extensible Markup Language" url="ch05.html"/>
+<entry name="factories, NotepadFactory, notepad_factory.cpp implementation" url="ch12lev1sec6.html"/>
+<entry name="factories, NotepadFactory, notepad_factory.h header" url="ch12lev1sec6.html"/>
+<entry name="file dialog boxes, KFileDialog" url="ch05lev1sec3.html"/>
+<entry name="file manager" url="ch01lev1sec2.html"/>
+<entry name="File menu commands" url="ch06.html"/>
+<entry name="filenames, network transparency" url="ch06lev1sec8.html"/>
+<entry name="files, administrative files, config.cache" url="ch16lev1sec2.html"/>
+<entry name="files, administrative files, config.h" url="ch16lev1sec2.html"/>
+<entry name="files, administrative files, config.log" url="ch16lev1sec2.html"/>
+<entry name="files, administrative files, config.status" url="ch16lev1sec2.html"/>
+<entry name="files, administrative files, configure.in" url="ch16lev1sec2.html"/>
+<entry name="files, administrative files, configure" url="ch16lev1sec2.html"/>
+<entry name="files, administrative files, updating" url="ch16lev1sec2.html"/>
+<entry name="files, administrative files" url="ch16lev1sec2.html"/>
+<entry name="files, application configuration files, accessing" url="ch07lev1sec2.html"/>
+<entry name="files, application configuration files, example of" url="ch07lev1sec2.html"/>
+<entry name="files, application configuration files" url="ch07lev1sec2.html"/>
+<entry name="files, CVS (Concurrent Version System), adding" url="ch17lev1sec5.html"/>
+<entry name="files, CVS (Concurrent Version System), removing" url="ch17lev1sec5.html"/>
+<entry name="files, .desktop" url="ch07lev1sec4.html"/>
+<entry name="files, header, session management" url="ch06lev1sec2.html"/>
+<entry name="files, HTML files, rendering" url="ch10.html"/>
+<entry name="files, image formats" url="ch10lev1sec2.html"/>
+<entry name="files, Makefiles, example of" url="ch02lev1sec2.html"/>
+<entry name="files, makefiles, targets" url="ch16lev1sec2.html"/>
+<entry name="files, Makefiles" url="ch02lev1sec2.html"/>
+<entry name="files, .mcopclass files" url="ch14lev1sec2.html"/>
+<entry name="files, naming conventions" url="ch02lev1sec5.html"/>
+<entry name="files, opening, KRun class" url="ch06lev1sec7.html"/>
+<entry name="files, source, session management" url="ch06lev1sec2.html"/>
+<entry name="files, translation" url="ch06lev1sec4.html"/>
+<entry name="File Viewers (KDevelop), LFV (Logical File Viewer)" url="ch18.html"/>
+<entry name="File Viewers (KDevelop), LFV (Logical File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="File Viewers (KDevelop), RFV (Real File Viewer)" url="ch18.html"/>
+<entry name="File Viewers (KDevelop), RFV (Real File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="File Viewers (KDevelop)" url="ch18lev1sec5.html"/>
+<entry name="find action" url="ch06.html"/>
+<entry name="findNext action" url="ch06.html"/>
+<entry name="findObject() method" url="ch13lev1sec6.html"/>
+<entry name="findPrev action" url="ch06.html"/>
+<entry name="firstPage action" url="ch06.html"/>
+<entry name="fitToHeight action" url="ch06.html"/>
+<entry name="fitToPage action" url="ch06.html"/>
+<entry name="fitToWidth action" url="ch06.html"/>
+<entry name="flicker effect" url="ch09lev1sec2.html"/>
+<entry name="flushing graphics" url="ch03lev1sec2.html"/>
+<entry name="focusInEvent() event handler, widgets" url="ch04.html"/>
+<entry name="focusOutEvent() event handler, widgets" url="ch04.html"/>
+<entry name="font dialog boxes, KFontDialog" url="ch05lev1sec3.html"/>
+<entry name="font dialog boxes, KMessageBox" url="ch05lev1sec3.html"/>
+<entry name="formats, PNG, icons" url="ch06lev1sec3.html"/>
+<entry name="formatting tags (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="forward action" url="ch06.html"/>
+<entry name="Frame Stack page (KDevelop Output View" url="ch18.html"/>
+<entry name="FreeQt license" url="ch19lev1sec3.html"/>
+<entry name="Freshmeat Web site" url="ch16lev1sec3.html"/>
+<entry name="FTP, snapshots" url="ch17lev1sec3.html"/>
+<entry name="funcitons, main(), KHelpers widget" url="ch05lev1sec2.html"/>
+<entry name="functions, actionCollection" url="ch05.html"/>
+<entry name="functions, addAuthor()" url="ch05.html"/>
+<entry name="functions, addGlobalReference" url="ch14lev1sec3.html"/>
+<entry name="functions, add()" url="ch05lev1sec2.html"/>
+<entry name="functions, attach" url="ch14lev1sec4.html"/>
+<entry name="functions, balance()" url="ch14lev1sec5.html"/>
+<entry name="functions, calculateBlock" url="ch14lev1sec2.html"/>
+<entry name="functions, calculateBlock" url="ch14lev1sec3.html"/>
+<entry name="functions, canDecode()" url="ch07.html"/>
+<entry name="functions, connect()" url="ch14lev1sec3.html"/>
+<entry name="functions, cretaeGUI()" url="ch12lev1sec7.html"/>
+<entry name="functions, detach" url="ch14lev1sec4.html"/>
+<entry name="functions, download()" url="ch07lev1sec5.html"/>
+<entry name="functions, dragEnterEvent()" url="ch07.html"/>
+<entry name="functions, dropEvent()" url="ch07.html"/>
+<entry name="functions, enabling/disabling" url="ch09lev1sec3.html"/>
+<entry name="functions, error()" url="ch05lev1sec3.html"/>
+<entry name="functions, getColor()" url="ch05lev1sec3.html"/>
+<entry name="functions, getExistingDirectory()" url="ch05lev1sec3.html"/>
+<entry name="functions, getFont()" url="ch05lev1sec3.html"/>
+<entry name="functions, getGlobalReference" url="ch14lev1sec3.html"/>
+<entry name="functions, getOpenFileName()" url="ch05lev1sec3.html"/>
+<entry name="functions, getSaveFileName()" url="ch05lev1sec3.html"/>
+<entry name="functions, helpMenu()" url="ch05lev1sec2.html"/>
+<entry name="functions, i18n(), KDE Translator's and Documenter's Web site" url="ch06lev1sec4.html"/>
+<entry name="functions, i18n(), syntax" url="ch06lev1sec4.html"/>
+<entry name="functions, i18n()" url="ch06lev1sec4.html"/>
+<entry name="functions, i18n()" url="ch07lev1sec4.html"/>
+<entry name="functions, information()" url="ch05lev1sec3.html"/>
+<entry name="functions, kingioRegister()" url="ch07lev1sec4.html"/>
+<entry name="functions, main(), KConfigDemo widget" url="ch07lev1sec2.html"/>
+<entry name="functions, main(), KCustomActions widget" url="ch05.html"/>
+<entry name="functions, main(), KDragDemo widget" url="ch07.html"/>
+<entry name="functions, main(), KDropDemo widget" url="ch07.html"/>
+<entry name="functions, main(), KRemoteDemo widget" url="ch07lev1sec5.html"/>
+<entry name="functions, main(), KSaveAcross widget" url="ch07lev1sec3.html"/>
+<entry name="functions, main(), KStatusBarDemo widget" url="ch05.html"/>
+<entry name="functions, main(), KStdActionsDemo widget" url="ch05.html"/>
+<entry name="functions, openFile()" url="ch12lev1sec5.html"/>
+<entry name="functions, openNew()" url="ch05.html"/>
+<entry name="functions, QGL widget" url="ch03lev1sec6.html"/>
+<entry name="functions, QList class" url="ch03lev1sec5.html"/>
+<entry name="functions, QPainter class" url="ch03lev1sec2.html"/>
+<entry name="functions, QPushButton class" url="ch03lev1sec2.html"/>
+<entry name="functions, queryClose()" url="ch07lev1sec3.html"/>
+<entry name="functions, QWidget class" url="ch03lev1sec2.html"/>
+<entry name="functions, readProperties()" url="ch07lev1sec3.html"/>
+<entry name="functions, removeGlobalReferences" url="ch14lev1sec3.html"/>
+<entry name="functions, run(), KRun class" url="ch06lev1sec7.html"/>
+<entry name="functions, saveFile()" url="ch12lev1sec5.html"/>
+<entry name="functions, saveProperties()" url="ch07lev1sec3.html"/>
+<entry name="functions, setAcceptDrops()" url="ch07.html"/>
+<entry name="functions, setExclusiveGroup()" url="ch05.html"/>
+<entry name="functions, setModified()" url="ch12lev1sec5.html"/>
+<entry name="functions, setReadWrite()" url="ch12lev1sec5.html"/>
+<entry name="functions, slotOpen()" url="ch07lev1sec5.html"/>
+<entry name="functions, slotSave()" url="ch07lev1sec5.html"/>
+<entry name="functions, slotSpecialHelp()" url="ch05lev1sec2.html"/>
+<entry name="functions, slots" url="ch03lev1sec3.html"/>
+<entry name="functions, sorry()" url="ch05lev1sec3.html"/>
+<entry name="functions, streamEnd()" url="ch14lev1sec3.html"/>
+<entry name="functions, streamInit()" url="ch14lev1sec3.html"/>
+<entry name="functions, streamStart()" url="ch14lev1sec3.html"/>
+<entry name="functions, upload()" url="ch07lev1sec5.html"/>
+<entry name="functions, warningContinueCancel()" url="ch05lev1sec3.html"/>
+<entry name="future technology, MCOP, composition/RAD" url="ch14lev1sec7.html"/>
+<entry name="future technology, MCOP, GUIs" url="ch14lev1sec7.html"/>
+<entry name="future technology, MCOP, media types" url="ch14lev1sec7.html"/>
+<entry name="future technology, MCOP, scripting" url="ch14lev1sec7.html"/>
+<entry name="future technology, MCOP" url="ch14lev1sec7.html"/>
+<entry name="g++ compiler" url="ch02lev1sec2.html"/>
+<entry name="gdb debugger, commands" url="ch18lev1sec6.html"/>
+<entry name="gdb debugger, enabling debugging information" url="ch18lev1sec6.html"/>
+<entry name="gdb debugger, options" url="ch18lev1sec6.html"/>
+<entry name="gdb debugger, running" url="ch18lev1sec6.html"/>
+<entry name="gdb debugger" url="ch18lev1sec6.html"/>
+<entry name="gdb (GNU debugger)" url="ch02.html"/>
+<entry name="geometry management (widgets), dialog boxes, CGotoDialog example" url="ch08lev1sec2.html"/>
+<entry name="geometry management (widgets), dialog boxes, design issues" url="ch08lev1sec2.html"/>
+<entry name="geometry management (widgets), dialog boxes, hierarchies of layouts" url="ch08lev1sec2.html"/>
+<entry name="geometry management (widgets), dialog boxes, manual placement" url="ch08lev1sec2.html"/>
+<entry name="geometry management (widgets), dialog boxes, nested layouts" url="ch08lev1sec2.html"/>
+<entry name="geometry management (widgets), dialog boxes, QLayout classes" url="ch08lev1sec2.html"/>
+<entry name="geometry management (widgets), dialog boxes, QVBox/QHBox widgets" url="ch08lev1sec2.html"/>
+<entry name="geometry management (widgets), QBoxLayout manager" url="ch04lev1sec3.html"/>
+<entry name="geometry management (widgets), QGridLayout manager" url="ch04lev1sec3.html"/>
+<entry name="geometry management (widgets)" url="ch04lev1sec3.html"/>
+<entry name="getColor() function" url="ch05lev1sec3.html"/>
+<entry name="getExistingDirectory() function" url="ch05lev1sec3.html"/>
+<entry name="getFont() function" url="ch05lev1sec3.html"/>
+<entry name="getGlobalReference function" url="ch14lev1sec3.html"/>
+<entry name="getOpenFileName() function" url="ch05lev1sec3.html"/>
+<entry name="getSaveFileName() function" url="ch05lev1sec3.html"/>
+<entry name="ghostviewtest.cpp file" url="ch12lev1sec7.html"/>
+<entry name="GhostViewTest, ghostviewtest.cpp" url="ch12lev1sec7.html"/>
+<entry name="GhostViewTest, ghostviewtest.h" url="ch12lev1sec7.html"/>
+<entry name="GhostViewTest, ghostviewtest_shell.rc" url="ch12lev1sec7.html"/>
+<entry name="ghostviewtest.h file" url="ch12lev1sec7.html"/>
+<entry name="ghostviewtest_shell.rc file" url="ch12lev1sec7.html"/>
+<entry name="GNU debugger (gdb)" url="ch02.html"/>
+<entry name="GNU Public License (GPL)" url="ch19lev1sec2.html"/>
+<entry name="GNU, xgettext utility" url="ch07lev1sec4.html"/>
+<entry name="Go menu commands" url="ch06.html"/>
+<entry name="goTo action" url="ch06.html"/>
+<entry name="Go to Declaration command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="gotoLine action" url="ch06.html"/>
+<entry name="gotoPage action" url="ch06.html"/>
+<entry name="GPL (GNU Public License)" url="ch19lev1sec2.html"/>
+<entry name="Granroth, Kurt" url="ch13lev1sec7.html"/>
+<entry name="Graphical Classview command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="graphical user interface" url="ch18.html"/>
+<entry name="graphics, flushing" url="ch03lev1sec2.html"/>
+<entry name="graphics, image view/converter application (KImageView), kimageview.cpp class declaration" url="ch10lev1sec2.html"/>
+<entry name="graphics, image view/converter application (KImageView), kimageview.h class definition" url="ch10lev1sec2.html"/>
+<entry name="graphics, image view/converter application (KImageView), main() method" url="ch10lev1sec2.html"/>
+<entry name="graphics, image view/converter application (KImageView)" url="ch10lev1sec2.html"/>
+<entry name="graphics, QImage class" url="ch10lev1sec2.html"/>
+<entry name="graphics, QPixmap class" url="ch10lev1sec2.html"/>
+<entry name="graphics, supported formats" url="ch10lev1sec2.html"/>
+<entry name="gt-2.1.0 package" url="ch01lev1sec5.html"/>
+<entry name="GUI (graphical user interface)" url="ch18.html"/>
+<entry name="GUIs, address book, contacts, selecting" url="ch10lev1sec4.html"/>
+<entry name="GUIs, address book" url="ch10lev1sec4.html"/>
+<entry name="GUIs, dialog boxes, design guidelines" url="ch08lev1sec7.html"/>
+<entry name="GUIs, dialog boxes, kdeui (KDE user-interface library)" url="ch08lev1sec4.html"/>
+<entry name="GUIs, dialog boxes, KDialogBase class" url="ch08lev1sec5.html"/>
+<entry name="GUIs, dialog boxes, KEdit Option dialog example" url="ch08lev1sec6.html"/>
+<entry name="GUIs, dialog boxes, layout" url="ch08lev1sec2.html"/>
+<entry name="GUIs, dialog boxes, modal" url="ch08lev1sec3.html"/>
+<entry name="GUIs, dialog boxes, modeless" url="ch08lev1sec3.html"/>
+<entry name="GUIs, dialog boxes, simple example" url="ch08.html"/>
+<entry name="GUIs, dialog boxes" url="ch08.html"/>
+<entry name="GUIs, document-centric interface, actions" url="ch05.html"/>
+<entry name="GUIs, document-centric interface, content areas" url="ch05.html"/>
+<entry name="GUIs, document-centric interface, menubars" url="ch05.html"/>
+<entry name="GUIs, document-centric interface, status bars" url="ch05.html"/>
+<entry name="GUIs, document-centric interface, toolbars" url="ch05.html"/>
+<entry name="GUIs, document-centric interface" url="ch05.html"/>
+<entry name="GUIs, drag and drop, responding to drop events" url="ch07.html"/>
+<entry name="GUIs, drag and drop, starting a drag" url="ch07.html"/>
+<entry name="GUIs, drag and drop" url="ch07.html"/>
+<entry name="GUIs, help, Tooltips" url="ch05lev1sec2.html"/>
+<entry name="GUIs, help" url="ch05lev1sec2.html"/>
+<entry name="GUIs, MCOP and" url="ch14lev1sec7.html"/>
+<entry name="GUIs, menubars, creating" url="ch02lev1sec4.html"/>
+<entry name="GUIs, responsiveness, importance of" url="ch09.html"/>
+<entry name="GUIs, responsiveness, long jobs, optimizing performance of" url="ch09lev1sec3.html"/>
+<entry name="GUIs, responsiveness" url="ch09.html"/>
+<entry name="GUIs, responsiveness, Window updates, double-buffering" url="ch09lev1sec2.html"/>
+<entry name="GUIs, standard dialog boxes, KFileDialog" url="ch05lev1sec3.html"/>
+<entry name="GUIs, standard dialog boxes, KFontDialog" url="ch05lev1sec3.html"/>
+<entry name="GUIs, standard dialog boxes, KMessageBox" url="ch05lev1sec3.html"/>
+<entry name="GUIs, standard dialog boxes, sample application" url="ch05lev1sec3.html"/>
+<entry name="GUIs, standard dialog boxes" url="ch05lev1sec3.html"/>
+<entry name="GUIs, status limes" url="ch02lev1sec4.html"/>
+<entry name="GUIs, toolbars" url="ch02lev1sec4.html"/>
+<entry name="GUIs, UI compliance" url="ch05.html"/>
+<entry name="GUIs" url="ch07.html"/>
+<entry name="GUIs, widgets, attributes" url="ch04.html"/>
+<entry name="GUIs, widgets, child widgets" url="ch04lev1sec3.html"/>
+<entry name="GUIs, widgets, defined" url="ch04.html"/>
+<entry name="GUIs, widgets, dialog widgets" url="ch08.html"/>
+<entry name="GUIs, widgets, documentation" url="ch04.html"/>
+<entry name="GUIs, widgets, drawing commands, recording" url="ch04lev1sec2.html"/>
+<entry name="GUIs, widgets, event handlers" url="ch04.html"/>
+<entry name="GUIs, widgets, painting" url="ch04lev1sec2.html"/>
+<entry name="GUIs, widgets, sample class declaration" url="ch04.html"/>
+<entry name="GUIs, widgets, signals" url="ch04.html"/>
+<entry name="GUIs, widgets, slots" url="ch04.html"/>
+<entry name="GUIs, widgets" url="ch04.html"/>
+<entry name="GUIs, widgets, user input" url="ch04lev1sec4.html"/>
+<entry name="Hausmann, Simon" url="ch13lev1sec7.html"/>
+<entry name="header files, session management" url="ch06lev1sec2.html"/>
+<entry name="help action" url="ch06.html"/>
+<entry name="helpContents action" url="ch06.html"/>
+<entry name="Help menu commands" url="ch06.html"/>
+<entry name="helpMenu() function" url="ch05lev1sec2.html"/>
+<entry name="help, Tooltips" url="ch05lev1sec2.html"/>
+<entry name="help, ToolTips" url="ch05lev1sec2.html"/>
+<entry name="help" url="ch05lev1sec2.html"/>
+<entry name="Hemsley, Rik" url="ch13lev1sec7.html"/>
+<entry name="history of, DCOP (Desktop Communication Protocol)" url="ch13lev1sec2.html"/>
+<entry name="history of KDE/Qt licenses" url="ch19lev1sec4.html"/>
+<entry name="home action" url="ch06.html"/>
+<entry name="HTML files, rendering" url="ch10.html"/>
+<entry name="html resource type" url="ch07lev1sec4.html"/>
+<entry name="i18n() function, KDE Translator's and Documenter's Web site" url="ch06lev1sec4.html"/>
+<entry name="i18n() function, syntax" url="ch06lev1sec4.html"/>
+<entry name="i18n() function" url="ch06lev1sec4.html"/>
+<entry name="i18n() function" url="ch07lev1sec4.html"/>
+<entry name="ICE (Inter-Client Exchange) mechanism" url="ch13lev1sec3.html"/>
+<entry name="icon resource type" url="ch07lev1sec4.html"/>
+<entry name="icons, application, specifications" url="ch06lev1sec3.html"/>
+<entry name="icons, color depth" url="ch06lev1sec3.html"/>
+<entry name="icons, designing" url="ch06lev1sec3.html"/>
+<entry name="icons, names" url="ch06lev1sec3.html"/>
+<entry name="icons, PNG format" url="ch06lev1sec3.html"/>
+<entry name="icons, toolbar, specifications" url="ch06lev1sec3.html"/>
+<entry name="icons, type" url="ch06lev1sec3.html"/>
+<entry name="icons" url="ch06lev1sec3.html"/>
+<entry name="IDE (integrated development environment)" url="ch18.html"/>
+<entry name="IDL, attributes" url="ch14lev1sec3.html"/>
+<entry name="IDL, compiler, invoking" url="ch14lev1sec3.html"/>
+<entry name="IDL, data types" url="ch14lev1sec3.html"/>
+<entry name="IDL, #include statements" url="ch14lev1sec3.html"/>
+<entry name="IDL, (interface definition language)" url="ch14lev1sec3.html"/>
+<entry name="IDL, methods" url="ch14lev1sec3.html"/>
+<entry name="IDL, streams, defining" url="ch14lev1sec3.html"/>
+<entry name="IDL, structs" url="ch14lev1sec3.html"/>
+<entry name="IDL" url="ch14lev1sec3.html"/>
+<entry name="ImageIO" url="ch03lev1sec6.html"/>
+<entry name="images, image view/converter application (KImageView), kimageview.cpp class declaration" url="ch10lev1sec2.html"/>
+<entry name="images, image view/converter application (KImageView), kimageview.h class definition" url="ch10lev1sec2.html"/>
+<entry name="images, image view/converter application (KImageView), main() method" url="ch10lev1sec2.html"/>
+<entry name="images, image view/converter application (KImageView)" url="ch10lev1sec2.html"/>
+<entry name="images, QImage class" url="ch10lev1sec2.html"/>
+<entry name="images, QPixmap class" url="ch10lev1sec2.html"/>
+<entry name="images, suported formats" url="ch10lev1sec2.html"/>
+<entry name="image (" url="ch15.html"/>
+<entry name="#include statements" url="ch14lev1sec3.html"/>
+<entry name="information() function" url="ch05lev1sec3.html"/>
+<entry name="initializeGL() function (QGL widget)" url="ch03lev1sec6.html"/>
+<entry name="initializing, MCOP modules, attributes" url="ch14lev1sec3.html"/>
+<entry name="initializing, MCOP modules, C++ constructor" url="ch14lev1sec3.html"/>
+<entry name="initializing, MCOP modules, C++ destructor" url="ch14lev1sec3.html"/>
+<entry name="initializing, MCOP modules, streamEnd() function" url="ch14lev1sec3.html"/>
+<entry name="initializing, MCOP modules, streamInit() function" url="ch14lev1sec3.html"/>
+<entry name="initializing, MCOP modules, streamStart() function" url="ch14lev1sec3.html"/>
+<entry name="initializing, MCOP modules" url="ch14lev1sec3.html"/>
+<entry name="initial object references" url="ch14lev1sec3.html"/>
+<entry name="in/out element (IDL)" url="ch14lev1sec3.html"/>
+<entry name="input (user), widgets, KDisc widget example" url="ch04lev1sec4.html"/>
+<entry name="input (user), widgets, keystrokes" url="ch04lev1sec4.html"/>
+<entry name="input (user), widgets, mouse clicks" url="ch04lev1sec4.html"/>
+<entry name="input (user), widgets" url="ch04lev1sec4.html"/>
+<entry name="installing, KDE, binary packages" url="ch01lev1sec5.html"/>
+<entry name="installing, KDE, source packages" url="ch01lev1sec5.html"/>
+<entry name="installing, KDE" url="ch01lev1sec5.html"/>
+<entry name="installing, KDOC" url="ch15.html"/>
+<entry name="install target" url="ch16lev1sec2.html"/>
+<entry name="integrated development environment (IDE)" url="ch18.html"/>
+<entry name="Inter-Client Exchange (ICE) mechanism" url="ch13lev1sec3.html"/>
+<entry name="interface definition language" url="ch14lev1sec3.html"/>
+<entry name="Interface Hall of Shame Web site" url="ch06lev1sec9.html"/>
+<entry name="Interface Hall of Shame Web site" url="ch08lev1sec7.html"/>
+<entry name="interfaces, applications, user friendliness" url="ch06lev1sec9.html"/>
+<entry name="interfaces, KMedia2" url="ch14lev1sec4.html"/>
+<entry name="interfaces, SimpleSoundServer" url="ch14lev1sec4.html"/>
+<entry name="interfaces, StereoEffectStack" url="ch14lev1sec4.html"/>
+<entry name="interface" url="ch18.html"/>
+<entry name="internal (" url="ch15.html"/>
+<entry name="internationalization" url="ch06lev1sec4.html"/>
+<entry name="internationalization" url="ch07lev1sec4.html"/>
+<entry name="invoking, IDL compiler" url="ch14lev1sec3.html"/>
+<entry name="invoking, paint events" url="ch04lev1sec2.html"/>
+<entry name="isApplicationRegistered() method" url="ch13lev1sec6.html"/>
+<entry name="isRegistered() method" url="ch13lev1sec6.html"/>
+<entry name="ItemizedList tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="Jansen, Geert" url="ch13lev1sec2.html"/>
+<entry name="jobs, long jobs, optimizing performance of, application functions, enabling/disabling" url="ch09lev1sec3.html"/>
+<entry name="jobs, long jobs, optimizing performance of, processEvents() method" url="ch09lev1sec3.html"/>
+<entry name="jobs, long jobs, optimizing performance of, QTimer class" url="ch09lev1sec3.html"/>
+<entry name="jobs, long jobs, optimizing performance of, speed issues" url="ch09lev1sec3.html"/>
+<entry name="jobs, long jobs, optimizing performance of" url="ch09lev1sec3.html"/>
+<entry name="KabDemo application (address book dialog), kabdemo.cpp class definition" url="ch10lev1sec4.html"/>
+<entry name="KabDemo application (address book dialog), kabdemo.h class declaration" url="ch10lev1sec4.html"/>
+<entry name="KabDemo application (address book dialog), main() method" url="ch10lev1sec4.html"/>
+<entry name="KabDemo application (address book dialog)" url="ch10lev1sec4.html"/>
+<entry name="kabdemo.cpp class definiiton (KabDemo)" url="ch10lev1sec4.html"/>
+<entry name="kabdemo.h class declaration (KabDemo)" url="ch10lev1sec4.html"/>
+<entry name="KAction class" url="ch05.html"/>
+<entry name="KAction class" url="ch06.html"/>
+<entry name="KApplication class" url="ch02lev1sec3.html"/>
+<entry name="KAudioPlayer class" url="ch14lev1sec6.html"/>
+<entry name="KButtonBox manager widget" url="ch08lev1sec4.html"/>
+<entry name="kchildren.cpp class definition (KChildren widget)" url="ch04lev1sec3.html"/>
+<entry name="kchildren.h class declaration (KChildren widget)" url="ch04lev1sec3.html"/>
+<entry name="KChildren sample widget (child widget), kchildren.cpp class definition" url="ch04lev1sec3.html"/>
+<entry name="KChildren sample widget (child widget), kchildren.h class declaration" url="ch04lev1sec3.html"/>
+<entry name="KChildren sample widget (child widget), main() method" url="ch04lev1sec3.html"/>
+<entry name="KChildren sample widget (child widget)" url="ch04lev1sec3.html"/>
+<entry name="kconfigdemo.cpp file (KConfigDemo widget)" url="ch07lev1sec2.html"/>
+<entry name="kconfigdemo.h file (KConfigDemo widget)" url="ch07lev1sec2.html"/>
+<entry name="KConfigDemo widget, kconfigdemo.cpp class definition" url="ch07lev1sec2.html"/>
+<entry name="KConfigDemo widget, kconfigdemo.h class declaration" url="ch07lev1sec2.html"/>
+<entry name="KConfigDemo widget, main() function" url="ch07lev1sec2.html"/>
+<entry name="kcustomactions.cpp file (KCustomActions widget)" url="ch05.html"/>
+<entry name="kcustomactions.h file (KCustomActions widget)" url="ch05.html"/>
+<entry name="KCustomActions widget, kcustomactions.cpp class definition" url="ch05.html"/>
+<entry name="KCustomActions widget, kcustomactions.h class declaration" url="ch05.html"/>
+<entry name="KCustomActions widget, kcustomactions.h class definition" url="ch05.html"/>
+<entry name="KCustomActions widget, kcustomui.rcp class file" url="ch05.html"/>
+<entry name="KCustomActions widget, main() function" url="ch05.html"/>
+<entry name="KCustomActions widget, toolbars" url="ch05.html"/>
+<entry name="kcustomui.rc file (KCustomActions widget)" url="ch05.html"/>
+<entry name="kdcop (DCOP shell client)" url="ch13lev1sec7.html"/>
+<entry name="kdeadmin module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdeadmin package" url="ch01lev1sec5.html"/>
+<entry name="KDE, advantages" url="ch01.html"/>
+<entry name="KDE, advantages" url="ch01lev1sec2.html"/>
+<entry name="kdebase module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdebase package" url="ch01lev1sec5.html"/>
+<entry name="kdebindings module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kde-common module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kde-devel mailing list" url="ch01lev1sec3.html"/>
+<entry name="KDE Developers' Web site" url="ch01lev1sec2.html"/>
+<entry name="KDEDIR environment variable" url="ch02lev1sec2.html"/>
+<entry name="$KDEDIR/share/appstext.txt (KResourceDemo widget)" url="ch07lev1sec4.html"/>
+<entry name="KDE, distributions" url="ch01lev1sec2.html"/>
+<entry name="kdegames module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdegames package" url="ch01lev1sec5.html"/>
+<entry name="kdegraphics module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdegraphics package" url="ch01lev1sec5.html"/>
+<entry name="kdei18n package" url="ch01lev1sec5.html"/>
+<entry name="kde-il8n module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="KDE, installing, binary packages" url="ch01lev1sec5.html"/>
+<entry name="KDE, installing, source packages" url="ch01lev1sec5.html"/>
+<entry name="KDE, installing" url="ch01lev1sec5.html"/>
+<entry name="kdelibs module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdelibs package" url="ch01lev1sec5.html"/>
+<entry name="KDE, licenses" url="ch01lev1sec6.html"/>
+<entry name="KDE-MDI application template" url="ch18lev1sec2.html"/>
+<entry name="KDE Mini application template" url="ch18lev1sec2.html"/>
+<entry name="kdemultimedia module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdemultimedia package" url="ch01lev1sec5.html"/>
+<entry name="kdenetwork module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdenetwork package" url="ch01lev1sec5.html"/>
+<entry name="kdenonbeta module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="KDE Normal application template" url="ch18lev1sec2.html"/>
+<entry name="KDE, obtaining" url="ch01lev1sec5.html"/>
+<entry name="KDE, online resources" url="ch01lev1sec3.html"/>
+<entry name="KDE, (overview of)" url="ch01.html"/>
+<entry name="KDE, Qt toolkit" url="ch03.html"/>
+<entry name="kdesdk module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdesupport module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdesupport package" url="ch01lev1sec5.html"/>
+<entry name="KDE, system requirements" url="ch01lev1sec4.html"/>
+<entry name="kdetoys module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="KDE Translator's and Documenter's Web site" url="ch06lev1sec4.html"/>
+<entry name="kdeui (KDE user-interface library), dialog boxes" url="ch08lev1sec4.html"/>
+<entry name="kdeui (KDE user-interface library), manager widgets" url="ch08lev1sec4.html"/>
+<entry name="kdeui (KDE user-interface library" url="ch08lev1sec4.html"/>
+<entry name="KDE user-interface library" url="ch08lev1sec4.html"/>
+<entry name="kdeutils module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="kdeutils package" url="ch01lev1sec5.html"/>
+<entry name="KDevelop IDE, Classbrowser" url="ch18lev1sec4.html"/>
+<entry name="KDevelop IDE, Classparser" url="ch18lev1sec4.html"/>
+<entry name="KDevelop IDE, Dialog Editor, advantages" url="ch18.html"/>
+<entry name="KDevelop IDE, Dialog Editor" url="ch18.html"/>
+<entry name="KDevelop IDE, Dialog Editor, weaknesses" url="ch18.html"/>
+<entry name="KDevelop IDE, documentation, API documentation" url="ch18lev1sec3.html"/>
+<entry name="KDevelop IDE, documentation, Documentation-Browser" url="ch18lev1sec3.html"/>
+<entry name="KDevelop IDE, documentation, online handbooks" url="ch18lev1sec3.html"/>
+<entry name="KDevelop IDE, documentation, searching" url="ch18lev1sec3.html"/>
+<entry name="KDevelop IDE, documentation" url="ch18lev1sec3.html"/>
+<entry name="KDevelop IDE, File Viewers, LFV (Logical File Viewer)" url="ch18.html"/>
+<entry name="KDevelop IDE, File Viewers, LFV (Logical File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="KDevelop IDE, File Viewers, RFV (Real File Viewer)" url="ch18.html"/>
+<entry name="KDevelop IDE, File Viewers, RFV (Real File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="KDevelop IDE, File Viewers" url="ch18lev1sec5.html"/>
+<entry name="KDevelop IDE, gdb debugger, commands" url="ch18lev1sec6.html"/>
+<entry name="KDevelop IDE, gdb debugger, enabling debugging information" url="ch18lev1sec6.html"/>
+<entry name="KDevelop IDE, gdb debugger, options" url="ch18lev1sec6.html"/>
+<entry name="KDevelop IDE, gdb debugger, running" url="ch18lev1sec6.html"/>
+<entry name="KDevelop IDE, gdb debugger" url="ch18lev1sec6.html"/>
+<entry name="KDevelop IDE, KDE applications, creating, Application Wizard" url="ch18lev1sec2.html"/>
+<entry name="KDevelop IDE, KDE applications, creating, project editing" url="ch18lev1sec2.html"/>
+<entry name="KDevelop IDE, KDE applications, creating, templates" url="ch18lev1sec2.html"/>
+<entry name="KDevelop IDE, software development, documentation" url="ch18.html"/>
+<entry name="KDevelop IDE, software development, languages" url="ch18.html"/>
+<entry name="KDevelop IDE, software development, packages" url="ch18.html"/>
+<entry name="KDevelop IDE, software development, project management" url="ch18.html"/>
+<entry name="KDevelop IDE" url="ch18.html"/>
+<entry name="KDevelop IDE, versions, KDevelop 2.0" url="ch18.html"/>
+<entry name="KDevelop IDE, versions, KDevelop 2.0" url="ch18lev1sec7.html"/>
+<entry name="KDevelop IDE, versions" url="ch18.html"/>
+<entry name="KDevelop IDE, views, Output View" url="ch18.html"/>
+<entry name="KDevelop IDE, views, Tree View" url="ch18.html"/>
+<entry name="KDevelop IDE, working area" url="ch18.html"/>
+<entry name="kdevelop module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="KDE Web site" url="ch01lev1sec3.html"/>
+<entry name="kdgb debugger" url="ch02.html"/>
+<entry name="kdialogapp.cpp file (KDialogApp)" url="ch11.html"/>
+<entry name="KDialogApp (dialog-based application), kdialogapp.cpp class definition" url="ch11.html"/>
+<entry name="KDialogApp (dialog-based application), kdialogapp.h class definition" url="ch11.html"/>
+<entry name="KDialogApp (dialog-based application), main() method" url="ch11.html"/>
+<entry name="KDialogApp, (dialog-based application)" url="ch11.html"/>
+<entry name="kdialogapp.h file (KDialogApp)" url="ch11.html"/>
+<entry name="KDialogApp, kdialogapp.cpp class declaration" url="ch11.html"/>
+<entry name="KDialogApp, kdialogapp.h class definition" url="ch11.html"/>
+<entry name="KDialogApp, main() method" url="ch11.html"/>
+<entry name="KDialogBase class" url="ch08lev1sec5.html"/>
+<entry name="KDialogBase manager widget" url="ch08lev1sec4.html"/>
+<entry name="KDialog manager widget" url="ch08lev1sec4.html"/>
+<entry name="KDisc widget (user input example), kdisc.cpp class definition" url="ch04lev1sec4.html"/>
+<entry name="KDisc widget (user input example), kdisc.h class declaration" url="ch04lev1sec4.html"/>
+<entry name="KDisc widget (user input example), main() method" url="ch04lev1sec4.html"/>
+<entry name="KDOC, class documentation" url="ch15.html"/>
+<entry name="KDOC, comments" url="ch15.html"/>
+<entry name="KDOC, downloading" url="ch15.html"/>
+<entry name="KDOC, installing" url="ch15.html"/>
+<entry name="KDOC, library documentation" url="ch15.html"/>
+<entry name="KDOC, method documentation" url="ch15.html"/>
+<entry name="kdocsample.h file" url="ch15.html"/>
+<entry name="kdragdemo.cpp file (KDragDemo widget)" url="ch07.html"/>
+<entry name="kdragdemo.h file (KDragDemo widget)" url="ch07.html"/>
+<entry name="KDragDemo widget, kdragdemo.cpp class declaration" url="ch07.html"/>
+<entry name="KDragDemo widget, kdragdemo.h class definition" url="ch07.html"/>
+<entry name="KDragDemo widget, main() function" url="ch07.html"/>
+<entry name="kdropdemo.cpp file (KDropDemo widget)" url="ch07.html"/>
+<entry name="kdropdemo.h file (KDropDemo widget)" url="ch07.html"/>
+<entry name="KDropDemo widget, kdropdemo.cpp class declaration" url="ch07.html"/>
+<entry name="KDropDemo widget, kdropdemo.h class definition" url="ch07.html"/>
+<entry name="KDropDemo widget, main() function" url="ch07.html"/>
+<entry name="KDropDemo widget" url="ch07.html"/>
+<entry name="KEdit, Option dialog box" url="ch08lev1sec6.html"/>
+<entry name="KEdit, session management code" url="ch06lev1sec2.html"/>
+<entry name="keyBindings action" url="ch06.html"/>
+<entry name="KeyCap tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="KeyCombo tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="keyPressEvent() event handler, widgets" url="ch04.html"/>
+<entry name="keyReleaseEvent() event handler, widgets" url="ch04.html"/>
+<entry name="keystrokes, handling, widgets" url="ch04lev1sec4.html"/>
+<entry name="KeyWordSet tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="keywords, moc" url="ch03lev1sec4.html"/>
+<entry name="Keyword tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="KFileDialog" url="ch05lev1sec3.html"/>
+<entry name="KFontDialog" url="ch05lev1sec3.html"/>
+<entry name="kfte editor" url="ch02.html"/>
+<entry name="kfte module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="khello program, compiling" url="ch02lev1sec2.html"/>
+<entry name="khelpers.cpp file (KHelpers widget)" url="ch05lev1sec2.html"/>
+<entry name="khelpers.h file (KHelpers widget)" url="ch05lev1sec2.html"/>
+<entry name="KHelpers widget, khelpers.cpp class definition" url="ch05lev1sec2.html"/>
+<entry name="KHelpers widget, khelpers.h class declaration" url="ch05lev1sec2.html"/>
+<entry name="KHelpers widget, main() function" url="ch05lev1sec2.html"/>
+<entry name="KHTMLWidget" url="ch10.html"/>
+<entry name="kimageview.cpp class declaration (KImageView widget)" url="ch10lev1sec2.html"/>
+<entry name="kimageview.h class definition (KImageView widget)" url="ch10lev1sec2.html"/>
+<entry name="KImageView widget (image viewer/converter), kimageview.cpp class declaration" url="ch10lev1sec2.html"/>
+<entry name="KImageView widget (image viewer/converter), kimageview.h class definition" url="ch10lev1sec2.html"/>
+<entry name="KImageView widget (image viewer/converter), main() method" url="ch10lev1sec2.html"/>
+<entry name="KImageView widget (image viewer/converter)" url="ch10lev1sec2.html"/>
+<entry name="kimgioRegister() function" url="ch07lev1sec4.html"/>
+<entry name="KIPC" url="ch13lev1sec2.html"/>
+<entry name="KJanusWidget manager widget" url="ch08lev1sec4.html"/>
+<entry name="klongjob.h class declaration (KLongJob widget), original version" url="ch09lev1sec3.html"/>
+<entry name="KLongJob widget (long job example), klongjob.h class declaration (original version)" url="ch09lev1sec3.html"/>
+<entry name="KLongJob widget (long job example), main() method" url="ch09lev1sec3.html"/>
+<entry name="klyx module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="KMedia2 interface" url="ch14lev1sec4.html"/>
+<entry name="KMessageBox" url="ch05lev1sec3.html"/>
+<entry name="kmusic module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="KNotify API" url="ch14lev1sec6.html"/>
+<entry name="KNotify class" url="ch13lev1sec7.html"/>
+<entry name="KNotifyClient class" url="ch06lev1sec6.html"/>
+<entry name="koffice module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="Konqueror, content area" url="ch05.html"/>
+<entry name="Konqueror status bar" url="ch05.html"/>
+<entry name="Konqueror" url="ch01lev1sec2.html"/>
+<entry name="KOrganizer, content area" url="ch05.html"/>
+<entry name="korganizer module (CVS)" url="ch17lev1sec2.html"/>
+<entry name="KParts, compared to widgets" url="ch12.html"/>
+<entry name="KParts, embedded, DCOP (Desktop Communication Protocol)" url="ch13lev1sec6.html"/>
+<entry name="KParts, embedding, mainwindow GUI" url="ch12lev1sec7.html"/>
+<entry name="KParts, embedding, mainwindow header" url="ch12lev1sec7.html"/>
+<entry name="KParts, embedding, mainwindow implementation" url="ch12lev1sec7.html"/>
+<entry name="KParts, embedding, multiple parts" url="ch12lev1sec8.html"/>
+<entry name="KParts, embedding" url="ch12lev1sec7.html"/>
+<entry name="KParts, framework" url="ch12lev1sec2.html"/>
+<entry name="KParts, including in shared libraries, factory headers" url="ch12lev1sec6.html"/>
+<entry name="KParts, including in shared libraries, factory implementation" url="ch12lev1sec6.html"/>
+<entry name="KParts, including in shared libraries, makefiles" url="ch12lev1sec6.html"/>
+<entry name="KParts, including in shared libraries" url="ch12lev1sec6.html"/>
+<entry name="KParts, NotepadPart example, constructor" url="ch12lev1sec5.html"/>
+<entry name="KParts, NotepadPart example, Makefile.am" url="ch12lev1sec6.html"/>
+<entry name="KParts, NotepadPart example, notepad_factory.cpp implementatio" url="ch12lev1sec6.html"/>
+<entry name="KParts, NotepadPart example, notepad_factory.h header" url="ch12lev1sec6.html"/>
+<entry name="KParts, NotepadPart example, notepad_part.h header" url="ch12lev1sec5.html"/>
+<entry name="KParts, NotepadPart example, openFile() function" url="ch12lev1sec5.html"/>
+<entry name="KParts, NotepadPart example, saveFile() function" url="ch12lev1sec5.html"/>
+<entry name="KParts, NotepadPart example, setReadWrite() function" url="ch12lev1sec5.html"/>
+<entry name="KParts, NotepadPart example" url="ch12lev1sec5.html"/>
+<entry name="KParts, PartManager" url="ch12lev1sec8.html"/>
+<entry name="KParts, plug-ins" url="ch12lev1sec9.html"/>
+<entry name="KParts, read-only parts" url="ch12lev1sec4.html"/>
+<entry name="KParts, read/write parts" url="ch12lev1sec4.html"/>
+<entry name="KParts" url="ch01lev1sec2.html"/>
+<entry name="KParts" url="ch12.html"/>
+<entry name="KParts, XML files" url="ch12lev1sec3.html"/>
+<entry name="kposquare.cpp class declaration (KXOSquare widget)" url="ch04lev1sec2.html"/>
+<entry name="kquickdraw.cpp class definition (KQuickDraw widget)" url="ch09lev1sec2.html"/>
+<entry name="kquickdraw.h class declaration (KQuickDraw widget)" url="ch09lev1sec2.html"/>
+<entry name="KQuickDraw widget, kquickdraw.cpp class definition" url="ch09lev1sec2.html"/>
+<entry name="KQuickDraw widget, kquickdraw.h class declaration" url="ch09lev1sec2.html"/>
+<entry name="KQuickDraw widget, main() method" url="ch09lev1sec2.html"/>
+<entry name="kremotedemo.cpp file (KRemoteDemo widget)" url="ch07lev1sec5.html"/>
+<entry name="kremotedemo.h file (KRemoteDemo widget)" url="ch07lev1sec5.html"/>
+<entry name="KRemoteDemo widget, kremotedemo.cpp class definition" url="ch07lev1sec5.html"/>
+<entry name="KRemoteDemo widget, kremotedemo.h class declaration" url="ch07lev1sec5.html"/>
+<entry name="KRemoteDemo widget, main() function" url="ch07lev1sec5.html"/>
+<entry name="kresourcedemo.cpp file (KResourceDemo widget)" url="ch07lev1sec4.html"/>
+<entry name="kresourcedemo.h file (KResourceDemo widget)" url="ch07lev1sec4.html"/>
+<entry name="KResourceDemo widget, $KDEDIR/share/appstext.txt contents" url="ch07lev1sec4.html"/>
+<entry name="KResourceDemo widget, kresourcedemo.cpp class definition" url="ch07lev1sec4.html"/>
+<entry name="KResourceDemo widget, kresourcedemo.h class declaration" url="ch07lev1sec4.html"/>
+<entry name="KResourceDemo widget, kresource.po translation template file" url="ch07lev1sec4.html"/>
+<entry name="kresource.po file (KResourceDemo widget)" url="ch07lev1sec4.html"/>
+<entry name="KRun class, opening files" url="ch06lev1sec7.html"/>
+<entry name="KRun class, running applications" url="ch06lev1sec7.html"/>
+<entry name="ksaveacross.cpp file (KSaveAcross widget)" url="ch07lev1sec3.html"/>
+<entry name="ksaveacross.h file (KSaveAcross widget)" url="ch07lev1sec3.html"/>
+<entry name="KSaveAcross widget, ksaveacross.cpp class definition" url="ch07lev1sec3.html"/>
+<entry name="KSaveAcross widget, ksaveacross.h class declaration" url="ch07lev1sec3.html"/>
+<entry name="KSaveAcross widget, main() function" url="ch07lev1sec3.html"/>
+<entry name="ksimpleapp-1.0.lsm listing" url="ch16lev1sec3.html"/>
+<entry name="ksimpleapp.cpp class definition (KSimpleApp program)" url="ch02lev1sec4.html"/>
+<entry name="ksimpleapp.docbook listing" url="ch15lev1sec2.html"/>
+<entry name="ksimpleapp.h class declaration (KSimpleApp program)" url="ch02lev1sec3.html"/>
+<entry name="KSimpleApp program, ksimpleapp.cpp class definition" url="ch02lev1sec4.html"/>
+<entry name="KSimpleApp program, ksimpleapp.h class declaration" url="ch02lev1sec3.html"/>
+<entry name="KSimpleApp program, main() method" url="ch02lev1sec3.html"/>
+<entry name="KSimpleApp program, menubar" url="ch02lev1sec4.html"/>
+<entry name="KSimpleApp program, status line" url="ch02lev1sec4.html"/>
+<entry name="KSimpleApp program, toolbar" url="ch02lev1sec4.html"/>
+<entry name="KSimpleBrowser application, ksimplebrowser.cpp class definition" url="ch10.html"/>
+<entry name="KSimpleBrowser application, ksimplebrowser.h class declaration" url="ch10.html"/>
+<entry name="KSimpleBrowser application, main() method" url="ch10.html"/>
+<entry name="ksimplebrowser.cpp class definition (simple browser application)" url="ch10.html"/>
+<entry name="ksimplebrowser.h class declaration (simple browser application)" url="ch10.html"/>
+<entry name="KSpellConfig configuration dialog box" url="ch10lev1sec3.html"/>
+<entry name="kspelldemo.cpp class declaration (KSpellDemo)" url="ch10lev1sec3.html"/>
+<entry name="kspelldemo.h class definition (KSpellDemo)" url="ch10lev1sec3.html"/>
+<entry name="KSpellDemo (spell-checking application), kspelldemo.cpp class declaration" url="ch10lev1sec3.html"/>
+<entry name="KSpellDemo (spell-checking application), kspelldemo.h class definition" url="ch10lev1sec3.html"/>
+<entry name="KSpellDemo (spell-checking application), main() method" url="ch10lev1sec3.html"/>
+<entry name="KSpell (spell-checking), configuring" url="ch10lev1sec3.html"/>
+<entry name="KSpell (spell-checking), methods" url="ch10lev1sec3.html"/>
+<entry name="KSpell (spell-checking), modal spell-checking" url="ch10lev1sec3.html"/>
+<entry name="KSpell (spell-checking), sample application" url="ch10lev1sec3.html"/>
+<entry name="KSpell (spell-checking)" url="ch10lev1sec3.html"/>
+<entry name="kstatusbardemo.cpp file, KStatusBarDemo widget" url="ch05.html"/>
+<entry name="kstatusbardemo.h file, KStatusBarDemo widget" url="ch05.html"/>
+<entry name="KStatusBarDemo widget, kstatusbardemo.cpp class definition" url="ch05.html"/>
+<entry name="KStatusBarDemo widget, kstatusbardemo.h class declaration" url="ch05.html"/>
+<entry name="KStatusBarDemo widget, main() function" url="ch05.html"/>
+<entry name="KStdAction class" url="ch05.html"/>
+<entry name="kstdactionsdemo.cpp file (KStdActionsDemo widget)" url="ch05.html"/>
+<entry name="kstdactionsdemo.h file (KStdActionsDemo widget)" url="ch05.html"/>
+<entry name="KStdActionsDemo widget, kstdactionsdemo.cpp class declaration" url="ch05.html"/>
+<entry name="KStdActionsDemo widget, kstdactionsdemo.h class definition" url="ch05.html"/>
+<entry name="KStdActionsDemo widget, ,main() function" url="ch05.html"/>
+<entry name="KStdActionsDemo widget" url="ch05.html"/>
+<entry name="ktictactoe.cpp class definition (KTicTacToe widget)" url="ch04lev1sec3.html"/>
+<entry name="ktictactoe.h class declaration (KTicTacToe widget)" url="ch04lev1sec3.html"/>
+<entry name="KTicTacToe widget (geometry management example), ktictactoe.cpp class definition" url="ch04lev1sec3.html"/>
+<entry name="KTicTacToe widget (geometry management example), ktictactoe.h class declaration" url="ch04lev1sec3.html"/>
+<entry name="KTicTacToe widget (geometry management example), playing the game" url="ch04lev1sec3.html"/>
+<entry name="KTMainWindow class" url="ch02lev1sec3.html"/>
+<entry name="Kulow, Stephen" url="ch16.html"/>
+<entry name="KUniqueApplication class, passing command-line parameters" url="ch13lev1sec7.html"/>
+<entry name="KUniqueApplication class, startup" url="ch13lev1sec7.html"/>
+<entry name="KUniqueApplication class" url="ch13lev1sec7.html"/>
+<entry name="KUniqueApplication, kunique.cpp call definition" url="ch11lev1sec2.html"/>
+<entry name="KUniqueApplication, kunique.h class definition" url="ch11lev1sec2.html"/>
+<entry name="KUniqueApplication, main() method" url="ch11lev1sec2.html"/>
+<entry name="kunique.cpp file" url="ch11lev1sec2.html"/>
+<entry name="kunique.h class definition" url="ch11lev1sec2.html"/>
+<entry name="KWeather applet, kweather.cpp class definition" url="ch11lev1sec3.html"/>
+<entry name="KWeather applet, kweather.h class definition" url="ch11lev1sec3.html"/>
+<entry name="KWeather applet, main() method" url="ch11lev1sec3.html"/>
+<entry name="KWeather applet" url="ch11lev1sec3.html"/>
+<entry name="kweather.cpp file" url="ch11lev1sec3.html"/>
+<entry name="kweather.h file" url="ch11lev1sec3.html"/>
+<entry name="KWrite, content area" url="ch05.html"/>
+<entry name="kwrite editor" url="ch02.html"/>
+<entry name="KWrite status bar" url="ch05.html"/>
+<entry name="KXMLRPC interface" url="ch13lev1sec7.html"/>
+<entry name="KXOSquare widget (painting example), code analysis" url="ch04lev1sec2.html"/>
+<entry name="KXOSquare widget (painting example), kxosquare.cpp class declaration" url="ch04lev1sec2.html"/>
+<entry name="KXOSquare widget (painting example), kxosquare.cpp class definition" url="ch04lev1sec2.html"/>
+<entry name="KXOSquare widget (painting example), main() method" url="ch04lev1sec2.html"/>
+<entry name="KXOSquare widget (painting example)" url="ch04lev1sec2.html"/>
+<entry name="languages, i18n() function, KDE Translator's and Documenter's Web site" url="ch06lev1sec4.html"/>
+<entry name="languages, i18n() function, syntax" url="ch06lev1sec4.html"/>
+<entry name="languages, i18n() function" url="ch06lev1sec4.html"/>
+<entry name="languages, translator files" url="ch06lev1sec4.html"/>
+<entry name="lastPage action" url="ch06.html"/>
+<entry name="layout, dialog boxes, CGotoDialog example" url="ch08lev1sec2.html"/>
+<entry name="layout, dialog boxes, design guidelines" url="ch08lev1sec7.html"/>
+<entry name="layout, dialog boxes, design issues" url="ch08lev1sec2.html"/>
+<entry name="layout, dialog boxes, hierarchies of layouts" url="ch08lev1sec2.html"/>
+<entry name="layout, dialog boxes, manual placement" url="ch08lev1sec2.html"/>
+<entry name="layout, dialog boxes, nested layouts" url="ch08lev1sec2.html"/>
+<entry name="layout, dialog boxes, QLayout classes" url="ch08lev1sec2.html"/>
+<entry name="layout, dialog boxes, QVBox/QHBox widgets" url="ch08lev1sec2.html"/>
+<entry name="layout managers, creating internally, QVBox/QHBox widgets" url="ch08lev1sec2.html"/>
+<entry name="leaveEvent() event handler, widgets" url="ch04.html"/>
+<entry name="legal issues" url="ch01lev1sec6.html"/>
+<entry name="legal issues" url="ch19.html"/>
+<entry name="LFV (Logical File Viewer)" url="ch18.html"/>
+<entry name="LFV (Logical File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="LGPL (Library GNU Public License)" url="ch19lev1sec2.html"/>
+<entry name="libdoc (" url="ch15.html"/>
+<entry name="libkimgic library, supported image formats" url="ch10lev1sec2.html"/>
+<entry name="LibKMid" url="ch14lev1sec6.html"/>
+<entry name="libraries, documentation" url="ch15.html"/>
+<entry name="libraries, kdeui (KDE user-interface library), dialog boxes" url="ch08lev1sec4.html"/>
+<entry name="libraries, kdeui (KDE user-interface library), manager widgets" url="ch08lev1sec4.html"/>
+<entry name="libraries, kdeui (KDE user-interface library)" url="ch08lev1sec4.html"/>
+<entry name="libraries, libkimgic, supported image formats" url="ch10lev1sec2.html"/>
+<entry name="libraries, Mesa" url="ch03lev1sec6.html"/>
+<entry name="libraries, OpenGL" url="ch03lev1sec6.html"/>
+<entry name="libraries, parts, including, factory headers" url="ch12lev1sec6.html"/>
+<entry name="libraries, parts, including, factory implementation" url="ch12lev1sec6.html"/>
+<entry name="libraries, parts, including, makefiles" url="ch12lev1sec6.html"/>
+<entry name="libraries, parts, including" url="ch12lev1sec6.html"/>
+<entry name="libraries, Qt, supported image formats" url="ch10lev1sec2.html"/>
+<entry name="libraries, shared libraries, creating" url="ch16lev1sec2.html"/>
+<entry name="libraries" url="ch01lev1sec2.html"/>
+<entry name="Library GNU Public License (LGPL)" url="ch19lev1sec2.html"/>
+<entry name="lib resource type" url="ch07lev1sec4.html"/>
+<entry name="licenses, FreeQt" url="ch19lev1sec3.html"/>
+<entry name="licenses, GPL (GNU Public License)" url="ch19lev1sec2.html"/>
+<entry name="licenses, history of" url="ch19lev1sec4.html"/>
+<entry name="licenses, importance to projects" url="ch19.html"/>
+<entry name="licenses, LGPL (Library GNU Public License)" url="ch19lev1sec2.html"/>
+<entry name="licenses, online resources" url="ch19lev1sec5.html"/>
+<entry name="licenses, QPL (Q Public License)" url="ch19lev1sec3.html"/>
+<entry name="licenses" url="ch01lev1sec6.html"/>
+<entry name="licenses" url="ch19.html"/>
+<entry name="lines, drawing" url="ch04lev1sec2.html"/>
+<entry name="listing, CVS (Concurrent Version System) modules" url="ch17lev1sec5.html"/>
+<entry name="listings, application configuration file example" url="ch07lev1sec2.html"/>
+<entry name="listings, connecting slots to signals" url="ch03lev1sec3.html"/>
+<entry name="listings, DCOP, client using stub interface" url="ch13lev1sec5.html"/>
+<entry name="listings, DCOP, DCOPClient call() method" url="ch13lev1sec5.html"/>
+<entry name="listings, DCOP, DCOPClient send() method" url="ch13lev1sec5.html"/>
+<entry name="listings, DCOP, DCOPClient send() method with QString data" url="ch13lev1sec5.html"/>
+<entry name="listings, DCOP, dcopidl" url="ch13lev1sec5.html"/>
+<entry name="listings, DCOP, DCOPRef usage" url="ch13lev1sec6.html"/>
+<entry name="listings, DCOP, DCOP within KPart" url="ch13lev1sec6.html"/>
+<entry name="listings, DCOP, DCOP within KPart" url="ch13lev1sec7.html"/>
+<entry name="listings, DCOP, handmade stub file" url="ch13lev1sec5.html"/>
+<entry name="listings, DCOP, makefile rules" url="ch13lev1sec5.html"/>
+<entry name="listings, DCOP, object that implements DCOP processing" url="ch13lev1sec5.html"/>
+<entry name="listings, DCOP, processing with transactions" url="ch13lev1sec5.html"/>
+<entry name="listings, DCOP, typical application that uses DCOP" url="ch13lev1sec5.html"/>
+<entry name="listings, dcop" url="ch13lev1sec7.html"/>
+<entry name="listings, dialog boxes, CGotoDialog class example" url="ch08lev1sec2.html"/>
+<entry name="listings, dialog boxes, dialog from kdeui library" url="ch08lev1sec4.html"/>
+<entry name="listings, dialog boxes, KButtonBox in a dialog" url="ch08lev1sec4.html"/>
+<entry name="listings, dialog boxes, KEdit dialog code" url="ch08lev1sec6.html"/>
+<entry name="listings, dialog boxes, manual geometry strategy and QLayouts classes" url="ch08lev1sec2.html"/>
+<entry name="listings, dialog boxes, modal dialog allocated from the heap" url="ch08lev1sec3.html"/>
+<entry name="listings, dialog boxes, modal dialog located on the stack" url="ch08lev1sec3.html"/>
+<entry name="listings, dialog boxes, modeless dialog example" url="ch08lev1sec3.html"/>
+<entry name="listings, dialog boxes, modeless dialogs, removing from memory" url="ch08lev1sec3.html"/>
+<entry name="listings, dialog boxes, QVBox widget for geometry management" url="ch08lev1sec2.html"/>
+<entry name="listings, dialog boxes, SelectDialog class" url="ch08.html"/>
+<entry name="listings, Example_ADD interface" url="ch14lev1sec2.html"/>
+<entry name="listings, Example_ADD module" url="ch14lev1sec2.html"/>
+<entry name="listings, GhostViewTest, ghostviewtest.cpp" url="ch12lev1sec7.html"/>
+<entry name="listings, GhostViewTest, ghostviewtest.h" url="ch12lev1sec7.html"/>
+<entry name="listings, GhostViewTest, ghostviewtest_shell.rc" url="ch12lev1sec7.html"/>
+<entry name="listings, ImageIO sample program" url="ch03lev1sec6.html"/>
+<entry name="listings, KabDemo application (address book dialog), kabdemo.cpp class definition" url="ch10lev1sec4.html"/>
+<entry name="listings, KabDemo application (address book dialog), kabdemo.h class declaration" url="ch10lev1sec4.html"/>
+<entry name="listings, KabDemo application (address book dialog), main() method" url="ch10lev1sec4.html"/>
+<entry name="listings, KChildren widget, kchildren.cpp class definition" url="ch04lev1sec3.html"/>
+<entry name="listings, KChildren widget, kchildren.h class declaration" url="ch04lev1sec3.html"/>
+<entry name="listings, KChildren widget, main() method" url="ch04lev1sec3.html"/>
+<entry name="listings, KConfigDemo widget, kconfigdemo.cpp class definition" url="ch07lev1sec2.html"/>
+<entry name="listings, KConfigDemo widget, kconfigdemo.h class declaration" url="ch07lev1sec2.html"/>
+<entry name="listings, KConfigDemo widget, main() function" url="ch07lev1sec2.html"/>
+<entry name="listings, KCustomActions widget, kcustomactions.cpp class definition" url="ch05.html"/>
+<entry name="listings, KCustomActions widget, kcustomactions.h class declaration" url="ch05.html"/>
+<entry name="listings, KCustomActions widget, kcustomactions.h class definition" url="ch05.html"/>
+<entry name="listings, KCustomActions widget, kcustomui.rc file" url="ch05.html"/>
+<entry name="listings, KCustomActions widget, main() function" url="ch05.html"/>
+<entry name="listings, KDisc widget, ktictactoe.cpp class definition" url="ch04lev1sec4.html"/>
+<entry name="listings, KDisc widget, ktictactoe.h class declaration" url="ch04lev1sec4.html"/>
+<entry name="listings, KDisc widget, main() method" url="ch04lev1sec4.html"/>
+<entry name="listings, kdocsample.h" url="ch15.html"/>
+<entry name="listings, KDragDemo widget, kdragdemo.cpp class declaration" url="ch07.html"/>
+<entry name="listings, KDragDemo widget, kdragdemo.h class definition" url="ch07.html"/>
+<entry name="listings, KDragDemo widget, main() function" url="ch07.html"/>
+<entry name="listings, KDropDemo widget, kdropdemo.cpp" url="ch07.html"/>
+<entry name="listings, KDropDemo widget, kdropdemo.h" url="ch07.html"/>
+<entry name="listings, KDropDemo widget, main() function" url="ch07.html"/>
+<entry name="listings, khello program" url="ch02lev1sec2.html"/>
+<entry name="listings, KHelpers widget, khelpers.cpp class definition" url="ch05lev1sec2.html"/>
+<entry name="listings, KHelpers widget, khelpers.h class declaration" url="ch05lev1sec2.html"/>
+<entry name="listings, KHelpers widget, main() function" url="ch05lev1sec2.html"/>
+<entry name="listings, KImageView, kimageview.cpp class declaration" url="ch10lev1sec2.html"/>
+<entry name="listings, KImageView, kimageview.h class definition" url="ch10lev1sec2.html"/>
+<entry name="listings, KImageView, main() method" url="ch10lev1sec2.html"/>
+<entry name="listings, KLongJob widget (long job example), klongjob.h class declaration (original version)" url="ch09lev1sec3.html"/>
+<entry name="listings, KLongJob widget (long job example), main() method" url="ch09lev1sec3.html"/>
+<entry name="listings, KPushButton class declaration" url="ch04.html"/>
+<entry name="listings, KQuickDraw widget, kquickdraw.cpp class definition" url="ch09lev1sec2.html"/>
+<entry name="listings, KQuickDraw widget, kquickdraw.h class declaration" url="ch09lev1sec2.html"/>
+<entry name="listings, KQuickDraw widget, main() method" url="ch09lev1sec2.html"/>
+<entry name="listings, KRemoteDemo widget, kremotedemo.cpp class definition" url="ch07lev1sec5.html"/>
+<entry name="listings, KRemoteDemo widget, kremotedemo.h class declaration" url="ch07lev1sec5.html"/>
+<entry name="listings, KRemoteDemo widget, main() function" url="ch07lev1sec5.html"/>
+<entry name="listings, KResourceDemo widget, $KDEDIR/share/appstext.txt contents" url="ch07lev1sec4.html"/>
+<entry name="listings, KResourceDemo widget, kresourcedemo.cpp class definition" url="ch07lev1sec4.html"/>
+<entry name="listings, KResourceDemo widget, kresourcedemo.h class declaration" url="ch07lev1sec4.html"/>
+<entry name="listings, KResourceDemo widget, kresource.po translation template file" url="ch07lev1sec4.html"/>
+<entry name="listings, KRun class, opening files examples" url="ch06lev1sec7.html"/>
+<entry name="listings, KSaveAcross widget, ksaveacross.cpp class definition" url="ch07lev1sec3.html"/>
+<entry name="listings, KSaveAcross widget, ksaveacross.h class declaration" url="ch07lev1sec3.html"/>
+<entry name="listings, KSaveAcross widget, main() function" url="ch07lev1sec3.html"/>
+<entry name="listings, ksimpleapp-1.0.lsm" url="ch16lev1sec3.html"/>
+<entry name="listings, ksimpleapp.docbook" url="ch15lev1sec2.html"/>
+<entry name="listings, KSimpleApp program, ksimpleapp.cpp class definition" url="ch02lev1sec4.html"/>
+<entry name="listings, KSimpleApp program, ksimpleapp.h class declaration" url="ch02lev1sec3.html"/>
+<entry name="listings, KSimpleApp program, main() method" url="ch02lev1sec3.html"/>
+<entry name="listings, KSimpleBrowser, ksimplebrowser.cpp class definition" url="ch10.html"/>
+<entry name="listings, KSimpleBrowser, ksimplebrowser.h class declaration" url="ch10.html"/>
+<entry name="listings, KSimpleBrowser, main() method" url="ch10.html"/>
+<entry name="listings, KSpellDemo (spell-checking application), kspelldemo.cpp class declaration" url="ch10lev1sec3.html"/>
+<entry name="listings, KSpellDemo (spell-checking application), kspelldemo.h class definition" url="ch10lev1sec3.html"/>
+<entry name="listings, KSpellDemo (spell-checking application), main() method" url="ch10lev1sec3.html"/>
+<entry name="listings, KStandardDialogs main.cpp" url="ch05lev1sec3.html"/>
+<entry name="listings, KStatusBarDemo widget, kstatusbardemo.cpp class definition" url="ch05.html"/>
+<entry name="listings, KStatusBarDemo widget, kstatusbardemo.h class declaration" url="ch05.html"/>
+<entry name="listings, KStatusBarDemo widget, main() function" url="ch05.html"/>
+<entry name="listings, KStdActionsDemo widget, kstdactionsdemo.cpp class declaration" url="ch05.html"/>
+<entry name="listings, KStdActionsDemo widget, kstdactionsdemo.h class definition" url="ch05.html"/>
+<entry name="listings, KStdActionsDemo widget, main() function" url="ch05.html"/>
+<entry name="listings, KTicTacToe widget, ktictactoe.cpp class definition" url="ch04lev1sec3.html"/>
+<entry name="listings, KTicTacToe widget, ktictactoe.h class declaration" url="ch04lev1sec3.html"/>
+<entry name="listings, KUniqueApplication, kunique.cpp call definition" url="ch11lev1sec2.html"/>
+<entry name="listings, KUniqueApplication, kunique.h call definition" url="ch11lev1sec2.html"/>
+<entry name="listings, KUniqueApplication, main.cpp" url="ch11lev1sec2.html"/>
+<entry name="listings, KUniqueApplication, passing command-line parameters" url="ch13lev1sec7.html"/>
+<entry name="listings, KUniqueApplication, starting" url="ch13lev1sec7.html"/>
+<entry name="listings, KWeather applet, kweather.cpp class definition" url="ch11lev1sec3.html"/>
+<entry name="listings, KWeather applet, kweather.h class definition" url="ch11lev1sec3.html"/>
+<entry name="listings, KWeather applet, main() method" url="ch11lev1sec3.html"/>
+<entry name="listings, KXOSquare widget, kxosquare.cpp class declaration" url="ch04lev1sec2.html"/>
+<entry name="listings, KXOSquare widget, kxosquare.cpp class definition" url="ch04lev1sec2.html"/>
+<entry name="listings, KXOSquare widget, main() method" url="ch04lev1sec2.html"/>
+<entry name="listings, Makefile.am" url="ch16lev1sec2.html"/>
+<entry name="listings, Makefiles, example of" url="ch02lev1sec2.html"/>
+<entry name="listings, moc example" url="ch03lev1sec4.html"/>
+<entry name="listings, MyWindow class implementation" url="ch03lev1sec4.html"/>
+<entry name="listings, network transparency, complete example" url="ch06lev1sec8.html"/>
+<entry name="listings, network transparency, filenames" url="ch06lev1sec8.html"/>
+<entry name="listings, NotepadPart part, Makefile.am" url="ch12lev1sec6.html"/>
+<entry name="listings, NotepadPart part, notepad_factory.cpp factory implementation" url="ch12lev1sec6.html"/>
+<entry name="listings, NotepadPart part, notepad_factory.h factory header" url="ch12lev1sec6.html"/>
+<entry name="listings, NotepadPart part, notepad_part.cpp part 1 constructor" url="ch12lev1sec5.html"/>
+<entry name="listings, NotepadPart part, notepad_part.cpp part 2" url="ch12lev1sec5.html"/>
+<entry name="listings, NotepadPart part, notepad_part.cpp part 3" url="ch12lev1sec5.html"/>
+<entry name="listings, NotepadPart part, notepad_part.cpp part 4" url="ch12lev1sec5.html"/>
+<entry name="listings, NotepadPart part, notepad_part.h header" url="ch12lev1sec5.html"/>
+<entry name="listings, NotepadPart part, notepad_part.rc XML description" url="ch12lev1sec5.html"/>
+<entry name="listings, OpenGL program example" url="ch03lev1sec6.html"/>
+<entry name="listings, QList class example" url="ch03lev1sec5.html"/>
+<entry name="listings, QPainter class example usage" url="ch03lev1sec2.html"/>
+<entry name="listings, QPushButton class example usage" url="ch03lev1sec2.html"/>
+<entry name="listings, QWidget class example" url="ch03lev1sec2.html"/>
+<entry name="listings, reading from device with QDataStream" url="ch13lev1sec3.html"/>
+<entry name="listings, session management code, header file example" url="ch06lev1sec2.html"/>
+<entry name="listings, session management code, KEdit" url="ch06lev1sec2.html"/>
+<entry name="listings, session management code, main source code example" url="ch06lev1sec2.html"/>
+<entry name="listings, session management code, source file example" url="ch06lev1sec2.html"/>
+<entry name="listings, static run() functions" url="ch06lev1sec7.html"/>
+<entry name="listings, StereoBalanceControl, running on server" url="ch14lev1sec5.html"/>
+<entry name="listings, stereo beep, playing" url="ch14.html"/>
+<entry name="listings, template classes" url="ch03lev1sec5.html"/>
+<entry name="listings, writing through QDataStream" url="ch13lev1sec3.html"/>
+<entry name="ListItem tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="li (" url="ch15.html"/>
+<entry name="locale resource type" url="ch07lev1sec4.html"/>
+<entry name="Logical File Viewer (LFV)" url="ch18.html"/>
+<entry name="Logical File Viewer (LFV)" url="ch18lev1sec5.html"/>
+<entry name="long jobs, optimizing performance of, application functions, enabling/disabling" url="ch09lev1sec3.html"/>
+<entry name="long jobs, optimizing performance of, processEvents() method" url="ch09lev1sec3.html"/>
+<entry name="long jobs, optimizing performance of, QTimer class" url="ch09lev1sec3.html"/>
+<entry name="long jobs, optimizing performance of, speed issues" url="ch09lev1sec3.html"/>
+<entry name="long jobs, optimizing performance of" url="ch09lev1sec3.html"/>
+<entry name="l option (cvs command)" url="ch17lev1sec5.html"/>
+<entry name="mail action" url="ch06.html"/>
+<entry name="mailing lists" url="ch01lev1sec3.html"/>
+<entry name="main.cpp file (KstaqndardDialogs)" url="ch05lev1sec3.html"/>
+<entry name="main() function, KConfigDemo widget" url="ch07lev1sec2.html"/>
+<entry name="main() function, KCustomActions widget" url="ch05.html"/>
+<entry name="main() function, KDragDemo widget" url="ch07.html"/>
+<entry name="main() function, KDropDemo widget" url="ch07.html"/>
+<entry name="main() function, KHelpers widget" url="ch05lev1sec2.html"/>
+<entry name="main() function, KRemoteDemo widget" url="ch07lev1sec5.html"/>
+<entry name="main() function, KSaveAcross widget" url="ch07lev1sec3.html"/>
+<entry name="main() function, KStatusBarDemo widget" url="ch05.html"/>
+<entry name="main() method, KabDemo" url="ch10lev1sec4.html"/>
+<entry name="main() method, KChildren widget" url="ch04lev1sec3.html"/>
+<entry name="main() method, KDisc" url="ch04lev1sec4.html"/>
+<entry name="main() method, KImageView widget" url="ch10lev1sec2.html"/>
+<entry name="main() method, KLongJob widget" url="ch09lev1sec3.html"/>
+<entry name="main() method, KQuickDraw" url="ch09lev1sec2.html"/>
+<entry name="main() method, KSimpleApp" url="ch02lev1sec3.html"/>
+<entry name="main() method, KSimpleBrowser" url="ch10.html"/>
+<entry name="main() method, KSpellDemo" url="ch10lev1sec3.html"/>
+<entry name="main() method, KUniqueApplication" url="ch11lev1sec2.html"/>
+<entry name="main() method, KWeather applet" url="ch11lev1sec3.html"/>
+<entry name="main() method, KXOSquare widget" url="ch04lev1sec2.html"/>
+<entry name="maintainer-clean target" url="ch16lev1sec2.html"/>
+<entry name="mainwindow class" url="ch12lev1sec2.html"/>
+<entry name="Makefile.am file (NotepadPart)" url="ch12lev1sec6.html"/>
+<entry name="Makefile.am file" url="ch16lev1sec2.html"/>
+<entry name="makefiles, DCOP (Desktop Communication Protocol)" url="ch13lev1sec5.html"/>
+<entry name="Makefiles, example of" url="ch02lev1sec2.html"/>
+<entry name="makefiles, targets" url="ch16lev1sec2.html"/>
+<entry name="Makefiles" url="ch02lev1sec2.html"/>
+<entry name="make targets" url="ch16lev1sec2.html"/>
+<entry name="make utility" url="ch02lev1sec2.html"/>
+<entry name="manager widgets (kdeui)" url="ch08lev1sec4.html"/>
+<entry name="managing, sessions, header file example" url="ch06lev1sec2.html"/>
+<entry name="managing, sessions, KEdit" url="ch06lev1sec2.html"/>
+<entry name="managing, sessions, main source code example" url="ch06lev1sec2.html"/>
+<entry name="managing, sessions, source file example" url="ch06lev1sec2.html"/>
+<entry name="managing, sessions" url="ch06lev1sec2.html"/>
+<entry name="managing, sessions" url="ch07lev1sec3.html"/>
+<entry name="manual geometry strategy (dialog boxes)" url="ch08lev1sec2.html"/>
+<entry name="mcopclass files" url="ch14lev1sec2.html"/>
+<entry name="MCOP, future of, composition/RAD" url="ch14lev1sec7.html"/>
+<entry name="MCOP, future of, GUIs" url="ch14lev1sec7.html"/>
+<entry name="MCOP, future of, media types" url="ch14lev1sec7.html"/>
+<entry name="MCOP, future of, scripting" url="ch14lev1sec7.html"/>
+<entry name="MCOP, future of" url="ch14lev1sec7.html"/>
+<entry name="MCOP, IDL compiler, invoking" url="ch14lev1sec3.html"/>
+<entry name="MCOP, IDL syntax, attributes" url="ch14lev1sec3.html"/>
+<entry name="MCOP, IDL syntax, data types" url="ch14lev1sec3.html"/>
+<entry name="MCOP, IDL syntax, #include statements" url="ch14lev1sec3.html"/>
+<entry name="MCOP, IDL syntax, methods" url="ch14lev1sec3.html"/>
+<entry name="MCOP, IDL syntax, stream definitions" url="ch14lev1sec3.html"/>
+<entry name="MCOP, IDL syntax, structs" url="ch14lev1sec3.html"/>
+<entry name="MCOP, IDL syntax" url="ch14lev1sec3.html"/>
+<entry name="mcopidl" url="ch14lev1sec2.html"/>
+<entry name="MCOP, initial object references" url="ch14lev1sec3.html"/>
+<entry name="MCOP, interfaces, KMedia2" url="ch14lev1sec4.html"/>
+<entry name="MCOP, interfaces, SimpleSoundServer" url="ch14lev1sec4.html"/>
+<entry name="MCOP, interfaces, StereoEffectStack" url="ch14lev1sec4.html"/>
+<entry name="MCOP, module initialization, attributes" url="ch14lev1sec3.html"/>
+<entry name="MCOP, module initialization, C++ constructor" url="ch14lev1sec3.html"/>
+<entry name="MCOP, module initialization, C++ destructor" url="ch14lev1sec3.html"/>
+<entry name="MCOP, module initialization, streamEnd() function" url="ch14lev1sec3.html"/>
+<entry name="MCOP, module initialization, streamInit() function" url="ch14lev1sec3.html"/>
+<entry name="MCOP, module initialization, streamStart() function" url="ch14lev1sec3.html"/>
+<entry name="MCOP, module initialization" url="ch14lev1sec3.html"/>
+<entry name="MCOP, modules, writing, Example_ADD module" url="ch14lev1sec2.html"/>
+<entry name="MCOP, modules, writing, interface definitions" url="ch14lev1sec2.html"/>
+<entry name="MCOP, modules, writing, interface implementation" url="ch14lev1sec2.html"/>
+<entry name="MCOP, modules, writing, .mcopclass files" url="ch14lev1sec2.html"/>
+<entry name="MCOP, modules, writing, mcopidl" url="ch14lev1sec2.html"/>
+<entry name="MCOP, modules, writing, REGISTER_IMPLEMENTATION" url="ch14lev1sec2.html"/>
+<entry name="MCOP, modules, writing" url="ch14lev1sec2.html"/>
+<entry name="MCOP, object connections" url="ch14lev1sec3.html"/>
+<entry name="MCOP, reference counting" url="ch14lev1sec3.html"/>
+<entry name="MCOP, StereoBalanceControl sample program, balance() function" url="ch14lev1sec5.html"/>
+<entry name="MCOP, StereoBalanceControl sample program, IDL (interface definition language)" url="ch14lev1sec5.html"/>
+<entry name="MCOP, StereoBalanceControl sample program, makefile" url="ch14lev1sec5.html"/>
+<entry name="MCOP, StereoBalanceControl sample program, running on server" url="ch14lev1sec5.html"/>
+<entry name="MCOP, StereoBalanceControl sample program" url="ch14lev1sec5.html"/>
+<entry name="MCOP, stream access" url="ch14lev1sec3.html"/>
+<entry name="MCOP, synchronous versus asynchronous streams" url="ch14lev1sec3.html"/>
+<entry name="MCOP" url="ch14lev1sec3.html"/>
+<entry name="memory, modeless dialog boxes, removing from" url="ch08lev1sec3.html"/>
+<entry name="menubars, creating" url="ch02lev1sec4.html"/>
+<entry name="menubars" url="ch05.html"/>
+<entry name="MenuBar tag (XML)" url="ch05.html"/>
+<entry name="Menu tag (XML)" url="ch05.html"/>
+<entry name="Merge tag (XML)" url="ch12lev1sec3.html"/>
+<entry name="Mesa" url="ch03lev1sec6.html"/>
+<entry name="message redirection technology (referencing)" url="ch13lev1sec6.html"/>
+<entry name="Messages page (KDevelop Output View" url="ch18.html"/>
+<entry name="meta-information tags (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="Meta Object Compiler, executing programs" url="ch03lev1sec4.html"/>
+<entry name="Meta Object Compiler, keywords" url="ch03lev1sec4.html"/>
+<entry name="Meta Object Compiler, main program file example" url="ch03lev1sec4.html"/>
+<entry name="Meta Object Compiler (moc)" url="ch03lev1sec2.html"/>
+<entry name="Meta Object Compiler" url="ch03lev1sec4.html"/>
+<entry name="methods, attach()" url="ch13lev1sec5.html"/>
+<entry name="methods, beginTransaction()" url="ch13lev1sec5.html"/>
+<entry name="methods, blockUserInput()" url="ch13lev1sec5.html"/>
+<entry name="methods, call()" url="ch13lev1sec5.html"/>
+<entry name="methods, checkList()" url="ch10lev1sec3.html"/>
+<entry name="methods, check()" url="ch10lev1sec3.html"/>
+<entry name="methods, checkWord()" url="ch10lev1sec3.html"/>
+<entry name="methods, computeSome()" url="ch09lev1sec3.html"/>
+<entry name="methods, connectDCOPSignal()" url="ch13lev1sec6.html"/>
+<entry name="methods, dcopClient()" url="ch13lev1sec5.html"/>
+<entry name="methods, detach()" url="ch13lev1sec5.html"/>
+<entry name="methods, disableResize()" url="ch08lev1sec2.html"/>
+<entry name="methods, disconnectDCOPSignal()" url="ch13lev1sec6.html"/>
+<entry name="methods, documentation" url="ch15.html"/>
+<entry name="methods, drawEllipse()" url="ch04lev1sec2.html"/>
+<entry name="methods, drawLine()" url="ch04lev1sec2.html"/>
+<entry name="methods, drawRect()" url="ch04lev1sec2.html"/>
+<entry name="methods, emitDCOPSignal()" url="ch13lev1sec6.html"/>
+<entry name="methods, endTransaction()" url="ch13lev1sec5.html"/>
+<entry name="methods, exec(), QDialog class" url="ch08lev1sec3.html"/>
+<entry name="methods, findObject()" url="ch13lev1sec6.html"/>
+<entry name="methods (IDL)" url="ch14lev1sec3.html"/>
+<entry name="methods, isApplicationRegistered()" url="ch13lev1sec6.html"/>
+<entry name="methods, isRegistered()" url="ch13lev1sec6.html"/>
+<entry name="methods, main(), KabDemo application" url="ch10lev1sec4.html"/>
+<entry name="methods, main(), KChildren widget" url="ch04lev1sec3.html"/>
+<entry name="methods, main(), KDialogApp" url="ch11.html"/>
+<entry name="methods, main(), KDisc" url="ch04lev1sec4.html"/>
+<entry name="methods, main(), KImageView widget" url="ch10lev1sec2.html"/>
+<entry name="methods, main(), KLongJob widget" url="ch09lev1sec3.html"/>
+<entry name="methods, main(), KQuickDraw" url="ch09lev1sec2.html"/>
+<entry name="methods, main(), KSimpleApp" url="ch02lev1sec3.html"/>
+<entry name="methods, main(), KSimpleBrowser" url="ch10.html"/>
+<entry name="methods, main(), KSpellDemo" url="ch10lev1sec3.html"/>
+<entry name="methods, main(), KUniqueApplication" url="ch11lev1sec2.html"/>
+<entry name="methods, main(), KWeather applet" url="ch11lev1sec3.html"/>
+<entry name="methods, main(), KXOSquare widget" url="ch04lev1sec2.html"/>
+<entry name="methods, modalCheck()" url="ch10lev1sec3.html"/>
+<entry name="methods, naming conventions" url="ch02lev1sec5.html"/>
+<entry name="methods, newInstance()" url="ch11lev1sec2.html"/>
+<entry name="methods, paintEvent()" url="ch04lev1sec2.html"/>
+<entry name="methods, paintEvent()" url="ch09lev1sec2.html"/>
+<entry name="methods, processEvents()" url="ch09lev1sec3.html"/>
+<entry name="methods, process()" url="ch13lev1sec5.html"/>
+<entry name="methods, registerAs()" url="ch13lev1sec5.html"/>
+<entry name="methods, registeredApplications()" url="ch13lev1sec6.html"/>
+<entry name="methods, remoteFunctions()" url="ch13lev1sec6.html"/>
+<entry name="methods, remoteInterfaces()" url="ch13lev1sec6.html"/>
+<entry name="methods, remoteObjects()" url="ch13lev1sec6.html"/>
+<entry name="methods, repaint(), QPainter class" url="ch04lev1sec2.html"/>
+<entry name="methods, resume()" url="ch13lev1sec5.html"/>
+<entry name="methods, senderId()" url="ch13lev1sec6.html"/>
+<entry name="methods, send()" url="ch13lev1sec5.html"/>
+<entry name="methods, setActiveWindow()" url="ch11lev1sec2.html"/>
+<entry name="methods, setButtonText()" url="ch08lev1sec5.html"/>
+<entry name="methods, setDefaultObject()" url="ch13lev1sec5.html"/>
+<entry name="methods, setMinimumSize()" url="ch11lev1sec3.html"/>
+<entry name="methods, setNotifications()" url="ch13lev1sec6.html"/>
+<entry name="methods, setPen()" url="ch04lev1sec2.html"/>
+<entry name="methods, setPlainCaption()" url="ch08lev1sec5.html"/>
+<entry name="methods, show()" url="ch02lev1sec3.html"/>
+<entry name="methodsslotSpellCheck()" url="ch10lev1sec3.html"/>
+<entry name="methods, socket()" url="ch13lev1sec6.html"/>
+<entry name="methods, startComputation()" url="ch09lev1sec3.html"/>
+<entry name="methods, statusBar()" url="ch02lev1sec4.html"/>
+<entry name="methods, stopComputation()" url="ch09lev1sec3.html"/>
+<entry name="methods, suspend()" url="ch13lev1sec5.html"/>
+<entry name="methods, toolBar()" url="ch02lev1sec4.html"/>
+<entry name="methods, update(), QPainter class" url="ch04lev1sec2.html"/>
+<entry name="methods, writeGlobalSettings()" url="ch10lev1sec3.html"/>
+<entry name="mian() function, KStdActionsDemo widget" url="ch05.html"/>
+<entry name="MIDI, LibKMid" url="ch14lev1sec6.html"/>
+<entry name="mime resource type" url="ch07lev1sec4.html"/>
+<entry name="Mini application template" url="ch18lev1sec2.html"/>
+<entry name="moc, executing programs" url="ch03lev1sec4.html"/>
+<entry name="moc, keywords" url="ch03lev1sec4.html"/>
+<entry name="moc, main program file example" url="ch03lev1sec4.html"/>
+<entry name="moc (Meta Object Compiler" url="ch03lev1sec2.html"/>
+<entry name="moc" url="ch03lev1sec4.html"/>
+<entry name="modalCheck() method" url="ch10lev1sec3.html"/>
+<entry name="modal dialog boxes, advantages/disadvantages" url="ch08lev1sec3.html"/>
+<entry name="modal dialog boxes, modal dialog allocated from the heap" url="ch08lev1sec3.html"/>
+<entry name="modal dialog boxes, modal dialog located on the stack" url="ch08lev1sec3.html"/>
+<entry name="modeless dialog boxes, advantages/disadvantages" url="ch08lev1sec3.html"/>
+<entry name="modeless dialog boxes, CGotoDialog class example" url="ch08lev1sec3.html"/>
+<entry name="modeless dialog boxes, removing from memory" url="ch08lev1sec3.html"/>
+<entry name="modules, CVS (Concurrent Version System), checking out" url="ch17lev1sec5.html"/>
+<entry name="modules, CVS (Concurrent Version System), listing" url="ch17lev1sec5.html"/>
+<entry name="modules, CVS (Concurrent Version System), names" url="ch17lev1sec2.html"/>
+<entry name="modules, CVS (Concurrent Version System), updating" url="ch17lev1sec5.html"/>
+<entry name="modules (MCOP), initializing, attributes" url="ch14lev1sec3.html"/>
+<entry name="modules (MCOP), initializing, C++ constructor" url="ch14lev1sec3.html"/>
+<entry name="modules (MCOP), initializing, C++ destructor" url="ch14lev1sec3.html"/>
+<entry name="modules (MCOP), initializing, streamEnd() function" url="ch14lev1sec3.html"/>
+<entry name="modules (MCOP), initializing, streamInit() function" url="ch14lev1sec3.html"/>
+<entry name="modules (MCOP), initializing, streamStart() function" url="ch14lev1sec3.html"/>
+<entry name="modules (MCOP), initializing" url="ch14lev1sec3.html"/>
+<entry name="modules (MCOP), writing, Example_ADD module" url="ch14lev1sec2.html"/>
+<entry name="modules (MCOP), writing, interface definitions" url="ch14lev1sec2.html"/>
+<entry name="modules (MCOP), writing, interface implementation" url="ch14lev1sec2.html"/>
+<entry name="modules (MCOP), writing, .mcopclass files" url="ch14lev1sec2.html"/>
+<entry name="modules (MCOP), writing, mcopidl" url="ch14lev1sec2.html"/>
+<entry name="modules (MCOP), writing, REGISTER_IMPLEMENTATION" url="ch14lev1sec2.html"/>
+<entry name="modules (MCOP), writing" url="ch14lev1sec2.html"/>
+<entry name="mouse clicks, handling, widgets" url="ch04lev1sec4.html"/>
+<entry name="mouseDoubleClickEvent() event handler, widgets" url="ch04.html"/>
+<entry name="mouse events" url="ch03lev1sec2.html"/>
+<entry name="mouseMoveEvent() event handler, widgets" url="ch04.html"/>
+<entry name="mousePressEvent() event handler, widgets" url="ch04.html"/>
+<entry name="mouseReleaseEvent() event handler, widgets" url="ch04.html"/>
+<entry name="moveEvent() event handler, widgets" url="ch04.html"/>
+<entry name="multi element (IDL)" url="ch14lev1sec3.html"/>
+<entry name="multimedia, aKtion" url="ch14lev1sec6.html"/>
+<entry name="multimedia, aRts (analog, real-time synthesis)" url="ch14.html"/>
+<entry name="multimedia, KAudioPlayer class" url="ch14lev1sec6.html"/>
+<entry name="multimedia, KNotify API" url="ch14lev1sec6.html"/>
+<entry name="multimedia, LibKMid" url="ch14lev1sec6.html"/>
+<entry name="multimedia, MCOP, future of" url="ch14lev1sec7.html"/>
+<entry name="multimedia, MCOP, IDL compiler" url="ch14lev1sec3.html"/>
+<entry name="multimedia, MCOP, IDL syntax" url="ch14lev1sec3.html"/>
+<entry name="multimedia, MCOP, initial object reference" url="ch14lev1sec3.html"/>
+<entry name="multimedia, MCOP, interfaces" url="ch14lev1sec4.html"/>
+<entry name="multimedia, MCOP, module initialization" url="ch14lev1sec3.html"/>
+<entry name="multimedia, MCOP, modules, writing" url="ch14lev1sec2.html"/>
+<entry name="multimedia, MCOP, object connections" url="ch14lev1sec3.html"/>
+<entry name="multimedia, MCOP, reference counting" url="ch14lev1sec3.html"/>
+<entry name="multimedia, MCOP, StereoBalanceControl sample program" url="ch14lev1sec5.html"/>
+<entry name="multimedia, MCOP, stream access" url="ch14lev1sec3.html"/>
+<entry name="multimedia, MCOP, synchronous versus asynchronous streams" url="ch14lev1sec3.html"/>
+<entry name="multimedia, MCOP" url="ch14lev1sec3.html"/>
+<entry name="multimedia, stero beeps, playing" url="ch14.html"/>
+<entry name="multimedia" url="ch06lev1sec5.html"/>
+<entry name="multimedia" url="ch14.html"/>
+<entry name="multiple parts, embedding" url="ch12lev1sec8.html"/>
+<entry name="music" url="ch14lev1sec6.html"/>
+<entry name="MyWindow class implementation" url="ch03lev1sec4.html"/>
+<entry name="names, files, network transparency" url="ch06lev1sec8.html"/>
+<entry name="names, icons" url="ch06lev1sec3.html"/>
+<entry name="naming conventions" url="ch02lev1sec5.html"/>
+<entry name="navigation, drag and drop, responding to drop events" url="ch07.html"/>
+<entry name="navigation, drag and drop, starting a drag" url="ch07.html"/>
+<entry name="navigation, drag and drop" url="ch07.html"/>
+<entry name="navigation, menubars, creating" url="ch02lev1sec4.html"/>
+<entry name="navigation, toolbars" url="ch02lev1sec4.html"/>
+<entry name="nested layouts (dialog boxes)" url="ch08lev1sec2.html"/>
+<entry name="network transparency, applications, classes" url="ch06lev1sec8.html"/>
+<entry name="network transparency, applications" url="ch06lev1sec8.html"/>
+<entry name="network transparency" url="ch01lev1sec2.html"/>
+<entry name="network transparency" url="ch07.html"/>
+<entry name="network transparency" url="ch07lev1sec5.html"/>
+<entry name="New Class command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="New File command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="newInstance() method" url="ch11lev1sec2.html"/>
+<entry name="next action" url="ch06.html"/>
+<entry name="Normal application template" url="ch18lev1sec2.html"/>
+<entry name="notepad_factory.cpp implementatio (NotepadFactory)" url="ch12lev1sec6.html"/>
+<entry name="notepad_factory.cpp implementation" url="ch12lev1sec6.html"/>
+<entry name="notepad_factory.h file (NotepadFactory)" url="ch12lev1sec6.html"/>
+<entry name="notepad_factory.h header" url="ch12lev1sec6.html"/>
+<entry name="NotepadFactory, notepad_factory.cpp implementation" url="ch12lev1sec6.html"/>
+<entry name="NotepadFactory, notepad_factory.h header" url="ch12lev1sec6.html"/>
+<entry name="notepad_part.cpp part 1 file" url="ch12lev1sec5.html"/>
+<entry name="notepad_part.cpp part 2 file" url="ch12lev1sec5.html"/>
+<entry name="notepad_part.cpp part 3 file" url="ch12lev1sec5.html"/>
+<entry name="notepad_part.cpp part 4 file" url="ch12lev1sec5.html"/>
+<entry name="notepad_part.h header file" url="ch12lev1sec5.html"/>
+<entry name="NotepadPart part, constructor" url="ch12lev1sec5.html"/>
+<entry name="NotepadPart part, Makefile.am" url="ch12lev1sec6.html"/>
+<entry name="NotepadPart partnotepad_factory.cpp implementatio" url="ch12lev1sec6.html"/>
+<entry name="NotepadPart partnotepad_factory.h header" url="ch12lev1sec6.html"/>
+<entry name="NotepadPart part, notepad_part.h header" url="ch12lev1sec5.html"/>
+<entry name="NotepadPart part, openFile() function" url="ch12lev1sec5.html"/>
+<entry name="NotepadPart part, saveFile() function" url="ch12lev1sec5.html"/>
+<entry name="NotepadPart part, setReadWrite() function" url="ch12lev1sec5.html"/>
+<entry name="NotepadPart part" url="ch12lev1sec5.html"/>
+<entry name="notifications, user" url="ch06lev1sec6.html"/>
+<entry name="objects, connecting" url="ch14lev1sec3.html"/>
+<entry name="objects, DCOPRef" url="ch13lev1sec6.html"/>
+<entry name="objects, MCOP-aware, creating, Example_ADD module" url="ch14lev1sec2.html"/>
+<entry name="objects, MCOP-aware, creating, interface definitions" url="ch14lev1sec2.html"/>
+<entry name="objects, MCOP-aware, creating, interface implementation" url="ch14lev1sec2.html"/>
+<entry name="objects, MCOP-aware, creating, .mcopclass files" url="ch14lev1sec2.html"/>
+<entry name="objects, MCOP-aware, creating, mcopidl" url="ch14lev1sec2.html"/>
+<entry name="objects, MCOP-aware, creating, REGISTER_IMPLEMENTATION" url="ch14lev1sec2.html"/>
+<entry name="objects, MCOP-aware, creating" url="ch14lev1sec2.html"/>
+<entry name="objects, QDataStream" url="ch13lev1sec3.html"/>
+<entry name="objects, references, counting" url="ch14lev1sec3.html"/>
+<entry name="objects, references, initial object references" url="ch14lev1sec3.html"/>
+<entry name="obtaining, KDE" url="ch01lev1sec5.html"/>
+<entry name="online resources" url="ch01lev1sec3.html"/>
+<entry name="open action" url="ch06.html"/>
+<entry name="openFile() function" url="ch12lev1sec5.html"/>
+<entry name="OpenGL, creating programs" url="ch03lev1sec6.html"/>
+<entry name="OpenGL, sample program (listing)" url="ch03lev1sec6.html"/>
+<entry name="OpenGl" url="ch03lev1sec6.html"/>
+<entry name="opening, files, applications;KRun class" url="ch06lev1sec7.html"/>
+<entry name="openNew action" url="ch06.html"/>
+<entry name="openNew() function" url="ch05.html"/>
+<entry name="openRecent action" url="ch06.html"/>
+<entry name="optimizing performance, long jobs, application functions, enabling/disabling" url="ch09lev1sec3.html"/>
+<entry name="optimizing performance, long jobs, processEvents() method" url="ch09lev1sec3.html"/>
+<entry name="optimizing performance, long jobs, QTimer class" url="ch09lev1sec3.html"/>
+<entry name="optimizing performance, long jobs, speed issues" url="ch09lev1sec3.html"/>
+<entry name="optimizing performance, long jobs" url="ch09lev1sec3.html"/>
+<entry name="Option dialog box (KEdit)" url="ch08lev1sec6.html"/>
+<entry name="options, applications, defined" url="ch06.html"/>
+<entry name="Options command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="Output View (KDevelop IDE), Breakpoint page" url="ch18.html"/>
+<entry name="Output View (KDevelop IDE), Disassemble page" url="ch18.html"/>
+<entry name="Output View (KDevelop IDE), Frame Stack page" url="ch18.html"/>
+<entry name="Output View (KDevelop IDE), Messages page" url="ch18.html"/>
+<entry name="Output View (KDevelop IDE), Stderr page" url="ch18.html"/>
+<entry name="Output View (KDevelop IDE), Stdout page" url="ch18.html"/>
+<entry name="Output View (KDevelop IDE)" url="ch18.html"/>
+<entry name="packages, adminstrative files, config.cache" url="ch16lev1sec2.html"/>
+<entry name="packages, adminstrative files, config.h" url="ch16lev1sec2.html"/>
+<entry name="packages, adminstrative files, config.log" url="ch16lev1sec2.html"/>
+<entry name="packages, adminstrative files, config.status" url="ch16lev1sec2.html"/>
+<entry name="packages, adminstrative files, configure.in" url="ch16lev1sec2.html"/>
+<entry name="packages, adminstrative files, configure" url="ch16lev1sec2.html"/>
+<entry name="packages, adminstrative files, updating" url="ch16lev1sec2.html"/>
+<entry name="packages, adminstrative files" url="ch16lev1sec2.html"/>
+<entry name="packages, creating" url="ch18.html"/>
+<entry name="packages, distribution, compressed archives" url="ch16lev1sec3.html"/>
+<entry name="packages, distribution, informative text files" url="ch16lev1sec3.html"/>
+<entry name="packages, distribution, software announcements" url="ch16lev1sec3.html"/>
+<entry name="packages, distribution, uploads" url="ch16lev1sec3.html"/>
+<entry name="packages, distribution" url="ch16lev1sec3.html"/>
+<entry name="packages, gt-2.1.0" url="ch01lev1sec5.html"/>
+<entry name="packages, installing, binary packages" url="ch01lev1sec5.html"/>
+<entry name="packages, installing, source packages" url="ch01lev1sec5.html"/>
+<entry name="packages, kdeadmin" url="ch01lev1sec5.html"/>
+<entry name="packages, kdebase" url="ch01lev1sec5.html"/>
+<entry name="packages, kdegames" url="ch01lev1sec5.html"/>
+<entry name="packages, kdegraphics" url="ch01lev1sec5.html"/>
+<entry name="packages, kdei18n" url="ch01lev1sec5.html"/>
+<entry name="packages, kdelibs" url="ch01lev1sec5.html"/>
+<entry name="packages, kdemultimedia" url="ch01lev1sec5.html"/>
+<entry name="packages, kdenetwork" url="ch01lev1sec5.html"/>
+<entry name="packages, kdesupport" url="ch01lev1sec5.html"/>
+<entry name="packages, kdeutils" url="ch01lev1sec5.html"/>
+<entry name="packages, make targets" url="ch16lev1sec2.html"/>
+<entry name="packages, shared libraries" url="ch16lev1sec2.html"/>
+<entry name="packages, structure of" url="ch16.html"/>
+<entry name="packages, subdirectories" url="ch16lev1sec2.html"/>
+<entry name="packages, test results" url="ch16lev1sec2.html"/>
+<entry name="packages, top-level directories" url="ch16lev1sec2.html"/>
+<entry name="packages" url="ch16.html"/>
+<entry name="paintEvent() event handler, widgets" url="ch04.html"/>
+<entry name="paintEvent() method" url="ch04lev1sec2.html"/>
+<entry name="paintEvent() method" url="ch09lev1sec2.html"/>
+<entry name="paintGL() function (QGL widget)" url="ch03lev1sec6.html"/>
+<entry name="painting, widgets, invoking paint events" url="ch04lev1sec2.html"/>
+<entry name="painting, widgets, KXOSquare example" url="ch04lev1sec2.html"/>
+<entry name="painting, widgets, paintEvent() method" url="ch04lev1sec2.html"/>
+<entry name="painting, widgets, repainting" url="ch04lev1sec2.html"/>
+<entry name="painting, widgets" url="ch04lev1sec2.html"/>
+<entry name="panel applet (KWeather), kweather.cpp class definition" url="ch11lev1sec3.html"/>
+<entry name="panel applet (KWeather), kweather.h class definition" url="ch11lev1sec3.html"/>
+<entry name="panel applet (KWeather), main() method" url="ch11lev1sec3.html"/>
+<entry name="panel applet (KWeather)" url="ch11lev1sec3.html"/>
+<entry name="parameters, signals and slots" url="ch03lev1sec3.html"/>
+<entry name="param (" url="ch15.html"/>
+<entry name="Para tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="Parent Classes command (Classbrowser pop-up menu)" url="ch18lev1sec4.html"/>
+<entry name="parsers, Classparser (KDevelop)" url="ch18lev1sec4.html"/>
+<entry name="part class" url="ch12lev1sec2.html"/>
+<entry name="part manager class" url="ch12lev1sec2.html"/>
+<entry name="PartManager" url="ch12lev1sec8.html"/>
+<entry name="parts, compared to widgets" url="ch12.html"/>
+<entry name="parts, embedding, mainwindow GUI" url="ch12lev1sec7.html"/>
+<entry name="parts, embedding, mainwindow header" url="ch12lev1sec7.html"/>
+<entry name="parts, embedding, mainwindow implementation" url="ch12lev1sec7.html"/>
+<entry name="parts, embedding, multiple parts" url="ch12lev1sec8.html"/>
+<entry name="parts, embedding" url="ch12lev1sec7.html"/>
+<entry name="parts, framework" url="ch12lev1sec2.html"/>
+<entry name="parts, including in shared libraries, factory headers" url="ch12lev1sec6.html"/>
+<entry name="parts, including in shared libraries, factory implementation" url="ch12lev1sec6.html"/>
+<entry name="parts, including in shared libraries, makefiles" url="ch12lev1sec6.html"/>
+<entry name="parts, including in shared libraries" url="ch12lev1sec6.html"/>
+<entry name="parts, NotepadPart example, constructor" url="ch12lev1sec5.html"/>
+<entry name="parts, NotepadPart example, Makefile.am" url="ch12lev1sec6.html"/>
+<entry name="parts, NotepadPart example, notepad_factory.cpp implementation" url="ch12lev1sec6.html"/>
+<entry name="parts, NotepadPart example, notepad_factory.h header" url="ch12lev1sec6.html"/>
+<entry name="parts, NotepadPart example, notepad_part.h header" url="ch12lev1sec5.html"/>
+<entry name="parts, NotepadPart example, openFile() function" url="ch12lev1sec5.html"/>
+<entry name="parts, NotepadPart example, saveFile() function" url="ch12lev1sec5.html"/>
+<entry name="parts, NotepadPart example, setReadWrite() function" url="ch12lev1sec5.html"/>
+<entry name="parts, NotepadPart example" url="ch12lev1sec5.html"/>
+<entry name="parts, PartManager" url="ch12lev1sec8.html"/>
+<entry name="parts, plug-ins" url="ch12lev1sec9.html"/>
+<entry name="parts, read-only parts" url="ch12lev1sec4.html"/>
+<entry name="parts, read/write parts" url="ch12lev1sec4.html"/>
+<entry name="parts" url="ch12.html"/>
+<entry name="parts, XML files" url="ch12lev1sec3.html"/>
+<entry name="paste action" url="ch06.html"/>
+<entry name="performance, DCOP (Desktop Communication Protocol)" url="ch13lev1sec6.html"/>
+<entry name="performance optimization, long jobs, application functions, enabling/disabling" url="ch09lev1sec3.html"/>
+<entry name="performance optimization, long jobs, processEvents() method" url="ch09lev1sec3.html"/>
+<entry name="performance optimization, long jobs, QTimer class" url="ch09lev1sec3.html"/>
+<entry name="performance optimization, long jobs, speed issues" url="ch09lev1sec3.html"/>
+<entry name="performance optimization, long jobs" url="ch09lev1sec3.html"/>
+<entry name="permissions" url="ch19lev1sec2.html"/>
+<entry name="pipes" url="ch13.html"/>
+<entry name="playing, sound" url="ch06lev1sec5.html"/>
+<entry name="playing, stero beeps" url="ch14.html"/>
+<entry name="plugin class" url="ch12lev1sec2.html"/>
+<entry name="plug-ins, KParts plug-ins" url="ch12lev1sec9.html"/>
+<entry name="PNG format, icons" url="ch06lev1sec3.html"/>
+<entry name="PNG format, (Portable Network Graphics)" url="ch06lev1sec3.html"/>
+<entry name="Portable Network Graphics format" url="ch06lev1sec3.html"/>
+<entry name="preferences action" url="ch06.html"/>
+<entry name="pre tags (KDOC)" url="ch15.html"/>
+<entry name="print action" url="ch06.html"/>
+<entry name="printPreview action" url="ch06.html"/>
+<entry name="prior action" url="ch06.html"/>
+<entry name="processEvents() method" url="ch09lev1sec3.html"/>
+<entry name="processing, DocBook documentation" url="ch15lev1sec2.html"/>
+<entry name="process() method" url="ch13lev1sec5.html"/>
+<entry name="program listings" url="ch04lev1sec3.html"/>
+<entry name="programming conventions, class documentation" url="ch02lev1sec5.html"/>
+<entry name="programming conventions, naming conventions" url="ch02lev1sec5.html"/>
+<entry name="programming interface (DCOP), attach() method" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), call() method" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), dcopClient() method" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), dcopIDL" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), detach() method" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), makefile rules" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), process() method" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), registerAs() method" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), resume() method" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), send() method" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), suspend() method" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP), transactions" url="ch13lev1sec5.html"/>
+<entry name="programming interface (DCOP)" url="ch13lev1sec5.html"/>
+<entry name="programming, Qt toolkit" url="ch03.html"/>
+<entry name="programs, compiling, example" url="ch02lev1sec2.html"/>
+<entry name="programs, compiling, g++ compiler" url="ch02lev1sec2.html"/>
+<entry name="programs, compiling, make utility" url="ch02lev1sec2.html"/>
+<entry name="programs, compiling" url="ch02lev1sec2.html"/>
+<entry name="programs, debuggers" url="ch02.html"/>
+<entry name="programs, document-centric" url="ch02lev1sec3.html"/>
+<entry name="programs, GUI elements, creating/configuring" url="ch02lev1sec4.html"/>
+<entry name="programs, GUI elements, menubars" url="ch02lev1sec4.html"/>
+<entry name="programs, GUI elements, status lines" url="ch02lev1sec4.html"/>
+<entry name="programs, GUI elements, toolbars" url="ch02lev1sec4.html"/>
+<entry name="programs, programming conventions, class documentation" url="ch02lev1sec5.html"/>
+<entry name="programs, programming conventions, naming conventions" url="ch02lev1sec5.html"/>
+<entry name="programs, structure of, KApplication class" url="ch02lev1sec3.html"/>
+<entry name="programs, structure of, KTMainWindow class" url="ch02lev1sec3.html"/>
+<entry name="programs, structure of, main() method" url="ch02lev1sec3.html"/>
+<entry name="programs, structure of" url="ch02lev1sec3.html"/>
+<entry name="programs, text editors" url="ch02.html"/>
+<entry name="programs" url="ch02.html"/>
+<entry name="project management" url="ch18.html"/>
+<entry name="projects, editing" url="ch18lev1sec2.html"/>
+<entry name="protocols, DCOP, API tools" url="ch13lev1sec6.html"/>
+<entry name="protocols, DCOP, architecture" url="ch13lev1sec4.html"/>
+<entry name="protocols, DCOP, dcopc interface" url="ch13lev1sec7.html"/>
+<entry name="protocols, DCOP, dcop (shell client)" url="ch13lev1sec7.html"/>
+<entry name="protocols, DCOP;(Desktop Communication Protocol)" url="ch13.html"/>
+<entry name="protocols, DCOP, embedded KPart instances" url="ch13lev1sec6.html"/>
+<entry name="protocols, DCOP, goals" url="ch13.html"/>
+<entry name="protocols, DCOP, history of" url="ch13lev1sec2.html"/>
+<entry name="protocols, DCOP, kdcop (shell client)" url="ch13lev1sec7.html"/>
+<entry name="protocols, DCOP, KNotify example" url="ch13lev1sec7.html"/>
+<entry name="protocols, DCOP, KUniqueApplication example" url="ch13lev1sec7.html"/>
+<entry name="protocols, DCOP, KXMLRPC interface" url="ch13lev1sec7.html"/>
+<entry name="protocols, DCOP, message redirection technology (referencing)" url="ch13lev1sec6.html"/>
+<entry name="protocols, DCOP, performance and overhead" url="ch13lev1sec6.html"/>
+<entry name="protocols, DCOP, programming interface" url="ch13lev1sec5.html"/>
+<entry name="protocols, DCOP, signals and slots" url="ch13lev1sec6.html"/>
+<entry name="protocols, DCOP, underlying technologies" url="ch13lev1sec3.html"/>
+<entry name="protocols, DCOP" url="ch13.html"/>
+<entry name="protocols, FTP, snapshots" url="ch17lev1sec3.html"/>
+<entry name="protocols, XDND" url="ch07.html"/>
+<entry name="QBoxLayout geometry manager" url="ch04lev1sec3.html"/>
+<entry name="QDataStream objects" url="ch13lev1sec3.html"/>
+<entry name="QGL widget" url="ch03lev1sec6.html"/>
+<entry name="QGridLayout geometry manager" url="ch04lev1sec3.html"/>
+<entry name="QHBox widget, layout managers, creating" url="ch08lev1sec2.html"/>
+<entry name="QImage class" url="ch10lev1sec2.html"/>
+<entry name="QLayout classes, code example" url="ch08lev1sec2.html"/>
+<entry name="QLayout classes, design issues" url="ch08lev1sec2.html"/>
+<entry name="QLayout classes" url="ch08lev1sec2.html"/>
+<entry name="Qlist class" url="ch03lev1sec5.html"/>
+<entry name="QObject class" url="ch03lev1sec2.html"/>
+<entry name="QPainter class, example usage (listing)" url="ch03lev1sec2.html"/>
+<entry name="QPainter class, member function" url="ch03lev1sec2.html"/>
+<entry name="QPainter class, methods, paintEvent()" url="ch04lev1sec2.html"/>
+<entry name="QPainter class, methods, repaint()" url="ch04lev1sec2.html"/>
+<entry name="QPainter class, methods, update()" url="ch04lev1sec2.html"/>
+<entry name="QPainter class" url="ch03lev1sec2.html"/>
+<entry name="QPainter class" url="ch04lev1sec2.html"/>
+<entry name="QPicture class, drawing commands, recording" url="ch04lev1sec2.html"/>
+<entry name="QPixmap class" url="ch10lev1sec2.html"/>
+<entry name="QPL (Q Public License)" url="ch19lev1sec3.html"/>
+<entry name="Q Public License (QPL)" url="ch19lev1sec3.html"/>
+<entry name="QPushButton class, listing" url="ch03lev1sec2.html"/>
+<entry name="QPushButton class, member functions" url="ch03lev1sec2.html"/>
+<entry name="QPushButton class" url="ch03lev1sec2.html"/>
+<entry name="QSplitter" url="ch05.html"/>
+<entry name="Qt, classes, QList" url="ch03lev1sec5.html"/>
+<entry name="QTDIR environment variable" url="ch02lev1sec2.html"/>
+<entry name="Qt, event handling" url="ch03lev1sec2.html"/>
+<entry name="Qt, ImageIO" url="ch03lev1sec6.html"/>
+<entry name="QTimer class" url="ch09lev1sec3.html"/>
+<entry name="Qt library, supported image formats" url="ch10lev1sec2.html"/>
+<entry name="Qt, license, FreeQt" url="ch19lev1sec3.html"/>
+<entry name="Qt, Mesa" url="ch03lev1sec6.html"/>
+<entry name="Qt, moc, executing programs" url="ch03lev1sec4.html"/>
+<entry name="Qt, moc, keywords" url="ch03lev1sec4.html"/>
+<entry name="Qt, moc, main program file example" url="ch03lev1sec4.html"/>
+<entry name="Qt, moc (Meta Object Compiler)" url="ch03lev1sec2.html"/>
+<entry name="Qt, moc" url="ch03lev1sec4.html"/>
+<entry name="Qt, OpenGL" url="ch03lev1sec6.html"/>
+<entry name="Qt, paremeters" url="ch03lev1sec3.html"/>
+<entry name="Qt, QObject class" url="ch03lev1sec2.html"/>
+<entry name="Qt, QPainter class, functions" url="ch03lev1sec2.html"/>
+<entry name="Qt, QPainter class" url="ch03lev1sec2.html"/>
+<entry name="Qt, QPushButton class, functions" url="ch03lev1sec2.html"/>
+<entry name="Qt, QPushButton class" url="ch03lev1sec2.html"/>
+<entry name="Qt, QWidget class, example (listing)" url="ch03lev1sec2.html"/>
+<entry name="Qt, QWidget class, member functions" url="ch03lev1sec2.html"/>
+<entry name="Qt, QWidget class" url="ch03lev1sec2.html"/>
+<entry name="Qt, signals, connecting to slots" url="ch03lev1sec3.html"/>
+<entry name="Qt, signals, emitting" url="ch03lev1sec3.html"/>
+<entry name="Qt, signals" url="ch03lev1sec3.html"/>
+<entry name="Qt, slots, connecting to signals" url="ch03lev1sec3.html"/>
+<entry name="Qt, slots, creating" url="ch03lev1sec3.html"/>
+<entry name="Qt, slots, parameters" url="ch03lev1sec3.html"/>
+<entry name="Qt, slots, temporary classes" url="ch03lev1sec3.html"/>
+<entry name="Qt, slots" url="ch03lev1sec3.html"/>
+<entry name="Qt, STL" url="ch03lev1sec5.html"/>
+<entry name="Qt tookit" url="ch03.html"/>
+<entry name="Qt toolkit, overview" url="ch03lev1sec2.html"/>
+<entry name="Qt, utility classes" url="ch03lev1sec5.html"/>
+<entry name="queryClose() function" url="ch07lev1sec3.html"/>
+<entry name="quit action" url="ch06.html"/>
+<entry name="QVBox widget, layout managers, creating" url="ch08lev1sec2.html"/>
+<entry name="QWidget class, attributes" url="ch04.html"/>
+<entry name="QWidget class, documentation" url="ch04.html"/>
+<entry name="QWidget class, event handlers, closeEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, dragEnterEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, dragLeaveEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, dragMoveEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, dropEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, enterEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, event()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, focusInEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, focusOutEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, keyPressEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, keyReleaseEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, leaveEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, mouseDoubleClickEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, mouseMoveEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, mousePressEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, mouseReleaseEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, moveEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, paintEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, resizeEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers, showEvent()" url="ch04.html"/>
+<entry name="QWidget class, event handlers" url="ch04.html"/>
+<entry name="QWidget class, event handlers, wheelEvent()" url="ch04.html"/>
+<entry name="QWidget class, sample class declaration" url="ch04.html"/>
+<entry name="QWidget class, signals" url="ch04.html"/>
+<entry name="QWidget class, slots" url="ch04.html"/>
+<entry name="QWidget class" url="ch03lev1sec2.html"/>
+<entry name="QWidget class" url="ch04.html"/>
+<entry name="raises (" url="ch15.html"/>
+<entry name="reading, devices, QDataStream" url="ch13lev1sec3.html"/>
+<entry name="ReadOnlyPart class" url="ch12lev1sec4.html"/>
+<entry name="read-only parts" url="ch12lev1sec4.html"/>
+<entry name="readProperties() function" url="ch07lev1sec3.html"/>
+<entry name="ReadWritePart class" url="ch12lev1sec4.html"/>
+<entry name="read/write parts" url="ch12lev1sec4.html"/>
+<entry name="Real File Viewer (RFV)" url="ch18.html"/>
+<entry name="Real File Viewer (RFV)" url="ch18lev1sec5.html"/>
+<entry name="recording, drawing commands, QPicture class" url="ch04lev1sec2.html"/>
+<entry name="redisplay action" url="ch06.html"/>
+<entry name="redo action" url="ch06.html"/>
+<entry name="references, counting" url="ch14lev1sec3.html"/>
+<entry name="references, initial object references" url="ch14lev1sec3.html"/>
+<entry name="referencing (message redirection technology)" url="ch13lev1sec6.html"/>
+<entry name="ref (" url="ch15.html"/>
+<entry name="registerAs() method" url="ch13lev1sec5.html"/>
+<entry name="registeredApplications() method" url="ch13lev1sec6.html"/>
+<entry name="REGISTER_IMPLEMENTATION" url="ch14lev1sec2.html"/>
+<entry name="registering, interface implementations, REGISTER_IMPLEMENTATION" url="ch14lev1sec2.html"/>
+<entry name="ReleaseInfo tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="remoteFunctions() method" url="ch13lev1sec6.html"/>
+<entry name="remoteInterfaces() method" url="ch13lev1sec6.html"/>
+<entry name="remoteObjects() method" url="ch13lev1sec6.html"/>
+<entry name="removeGlobalReferences function" url="ch14lev1sec3.html"/>
+<entry name="remove option (cvs command)" url="ch17lev1sec5.html"/>
+<entry name="removing, modeless dialog boxes" url="ch08lev1sec3.html"/>
+<entry name="rendering, HTML files" url="ch10.html"/>
+<entry name="repainting, widgets" url="ch04lev1sec2.html"/>
+<entry name="repaint() method, QPainter class" url="ch04lev1sec2.html"/>
+<entry name="replace action" url="ch06.html"/>
+<entry name="reportBug action" url="ch06.html"/>
+<entry name="resiceGL(int width, int height) function (QGL widget)" url="ch03lev1sec6.html"/>
+<entry name="resizeEvent() event handler, widgets" url="ch04.html"/>
+<entry name="Resource/Header Files window (KDevelop)" url="ch18.html"/>
+<entry name="resources, accessing" url="ch07lev1sec4.html"/>
+<entry name="resources, .desktop files" url="ch07lev1sec4.html"/>
+<entry name="resources, standard resource locations" url="ch07lev1sec4.html"/>
+<entry name="resources, types" url="ch07lev1sec4.html"/>
+<entry name="responding to drop events" url="ch07.html"/>
+<entry name="responsiveness, importance of" url="ch09.html"/>
+<entry name="responsiveness, long jobs, optimizing performance of, application functions, enabling/disabling" url="ch09lev1sec3.html"/>
+<entry name="responsiveness, long jobs, optimizing performance of, processEvents() method" url="ch09lev1sec3.html"/>
+<entry name="responsiveness, long jobs, optimizing performance of, QTimer class" url="ch09lev1sec3.html"/>
+<entry name="responsiveness, long jobs, optimizing performance of, speed issues" url="ch09lev1sec3.html"/>
+<entry name="responsiveness, long jobs, optimizing performance of" url="ch09lev1sec3.html"/>
+<entry name="responsiveness" url="ch09.html"/>
+<entry name="responsiveness, Window updates, double-buffering, advantages" url="ch09lev1sec2.html"/>
+<entry name="responsiveness, Window updates, double-buffering, example of" url="ch09lev1sec2.html"/>
+<entry name="responsiveness, Window updates, double-buffering, screen flicker" url="ch09lev1sec2.html"/>
+<entry name="responsiveness, Window updates, double-buffering" url="ch09lev1sec2.html"/>
+<entry name="resume() method" url="ch13lev1sec5.html"/>
+<entry name="returns (" url="ch15.html"/>
+<entry name="revert action" url="ch06.html"/>
+<entry name="RFV (Real File Viewer)" url="ch18.html"/>
+<entry name="RFV (Real File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="Run command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="run() functions, KRun class" url="ch06lev1sec7.html"/>
+<entry name="running, applications, KRun class" url="ch06lev1sec7.html"/>
+<entry name="running, gdb debugger" url="ch18lev1sec6.html"/>
+<entry name="Run to Cursor command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="save action" url="ch06.html"/>
+<entry name="saveAs action" url="ch06.html"/>
+<entry name="saveFile() function" url="ch12lev1sec5.html"/>
+<entry name="saveOptions action" url="ch06.html"/>
+<entry name="saveProperties() function" url="ch07lev1sec3.html"/>
+<entry name="screen flicker" url="ch09lev1sec2.html"/>
+<entry name="scripting, MCOP" url="ch14lev1sec7.html"/>
+<entry name="searching, KDevelop documentation" url="ch18lev1sec3.html"/>
+<entry name="Sectn tag (DocBook)***ITALICIZE n***" url="ch15lev1sec2.html"/>
+<entry name="sect (" url="ch15.html"/>
+<entry name="see (" url="ch15.html"/>
+<entry name="selectAll action" url="ch06.html"/>
+<entry name="SelectDialog class" url="ch08.html"/>
+<entry name="senderId() method" url="ch13lev1sec6.html"/>
+<entry name="send() method" url="ch13lev1sec5.html"/>
+<entry name="services resource type" url="ch07lev1sec4.html"/>
+<entry name="session management" url="ch07lev1sec3.html"/>
+<entry name="sessions, session management, header file example" url="ch06lev1sec2.html"/>
+<entry name="sessions, session management, KEdit" url="ch06lev1sec2.html"/>
+<entry name="sessions, session management, main source code example" url="ch06lev1sec2.html"/>
+<entry name="sessions, session management, source file example" url="ch06lev1sec2.html"/>
+<entry name="sessions, session management" url="ch06lev1sec2.html"/>
+<entry name="setAcceptDrops() function" url="ch07.html"/>
+<entry name="setActiveWindow() method" url="ch11lev1sec2.html"/>
+<entry name="setButtonText() method" url="ch08lev1sec5.html"/>
+<entry name="setDefaultObject() method" url="ch13lev1sec5.html"/>
+<entry name="setExclusiveGroup() function" url="ch05.html"/>
+<entry name="setMinimumSize() method" url="ch11lev1sec3.html"/>
+<entry name="setModified() function" url="ch12lev1sec5.html"/>
+<entry name="setNotifications() method" url="ch13lev1sec6.html"/>
+<entry name="setPen() method" url="ch04lev1sec2.html"/>
+<entry name="setPlainCaption() method" url="ch08lev1sec5.html"/>
+<entry name="setReadWrite() function" url="ch12lev1sec5.html"/>
+<entry name="Settings menu commands" url="ch06.html"/>
+<entry name="shared libraries, creating" url="ch16lev1sec2.html"/>
+<entry name="shared libraries, parts, including, factory headers" url="ch12lev1sec6.html"/>
+<entry name="shared libraries, parts, including, factory implementation" url="ch12lev1sec6.html"/>
+<entry name="shared libraries, parts, including, makefiles" url="ch12lev1sec6.html"/>
+<entry name="shared libraries, parts, including" url="ch12lev1sec6.html"/>
+<entry name="short (" url="ch15.html"/>
+<entry name="showEvent() event handler, widgets" url="ch04.html"/>
+<entry name="showMenubar action" url="ch06.html"/>
+<entry name="show() method" url="ch02lev1sec3.html"/>
+<entry name="showStatusbar action" url="ch06.html"/>
+<entry name="showToolbar action" url="ch06.html"/>
+<entry name="signals, connecting to slots" url="ch03lev1sec3.html"/>
+<entry name="signals (DCOP)" url="ch13lev1sec6.html"/>
+<entry name="signals, emitting" url="ch03lev1sec3.html"/>
+<entry name="signals, parameters" url="ch03lev1sec3.html"/>
+<entry name="signals, (Qt)" url="ch03lev1sec3.html"/>
+<entry name="signals" url="ch03lev1sec2.html"/>
+<entry name="signals (widgets)" url="ch04.html"/>
+<entry name="SimpleSoundServer interface" url="ch14lev1sec4.html"/>
+<entry name="since (" url="ch15.html"/>
+<entry name="single-instance application, kunique.cpp call definition" url="ch11lev1sec2.html"/>
+<entry name="single-instance application, kunique.h class definition" url="ch11lev1sec2.html"/>
+<entry name="single-instance application, main() method" url="ch11lev1sec2.html"/>
+<entry name="single-instance application" url="ch11lev1sec2.html"/>
+<entry name="slotButton()" url="ch03lev1sec4.html"/>
+<entry name="slotOpen() function" url="ch07lev1sec5.html"/>
+<entry name="slotSave() function" url="ch07lev1sec5.html"/>
+<entry name="slots, connecting to signals" url="ch03lev1sec3.html"/>
+<entry name="slots, creating" url="ch03lev1sec3.html"/>
+<entry name="slots (DCOP)" url="ch13lev1sec6.html"/>
+<entry name="slots, parameters" url="ch03lev1sec3.html"/>
+<entry name="slotSpecialHelp() function" url="ch05lev1sec2.html"/>
+<entry name="slotSpellCheck() method" url="ch10lev1sec3.html"/>
+<entry name="slots, (Qt)" url="ch03lev1sec3.html"/>
+<entry name="slots, slotButton()" url="ch03lev1sec4.html"/>
+<entry name="slots, temporary classes" url="ch03lev1sec3.html"/>
+<entry name="slots" url="ch03lev1sec2.html"/>
+<entry name="slots (widgets)" url="ch04.html"/>
+<entry name="snapshots" url="ch17lev1sec3.html"/>
+<entry name="socket() method" url="ch13lev1sec6.html"/>
+<entry name="software development, documentation" url="ch18.html"/>
+<entry name="software development, languages" url="ch18.html"/>
+<entry name="software development, packages, creating" url="ch18.html"/>
+<entry name="software development, project management" url="ch18.html"/>
+<entry name="sorry() function" url="ch05lev1sec3.html"/>
+<entry name="sound, KAudioPlayer class" url="ch14lev1sec6.html"/>
+<entry name="sound, LibKMid" url="ch14lev1sec6.html"/>
+<entry name="sound, multimedia" url="ch14lev1sec5.html"/>
+<entry name="sound, playing" url="ch06lev1sec5.html"/>
+<entry name="sound resource type" url="ch07lev1sec4.html"/>
+<entry name="sound, SimpleSoundServer interface" url="ch14lev1sec4.html"/>
+<entry name="sound, StereoBalanceControl sample program, balance() function" url="ch14lev1sec5.html"/>
+<entry name="sound, StereoBalanceControl sample program, IDL (interface definition language)" url="ch14lev1sec5.html"/>
+<entry name="sound, StereoBalanceControl sample program, makefile" url="ch14lev1sec5.html"/>
+<entry name="sound, StereoBalanceControl sample program, running on server" url="ch14lev1sec5.html"/>
+<entry name="sound, StereoBalanceControl sample program" url="ch14lev1sec5.html"/>
+<entry name="sound, stereo beeps, playing" url="ch14.html"/>
+<entry name="sound, StereoEffectStack interface" url="ch14lev1sec4.html"/>
+<entry name="sound" url="ch06lev1sec5.html"/>
+<entry name="source code, accessing in CVS (Concurrent Version System), CVS accounts" url="ch17lev1sec3.html"/>
+<entry name="source code, accessing in CVS (Concurrent Version System), cvsup utility" url="ch17lev1sec3.html"/>
+<entry name="source code, accessing in CVS (Concurrent Version System), cvsup utility" url="ch17lev1sec4.html"/>
+<entry name="source code, accessing in CVS (Concurrent Version System), cvs utility" url="ch17lev1sec5.html"/>
+<entry name="source code, accessing in CVS (Concurrent Version System), snapshots" url="ch17lev1sec3.html"/>
+<entry name="source code, accessing in CVS (Concurrent Version System)" url="ch17lev1sec3.html"/>
+<entry name="source code, accessing in CVS (Concurrent Version System), Web interface" url="ch17lev1sec3.html"/>
+<entry name="source code documentation, KDOC, class documentation" url="ch15.html"/>
+<entry name="source code documentation, KDOC, comments" url="ch15.html"/>
+<entry name="source code documentation, KDOC, downloading" url="ch15.html"/>
+<entry name="source code documentation, KDOC, installing" url="ch15.html"/>
+<entry name="source code documentation, KDOC, library documentation" url="ch15.html"/>
+<entry name="source code documentation, KDOC, method documentation" url="ch15.html"/>
+<entry name="source code documentation" url="ch15.html"/>
+<entry name="source code listings" url="ch04lev1sec3.html"/>
+<entry name="source files, session management" url="ch06lev1sec2.html"/>
+<entry name="source packages, installing" url="ch01lev1sec5.html"/>
+<entry name="speeding up Window updates (double-buffering), advantages" url="ch09lev1sec2.html"/>
+<entry name="speeding up Window updates (double-buffering), example of" url="ch09lev1sec2.html"/>
+<entry name="speeding up Window updates (double-buffering), screen flicker" url="ch09lev1sec2.html"/>
+<entry name="speeding up Window updates (double-buffering)" url="ch09lev1sec2.html"/>
+<entry name="spell-checking (KSpell), configuring" url="ch10lev1sec3.html"/>
+<entry name="spell-checking (KSpell), methods" url="ch10lev1sec3.html"/>
+<entry name="spell-checking (KSpell), modal spell-checking" url="ch10lev1sec3.html"/>
+<entry name="spell-checking (KSpell), sample application" url="ch10lev1sec3.html"/>
+<entry name="spell-checking (KSpell)" url="ch10lev1sec3.html"/>
+<entry name="spelling action" url="ch06.html"/>
+<entry name="standard actions, KStdAction class" url="ch05.html"/>
+<entry name="standard actions, KStdActionsDemo widget, kstdactionsdemo.cpp class declaration" url="ch05.html"/>
+<entry name="standard actions, KStdActionsDemo widget, kstdactionsdemo.h class definition" url="ch05.html"/>
+<entry name="standard actions, KStdActionsDemo widget, main() function" url="ch05.html"/>
+<entry name="standard actions, KStdActionsDemo widget" url="ch05.html"/>
+<entry name="standard dialog boxes, KFileDialog" url="ch05lev1sec3.html"/>
+<entry name="standard dialog boxes, KFontDialog" url="ch05lev1sec3.html"/>
+<entry name="standard dialog boxes, KMessageBox" url="ch05lev1sec3.html"/>
+<entry name="standard dialog boxes, sample application" url="ch05lev1sec3.html"/>
+<entry name="standard dialog boxes" url="ch05lev1sec3.html"/>
+<entry name="standard resource locations" url="ch07lev1sec4.html"/>
+<entry name="startComputation() method" url="ch09lev1sec3.html"/>
+<entry name="starting, drag events" url="ch07.html"/>
+<entry name="startobject parameter" url="ch03lev1sec3.html"/>
+<entry name="statements, #include" url="ch14lev1sec3.html"/>
+<entry name="states, toolbar icons" url="ch06lev1sec3.html"/>
+<entry name="static run() functions" url="ch06lev1sec7.html"/>
+<entry name="statusBar() method" url="ch02lev1sec4.html"/>
+<entry name="status bars, Konqueror status bar" url="ch05.html"/>
+<entry name="status bars, KWrite status bar" url="ch05.html"/>
+<entry name="status bars" url="ch05.html"/>
+<entry name="status lines" url="ch02lev1sec4.html"/>
+<entry name="Stderr page (KDevelop Output View" url="ch18.html"/>
+<entry name="Stdout page (KDevelop Output View" url="ch18.html"/>
+<entry name="Steo Over command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="Step In command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="Step In Instruction command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="Step Out command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="Step Over Instruction command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="StereoBalanceControl sample program, balance() function" url="ch14lev1sec5.html"/>
+<entry name="StereoBalanceControl sample program, IDL (interface definition language)" url="ch14lev1sec5.html"/>
+<entry name="StereoBalanceControl sample program, makefile" url="ch14lev1sec5.html"/>
+<entry name="StereoBalanceControl sample program, running on server" url="ch14lev1sec5.html"/>
+<entry name="StereoBalanceControl sample program" url="ch14lev1sec5.html"/>
+<entry name="stereo beeps, playing" url="ch14.html"/>
+<entry name="StereoEffectStack interface" url="ch14lev1sec4.html"/>
+<entry name="STL, (Standard Template Library)" url="ch03lev1sec5.html"/>
+<entry name="Stop command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="stopComputation() method" url="ch09lev1sec3.html"/>
+<entry name="streamEnd() function" url="ch14lev1sec3.html"/>
+<entry name="streaming data, reading devices" url="ch13lev1sec3.html"/>
+<entry name="streaming data" url="ch13lev1sec3.html"/>
+<entry name="streaming data, writing to devices" url="ch13lev1sec3.html"/>
+<entry name="streamInit() function" url="ch14lev1sec3.html"/>
+<entry name="streams, accessing" url="ch14lev1sec3.html"/>
+<entry name="streams, defining" url="ch14lev1sec3.html"/>
+<entry name="streams, synchronous versus asynchronous" url="ch14lev1sec3.html"/>
+<entry name="streamStart() function" url="ch14lev1sec3.html"/>
+<entry name="structs" url="ch14lev1sec3.html"/>
+<entry name="stub files (DCOP)" url="ch13lev1sec5.html"/>
+<entry name="subdirectories, configuring" url="ch16lev1sec2.html"/>
+<entry name="suspend() method" url="ch13lev1sec5.html"/>
+<entry name="synchronous streams" url="ch14lev1sec3.html"/>
+<entry name="syntax, i18n()" url="ch06lev1sec4.html"/>
+<entry name="system events, handling" url="ch04.html"/>
+<entry name="system requirements (KDE)" url="ch01lev1sec4.html"/>
+<entry name="tags (DocBook), document structure tags" url="ch15lev1sec2.html"/>
+<entry name="tags (DocBook), formatting tags" url="ch15lev1sec2.html"/>
+<entry name="tags (DocBook), meta-information tags" url="ch15lev1sec2.html"/>
+<entry name="tags (KDOC)" url="ch15.html"/>
+<entry name="tags (XML), DOCTYPE" url="ch12lev1sec3.html"/>
+<entry name="tags, XML (Extensible Markup Language)" url="ch05.html"/>
+<entry name="tags (XML), Merge" url="ch12lev1sec3.html"/>
+<entry name="targetobject parameter" url="ch03lev1sec3.html"/>
+<entry name="targets (makefiles)" url="ch16lev1sec2.html"/>
+<entry name="tasks" url="ch09lev1sec3.html"/>
+<entry name="template classes, listing" url="ch03lev1sec5.html"/>
+<entry name="templates, C++" url="ch03lev1sec5.html"/>
+<entry name="templates, KDevelop application templates, KDE-MDI" url="ch18lev1sec2.html"/>
+<entry name="templates, KDevelop application templates, KDE Mini" url="ch18lev1sec2.html"/>
+<entry name="templates, KDevelop application templates, KDE Normal" url="ch18lev1sec2.html"/>
+<entry name="templates, KDevelop application templates" url="ch18lev1sec2.html"/>
+<entry name="templates, QList class" url="ch03lev1sec5.html"/>
+<entry name="templates, STL" url="ch03lev1sec5.html"/>
+<entry name="testing, KXOSquare widget" url="ch04lev1sec2.html"/>
+<entry name="text editors" url="ch02.html"/>
+<entry name="text editor" url="ch05.html"/>
+<entry name="text tag (XML)" url="ch05.html"/>
+<entry name="throws (" url="ch15.html"/>
+<entry name="TicTacToe widget" url="ch04lev1sec3.html"/>
+<entry name="tooBar() method" url="ch02lev1sec4.html"/>
+<entry name="toolbar icons, specifications" url="ch06lev1sec3.html"/>
+<entry name="toolbar icons, states" url="ch06lev1sec3.html"/>
+<entry name="toolbar resource type" url="ch07lev1sec4.html"/>
+<entry name="toolbars, KCustomActions widget" url="ch05.html"/>
+<entry name="toolbars" url="ch02lev1sec4.html"/>
+<entry name="toolbars" url="ch05.html"/>
+<entry name="ToolBar tag (XML)" url="ch05.html"/>
+<entry name="toolkits, Qt" url="ch03.html"/>
+<entry name="tools, Autoconf" url="ch18.html"/>
+<entry name="tools, Automake" url="ch18.html"/>
+<entry name="tools, DocBook, DocBook Web site" url="ch15lev1sec2.html"/>
+<entry name="tools, DocBook, downloading" url="ch15lev1sec2.html"/>
+<entry name="tools, DocBook, processing documentation" url="ch15lev1sec2.html"/>
+<entry name="tools, DocBook, sample documentation" url="ch15lev1sec2.html"/>
+<entry name="tools, DocBook, tags" url="ch15lev1sec2.html"/>
+<entry name="tools, DocBook" url="ch15lev1sec2.html"/>
+<entry name="tools, gdb debugger, commands" url="ch18lev1sec6.html"/>
+<entry name="tools, gdb debugger, enabling debugging information" url="ch18lev1sec6.html"/>
+<entry name="tools, gdb debugger, options" url="ch18lev1sec6.html"/>
+<entry name="tools, gdb debugger, running" url="ch18lev1sec6.html"/>
+<entry name="tools, gdb debugger" url="ch18lev1sec6.html"/>
+<entry name="tools, KDOC, class documentation" url="ch15.html"/>
+<entry name="tools, KDOC, comments" url="ch15.html"/>
+<entry name="tools, KDOC, downloading" url="ch15.html"/>
+<entry name="tools, KDOC, installing" url="ch15.html"/>
+<entry name="tools, KDOC, library documentation" url="ch15.html"/>
+<entry name="tools, KDOC, method documentation" url="ch15.html"/>
+<entry name="tools, KDOC" url="ch15.html"/>
+<entry name="Tools menu commands" url="ch06.html"/>
+<entry name="Tools window (KDevelop)" url="ch18.html"/>
+<entry name="Tooltips" url="ch05lev1sec2.html"/>
+<entry name="top-level directories, configuring" url="ch16lev1sec2.html"/>
+<entry name="transactions (DCOP)" url="ch13lev1sec5.html"/>
+<entry name="translation files" url="ch06lev1sec4.html"/>
+<entry name="transparency (network)" url="ch07lev1sec5.html"/>
+<entry name="Tree View (KDevelop IDE), CV (Class Viewer)" url="ch18.html"/>
+<entry name="Tree View (KDevelop IDE), DOC (Documentation Tree View)" url="ch18.html"/>
+<entry name="Tree View (KDevelop IDE), LFV (Logical File Viewer)" url="ch18.html"/>
+<entry name="Tree View (KDevelop IDE), LFV (Logical File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="Tree View (KDevelop IDE), RFV (Real File Viewer)" url="ch18.html"/>
+<entry name="Tree View (KDevelop IDE), RFV (Real File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="Tree View (KDevelop IDE)" url="ch18.html"/>
+<entry name="Tree View (KDevelop IDE), VAR (Variable Viewer)" url="ch18.html"/>
+<entry name="Trolltech Web site" url="ch03.html"/>
+<entry name="troubleshooting, gdb debugger, commands" url="ch18lev1sec6.html"/>
+<entry name="troubleshooting, gdb debugger, enabling debugging information" url="ch18lev1sec6.html"/>
+<entry name="troubleshooting, gdb debugger, options" url="ch18lev1sec6.html"/>
+<entry name="troubleshooting, gdb debugger, running" url="ch18lev1sec6.html"/>
+<entry name="troubleshooting, gdb debugger" url="ch18lev1sec6.html"/>
+<entry name="tuning performance" url="ch09lev1sec3.html"/>
+<entry name="types (IDL)" url="ch14lev1sec3.html"/>
+<entry name="UI compliance, document-centric interface, actions" url="ch05.html"/>
+<entry name="UI compliance, document-centric interface, content areas" url="ch05.html"/>
+<entry name="UI compliance, document-centric interface, menubars" url="ch05.html"/>
+<entry name="UI compliance, document-centric interface, status bars" url="ch05.html"/>
+<entry name="UI compliance, document-centric interface, toolbars" url="ch05.html"/>
+<entry name="UI compliance, document-centric interface" url="ch05.html"/>
+<entry name="UI compliance, help, Tooltips" url="ch05lev1sec2.html"/>
+<entry name="UI compliance, help, ToolTips" url="ch05lev1sec2.html"/>
+<entry name="UI compliance, help" url="ch05lev1sec2.html"/>
+<entry name="UI compliance, standard dialog boxes, KFileDialog" url="ch05lev1sec3.html"/>
+<entry name="UI compliance, standard dialog boxes, KFontDialog" url="ch05lev1sec3.html"/>
+<entry name="UI compliance, standard dialog boxes, KMessageBox" url="ch05lev1sec3.html"/>
+<entry name="UI compliance, standard dialog boxes, sample application" url="ch05lev1sec3.html"/>
+<entry name="UI compliance, standard dialog boxes" url="ch05lev1sec3.html"/>
+<entry name="UI compliance" url="ch05.html"/>
+<entry name="ULink tag (DocBook)" url="ch15lev1sec2.html"/>
+<entry name="undo action" url="ch06.html"/>
+<entry name="uninstall target" url="ch16lev1sec2.html"/>
+<entry name="unique applications, KUniqueApplication example, passing command-line parameters" url="ch13lev1sec7.html"/>
+<entry name="unique applications, KUniqueApplication example, startup" url="ch13lev1sec7.html"/>
+<entry name="unique applications, KUniqueApplication example" url="ch13lev1sec7.html"/>
+<entry name="unique applications" url="ch13.html"/>
+<entry name="up action" url="ch06.html"/>
+<entry name="update() method, QPainter class" url="ch04lev1sec2.html"/>
+<entry name="update option (cvs command)" url="ch17lev1sec5.html"/>
+<entry name="updating, administrative files" url="ch16lev1sec2.html"/>
+<entry name="updating, modules (CVS)" url="ch17lev1sec5.html"/>
+<entry name="upload() function" url="ch07lev1sec5.html"/>
+<entry name="uploading, software" url="ch16lev1sec3.html"/>
+<entry name="user-friendly applications" url="ch06lev1sec9.html"/>
+<entry name="user input, widgets, KDisc widget example" url="ch04lev1sec4.html"/>
+<entry name="user input, widgets, keystrokes" url="ch04lev1sec4.html"/>
+<entry name="user input, widgets, mouse clicks" url="ch04lev1sec4.html"/>
+<entry name="user input, widgets" url="ch04lev1sec4.html"/>
+<entry name="user interface (KDevelop IDE), _____debugger), commands" url="ch18lev1sec6.html"/>
+<entry name="user interface (KDevelop IDE), Dialog Editor, advantages" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Dialog Editor" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Dialog Editor, weaknesses" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), gdb debugger), commands" url="ch18lev1sec6.html"/>
+<entry name="user interface (KDevelop IDE), gdb (debugger), enabling debugging information" url="ch18lev1sec6.html"/>
+<entry name="user interface (KDevelop IDE), gdb (debugger), options" url="ch18lev1sec6.html"/>
+<entry name="user interface (KDevelop IDE), gdb (debugger), running" url="ch18lev1sec6.html"/>
+<entry name="user interface (KDevelop IDE), gdb (debugger)" url="ch18lev1sec6.html"/>
+<entry name="user interface (KDevelop IDE), Output View, Breakpoint page" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Output View, Disassemble page" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Output View, Frame Stack page" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Output View, Messages page" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Output View, Stderr page" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Output View, Stdout page" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Output View" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Tree View, CV (Class Viewer)" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Tree View, DOC (Documentation Tree View)" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Tree View, LFV (Logical File Viewer)" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Tree View, LFV (Logical File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="user interface (KDevelop IDE), Tree View, RFV (Real File Viewer)" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Tree View, RFV (Real File Viewer)" url="ch18lev1sec5.html"/>
+<entry name="user interface (KDevelop IDE), Tree View" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), Tree View, VAR (Variable Viewer)" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE)" url="ch18.html"/>
+<entry name="user interface (KDevelop IDE), working area" url="ch18.html"/>
+<entry name="user-interface library" url="ch08lev1sec4.html"/>
+<entry name="users, notifications" url="ch06lev1sec6.html"/>
+<entry name="utilities, cvs, commands" url="ch17lev1sec5.html"/>
+<entry name="utilities, cvs, configuring" url="ch17lev1sec5.html"/>
+<entry name="utilities, cvsup, advantages" url="ch17lev1sec3.html"/>
+<entry name="utilities, cvsup, configuring" url="ch17lev1sec4.html"/>
+<entry name="utilities, make" url="ch02lev1sec2.html"/>
+<entry name="utilities, xgettext" url="ch07lev1sec4.html"/>
+<entry name="utility classes, (Qt)" url="ch03lev1sec5.html"/>
+<entry name="variables, environment variables, KDEDIR" url="ch02lev1sec2.html"/>
+<entry name="variables, environment variables, QTDIR" url="ch02lev1sec2.html"/>
+<entry name="Variable Viewer (VAR)" url="ch18.html"/>
+<entry name="VAR (Variable Viewer)" url="ch18.html"/>
+<entry name="version control, CVS, accounts" url="ch17lev1sec3.html"/>
+<entry name="version control, CVS, branches" url="ch17lev1sec2.html"/>
+<entry name="version control, CVS, (Concurrent Versions System)" url="ch17.html"/>
+<entry name="version control, CVS, cvsup utility" url="ch17lev1sec3.html"/>
+<entry name="version control, CVS, cvsup utility" url="ch17lev1sec4.html"/>
+<entry name="version control, CVS, cvs utility" url="ch17lev1sec5.html"/>
+<entry name="version control, CVS, directories" url="ch17lev1sec5.html"/>
+<entry name="version control, CVS, files" url="ch17lev1sec5.html"/>
+<entry name="version control, CVS, modules" url="ch17lev1sec2.html"/>
+<entry name="version control, CVS, snapshots" url="ch17lev1sec3.html"/>
+<entry name="version control, CVS" url="ch17.html"/>
+<entry name="version control, CVS, Web interface" url="ch17lev1sec3.html"/>
+<entry name="versions, KDevelop IDE" url="ch18.html"/>
+<entry name="versions, KDevelop IDE, version 2.0" url="ch18.html"/>
+<entry name="versions, KDevelop IDE, version 2.0" url="ch18lev1sec7.html"/>
+<entry name="version (" url="ch15.html"/>
+<entry name="vi editor" url="ch02.html"/>
+<entry name="Viewers command (gdb debugger)" url="ch18lev1sec6.html"/>
+<entry name="View menu commands" url="ch06.html"/>
+<entry name="views, KDevelop IDE, Output View" url="ch18.html"/>
+<entry name="views, KDevelop IDE, Tree View" url="ch18.html"/>
+<entry name="wallpaper resource type" url="ch07lev1sec4.html"/>
+<entry name="warningContinueCancel() function" url="ch05lev1sec3.html"/>
+<entry name="Web, CVS (Concurrent Version System) interface" url="ch17lev1sec3.html"/>
+<entry name="Web sites, DKE Developers" url="ch01lev1sec2.html"/>
+<entry name="Web sites, DocBook" url="ch15lev1sec2.html"/>
+<entry name="Web sites, Freshmeat" url="ch16lev1sec3.html"/>
+<entry name="Web sites, ICE (Inter-Client Exchange) documentation" url="ch13lev1sec3.html"/>
+<entry name="Web sites, Interface Hall of Shame" url="ch06lev1sec9.html"/>
+<entry name="Web sites, Interface Hall of Shame" url="ch08lev1sec7.html"/>
+<entry name="Web sites, KDE Translator's and Documenter's Web site" url="ch06lev1sec4.html"/>
+<entry name="Web sites, KDE" url="ch01lev1sec3.html"/>
+<entry name="Web sites, licenses" url="ch19lev1sec5.html"/>
+<entry name="Web sites, Mesa" url="ch03lev1sec6.html"/>
+<entry name="Web sites, OpenGl" url="ch03lev1sec6.html"/>
+<entry name="Web sites, QDataStream documentation" url="ch13lev1sec3.html"/>
+<entry name="Web sites, Trolltech" url="ch03.html"/>
+<entry name="Web sites, XDND protocol" url="ch07.html"/>
+<entry name="Web sites, XML-RPC" url="ch13lev1sec7.html"/>
+<entry name="whatsThis action" url="ch06.html"/>
+<entry name="wheelEvent() event handler, widgets" url="ch04.html"/>
+<entry name="widets, KImageView (image viewer/converter), kimageview.cpp class declaration" url="ch10lev1sec2.html"/>
+<entry name="widets, KImageView (image viewer/converter), kimageview.h class definition" url="ch10lev1sec2.html"/>
+<entry name="widets, KImageView (image viewer/converter), main() method" url="ch10lev1sec2.html"/>
+<entry name="widets, KImageView (image viewer/converter)" url="ch10lev1sec2.html"/>
+<entry name="widgets, attributes" url="ch04.html"/>
+<entry name="widgets, child widgets, geometry management" url="ch04lev1sec3.html"/>
+<entry name="widgets, child widgets, KChildren example" url="ch04lev1sec3.html"/>
+<entry name="widgets, child widgets" url="ch04lev1sec3.html"/>
+<entry name="widgets, compared to parts" url="ch12.html"/>
+<entry name="widgets, defined" url="ch04.html"/>
+<entry name="widgets, dialog widgets" url="ch08.html"/>
+<entry name="widgets, documentation" url="ch04.html"/>
+<entry name="widgets, drawing commands, recording" url="ch04lev1sec2.html"/>
+<entry name="widgets, drawing graphics on" url="ch03lev1sec2.html"/>
+<entry name="widgets, event handlers, closeEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, dragEnterEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, dragLeaveEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, dragMoveEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, dropEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, enterEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, event()" url="ch04.html"/>
+<entry name="widgets, event handlers, focusInEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, focusOutEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, hideEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, keyPressEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, keyReleaseEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, leaveEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, mouseDoubleClickEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, mouseMoveEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, mousePressEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, mouseReleaseEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, moveEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, paintEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, resizeEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers, showEvent()" url="ch04.html"/>
+<entry name="widgets, event handlers" url="ch04.html"/>
+<entry name="widgets, event handlers, wheelEvent()" url="ch04.html"/>
+<entry name="widgets, KHTMLWidget" url="ch10.html"/>
+<entry name="widgets, KSpell (spell-checking), configuring" url="ch10lev1sec3.html"/>
+<entry name="widgets, KSpell (spell-checking), methods" url="ch10lev1sec3.html"/>
+<entry name="widgets, KSpell (spell-checking), modal spell-checking" url="ch10lev1sec3.html"/>
+<entry name="widgets, KSpell (spell-checking), sample application" url="ch10lev1sec3.html"/>
+<entry name="widgets, KSpell (spell-checking)" url="ch10lev1sec3.html"/>
+<entry name="widgets, manager widgets (kdeui)" url="ch08lev1sec4.html"/>
+<entry name="widgets, names of specific widgets" url="ch10lev1sec3.html"/>
+<entry name="widgets, painting, invoking paint events" url="ch04lev1sec2.html"/>
+<entry name="widgets, painting, KXOSquare example" url="ch04lev1sec2.html"/>
+<entry name="widgets, painting, paintEvent() method" url="ch04lev1sec2.html"/>
+<entry name="widgets, painting, repainting" url="ch04lev1sec2.html"/>
+<entry name="widgets, painting" url="ch04lev1sec2.html"/>
+<entry name="widgets, QGL" url="ch03lev1sec6.html"/>
+<entry name="widgets, sample class declaration" url="ch04.html"/>
+<entry name="widgets, signals" url="ch04.html"/>
+<entry name="widgets, slots" url="ch04.html"/>
+<entry name="widgets" url="ch01lev1sec2.html"/>
+<entry name="widgets" url="ch04.html"/>
+<entry name="widgets" url="ch04lev1sec3.html"/>
+<entry name="widgets" url="ch09lev1sec2.html"/>
+<entry name="widgets, user input, KDisc widget example" url="ch04lev1sec4.html"/>
+<entry name="widgets, user input, keystrokes" url="ch04lev1sec4.html"/>
+<entry name="widgets, user input, mouse clicks" url="ch04lev1sec4.html"/>
+<entry name="widgets, user input" url="ch04lev1sec4.html"/>
+<entry name="Window updates, double-buffering, advantages" url="ch09lev1sec2.html"/>
+<entry name="Window updates, double-buffering, example of" url="ch09lev1sec2.html"/>
+<entry name="Window updates, double-buffering, screen flicker" url="ch09lev1sec2.html"/>
+<entry name="Window updates, double-buffering" url="ch09lev1sec2.html"/>
+<entry name="wizards, Application Wizard (KDevelop)" url="ch18lev1sec2.html"/>
+<entry name="working area (KDevelop IDE)" url="ch18.html"/>
+<entry name="World Wide Web" url="ch17lev1sec3.html"/>
+<entry name="writeGlobalSettings() method" url="ch10lev1sec3.html"/>
+<entry name="writing, QDataStream serialization" url="ch13lev1sec3.html"/>
+<entry name="WWW" url="ch17lev1sec3.html"/>
+<entry name="X Atoms" url="ch13lev1sec2.html"/>
+<entry name="XDND protocol" url="ch07.html"/>
+<entry name="xgettext utility" url="ch07lev1sec4.html"/>
+<entry name="XML (Extensible Markup Language), tags" url="ch05.html"/>
+<entry name="XML (Extensible Markup Language)" url="ch05.html"/>
+<entry name="XML files, user interfaces" url="ch12lev1sec3.html"/>
+<entry name="XML-RPC" url="ch13lev1sec7.html"/>
+<entry name="XML tags, DOCTYPE" url="ch12lev1sec3.html"/>
+<entry name="XML tags, Merge" url="ch12lev1sec3.html"/>
+<entry name="X Windows programming, Qt toolkit" url="ch03.html"/>
+<entry name="z6 option (cvs command)" url="ch17lev1sec5.html"/>
+<entry name="zoom action" url="ch06.html"/>
+<entry name="zoomIn action" url="ch06.html"/>
+<entry name="ZoomOut action" url="ch06.html"/>
+</index>
+</kdeveloptoc>
+
diff --git a/languages/cpp/doc/kdetemplates.toc b/languages/cpp/doc/kdetemplates.toc
new file mode 100644
index 00000000..c72f19ad
--- /dev/null
+++ b/languages/cpp/doc/kdetemplates.toc
@@ -0,0 +1,9 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>The KDevelop C++ KDE templates explained</title>
+<base href="http://women.kde.org/articles/tutorials/kdevelop_templates"/>
+<tocsect1 name="General KDE templates" url="index.php"/>
+<tocsect1 name="Other KDE templates" url="others.php/"/>
+<tocsect1 name="SCons templates" url="scons.php"/>
+<tocsect1 name="Qt templates" url="qt.php"/>
+</kdeveloptoc>
diff --git a/languages/cpp/doc/libc.toc b/languages/cpp/doc/libc.toc
new file mode 100644
index 00000000..a007614d
--- /dev/null
+++ b/languages/cpp/doc/libc.toc
@@ -0,0 +1,858 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>LIBC (umn.edu)</title>
+<base href="http://epoxy.mrs.umn.edu/doc/glibc-doc/html/"/>
+<tocsect1 name="1. Introduction" url="chapters_1.html#SEC1">
+ <tocsect2 name="1.1 Getting Started" url="chapters_1.html#SEC2"/>
+ <tocsect2 name="1.2 Standards and Portability" url="chapters_1.html#SEC3">
+ <tocsect3 name="1.2.1 ISO C" url="chapters_1.html#SEC4"/>
+ <tocsect3 name="1.2.2 POSIX (The Portable Operating System Interface)" url="chapters_1.html#SEC5"/>
+ <tocsect3 name="1.2.3 Berkeley Unix" url="chapters_1.html#SEC6"/>
+ <tocsect3 name="1.2.4 SVID (The System V Interface Description)" url="chapters_1.html#SEC7"/>
+ <tocsect3 name="1.2.5 XPG (The X/Open Portability Guide)" url="chapters_1.html#SEC8"/>
+ </tocsect2>
+ <tocsect2 name="1.3 Using the Library" url="chapters_1.html#SEC9">
+ <tocsect3 name="1.3.1 Header Files" url="chapters_1.html#SEC10"/>
+ <tocsect3 name="1.3.2 Macro Definitions of Functions" url="chapters_1.html#SEC11"/>
+ <tocsect3 name="1.3.3 Reserved Names" url="chapters_1.html#SEC12"/>
+ <tocsect3 name="1.3.4 Feature Test Macros" url="chapters_1.html#SEC13"/>
+ </tocsect2>
+ <tocsect2 name="1.4 Roadmap to the Manual" url="chapters_1.html#SEC14"/>
+</tocsect1>
+<tocsect1 name="2. Error Reporting" url="chapters_2.html#SEC15">
+ <tocsect2 name="2.1 Checking for Errors" url="chapters_2.html#SEC16"/>
+ <tocsect2 name="2.2 Error Codes" url="chapters_2.html#SEC17"/>
+ <tocsect2 name="2.3 Error Messages" url="chapters_2.html#SEC18"/>
+</tocsect1>
+<tocsect1 name="3. Virtual Memory Allocation And Paging" url="chapters_3.html#SEC19">
+ <tocsect2 name="3.1 Process Memory Concepts" url="chapters_3.html#SEC20"/>
+ <tocsect2 name="3.2 Allocating Storage For Program Data" url="chapters_3.html#SEC21">
+ <tocsect3 name="3.2.1 Memory Allocation in C Programs" url="chapters_3.html#SEC22">
+ <tocsect4 name="3.2.1.1 Dynamic Memory Allocation" url="chapters_3.html#SEC23"/>
+ </tocsect3>
+ <tocsect3 name="3.2.2 Unconstrained Allocation" url="chapters_3.html#SEC24">
+ <tocsect4 name="3.2.2.1 Basic Memory Allocation" url="chapters_3.html#SEC25"/>
+ <tocsect4 name="3.2.2.2 Examples of malloc" url="chapters_3.html#SEC26"/>
+ <tocsect4 name="3.2.2.3 Freeing Memory Allocated with malloc" url="chapters_3.html#SEC27"/>
+ <tocsect4 name="3.2.2.4 Changing the Size of a Block" url="chapters_3.html#SEC28"/>
+ <tocsect4 name="3.2.2.5 Allocating Cleared Space" url="chapters_3.html#SEC29"/>
+ <tocsect4 name="3.2.2.6 Efficiency Considerations for malloc" url="chapters_3.html#SEC30"/>
+ <tocsect4 name="3.2.2.7 Allocating Aligned Memory Blocks" url="chapters_3.html#SEC31"/>
+ <tocsect4 name="3.2.2.8 Malloc Tunable Parameters" url="chapters_3.html#SEC32"/>
+ <tocsect4 name="3.2.2.9 Heap Consistency Checking" url="chapters_3.html#SEC33"/>
+ <tocsect4 name="3.2.2.10 Memory Allocation Hooks" url="chapters_3.html#SEC34"/>
+ <tocsect4 name="3.2.2.11 Statistics for Memory Allocation with malloc" url="chapters_3.html#SEC35"/>
+ <tocsect4 name="3.2.2.12 Summary of malloc-Related Functions" url="chapters_3.html#SEC36"/>
+ </tocsect3>
+ <tocsect3 name="3.2.3 Allocation Debugging" url="chapters_3.html#SEC37">
+ <tocsect4 name="3.2.3.1 How to install the tracing functionality" url="chapters_3.html#SEC38"/>
+ <tocsect4 name="3.2.3.2 Example program excerpts" url="chapters_3.html#SEC39"/>
+ <tocsect4 name="3.2.3.3 Some more or less clever ideas" url="chapters_3.html#SEC40"/>
+ <tocsect4 name="3.2.3.4 Interpreting the traces" url="chapters_3.html#SEC41"/>
+ </tocsect3>
+ <tocsect3 name="3.2.4 Obstacks" url="chapters_3.html#SEC42">
+ <tocsect4 name="3.2.4.1 Creating Obstacks" url="chapters_3.html#SEC43"/>
+ <tocsect4 name="3.2.4.2 Preparing for Using Obstacks" url="chapters_3.html#SEC44"/>
+ <tocsect4 name="3.2.4.3 Allocation in an Obstack" url="chapters_3.html#SEC45"/>
+ <tocsect4 name="3.2.4.4 Freeing Objects in an Obstack" url="chapters_3.html#SEC46"/>
+ <tocsect4 name="3.2.4.5 Obstack Functions and Macros" url="chapters_3.html#SEC47"/>
+ <tocsect4 name="3.2.4.6 Growing Objects" url="chapters_3.html#SEC48"/>
+ <tocsect4 name="3.2.4.7 Extra Fast Growing Objects" url="chapters_3.html#SEC49"/>
+ <tocsect4 name="3.2.4.8 Status of an Obstack" url="chapters_3.html#SEC50"/>
+ <tocsect4 name="3.2.4.9 Alignment of Data in Obstacks" url="chapters_3.html#SEC51"/>
+ <tocsect4 name="3.2.4.10 Obstack Chunks" url="chapters_3.html#SEC52"/>
+ <tocsect4 name="3.2.4.11 Summary of Obstack Functions" url="chapters_3.html#SEC53"/>
+ </tocsect3>
+ <tocsect3 name="3.2.5 Automatic Storage with Variable Size" url="chapters_3.html#SEC54">
+ <tocsect4 name="3.2.5.1 alloca Example" url="chapters_3.html#SEC55"/>
+ <tocsect4 name="3.2.5.2 Advantages of alloca" url="chapters_3.html#SEC56"/>
+ <tocsect4 name="3.2.5.3 Disadvantages of alloca" url="chapters_3.html#SEC57"/>
+ <tocsect4 name="3.2.5.4 GNU C Variable-Size Arrays" url="chapters_3.html#SEC58"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="3.3 Resizing the Data Segment" url="chapters_3.html#SEC59"/>
+ <tocsect2 name="3.4 Locking Pages" url="chapters_3.html#SEC60">
+ <tocsect3 name="3.4.1 Why Lock Pages" url="chapters_3.html#SEC61"/>
+ <tocsect3 name="3.4.2 Locked Memory Details" url="chapters_3.html#SEC62"/>
+ <tocsect3 name="3.4.3 Functions To Lock And Unlock Pages" url="chapters_3.html#SEC63"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="4. Character Handling" url="chapters_4.html#SEC64">
+ <tocsect2 name="4.1 Classification of Characters" url="chapters_4.html#SEC65"/>
+ <tocsect2 name="4.2 Case Conversion" url="chapters_4.html#SEC66"/>
+ <tocsect2 name="4.3 Character class determination for wide characters" url="chapters_4.html#SEC67"/>
+ <tocsect2 name="4.4 Notes on using the wide character classes" url="chapters_4.html#SEC68"/>
+ <tocsect2 name="4.5 Mapping of wide characters." url="chapters_4.html#SEC69"/>
+</tocsect1>
+<tocsect1 name="5. String and Array Utilities" url="chapters_5.html#SEC70">
+ <tocsect2 name="5.1 Representation of Strings" url="chapters_5.html#SEC71"/>
+ <tocsect2 name="5.2 String and Array Conventions" url="chapters_5.html#SEC72"/>
+ <tocsect2 name="5.3 String Length" url="chapters_5.html#SEC73"/>
+ <tocsect2 name="5.4 Copying and Concatenation" url="chapters_5.html#SEC74"/>
+ <tocsect2 name="5.5 String/Array Comparison" url="chapters_5.html#SEC75"/>
+ <tocsect2 name="5.6 Collation Functions" url="chapters_5.html#SEC76"/>
+ <tocsect2 name="5.7 Search Functions" url="chapters_5.html#SEC77">
+ <tocsect3 name="5.7.1 Compatibility String Search Functions" url="chapters_5.html#SEC78"/>
+ </tocsect2>
+ <tocsect2 name="5.8 Finding Tokens in a String" url="chapters_5.html#SEC79"/>
+ <tocsect2 name="5.9 strfry" url="chapters_5.html#SEC80"/>
+ <tocsect2 name="5.10 Trivial Encryption" url="chapters_5.html#SEC81"/>
+ <tocsect2 name="5.11 Encode Binary Data" url="chapters_5.html#SEC82"/>
+ <tocsect2 name="5.12 Argz and Envz Vectors" url="chapters_5.html#SEC83">
+ <tocsect3 name="5.12.1 Argz Functions" url="chapters_5.html#SEC84"/>
+ <tocsect3 name="5.12.2 Envz Functions" url="chapters_5.html#SEC85"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="6. Character Set Handling" url="chapters_6.html#SEC86">
+ <tocsect2 name="6.1 Introduction to Extended Characters" url="chapters_6.html#SEC87"/>
+ <tocsect2 name="6.2 Overview about Character Handling Functions" url="chapters_6.html#SEC88"/>
+ <tocsect2 name="6.3 Restartable Multibyte Conversion Functions" url="chapters_6.html#SEC89">
+ <tocsect3 name="6.3.1 Selecting the conversion and its properties" url="chapters_6.html#SEC90"/>
+ <tocsect3 name="6.3.2 Representing the state of the conversion" url="chapters_6.html#SEC91"/>
+ <tocsect3 name="6.3.3 Converting Single Characters" url="chapters_6.html#SEC92"/>
+ <tocsect3 name="6.3.4 Converting Multibyte and Wide Character Strings" url="chapters_6.html#SEC93"/>
+ <tocsect3 name="6.3.5 A Complete Multibyte Conversion Example" url="chapters_6.html#SEC94"/>
+ </tocsect2>
+ <tocsect2 name="6.4 Non-reentrant Conversion Function" url="chapters_6.html#SEC95">
+ <tocsect3 name="6.4.1 Non-reentrant Conversion of Single Characters" url="chapters_6.html#SEC96"/>
+ <tocsect3 name="6.4.2 Non-reentrant Conversion of Strings" url="chapters_6.html#SEC97"/>
+ <tocsect3 name="6.4.3 States in Non-reentrant Functions" url="chapters_6.html#SEC98"/>
+ </tocsect2>
+ <tocsect2 name="6.5 Generic Charset Conversion" url="chapters_6.html#SEC99">
+ <tocsect3 name="6.5.1 Generic Character Set Conversion Interface" url="chapters_6.html#SEC100"/>
+ <tocsect3 name="6.5.2 A complete iconv example" url="chapters_6.html#SEC101"/>
+ <tocsect3 name="6.5.3 Some Details about other iconv Implementations" url="chapters_6.html#SEC102"/>
+ <tocsect3 name="6.5.4 The iconv Implementation in the GNU C library" url="chapters_6.html#SEC103">
+ <tocsect4 name="6.5.4.1 Format of `gconv-modules' files" url="chapters_6.html#SEC104"/>
+ <tocsect4 name="6.5.4.2 Finding the conversion path in iconv" url="chapters_6.html#SEC105"/>
+ <tocsect4 name="6.5.4.3 iconv module data structures" url="chapters_6.html#SEC106"/>
+ <tocsect4 name="6.5.4.4 iconv module interfaces" url="chapters_6.html#SEC107"/>
+ </tocsect3>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="7. Locales and Internationalization" url="chapters_7.html#SEC108">
+ <tocsect2 name="7.1 What Effects a Locale Has" url="chapters_7.html#SEC109"/>
+ <tocsect2 name="7.2 Choosing a Locale" url="chapters_7.html#SEC110"/>
+ <tocsect2 name="7.3 Categories of Activities that Locales Affect" url="chapters_7.html#SEC111"/>
+ <tocsect2 name="7.4 How Programs Set the Locale" url="chapters_7.html#SEC112"/>
+ <tocsect2 name="7.5 Standard Locales" url="chapters_7.html#SEC113"/>
+ <tocsect2 name="7.6 Accessing Locale Information" url="chapters_7.html#SEC114">
+ <tocsect3 name="7.6.1 localeconv: It is portable but small...small" url="chapters_7.html#SEC115">
+ <tocsect4 name="7.6.1.1 Generic Numeric Formatting Parameters" url="chapters_7.html#SEC116"/>
+ <tocsect4 name="7.6.1.2 Printing the Currency Symbol" url="chapters_7.html#SEC117"/>
+ <tocsect4 name="7.6.1.3 Printing the Sign of a Monetary Amount" url="chapters_7.html#SEC118"/>
+ </tocsect3>
+ <tocsect3 name="7.6.2 Pinpoint Access to Locale Data" url="chapters_7.html#SEC119"/>
+ </tocsect2>
+ <tocsect2 name="7.7 A dedicated function to format numbers" url="chapters_7.html#SEC120"/>
+ <tocsect2 name="7.8 Yes-or-No Questions" url="chapters_7.html#SEC121"/>
+</tocsect1>
+<tocsect1 name="8. Message Translation" url="chapters_8.html#SEC122">
+ <tocsect2 name="8.1 X/Open Message Catalog Handling" url="chapters_8.html#SEC123">
+ <tocsect3 name="8.1.1 The catgets function family" url="chapters_8.html#SEC124"/>
+ <tocsect3 name="8.1.2 Format of the message catalog files" url="chapters_8.html#SEC125"/>
+ <tocsect3 name="8.1.3 Generate Message Catalogs files" url="chapters_8.html#SEC126"/>
+ <tocsect3 name="8.1.4 How to use the catgets interface" url="chapters_8.html#SEC127">
+ <tocsect4 name="8.1.4.1 Not using symbolic names" url="chapters_8.html#SEC128"/>
+ <tocsect4 name="8.1.4.2 Using symbolic names" url="chapters_8.html#SEC129"/>
+ <tocsect4 name="8.1.4.3 How does to this allow to develop" url="chapters_8.html#SEC130"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="8.2 The Uniforum approach to Message Translation" url="chapters_8.html#SEC131">
+ <tocsect3 name="8.2.1 The gettext family of functions" url="chapters_8.html#SEC132">
+ <tocsect4 name="8.2.1.1 What has to be done to translate a message?" url="chapters_8.html#SEC133"/>
+ <tocsect4 name="8.2.1.2 How to determine which catalog to be used" url="chapters_8.html#SEC134"/>
+ <tocsect4 name="8.2.1.3 Additional functions for more complicated situations" url="chapters_8.html#SEC135"/>
+ <tocsect4 name="8.2.1.4 How to specify the output character set gettext uses" url="chapters_8.html#SEC137"/>
+ <tocsect4 name="8.2.1.5 How to use gettext in GUI programs" url="chapters_8.html#SEC138"/>
+ <tocsect4 name="8.2.1.6 User influence on gettext" url="chapters_8.html#SEC139"/>
+ </tocsect3>
+ <tocsect3 name="8.2.2 Programs to handle message catalogs for gettext" url="chapters_8.html#SEC140"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="9. Searching and Sorting" url="chapters_9.html#SEC141">
+ <tocsect2 name="9.1 Defining the Comparison Function" url="chapters_9.html#SEC142"/>
+ <tocsect2 name="9.2 Array Search Function" url="chapters_9.html#SEC143"/>
+ <tocsect2 name="9.3 Array Sort Function" url="chapters_9.html#SEC144"/>
+ <tocsect2 name="9.4 Searching and Sorting Example" url="chapters_9.html#SEC145"/>
+ <tocsect2 name="9.5 The hsearch function." url="chapters_9.html#SEC146"/>
+ <tocsect2 name="9.6 The tsearch function." url="chapters_9.html#SEC147"/>
+</tocsect1>
+<tocsect1 name="10. Pattern Matching" url="chapters_10.html#SEC148">
+ <tocsect2 name="10.1 Wildcard Matching" url="chapters_10.html#SEC149"/>
+ <tocsect2 name="10.2 Globbing" url="chapters_10.html#SEC150">
+ <tocsect3 name="10.2.1 Calling glob" url="chapters_10.html#SEC151"/>
+ <tocsect3 name="10.2.2 Flags for Globbing" url="chapters_10.html#SEC152"/>
+ <tocsect3 name="10.2.3 More Flags for Globbing" url="chapters_10.html#SEC153"/>
+ </tocsect2>
+ <tocsect2 name="10.3 Regular Expression Matching" url="chapters_10.html#SEC154">
+ <tocsect3 name="10.3.1 POSIX Regular Expression Compilation" url="chapters_10.html#SEC155"/>
+ <tocsect3 name="10.3.2 Flags for POSIX Regular Expressions" url="chapters_10.html#SEC156"/>
+ <tocsect3 name="10.3.3 Matching a Compiled POSIX Regular Expression" url="chapters_10.html#SEC157"/>
+ <tocsect3 name="10.3.4 Match Results with Subexpressions" url="chapters_10.html#SEC158"/>
+ <tocsect3 name="10.3.5 Complications in Subexpression Matching" url="chapters_10.html#SEC159"/>
+ <tocsect3 name="10.3.6 POSIX Regexp Matching Cleanup" url="chapters_10.html#SEC160"/>
+ </tocsect2>
+ <tocsect2 name="10.4 Shell-Style Word Expansion" url="chapters_10.html#SEC161">
+ <tocsect3 name="10.4.1 The Stages of Word Expansion" url="chapters_10.html#SEC162"/>
+ <tocsect3 name="10.4.2 Calling wordexp" url="chapters_10.html#SEC163"/>
+ <tocsect3 name="10.4.3 Flags for Word Expansion" url="chapters_10.html#SEC164"/>
+ <tocsect3 name="10.4.4 wordexp Example" url="chapters_10.html#SEC165"/>
+ <tocsect3 name="10.4.5 Details of Tilde Expansion" url="chapters_10.html#SEC166"/>
+ <tocsect3 name="10.4.6 Details of Variable Substitution" url="chapters_10.html#SEC167"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="11. Input/Output Overview" url="chapters_11.html#SEC168">
+ <tocsect2 name="11.1 Input/Output Concepts" url="chapters_11.html#SEC169">
+ <tocsect3 name="11.1.1 Streams and File Descriptors" url="chapters_11.html#SEC170"/>
+ <tocsect3 name="11.1.2 File Position" url="chapters_11.html#SEC171"/>
+ </tocsect2>
+ <tocsect2 name="11.2 File Names" url="chapters_11.html#SEC172">
+ <tocsect3 name="11.2.1 Directories" url="chapters_11.html#SEC173"/>
+ <tocsect3 name="11.2.2 File Name Resolution" url="chapters_11.html#SEC174"/>
+ <tocsect3 name="11.2.3 File Name Errors" url="chapters_11.html#SEC175"/>
+ <tocsect3 name="11.2.4 Portability of File Names" url="chapters_11.html#SEC176"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="12. Input/Output on Streams" url="chapters_12.html#SEC177">
+ <tocsect2 name="12.1 Streams" url="chapters_12.html#SEC178"/>
+ <tocsect2 name="12.2 Standard Streams" url="chapters_12.html#SEC179"/>
+ <tocsect2 name="12.3 Opening Streams" url="chapters_12.html#SEC180"/>
+ <tocsect2 name="12.4 Closing Streams" url="chapters_12.html#SEC181"/>
+ <tocsect2 name="12.5 Streams and Threads" url="chapters_12.html#SEC182"/>
+ <tocsect2 name="12.6 Streams in Internationalized Applications" url="chapters_12.html#SEC183"/>
+ <tocsect2 name="12.7 Simple Output by Characters or Lines" url="chapters_12.html#SEC184"/>
+ <tocsect2 name="12.8 Character Input" url="chapters_12.html#SEC185"/>
+ <tocsect2 name="12.9 Line-Oriented Input" url="chapters_12.html#SEC186"/>
+ <tocsect2 name="12.10 Unreading" url="chapters_12.html#SEC187">
+ <tocsect3 name="12.10.1 What Unreading Means" url="chapters_12.html#SEC188"/>
+ <tocsect3 name="12.10.2 Using ungetc To Do Unreading" url="chapters_12.html#SEC189"/>
+ </tocsect2>
+ <tocsect2 name="12.11 Block Input/Output" url="chapters_12.html#SEC190"/>
+ <tocsect2 name="12.12 Formatted Output" url="chapters_12.html#SEC191">
+ <tocsect3 name="12.12.1 Formatted Output Basics" url="chapters_12.html#SEC192"/>
+ <tocsect3 name="12.12.2 Output Conversion Syntax" url="chapters_12.html#SEC193"/>
+ <tocsect3 name="12.12.3 Table of Output Conversions" url="chapters_12.html#SEC194"/>
+ <tocsect3 name="12.12.4 Integer Conversions" url="chapters_12.html#SEC195"/>
+ <tocsect3 name="12.12.5 Floating-Point Conversions" url="chapters_12.html#SEC196"/>
+ <tocsect3 name="12.12.6 Other Output Conversions" url="chapters_12.html#SEC197"/>
+ <tocsect3 name="12.12.7 Formatted Output Functions" url="chapters_12.html#SEC198"/>
+ <tocsect3 name="12.12.8 Dynamically Allocating Formatted Output" url="chapters_12.html#SEC199"/>
+ <tocsect3 name="12.12.9 Variable Arguments Output Functions" url="chapters_12.html#SEC200"/>
+ <tocsect3 name="12.12.10 Parsing a Template String" url="chapters_12.html#SEC201"/>
+ <tocsect3 name="12.12.11 Example of Parsing a Template String" url="chapters_12.html#SEC202"/>
+ </tocsect2>
+ <tocsect2 name="12.13 Customizing printf" url="chapters_12.html#SEC203">
+ <tocsect3 name="12.13.1 Registering New Conversions" url="chapters_12.html#SEC204"/>
+ <tocsect3 name="12.13.2 Conversion Specifier Options" url="chapters_12.html#SEC205"/>
+ <tocsect3 name="12.13.3 Defining the Output Handler" url="chapters_12.html#SEC206"/>
+ <tocsect3 name="12.13.4 printf Extension Example" url="chapters_12.html#SEC207"/>
+ <tocsect3 name="12.13.5 Predefined printf Handlers" url="chapters_12.html#SEC208"/>
+ </tocsect2>
+ <tocsect2 name="12.14 Formatted Input" url="chapters_12.html#SEC209">
+ <tocsect3 name="12.14.1 Formatted Input Basics" url="chapters_12.html#SEC210"/>
+ <tocsect3 name="12.14.2 Input Conversion Syntax" url="chapters_12.html#SEC211"/>
+ <tocsect3 name="12.14.3 Table of Input Conversions" url="chapters_12.html#SEC212"/>
+ <tocsect3 name="12.14.4 Numeric Input Conversions" url="chapters_12.html#SEC213"/>
+ <tocsect3 name="12.14.5 String Input Conversions" url="chapters_12.html#SEC214"/>
+ <tocsect3 name="12.14.6 Dynamically Allocating String Conversions" url="chapters_12.html#SEC215"/>
+ <tocsect3 name="12.14.7 Other Input Conversions" url="chapters_12.html#SEC216"/>
+ <tocsect3 name="12.14.8 Formatted Input Functions" url="chapters_12.html#SEC217"/>
+ <tocsect3 name="12.14.9 Variable Arguments Input Functions" url="chapters_12.html#SEC218"/>
+ </tocsect2>
+ <tocsect2 name="12.15 End-Of-File and Errors" url="chapters_12.html#SEC219"/>
+ <tocsect2 name="12.16 Recovering from errors" url="chapters_12.html#SEC220"/>
+ <tocsect2 name="12.17 Text and Binary Streams" url="chapters_12.html#SEC221"/>
+ <tocsect2 name="12.18 File Positioning" url="chapters_12.html#SEC222"/>
+ <tocsect2 name="12.19 Portable File-Position Functions" url="chapters_12.html#SEC223"/>
+ <tocsect2 name="12.20 Stream Buffering" url="chapters_12.html#SEC224">
+ <tocsect3 name="12.20.1 Buffering Concepts" url="chapters_12.html#SEC225"/>
+ <tocsect3 name="12.20.2 Flushing Buffers" url="chapters_12.html#SEC226"/>
+ <tocsect3 name="12.20.3 Controlling Which Kind of Buffering" url="chapters_12.html#SEC227"/>
+ </tocsect2>
+ <tocsect2 name="12.21 Other Kinds of Streams" url="chapters_12.html#SEC228">
+ <tocsect3 name="12.21.1 String Streams" url="chapters_12.html#SEC229"/>
+ <tocsect3 name="12.21.2 Obstack Streams" url="chapters_12.html#SEC230"/>
+ <tocsect3 name="12.21.3 Programming Your Own Custom Streams" url="chapters_12.html#SEC231">
+ <tocsect4 name="12.21.3.1 Custom Streams and Cookies" url="chapters_12.html#SEC232"/>
+ <tocsect4 name="12.21.3.2 Custom Stream Hook Functions" url="chapters_12.html#SEC233"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="12.22 Formatted Messages" url="chapters_12.html#SEC234">
+ <tocsect3 name="12.22.1 Printing Formatted Messages" url="chapters_12.html#SEC235"/>
+ <tocsect3 name="12.22.2 Adding Severity Classes" url="chapters_12.html#SEC236"/>
+ <tocsect3 name="12.22.3 How to use fmtmsg and addseverity" url="chapters_12.html#SEC237"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="13. Low-Level Input/Output" url="chapters_13.html#SEC238">
+ <tocsect2 name="13.1 Opening and Closing Files" url="chapters_13.html#SEC239"/>
+ <tocsect2 name="13.2 Input and Output Primitives" url="chapters_13.html#SEC240"/>
+ <tocsect2 name="13.3 Setting the File Position of a Descriptor" url="chapters_13.html#SEC241"/>
+ <tocsect2 name="13.4 Descriptors and Streams" url="chapters_13.html#SEC242"/>
+ <tocsect2 name="13.5 Dangers of Mixing Streams and Descriptors" url="chapters_13.html#SEC243">
+ <tocsect3 name="13.5.1 Linked Channels" url="chapters_13.html#SEC244"/>
+ <tocsect3 name="13.5.2 Independent Channels" url="chapters_13.html#SEC245"/>
+ <tocsect3 name="13.5.3 Cleaning Streams" url="chapters_13.html#SEC246"/>
+ </tocsect2>
+ <tocsect2 name="13.6 Fast Scatter-Gather I/O" url="chapters_13.html#SEC247"/>
+ <tocsect2 name="13.7 Memory-mapped I/O" url="chapters_13.html#SEC248"/>
+ <tocsect2 name="13.8 Waiting for Input or Output" url="chapters_13.html#SEC249"/>
+ <tocsect2 name="13.9 Synchronizing I/O operations" url="chapters_13.html#SEC250"/>
+ <tocsect2 name="13.10 Perform I/O Operations in Parallel" url="chapters_13.html#SEC251">
+ <tocsect3 name="13.10.1 Asynchronous Read and Write Operations" url="chapters_13.html#SEC252"/>
+ <tocsect3 name="13.10.2 Getting the Status of AIO Operations" url="chapters_13.html#SEC253"/>
+ <tocsect3 name="13.10.3 Getting into a Consistent State" url="chapters_13.html#SEC254"/>
+ <tocsect3 name="13.10.4 Cancellation of AIO Operations" url="chapters_13.html#SEC255"/>
+ <tocsect3 name="13.10.5 How to optimize the AIO implementation" url="chapters_13.html#SEC256"/>
+ </tocsect2>
+ <tocsect2 name="13.11 Control Operations on Files" url="chapters_13.html#SEC257"/>
+ <tocsect2 name="13.12 Duplicating Descriptors" url="chapters_13.html#SEC258"/>
+ <tocsect2 name="13.13 File Descriptor Flags" url="chapters_13.html#SEC259"/>
+ <tocsect2 name="13.14 File Status Flags" url="chapters_13.html#SEC260">
+ <tocsect3 name="13.14.1 File Access Modes" url="chapters_13.html#SEC261"/>
+ <tocsect3 name="13.14.2 Open-time Flags" url="chapters_13.html#SEC262"/>
+ <tocsect3 name="13.14.3 I/O Operating Modes" url="chapters_13.html#SEC263"/>
+ <tocsect3 name="13.14.4 Getting and Setting File Status Flags" url="chapters_13.html#SEC264"/>
+ </tocsect2>
+ <tocsect2 name="13.15 File Locks" url="chapters_13.html#SEC265"/>
+ <tocsect2 name="13.16 Interrupt-Driven Input" url="chapters_13.html#SEC266"/>
+ <tocsect2 name="13.17 Generic I/O Control operations" url="chapters_13.html#SEC267"/>
+</tocsect1>
+<tocsect1 name="14. File System Interface" url="chapters_14.html#SEC268">
+ <tocsect2 name="14.1 Working Directory" url="chapters_14.html#SEC269"/>
+ <tocsect2 name="14.2 Accessing Directories" url="chapters_14.html#SEC270">
+ <tocsect3 name="14.2.1 Format of a Directory Entry" url="chapters_14.html#SEC271"/>
+ <tocsect3 name="14.2.2 Opening a Directory Stream" url="chapters_14.html#SEC272"/>
+ <tocsect3 name="14.2.3 Reading and Closing a Directory Stream" url="chapters_14.html#SEC273"/>
+ <tocsect3 name="14.2.4 Simple Program to List a Directory" url="chapters_14.html#SEC274"/>
+ <tocsect3 name="14.2.5 Random Access in a Directory Stream" url="chapters_14.html#SEC275"/>
+ <tocsect3 name="14.2.6 Scanning the Content of a Directory" url="chapters_14.html#SEC276"/>
+ <tocsect3 name="14.2.7 Simple Program to List a Directory, Mark II" url="chapters_14.html#SEC277"/>
+ </tocsect2>
+ <tocsect2 name="14.3 Working with Directory Trees" url="chapters_14.html#SEC278"/>
+ <tocsect2 name="14.4 Hard Links" url="chapters_14.html#SEC279"/>
+ <tocsect2 name="14.5 Symbolic Links" url="chapters_14.html#SEC280"/>
+ <tocsect2 name="14.6 Deleting Files" url="chapters_14.html#SEC281"/>
+ <tocsect2 name="14.7 Renaming Files" url="chapters_14.html#SEC282"/>
+ <tocsect2 name="14.8 Creating Directories" url="chapters_14.html#SEC283"/>
+ <tocsect2 name="14.9 File Attributes" url="chapters_14.html#SEC284">
+ <tocsect3 name="14.9.1 The meaning of the File Attributes" url="chapters_14.html#SEC285"/>
+ <tocsect3 name="14.9.2 Reading the Attributes of a File" url="chapters_14.html#SEC286"/>
+ <tocsect3 name="14.9.3 Testing the Type of a File" url="chapters_14.html#SEC287"/>
+ <tocsect3 name="14.9.4 File Owner" url="chapters_14.html#SEC288"/>
+ <tocsect3 name="14.9.5 The Mode Bits for Access Permission" url="chapters_14.html#SEC289"/>
+ <tocsect3 name="14.9.6 How Your Access to a File is Decided" url="chapters_14.html#SEC290"/>
+ <tocsect3 name="14.9.7 Assigning File Permissions" url="chapters_14.html#SEC291"/>
+ <tocsect3 name="14.9.8 Testing Permission to Access a File" url="chapters_14.html#SEC292"/>
+ <tocsect3 name="14.9.9 File Times" url="chapters_14.html#SEC293"/>
+ <tocsect3 name="14.9.10 File Size" url="chapters_14.html#SEC294"/>
+ </tocsect2>
+ <tocsect2 name="14.10 Making Special Files" url="chapters_14.html#SEC295"/>
+ <tocsect2 name="14.11 Temporary Files" url="chapters_14.html#SEC296"/>
+</tocsect1>
+<tocsect1 name="15. Pipes and FIFOs" url="chapters_15.html#SEC297">
+ <tocsect2 name="15.1 Creating a Pipe" url="chapters_15.html#SEC298"/>
+ <tocsect2 name="15.2 Pipe to a Subprocess" url="chapters_15.html#SEC299"/>
+ <tocsect2 name="15.3 FIFO Special Files" url="chapters_15.html#SEC300"/>
+ <tocsect2 name="15.4 Atomicity of Pipe I/O" url="chapters_15.html#SEC301"/>
+</tocsect1>
+<tocsect1 name="16. Sockets" url="chapters_16.html#SEC302">
+ <tocsect2 name="16.1 Socket Concepts" url="chapters_16.html#SEC303"/>
+ <tocsect2 name="16.2 Communication Styles" url="chapters_16.html#SEC304"/>
+ <tocsect2 name="16.3 Socket Addresses" url="chapters_16.html#SEC305">
+ <tocsect3 name="16.3.1 Address Formats" url="chapters_16.html#SEC306"/>
+ <tocsect3 name="16.3.2 Setting the Address of a Socket" url="chapters_16.html#SEC307"/>
+ <tocsect3 name="16.3.3 Reading the Address of a Socket" url="chapters_16.html#SEC308"/>
+ </tocsect2>
+ <tocsect2 name="16.4 Interface Naming" url="chapters_16.html#SEC309"/>
+ <tocsect2 name="16.5 The Local Namespace" url="chapters_16.html#SEC310">
+ <tocsect3 name="16.5.1 Local Namespace Concepts" url="chapters_16.html#SEC311"/>
+ <tocsect3 name="16.5.2 Details of Local Namespace" url="chapters_16.html#SEC312"/>
+ <tocsect3 name="16.5.3 Example of Local-Namespace Sockets" url="chapters_16.html#SEC313"/>
+ </tocsect2>
+ <tocsect2 name="16.6 The Internet Namespace" url="chapters_16.html#SEC314">
+ <tocsect3 name="16.6.1 Internet Socket Address Formats" url="chapters_16.html#SEC315"/>
+ <tocsect3 name="16.6.2 Host Addresses" url="chapters_16.html#SEC316">
+ <tocsect4 name="16.6.2.1 Internet Host Addresses" url="chapters_16.html#SEC317"/>
+ <tocsect4 name="16.6.2.2 Host Address Data Type" url="chapters_16.html#SEC320"/>
+ <tocsect4 name="16.6.2.3 Host Address Functions" url="chapters_16.html#SEC321"/>
+ <tocsect4 name="16.6.2.4 Host Names" url="chapters_16.html#SEC322"/>
+ </tocsect3>
+ <tocsect3 name="16.6.3 Internet Ports" url="chapters_16.html#SEC323"/>
+ <tocsect3 name="16.6.4 The Services Database" url="chapters_16.html#SEC324"/>
+ <tocsect3 name="16.6.5 Byte Order Conversion" url="chapters_16.html#SEC325"/>
+ <tocsect3 name="16.6.6 Protocols Database" url="chapters_16.html#SEC326"/>
+ <tocsect3 name="16.6.7 Internet Socket Example" url="chapters_16.html#SEC327"/>
+ </tocsect2>
+ <tocsect2 name="16.7 Other Namespaces" url="chapters_16.html#SEC328"/>
+ <tocsect2 name="16.8 Opening and Closing Sockets" url="chapters_16.html#SEC329">
+ <tocsect3 name="16.8.1 Creating a Socket" url="chapters_16.html#SEC330"/>
+ <tocsect3 name="16.8.2 Closing a Socket" url="chapters_16.html#SEC331"/>
+ <tocsect3 name="16.8.3 Socket Pairs" url="chapters_16.html#SEC332"/>
+ </tocsect2>
+ <tocsect2 name="16.9 Using Sockets with Connections" url="chapters_16.html#SEC333">
+ <tocsect3 name="16.9.1 Making a Connection" url="chapters_16.html#SEC334"/>
+ <tocsect3 name="16.9.2 Listening for Connections" url="chapters_16.html#SEC335"/>
+ <tocsect3 name="16.9.3 Accepting Connections" url="chapters_16.html#SEC336"/>
+ <tocsect3 name="16.9.4 Who is Connected to Me?" url="chapters_16.html#SEC337"/>
+ <tocsect3 name="16.9.5 Transferring Data" url="chapters_16.html#SEC338">
+ <tocsect4 name="16.9.5.1 Sending Data" url="chapters_16.html#SEC339"/>
+ <tocsect4 name="16.9.5.2 Receiving Data" url="chapters_16.html#SEC340"/>
+ <tocsect4 name="16.9.5.3 Socket Data Options" url="chapters_16.html#SEC341"/>
+ </tocsect3>
+ <tocsect3 name="16.9.6 Byte Stream Socket Example" url="chapters_16.html#SEC342"/>
+ <tocsect3 name="16.9.7 Byte Stream Connection Server Example" url="chapters_16.html#SEC343"/>
+ <tocsect3 name="16.9.8 Out-of-Band Data" url="chapters_16.html#SEC344"/>
+ </tocsect2>
+ <tocsect2 name="16.10 Datagram Socket Operations" url="chapters_16.html#SEC345">
+ <tocsect3 name="16.10.1 Sending Datagrams" url="chapters_16.html#SEC346"/>
+ <tocsect3 name="16.10.2 Receiving Datagrams" url="chapters_16.html#SEC347"/>
+ <tocsect3 name="16.10.3 Datagram Socket Example" url="chapters_16.html#SEC348"/>
+ <tocsect3 name="16.10.4 Example of Reading Datagrams" url="chapters_16.html#SEC349"/>
+ </tocsect2>
+ <tocsect2 name="16.11 The inetd Daemon" url="chapters_16.html#SEC350">
+ <tocsect3 name="16.11.1 inetd Servers" url="chapters_16.html#SEC351"/>
+ <tocsect3 name="16.11.2 Configuring inetd" url="chapters_16.html#SEC352"/>
+ </tocsect2>
+ <tocsect2 name="16.12 Socket Options" url="chapters_16.html#SEC353">
+ <tocsect3 name="16.12.1 Socket Option Functions" url="chapters_16.html#SEC354"/>
+ <tocsect3 name="16.12.2 Socket-Level Options" url="chapters_16.html#SEC355"/>
+ </tocsect2>
+ <tocsect2 name="16.13 Networks Database" url="chapters_16.html#SEC356"/>
+</tocsect1>
+<tocsect1 name="17. Low-Level Terminal Interface" url="chapters_17.html#SEC357">
+ <tocsect2 name="17.1 Identifying Terminals" url="chapters_17.html#SEC358"/>
+ <tocsect2 name="17.2 I/O Queues" url="chapters_17.html#SEC359"/>
+ <tocsect2 name="17.3 Two Styles of Input: Canonical or Not" url="chapters_17.html#SEC360"/>
+ <tocsect2 name="17.4 Terminal Modes" url="chapters_17.html#SEC361">
+ <tocsect3 name="17.4.1 Terminal Mode Data Types" url="chapters_17.html#SEC362"/>
+ <tocsect3 name="17.4.2 Terminal Mode Functions" url="chapters_17.html#SEC363"/>
+ <tocsect3 name="17.4.3 Setting Terminal Modes Properly" url="chapters_17.html#SEC364"/>
+ <tocsect3 name="17.4.4 Input Modes" url="chapters_17.html#SEC365"/>
+ <tocsect3 name="17.4.5 Output Modes" url="chapters_17.html#SEC366"/>
+ <tocsect3 name="17.4.6 Control Modes" url="chapters_17.html#SEC367"/>
+ <tocsect3 name="17.4.7 Local Modes" url="chapters_17.html#SEC368"/>
+ <tocsect3 name="17.4.8 Line Speed" url="chapters_17.html#SEC369"/>
+ <tocsect3 name="17.4.9 Special Characters" url="chapters_17.html#SEC370">
+ <tocsect4 name="17.4.9.1 Characters for Input Editing" url="chapters_17.html#SEC371"/>
+ <tocsect4 name="17.4.9.2 Characters that Cause Signals" url="chapters_17.html#SEC372"/>
+ <tocsect4 name="17.4.9.3 Special Characters for Flow Control" url="chapters_17.html#SEC373"/>
+ <tocsect4 name="17.4.9.4 Other Special Characters" url="chapters_17.html#SEC374"/>
+ </tocsect3>
+ <tocsect3 name="17.4.10 Noncanonical Input" url="chapters_17.html#SEC375"/>
+ </tocsect2>
+ <tocsect2 name="17.5 BSD Terminal Modes" url="chapters_17.html#SEC376"/>
+ <tocsect2 name="17.6 Line Control Functions" url="chapters_17.html#SEC377"/>
+ <tocsect2 name="17.7 Noncanonical Mode Example" url="chapters_17.html#SEC378"/>
+ <tocsect2 name="17.8 Pseudo-Terminals" url="chapters_17.html#SEC379">
+ <tocsect3 name="17.8.1 Allocating Pseudo-Terminals" url="chapters_17.html#SEC380"/>
+ <tocsect3 name="17.8.2 Opening a Pseudo-Terminal Pair" url="chapters_17.html#SEC381"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="18. Syslog" url="chapters_18.html#SEC382">
+ <tocsect2 name="18.1 Overview of Syslog" url="chapters_18.html#SEC383"/>
+ <tocsect2 name="18.2 Submitting Syslog Messages" url="chapters_18.html#SEC384">
+ <tocsect3 name="18.2.1 openlog" url="chapters_18.html#SEC385"/>
+ <tocsect3 name="18.2.2 syslog, vsyslog" url="chapters_18.html#SEC386"/>
+ <tocsect3 name="18.2.3 closelog" url="chapters_18.html#SEC387"/>
+ <tocsect3 name="18.2.4 setlogmask" url="chapters_18.html#SEC388"/>
+ <tocsect3 name="18.2.5 Syslog Example" url="chapters_18.html#SEC389"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="19. Mathematics" url="chapters_19.html#SEC390">
+ <tocsect2 name="19.1 Predefined Mathematical Constants" url="chapters_19.html#SEC391"/>
+ <tocsect2 name="19.2 Trigonometric Functions" url="chapters_19.html#SEC392"/>
+ <tocsect2 name="19.3 Inverse Trigonometric Functions" url="chapters_19.html#SEC393"/>
+ <tocsect2 name="19.4 Exponentiation and Logarithms" url="chapters_19.html#SEC394"/>
+ <tocsect2 name="19.5 Hyperbolic Functions" url="chapters_19.html#SEC395"/>
+ <tocsect2 name="19.6 Special Functions" url="chapters_19.html#SEC396"/>
+ <tocsect2 name="19.7 Known Maximum Errors in Math Functions" url="chapters_19.html#SEC397"/>
+ <tocsect2 name="19.8 Pseudo-Random Numbers" url="chapters_19.html#SEC398">
+ <tocsect3 name="19.8.1 ISO C Random Number Functions" url="chapters_19.html#SEC399"/>
+ <tocsect3 name="19.8.2 BSD Random Number Functions" url="chapters_19.html#SEC400"/>
+ <tocsect3 name="19.8.3 SVID Random Number Function" url="chapters_19.html#SEC401"/>
+ </tocsect2>
+ <tocsect2 name="19.9 Is Fast Code or Small Code preferred?" url="chapters_19.html#SEC402"/>
+</tocsect1>
+<tocsect1 name="20. Arithmetic Functions" url="chapters_20.html#SEC403">
+ <tocsect2 name="20.1 Integers" url="chapters_20.html#SEC404"/>
+ <tocsect2 name="20.2 Integer Division" url="chapters_20.html#SEC405"/>
+ <tocsect2 name="20.3 Floating Point Numbers" url="chapters_20.html#SEC406"/>
+ <tocsect2 name="20.4 Floating-Point Number Classification Functions" url="chapters_20.html#SEC407"/>
+ <tocsect2 name="20.5 Errors in Floating-Point Calculations" url="chapters_20.html#SEC408">
+ <tocsect3 name="20.5.1 FP Exceptions" url="chapters_20.html#SEC409"/>
+ <tocsect3 name="20.5.2 Infinity and NaN" url="chapters_20.html#SEC410"/>
+ <tocsect3 name="20.5.3 Examining the FPU status word" url="chapters_20.html#SEC411"/>
+ <tocsect3 name="20.5.4 Error Reporting by Mathematical Functions" url="chapters_20.html#SEC412"/>
+ </tocsect2>
+ <tocsect2 name="20.6 Rounding Modes" url="chapters_20.html#SEC413"/>
+ <tocsect2 name="20.7 Floating-Point Control Functions" url="chapters_20.html#SEC414"/>
+ <tocsect2 name="20.8 Arithmetic Functions" url="chapters_20.html#SEC415">
+ <tocsect3 name="20.8.1 Absolute Value" url="chapters_20.html#SEC416"/>
+ <tocsect3 name="20.8.2 Normalization Functions" url="chapters_20.html#SEC417"/>
+ <tocsect3 name="20.8.3 Rounding Functions" url="chapters_20.html#SEC418"/>
+ <tocsect3 name="20.8.4 Remainder Functions" url="chapters_20.html#SEC419"/>
+ <tocsect3 name="20.8.5 Setting and modifying single bits of FP values" url="chapters_20.html#SEC420"/>
+ <tocsect3 name="20.8.6 Floating-Point Comparison Functions" url="chapters_20.html#SEC421"/>
+ <tocsect3 name="20.8.7 Miscellaneous FP arithmetic functions" url="chapters_20.html#SEC422"/>
+ </tocsect2>
+ <tocsect2 name="20.9 Complex Numbers" url="chapters_20.html#SEC423"/>
+ <tocsect2 name="20.10 Projections, Conjugates, and Decomposing of Complex Numbers" url="chapters_20.html#SEC424"/>
+ <tocsect2 name="20.11 Parsing of Numbers" url="chapters_20.html#SEC425">
+ <tocsect3 name="20.11.1 Parsing of Integers" url="chapters_20.html#SEC426"/>
+ <tocsect3 name="20.11.2 Parsing of Floats" url="chapters_20.html#SEC427"/>
+ </tocsect2>
+ <tocsect2 name="20.12 Old-fashioned System V number-to-string functions" url="chapters_20.html#SEC428"/>
+</tocsect1>
+<tocsect1 name="21. Date and Time" url="chapters_21.html#SEC429">
+ <tocsect2 name="21.1 Time Basics" url="chapters_21.html#SEC430"/>
+ <tocsect2 name="21.2 Elapsed Time" url="chapters_21.html#SEC431"/>
+ <tocsect2 name="21.3 Processor And CPU Time" url="chapters_21.html#SEC432">
+ <tocsect3 name="21.3.1 CPU Time Inquiry" url="chapters_21.html#SEC433"/>
+ <tocsect3 name="21.3.2 Processor Time Inquiry" url="chapters_21.html#SEC434"/>
+ </tocsect2>
+ <tocsect2 name="21.4 Calendar Time" url="chapters_21.html#SEC435">
+ <tocsect3 name="21.4.1 Simple Calendar Time" url="chapters_21.html#SEC436"/>
+ <tocsect3 name="21.4.2 High-Resolution Calendar" url="chapters_21.html#SEC437"/>
+ <tocsect3 name="21.4.3 Broken-down Time" url="chapters_21.html#SEC438"/>
+ <tocsect3 name="21.4.4 High Accuracy Clock" url="chapters_21.html#SEC439"/>
+ <tocsect3 name="21.4.5 Formatting Calendar Time" url="chapters_21.html#SEC440"/>
+ <tocsect3 name="21.4.6 Convert textual time and date information back" url="chapters_21.html#SEC441">
+ <tocsect4 name="21.4.6.1 Interpret string according to given format" url="chapters_21.html#SEC442"/>
+ <tocsect4 name="21.4.6.2 A More User-friendly Way to Parse Times and Dates" url="chapters_21.html#SEC443"/>
+ </tocsect3>
+ <tocsect3 name="21.4.7 Specifying the Time Zone with TZ" url="chapters_21.html#SEC444"/>
+ <tocsect3 name="21.4.8 Functions and Variables for Time Zones" url="chapters_21.html#SEC445"/>
+ <tocsect3 name="21.4.9 Time Functions Example" url="chapters_21.html#SEC446"/>
+ </tocsect2>
+ <tocsect2 name="21.5 Setting an Alarm" url="chapters_21.html#SEC447"/>
+ <tocsect2 name="21.6 Sleeping" url="chapters_21.html#SEC448"/>
+</tocsect1>
+<tocsect1 name="22. Resource Usage And Limitation" url="chapters_22.html#SEC449">
+ <tocsect2 name="22.1 Resource Usage" url="chapters_22.html#SEC450"/>
+ <tocsect2 name="22.2 Limiting Resource Usage" url="chapters_22.html#SEC451"/>
+ <tocsect2 name="22.3 Process CPU Priority And Scheduling" url="chapters_22.html#SEC452">
+ <tocsect3 name="22.3.1 Absolute Priority" url="chapters_22.html#SEC453">
+ <tocsect4 name="22.3.1.1 Using Absolute Priority" url="chapters_22.html#SEC454"/>
+ </tocsect3>
+ <tocsect3 name="22.3.2 Realtime Scheduling" url="chapters_22.html#SEC455"/>
+ <tocsect3 name="22.3.3 Basic Scheduling Functions" url="chapters_22.html#SEC456"/>
+ <tocsect3 name="22.3.4 Traditional Scheduling" url="chapters_22.html#SEC457">
+ <tocsect4 name="22.3.4.1 Introduction To Traditional Scheduling" url="chapters_22.html#SEC458"/>
+ <tocsect4 name="22.3.4.2 Functions For Traditional Scheduling" url="chapters_22.html#SEC459"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="22.4 Querying memory available resources" url="chapters_22.html#SEC460">
+ <tocsect3 name="22.4.1 Overview about traditional Unix memory handling" url="chapters_22.html#SEC461"/>
+ <tocsect3 name="22.4.2 How to get information about the memory subsystem?" url="chapters_22.html#SEC462"/>
+ </tocsect2>
+ <tocsect2 name="22.5 Learn about the processors available" url="chapters_22.html#SEC463"/>
+</tocsect1>
+<tocsect1 name="23. Non-Local Exits" url="chapters_23.html#SEC464">
+ <tocsect2 name="23.1 Introduction to Non-Local Exits" url="chapters_23.html#SEC465"/>
+ <tocsect2 name="23.2 Details of Non-Local Exits" url="chapters_23.html#SEC466"/>
+ <tocsect2 name="23.3 Non-Local Exits and Signals" url="chapters_23.html#SEC467"/>
+ <tocsect2 name="23.4 Complete Context Control" url="chapters_23.html#SEC468"/>
+</tocsect1>
+<tocsect1 name="24. Signal Handling" url="chapters_24.html#SEC470">
+ <tocsect2 name="24.1 Basic Concepts of Signals" url="chapters_24.html#SEC471">
+ <tocsect3 name="24.1.1 Some Kinds of Signals" url="chapters_24.html#SEC472"/>
+ <tocsect3 name="24.1.2 Concepts of Signal Generation" url="chapters_24.html#SEC473"/>
+ <tocsect3 name="24.1.3 How Signals Are Delivered" url="chapters_24.html#SEC474"/>
+ </tocsect2>
+ <tocsect2 name="24.2 Standard Signals" url="chapters_24.html#SEC475">
+ <tocsect3 name="24.2.1 Program Error Signals" url="chapters_24.html#SEC476"/>
+ <tocsect3 name="24.2.2 Termination Signals" url="chapters_24.html#SEC477"/>
+ <tocsect3 name="24.2.3 Alarm Signals" url="chapters_24.html#SEC478"/>
+ <tocsect3 name="24.2.4 Asynchronous I/O Signals" url="chapters_24.html#SEC479"/>
+ <tocsect3 name="24.2.5 Job Control Signals" url="chapters_24.html#SEC480"/>
+ <tocsect3 name="24.2.6 Operation Error Signals" url="chapters_24.html#SEC481"/>
+ <tocsect3 name="24.2.7 Miscellaneous Signals" url="chapters_24.html#SEC482"/>
+ <tocsect3 name="24.2.8 Signal Messages" url="chapters_24.html#SEC483"/>
+ </tocsect2>
+ <tocsect2 name="24.3 Specifying Signal Actions" url="chapters_24.html#SEC484">
+ <tocsect3 name="24.3.1 Basic Signal Handling" url="chapters_24.html#SEC485"/>
+ <tocsect3 name="24.3.2 Advanced Signal Handling" url="chapters_24.html#SEC486"/>
+ <tocsect3 name="24.3.3 Interaction of signal and sigaction" url="chapters_24.html#SEC487"/>
+ <tocsect3 name="24.3.4 sigaction Function Example" url="chapters_24.html#SEC488"/>
+ <tocsect3 name="24.3.5 Flags for sigaction" url="chapters_24.html#SEC489"/>
+ <tocsect3 name="24.3.6 Initial Signal Actions" url="chapters_24.html#SEC490"/>
+ </tocsect2>
+ <tocsect2 name="24.4 Defining Signal Handlers" url="chapters_24.html#SEC491">
+ <tocsect3 name="24.4.1 Signal Handlers that Return" url="chapters_24.html#SEC492"/>
+ <tocsect3 name="24.4.2 Handlers That Terminate the Process" url="chapters_24.html#SEC493"/>
+ <tocsect3 name="24.4.3 Nonlocal Control Transfer in Handlers" url="chapters_24.html#SEC494"/>
+ <tocsect3 name="24.4.4 Signals Arriving While a Handler Runs" url="chapters_24.html#SEC495"/>
+ <tocsect3 name="24.4.5 Signals Close Together Merge into One" url="chapters_24.html#SEC496"/>
+ <tocsect3 name="24.4.6 Signal Handling and Nonreentrant Functions" url="chapters_24.html#SEC497"/>
+ <tocsect3 name="24.4.7 Atomic Data Access and Signal Handling" url="chapters_24.html#SEC498">
+ <tocsect4 name="24.4.7.1 Problems with Non-Atomic Access" url="chapters_24.html#SEC499"/>
+ <tocsect4 name="24.4.7.2 Atomic Types" url="chapters_24.html#SEC500"/>
+ <tocsect4 name="24.4.7.3 Atomic Usage Patterns" url="chapters_24.html#SEC501"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="24.5 Primitives Interrupted by Signals" url="chapters_24.html#SEC502"/>
+ <tocsect2 name="24.6 Generating Signals" url="chapters_24.html#SEC503">
+ <tocsect3 name="24.6.1 Signaling Yourself" url="chapters_24.html#SEC504"/>
+ <tocsect3 name="24.6.2 Signaling Another Process" url="chapters_24.html#SEC505"/>
+ <tocsect3 name="24.6.3 Permission for using kill" url="chapters_24.html#SEC506"/>
+ <tocsect3 name="24.6.4 Using kill for Communication" url="chapters_24.html#SEC507"/>
+ </tocsect2>
+ <tocsect2 name="24.7 Blocking Signals" url="chapters_24.html#SEC508">
+ <tocsect3 name="24.7.1 Why Blocking Signals is Useful" url="chapters_24.html#SEC509"/>
+ <tocsect3 name="24.7.2 Signal Sets" url="chapters_24.html#SEC510"/>
+ <tocsect3 name="24.7.3 Process Signal Mask" url="chapters_24.html#SEC511"/>
+ <tocsect3 name="24.7.4 Blocking to Test for Delivery of a Signal" url="chapters_24.html#SEC512"/>
+ <tocsect3 name="24.7.5 Blocking Signals for a Handler" url="chapters_24.html#SEC513"/>
+ <tocsect3 name="24.7.6 Checking for Pending Signals" url="chapters_24.html#SEC514"/>
+ <tocsect3 name="24.7.7 Remembering a Signal to Act On Later" url="chapters_24.html#SEC515"/>
+ </tocsect2>
+ <tocsect2 name="24.8 Waiting for a Signal" url="chapters_24.html#SEC516">
+ <tocsect3 name="24.8.1 Using pause" url="chapters_24.html#SEC517"/>
+ <tocsect3 name="24.8.2 Problems with pause" url="chapters_24.html#SEC518"/>
+ <tocsect3 name="24.8.3 Using sigsuspend" url="chapters_24.html#SEC519"/>
+ </tocsect2>
+ <tocsect2 name="24.9 Using a Separate Signal Stack" url="chapters_24.html#SEC520"/>
+ <tocsect2 name="24.10 BSD Signal Handling" url="chapters_24.html#SEC521">
+ <tocsect3 name="24.10.1 BSD Function to Establish a Handler" url="chapters_24.html#SEC522"/>
+ <tocsect3 name="24.10.2 BSD Functions for Blocking Signals" url="chapters_24.html#SEC523"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="25. The Basic Program/System Interface" url="chapters_25.html#SEC524">
+ <tocsect2 name="25.1 Program Arguments" url="chapters_25.html#SEC525">
+ <tocsect3 name="25.1.1 Program Argument Syntax Conventions" url="chapters_25.html#SEC526"/>
+ <tocsect3 name="25.1.2 Parsing Program Arguments" url="chapters_25.html#SEC527"/>
+ </tocsect2>
+ <tocsect2 name="25.2 Parsing program options using getopt" url="chapters_25.html#SEC528">
+ <tocsect3 name="25.2.1 Using the getopt function" url="chapters_25.html#SEC529"/>
+ <tocsect3 name="25.2.2 Example of Parsing Arguments with getopt" url="chapters_25.html#SEC530"/>
+ <tocsect3 name="25.2.3 Parsing Long Options with getopt_long" url="chapters_25.html#SEC531"/>
+ <tocsect3 name="25.2.4 Example of Parsing Long Options with getopt_long" url="chapters_25.html#SEC532"/>
+ </tocsect2>
+ <tocsect2 name="25.3 Parsing Program Options with Argp" url="chapters_25.html#SEC533">
+ <tocsect3 name="25.3.1 The argp_parse Function" url="chapters_25.html#SEC534"/>
+ <tocsect3 name="25.3.2 Argp Global Variables" url="chapters_25.html#SEC535"/>
+ <tocsect3 name="25.3.3 Specifying Argp Parsers" url="chapters_25.html#SEC536"/>
+ <tocsect3 name="25.3.4 Specifying Options in an Argp Parser" url="chapters_25.html#SEC537">
+ <tocsect4 name="25.3.4.1 Flags for Argp Options" url="chapters_25.html#SEC538"/>
+ </tocsect3>
+ <tocsect3 name="25.3.5 Argp Parser Functions" url="chapters_25.html#SEC539">
+ <tocsect4 name="25.3.5.1 Special Keys for Argp Parser Functions" url="chapters_25.html#SEC540"/>
+ <tocsect4 name="25.3.5.2 Functions For Use in Argp Parsers" url="chapters_25.html#SEC541"/>
+ <tocsect4 name="25.3.5.3 Argp Parsing State" url="chapters_25.html#SEC542"/>
+ </tocsect3>
+ <tocsect3 name="25.3.6 Combining Multiple Argp Parsers" url="chapters_25.html#SEC543"/>
+ <tocsect3 name="25.3.7 Flags for argp_parse" url="chapters_25.html#SEC544"/>
+ <tocsect3 name="25.3.8 Customizing Argp Help Output" url="chapters_25.html#SEC545">
+ <tocsect4 name="25.3.8.1 Special Keys for Argp Help Filter Functions" url="chapters_25.html#SEC546"/>
+ </tocsect3>
+ <tocsect3 name="25.3.9 The argp_help Function" url="chapters_25.html#SEC547"/>
+ <tocsect3 name="25.3.10 Flags for the argp_help Function" url="chapters_25.html#SEC548"/>
+ <tocsect3 name="25.3.11 Argp Examples" url="chapters_25.html#SEC549">
+ <tocsect4 name="25.3.11.1 A Minimal Program Using Argp" url="chapters_25.html#SEC550"/>
+ <tocsect4 name="25.3.11.2 A Program Using Argp with Only Default Options" url="chapters_25.html#SEC551"/>
+ <tocsect4 name="25.3.11.3 A Program Using Argp with User Options" url="chapters_25.html#SEC552"/>
+ <tocsect4 name="25.3.11.4 A Program Using Multiple Combined Argp Parsers" url="chapters_25.html#SEC553"/>
+ </tocsect3>
+ <tocsect3 name="25.3.12 Argp User Customization" url="chapters_25.html#SEC554">
+ <tocsect4 name="25.3.12.1 Parsing of Suboptions" url="chapters_25.html#SEC555"/>
+ </tocsect3>
+ <tocsect3 name="25.3.13 Parsing of Suboptions Example" url="chapters_25.html#SEC556"/>
+ </tocsect2>
+ <tocsect2 name="25.4 Environment Variables" url="chapters_25.html#SEC557">
+ <tocsect3 name="25.4.1 Environment Access" url="chapters_25.html#SEC558"/>
+ <tocsect3 name="25.4.2 Standard Environment Variables" url="chapters_25.html#SEC559"/>
+ </tocsect2>
+ <tocsect2 name="25.5 System Calls" url="chapters_25.html#SEC560"/>
+ <tocsect2 name="25.6 Program Termination" url="chapters_25.html#SEC561">
+ <tocsect3 name="25.6.1 Normal Termination" url="chapters_25.html#SEC562"/>
+ <tocsect3 name="25.6.2 Exit Status" url="chapters_25.html#SEC563"/>
+ <tocsect3 name="25.6.3 Cleanups on Exit" url="chapters_25.html#SEC564"/>
+ <tocsect3 name="25.6.4 Aborting a Program" url="chapters_25.html#SEC565"/>
+ <tocsect3 name="25.6.5 Termination Internals" url="chapters_25.html#SEC566"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="26. Processes" url="chapters_26.html#SEC567">
+ <tocsect2 name="26.1 Running a Command" url="chapters_26.html#SEC568"/>
+ <tocsect2 name="26.2 Process Creation Concepts" url="chapters_26.html#SEC569"/>
+ <tocsect2 name="26.3 Process Identification" url="chapters_26.html#SEC570"/>
+ <tocsect2 name="26.4 Creating a Process" url="chapters_26.html#SEC571"/>
+ <tocsect2 name="26.5 Executing a File" url="chapters_26.html#SEC572"/>
+ <tocsect2 name="26.6 Process Completion" url="chapters_26.html#SEC573"/>
+ <tocsect2 name="26.7 Process Completion Status" url="chapters_26.html#SEC574"/>
+ <tocsect2 name="26.8 BSD Process Wait Functions" url="chapters_26.html#SEC575"/>
+ <tocsect2 name="26.9 Process Creation Example" url="chapters_26.html#SEC576"/>
+</tocsect1>
+<tocsect1 name="27. Job Control" url="chapters_27.html#SEC577">
+ <tocsect2 name="27.1 Concepts of Job Control" url="chapters_27.html#SEC578"/>
+ <tocsect2 name="27.2 Job Control is Optional" url="chapters_27.html#SEC579"/>
+ <tocsect2 name="27.3 Controlling Terminal of a Process" url="chapters_27.html#SEC580"/>
+ <tocsect2 name="27.4 Access to the Controlling Terminal" url="chapters_27.html#SEC581"/>
+ <tocsect2 name="27.5 Orphaned Process Groups" url="chapters_27.html#SEC582"/>
+ <tocsect2 name="27.6 Implementing a Job Control Shell" url="chapters_27.html#SEC583">
+ <tocsect3 name="27.6.1 Data Structures for the Shell" url="chapters_27.html#SEC584"/>
+ <tocsect3 name="27.6.2 Initializing the Shell" url="chapters_27.html#SEC585"/>
+ <tocsect3 name="27.6.3 Launching Jobs" url="chapters_27.html#SEC586"/>
+ <tocsect3 name="27.6.4 Foreground and Background" url="chapters_27.html#SEC587"/>
+ <tocsect3 name="27.6.5 Stopped and Terminated Jobs" url="chapters_27.html#SEC588"/>
+ <tocsect3 name="27.6.6 Continuing Stopped Jobs" url="chapters_27.html#SEC589"/>
+ <tocsect3 name="27.6.7 The Missing Pieces" url="chapters_27.html#SEC590"/>
+ </tocsect2>
+ <tocsect2 name="27.7 Functions for Job Control" url="chapters_27.html#SEC591">
+ <tocsect3 name="27.7.1 Identifying the Controlling Terminal" url="chapters_27.html#SEC592"/>
+ <tocsect3 name="27.7.2 Process Group Functions" url="chapters_27.html#SEC593"/>
+ <tocsect3 name="27.7.3 Functions for Controlling Terminal Access" url="chapters_27.html#SEC594"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="28. System Databases and Name Service Switch" url="chapters_28.html#SEC595">
+ <tocsect2 name="28.1 NSS Basics" url="chapters_28.html#SEC596"/>
+ <tocsect2 name="28.2 The NSS Configuration File" url="chapters_28.html#SEC597">
+ <tocsect3 name="28.2.1 Services in the NSS configuration File" url="chapters_28.html#SEC598"/>
+ <tocsect3 name="28.2.2 Actions in the NSS configuration" url="chapters_28.html#SEC599"/>
+ <tocsect3 name="28.2.3 Notes on the NSS Configuration File" url="chapters_28.html#SEC600"/>
+ </tocsect2>
+ <tocsect2 name="28.3 NSS Module Internals" url="chapters_28.html#SEC601">
+ <tocsect3 name="28.3.1 The Naming Scheme of the NSS Modules" url="chapters_28.html#SEC602"/>
+ <tocsect3 name="28.3.2 The Interface of the Function in NSS Modules" url="chapters_28.html#SEC603"/>
+ </tocsect2>
+ <tocsect2 name="28.4 Extending NSS" url="chapters_28.html#SEC604">
+ <tocsect3 name="28.4.1 Adding another Service to NSS" url="chapters_28.html#SEC605"/>
+ <tocsect3 name="28.4.2 Internals of the NSS Module Functions" url="chapters_28.html#SEC606"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="29. Users and Groups" url="chapters_29.html#SEC607">
+ <tocsect2 name="29.1 User and Group IDs" url="chapters_29.html#SEC608"/>
+ <tocsect2 name="29.2 The Persona of a Process" url="chapters_29.html#SEC609"/>
+ <tocsect2 name="29.3 Why Change the Persona of a Process?" url="chapters_29.html#SEC610"/>
+ <tocsect2 name="29.4 How an Application Can Change Persona" url="chapters_29.html#SEC611"/>
+ <tocsect2 name="29.5 Reading the Persona of a Process" url="chapters_29.html#SEC612"/>
+ <tocsect2 name="29.6 Setting the User ID" url="chapters_29.html#SEC613"/>
+ <tocsect2 name="29.7 Setting the Group IDs" url="chapters_29.html#SEC614"/>
+ <tocsect2 name="29.8 Enabling and Disabling Setuid Access" url="chapters_29.html#SEC615"/>
+ <tocsect2 name="29.9 Setuid Program Example" url="chapters_29.html#SEC616"/>
+ <tocsect2 name="29.10 Tips for Writing Setuid Programs" url="chapters_29.html#SEC617"/>
+ <tocsect2 name="29.11 Identifying Who Logged In" url="chapters_29.html#SEC618"/>
+ <tocsect2 name="29.12 The User Accounting Database" url="chapters_29.html#SEC619">
+ <tocsect3 name="29.12.1 Manipulating the User Accounting Database" url="chapters_29.html#SEC620"/>
+ <tocsect3 name="29.12.2 XPG User Accounting Database Functions" url="chapters_29.html#SEC621"/>
+ <tocsect3 name="29.12.3 Logging In and Out" url="chapters_29.html#SEC622"/>
+ </tocsect2>
+ <tocsect2 name="29.13 User Database" url="chapters_29.html#SEC623">
+ <tocsect3 name="29.13.1 The Data Structure that Describes a User" url="chapters_29.html#SEC624"/>
+ <tocsect3 name="29.13.2 Looking Up One User" url="chapters_29.html#SEC625"/>
+ <tocsect3 name="29.13.3 Scanning the List of All Users" url="chapters_29.html#SEC626"/>
+ <tocsect3 name="29.13.4 Writing a User Entry" url="chapters_29.html#SEC627"/>
+ </tocsect2>
+ <tocsect2 name="29.14 Group Database" url="chapters_29.html#SEC628">
+ <tocsect3 name="29.14.1 The Data Structure for a Group" url="chapters_29.html#SEC629"/>
+ <tocsect3 name="29.14.2 Looking Up One Group" url="chapters_29.html#SEC630"/>
+ <tocsect3 name="29.14.3 Scanning the List of All Groups" url="chapters_29.html#SEC631"/>
+ </tocsect2>
+ <tocsect2 name="29.15 User and Group Database Example" url="chapters_29.html#SEC632"/>
+ <tocsect2 name="29.16 Netgroup Database" url="chapters_29.html#SEC633">
+ <tocsect3 name="29.16.1 Netgroup Data" url="chapters_29.html#SEC634"/>
+ <tocsect3 name="29.16.2 Looking up one Netgroup" url="chapters_29.html#SEC635"/>
+ <tocsect3 name="29.16.3 Testing for Netgroup Membership" url="chapters_29.html#SEC636"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="30. System Management" url="chapters_30.html#SEC637">
+ <tocsect2 name="30.1 Host Identification" url="chapters_30.html#SEC638"/>
+ <tocsect2 name="30.2 Platform Type Identification" url="chapters_30.html#SEC639"/>
+ <tocsect2 name="30.3 Controlling and Querying Mounts" url="chapters_30.html#SEC640">
+ <tocsect3 name="30.3.1 Mount Information" url="chapters_30.html#SEC641">
+ <tocsect4 name="30.3.1.1 The `fstab' file" url="chapters_30.html#SEC642"/>
+ <tocsect4 name="30.3.1.2 The `mtab' file" url="chapters_30.html#SEC643"/>
+ <tocsect4 name="30.3.1.3 Other (Non-libc) Sources of Mount Information" url="chapters_30.html#SEC644"/>
+ </tocsect3>
+ <tocsect3 name="30.3.2 Mount, Unmount, Remount" url="chapters_30.html#SEC645"/>
+ </tocsect2>
+ <tocsect2 name="30.4 System Parameters" url="chapters_30.html#SEC646"/>
+</tocsect1>
+<tocsect1 name="31. System Configuration Parameters" url="chapters_31.html#SEC647">
+ <tocsect2 name="31.1 General Capacity Limits" url="chapters_31.html#SEC648"/>
+ <tocsect2 name="31.2 Overall System Options" url="chapters_31.html#SEC649"/>
+ <tocsect2 name="31.3 Which Version of POSIX is Supported" url="chapters_31.html#SEC650"/>
+ <tocsect2 name="31.4 Using sysconf" url="chapters_31.html#SEC651">
+ <tocsect3 name="31.4.1 Definition of sysconf" url="chapters_31.html#SEC652"/>
+ <tocsect3 name="31.4.2 Constants for sysconf Parameters" url="chapters_31.html#SEC653"/>
+ <tocsect3 name="31.4.3 Examples of sysconf" url="chapters_31.html#SEC654"/>
+ </tocsect2>
+ <tocsect2 name="31.5 Minimum Values for General Capacity Limits" url="chapters_31.html#SEC655"/>
+ <tocsect2 name="31.6 Limits on File System Capacity" url="chapters_31.html#SEC656"/>
+ <tocsect2 name="31.7 Optional Features in File Support" url="chapters_31.html#SEC657"/>
+ <tocsect2 name="31.8 Minimum Values for File System Limits" url="chapters_31.html#SEC658"/>
+ <tocsect2 name="31.9 Using pathconf" url="chapters_31.html#SEC659"/>
+ <tocsect2 name="31.10 Utility Program Capacity Limits" url="chapters_31.html#SEC660"/>
+ <tocsect2 name="31.11 Minimum Values for Utility Limits" url="chapters_31.html#SEC661"/>
+ <tocsect2 name="31.12 String-Valued Parameters" url="chapters_31.html#SEC662"/>
+</tocsect1>
+<tocsect1 name="32. DES Encryption and Password Handling" url="chapters_32.html#SEC663">
+ <tocsect2 name="32.1 Legal Problems" url="chapters_32.html#SEC664"/>
+ <tocsect2 name="32.2 Reading Passwords" url="chapters_32.html#SEC665"/>
+ <tocsect2 name="32.3 Encrypting Passwords" url="chapters_32.html#SEC666"/>
+ <tocsect2 name="32.4 DES Encryption" url="chapters_32.html#SEC667"/>
+</tocsect1>
+<tocsect1 name="33. Debugging support" url="chapters_33.html#SEC668">
+ <tocsect2 name="33.1 Backtraces" url="chapters_33.html#SEC669"/>
+</tocsect1>
+<tocsect1 name="34. POSIX Threads" url="chapters_34.html#SEC670">
+ <tocsect2 name="34.1 Basic Thread Operations" url="chapters_34.html#SEC671"/>
+ <tocsect2 name="34.2 Thread Attributes" url="chapters_34.html#SEC672"/>
+ <tocsect2 name="34.3 Cancellation" url="chapters_34.html#SEC673"/>
+ <tocsect2 name="34.4 Cleanup Handlers" url="chapters_34.html#SEC674"/>
+ <tocsect2 name="34.5 Mutexes" url="chapters_34.html#SEC675"/>
+ <tocsect2 name="34.6 Condition Variables" url="chapters_34.html#SEC676"/>
+ <tocsect2 name="34.7 POSIX Semaphores" url="chapters_34.html#SEC677"/>
+ <tocsect2 name="34.8 Thread-Specific Data" url="chapters_34.html#SEC678"/>
+ <tocsect2 name="34.9 Threads and Signal Handling" url="chapters_34.html#SEC679"/>
+ <tocsect2 name="34.10 Threads and Fork" url="chapters_34.html#SEC680"/>
+ <tocsect2 name="34.11 Streams and Fork" url="chapters_34.html#SEC681"/>
+ <tocsect2 name="34.12 Miscellaneous Thread Functions" url="chapters_34.html#SEC682"/>
+</tocsect1>
+<tocsect1 name="A. C Language Facilities in the Library" url="chapters_35.html#SEC683">
+ <tocsect2 name="A.1 Explicitly Checking Internal Consistency" url="chapters_35.html#SEC684"/>
+ <tocsect2 name="A.2 Variadic Functions" url="chapters_35.html#SEC685">
+ <tocsect3 name="A.2.1 Why Variadic Functions are Used" url="chapters_35.html#SEC686"/>
+ <tocsect3 name="A.2.2 How Variadic Functions are Defined and Used" url="chapters_35.html#SEC687">
+ <tocsect4 name="A.2.2.1 Syntax for Variable Arguments" url="chapters_35.html#SEC688"/>
+ <tocsect4 name="A.2.2.2 Receiving the Argument Values" url="chapters_35.html#SEC689"/>
+ <tocsect4 name="A.2.2.3 How Many Arguments Were Supplied" url="chapters_35.html#SEC690"/>
+ <tocsect4 name="A.2.2.4 Calling Variadic Functions" url="chapters_35.html#SEC691"/>
+ <tocsect4 name="A.2.2.5 Argument Access Macros" url="chapters_35.html#SEC692"/>
+ </tocsect3>
+ <tocsect3 name="A.2.3 Example of a Variadic Function" url="chapters_35.html#SEC693">
+ <tocsect4 name="A.2.3.1 Old-Style Variadic Functions" url="chapters_35.html#SEC694"/>
+ </tocsect3>
+ </tocsect2>
+ <tocsect2 name="A.3 Null Pointer Constant" url="chapters_35.html#SEC695"/>
+ <tocsect2 name="A.4 Important Data Types" url="chapters_35.html#SEC696"/>
+ <tocsect2 name="A.5 Data Type Measurements" url="chapters_35.html#SEC697">
+ <tocsect3 name="A.5.1 Computing the Width of an Integer Data Type" url="chapters_35.html#SEC698"/>
+ <tocsect3 name="A.5.2 Range of an Integer Type" url="chapters_35.html#SEC699"/>
+ <tocsect3 name="A.5.3 Floating Type Macros" url="chapters_35.html#SEC700">
+ <tocsect4 name="A.5.3.1 Floating Point Representation Concepts" url="chapters_35.html#SEC701"/>
+ <tocsect4 name="A.5.3.2 Floating Point Parameters" url="chapters_35.html#SEC702"/>
+ <tocsect4 name="A.5.3.3 IEEE Floating Point" url="chapters_35.html#SEC703"/>
+ </tocsect3>
+ <tocsect3 name="A.5.4 Structure Field Offset Measurement" url="chapters_35.html#SEC704"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="B. Summary of Library Facilities" url="chapters_36.html#SEC705"/>
+<tocsect1 name="C. Installing the GNU C Library" url="chapters_37.html#SEC706">
+ <tocsect2 name="C.1 Configuring and compiling GNU Libc" url="chapters_37.html#SEC707"/>
+ <tocsect2 name="C.2 Installing the C Library" url="chapters_37.html#SEC708"/>
+ <tocsect2 name="C.3 Recommended Tools for Compilation" url="chapters_37.html#SEC709"/>
+ <tocsect2 name="C.4 Supported Configurations" url="chapters_37.html#SEC710"/>
+ <tocsect2 name="C.5 Specific advice for Linux systems" url="chapters_37.html#SEC711"/>
+ <tocsect2 name="C.6 Reporting Bugs" url="chapters_37.html#SEC712"/>
+</tocsect1>
+<tocsect1 name="D. Library Maintenance" url="chapters_38.html#SEC713">
+ <tocsect2 name="D.1 Adding New Functions" url="chapters_38.html#SEC714"/>
+ <tocsect2 name="D.2 Porting the GNU C Library" url="chapters_38.html#SEC715">
+ <tocsect3 name="D.2.1 Layout of the `sysdeps' Directory Hierarchy" url="chapters_38.html#SEC716"/>
+ <tocsect3 name="D.2.2 Porting the GNU C Library to Unix Systems" url="chapters_38.html#SEC717"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="E. Contributors to the GNU C Library" url="chapters_39.html#SEC718"/>
+</kdeveloptoc>
+
diff --git a/languages/cpp/doc/libstdc++.toc b/languages/cpp/doc/libstdc++.toc
new file mode 100644
index 00000000..afdb10c1
--- /dev/null
+++ b/languages/cpp/doc/libstdc++.toc
@@ -0,0 +1,19 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>LIBSTDC++ (gcc.gnu.org)</title>
+<base href="http://gcc.gnu.org/onlinedocs/libstdc++"/>
+<tocsect1 name="Documentation" url="documentation.html"/>
+<tocsect1 name="Intro" url="17_intro/howto.html"/>
+<tocsect1 name="Library Support" url="18_support/howto.html"/>
+<tocsect1 name="Diagnostics" url="19_diagnostics/howto.html"/>
+<tocsect1 name="Utilities" url="20_util/howto.html"/>
+<tocsect1 name="Strings" url="21_strings/howto.html"/>
+<tocsect1 name="Localization" url="22_locale/howto.html"/>
+<tocsect1 name="Containers" url="23_containers/howto.html"/>
+<tocsect1 name="Iterators" url="24_iterators/howto.html"/>
+<tocsect1 name="Algorithms" url="25_algorithms/howto.html"/>
+<tocsect1 name="Numerics" url="26_numerics/howto.html"/>
+<tocsect1 name="I/O" url="27_io/howto.html"/>
+<tocsect1 name="Extensions" url="ext/howto.html"/>
+</kdeveloptoc>
+
diff --git a/languages/cpp/doc/qt-kdev3.toc b/languages/cpp/doc/qt-kdev3.toc
new file mode 100644
index 00000000..e1ed885e
--- /dev/null
+++ b/languages/cpp/doc/qt-kdev3.toc
@@ -0,0 +1,39 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Qt Designer-3 and KDevelop-3</title>
+<base href="http://women.kde.org/articles/tutorials/kdevelop3"/>
+<tocsect1 name="Index" url="index.html">
+</tocsect1>
+<tocsect1 name="Introduction" url="introduction.html">
+</tocsect1>
+<tocsect1 name="Requirements" url="requirements.html">
+ <tocsect2 name="How to get Qt Designer" url="requirements.html"/>
+ <tocsect2 name="How to get KDevelop 3" url="get-kevelop.html"/>
+ <tocsect2 name="Lexicon" url="lexicon.html"/>
+</tocsect1>
+<tocsect1 name="Creating the application" url="creating.html">
+ <tocsect2 name="Starting the project" url="creating.htm"/>
+ <tocsect2 name="Designing the program" url="design-program.html"/>
+ <tocsect2 name="Adding widgets" url="adding-widgets.html"/>
+ <tocsect2 name="Getting spaced out" url="spaced-out.html"/>
+ <tocsect2 name="Signals and slots" url="signals-and-slots.html"/>
+ <tocsect2 name="Generating the source" url="source.html"/>
+ <tocsect2 name="Implementing the slot" url="slots.html"/>
+</tocsect1>
+<tocsect1 name="In short" url="in-short.html">
+</tocsect1>
+<tocsect1 name="Make the translations for a simple KDE project" url="translations.html">
+</tocsect1>
+<tocsect1 name="A few general tips" url="a_few_tips.html">
+ <tocsect2 name="General hints" url="a_few_tips.html#id2771559"/>
+ <tocsect2 name="Importing your project in KDE CVS" url="importing.html"/>
+ <tocsect2 name="How do I release my application as a tarball?" url="release-tarball.html"/>
+ <tocsect2 name="Useful links" url="links.html"/>
+</tocsect1>
+<tocsect1 name="Generating the source (alternate)" url="without_subclass.html">
+ <tocsect2 name="Without using the KDevelop subclassing capability" url="without_subclass.html"/>
+ <tocsect2 name="Implementing the slot" url="slots2.html"/>
+</tocsect1>
+<tocsect1 name="Credits and License" url="credits.html">
+</tocsect1>
+</kdeveloptoc> \ No newline at end of file
diff --git a/languages/cpp/doc/stl.toc b/languages/cpp/doc/stl.toc
new file mode 100644
index 00000000..d86b82b0
--- /dev/null
+++ b/languages/cpp/doc/stl.toc
@@ -0,0 +1,487 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>STL (sgi.com)</title>
+<base href="http://www.sgi.com/tech/stl"/>
+<tocsect1 name="Introduction" url="stl_introduction.html"/>
+<tocsect1 name="How to use the documentation" url="doc_introduction.html"/>
+<tocsect1 name="Containers" url="">
+ <tocsect2 name="Container concepts" url="">
+ <tocsect3 name="Container" url="Container.html"/>
+ <tocsect3 name="Forward Container" url="ForwardContainer.html"/>
+ <tocsect3 name="Reversible Container" url="ReversibleContainer.html"/>
+ <tocsect3 name="Random Access Container" url="RandomAccessContainer.html"/>
+ </tocsect2>
+ <tocsect2 name="Sequences concepts" url="">
+ <tocsect3 name="Sequence" url="Sequence.html"/>
+ <tocsect3 name="Front Insertion Sequence" url="FrontInsertionSequence.html"/>
+ <tocsect3 name="Back Insertion Sequence" url="BackInsertionSequence.html"/>
+ </tocsect2>
+ <tocsect2 name="Associative Containers concepts" url="">
+ <tocsect3 name="Associative Container" url="AssociativeContainer.html"/>
+ <tocsect3 name="Simple Associative Container" url="SimpleAssociativeContainer.html"/>
+ <tocsect3 name="Pair Associative Container" url="PairAssociativeContainer.html"/>
+ <tocsect3 name="Sorted Associative Container" url="SortedAssociativeContainer.html"/>
+ <tocsect3 name="Hashed Associative Container" url="HashedAssociativeContainer.html"/>
+ <tocsect3 name="HashFunction" url="HashFunction.html"/>
+ <tocsect3 name="Unique Associative Container" url="UniqueAssociativeContainer.html"/>
+ <tocsect3 name="Multiple Associative Container" url="MultipleAssociativeContainer.html"/>
+ <tocsect3 name="Unique Sorted Associative Container" url="UniqueSortedAssociativeContainer.html"/>
+ <tocsect3 name="Multiple Sorted Associative Container" url="MultipleSortedAssociativeContainer.html"/>
+ <tocsect3 name="Unique Hashed Associative Container" url="UniqueHashedAssociativeContainer.html"/>
+ <tocsect3 name="Multiple Hashed Associative Container" url="MultipleHashedAssociativeContainer.html"/>
+ </tocsect2>
+ <tocsect2 name="Container classes: Sequences" url="">
+ <tocsect3 name="vector" url="Vector.html"/>
+ <tocsect3 name="deque" url="Deque.html"/>
+ <tocsect3 name="list" url="List.html"/>
+ <tocsect3 name="slist" url="Slist.html"/>
+ <tocsect3 name="bit_vector" url="bit_vector.html"/>
+ </tocsect2>
+ <tocsect2 name="Container classes: Associative Containers" url="">
+ <tocsect3 name="set" url="set.html"/>
+ <tocsect3 name="map" url="Map.html"/>
+ <tocsect3 name="multiset" url="multiset.html"/>
+ <tocsect3 name="multimap" url="Multimap.html"/>
+ <tocsect3 name="hash_set" url="hash_set.html"/>
+ <tocsect3 name="hash_map" url="hash_map.html"/>
+ <tocsect3 name="hash_multiset" url="hash_multiset.html"/>
+ <tocsect3 name="hash_multimap" url="hash_multimap.html"/>
+ </tocsect2>
+ <tocsect2 name="String package" url="">
+ <tocsect3 name="Character traits" url="character_traits.html"/>
+ <tocsect3 name="char_traits" url="char_traits.html"/>
+ <tocsect3 name="basic_string" url="basic_string.html"/>
+ <tocsect3 name="rope" url="Rope.html"/>
+ </tocsect2>
+ <tocsect2 name="Container adaptors" url="">
+ <tocsect3 name="stack" url="stack.html"/>
+ <tocsect3 name="queue" url="queue.html"/>
+ <tocsect3 name="bitset" url="bitset.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Iterators" url="">
+ <tocsect2 name="Introduction" url="Iterators.html"/>
+ <tocsect2 name="Iterator Concepts" url="">
+ <tocsect3 name="Trivial Iterator" url="trivial.html"/>
+ <tocsect3 name="Input Iterator" url="InputIterator.html"/>
+ <tocsect3 name="Output Iterator" url="OutputIterator.html"/>
+ <tocsect3 name="Forward Iterator" url="ForwardIterator.html"/>
+ <tocsect3 name="Bidirectional Iterator" url="BidirectionalIterator.html"/>
+ <tocsect3 name="Random Access Iterator" url="RandomAccessIterator.html"/>
+ </tocsect2>
+ <tocsect2 name="Iterator Tags" url="">
+ <tocsect3 name="Introduction" url="iterator_tags.html"/>
+ <tocsect3 name="iterator_traits" url="iterator_traits.html"/>
+ <tocsect3 name="iterator_category" url="iterator_category.html"/>
+ <tocsect3 name="distance_type" url="distance_type.html"/>
+ <tocsect3 name="value_type" url="value_type.html"/>
+ </tocsect2>
+ <tocsect2 name="Iterator tag classes" url="">
+ <tocsect3 name="input_iterator_tag" url="input_iterator_tag.html"/>
+ <tocsect3 name="output_iterator_tag" url="output_iterator_tag.html"/>
+ <tocsect3 name="forward_iterator_tag" url="forward_iterator_tag.html"/>
+ <tocsect3 name="bidirectional_iterator_tag" url="bidirectional_iterator_tag.html"/>
+ <tocsect3 name="random_access_iterator_tag" url="random_access_iterator_tag.html"/>
+ </tocsect2>
+ <tocsect2 name="Iterator base classes" url="">
+ <tocsect3 name="input_iterator" url="input_iterator.html"/>
+ <tocsect3 name="output_iterator" url="output_iterator.html"/>
+ <tocsect3 name="forward_iterator" url="forward_iterator.html"/>
+ <tocsect3 name="bidirectional_iterator" url="bidirectional_iterator.html"/>
+ <tocsect3 name="random_access_iterator" url="random_access_iterator.html"/>
+ </tocsect2>
+ <tocsect2 name="Iterator functions" url="">
+ <tocsect3 name="distance" url="distance.html"/>
+ <tocsect3 name="advance" url="advance.html"/>
+ </tocsect2>
+ <tocsect2 name="Iterator classes" url="">
+ <tocsect3 name="istream_iterator" url="istream_iterator.html"/>
+ <tocsect3 name="ostream_iterator" url="ostream_iterator.html"/>
+ <tocsect3 name="front_insert_iterator" url="front_insert_iterator.html"/>
+ <tocsect3 name="back_insert_iterator" url="back_insert_iterator.html"/>
+ <tocsect3 name="insert_iterator" url="insert_iterator.html"/>
+ <tocsect3 name="reverse_iterator" url="ReverseIterator.html"/>
+ <tocsect3 name="reverse_bidirectional_iterator" url="ReverseBidirectionalIterator.html"/>
+ <tocsect3 name="raw_storage_iterator" url="raw_storage_iterator.html"/>
+ <tocsect3 name="sequence_buffer" url="sequence_buffer.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Algorithms" url="">
+ <tocsect2 name="Non-mutating algorithms" url="">
+ <tocsect3 name="for_each" url="for_each.html"/>
+ <tocsect3 name="find" url="find.html"/>
+ <tocsect3 name="find_if" url="find_if.html"/>
+ <tocsect3 name="adjacent_find" url="adjacent_find.html"/>
+ <tocsect3 name="find_first_of" url="find_first_of.html"/>
+ <tocsect3 name="count" url="count.html"/>
+ <tocsect3 name="count_if" url="count_if.html"/>
+ <tocsect3 name="mismatch" url="mismatch.html"/>
+ <tocsect3 name="equal" url="equal.html"/>
+ <tocsect3 name="search" url="search.html"/>
+ <tocsect3 name="search_n" url="search_n.html"/>
+ <tocsect3 name="find_end" url="find_end.html"/>
+ </tocsect2>
+ <tocsect2 name="Mutating algorithms" url="">
+ <tocsect3 name="copy" url="copy.html"/>
+ <tocsect3 name="copy_n" url="copy_n.html"/>
+ <tocsect3 name="copy_backward" url="copy_backward.html"/>
+ <tocsect3 name="swap" url="swap.html"/>
+ <tocsect3 name="iter_swap" url="iter_swap.html"/>
+ <tocsect3 name="swap_ranges" url="swap_ranges.html"/>
+ <tocsect3 name="transform" url="transform.html"/>
+ <tocsect3 name="replace" url="replace.html"/>
+ <tocsect3 name="replace_if" url="replace_if.html"/>
+ <tocsect3 name="replace_copy" url="replace_copy.html"/>
+ <tocsect3 name="replace_copy_if" url="replace_copy_if.html"/>
+ <tocsect3 name="fill" url="fill.html"/>
+ <tocsect3 name="fill_n" url="fill_n.html"/>
+ <tocsect3 name="generate" url="generate.html"/>
+ <tocsect3 name="generate_n" url="generate_n.html"/>
+ <tocsect3 name="remove" url="remove.html"/>
+ <tocsect3 name="remove_if" url="remove_if.html"/>
+ <tocsect3 name="remove_copy" url="remove_copy.html"/>
+ <tocsect3 name="remove_copy_if" url="remove_copy_if.html"/>
+ <tocsect3 name="unique" url="unique.html"/>
+ <tocsect3 name="unique_copy" url="unique_copy.html"/>
+ <tocsect3 name="reverse" url="reverse.html"/>
+ <tocsect3 name="reverse_copy" url="reverse_copy.html"/>
+ <tocsect3 name="rotate" url="rotate.html"/>
+ <tocsect3 name="rotate_copy" url="rotate_copy.html"/>
+ <tocsect3 name="random_shuffle" url="random_shuffle.html"/>
+ <tocsect3 name="random_sample" url="random_sample.html"/>
+ <tocsect3 name="random_sample_n" url="random_sample_n.html"/>
+ <tocsect3 name="partition" url="partition.html"/>
+ <tocsect3 name="stable_partition" url="stable_partition.html"/>
+ </tocsect2>
+ <tocsect2 name="Sorting" url="">
+ <tocsect3 name="sort" url="sort.html"/>
+ <tocsect3 name="stable_sort" url="stable_sort.html"/>
+ <tocsect3 name="partial_sort" url="partial_sort.html"/>
+ <tocsect3 name="partial_sort_copy" url="partial_sort_copy.html"/>
+ <tocsect3 name="is_sorted" url="is_sorted.html"/>
+ <tocsect3 name="nth_element" url="nth_element.html"/>
+ <tocsect3 name="lower_bound" url="lower_bound.html"/>
+ <tocsect3 name="upper_bound" url="upper_bound.html"/>
+ <tocsect3 name="equal_range" url="equal_range.html"/>
+ <tocsect3 name="binary_search" url="binary_search.html"/>
+ <tocsect3 name="merge" url="merge.html"/>
+ <tocsect3 name="inplace_merge" url="inplace_merge.html"/>
+ <tocsect3 name="includes" url="includes.html"/>
+ <tocsect3 name="set_union" url="set_union.html"/>
+ <tocsect3 name="set_intersection" url="set_intersection.html"/>
+ <tocsect3 name="set_difference" url="set_difference.html"/>
+ <tocsect3 name="set_symmetric_difference" url="set_symmetric_difference.html"/>
+ <tocsect3 name="push_heap" url="push_heap.html"/>
+ <tocsect3 name="pop_heap" url="pop_heap.html"/>
+ <tocsect3 name="make_heap" url="make_heap.html"/>
+ <tocsect3 name="sort_heap" url="sort_heap.html"/>
+ <tocsect3 name="is_heap" url="is_heap.html"/>
+ <tocsect3 name="min" url="min.html"/>
+ <tocsect3 name="max" url="max.html"/>
+ <tocsect3 name="min_element" url="min_element.html"/>
+ <tocsect3 name="max_element" url="max_element.html"/>
+ <tocsect3 name="lexicographical_compare" url="lexicographical_compare.html"/>
+ <tocsect3 name="lexicographical_compare_3way" url="lexicographical_compare_3way.html"/>
+ <tocsect3 name="next_permutation" url="next_permutation.html"/>
+ <tocsect3 name="prev_permutation" url="prev_permutation.html"/>
+ </tocsect2>
+ <tocsect2 name="Generalized numeric algorithms" url="">
+ <tocsect3 name="iota" url="iota.html"/>
+ <tocsect3 name="accumulate" url="accumulate.html"/>
+ <tocsect3 name="inner_product" url="inner_product.html"/>
+ <tocsect3 name="partial_sum" url="partial_sum.html"/>
+ <tocsect3 name="adjacent_difference" url="adjacent_difference.html"/>
+ <tocsect3 name="power" url="power.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Function Objects" url="">
+ <tocsect2 name="Introduction" url="functors.html"/>
+ <tocsect2 name="Function Object Concepts" url="">
+ <tocsect3 name="Generator" url="Generator.html"/>
+ <tocsect3 name="UnaryFunction" url="Unary Function.html"/>
+ <tocsect3 name="BinaryFunction" url="Binary Function.html"/>
+ <tocsect3 name="AdaptableGenerator" url="Adaptable Generator.html"/>
+ <tocsect3 name="AdaptableUnaryFunction" url="Adaptable Unary Function.html"/>
+ <tocsect3 name="AdaptableBinaryFunction" url="Adaptable Binary Function.html"/>
+ <tocsect3 name="Predicate" url="Predicate.html"/>
+ <tocsect3 name="BinaryPredicate" url="Binary Predicate.html"/>
+ <tocsect3 name="AdaptablePredicate" url="Adaptable Predicate.html"/>
+ <tocsect3 name="AdaptableBinaryPredicate" url="Adaptable Binary Predicate.html"/>
+ <tocsect3 name="StrictWeakOrdering" url="StrictWeakOrdering.html"/>
+ <tocsect3 name="MonoidOperation" url="Monoid Operation.html"/>
+ <tocsect3 name="RandomNumberGenerator" url="Random Number Generator.html"/>
+ </tocsect2>
+ <tocsect2 name="Predefined function objects" url="">
+ <tocsect3 name="plus" url="plus.html"/>
+ <tocsect3 name="minus" url="minus.html"/>
+ <tocsect3 name="times" url="multiplies.html"/> (formerly called "times")
+ <tocsect3 name="divides" url="divides.html"/>
+ <tocsect3 name="modulus" url="modulus.html"/>
+ <tocsect3 name="negate" url="negate.html"/>
+ <tocsect3 name="equal_to" url="equal_to.html"/>
+ <tocsect3 name="not_equal_to" url="not_equal_to.html"/>
+ <tocsect3 name="less" url="less.html"/>
+ <tocsect3 name="greater" url="greater.html"/>
+ <tocsect3 name="less_equal" url="less_equal.html"/>
+ <tocsect3 name="greater_equal" url="greater_equal.html"/>e
+ <tocsect3 name="logical_and" url="logical_and.html"/>
+ <tocsect3 name="logical_or" url="logical_or.html"/>
+ <tocsect3 name="logical_not" url="logical_not.html"/>
+ <tocsect3 name="identity" url="identity.html"/>
+ <tocsect3 name="project1st" url="project1st.html"/>
+ <tocsect3 name="project2nd" url="project2nd.html"/>
+ <tocsect3 name="select1st" url="select1st.html"/>
+ <tocsect3 name="select2nd" url="select2nd.html"/>
+ <tocsect3 name="subtractive_rng" url="subtractive_rng.html"/>
+ </tocsect2>
+ <tocsect2 name="Function object adaptors" url="">
+ <tocsect3 name="binder1st" url="binder1st.html"/>
+ <tocsect3 name="binder2nd" url="binder2nd.html"/>
+ <tocsect3 name="ptr_fun" url="ptr_fun.html"/>
+ <tocsect3 name="pointer_to_unary_function" url="pointer_to_unary_function.html"/>
+ <tocsect3 name="pointer_to_binary_function" url="pointer_to_binary_function.html"/>
+ <tocsect3 name="unary_negate" url="unary_negate.html"/>
+ <tocsect3 name="binary_negate" url="binary_negate.html"/>
+ <tocsect3 name="unary_compose" url="unary_compose.html"/>
+ <tocsect3 name="binary_compose" url="binary_compose.html"/>
+ <tocsect3 name="mem_fun_t" url="mem_fun.html"/>
+ <tocsect3 name="mem_fun_ref_t" url="mem_fun_ref.html"/>
+ <tocsect3 name="mem_fun1_t" url="mem_fun1.html"/>
+ <tocsect3 name="mem_fun1_ref_t" url="mem_fun1_ref.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Utilities" url="">
+ <tocsect2 name="Utilities Concepts" url="">
+ <tocsect3 name="Assignable" url="Assignable.html"/>
+ <tocsect3 name="Default Constructible" url="DefaultConstructible.html"/>
+ <tocsect3 name="Equality Comparable" url="EqualityComparable.html"/>
+ <tocsect3 name="LessThan Comparable" url="LessThanComparable.html"/>
+ </tocsect2>
+ <tocsect2 name="Functions: Relational Operators" url="operators.html"/>
+ <tocsect2 name="Classes: Pair" url="pair.html"/>
+</tocsect1>
+<tocsect1 name="Memory Allocation" url="">
+ <tocsect2 name="Classes" url="">
+ <tocsect3 name="Allocators" url="Allocators.html"/>
+ <tocsect3 name="raw_storage_iterator" url="raw_storage_iterator.html"/>
+ </tocsect2>
+ <tocsect2 name="Functions" url="">
+ <tocsect3 name="construct" url="construct.html"/>
+ <tocsect3 name="destroy" url="destroy.html"/>
+ <tocsect3 name="uninitialized_copy" url="uninitialized_copy"/>
+ <tocsect3 name="uninitialized_copy_n" url="uninitialized_copy_n"/>
+ <tocsect3 name="uninitialized_fill" url="uninitialized_fill"/>
+ <tocsect3 name="uninitialized_fill_n" url="uninitialized_fill_n"/>
+ <tocsect3 name="temporary_buffer" url="temporary_buffer.html"/>
+ <tocsect3 name="get_temporary_buffer" url="get_temporary_buffer.html"/>
+ <tocsect3 name="return_temporary_buffer" url="return_temporary_buffer.html"/>
+ </tocsect2>
+</tocsect1>
+<tocsect1 name="Design documents" url="">
+ <tocsect2 name="Thread safety" url="thread_safety.html"/>
+ <tocsect2 name="Complexity specifications" url="complexity.html"/>
+ <tocsect2 name="Representation of strings" url="string_discussion.html"/>
+</tocsect1>
+<index>
+<entry name="container, STL" url="Container.html"/>
+<entry name="container, forward" url="ForwardContainer.html"/>
+<entry name="random access container" url="RandomAccessContainer.html"/>
+<entry name="container, random access" url="RandomAccessContainer.html"/>
+<entry name="reversible container" url="ReversibleContainer.html"/>
+<entry name="container, reversible" url="ReversibleContainer.html"/>
+<entry name="forward container" url="ForwardContainer.html"/>
+<entry name="multiple sorted container" url="MultipleSortedContainer.html"/>
+<entry name="container, multiple sorted" url="MultipleSortedContainer.html"/>
+<entry name="associative container" url="AssociativeContainer.html"/>
+<entry name="container, associative" url="AssociativeContainer.html"/>
+<entry name="simple associative container" url="SimpleAssociativeContainer.html"/>
+<entry name="container, simple associative" url="SimpleAssociativeContainer.html"/>
+<entry name="unique associative container" url="UniqueAssociativeContainer.html"/>
+<entry name="container, unique associative" url="UniqueAssociativeContainer.html"/>
+<entry name="sorted associative container" url="SortedAssociativeContainer.html"/>
+<entry name="container, sorted associative" url="SortedAssociativeContainer.html"/>
+<entry name="hashed associative container" url="HashedAssociativeContainer.html"/>
+<entry name="container, hashed associative" url="HashedAssociativeContainer.html"/>
+<entry name="unique hashed associative container" url="UniqueHashedAssociativeContainer.html"/>
+<entry name="container, unique hashed associative" url="UniqueHashedAssociativeContainer.html"/>
+<entry name="pair associative container" url="PairAssociativeContainer.html"/>
+<entry name="container, pair associative" url="PairAssociativeContainer.html"/>
+<entry name="multiple associative container" url="MultipleAssociativeContainer.html"/>
+<entry name="container, multiple associative" url="MultipleAssociativeContainer.html"/>
+<entry name="iterators, STL" url="Iterators.html"/>
+<entry name="trivial iterator" url="TrivialIterator.html"/>
+<entry name="iterator, trivial" url="TrivialIterator.html"/>
+<entry name="random access iterator" url="RandomAccessIterator.html"/>
+<entry name="iterator, random access" url="RandomAccessIterator.html"/>
+<entry name="forward iterator" url="ForwardIterator.html"/>
+<entry name="iterator, forward" url="ForwardIterator.html"/>
+<entry name="bidirectional iterator" url="BidirectionalIterator.html"/>
+<entry name="iterator, bidirectional" url="BidirectionalIterator.html"/>
+<entry name="input iterator" url="InputIterator.html"/>
+<entry name="iterator, input" url="InputIterator.html"/>
+<entry name="output iterator" url="OutputIterator.html"/>
+<entry name="iterator, output" url="OutputIterator.html"/>
+<entry name="iterator tags" url="IteratorTags.html"/>
+<entry name="tags, iterator, STL" url="IteratorTags.html"/>
+<entry name="sequence, STL" url="Sequence.html"/>
+<entry name="back insertion sequence" url="BackInsertionSequence.html"/>
+<entry name="sequence, back insertion" url="BackInsertionSequence.html"/>
+<entry name="front insertion sequence" url="FrontInsertionSequence.html"/>
+<entry name="sequence, front insertion" url="FrontInsertionSequence.html"/>
+<entry name="assignable, STL" url="Assignable.html"/>
+<entry name="character traits, STL" url="CharacterTraits.html"/>
+<entry name="default constructible, STL" url="DefaultConstructible.html"/>
+<entry name="equality comparable, STL" url="EqualityComparable.html"/>
+<entry name="lessthan comparable, STL" url="LessThanComparable.html"/>
+<entry name="relational operators, STL" url="RelationalOperators.html"/>
+<entry name="operators, relational, STL" url="RelationalOperators.html"/>
+<entry name="vector, STL class" url="vector.html"/>
+<entry name="deque, STL class" url="Deque.html"/>
+<entry name="list, STL class" url="List.html"/>
+<entry name="slist, STL class" url="slist.html"/>
+<entry name="bit_vector, STL class" url="bit_vector.html"/>
+<entry name="set, STL class" url="set.html"/>
+<entry name="map, STL class" url="map.html"/>
+<entry name="multiset, STL class" url="multiset.html"/>
+<entry name="multimap, STL class" url="multimap.html"/>
+<entry name="hash_set, STL class" url="hash_set.html"/>
+<entry name="hash_map, STL class" url="hash.html"/>
+<entry name="hash_multiset, STL class" url="hash_multiset.html"/>
+<entry name="hash_multimap, STL class" url="hash_multimap.html"/>
+<entry name="char_traits, STL class" url="char_traits.html"/>
+<entry name="basic_string, STL class" url="basic_string.html"/>
+<entry name="rope, STL class" url="rope.html"/>
+<entry name="stack, STL class" url="stack.html"/>
+<entry name="queue, STL class" url="queue.html"/>
+<entry name="bitset, STL class" url="bitset.html"/>
+<entry name="iterator_traits, STL class" url="iterator_traits.html"/>
+<entry name="input_iterator, STL class" url="input_iterator.html"/>
+<entry name="outputput_iterator, STL class" url="output_iterator.html"/>
+<entry name="forward_iterator, STL class" url="forward_iterator.html"/>
+<entry name="bidirectional_iterator, STL class" url="bidirectional_iterator.html"/>
+<entry name="random_access_iterator, STL class" url="random_access_iterator.html"/>
+<entry name="istream_iterator, STL class" url="istream_iterator.html"/>
+<entry name="ostream_iterator, STL class" url="ostream_iterator.html"/>
+<entry name="front_insert_iterator, STL class" url="front_insert_iterator.html"/>
+<entry name="back_insert_iterator, STL class" url="back_insert_iterator.html"/>
+<entry name="insert_iterator, STL class" url="insert_iterator.html"/>
+<entry name="reverse_iterator, STL class" url="reverse_iterator.html"/>
+<entry name="reverse_bidirectional_iterator, STL class" url="reverse_bidirectional_iterator.html"/>
+<entry name="distance, STL function" url="distance.html"/>
+<entry name="advance, STL function" url="advance.html"/>
+<entry name="for_each, STL algorithm" url="for_each.html"/>
+<entry name="find, STL algorithm" url="find.html"/>
+<entry name="find_if, STL algorithm" url="find_if.html"/>
+<entry name="adjacent_find, STL algorithm" url="adjacent_find.html"/>
+<entry name="find_first_of, STL algorithm" url="find_first_of.html"/>
+<entry name="count, STL algorithm" url="count.html"/>
+<entry name="count_if, STL algorithm" url="count_if.html"/>
+<entry name="mismatch, STL algorithm" url="mismatch.html"/>
+<entry name="equal, STL algorithm" url="equal.html"/>
+<entry name="search, STL algorithm" url="search.html"/>
+<entry name="search_n, STL algorithm" url="search_n.html"/>
+<entry name="find_end, STL algorithm" url="find_end.html"/>
+<entry name="copy, STL algorithm" url="copy.html"/>
+<entry name="copy_n, STL algorithm" url="copy_n.html"/>
+<entry name="copy_backward, STL algorithm" url="copy_backward.html"/>
+<entry name="swap, STL algorithm" url="swap.html"/>
+<entry name="iter_swap, STL algorithm" url="iter_swap.html"/>
+<entry name="swap_ranges, STL algorithm" url="swap_ranges.html"/>
+<entry name="transform, STL algorithm" url="transform.html"/>
+<entry name="replace, STL algorithm" url="replace.html"/>
+<entry name="replace_if, STL algorithm" url="replace_if.html"/>
+<entry name="replace_copy, STL algorithm" url="replace_copy.html"/>
+<entry name="fill, STL algorithm" url="fill.html"/>
+<entry name="fill_n, STL algorithm" url="fill_n.html"/>
+<entry name="generate, STL algorithm" url="generate.html"/>
+<entry name="generate_n, STL algorithm" url="generate_n.html"/>
+<entry name="remove, STL algorithm" url="remove.html"/>
+<entry name="remove_if, STL algorithm" url="remove_if.html"/>
+<entry name="remove_copy, STL algorithm" url="remove_copy.html"/>
+<entry name="remove_copy_if, STL algorithm" url="remove_copy_if.html"/>
+<entry name="unique, STL algorithm" url="unique.html"/>
+<entry name="unique_copy, STL algorithm" url="unique_copy.html"/>
+<entry name="reverse, STL algorithm" url="reverse.html"/>
+<entry name="reverse_copy, STL algorithm" url="reverse_copy.html"/>
+<entry name="rotate, STL algorithm" url="rotate.html"/>
+<entry name="rotate_copy, STL algorithm" url="rotate_copy.html"/>
+<entry name="random_shuffle, STL algorithm" url="random_shuffle.html"/>
+<entry name="random_sample, STL algorithm" url="random_sample.html"/>
+<entry name="random_sample_n, STL algorithm" url="random_sample_n.html"/>
+<entry name="partition, STL algorithm" url="partition.html"/>
+<entry name="stable_partition, STL algorithm" url="stable_partition.html"/>
+<entry name="sort, STL algorithm" url="sort.html"/>
+<entry name="stable_sort, STL algorithm" url="stable_sort.html"/>
+<entry name="partial_sort, STL algorithm" url="partial_sort.html"/>
+<entry name="partial_sort_copy, STL algorithm" url="partial_sort_copy.html"/>
+<entry name="is_sorted, STL algorithm" url="is_sorted.html"/>
+<entry name="nth_element, STL algorithm" url="nth_element.html"/>
+<entry name="lower_bound, STL algorithm" url="lower_bound.html"/>
+<entry name="upper_bound, STL algorithm" url="upper_bound.html"/>
+<entry name="equal_range, STL algorithm" url="equal_range.html"/>
+<entry name="binary_search, STL algorithm" url="binary_search.html"/>
+<entry name="merge, STL algorithm" url="merge.html"/>
+<entry name="inplace_merge, STL algorithm" url="inplace_merge.html"/>
+<entry name="includes, STL algorithm" url="includes.html"/>
+<entry name="set_union, STL algorithm" url="set_union.html"/>
+<entry name="set_intersection, STL algorithm" url="set_intersection.html"/>
+<entry name="set_difference, STL algorithm" url="set_difference.html"/>
+<entry name="set_symmetric_difference, STL algorithm" url="set_symmetric_difference.html"/>
+<entry name="push_heap, STL algorithm" url="push_heap.html"/>
+<entry name="pop_heap, STL algorithm" url="pop_heap.html"/>
+<entry name="make_heap, STL algorithm" url="make_heap.html"/>
+<entry name="sort_heap, STL algorithm" url="sort_heap.html"/>
+<entry name="is_heap, STL algorithm" url="is_heap.html"/>
+<entry name="min, STL algorithm" url="min.html"/>
+<entry name="max, STL algorithm" url="max.html"/>
+<entry name="min_element, STL algorithm" url="min_element.html"/>
+<entry name="max_element, STL algorithm" url="max_element.html"/>
+<entry name="lexicographical_compare, STL algorithm" url="lexicographic_compare.html"/>
+<entry name="lexicographical_compare_3way, STL algorithm" url="lexicographic_compare_3way.html"/>
+<entry name="next_permutation, STL algorithm" url="next_permutation.html"/>
+<entry name="prev_permutation, STL algorithm" url="prev_permutation.html"/>
+<entry name="iota, STL algorithm" url="ioata.html"/>
+<entry name="accumulate, STL algorithm" url="accumulate.html"/>
+<entry name="inner_product, STL algorithm" url="inner_product.html"/>
+<entry name="partial_sum, STL algorithm" url="partial_sum.html"/>
+<entry name="adjacent_difference, STL algorithm" url="adjacent_difference.html"/>
+<entry name="power, STL algorithm" url="power.html"/>
+<entry name="plus, STL functor" url="plus.html"/>
+<entry name="minus, STL functor" url="minus.html"/>
+<entry name="times, STL functor" url="times.html"/>
+<entry name="divides, STL functor" url="divides.html"/>
+<entry name="modulus, STL functor" url="modulus.html"/>
+<entry name="negate, STL functor" url="negate.html"/>
+<entry name="equal_to, STL functor" url="equal_to.html"/>
+<entry name="not_equal_to, STL functor" url="not_equal_to.html"/>
+<entry name="less, STL functor" url="less.html"/>
+<entry name="greater, STL functor" url="greater.html"/>
+<entry name="less_equal, STL functor" url="less_equal.html"/>
+<entry name="greater_equal, STL functor" url="greater_equal.html"/>
+<entry name="logical_and, STL functor" url="logical_and.html"/>
+<entry name="logical_or, STL functor" url="logical_or.html"/>
+<entry name="logical_not, STL functor" url="logical_not.html"/>
+<entry name="identity, STL functor" url="identity.html"/>
+<entry name="project1st, STL functor" url="project1st.html"/>
+<entry name="project2nd, STL functor" url="project2nd.html"/>
+<entry name="select1st, STL functor" url="select1st.html"/>
+<entry name="select2nd, STL functor" url="select2nd.html"/>
+<entry name="subtractive_rng, STL functor" url="subtractive_rng.html"/>
+<entry name="binder1st, STL functor" url="binder1st.html"/>
+<entry name="binder2nd, STL functor" url="binder2nd.html"/>
+<entry name="ptr_fun, STL functor" url="ptr_fun.html"/>
+<entry name="pointer_to_unary_function, STL functor" url="pointer_to_unary.html"/>
+<entry name="pointer_to_binary_function, STL functor" url="pointer_to_binary.html"/>
+<entry name="unary_negate, STL functor" url="unary_negate.html"/>
+<entry name="binary_negate, STL functor" url="binary_negate.html"/>
+<entry name="unary_compose, STL functor" url="unary_compose.html"/>
+<entry name="binary_compose, STL functor" url="binary_compose.html"/>
+<entry name="mem_fun_t, STL functor" url="mem_fun_t.html"/>
+<entry name="mem_fun_ref_t, STL functor" url="mem_fun_ref_t.html"/>
+<entry name="mem_fun1_t, STL functor" url="mem_fun1_t.html"/>
+<entry name="mem_fun1_ref_t, STL functor" url="mem_fun1_ref_t.html"/>
+<entry name="pair, STL class" url="pair.html"/>
+<entry name="priority_queue, STL" url="priority_queue.html"/>
+</index>
+</kdeveloptoc>
+
diff --git a/languages/cpp/doc/wxwidgets_bugs.toc b/languages/cpp/doc/wxwidgets_bugs.toc
new file mode 100644
index 00000000..f7bb39c7
--- /dev/null
+++ b/languages/cpp/doc/wxwidgets_bugs.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>wxWidgets bugs</title>
+<base href="http://sourceforge.net/"/>
+<tocsect1 name="Query" url="tracker/?group_id=9863&amp;atid=109863">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/cpp/doxydoc.cpp b/languages/cpp/doxydoc.cpp
new file mode 100644
index 00000000..bcd36faa
--- /dev/null
+++ b/languages/cpp/doxydoc.cpp
@@ -0,0 +1,148 @@
+/***************************************************************************
+* Copyright (C) 2003 by Jonas B. Jacobi *
+* j.jacobi@gmx.de *
+* *
+* 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. *
+***************************************************************************/
+#include "doxydoc.h"
+
+#include <list>
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qdom.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qregexp.h>
+
+void DoxyDoc::formatType( QString& str )
+{
+ str.replace( QRegExp( " " ), "" );
+}
+
+DoxyDoc::DoxyDoc( const QStringList& dir )
+{
+ for ( uint i = 0; i < dir.count(); ++i )
+ m_dirs.push_back( QDir( *( dir.at( i ) ) ) );
+}
+
+//crappy implementation, change later
+QString DoxyDoc::functionDescription( const QString& tmpscope, const QString& name,
+ const QString& tmptype, const QString& tmparguments )
+{
+ QString scope = tmpscope;
+ bool foundfile = false;
+ //produce doxygen conform filenames
+ QString filename = "/class" + scope.replace( QRegExp( "_" ), "__" ).replace( QRegExp( "::" ), "_1_1" ) + ".xml";
+
+ //search for file in all directories
+ for ( std::list<QDir>::const_iterator ci = m_dirs.begin(); !foundfile && ci != m_dirs.end(); ++ci )
+ {
+ if ( QFile::exists( ci->path() + filename ) )
+ {
+ if ( m_file.name() != ci->path() + filename )
+ {
+ m_file.close();
+ m_file.setName( ci->path() + filename );
+ if ( !m_file.open( IO_ReadOnly ) )
+ {
+ m_file.setName( "" );
+ return "";
+ }
+ QDomDocument m_doc;
+ m_doc.setContent( m_file.readAll() );
+ m_file.close();
+ m_list = m_doc.elementsByTagName( "memberdef" );
+ foundfile = true;
+
+ }
+ else //file is already opened
+ foundfile = true;
+ }
+ }
+ if ( !foundfile )
+ return QString::null;
+
+ QString type = tmptype;
+ formatType( type );
+
+ for ( uint i = 0; i < m_list.count(); ++i )
+ {
+ QDomElement elem = m_list.item( i ).toElement();
+ if ( elem.elementsByTagName( "name" ).item( 0 ).toElement().text() == name &&
+ elem.elementsByTagName( "type" ).item( 0 ).toElement().text() == tmptype )
+ {
+ QDomNodeList paramnodes = elem.elementsByTagName( "param" );
+ QString nodearguments = "", arguments = tmparguments;
+ for ( unsigned int j = 0; j < paramnodes.count(); ++j )
+ nodearguments += paramnodes.item( j ).childNodes().item( 0 ).toElement().text() + ",";
+ if ( nodearguments != "" )
+ {
+ nodearguments = nodearguments.left( nodearguments.length() - 1 );
+ formatType( nodearguments );
+ }
+ formatType( arguments );
+ if ( arguments == nodearguments )
+ {
+ QString brief = "";
+ QDomNode briefnode = elem.elementsByTagName( "briefdescription" ).item( 0 );
+ if ( briefnode.hasChildNodes() )
+ brief = briefnode.firstChild().toElement().text();
+
+ QString detailstr = "", paramstr = "";
+ QDomNode detail = elem.elementsByTagName( "detaileddescription" ).item( 0 );
+ if ( detail.hasChildNodes() )
+ detail = detail.firstChild();
+
+ QDomNode descnode = detail.firstChild();
+ while ( !descnode.isNull() )
+ {
+ if ( descnode.nodeName() == "parameterlist" )
+ {
+ int tmpcount = descnode.childNodes().count();
+ for ( int k = 0; k < tmpcount; ++k )
+ {
+ //add parametername
+ paramstr += "<li><i>" + descnode.childNodes().item( k++ ).toElement().text() + "</i>\t";
+ //add parameterdescription
+ paramstr += descnode.childNodes().item( k ).toElement().text() + "</li>";
+ }
+ }
+ else
+ if ( descnode.nodeName() == "simplesect" )
+ {}
+ else
+ {
+ if ( descnode.isText() )
+ detailstr += descnode.toText().data();
+ else
+ detailstr += descnode.toElement().text();
+ }
+ descnode = descnode.nextSibling();
+ }
+
+
+ QString description = "";
+ if ( brief != "" )
+ description += brief + "<p>";
+ if ( detailstr != "" )
+ description += detailstr + "<p>";
+ if ( paramstr != "" )
+ description += "<b>Parameterlist:</b><p>" + paramstr;
+
+ if ( description == "" )
+ return QString::null;
+ else
+ return description;
+ }
+ }
+
+ }
+
+ return QString::null;
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/doxydoc.h b/languages/cpp/doxydoc.h
new file mode 100644
index 00000000..aca424b2
--- /dev/null
+++ b/languages/cpp/doxydoc.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+* Copyright (C) 2003 by Jonas B. Jacobi *
+* j.jacobi@gmx.de *
+* *
+* 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. *
+***************************************************************************/
+#ifndef DOXYDOC_H
+#define DOXYDOC_H
+
+#include <qstring.h>
+#include <qdom.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <list>
+
+/**
+This class is used for getting the description on functions, stored in xml files, which are created by Doxygen
+@author Jonas B. Jacobi
+@version 0.1
+*/
+class DoxyDoc
+{
+public:
+ /**
+ Constructs a new DoxyDoc object.
+ @param dir all directories, which should be searched for files containing the Doxygen-documentation.
+ */
+ DoxyDoc( const QStringList& dir );
+ ~DoxyDoc()
+ {}
+ ;
+ /**
+ Get the documentation referring to a special function, therefor most parts of the functions signature have to be provided
+ @param scope Scope of the function (e.g. name of class, it is member of, namespace etc ...)
+ @param name Name of the function(just the name, no '(' etc. )
+ @param type Return-type of the function
+ @param arguments String containing the arguments of the function, separated by commas and _without_ the argument names
+ */
+ QString functionDescription( const QString& scope, const QString& name, const QString& type, const QString& arguments );
+ /*not implemented yet, maybe later, if they are useful
+ QString classDescription();
+ QString enumDescription();
+ QString namespaceDescription();
+ QString memberVarDescription();
+ */
+private:
+ static void formatType( QString& type );
+ std::list<QDir> m_dirs;
+ //used for temporary storing/performance reasons
+ QFile m_file;
+ QDomNodeList m_list;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/expressioninfo.h b/languages/cpp/expressioninfo.h
new file mode 100644
index 00000000..836a2292
--- /dev/null
+++ b/languages/cpp/expressioninfo.h
@@ -0,0 +1,99 @@
+/***************************************************************************
+ begin : Sat Jul 21 2001
+ copyright : (C) 2001 by Victor R�er
+ email : victor_roeder@gmx.de
+ copyright : (C) 2002,2003 by Roberto Raggi
+ email : roberto@kdevelop.org
+ copyright : (C) 2005 by Adam Treat
+ email : manyoso@yahoo.com
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef EXPRESSIONINFO_H
+#define EXPRESSIONINFO_H
+
+#include "stringhelpers.h"
+
+using namespace StringHelpers;
+
+struct ExpressionInfo {
+ private:
+ QString m_expr;
+
+ public:
+
+ enum Type {
+ InvalidExpression = 0,
+ NormalExpression = 1,
+ TypeExpression = 2
+ };
+
+ Type t;
+ int start, end;
+
+ QString expr() {
+ return m_expr;
+ }
+
+ void setExpr( const QString& str ) {
+ m_expr = clearComments( str );
+ }
+
+ ExpressionInfo( QString str ) : t( NormalExpression ), start( 0 ), end( str.length() ) {
+ setExpr( str );
+
+ }
+
+ ExpressionInfo() : t( InvalidExpression ), start(0), end(0) {
+ }
+
+ operator bool() {
+ return t != InvalidExpression && !m_expr.isEmpty();
+ }
+
+ bool isTypeExpression() {
+ return t == TypeExpression && !m_expr.isEmpty();
+ }
+
+ bool canBeTypeExpression() {
+ return t & TypeExpression && !m_expr.isEmpty();
+ }
+
+ bool isNormalExpression() {
+ return t == NormalExpression && !m_expr.isEmpty();
+ }
+
+ bool canBeNormalExpression() {
+ return t & NormalExpression && !m_expr.isEmpty();
+ }
+
+ QString typeAsString() {
+ QString res ;
+ if( t & NormalExpression )
+ res += "NormalExpression, ";
+ if( t & TypeExpression )
+ res += "TypeExpression, ";
+ if( t == InvalidExpression )
+ res += "InvalidExpression, ";
+ if( !res.isEmpty() ) {
+ res = res.left( res.length() - 2 );
+ } else {
+ res = "Unknown";
+ }
+ return res;
+ }
+};
+
+
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/file_templates/Makefile.am b/languages/cpp/file_templates/Makefile.am
new file mode 100644
index 00000000..d688d547
--- /dev/null
+++ b/languages/cpp/file_templates/Makefile.am
@@ -0,0 +1,3 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = c cpp h l ll y yy
+
diff --git a/languages/cpp/file_templates/c b/languages/cpp/file_templates/c
new file mode 100644
index 00000000..29d5dfd0
--- /dev/null
+++ b/languages/cpp/file_templates/c
@@ -0,0 +1,11 @@
+/*
+* C Implementation: $MODULE$
+*
+* Description:
+*
+*
+* Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+*
+* Copyright: See COPYING file that comes with this distribution
+*
+*/
diff --git a/languages/cpp/file_templates/cpp b/languages/cpp/file_templates/cpp
new file mode 100644
index 00000000..23b3f500
--- /dev/null
+++ b/languages/cpp/file_templates/cpp
@@ -0,0 +1,11 @@
+//
+// C++ Implementation: $MODULE$
+//
+// Description:
+//
+//
+// Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
diff --git a/languages/cpp/file_templates/h b/languages/cpp/file_templates/h
new file mode 100644
index 00000000..4e987ea1
--- /dev/null
+++ b/languages/cpp/file_templates/h
@@ -0,0 +1,11 @@
+//
+// C++ Interface: $MODULE$
+//
+// Description:
+//
+//
+// Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
diff --git a/languages/cpp/file_templates/l b/languages/cpp/file_templates/l
new file mode 100644
index 00000000..39a8d138
--- /dev/null
+++ b/languages/cpp/file_templates/l
@@ -0,0 +1,35 @@
+/*
+ *
+ * flex Implementation: $MODULE$
+ *
+ * Description:
+ *
+ *
+ * Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ *
+ * Copyright: See COPYING file that comes with this distribution
+ *
+ */
+
+/*
+ *
+ * Use options
+ *
+ * %option prefix="foo"
+ * %option outfile="lex.yy.c"
+ *
+ * to create multiple flex scanner in one project.
+ *
+ */
+
+%{
+
+
+%}
+
+%option debug
+
+%%
+
+
+%%
diff --git a/languages/cpp/file_templates/ll b/languages/cpp/file_templates/ll
new file mode 100644
index 00000000..96daef19
--- /dev/null
+++ b/languages/cpp/file_templates/ll
@@ -0,0 +1,42 @@
+/*
+ *
+ * flex C++ implementation: $MODULE$
+ *
+ * Description:
+ *
+ *
+ * Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ *
+ * Copyright: See COPYING file that comes with this distribution
+ *
+ */
+
+/*
+ *
+ * Use options
+ *
+ * %option prefix="foo"
+ * %option outfile="lex.yy.c"
+ *
+ * to create multiple flex scanner in one project.
+ *
+ *
+ * To create scanner class:
+ *
+ * %option c++
+ *
+ * (see '%option yyclass' also!)
+ *
+ */
+
+%{
+
+
+%}
+
+%option debug
+
+%%
+
+
+%%
diff --git a/languages/cpp/file_templates/y b/languages/cpp/file_templates/y
new file mode 100644
index 00000000..67180e42
--- /dev/null
+++ b/languages/cpp/file_templates/y
@@ -0,0 +1,40 @@
+/*
+ *
+ * bison/yacc Implementation: $MODULE$
+ *
+ * Description:
+ *
+ *
+ * Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ *
+ * Copyright: See COPYING file that comes with this distribution
+ *
+ */
+
+/*
+ *
+ * Use options
+ *
+ * %name-prefix="foo"
+ * %yacc
+ *
+ * to create multiple parsers in one project.
+ *
+ */
+
+%{
+
+
+
+%}
+
+%debug
+
+%%
+
+
+
+
+
+%%
+
diff --git a/languages/cpp/file_templates/yy b/languages/cpp/file_templates/yy
new file mode 100644
index 00000000..dab32b85
--- /dev/null
+++ b/languages/cpp/file_templates/yy
@@ -0,0 +1,40 @@
+/*
+ *
+ * bison/yacc C++ Implementation: $MODULE$
+ *
+ * Description:
+ *
+ *
+ * Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ *
+ * Copyright: See COPYING file that comes with this distribution
+ *
+ */
+
+/*
+ *
+ * Use options
+ *
+ * %name-prefix="foo"
+ * %yacc
+ *
+ * to create multiple parsers in one project.
+ *
+ */
+
+%{
+
+
+
+%}
+
+%debug
+
+%%
+
+
+
+
+
+%%
+
diff --git a/languages/cpp/includefiles.cpp b/languages/cpp/includefiles.cpp
new file mode 100644
index 00000000..fe945d25
--- /dev/null
+++ b/languages/cpp/includefiles.cpp
@@ -0,0 +1,2 @@
+#include"includefiles.h"
+
diff --git a/languages/cpp/includefiles.h b/languages/cpp/includefiles.h
new file mode 100644
index 00000000..5fe9a339
--- /dev/null
+++ b/languages/cpp/includefiles.h
@@ -0,0 +1,14 @@
+#ifndef INCLUDE_FILES_H
+#define INCLUDE_FILES_H
+
+#include<hashedstring.h>
+
+typedef HashedStringSet IncludeFiles;
+
+class PathFileSearch {
+public:
+private:
+
+};
+
+#endif
diff --git a/languages/cpp/includepathresolver.cpp b/languages/cpp/includepathresolver.cpp
new file mode 100644
index 00000000..117c7732
--- /dev/null
+++ b/languages/cpp/includepathresolver.cpp
@@ -0,0 +1,577 @@
+/***************************************************************************
+ copyright : (C) 2007 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+/** Compatibility:
+ * make/automake: Should work perfectly
+ * cmake: Thanks to the path-recursion, this works with cmake(tested with version "2.4-patch 6" tested with kdelibs out-of-source and with kdevelop4 in-source)
+ *
+ *
+ * unsermake:
+ * unsermake is detected by reading the first line of the makefile. If it contains "generated by unsermake" the following things are respected:
+ * 1. Since unsermake does not have the -W command(which should tell it to recompile the given file no matter whether it has been changed or not), the file-modification-time of the file is changed temporarily and the --no-real-compare option is used to force recompilation.
+ * 2. The targets seem to be called *.lo instead of *.o when using unsermake, so *.lo names are used.
+ * example-(test)command: unsermake --no-real-compare -n myfile.lo
+ **/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <memory>
+#include "kurl.h" /* defines KURL */
+#include "qdir.h" /* defines QDir */
+#include "qregexp.h" /* defines QRegExp */
+#include "klocale.h" /* defines [function] i18n */
+#include "blockingkprocess.h" /* defines BlockingKProcess */
+#include "includepathresolver.h"
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <time.h>
+#include <stdlib.h>
+
+#ifdef TEST
+#include "blockingkprocess.cpp"
+
+#include <iostream>
+using namespace std;
+#endif
+
+#ifndef TEST
+#define ifTest(x) {}
+#else
+#define ifTest(x) x
+#endif
+
+///After how many seconds should we retry?
+#define CACHE_FAIL_FOR_SECONDS 200
+
+using namespace CppTools;
+
+
+namespace CppTools {
+ ///Helper-class used to fake file-modification times
+ class FileModificationTimeWrapper {
+ public:
+ ///@param files list of files that should be fake-modified(modtime will be set to current time)
+ FileModificationTimeWrapper( const QStringList& files = QStringList() ) : m_newTime( time(0) ) {
+ for( QStringList::const_iterator it = files.begin(); it != files.end(); ++it ) {
+ ifTest( cout << "touching " << (*it).ascii() << endl );
+ struct stat s;
+ if( stat( (*it).local8Bit().data(), &s ) == 0 ) {
+ ///Success
+ m_stat[*it] = s;
+ ///change the modification-time to m_newTime
+ struct timeval times[2];
+ times[0].tv_sec = m_newTime;
+ times[0].tv_usec = 0;
+ times[1].tv_sec = m_newTime;
+ times[1].tv_usec = 0;
+
+ if( utimes( (*it).local8Bit().data(), times ) != 0 )
+ {
+ ifTest( cout << "failed to touch " << (*it).ascii() << endl );
+ }
+ }
+ }
+ }
+
+ //Not used yet, might be used to return LD_PRELOAD=.. FAKE_MODIFIED=.. etc. later
+ QString commandPrefix() const {
+ return QString();
+ }
+
+ ///Undo changed modification-times
+ void unModify() {
+ for( StatMap::const_iterator it = m_stat.begin(); it != m_stat.end(); ++it ) {
+
+ ifTest( cout << "untouching " << it.key().ascii() << endl );
+
+ struct stat s;
+ if( stat( it.key().local8Bit().data(), &s ) == 0 ) {
+ if( s.st_mtime == m_newTime ) {
+ ///Still the modtime that we've set, change it back
+ struct timeval times[2];
+ times[0].tv_usec = 0;
+ times[0].tv_sec = s.st_atime;
+ times[1].tv_usec = 0;
+ times[1].tv_sec = (*it).st_mtime;
+ if( utimes( it.key().local8Bit().data(), times ) != 0 ) {
+ ifTest( cout << "failed to untouch " << it.key().ascii() << endl );
+ }
+ } else {
+ ///The file was modified since we changed the modtime
+ ifTest( cout << " will not untouch " << it.key().ascii() << " because the modification-time has changed" << endl );
+ }
+ }
+ }
+ };
+
+ ~FileModificationTimeWrapper() {
+ unModify();
+ }
+
+ private:
+ typedef QMap<QString, struct stat> StatMap;
+ StatMap m_stat;
+ time_t m_newTime;
+ };
+
+ class SourcePathInformation {
+ public:
+ SourcePathInformation( const QString& path ) : m_path( path ), m_isUnsermake(false), m_shouldTouchFiles(false) {
+ m_isUnsermake = isUnsermakePrivate( path );
+
+ ifTest( if( m_isUnsermake ) cout << "unsermake detected" << endl );
+ }
+
+ bool isUnsermake() const {
+ return m_isUnsermake;
+ }
+
+ ///When this is set, the file-modification times are changed no matter whether it is unsermake or make
+ void setShouldTouchFiles(bool b) {
+ m_shouldTouchFiles = b;
+ }
+
+ QString getCommand( const QString& sourceFile, const QString& makeParameters ) const {
+ if( isUnsermake() )
+ return "unsermake -k --no-real-compare -n " + makeParameters;
+ else
+ return "make -k --no-print-directory -W \'" + sourceFile + "\' -n " + makeParameters;
+ }
+
+ bool hasMakefile() const {
+ QFileInfo makeFile( m_path, "Makefile" );
+ return makeFile.exists();
+ }
+
+ bool shouldTouchFiles() const {
+ return isUnsermake() || m_shouldTouchFiles;
+ }
+
+ QStringList possibleTargets( const QString& targetBaseName ) const {
+ QStringList ret;
+ if( isUnsermake() ) {
+ //unsermake breaks if the first given target does not exist, so in worst-case 2 calls are necessary
+ ret << targetBaseName + ".lo";
+ ret << targetBaseName + ".o";
+ } else {
+ //It would be nice if both targets could be processed in one call, the problem is the exit-status of make, so for now make has to be called twice.
+ ret << targetBaseName + ".o";
+ ret << targetBaseName + ".lo";
+ //ret << targetBaseName + ".lo " + targetBaseName + ".o";
+ }
+ return ret;
+ }
+
+ private:
+ bool isUnsermakePrivate( const QString& path ) {
+ bool ret = false;
+ QFileInfo makeFile( path, "Makefile" );
+ QFile f( makeFile.absFilePath() );
+ if( f.open( IO_ReadOnly ) ) {
+ QString firstLine;
+ f.readLine( firstLine, 1000 );
+ if( firstLine.find( "generated by unsermake" ) != -1 ) {
+ ret = true;
+ }
+ f.close();
+ }
+ return ret;
+ }
+
+ QString m_path;
+ bool m_isUnsermake;
+ bool m_shouldTouchFiles;
+ };
+
+};
+
+bool IncludePathResolver::executeCommandPopen ( const QString& command, const QString& workingDirectory, QString& result ) const
+{
+ ifTest( cout << "executing " << command.ascii() << endl );
+
+ char* oldWd = getcwd(0,0);
+ chdir( workingDirectory.local8Bit() );
+
+ FILE* fp;
+ const int BUFSIZE = 2048;
+ char buf [BUFSIZE];
+
+ result = QString();
+
+ int status = 1;
+ if ((fp = popen(command.local8Bit(), "r")) != NULL) {
+ while (fgets(buf, sizeof (buf), fp))
+ result += QString(buf);
+
+ status = pclose(fp);
+ }
+
+ if( oldWd ) {
+ chdir( oldWd );
+ free( oldWd );
+ }
+ return status == 0;
+}
+
+IncludePathResolver::IncludePathResolver( bool continueEventLoop ) : m_isResolving(false), m_outOfSource(false), m_continueEventLoop(continueEventLoop) {
+/* m_continueEventLoop = false;
+#warning DEBUGGING TEST, REMOVE THIS*/
+}
+
+///More efficient solution: Only do exactly one call for each directory. During that call, mark all source-files as changed, and make all targets for those files.
+PathResolutionResult IncludePathResolver::resolveIncludePath( const QString& file ) {
+ QFileInfo fi( file );
+ return resolveIncludePath( fi.fileName(), fi.dirPath(true) );
+}
+
+PathResolutionResult IncludePathResolver::resolveIncludePath( const QString& file, const QString& workingDirectory ) {
+
+ struct Enabler {
+ bool& b;
+ Enabler( bool& bb ) : b(bb) {
+ b = true;
+ }
+ ~Enabler() {
+ b = false;
+ }
+ };
+
+ if( m_isResolving )
+ return PathResolutionResult(false, i18n("tried include-path-resolution while another resolution-process was still running") );
+
+ Enabler e( m_isResolving );
+
+ ///STEP 1: CACHING
+ QDir dir( workingDirectory );
+ dir = QDir( dir.absPath() );
+ QFileInfo makeFile( dir, "Makefile" );
+ if( !makeFile.exists() )
+ return PathResolutionResult(false, i18n("Makefile is missing in folder \"%1\"").arg(dir.absPath()), i18n("problem while trying to resolve include-paths for %1").arg(file) );
+
+ QStringList cachedPath; //If the call doesn't succeed, use the cached not up-to-date version
+ QDateTime makeFileModification = makeFile.lastModified();
+ Cache::iterator it = m_cache.find( dir.path() );
+ if( it != m_cache.end() ) {
+ cachedPath = (*it).path;
+ if( makeFileModification == (*it).modificationTime ) {
+ if( !(*it).failed ) {
+ //We have a valid cached result
+ PathResolutionResult ret(true);
+ ret.path = (*it).path;
+ return ret;
+ } else {
+ //We have a cached failed result. We should use that for some time but then try again. Return the failed result if: ( there were too many tries within this folder OR this file was already tried ) AND The last tries have not expired yet
+ if( /*((*it).failedFiles.size() > 3 || (*it).failedFiles.find( file ) != (*it).failedFiles.end()) &&*/ (*it).failTime.secsTo( QDateTime::currentDateTime() ) < CACHE_FAIL_FOR_SECONDS ) {
+ PathResolutionResult ret(false); //Fake that the result is ok
+ ret.errorMessage = i18n("Cached: ") + (*it).errorMessage;
+ ret.longErrorMessage = (*it).longErrorMessage;
+ ret.path = (*it).path;
+ return ret;
+ } else {
+ //Try getting a correct result again
+ }
+ }
+ }
+ }
+
+ ///STEP 1: Prepare paths
+ QString targetName;
+ QFileInfo fi( file );
+
+ QString absoluteFile = file;
+ if( !file.startsWith("/") )
+ absoluteFile = dir.path() + "/" + file;
+ KURL u( absoluteFile );
+ u.cleanPath();
+ absoluteFile = u.path();
+
+ int dot;
+ if( (dot = file.findRev( '.' )) == -1 )
+ return PathResolutionResult( false, i18n( "Filename %1 seems to be malformed" ).arg(file) );
+
+ targetName = file.left( dot );
+
+ QString wd = dir.path();
+ if( !wd.startsWith("/") ) {
+ wd = QDir::currentDirPath() + "/" + wd;
+ KURL u( wd );
+ u.cleanPath();
+ wd = u.path();
+ }
+ if( m_outOfSource ) {
+ if( wd.startsWith( m_source ) ) {
+ //Move the current working-directory out of source, into the build-system
+ wd = m_build + "/" + wd.mid( m_source.length() );
+ KURL u( wd );
+ u.cleanPath();
+ wd = u.path();
+ }
+ }
+
+ SourcePathInformation source( wd );
+ QStringList possibleTargets = source.possibleTargets( targetName );
+
+ source.setShouldTouchFiles(true); //Think about whether this should be always enabled. I've enabled it for now so there's an even bigger chance that everything works.
+
+ ///STEP 3: Try resolving the paths, by using once the absolute and once the relative file-path. Which kind is required differs from setup to setup.
+
+ ///STEP 3.1: Try resolution using the absolute path
+ PathResolutionResult res;
+ //Try for each possible target
+ for( QStringList::const_iterator it = possibleTargets.begin(); it != possibleTargets.end(); ++it ) {
+ res = resolveIncludePathInternal( absoluteFile, wd, *it, source );
+ if( res ) break;
+ }
+ if( res ) {
+ CacheEntry ce;
+ ce.errorMessage = res.errorMessage;
+ ce.longErrorMessage = res.longErrorMessage;
+ ce.modificationTime = makeFileModification;
+ ce.path = res.path;
+ m_cache[dir.path()] = ce;
+
+ return res;
+ }
+
+
+ ///STEP 3.2: Try resolution using the relative path
+ QString relativeFile = KURL::relativePath(wd, absoluteFile);
+ for( QStringList::const_iterator it = possibleTargets.begin(); it != possibleTargets.end(); ++it ) {
+ res = resolveIncludePathInternal( relativeFile, wd, *it, source );
+ if( res ) break;
+ }
+
+ if( res.path.isEmpty() )
+ res.path = cachedPath; //We failed, maybe there is an old cached result, use that.
+
+ if( it == m_cache.end() )
+ it = m_cache.insert( dir.path(), CacheEntry() );
+
+ CacheEntry& ce(*it);
+ ce.modificationTime = makeFileModification;
+ ce.path = res.path;
+ if( !res ) {
+ ce.failed = true;
+ ce.errorMessage = res.errorMessage;
+ ce.longErrorMessage = res.longErrorMessage;
+ ce.failTime = QDateTime::currentDateTime();
+ ce.failedFiles[file] = true;
+ } else {
+ ce.failed = false;
+ ce.failedFiles.clear();
+ }
+
+ return res;
+}
+
+PathResolutionResult IncludePathResolver::getFullOutput( const QString& command, const QString& workingDirectory, QString& output ) const{
+ if( m_continueEventLoop ) {
+ BlockingKProcess proc;
+ proc.setWorkingDirectory( workingDirectory );
+ proc.setUseShell( true );
+ proc << command;
+ if ( !proc.start(KProcess::NotifyOnExit, KProcess::Stdout) ) {
+ return PathResolutionResult( false, i18n("Could not start the make-process") );
+ }
+
+ output = proc.stdOut();
+ if( proc.exitStatus() != 0 )
+ return PathResolutionResult( false, i18n("make-process finished with nonzero exit-status"), i18n("output: %1").arg( output ) );
+ } else {
+ bool ret = executeCommandPopen(command, workingDirectory, output);
+
+ if( !ret )
+ return PathResolutionResult( false, i18n("make-process failed"), i18n("output: %1").arg( output ) );
+ }
+ return PathResolutionResult(true);
+}
+
+PathResolutionResult IncludePathResolver::resolveIncludePathInternal( const QString& file, const QString& workingDirectory, const QString& makeParameters, const SourcePathInformation& source ) {
+
+ QString processStdout;
+
+ QStringList touchFiles;
+ if( source.shouldTouchFiles() )
+ touchFiles << file;
+
+ FileModificationTimeWrapper touch( touchFiles );
+
+ QString fullOutput;
+ PathResolutionResult res = getFullOutput( source.getCommand( file, makeParameters ), workingDirectory, fullOutput );
+ if( !res )
+ return res;
+
+ QRegExp newLineRx("\\\\\\n");
+ fullOutput.replace( newLineRx, "" );
+ ///@todo collect multiple outputs at the same time for performance-reasons
+ QString firstLine = fullOutput;
+ int lineEnd;
+ if( (lineEnd = fullOutput.find('\n')) != -1 )
+ firstLine.truncate( lineEnd ); //Only look at the first line of output
+
+ /**
+ * There's two possible cases this can currently handle.
+ * 1.: gcc is called, with the parameters we are searching for(so we parse the parameters)
+ * 2.: A recursive make is called, within another directory(so we follow the recursion and try again) "cd /foo/bar && make -f pi/pa/build.make pi/pa/po.o
+ * */
+
+
+ ///STEP 1: Test if it is a recursive make-call
+ QRegExp makeRx( "\\bmake\\s" );
+ int offset = 0;
+ while( (offset = makeRx.search( firstLine, offset )) != -1 )
+ {
+ QString prefix = firstLine.left( offset ).stripWhiteSpace();
+ if( prefix.endsWith( "&&") || prefix.endsWith( ";" ) || prefix.isEmpty() )
+ {
+ QString newWorkingDirectory = workingDirectory;
+ ///Extract the new working-directory
+ if( !prefix.isEmpty() ) {
+ if( prefix.endsWith( "&&" ) )
+ prefix.truncate( prefix.length() - 2 );
+ else if( prefix.endsWith( ";" ) )
+ prefix.truncate( prefix.length() - 1 );
+ ///Now test if what we have as prefix is a simple "cd /foo/bar" call.
+ if( prefix.startsWith( "cd ") && !prefix.contains( ";") && !prefix.contains("&&") ) {
+ newWorkingDirectory = prefix.right( prefix.length() - 3 ).stripWhiteSpace();
+ if( !newWorkingDirectory.startsWith("/") )
+ newWorkingDirectory = workingDirectory + "/" + newWorkingDirectory;
+ KURL u( newWorkingDirectory );
+ u.cleanPath();
+ newWorkingDirectory = u.path();
+ }
+ }
+ QFileInfo d( newWorkingDirectory );
+ if( d.exists() ) {
+ ///The recursive working-directory exists.
+ QString makeParams = firstLine.mid( offset+5 );
+ if( !makeParams.contains( ";" ) && !makeParams.contains( "&&" ) ) {
+ ///Looks like valid parameters
+ ///Make the file-name absolute, so it can be referenced from any directory
+ QString absoluteFile = file;
+ if( !absoluteFile.startsWith("/") )
+ absoluteFile = workingDirectory + "/" + file;
+ KURL u( absoluteFile );
+ u.cleanPath();
+ ///Try once with absolute, and if that fails with relative path of the file
+ SourcePathInformation newSource( newWorkingDirectory );
+ PathResolutionResult res = resolveIncludePathInternal( u.path(), newWorkingDirectory, makeParams, newSource );
+ if( res )
+ return res;
+ return resolveIncludePathInternal( KURL::relativePath(newWorkingDirectory,u.path()), newWorkingDirectory, makeParams , newSource );
+ }else{
+ return PathResolutionResult( false, i18n("Recursive make-call failed"), i18n("The parameter-string \"%1\" does not seem to be valid. Output was: %2").arg(makeParams).arg(fullOutput) );
+ }
+ } else {
+ return PathResolutionResult( false, i18n("Recursive make-call failed"), i18n("The directory \"%1\" does not exist. Output was: %2").arg(newWorkingDirectory).arg(fullOutput) );
+ }
+
+ } else {
+ return PathResolutionResult( false, i18n("Recursive make-call malformed"), i18n("Output was: %2").arg(fullOutput) );
+ }
+
+ ++offset;
+ if( offset >= firstLine.length() ) break;
+ }
+
+ ///STEP 2: Search the output for include-paths
+ QRegExp validRx( "\\b([cg]\\+\\+|gcc)" );
+ if( validRx.search( fullOutput ) == -1 )
+ return PathResolutionResult( false, i18n("Output seems not to be a valid gcc or g++ call"), i18n("Folder: \"%1\" Command: \"%2\" Output: \"%3\"").arg(workingDirectory).arg( source.getCommand(file, makeParameters) ).arg(fullOutput) );
+
+ PathResolutionResult ret( true );
+ ret.longErrorMessage = fullOutput;
+
+ QString includeParameterRx( "\\s(-I|--include-dir=|-I\\s)" );
+ QString quotedRx( "(\\').*(\\')|(\\\").*(\\\")" ); //Matches "hello", 'hello', 'hello"hallo"', etc.
+ QString escapedPathRx( "(([^)(\"'\\s]*)(\\\\\\s)?)*" ); //Matches /usr/I\ am \ a\ strange\ path/include
+
+ QRegExp includeRx( QString( "%1(%2|%3)(?=\\s)" ).arg( includeParameterRx ).arg( quotedRx ).arg( escapedPathRx ) );
+ includeRx.setMinimal( true );
+ includeRx.setCaseSensitive( true );
+ offset = 0;
+ while( (offset = includeRx.search( fullOutput, offset )) != -1 ) {
+ offset += 1; ///The previous white space
+ int pathOffset = 2;
+ if( fullOutput[offset+1] == '-' ) {
+ ///Must be --include-dir=, with a length of 14 characters
+ pathOffset = 14;
+ }
+ if( fullOutput.length() <= offset + pathOffset )
+ break;
+
+ if( fullOutput[offset+pathOffset].isSpace() )
+ pathOffset++;
+
+
+
+ int start = offset + pathOffset;
+ int end = offset + includeRx.matchedLength();
+
+ QString path = fullOutput.mid( start, end-start ).stripWhiteSpace();
+ if( path.startsWith( "\"") || path.startsWith( "\'") && path.length() > 2 ) {
+ //probable a quoted path
+ if( path.endsWith(path.left(1)) ) {
+ //Quotation is ok, remove it
+ path = path.mid( 1, path.length() - 2 );
+ }
+ }
+ if( !path.startsWith("/") )
+ path = workingDirectory + (workingDirectory.endsWith("/") ? "" : "/") + path;
+
+ KURL u( path );
+ u.cleanPath();
+
+ ret.path << u.path();
+
+ offset = end-1;
+ }
+
+
+ return ret;
+}
+
+void IncludePathResolver::setOutOfSourceBuildSystem( const QString& source, const QString& build ) {
+ m_outOfSource = true;
+ m_source = source;
+ m_build = build;
+}
+
+#ifdef TEST
+/** This can be used for testing and debugging the system. To compile it use
+ * gcc includepathresolver.cpp -I /usr/share/qt3/include -I /usr/include/kde -I ../../lib/util -DTEST -lkdecore -g -o includepathresolver
+ * */
+
+int main(int argc, char **argv) {
+ QApplication app(argc,argv);
+ IncludePathResolver resolver;
+ if( argc < 3 ) {
+ cout << "params: 1. file-name, 2. working-directory [3. source-directory 4. build-directory]" << endl;
+ return 1;
+ }
+ if( argc >= 5 ) {
+ cout << "mapping " << argv[3] << " -> " << argv[4] << endl;
+ resolver.setOutOfSourceBuildSystem( argv[3], argv[4] );
+ }
+ PathResolutionResult res = resolver.resolveIncludePath( argv[1], argv[2] );
+ cout << "success: " << res.success << "\n";
+ if( !res.success ) {
+ cout << "error-message: \n" << res.errorMessage << "\n";
+ cout << "long error-message: \n" << res.longErrorMessage << "\n";
+ }
+ cout << "path: \n" << res.path.join("\n");
+ return res.success;
+}
+
+#endif
diff --git a/languages/cpp/includepathresolver.h b/languages/cpp/includepathresolver.h
new file mode 100644
index 00000000..c182d52e
--- /dev/null
+++ b/languages/cpp/includepathresolver.h
@@ -0,0 +1,76 @@
+/***************************************************************************
+ copyright : (C) 2007 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef INCLUDEPATHRESOLVER_H
+#define INCLUDEPATHRESOLVER_H
+#include <qstring.h> /* defines QString */
+#include <qmap.h>
+
+namespace CppTools {
+ class FileModificationTimeWrapper;
+
+ struct PathResolutionResult {
+ PathResolutionResult( bool _success = false, const QString& _errorMessage = QString(), const QString& _longErrorMessage = QString() ) : success( _success ), errorMessage( _errorMessage ), longErrorMessage( _longErrorMessage ) {
+ }
+ bool success;
+ QString errorMessage;
+ QString longErrorMessage;
+
+ QStringList path;
+
+ operator bool() const {
+ return success;
+ };
+ };
+
+ class SourcePathInformation;
+
+ ///One resolution-try can issue up to 4 make-calls in worst case
+ class IncludePathResolver {
+ public:
+ ///Whether the Qt event-loop should be continued(using BlockingKProcess). This crashes if enabled in a non-foreground thread.
+ IncludePathResolver( bool continueEventLoop = false );
+ ///Same as below, but uses the directory of the file as working-directory. The argument must be absolute.
+ PathResolutionResult resolveIncludePath( const QString& file );
+ ///The include-path is only computed once for a whole directory, then it is cached using the modification-time of the Makefile.
+ PathResolutionResult resolveIncludePath( const QString& file, const QString& workingDirectory );
+ ///source and build must be absolute paths
+ void setOutOfSourceBuildSystem( const QString& source, const QString& build );
+ private:
+ bool m_isResolving;
+ bool m_continueEventLoop;
+ struct CacheEntry {
+ CacheEntry() : failed(false) {
+ }
+ QDateTime modificationTime;
+ QStringList path;
+ QString errorMessage, longErrorMessage;
+ bool failed;
+ QMap<QString,bool> failedFiles;
+ QDateTime failTime;
+ };
+ typedef QMap<QString, CacheEntry> Cache;
+ Cache m_cache;
+
+ ///Executes the command, either using popen or BlockingKProcess
+ PathResolutionResult getFullOutput( const QString& command, const QString& workingDirectory, QString& output ) const;
+ bool executeCommandPopen ( const QString& command, const QString& workingDirectory, QString& result ) const;
+ ///file should be the name of the target, without extension(because that may be different)
+ PathResolutionResult resolveIncludePathInternal( const QString& file, const QString& workingDirectory, const QString& makeParameters, const SourcePathInformation& source );
+ bool m_outOfSource;
+ QString m_source;
+ QString m_build;
+ };
+};
+
+#endif
diff --git a/languages/cpp/kdevcppsupport.desktop b/languages/cpp/kdevcppsupport.desktop
new file mode 100644
index 00000000..5283b529
--- /dev/null
+++ b/languages/cpp/kdevcppsupport.desktop
@@ -0,0 +1,86 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=C++ Support
+Comment[ca]=Suport per a C++
+Comment[da]=C++ understøttelse
+Comment[de]=C++-Unterstützung für KDevelop
+Comment[el]=ΥποστήÏιξη C++
+Comment[es]=Soporte para C++
+Comment[et]=C++ toetus
+Comment[eu]=C++ euskarria
+Comment[fa]=پشتیبانی C++
+Comment[fr]=Prise en charge du langage C++
+Comment[ga]=Tacaíocht C++
+Comment[gl]=Soporte para C++
+Comment[hi]=सी++ समरà¥à¤¥à¤¨
+Comment[hu]=C++-támogatás
+Comment[is]=C++ stuðningur
+Comment[it]=Supporto per C++
+Comment[ja]=C++ サãƒãƒ¼ãƒˆ
+Comment[nds]=Ünnerstütten för C++
+Comment[ne]=C++ समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor C++
+Comment[pl]=Obsługa C++
+Comment[pt]=Suporte a C++
+Comment[pt_BR]=Suporte ao C++
+Comment[ru]=Поддержка Ñзыка C++
+Comment[sk]=C++ podpora
+Comment[sl]=Podpora za C++
+Comment[sr]=Подршка за C++
+Comment[sr@Latn]=Podrška za C++
+Comment[sv]=C++ stöd
+Comment[ta]=C++ ஆதரவà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони C++
+Comment[tr]=C++ DesteÄŸi
+Comment[zh_CN]=C++ 支æŒ
+Comment[zh_TW]=C++ 支æ´
+Name=KDevCppSupport
+Name[da]=KDevelop C++ understøttelse
+Name[hi]=के-डेव-सीपीपी-समरà¥à¤¥à¤¨
+Name[nds]=CPP-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaCpp
+Name[sk]=KDev C++ podpora
+Name[sv]=KDevelop C++ stöd
+Name[ta]=கெடெவà¯à®šà®¿à®ªà®¿à®ªà®¿ ஆதரவà¯
+Name[zh_TW]=KDevelop C++ 支æ´
+GenericName=C++ Support
+GenericName[ca]=Suport per a C++
+GenericName[da]=C++ understøttelse
+GenericName[de]=Unterstützung für C++
+GenericName[el]=ΥποστήÏιξη C++
+GenericName[es]=Soporte para C++
+GenericName[et]=C++ toetus
+GenericName[eu]=C++ euskarria
+GenericName[fa]=پشتیبانی C++
+GenericName[fr]=Prise en charge du langage C++
+GenericName[ga]=Tacaíocht C++
+GenericName[gl]=Soporte para C++
+GenericName[hi]=सी++ समरà¥à¤¥à¤¨
+GenericName[hu]=C++-támogatás
+GenericName[it]=Supporto C++
+GenericName[ja]=C++ サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för C++
+GenericName[ne]=C++ समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor C++
+GenericName[pa]=C++ ਸਹਿਯੋਗ
+GenericName[pl]=Obsługa C++
+GenericName[pt]=Suporte a C++
+GenericName[pt_BR]=Suporte ao C++
+GenericName[ru]=Поддержка Ñзыка C++
+GenericName[sk]=C++ podpora
+GenericName[sl]=Podpora za C++
+GenericName[sr]=Подршка за C++
+GenericName[sr@Latn]=Podrška za C++
+GenericName[sv]=C++ stöd
+GenericName[ta]=C++ ஆதரவà¯
+GenericName[tg]=ÐÑ€Ó£ намудани забони C++
+GenericName[tr]=C++ DesteÄŸi
+GenericName[zh_CN]=C++ 支æŒ
+GenericName[zh_TW]=C++ 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+Icon=source_cpp
+X-KDE-Library=libkdevcppsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=C++
+X-KDevelop-Args=Cpp
diff --git a/languages/cpp/kdevcppsupport.rc b/languages/cpp/kdevcppsupport.rc
new file mode 100644
index 00000000..37e3fa3a
--- /dev/null
+++ b/languages/cpp/kdevcppsupport.rc
@@ -0,0 +1,30 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevCppSupport" version="9">
+<MenuBar>
+ <Menu name="edit">
+ <Action name="edit_complete_text"/>
+ </Menu>
+
+ <Menu name="edit">
+ <Action name="edit_make_member"/>
+ </Menu>
+
+ <Menu name="view">
+ <Action name="edit_switchheader"/>
+ </Menu>
+
+ <Menu name="project">
+ <Action name="project_newclass" group="project_classes"/>
+ </Menu>
+</MenuBar>
+ <Menu name="hidden">
+ <Action name="edit_create_getter_setter"/>
+ <Action name="edit_navigate"/>
+ <Action name="jump_to_declaration_cursor_context"/>
+ <Action name="jump_to_defintion_cursor_context"/>
+ </Menu>
+<ToolBar name="browserToolBar" position="Top" iconText="IconOnly">
+ <Action name="project_newclass"/>
+</ToolBar>
+</kpartgui>
+
diff --git a/languages/cpp/kdevcsupport.desktop b/languages/cpp/kdevcsupport.desktop
new file mode 100644
index 00000000..2a307625
--- /dev/null
+++ b/languages/cpp/kdevcsupport.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=C Support
+Comment[ca]=Suport per a C
+Comment[da]=C understøttelse
+Comment[de]=C-Unterstützung für KDevelop
+Comment[el]=ΥποστήÏιξη C
+Comment[es]=Soporte para C
+Comment[et]=C toetus
+Comment[eu]=C euskarria
+Comment[fa]=پشتیبانی سی
+Comment[fr]=Prise en charge du langage C
+Comment[ga]=Tacaíocht C
+Comment[gl]=Soporte para C
+Comment[hi]=सी समरà¥à¤¥à¤¨
+Comment[hu]=C-támogatás
+Comment[is]=C stuðningur
+Comment[it]=Supporto per C
+Comment[ja]=C サãƒãƒ¼ãƒˆ
+Comment[nds]=Ünnerstütten för C
+Comment[ne]=C समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor C
+Comment[pa]=C ਸਹਿਯੋਗ
+Comment[pl]=Obsługa C
+Comment[pt]=Suporte a C
+Comment[pt_BR]=Suporte ao C
+Comment[ru]=Поддержка Ñзыка C
+Comment[sk]=C podpora
+Comment[sl]=Podpora za C
+Comment[sr]=Подршка за C
+Comment[sr@Latn]=Podrška za C
+Comment[sv]=C-stöd
+Comment[ta]=C ஆதரவà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони C
+Comment[tr]=C DesteÄŸi
+Comment[zh_CN]=C 支æŒ
+Comment[zh_TW]=C 支æ´
+Name=KDevCSupport
+Name[da]=KDevelop C understøttelse
+Name[nds]=C-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaC
+Name[sk]=KDev C podpora
+Name[sv]=KDevelop C-stöd
+Name[zh_TW]=KDevelop C 支æ´
+GenericName=C Support
+GenericName[ca]=Suport per a C
+GenericName[da]=C understøttelse
+GenericName[de]=Unterstützung für C
+GenericName[el]=ΥποστήÏιξη C
+GenericName[es]=Soporte para C
+GenericName[et]=C toetus
+GenericName[eu]=C euskarria
+GenericName[fa]=پشتیبانی سی
+GenericName[fr]=Prise en charge du langage C
+GenericName[ga]=Tacaíocht C
+GenericName[gl]=Soporte para C
+GenericName[hi]=सी समरà¥à¤¥à¤¨
+GenericName[hu]=C-támogatás
+GenericName[it]=Supporto C
+GenericName[ja]=C サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för C
+GenericName[ne]=C समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor C
+GenericName[pa]=C ਸਹਿਯੋਗ
+GenericName[pl]=Obsługa C
+GenericName[pt]=Suporte a C
+GenericName[pt_BR]=Suporte ao C
+GenericName[ru]=Поддержка Ñзыка C
+GenericName[sk]=C podpora
+GenericName[sl]=Podpora za C
+GenericName[sr]=Подршка за C
+GenericName[sr@Latn]=Podrška za C
+GenericName[sv]=C-stöd
+GenericName[ta]=C ஆதரவà¯
+GenericName[tg]=ÐÑ€Ó£ намудани забони C
+GenericName[tr]=C DesteÄŸi
+GenericName[zh_CN]=C 支æŒ
+GenericName[zh_TW]=C 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+Icon=source_cpp
+X-KDE-Library=libkdevcppsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=C
+X-KDevelop-Args=C
diff --git a/languages/cpp/kdevdeepcopy.h b/languages/cpp/kdevdeepcopy.h
new file mode 100644
index 00000000..f006bbce
--- /dev/null
+++ b/languages/cpp/kdevdeepcopy.h
@@ -0,0 +1,14 @@
+#ifndef KDEVDEEPCOPY_H
+#define KDEVDEEPCOPY_H
+
+#include <qstring.h>
+
+inline QString deepCopy( const QString& s )
+{
+ QCString str = s.utf8();
+ return QString::fromUtf8( str, str.length() );
+}
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/kdevdriver.cpp b/languages/cpp/kdevdriver.cpp
new file mode 100644
index 00000000..53cf413e
--- /dev/null
+++ b/languages/cpp/kdevdriver.cpp
@@ -0,0 +1,206 @@
+#include "klocale.h" /* defines [function] i18n */
+#include <lexer.h>
+
+#include "kdevdriver.h"
+#include "cppcodecompletionconfig.h"
+#include "setuphelper.h"
+#include <unistd.h>
+#include "includepathresolver.h"
+
+
+KDevDriver::KDevDriver( CppSupportPart* cppSupport, bool foreground )
+: m_cppSupport( cppSupport ), m_includePathResolver(0), m_foreground(foreground), m_shouldParseIncludedFiles(true)
+{
+ //setupProject();
+ setup();
+
+}
+
+KDevDriver::~KDevDriver() {
+ delete m_includePathResolver;
+}
+
+CppSupportPart* KDevDriver::cppSupport() { return m_cppSupport; }
+
+void KDevDriver::setupProject()
+{
+ QMap<QString, bool> map;
+
+ QStringList fileList = m_cppSupport->project() ->allFiles();
+ QStringList::ConstIterator it = fileList.begin();
+ while ( it != fileList.end() )
+ {
+ QFileInfo info( *it );
+ ++it;
+
+ map.insert( info.dirPath( true ), true );
+ }
+ QMap<QString, bool>::Iterator mapit = map.begin();
+ while ( mapit != map.end() )
+ {
+ addIncludePath( mapit.key() );
+ ++mapit;
+ }
+}
+
+void KDevDriver::setupLexer( Lexer* lexer )
+{
+ Driver::setupLexer( lexer );
+ lexer->setReportMessages( true );
+ lexer->setReportWarnings( true );
+}
+
+//! setup the preprocessor
+//! code provided by Reginald Stadlbauer <reggie@trolltech.com>
+void KDevDriver::setup()
+{
+ if( lexerCache() ) lexerCache()->clear(); ///Clear the lexer-cache so missing headers get a chance to be parsed
+ clearMacros();
+ clearIncludePaths();
+
+ addMacro( Macro("KDEVELOP_PARSER", "3.4") );
+
+ bool ok;
+ QString verboseGccOutput = SetupHelper::getVerboseGccIncludePath( &ok );
+ QStringList verboseGccLines = QStringList::split( '\n', verboseGccOutput );
+ if( verboseGccLines.count() > 3 ) {
+ ///Parse the output of gcc. It includes gcc's final include-path when parsing an empty c++-file(including dirs like /usr/include/c++/4.xx/...)
+ //what about order?
+ for( QStringList::iterator it = verboseGccLines.begin(); it != verboseGccLines.end(); ++it ) {
+ if( (*it).startsWith(" ") && (*it).length() > 2 && (*it)[1] != ' ' ) {
+ //it is a potential include-file
+ QString path = (*it).stripWhiteSpace();
+ QFileInfo info( path );
+ if( info.exists() ) {
+ kdDebug( 9007 ) << "Adding include-path from gcc-output: \"" << path << "\" absolute: \"" << info.absFilePath() << "\"" << endl;
+ addIncludePath(info.absFilePath());
+ }
+ }
+ }
+ } else {
+ ///Do some of the old stuff
+ addIncludePath( "/include" );
+ addIncludePath( "/usr/include" );
+ addIncludePath( "/usr/local/include" );
+
+ bool ok;
+ QString includePath = SetupHelper::getGccIncludePath(&ok);
+ if (ok) {
+ QStringList ls = QStringList::split( "\n", includePath );
+ for( QStringList::const_iterator it = ls.begin(); it != ls.end(); ++it ) {
+ if( !(*it).isEmpty() )
+ addIncludePath( *it );
+ }
+ }
+
+ addIncludePath( includePath );
+ addIncludePath( "/usr/include/g++-3" );
+ addIncludePath( "/usr/include/g++" );
+ }
+
+ addMacro( Macro( "__cplusplus", "1" ) );
+
+ ///@todo maybe remove the following? Is there any normal user who has his environment set up correctly so this is of any use?
+ QString kdedir = getenv( "KDEDIR" );
+ if( !kdedir.isNull() )
+ addIncludePath( kdedir + "/include" );
+
+ QString qmakespec = getenv( "QMAKESPEC" );
+ if ( qmakespec.isNull() )
+ qmakespec = "linux-g++";
+
+ QString qtdir = getenv( "QTDIR" );
+ if( !qtdir.isNull() ) {
+ addIncludePath( qtdir + "/include" );
+
+ // #### implement other mkspecs and find a better way to find the
+ // #### proper mkspec (althoigh this will be no fun :-)
+
+ addIncludePath( qtdir + "/mkspecs/" + qmakespec );
+ }
+
+ QStringList lines = SetupHelper::getGccMacros(&ok);
+ if (!ok) {
+ for (QStringList::ConstIterator it = lines.constBegin(); it != lines.constEnd(); ++it) {
+ QStringList lst = QStringList::split( ' ', *it );
+ if ( lst.count() != 3 )
+ continue;
+ addMacro( Macro( lst[1], lst[2] ) );
+ }
+ }
+
+ addMacro( Macro( "__cplusplus", "1" ) );
+ addMacro( Macro( "Q_SIGNALS", "signals" ) );
+ addMacro( Macro( "Q_SLOTS", "slots" ) );
+ addMacro( Macro( "Q_SCRIPTABLE", "" ) );
+
+ CppCodeCompletionConfig* cfg = m_cppSupport->codeCompletionConfig();
+ QString str = cfg->customIncludePaths();
+ int pos = 0;
+ while( pos < str.length() ) {
+ int end = str.find( ';', pos );
+ if( end == -1 ) {
+ end = str.length();
+ }
+
+ QString s = str.mid( pos, end-pos ).stripWhiteSpace();
+ if( !s.isEmpty() ) {
+ if( !s.startsWith( "/" ) && m_cppSupport->project() ) {
+ s = m_cppSupport->project()->projectDirectory() + "/" + s;
+ }
+ addIncludePath( s );
+ }
+
+ pos = end+1;
+ }
+
+ setResolveDependencesEnabled( cfg->preProcessAllHeaders() | cfg->parseMissingHeaders() );
+
+ delete m_includePathResolver;
+ if( cfg->resolveIncludePaths() ) {
+ m_includePathResolver = new CppTools::IncludePathResolver( m_foreground );
+ if( m_cppSupport && m_cppSupport->project() )
+ m_includePathResolver->setOutOfSourceBuildSystem( m_cppSupport->project()->projectDirectory(), m_cppSupport->project()->buildDirectory() );
+ } else
+ m_includePathResolver = 0;
+
+ m_shouldParseIncludedFiles = cfg->parseMissingHeaders();
+}
+
+QStringList KDevDriver::getCustomIncludePath( const QString& file ) {
+ if( !file.startsWith("/") )
+ kdDebug( 9007 ) << "KDevDriver::getCustomIncludePath(..): given file \"" << file << "\" is not absolute" << endl;
+ if( !m_includePathResolver )
+ return includePaths();
+ CppTools::PathResolutionResult res = m_includePathResolver->resolveIncludePath( file );
+
+ if( !res.success ) {
+ Problem p( i18n( "%1. Message: %2" ).arg( res.errorMessage ).arg( res.longErrorMessage ), 0, 0, Problem::Level_Warning );
+ p.setFileName( file );
+ addProblem( file, p );
+ }
+
+ return res.path + includePaths();
+}
+
+bool KDevDriver::shouldParseIncludedFile( const ParsedFilePointer& file ) {
+ QString compoundString = file->fileName() + "||" + QString("%1").arg(file->usedMacros().valueHash()) + "||" + QString("%1").arg(file->usedMacros().idHash());
+
+ if( !m_shouldParseIncludedFiles )
+ return false;
+ m_cppSupport->safeFileSet().contains( compoundString );
+
+ if( m_cppSupport->safeFileSet().contains( file->fileName()) ){
+ return false;
+ } else if( m_cppSupport->safeFileSet().contains( compoundString ) ) {
+ //kdDebug( 9007 ) << "ALREADY IN FILE-SET: " << compoundString << endl;
+ return false;
+ } else {
+ m_cppSupport->safeFileSet().insert( compoundString ); //This is needed so the same instance of a file is not queued many times
+ //kdDebug( 9007 ) << "NOT IN FILE-SET, PARSING: " << compoundString << endl;
+ return true;
+ }
+
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/kdevdriver.h b/languages/cpp/kdevdriver.h
new file mode 100644
index 00000000..f46894b4
--- /dev/null
+++ b/languages/cpp/kdevdriver.h
@@ -0,0 +1,58 @@
+
+#ifndef __kdevdriver_h
+#define __kdevdriver_h
+
+#include "cppsupportpart.h"
+#include "driver.h"
+
+#include <kdevproject.h>
+#include <kdeversion.h>
+
+#include <cstdlib>
+#include <unistd.h>
+#include <qmap.h>
+
+class KProcess;
+namespace CppTools {
+ class IncludePathResolver;
+};
+
+class KDevDriver: public Driver
+{
+public:
+ ///When the driver is used in a background-thread, foreground MUST be false(else crash)
+ KDevDriver( CppSupportPart* cppSupport, bool foreground = false );
+ ~KDevDriver();
+ CppSupportPart* cppSupport();
+ void setupProject();
+ //! setup the preprocessor
+ //! code provided by Reginald Stadlbauer <reggie@trolltech.com>
+ void setup();
+
+ virtual void addMacro( const Macro& m )
+ {
+ if ( m.name() == "signals" || m.name() == "slots" )
+ return ;
+ Driver::addMacro( m );
+ }
+
+protected:
+ void setupLexer( Lexer* lexer );
+
+ ///Returns the complete include-path for that file. Not constant because it may add Problem-items to the driver. Must be absolute path.
+ virtual QStringList getCustomIncludePath( const QString& file );
+
+ virtual bool shouldParseIncludedFile( const ParsedFilePointer& /*file*/ );
+
+private:
+
+ CppSupportPart* m_cppSupport;
+ CppTools::IncludePathResolver* m_includePathResolver;
+ bool m_foreground;
+ bool m_shouldParseIncludedFiles;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
+
diff --git a/languages/cpp/main.cpp b/languages/cpp/main.cpp
new file mode 100644
index 00000000..079fba37
--- /dev/null
+++ b/languages/cpp/main.cpp
@@ -0,0 +1,283 @@
+
+#include <iostream>
+
+#include "driver.h"
+#include "ast.h"
+#include "lexer.h"
+#include "tag_creator.h"
+#include "setuphelper.h"
+
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+
+#include <catalog.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+class RppDriver: public Driver
+{
+public:
+ RppDriver( Catalog* c )
+ : catalog( c ), m_generateTags( true )
+ {
+ setup();
+ }
+
+ virtual ~RppDriver()
+ {
+ TagCreator::destroyDocumentation();
+ }
+
+ void setGenerateTags( bool b )
+ {
+ m_generateTags = b;
+ }
+
+ void addDocDirectory( const QString& dir )
+ {
+ m_docDirectoryList.append( dir );
+ TagCreator::setDocumentationDirectories( m_docDirectoryList );
+ }
+
+ void fileParsed( const ParsedFile& fileName )
+ {
+ std::cout << ( m_generateTags ? "generate tags for " : "checking " )
+ << QFile::encodeName( fileName.fileName() ).data() << std::endl;
+
+ QValueList<Problem> l = problems( fileName.fileName() );
+ QValueList<Problem>::Iterator it = l.begin();
+ while ( it != l.end() )
+ {
+ const Problem & p = *it;
+ ++it;
+ std::cout << QFile::encodeName( fileName.fileName() ).data() << ":" << p.line() << ":"
+ << p.column() << ": " << p.text().latin1() << std::endl;
+ }
+
+ takeTranslationUnit( fileName );
+
+ if ( m_generateTags )
+ {
+ TagCreator w( fileName.fileName(), catalog );
+ w.parseTranslationUnit( fileName );
+ }
+
+ if ( !isResolveDependencesEnabled() )
+ removeAllMacrosInFile( fileName.fileName() );
+ }
+
+ void setupLexer( Lexer* lex )
+ {
+ //lex->disableSkipWords();
+ Driver::setupLexer( lex );
+ }
+
+ // setup the preprocessor
+ // code provided by Reginald Stadlbauer <reggie@trolltech.com>
+ void setup()
+ {
+ QString kdedir = getenv( "KDEDIR" );
+ if ( !kdedir.isNull() )
+ addIncludePath( kdedir + "/include" );
+
+ QString qtdir = getenv( "QTDIR" );
+ if ( !qtdir.isNull() )
+ addIncludePath( qtdir + "/include" );
+
+ QString qmakespec = getenv( "QMAKESPEC" );
+ if ( qmakespec.isNull() )
+ qmakespec = "linux-g++";
+ // #### implement other mkspecs and find a better way to find the
+ // #### proper mkspec (althoigh this will be no fun :-)
+
+ addIncludePath( qtdir + "/mkspecs/" + qmakespec );
+
+ if ( qmakespec == "linux-g++" )
+ {
+ addIncludePath( "/include" );
+ addIncludePath( "/usr/include" );
+ addIncludePath( "/ust/local/include" );
+ bool ok;
+ QString gccLibPath = SetupHelper::getGccIncludePath(&ok);
+ if (!ok)
+ return;
+ gccLibPath = gccLibPath.replace( QRegExp( "[\r\n]" ), "" );
+ addIncludePath( gccLibPath );
+ addIncludePath( "/usr/include/g++-3" );
+ addIncludePath( "/usr/include/g++" );
+ QStringList lines = SetupHelper::getGccMacros(&ok);
+ if (!ok)
+ return;
+ for (QStringList::ConstIterator it = lines.constBegin(); it != lines.constEnd(); ++it) {
+ QStringList lst = QStringList::split( ' ', *it );
+ if ( lst.count() != 3 )
+ continue;
+ addMacro( Macro( lst[1], lst[2] ) );
+ }
+ addMacro( Macro( "__cplusplus", "1" ) );
+
+ QString incl = getenv( "INCLUDE" );
+ QStringList includePaths = QStringList::split( ':', incl );
+ QStringList::Iterator it = includePaths.begin();
+ while ( it != includePaths.end() )
+ {
+ addIncludePath( ( *it ).stripWhiteSpace() );
+ ++it;
+ }
+
+ }
+ else if ( qmakespec == "win32-borland" )
+ {
+ QString incl = getenv( "INCLUDE" );
+ QStringList includePaths = QStringList::split( ';', incl );
+ QStringList::Iterator it = includePaths.begin();
+ while ( it != includePaths.end() )
+ {
+ addIncludePath( ( *it ).stripWhiteSpace() );
+ ++it;
+ }
+ // ### I am sure there are more standard include paths on
+ // ### windows. I will fix that soon
+ // ### Also do the compiler specific defines on windows
+ }
+ }
+
+private:
+ Catalog* catalog;
+ bool m_generateTags;
+ QStringList m_docDirectoryList;
+};
+
+void parseDirectory( Driver& driver, QDir& dir, bool rec, bool parseAllFiles )
+{
+
+ QStringList fileList;
+ if ( parseAllFiles )
+ fileList = dir.entryList( QDir::Files );
+ else
+ fileList = dir.entryList( "*.h;*.H;*.hh;*.hxx;*.hpp;*.tlh" );
+
+ QStringList::Iterator it = fileList.begin();
+ while ( it != fileList.end() )
+ {
+ QString fn = dir.path() + "/" + ( *it );
+ ++it;
+
+ driver.parseFile( fn );
+ }
+
+ if ( rec )
+ {
+ QStringList fileList = dir.entryList( QDir::Dirs );
+ QStringList::Iterator it = fileList.begin();
+ while ( it != fileList.end() )
+ {
+ if ( ( *it ).startsWith( "." ) )
+ {
+ ++it;
+ continue;
+ }
+
+ QDir subdir( dir.path() + "/" + ( *it ) );
+ ++it;
+
+ parseDirectory( driver, subdir, rec, parseAllFiles );
+ }
+ }
+}
+
+int main( int argc, char* argv[] )
+{
+ KStandardDirs stddir;
+
+ if ( argc < 3 )
+ {
+ std::cerr << "usage: r++ dbname directories..." << std::endl << std::endl;
+ return -1;
+ }
+
+ bool rec = false;
+ bool parseAllFiles = false;
+
+ QString datadir = stddir.localkdedir() + "/" + KStandardDirs::kde_default( "data" );
+ if ( ! KStandardDirs::makeDir( datadir + "/kdevcppsupport/pcs/" ) )
+ {
+ kdWarning() << "*error* " << "could not create " << datadir + "/kdevcppsupport/pcs/" << endl << endl;
+ return -1;
+ }
+
+
+ if ( !QFile::exists( datadir + "/kdevcppsupport/pcs/" ) )
+ {
+ kdWarning() << "*error* " << datadir + "/kdevcppsupport/pcs/" << " doesn't exists!!" << endl << endl;
+ return -1;
+ }
+
+ QString dbFileName = datadir + "/kdevcppsupport/pcs/" + argv[ 1 ] + ".db";
+ // std::cout << "dbFileName = " << dbFileName << std::endl;
+ if ( QFile::exists( dbFileName ) )
+ {
+ kdWarning() << "*error* " << "database " << dbFileName << " already exists!" << endl << endl;
+ return -1;
+ }
+
+
+ Catalog catalog;
+ catalog.open( dbFileName );
+ catalog.addIndex( "kind" );
+ catalog.addIndex( "name" );
+ catalog.addIndex( "scope" );
+ catalog.addIndex( "fileName" );
+
+ RppDriver driver( &catalog );
+ driver.setResolveDependencesEnabled( true );
+
+ for ( int i = 2; i < argc; ++i )
+ {
+ QString s( argv[ i ] );
+ if ( s == "-r" || s == "--recursive" )
+ {
+ rec = true;
+ continue;
+ }
+ else if ( s == "-a" || s == "--all" )
+ {
+ parseAllFiles = true;
+ continue;
+ }
+ else if ( s == "-f" || s == "--fast" )
+ {
+ driver.setResolveDependencesEnabled( false );
+ continue;
+ }
+ else if ( s == "-c" || s == "--check-only" )
+ {
+ driver.setGenerateTags( false );
+ continue;
+ }
+ else if ( s.startsWith( "-d" ) )
+ {
+ driver.addDocDirectory( s.mid( 2 ) );
+ continue;
+ }
+
+ QDir dir( s );
+ if ( !dir.exists() )
+ {
+ kdWarning() << "*error* " << "the directory " << dir.path() << " doesn't exists!" << endl << endl;
+ continue;
+ }
+
+ parseDirectory( driver, dir, rec, parseAllFiles );
+ }
+
+ return 0;
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/newclass_templates/Makefile.am b/languages/cpp/newclass_templates/Makefile.am
new file mode 100644
index 00000000..5b013d27
--- /dev/null
+++ b/languages/cpp/newclass_templates/Makefile.am
@@ -0,0 +1,4 @@
+cppsupportdatadir = ${kde_datadir}/kdevcppsupport
+newclassdir = ${cppsupportdatadir}/newclass
+
+newclass_DATA = cpp_header cpp_source gtk_header gtk_source objc_header objc_source
diff --git a/languages/cpp/newclass_templates/cpp_header b/languages/cpp/newclass_templates/cpp_header
new file mode 100644
index 00000000..3952210c
--- /dev/null
+++ b/languages/cpp/newclass_templates/cpp_header
@@ -0,0 +1,31 @@
+#ifndef $HEADERGUARD$
+#define $HEADERGUARD$
+
+$INCLUDEBASEHEADER$
+
+$NAMESPACEBEG$
+
+$DOC$
+$TEMPLATE$
+class $CLASSNAME$$INHERITANCE$
+{
+$QOBJECT$
+public:
+$CONSTRUCTORDECLARATIONS$
+
+$PUBLICDECLARATIONS$
+
+$PUBLICSLOTS$
+
+$PROTECTEDDECLARATIONS$
+
+$PROTECTEDSLOTS$
+
+$PRIVATEDECLARATIONS$
+
+$PRIVATESLOTS$
+};
+
+$NAMESPACEEND$
+
+#endif
diff --git a/languages/cpp/newclass_templates/cpp_source b/languages/cpp/newclass_templates/cpp_source
new file mode 100644
index 00000000..eeeb1ea0
--- /dev/null
+++ b/languages/cpp/newclass_templates/cpp_source
@@ -0,0 +1,9 @@
+#include "$HEADER$"
+
+$NAMESPACEBEG$
+
+$CONSTRUCTORDEFINITIONS$
+
+$DEFINITIONS$
+
+$NAMESPACEEND$
diff --git a/languages/cpp/newclass_templates/gtk_header b/languages/cpp/newclass_templates/gtk_header
new file mode 100644
index 00000000..c44bff32
--- /dev/null
+++ b/languages/cpp/newclass_templates/gtk_header
@@ -0,0 +1,24 @@
+#ifndef $HEADERGUARD$
+#define $HEADERGUARD$
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+
+$DOC$
+typedef struct td_test {
+/* TODO: put your data here */
+} $CLASSNAME$, *$CLASSNAME$Ptr;
+
+
+$CLASSNAME$* $CLASSNAME$_new(void);
+void $CLASSNAME$_delete($CLASSNAME$* self);
+gboolean $CLASSNAME$_init($CLASSNAME$* self);
+void $CLASSNAME$_end($CLASSNAME$* self);
+
+
+#endif
diff --git a/languages/cpp/newclass_templates/gtk_source b/languages/cpp/newclass_templates/gtk_source
new file mode 100644
index 00000000..aa5f05ea
--- /dev/null
+++ b/languages/cpp/newclass_templates/gtk_source
@@ -0,0 +1,35 @@
+#include "$HEADER$"
+
+$CLASSNAME$* $CLASSNAME$_new(void)
+{
+ $CLASSNAME$* self;
+ self = g_new($CLASSNAME$, 1);
+ if(NULL != self)
+ {
+ if(!$CLASSNAME$_init(self))
+ {
+ g_free(self);
+ self = NULL;
+ }
+ }
+ return self;
+}
+
+void $CLASSNAME$_delete($CLASSNAME$* self)
+{
+ g_return_if_fail(NULL != self);
+ $CLASSNAME$_end(self);
+ g_free(self);
+}
+
+gboolean $CLASSNAME$_init($CLASSNAME$* self)
+{
+ /* TODO: put init code here */
+
+ return TRUE;
+}
+
+void $CLASSNAME$_end($CLASSNAME$* self)
+{
+ /* TODO: put deinit code here */
+}
diff --git a/languages/cpp/newclass_templates/objc_header b/languages/cpp/newclass_templates/objc_header
new file mode 100644
index 00000000..9213782c
--- /dev/null
+++ b/languages/cpp/newclass_templates/objc_header
@@ -0,0 +1,11 @@
+#ifndef _$HEADERGUARD$_
+#define _$HEADERGUARD$_
+
+$INCLUDEBASEHEADER$
+#include <Foundation/NSObject.h>
+
+$DOC$
+@interface $CLASSNAME$ : $BASECLASS$
+@end
+
+#endif
diff --git a/languages/cpp/newclass_templates/objc_source b/languages/cpp/newclass_templates/objc_source
new file mode 100644
index 00000000..298e941d
--- /dev/null
+++ b/languages/cpp/newclass_templates/objc_source
@@ -0,0 +1,4 @@
+#include "$HEADER$"
+
+@implementation $CLASSNAME$
+@end
diff --git a/languages/cpp/pcsimporter/Makefile.am b/languages/cpp/pcsimporter/Makefile.am
new file mode 100644
index 00000000..5a2945ac
--- /dev/null
+++ b/languages/cpp/pcsimporter/Makefile.am
@@ -0,0 +1,3 @@
+INCLUDES =
+METASOURCES = AUTO
+SUBDIRS = qtimporter kdelibsimporter customimporter qt4importer
diff --git a/languages/cpp/pcsimporter/customimporter/Makefile.am b/languages/cpp/pcsimporter/customimporter/Makefile.am
new file mode 100644
index 00000000..5a630be9
--- /dev/null
+++ b/languages/cpp/pcsimporter/customimporter/Makefile.am
@@ -0,0 +1,12 @@
+INCLUDES = -I$(top_srcdir)/languages/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = libkdevcustompcsimporter.la
+
+
+noinst_HEADERS = kdevcustomimporter.h
+libkdevcustompcsimporter_la_SOURCES = kdevcustomimporter.cpp settingsdialog.cpp settingsdialogbase.ui
+libkdevcustompcsimporter_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/languages/lib/interfaces/liblang_interfaces.la
+libkdevcustompcsimporter_la_LDFLAGS = -module $(all_libraries) $(KDE_PLUGIN)
+kde_services_DATA = kdevpcscustomimporter.desktop
diff --git a/languages/cpp/pcsimporter/customimporter/kdevcustomimporter.cpp b/languages/cpp/pcsimporter/customimporter/kdevcustomimporter.cpp
new file mode 100644
index 00000000..c3e5cb43
--- /dev/null
+++ b/languages/cpp/pcsimporter/customimporter/kdevcustomimporter.cpp
@@ -0,0 +1,118 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* cloudtemple@mksat.net *
+* *
+* 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. *
+***************************************************************************/
+#include "kdevcustomimporter.h"
+
+#include "settingsdialog.h"
+
+#include <qvaluestack.h>
+#include <qdir.h>
+
+#include <kdebug.h>
+#include <kgenericfactory.h>
+
+K_EXPORT_COMPONENT_FACTORY( libkdevcustompcsimporter, KGenericFactory<KDevCustomImporter>( "kdevcustompcsimporter" ) )
+
+KDevCustomImporter::KDevCustomImporter( QObject* parent, const char* name, const QStringList & // args
+ )
+ : KDevPCSImporter( parent, name )
+{}
+
+
+KDevCustomImporter::~KDevCustomImporter()
+{}
+
+
+QString KDevCustomImporter::dbName() const
+{
+ return m_settings->dbName();
+}
+
+QStringList KDevCustomImporter::fileList( const QString& path )
+{
+ QDir dir( path );
+ if ( !dir.exists() )
+ return QStringList();
+// QStringList lst = dir.entryList( "*.h;*.H;*.hh;*.hxx;*.hpp;*.tlh" );
+ QStringList lst = dir.entryList( m_settings->filePattern() );
+ QStringList fileList;
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it )
+ {
+ fileList.push_back( dir.absPath() + "/" + ( *it ) );
+ }
+ return fileList;
+}
+
+QStringList KDevCustomImporter::fileList()
+{
+ if ( !m_settings )
+ return QStringList();
+
+ QStringList lst = m_settings->dirs();
+ QStringList files;
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it )
+ {
+ if ( !m_settings->recursive() )
+ files += fileList( *it );
+ else
+ processDir( *it, files );
+ }
+
+ return files;
+}
+
+QStringList KDevCustomImporter::includePaths()
+{
+ if ( !m_settings )
+ return QStringList();
+
+ return m_settings->dirs();
+}
+
+QWidget* KDevCustomImporter::createSettingsPage( QWidget* parent, const char* name )
+{
+ m_settings = new SettingsDialog( parent, name );
+ return m_settings;
+}
+
+void KDevCustomImporter::processDir( const QString path, QStringList & files )
+{
+ QValueStack<QString> s;
+ s.push( path );
+ files += fileList( path );
+
+ QDir dir;
+ do
+ {
+ dir.setPath( s.pop() );
+ if (!dir.exists())
+ continue;
+ kdDebug( 9015 ) << "Examining: " << dir.path() << endl;
+ const QFileInfoList *dirEntries = dir.entryInfoList();
+ if ( !dirEntries ) continue;
+ QPtrListIterator<QFileInfo> it( *dirEntries );
+ for ( ; dirEntries && it.current(); ++it )
+ {
+ QString fileName = it.current() ->fileName();
+ if ( fileName == "." || fileName == ".." )
+ continue;
+ if ( it.current() ->isDir() )
+ {
+ QString tmpPath = it.current() ->absFilePath();
+ kdDebug( 9015 ) << "Pushing: " << tmpPath << endl;
+ s.push( tmpPath );
+ files += fileList( tmpPath );
+ }
+ }
+ }
+ while ( !s.isEmpty() );
+}
+
+#include "kdevcustomimporter.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/pcsimporter/customimporter/kdevcustomimporter.h b/languages/cpp/pcsimporter/customimporter/kdevcustomimporter.h
new file mode 100644
index 00000000..5a522785
--- /dev/null
+++ b/languages/cpp/pcsimporter/customimporter/kdevcustomimporter.h
@@ -0,0 +1,40 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* cloudtemple@mksat.net *
+* *
+* 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. *
+***************************************************************************/
+#ifndef KDEVCUSTOMIMPORTER_H
+#define KDEVCUSTOMIMPORTER_H
+
+#include "kdevpcsimporter.h"
+
+#include <qguardedptr.h>
+
+class SettingsDialog;
+
+class KDevCustomImporter : public KDevPCSImporter
+{
+Q_OBJECT
+public:
+ KDevCustomImporter(QObject* parent = 0, const char* name = 0, const QStringList &args = QStringList());
+
+ ~KDevCustomImporter();
+
+ virtual QString dbName() const;
+ virtual QStringList fileList();
+ virtual QStringList includePaths();
+ virtual QWidget* createSettingsPage(QWidget* parent, const char* name);
+
+protected:
+ QStringList fileList( const QString& path );
+ void processDir(const QString path, QStringList &files );
+
+private:
+ QGuardedPtr<SettingsDialog> m_settings;
+};
+
+#endif
diff --git a/languages/cpp/pcsimporter/customimporter/kdevpcscustomimporter.desktop b/languages/cpp/pcsimporter/customimporter/kdevpcscustomimporter.desktop
new file mode 100644
index 00000000..2e331977
--- /dev/null
+++ b/languages/cpp/pcsimporter/customimporter/kdevpcscustomimporter.desktop
@@ -0,0 +1,44 @@
+[Desktop Entry]
+Type=Service
+Name=KDevPCSCustomImporter
+Name[da]=KDevelop brugerdefineret PCS-importør
+Name[nds]=EgenPCS-Import för KDevelop
+Name[pl]=KDevWÅ‚asnyImportPCS
+Name[sk]=KDev PCS vlastný import
+Name[sv]=KDevelop egen import av PCS
+Name[zh_TW]=KDevelop PCS 自訂匯入器
+Comment=KDevelop Custom Directory PCS Importer
+Comment[ca]=Importador PCS de directori personalitzat per a KDevelop
+Comment[da]=KDevelop brugerdefineret mappe-PCS-importør
+Comment[de]=Import für persistenten Klassenspeicher aus benutzerdefinierten Ordnern
+Comment[el]=Εισαγωγέας PCS Ï€ÏοσαÏμοσμένου καταλόγου του KDevelop
+Comment[es]=Importador PCS de carpeta personalizada de KDevelop
+Comment[et]=KDevelopi kohandatud kataloogi PCS importija
+Comment[eu]=KDevelop-en direktorio pertsonalizatuko PCS inportatzailea
+Comment[fa]=واردکنندۀ PCS Ùهرست سÙارشی KDevelop
+Comment[fr]=Importation PCS de dossiers personnalisés pour KDevelop
+Comment[gl]=Importador PCS de directorios personalizados para KDevelop
+Comment[hi]=के-डेवलप मनपसंद डिरेकà¥à¤Ÿà¥à¤°à¥€ पीसीà¤à¤¸ आयातक
+Comment[hu]=KDevelop egyéni könyvtár PCS-importáló
+Comment[it]=Cartella per l'importatore personalizzato PCS di KDevelop
+Comment[ja]=KDevelop カスタムディレクトリ PCS インãƒãƒ¼ã‚¿
+Comment[nds]=Import för duerhaftig Klassenspieker ut Bruker-Ornern
+Comment[ne]=केडीई विकास अनà¥à¤•à¥‚ल डाइरेकà¥à¤Ÿà¤°à¥€ PCS आयातकरà¥à¤¤à¤¾
+Comment[nl]=KDevelop PCS Importer voor eigen mappen
+Comment[pl]=WÅ‚asny program do importowania PCS dla KDevelopa
+Comment[pt]=Importador de PCS com Directoria Personalizada do KDevelop
+Comment[pt_BR]=Importador de Diretório PCS Personalizado para o KDevelop
+Comment[ru]=Загрузка Ñимволов из любого каталога в хранилище клаÑÑов
+Comment[sk]=KDevelop vlastný PCS import prieÄinkov
+Comment[sr]=KDevelop-ов PCS увозник прилагођеног директоријума
+Comment[sr@Latn]=KDevelop-ov PCS uvoznik prilagođenog direktorijuma
+Comment[sv]=KDevelop PCS-import för egen katalog
+Comment[ta]=கெடெவலப௠கஸà¯à®Ÿà®®à¯ டைரகà¯à®Ÿà¯à®°à®¿ இறகà¯à®•à¯à®®à®¤à®¿à®¯à®¾à®³à®°à¯
+Comment[tg]=Пурборкунии нишонаҳо аз анбори Ñинфҳои каталог
+Comment[tr]=KDevelop Özel Dizin PCS Aktarıcısı
+Comment[zh_CN]=KDevelop 自定义目录的 PCS 导入器
+Comment[zh_TW]=KDevelop 自訂目錄 PCS 匯入器
+Icon=gear
+ServiceTypes=KDevelop/PCSImporter
+X-KDE-Library=libkdevcustompcsimporter
+X-KDevelop-PCSImporter=
diff --git a/languages/cpp/pcsimporter/customimporter/settingsdialog.cpp b/languages/cpp/pcsimporter/customimporter/settingsdialog.cpp
new file mode 100644
index 00000000..f6df0902
--- /dev/null
+++ b/languages/cpp/pcsimporter/customimporter/settingsdialog.cpp
@@ -0,0 +1,107 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* Copyright (C) 2006 by Jens Dagerbo *
+* jens.dagerbo@swipnet.se *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include <qdir.h>
+
+#include <klistbox.h>
+#include <kcombobox.h>
+#include <kurlrequester.h>
+#include <kdeversion.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <klineedit.h>
+
+#include <keditlistbox.h>
+
+// should be included after possible KEditListBox redefinition
+#include "settingsdialog.h"
+
+#include <qfile.h>
+#include <qregexp.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+
+#include <cstdlib>
+
+SettingsDialog::SettingsDialog( QWidget* parent, const char* name, WFlags fl )
+ : SettingsDialogBase( parent, name, fl )
+{
+ KURLRequester * req = new KURLRequester( this );
+ req->setMode( KFile::Directory );
+ KEditListBox::CustomEditor pCustomEditor;
+ pCustomEditor = req->customEditor();
+ elb = new KEditListBox( i18n( "Directories to Parse" ), pCustomEditor, this );
+
+ grid->addMultiCellWidget( elb, 3, 3, 0, grid->numCols() );
+
+ // connect( dbName_edit, SIGNAL( textChanged( const QString& ) ), this, SLOT( validate() ) );
+ connect( elb->addButton(), SIGNAL( clicked() ), this, SLOT( validate() ) );
+ connect( elb->removeButton(), SIGNAL( clicked() ), this, SLOT( validate() ) );
+ connect( elb, SIGNAL( added( const QString& ) ), this, SLOT( validateDirectory( const QString& ) ) );
+}
+
+SettingsDialog::~SettingsDialog()
+{}
+
+QString SettingsDialog::dbName( ) const
+{
+ return QString();
+// return dbName_edit->text();
+}
+
+QStringList SettingsDialog::dirs( ) const
+{
+ return elb->items();
+}
+
+QString SettingsDialog::filePattern( ) const
+{
+ return pattern_edit->text();
+}
+
+bool SettingsDialog::recursive( ) const
+{
+ return recursive_box->isChecked();
+}
+
+void SettingsDialog::validate()
+{
+// emit enabled( !dbName_edit->text().isEmpty() && elb->listBox() ->count() > 0 );
+ emit enabled( elb->listBox()->count() > 0 );
+}
+
+void SettingsDialog::validateDirectory( const QString & dir )
+{
+ QDir d( dir, QString::null, QDir::DefaultSort, QDir::Dirs );
+ if ( !d.exists() )
+ {
+ elb->lineEdit() ->setText( dir );
+
+ if ( QListBoxItem * item = elb->listBox() ->findItem( dir, Qt::ExactMatch ) )
+ {
+ elb->listBox() ->removeItem( elb->listBox() ->index( item ) );
+ }
+
+ QString errormsg = QString( "<qt><b>%1</b> is not a directory</qt>" ).arg( dir );
+ KMessageBox::error( 0, errormsg, "Couldn't find directory" );
+ }
+ emit enabled( elb->listBox()->count() > 0 );
+}
+
+#include "settingsdialog.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
+
+
+
diff --git a/languages/cpp/pcsimporter/customimporter/settingsdialog.h b/languages/cpp/pcsimporter/customimporter/settingsdialog.h
new file mode 100644
index 00000000..309df8ab
--- /dev/null
+++ b/languages/cpp/pcsimporter/customimporter/settingsdialog.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include "settingsdialogbase.h"
+
+class KEditListBox;
+
+class SettingsDialog : public SettingsDialogBase
+{
+ Q_OBJECT
+
+public:
+ SettingsDialog(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~SettingsDialog();
+
+ bool isValidQtDir( const QString& path ) const;
+
+ QString qtDir() const;
+ QString configuration() const;
+
+ QString dbName() const;
+ QStringList dirs() const;
+ bool recursive() const;
+ QString filePattern() const;
+
+private slots:
+ void validate();
+ void validateDirectory( const QString & dir );
+
+private:
+ KEditListBox *elb;
+
+};
+
+#endif
+
+
diff --git a/languages/cpp/pcsimporter/customimporter/settingsdialogbase.ui b/languages/cpp/pcsimporter/customimporter/settingsdialogbase.ui
new file mode 100644
index 00000000..b9faadb1
--- /dev/null
+++ b/languages/cpp/pcsimporter/customimporter/settingsdialogbase.ui
@@ -0,0 +1,62 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SettingsDialogBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SettingsDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>510</width>
+ <height>501</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>grid</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit" row="1" column="0">
+ <property name="name">
+ <cstring>pattern_edit</cstring>
+ </property>
+ <property name="text">
+ <string>*.h;*.H;*.hh;*.hxx;*.hpp;*.tlh</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Filename pattern:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>recursive_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Recursive</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<signals>
+ <signal>enabled(int)</signal>
+</signals>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/cpp/pcsimporter/kdelibsimporter/Makefile.am b/languages/cpp/pcsimporter/kdelibsimporter/Makefile.am
new file mode 100644
index 00000000..96c3474f
--- /dev/null
+++ b/languages/cpp/pcsimporter/kdelibsimporter/Makefile.am
@@ -0,0 +1,11 @@
+INCLUDES = -I$(top_srcdir)/languages/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = libkdevkdelibsimporter.la
+
+noinst_HEADERS = kdevkdelibsimporter.h settingsdialog.h
+libkdevkdelibsimporter_la_SOURCES = kdevkdelibsimporter.cpp settingsdialogbase.ui settingsdialog.cpp
+kde_services_DATA = kdevkdelibsimporter.desktop
+libkdevkdelibsimporter_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/languages/lib/interfaces/liblang_interfaces.la
+libkdevkdelibsimporter_la_LDFLAGS = -module $(all_libraries) $(KDE_PLUGIN)
diff --git a/languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.cpp b/languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.cpp
new file mode 100644
index 00000000..341256b7
--- /dev/null
+++ b/languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.cpp
@@ -0,0 +1,119 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include "kdevkdelibsimporter.h"
+#include "kdevkdelibsimporter.moc"
+#include "settingsdialog.h"
+
+#include <kdebug.h>
+#include <kgenericfactory.h>
+
+#include <qvaluestack.h>
+#include <qlabel.h>
+#include <qdir.h>
+#include <qcombobox.h>
+
+K_EXPORT_COMPONENT_FACTORY( libkdevkdelibsimporter, KGenericFactory<KDevKDELibsImporter>( "kdevkdelibsimporter" ) )
+
+KDevKDELibsImporter::KDevKDELibsImporter( QObject * parent, const char * name, const QStringList& )
+ : KDevPCSImporter( parent, name )
+{}
+
+KDevKDELibsImporter::~KDevKDELibsImporter()
+{}
+
+QStringList KDevKDELibsImporter::fileList( const QString& path )
+{
+ QDir dir( path );
+ QStringList lst = dir.entryList( "*.h" );
+ QStringList fileList;
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it )
+ {
+ fileList.push_back( dir.absPath() + "/" + ( *it ) );
+ }
+ return fileList;
+}
+
+
+QStringList KDevKDELibsImporter::fileList()
+{
+ if ( !m_settings )
+ return QStringList();
+
+ QStringList files;
+ int scope = m_settings->cbParsingScope->currentItem();
+ if ( scope == 0 )
+ {
+ files += fileList( m_settings->kdeDir() );
+ files += fileList( m_settings->kdeDir() + "/arts" );
+ files += fileList( m_settings->kdeDir() + "/artsc" );
+ files += fileList( m_settings->kdeDir() + "/dcopc" );
+ files += fileList( m_settings->kdeDir() + "/dom" );
+ files += fileList( m_settings->kdeDir() + "/kabc" );
+ files += fileList( m_settings->kdeDir() + "/kdeprint" );
+ files += fileList( m_settings->kdeDir() + "/kdesu" );
+ files += fileList( m_settings->kdeDir() + "/kio" );
+ files += fileList( m_settings->kdeDir() + "/kjs" );
+ files += fileList( m_settings->kdeDir() + "/kparts" );
+ files += fileList( m_settings->kdeDir() + "/ktexteditor" );
+ }
+ else if ( scope == 1 )
+ {
+ QValueStack<QString> s;
+ s.push( m_settings->kdeDir() );
+ files += fileList( m_settings->kdeDir() );
+
+ QDir dir;
+ do
+ {
+ dir.setPath( s.pop() );
+ kdDebug( 9015 ) << "Examining: " << dir.path() << endl;
+ const QFileInfoList *dirEntries = dir.entryInfoList();
+ if ( !dirEntries ) continue;
+ QPtrListIterator<QFileInfo> it( *dirEntries );
+ for ( ; it.current(); ++it )
+ {
+ QString fileName = it.current() ->fileName();
+ if ( fileName == "." || fileName == ".." )
+ continue;
+ QString path = it.current() ->absFilePath();
+ if ( it.current() ->isDir() )
+ {
+ kdDebug( 9015 ) << "Pushing: " << path << endl;
+ s.push( path );
+ files += fileList( path );
+ }
+ }
+ }
+ while ( !s.isEmpty() );
+ }
+
+ return files;
+}
+
+QStringList KDevKDELibsImporter::includePaths()
+{
+ if ( !m_settings )
+ return QStringList();
+
+ QStringList includePaths;
+ includePaths.push_back( m_settings->kdeDir() );
+ return includePaths;
+}
+
+QWidget * KDevKDELibsImporter::createSettingsPage( QWidget * parent, const char * name )
+{
+ m_settings = new SettingsDialog( parent, name );
+ return m_settings;
+}
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
+
diff --git a/languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.desktop b/languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.desktop
new file mode 100644
index 00000000..51163d14
--- /dev/null
+++ b/languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.desktop
@@ -0,0 +1,49 @@
+[Desktop Entry]
+Type=Service
+Name=KDevKDELibsImporter
+Name[da]=KDevelop KDELibs-importør
+Name[de]=KDELibs-PCS-Import (KDevelop)
+Name[hi]=के-डेव-केडीई-लिबà¥à¤¸-इमà¥à¤ªà¥‹à¤°à¥à¤Ÿà¤°
+Name[ja]=KDev KDE
+Name[nds]=KDELibs-PCS-Import (KDevelop)
+Name[pl]=KDevKDEImportBib
+Name[sk]=KDev KDE import knižníc
+Name[sv]=KDevelop KDE-biblioteksimport
+Name[ta]=கெடெவ௠கெடெலிபà¯à®¸à¯ இறகà¯à®•à¯à®®à®¤à®¿à®¯à®¾à®³à®°à¯
+Name[zh_TW]=KDevelop KDE 函å¼åº«åŒ¯å…¥å™¨
+Comment=KDevelop KDELibs PCS Importer
+Comment[ca]=Importador PCS de KDELibs per a KDevelop
+Comment[da]=KDevelop KDELibs PCS importør
+Comment[de]=KDELibs-Import für persistenten Klassenspeicher
+Comment[el]=Εισαγωγέας PCS KDevelop KDELibs
+Comment[es]=Importador PCS de KDELibs de KDevelop
+Comment[et]=KDevelopi kdelibs PCS importija
+Comment[eu]=KDevelop-en KDELibs PCS inportatzailea
+Comment[fa]=واردکنندۀ KDevelop KDELibs PCS
+Comment[fr]=Importation PCS de KDELibs pour KDevelop
+Comment[gl]=Importador PCS de KDELibs para KDevelop
+Comment[hi]=के-डेवलप केडीई-लिबà¥à¤¸ पीसीà¤à¤¸ आयातक
+Comment[hu]=KDevelop KDELibs PCS-importáló
+Comment[it]=Importatore per KDELibs PCS di KDevelop
+Comment[ja]=KDevelop KDELibs PCS インãƒãƒ¼ã‚¿
+Comment[nds]=KDELibs-Import för duerhaftig Klassenspieker
+Comment[ne]=KDevelop KDELibs PCS आयातकरà¥à¤¤à¤¾
+Comment[nl]=KDevelop PCS Importer voor KDELibs
+Comment[pl]=KDevelop: importowanie PCS (KDELibs)
+Comment[pt]=Importador de PCS das KDELibs do KDevelop
+Comment[pt_BR]=Importador PCS do KDELibs para o KDevelop
+Comment[ru]=Загрузка Ñимволов из библиотеки KDELibs в хранилище клаÑÑов
+Comment[sk]=KDevelop PCS import KDE knižníc
+Comment[sr]=KDevelop-ов KDELibs PCS увозник
+Comment[sr@Latn]=KDevelop-ov KDELibs PCS uvoznik
+Comment[sv]=KDevelop KDE-bibliotek PCS-import
+Comment[ta]=கெடெவலப௠கெடெலிபà¯à®¸à¯ பிசிஸ௠இறகà¯à®•à¯à®®à®¤à®¿à®¯à®¾à®³à®°à¯
+Comment[tg]=Пурборкунии нишонаҳо аз китобхонаи KDELibs дар Ñинфҳои анборӣ
+Comment[tr]=KDevelop KDELibs PCS Aktarıcısı
+Comment[zh_CN]=KDevelop KDELibs PCS 导入器
+Comment[zh_TW]=KDevelop KDE 函å¼åº«åŒ¯å…¥å™¨
+Icon=gear
+ServiceTypes=KDevelop/PCSImporter
+X-KDE-Library=libkdevkdelibsimporter
+X-KDevelop-PCSImporter=
+X-KDevelop-Version=5
diff --git a/languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.h b/languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.h
new file mode 100644
index 00000000..9514f287
--- /dev/null
+++ b/languages/cpp/pcsimporter/kdelibsimporter/kdevkdelibsimporter.h
@@ -0,0 +1,40 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KDEVQTIMPORTER_H
+#define KDEVQTIMPORTER_H
+
+#include <kdevpcsimporter.h>
+#include <qguardedptr.h>
+
+class SettingsDialog;
+
+class KDevKDELibsImporter : public KDevPCSImporter
+{
+ Q_OBJECT
+public:
+ KDevKDELibsImporter( QObject* parent=0, const char* name=0, const QStringList& args=QStringList() );
+ virtual ~KDevKDELibsImporter();
+
+ virtual QString dbName() const { return QString::fromLatin1("KDElibs"); }
+ virtual QStringList fileList();
+ virtual QStringList includePaths();
+
+ virtual QWidget* createSettingsPage( QWidget* parent, const char* name=0 );
+
+private:
+ QStringList fileList( const QString& path );
+
+private:
+ QGuardedPtr<SettingsDialog> m_settings;
+};
+
+#endif
diff --git a/languages/cpp/pcsimporter/kdelibsimporter/settingsdialog.cpp b/languages/cpp/pcsimporter/kdelibsimporter/settingsdialog.cpp
new file mode 100644
index 00000000..29ef96e9
--- /dev/null
+++ b/languages/cpp/pcsimporter/kdelibsimporter/settingsdialog.cpp
@@ -0,0 +1,101 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* Copyright (C) 2006 by Jens Dagerbo *
+* jens.dagerbo@swipnet.se *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include <klistbox.h>
+#include <kcombobox.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kurlrequester.h>
+#include <kdebug.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include <qfile.h>
+#include <qdir.h>
+#include <qregexp.h>
+#include <cstdlib>
+
+#include "settingsdialog.h"
+
+QListBoxItem* QListBox_selectedItem( QListBox* cpQListBox )
+{
+ if ( cpQListBox->selectionMode() != QListBox::Single )
+ return 0;
+ if ( cpQListBox->isSelected( cpQListBox->currentItem() ) )
+ return cpQListBox->item( cpQListBox->currentItem() );
+ return 0;
+}
+
+SettingsDialog::SettingsDialog( QWidget* parent, const char* name, WFlags fl )
+: SettingsDialogBase( parent, name, fl )
+{
+ KApplication::kApplication()->dirs()->addResourceType("include","include");
+ QStringList kdedirs=KApplication::kApplication()->dirs()->findDirs("include","");
+ for( QStringList::Iterator it=kdedirs.begin(); it!=kdedirs.end(); ++it )
+ {
+ QString kdedir = *it;
+ if ( !kdedir.isEmpty() && isValidKDELibsDir( kdedir ) )
+ if ( !kdeListBox->findItem( kdedir, ExactMatch ) )
+ kdeListBox->insertItem( kdedir );
+ }
+
+ kdeUrl->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
+
+ connect( addUrlButton, SIGNAL(clicked()), this, SLOT(addUrlButton_clicked()) );
+}
+
+SettingsDialog::~SettingsDialog()
+{}
+
+void SettingsDialog::slotSelectionChanged( QListBoxItem* )
+{
+ emit enabled( kdeListBox->selectedItem() != 0 );
+}
+
+bool SettingsDialog::isValidKDELibsDir( const QString & path ) const
+{
+ return QFile::exists( path + "/kapplication.h" );
+}
+
+QString SettingsDialog::kdeDir( ) const
+{
+ return kdeListBox->currentText();
+}
+
+void SettingsDialog::addUrlButton_clicked()
+{
+ kdDebug(9000) << k_funcinfo << endl;
+
+ if ( isValidKDELibsDir( kdeUrl->url() ) )
+ {
+ kdeListBox->insertItem( kdeUrl->url() );
+ if ( QListBoxItem * item = kdeListBox->findItem( kdeUrl->url(), ExactMatch ) )
+ {
+ kdeListBox->setSelected( item, true );
+ }
+ kdeUrl->lineEdit()->clear();
+ }
+ else
+ {
+ KMessageBox::error( this, i18n("This does not appear to be a valid KDE include directory.\nPlease select a different directory."), i18n("Invalid Directory") );
+ }
+}
+
+
+#include "settingsdialog.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
+
+
diff --git a/languages/cpp/pcsimporter/kdelibsimporter/settingsdialog.h b/languages/cpp/pcsimporter/kdelibsimporter/settingsdialog.h
new file mode 100644
index 00000000..ba15019b
--- /dev/null
+++ b/languages/cpp/pcsimporter/kdelibsimporter/settingsdialog.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include "settingsdialogbase.h"
+
+class SettingsDialog : public SettingsDialogBase
+{
+ Q_OBJECT
+
+public:
+ SettingsDialog(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~SettingsDialog();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ bool isValidKDELibsDir( const QString& path ) const;
+
+ QString kdeDir() const;
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ virtual void slotSelectionChanged(QListBoxItem*);
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void addUrlButton_clicked();
+};
+
+#endif
+
+
diff --git a/languages/cpp/pcsimporter/kdelibsimporter/settingsdialogbase.ui b/languages/cpp/pcsimporter/kdelibsimporter/settingsdialogbase.ui
new file mode 100644
index 00000000..00b8c3ac
--- /dev/null
+++ b/languages/cpp/pcsimporter/kdelibsimporter/settingsdialogbase.ui
@@ -0,0 +1,131 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SettingsDialogBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SettingsDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>403</width>
+ <height>266</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>KDE include directories:
+Only the selected entry will be used</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="1">
+ <item>
+ <property name="text">
+ <string>KDE Libs Headers</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>All KDE Headers</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>cbParsingScope</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Decide if you want to restrict the Code Completion database to only the base kdelibs API or the entire KDE include structure</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Scope:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>kdeUrl</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If none of the directories KDevelop found is what you want,you can enter a directory of your choice here</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="3">
+ <property name="name">
+ <cstring>addUrlButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ <widget class="KListBox" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>kdeListBox</cstring>
+ </property>
+ </widget>
+ <spacer row="3" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>220</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>kdeListBox</sender>
+ <signal>selectionChanged(QListBoxItem*)</signal>
+ <receiver>SettingsDialogBase</receiver>
+ <slot>slotSelectionChanged(QListBoxItem*)</slot>
+ </connection>
+</connections>
+<signals>
+ <signal>enabled(int)</signal>
+</signals>
+<slots>
+ <slot>slotSelectionChanged(QListBoxItem*)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistbox.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/pcsimporter/qt4importer/Makefile.am b/languages/cpp/pcsimporter/qt4importer/Makefile.am
new file mode 100644
index 00000000..b0b4a622
--- /dev/null
+++ b/languages/cpp/pcsimporter/qt4importer/Makefile.am
@@ -0,0 +1,11 @@
+INCLUDES = -I$(top_srcdir)/languages/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = libkdevqt4importer.la
+
+noinst_HEADERS = kdevqt4importer.h settingsdialog.h
+libkdevqt4importer_la_SOURCES = kdevqt4importer.cpp settingsdialogbase.ui settingsdialog.cpp
+kde_services_DATA = kdevqt4importer.desktop
+libkdevqt4importer_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/languages/lib/interfaces/liblang_interfaces.la
+libkdevqt4importer_la_LDFLAGS = -module $(all_libraries) $(KDE_PLUGIN)
diff --git a/languages/cpp/pcsimporter/qt4importer/kdevqt4importer.cpp b/languages/cpp/pcsimporter/qt4importer/kdevqt4importer.cpp
new file mode 100644
index 00000000..f4fedea0
--- /dev/null
+++ b/languages/cpp/pcsimporter/qt4importer/kdevqt4importer.cpp
@@ -0,0 +1,107 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "kdevqt4importer.h"
+#include "kdevqt4importer.moc"
+#include "settingsdialog.h"
+
+#include <kgenericfactory.h>
+#include <ktempfile.h>
+#include <kprocess.h>
+#include <kdebug.h>
+
+#include <qtextstream.h>
+#include <qlabel.h>
+#include <qdir.h>
+
+K_EXPORT_COMPONENT_FACTORY( libkdevqt4importer, KGenericFactory<KDevQt4Importer>( "kdevqt4importer" ) )
+
+KDevQt4Importer::KDevQt4Importer( QObject * parent, const char * name, const QStringList& )
+ : KDevPCSImporter( parent, name )
+{
+ m_qtfile = 0;
+}
+
+KDevQt4Importer::~KDevQt4Importer()
+{
+ if (m_qtfile)
+ delete m_qtfile;
+
+ m_qtfile = 0;
+}
+
+QStringList KDevQt4Importer::fileList()
+{
+ if( !m_settings )
+ return QStringList();
+
+ if (m_qtfile)
+ delete m_qtfile;
+
+ KTempFile ifile;
+ QTextStream &is = *ifile.textStream();
+
+ is << "#include <QtCore/qobjectdefs.h>\n"
+ << "#undef Q_SLOTS\n#undef Q_SIGNALS\n#undef slots\n#undef signals"
+ << "#define Q_SLOTS slots\n"
+ << "#define Q_SIGNALS signals\n"
+ << "#include <QtCore/QtCore>\n"
+ << "#include <QtGui/QtGui>\n"
+ << "#include <QtNetwork/QtNetwork>\n"
+ << "#include <QtXml/QtXml>\n"
+ << "#include <Qt3Support/Qt3Support>\n"
+ << "#include <QtSql/QtSql>\n"
+ << "#include <QtTest/QtTest>\n"
+ << "#include <QtOpenGL/QtOpenGL>\n";
+
+
+
+ KProcess proc;
+ proc << "cpp" << "-nostdinc" << "-xc++";
+
+ m_qtfile = new KTempFile();
+
+ // include paths
+ QStringList paths = includePaths();
+ for (QStringList::Iterator it = paths.begin(); it != paths.end(); ++it)
+ proc << "-I" << *it;
+
+ ifile.close();
+
+ QString o;
+ o += "-o";
+ o += m_qtfile->name();
+
+ proc << ifile.name() << o;
+ proc.start(KProcess::Block);
+
+ return m_qtfile->name();
+}
+
+QStringList KDevQt4Importer::includePaths()
+{
+ if( !m_settings || !m_qtfile)
+ return QStringList();
+
+ QStringList includePaths;
+ includePaths.push_back( m_settings->qtDir() );
+ includePaths.push_back( m_settings->qtDir() + "/Qt" );
+
+ /// @todo add mkspec
+ return includePaths;
+}
+
+QWidget * KDevQt4Importer::createSettingsPage( QWidget * parent, const char * name )
+{
+ m_settings = new SettingsDialog( parent, name );
+ return m_settings;
+}
+
diff --git a/languages/cpp/pcsimporter/qt4importer/kdevqt4importer.desktop b/languages/cpp/pcsimporter/qt4importer/kdevqt4importer.desktop
new file mode 100644
index 00000000..d1003610
--- /dev/null
+++ b/languages/cpp/pcsimporter/qt4importer/kdevqt4importer.desktop
@@ -0,0 +1,34 @@
+[Desktop Entry]
+Type=Service
+Name=KDevQt4Importer
+Name[de]=Qt4-PCS-Import (KDevelop)
+Name[fr]=KDevQtImporter
+Name[nds]=Qt4-PCS-Import (KDevelop)
+Name[ru]=KDevQt 4Importer
+Name[sv]=KDevelop QT4-import
+Comment=KDevelop Qt4 PCS Importer
+Comment[ca]=Importador PCS de Qt4 per a KDevelop
+Comment[da]=KDevelop Qt4 PCS importør
+Comment[de]=Qt4-Import für persistenten Klassenspeicher
+Comment[el]=Εισαγωγέας PCS KDevelop Qt4
+Comment[es]=Importador PCS de Qt4 de KDevelop
+Comment[et]=KDevelopi Qt4 PCS importija
+Comment[fr]=Importation PCS de Qt4 pour KDevelop
+Comment[hu]=KDevelop Qt4 PCS-importáló
+Comment[it]=Importatore PCS di Qt4 di KDevelop
+Comment[ja]=KDevelop Qt4 PCS インãƒãƒ¼ã‚¿
+Comment[nds]=Qt4-Import för duerhaftig Klassenspieker
+Comment[pl]=KDevelop: importowanie PCS Qt4
+Comment[pt]=Importador de PCS para Qt4 do KDevelop
+Comment[pt_BR]=Importador de PCS para Qt4 do KDevelop
+Comment[ru]=Импорт Qt 4 PCS в KDevelop
+Comment[sk]=KDevelop Qt4 PCS import
+Comment[sr]=KDevelop-ов Qt4 PCS увозник
+Comment[sr@Latn]=KDevelop-ov Qt4 PCS uvoznik
+Comment[sv]=KDevelop QT4 PCS-import
+Comment[zh_TW]=KDevelop Qt4 PCS 匯入器
+Icon=gear
+ServiceTypes=KDevelop/PCSImporter
+X-KDE-Library=libkdevqt4importer
+X-KDevelop-PCSImporter=
+X-KDevelop-Version=5
diff --git a/languages/cpp/pcsimporter/qt4importer/kdevqt4importer.h b/languages/cpp/pcsimporter/qt4importer/kdevqt4importer.h
new file mode 100644
index 00000000..821e6fef
--- /dev/null
+++ b/languages/cpp/pcsimporter/qt4importer/kdevqt4importer.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KDEVQTIMPORTER_H
+#define KDEVQTIMPORTER_H
+
+#include <kdevpcsimporter.h>
+#include <qguardedptr.h>
+
+class SettingsDialog;
+class KTempFile;
+
+class KDevQt4Importer : public KDevPCSImporter
+{
+ Q_OBJECT
+public:
+ KDevQt4Importer( QObject* parent=0, const char* name=0, const QStringList& args=QStringList() );
+ virtual ~KDevQt4Importer();
+
+ virtual QString dbName() const { return QString::fromLatin1("Qt4"); }
+ virtual QStringList fileList();
+ virtual QStringList includePaths();
+
+ virtual QWidget* createSettingsPage( QWidget* parent, const char* name=0 );
+
+private:
+ QGuardedPtr<SettingsDialog> m_settings;
+ KTempFile *m_qtfile;
+};
+
+#endif
diff --git a/languages/cpp/pcsimporter/qt4importer/settingsdialog.cpp b/languages/cpp/pcsimporter/qt4importer/settingsdialog.cpp
new file mode 100644
index 00000000..cc59c6e9
--- /dev/null
+++ b/languages/cpp/pcsimporter/qt4importer/settingsdialog.cpp
@@ -0,0 +1,115 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * Copyright (C) 2006 by Jens Dagerbo *
+ * jens.dagerbo@swipnet.se *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include <klistbox.h>
+#include <kcombobox.h>
+#include <kurlrequester.h>
+#include <kdebug.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include <qfile.h>
+#include <qdir.h>
+#include <qregexp.h>
+#include <cstdlib>
+
+#include "settingsdialog.h"
+
+QListBoxItem* QListBox_selectedItem(QListBox* cpQListBox)
+{
+ if ( cpQListBox->selectionMode() != QListBox::Single )
+ return 0;
+ if ( cpQListBox->isSelected( cpQListBox->currentItem() ) )
+ return cpQListBox->item(cpQListBox->currentItem());
+ return 0;
+}
+
+SettingsDialog::SettingsDialog(QWidget* parent, const char* name, WFlags fl)
+ : SettingsDialogBase(parent,name,fl)
+{
+ QStringList qtdirs;
+ qtdirs.push_back( ::getenv("QTDIR") + QString("/include") );
+ qtdirs.push_back( QString::fromLocal8Bit(::getenv("HOME")) + "/dev/qt/include" );
+ qtdirs.push_back( QString::fromLocal8Bit(::getenv("HOME")) + "/dev/qt-main/include" );
+ qtdirs.push_back( "/usr/qt/4/include" );
+
+ for( QStringList::Iterator it=qtdirs.begin(); it!=qtdirs.end(); ++it )
+ {
+ QString qtdir = *it;
+ if( !qtdir.isEmpty() && isValidQtDir(qtdir) )
+ if (!qtListBox->findItem(qtdir, ExactMatch))
+ qtListBox->insertItem( qtdir );
+ }
+
+ qtUrl->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
+
+ connect( addUrlButton, SIGNAL(clicked()), this, SLOT(addUrlButton_clicked()) );
+}
+
+SettingsDialog::~SettingsDialog()
+{
+}
+
+void SettingsDialog::slotSelectionChanged(QListBoxItem* item)
+{
+ if( !qtListBox->selectedItem() )
+ {
+ emit enabled( false );
+ return;
+ }
+
+
+ emit enabled( true );
+}
+
+bool SettingsDialog::isValidQtDir( const QString & path ) const
+{
+ return QFile::exists( path + "/QtCore/QtCore" );
+}
+
+QString SettingsDialog::qtDir( ) const
+{
+ return qtListBox->currentText();
+}
+
+QString SettingsDialog::configuration( ) const
+{
+ return "";
+}
+
+void SettingsDialog::addUrlButton_clicked( )
+{
+ kdDebug(9000) << k_funcinfo << endl;
+
+ if ( isValidQtDir( qtUrl->url() ) )
+ {
+ qtListBox->insertItem( qtUrl->url() );
+ if ( QListBoxItem * item = qtListBox->findItem( qtUrl->url(), ExactMatch ) )
+ {
+ qtListBox->setSelected( item, true );
+ }
+ qtUrl->lineEdit()->clear();
+ }
+ else
+ {
+ KMessageBox::error( this, i18n("This does not appear to be a valid Qt4 include directory.\nPlease select a different directory."), i18n("Invalid Directory") );
+ }
+}
+
+
+#include "settingsdialog.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
+
diff --git a/languages/cpp/pcsimporter/qt4importer/settingsdialog.h b/languages/cpp/pcsimporter/qt4importer/settingsdialog.h
new file mode 100644
index 00000000..1ec5663e
--- /dev/null
+++ b/languages/cpp/pcsimporter/qt4importer/settingsdialog.h
@@ -0,0 +1,46 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include "settingsdialogbase.h"
+
+class SettingsDialog : public SettingsDialogBase
+{
+ Q_OBJECT
+
+public:
+ SettingsDialog(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~SettingsDialog();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ bool isValidQtDir( const QString& path ) const;
+
+ QString qtDir() const;
+ QString configuration() const;
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ virtual void slotSelectionChanged(QListBoxItem*);
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void addUrlButton_clicked();
+
+};
+
+#endif
+
+
diff --git a/languages/cpp/pcsimporter/qt4importer/settingsdialogbase.ui b/languages/cpp/pcsimporter/qt4importer/settingsdialogbase.ui
new file mode 100644
index 00000000..f655e4f9
--- /dev/null
+++ b/languages/cpp/pcsimporter/qt4importer/settingsdialogbase.ui
@@ -0,0 +1,79 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SettingsDialogBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SettingsDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>346</width>
+ <height>275</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Qt4 include directories:
+Only the selected entry will be used</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>addUrlButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="2" column="0">
+ <property name="name">
+ <cstring>qtUrl</cstring>
+ </property>
+ </widget>
+ <widget class="KListBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>qtListBox</cstring>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>qtListBox</sender>
+ <signal>selectionChanged(QListBoxItem*)</signal>
+ <receiver>SettingsDialogBase</receiver>
+ <slot>slotSelectionChanged(QListBoxItem*)</slot>
+ </connection>
+</connections>
+<signals>
+ <signal>enabled(int)</signal>
+</signals>
+<slots>
+ <slot>slotSelectionChanged(QListBoxItem*)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistbox.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/pcsimporter/qtimporter/Makefile.am b/languages/cpp/pcsimporter/qtimporter/Makefile.am
new file mode 100644
index 00000000..878f9b4a
--- /dev/null
+++ b/languages/cpp/pcsimporter/qtimporter/Makefile.am
@@ -0,0 +1,11 @@
+INCLUDES = -I$(top_srcdir)/languages/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = libkdevqtimporter.la
+
+noinst_HEADERS = kdevqtimporter.h settingsdialog.h
+libkdevqtimporter_la_SOURCES = kdevqtimporter.cpp settingsdialogbase.ui settingsdialog.cpp
+kde_services_DATA = kdevqtimporter.desktop
+libkdevqtimporter_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/languages/lib/interfaces/liblang_interfaces.la
+libkdevqtimporter_la_LDFLAGS = -module $(all_libraries) $(KDE_PLUGIN)
diff --git a/languages/cpp/pcsimporter/qtimporter/kdevqtimporter.cpp b/languages/cpp/pcsimporter/qtimporter/kdevqtimporter.cpp
new file mode 100644
index 00000000..add8574a
--- /dev/null
+++ b/languages/cpp/pcsimporter/qtimporter/kdevqtimporter.cpp
@@ -0,0 +1,73 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include "kdevqtimporter.h"
+#include "kdevqtimporter.moc"
+#include "settingsdialog.h"
+
+#include <kgenericfactory.h>
+
+#include <qlabel.h>
+#include <qdir.h>
+
+K_EXPORT_COMPONENT_FACTORY( libkdevqtimporter, KGenericFactory<KDevQtImporter>( "kdevqtimporter" ) )
+
+KDevQtImporter::KDevQtImporter( QObject * parent, const char * name, const QStringList& )
+ : KDevPCSImporter( parent, name )
+{}
+
+KDevQtImporter::~KDevQtImporter()
+{}
+
+QStringList KDevQtImporter::fileList()
+{
+ if ( !m_settings )
+ return QStringList();
+
+ QDir dir( m_settings->qtDir() );
+ QStringList lst = dir.entryList( "*.h" );
+ QStringList fileList;
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it )
+ {
+ if ( ( *it ).startsWith( "qconfig-" ) )
+ {
+ if ( ( *it ).endsWith( m_settings->configuration() + ".h" ) )
+ fileList.prepend( dir.absPath() + "/" + ( *it ) );
+ }
+ else
+ {
+ fileList.push_back( dir.absPath() + "/" + ( *it ) );
+ }
+ }
+ return fileList;
+}
+
+QStringList KDevQtImporter::includePaths()
+{
+ if ( !m_settings )
+ return QStringList();
+
+ QStringList includePaths;
+ includePaths.push_back( m_settings->qtDir() );
+ includePaths.push_back( m_settings->qtDir() + "/private" );
+ includePaths.push_back( m_settings->qtDir() + "/default" );
+
+ /// @todo add mkspec
+ return includePaths;
+}
+
+QWidget * KDevQtImporter::createSettingsPage( QWidget * parent, const char * name )
+{
+ m_settings = new SettingsDialog( parent, name );
+ return m_settings;
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/pcsimporter/qtimporter/kdevqtimporter.desktop b/languages/cpp/pcsimporter/qtimporter/kdevqtimporter.desktop
new file mode 100644
index 00000000..965e581f
--- /dev/null
+++ b/languages/cpp/pcsimporter/qtimporter/kdevqtimporter.desktop
@@ -0,0 +1,37 @@
+[Desktop Entry]
+Type=Service
+Name=KDevQtImporter
+Name[da]=KDevelop Qt-importør
+Name[de]=Qt-PCS-Import (KDevelop)
+Name[hi]=के-डेव-कà¥à¤¯à¥‚टी-आयातक
+Name[nds]=Qt-PCS-Import (KDevelop)
+Name[pl]=KDevImportQt
+Name[sv]=KDevelop QT-import
+Name[ta]=கெடெவ௠கà¯à®¯à¯ இறகà¯à®•à¯à®®à®¤à®¿à®¯à®¾à®³à®°à¯
+Name[zh_TW]=KDev Qt 匯入器
+Comment=KDevelop Qt3 PCS Importer
+Comment[ca]=Importador PCS de Qt3 per a KDevelop
+Comment[da]=KDevelop Qt3 PCS importør
+Comment[de]=Qt3-Import für persistenten Klassenspeicher
+Comment[el]=Εισαγωγέας PCS KDevelop Qt3
+Comment[es]=Importador PCS de Qt3 de KDevelop
+Comment[et]=KDevelopi Qt3 PCS importija
+Comment[fr]=Importation PCS de Qt3 pour KDevelop
+Comment[hu]=KDevelop Qt3 PCS-importáló
+Comment[it]=Importatore PCS di Qt3 di KDevelop
+Comment[ja]=KDevelop Qt3 PCS インãƒãƒ¼ã‚¿
+Comment[nds]=Qt3-Import för duerhaftig Klassenspieker
+Comment[pl]=KDevelop: importowanie PCS Qt3
+Comment[pt]=Importador de PCS para Qt3 do KDevelop
+Comment[pt_BR]=Importador de PCS para Qt3 do KDevelop
+Comment[ru]=Импорт Qt 3 PCS в KDevelop
+Comment[sk]=KDevelop Qt3 PCS import
+Comment[sr]=KDevelop-ов Qt3 PCS увозник
+Comment[sr@Latn]=KDevelop-ov Qt3 PCS uvoznik
+Comment[sv]=KDevelop QT3 PCS-import
+Comment[zh_TW]=KDevelop Qt3 PCS 匯入器
+Icon=gear
+ServiceTypes=KDevelop/PCSImporter
+X-KDE-Library=libkdevqtimporter
+X-KDevelop-PCSImporter=
+X-KDevelop-Version=5
diff --git a/languages/cpp/pcsimporter/qtimporter/kdevqtimporter.h b/languages/cpp/pcsimporter/qtimporter/kdevqtimporter.h
new file mode 100644
index 00000000..c53b0a8a
--- /dev/null
+++ b/languages/cpp/pcsimporter/qtimporter/kdevqtimporter.h
@@ -0,0 +1,37 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KDEVQTIMPORTER_H
+#define KDEVQTIMPORTER_H
+
+#include <kdevpcsimporter.h>
+#include <qguardedptr.h>
+
+class SettingsDialog;
+
+class KDevQtImporter : public KDevPCSImporter
+{
+ Q_OBJECT
+public:
+ KDevQtImporter( QObject* parent=0, const char* name=0, const QStringList& args=QStringList() );
+ virtual ~KDevQtImporter();
+
+ virtual QString dbName() const { return QString::fromLatin1("Qt"); }
+ virtual QStringList fileList();
+ virtual QStringList includePaths();
+
+ virtual QWidget* createSettingsPage( QWidget* parent, const char* name=0 );
+
+private:
+ QGuardedPtr<SettingsDialog> m_settings;
+};
+
+#endif
diff --git a/languages/cpp/pcsimporter/qtimporter/settingsdialog.cpp b/languages/cpp/pcsimporter/qtimporter/settingsdialog.cpp
new file mode 100644
index 00000000..b0db10cc
--- /dev/null
+++ b/languages/cpp/pcsimporter/qtimporter/settingsdialog.cpp
@@ -0,0 +1,122 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* Copyright (C) 2006 by Jens Dagerbo *
+* jens.dagerbo@swipnet.se *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include <klistbox.h>
+#include <kcombobox.h>
+#include <kurlrequester.h>
+#include <kdebug.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include <qfile.h>
+#include <qdir.h>
+#include <qregexp.h>
+#include <cstdlib>
+
+#include "settingsdialog.h"
+
+QListBoxItem* QListBox_selectedItem( QListBox* cpQListBox )
+{
+ if ( cpQListBox->selectionMode() != QListBox::Single )
+ return 0;
+ if ( cpQListBox->isSelected( cpQListBox->currentItem() ) )
+ return cpQListBox->item( cpQListBox->currentItem() );
+ return 0;
+}
+
+SettingsDialog::SettingsDialog( QWidget* parent, const char* name, WFlags fl )
+ : SettingsDialogBase( parent, name, fl )
+{
+ QStringList qtdirs;
+ qtdirs.push_back( ::getenv( "QTDIR" ) + QString("/include") );
+ qtdirs.push_back( "/usr/lib/qt3/include" );
+ qtdirs.push_back( "/usr/lib/qt/include" );
+ qtdirs.push_back( "/usr/share/qt3/include" );
+ qtdirs.push_back( "/usr/qt/3/include" ); // gentoo style
+
+ for ( QStringList::Iterator it = qtdirs.begin(); it != qtdirs.end(); ++it )
+ {
+ QString qtdir = *it;
+ if ( !qtdir.isEmpty() && isValidQtDir( qtdir ) )
+ if ( !qtListBox->findItem( qtdir, ExactMatch ) )
+ qtListBox->insertItem( qtdir );
+ }
+
+ qtUrl->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
+
+ connect( addUrlButton, SIGNAL(clicked()), this, SLOT(addUrlButton_clicked()) );
+}
+
+SettingsDialog::~SettingsDialog()
+{}
+
+void SettingsDialog::slotSelectionChanged( QListBoxItem* )
+{
+ if ( !qtListBox->selectedItem() )
+ {
+ emit enabled( false );
+ return ;
+ }
+
+ QDir dir( qtDir() );
+ QStringList qconfigFileList = dir.entryList( "qconfig-*.h" );
+ qtConfiguration->clear();
+ QRegExp rx( "qconfig-(\\w+)\\.h" );
+ for ( QStringList::Iterator it = qconfigFileList.begin(); it != qconfigFileList.end(); ++it )
+ {
+ ( void ) rx.exactMatch( *it );
+ qtConfiguration->insertItem( rx.cap( 1 ) );
+ }
+
+ emit enabled( true );
+}
+
+bool SettingsDialog::isValidQtDir( const QString & path ) const
+{
+ return QFile::exists( path + "/qt.h" );
+}
+
+QString SettingsDialog::qtDir( ) const
+{
+ return qtListBox->currentText();
+}
+
+QString SettingsDialog::configuration( ) const
+{
+ return qtConfiguration->currentText();
+}
+void SettingsDialog::addUrlButton_clicked( )
+{
+ kdDebug(9000) << k_funcinfo << endl;
+
+ if ( isValidQtDir( qtUrl->url() ) )
+ {
+ qtListBox->insertItem( qtUrl->url() );
+ if ( QListBoxItem * item = qtListBox->findItem( qtUrl->url(), ExactMatch ) )
+ {
+ qtListBox->setSelected( item, true );
+ }
+ qtUrl->lineEdit()->clear();
+ }
+ else
+ {
+ KMessageBox::error( this, i18n("This does not appear to be a valid Qt3 include directory.\nPlease select a different directory."), i18n("Invalid Directory") );
+ }
+
+}
+
+#include "settingsdialog.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
+
diff --git a/languages/cpp/pcsimporter/qtimporter/settingsdialog.h b/languages/cpp/pcsimporter/qtimporter/settingsdialog.h
new file mode 100644
index 00000000..1ec5663e
--- /dev/null
+++ b/languages/cpp/pcsimporter/qtimporter/settingsdialog.h
@@ -0,0 +1,46 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include "settingsdialogbase.h"
+
+class SettingsDialog : public SettingsDialogBase
+{
+ Q_OBJECT
+
+public:
+ SettingsDialog(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~SettingsDialog();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ bool isValidQtDir( const QString& path ) const;
+
+ QString qtDir() const;
+ QString configuration() const;
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ virtual void slotSelectionChanged(QListBoxItem*);
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void addUrlButton_clicked();
+
+};
+
+#endif
+
+
diff --git a/languages/cpp/pcsimporter/qtimporter/settingsdialogbase.ui b/languages/cpp/pcsimporter/qtimporter/settingsdialogbase.ui
new file mode 100644
index 00000000..fa485d57
--- /dev/null
+++ b/languages/cpp/pcsimporter/qtimporter/settingsdialogbase.ui
@@ -0,0 +1,139 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SettingsDialogBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SettingsDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>397</width>
+ <height>283</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="3" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>161</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Scope:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>qtConfiguration</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select the Qt configuration for which to create a Code Completion database. If you do not know what this option does, accept the default.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QPushButton" row="2" column="2">
+ <property name="name">
+ <cstring>addUrlButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>qtUrl</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Qt3 include directories:
+Only the selected entry will be used</string>
+ </property>
+ </widget>
+ <widget class="KListBox" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>qtListBox</cstring>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>qtListBox</sender>
+ <signal>selectionChanged(QListBoxItem*)</signal>
+ <receiver>SettingsDialogBase</receiver>
+ <slot>slotSelectionChanged(QListBoxItem*)</slot>
+ </connection>
+</connections>
+<signals>
+ <signal>enabled(int)</signal>
+</signals>
+<slots>
+ <slot>slotSelectionChanged(QListBoxItem*)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistbox.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/cpp/problemreporter.cpp b/languages/cpp/problemreporter.cpp
new file mode 100644
index 00000000..48f9a84a
--- /dev/null
+++ b/languages/cpp/problemreporter.cpp
@@ -0,0 +1,441 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include "problemreporter.h"
+#include "cppsupportpart.h"
+#include "configproblemreporter.h"
+#include "backgroundparser.h"
+
+#include <kdevpartcontroller.h>
+#include <kdevmainwindow.h>
+#include <kdevproject.h>
+
+#include <kdeversion.h>
+#include <kparts/part.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/document.h>
+#include <ktexteditor/markinterface.h>
+
+#include <ktexteditor/markinterfaceextension.h>
+#include <ktexteditor/view.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstatusbar.h>
+#include <kurl.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kdialogbase.h>
+
+#include <kconfig.h>
+
+#include <qtimer.h>
+#include <qregexp.h>
+#include <qvbox.h>
+#include <qfileinfo.h>
+#include <qwhatsthis.h>
+#include <qtabbar.h>
+#include <qwidgetstack.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+
+class ProblemItem: public KListViewItem
+{
+public:
+ ProblemItem( QListView* parent, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : KListViewItem( parent, problem, file, line, column )
+ {}
+
+ ProblemItem( QListViewItem* parent, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : KListViewItem( parent, problem, file, line, column )
+ {}
+
+ int compare( QListViewItem* item, int column, bool ascending ) const
+ {
+ if ( column == 1 || column == 2 )
+ {
+ int a = text( column ).toInt();
+ int b = item->text( column ).toInt();
+ if ( a == b )
+ return 0;
+ return ( a > b ? 1 : -1 );
+ }
+ return KListViewItem::compare( item, column, ascending );
+ }
+
+};
+
+ProblemReporter::ProblemReporter( CppSupportPart* part, QWidget* parent, const char* name )
+: QWidget( parent, name ? name : "problemreporter" ),
+m_cppSupport( part ),
+// m_document( 0 ),
+m_markIface( 0 )
+{
+ QWhatsThis::add(this, i18n("<b>Problem reporter</b><p>This window shows various \"problems\" in your project. "
+ "It displays TODO entries, FIXME's and errors reported by a language parser. "
+ "To add a TODO or FIXME entry, just type<br>"
+ "<tt>//@todo my todo</tt><br>"
+ "<tt>//TODO: my todo</tt><br>"
+ "<tt>//FIXME fix this</tt>"));
+
+ m_initCurrentTimer = new QTimer( this );
+ connect( m_initCurrentTimer, SIGNAL(timeout()), this, SLOT(initCurrentList()) );
+ m_gridLayout = new QGridLayout(this,2,3);
+
+ m_errorList = new KListView(this);
+ m_warningList = new KListView(this);
+ m_fixmeList = new KListView(this);
+ m_todoList = new KListView(this);
+ m_filteredList = new KListView(this);
+ m_currentList = new KListView(this);
+
+ m_filteredList->addColumn( i18n("Level") );
+ m_currentList->addColumn( i18n("Level") );
+
+ //addColumn( i18n("Level") );
+ InitListView(m_warningList);
+ InitListView(m_errorList);
+ InitListView(m_fixmeList);
+ InitListView(m_todoList);
+ InitListView(m_filteredList);
+ InitListView(m_currentList);
+ m_currentList->removeColumn(1);
+
+ m_widgetStack = new QWidgetStack(this);
+ m_widgetStack->addWidget(m_currentList,0);
+ m_widgetStack->addWidget(m_errorList,1);
+ m_widgetStack->addWidget(m_warningList,2);
+ m_widgetStack->addWidget(m_fixmeList,3);
+ m_widgetStack->addWidget(m_todoList,4);
+ m_widgetStack->addWidget(m_filteredList,5);
+
+ m_tabBar = new QTabBar(this);
+ m_tabBar->insertTab(new QTab(i18n("Current")),0);
+ m_tabBar->insertTab(new QTab(i18n("Errors")),1);
+ m_tabBar->insertTab(new QTab(i18n("Warnings")),2);
+ m_tabBar->insertTab(new QTab(i18n("Fixme")),3);
+ m_tabBar->insertTab(new QTab(i18n("Todo")),4);
+ m_tabBar->insertTab(new QTab(i18n("Filtered")),5);
+ m_tabBar->setTabEnabled(0,false);
+ m_tabBar->setTabEnabled(5,false);
+
+ m_filterEdit = new KLineEdit(this);
+
+ QLabel* m_filterLabel = new QLabel(i18n("Lookup:"),this);
+
+ m_gridLayout->addWidget(m_tabBar,0,0);
+ m_gridLayout->addMultiCellWidget(m_widgetStack,1,1,0,2);
+ m_gridLayout->addWidget(m_filterLabel,0,1,Qt::AlignRight);
+ m_gridLayout->addWidget(m_filterEdit,0,2,Qt::AlignLeft);
+
+ connect( m_filterEdit, SIGNAL(returnPressed()),
+ this, SLOT(slotFilter()) );
+ connect( m_filterEdit, SIGNAL(textChanged( const QString & )),
+ this, SLOT(slotFilter()) );
+ connect( m_tabBar, SIGNAL(selected(int)),
+ this, SLOT(slotTabSelected(int)) );
+ connect( part->partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part*)) );
+ connect( part->partController(), SIGNAL(partAdded(KParts::Part*)),
+ this, SLOT(slotPartAdded(KParts::Part*)) );
+
+ // any editors that were open when we loaded the project needs to have their markType07 icon set too..
+ QPtrListIterator<KParts::Part> it( *m_cppSupport->partController()->parts() );
+ while( it.current() )
+ {
+ if ( KTextEditor::MarkInterfaceExtension* iface = dynamic_cast<KTextEditor::MarkInterfaceExtension*>( it.current() ) )
+ {
+ iface->setPixmap( KTextEditor::MarkInterface::markType07, SmallIcon("stop") );
+ }
+ ++it;
+ }
+
+ slotActivePartChanged( part->partController()->activePart() );
+}
+
+void ProblemReporter::slotFilter()
+{
+ if(!m_tabBar->isTabEnabled(5))
+ m_tabBar->setTabEnabled(5,true);
+
+ m_tabBar->tab(5)->setText(i18n("Filtered: %1").arg( m_filterEdit->text() ));
+ m_tabBar->setCurrentTab(5);
+
+ m_filteredList->clear();
+
+ if ( m_filterEdit->text().isEmpty() )
+ {
+ m_tabBar->setTabEnabled( 5, false );
+ return;
+ }
+
+ filterList(m_errorList,i18n("Error"));
+ filterList(m_warningList,i18n("Warning"));
+ filterList(m_fixmeList,i18n("Fixme"));
+ filterList(m_todoList,i18n("Todo"));
+
+}
+
+void ProblemReporter::filterList(KListView* listview, const QString& level)
+{
+ QListViewItemIterator it( listview );
+ while ( it.current() )
+ {
+ if ( it.current()->text(3).contains(m_filterEdit->text(),false))
+ {
+ new KListViewItem(m_filteredList,level,
+ it.current()->text(0), it.current()->text(1),
+ it.current()->text(2), it.current()->text(3));
+ }
+ ++it;
+ }
+}
+
+void ProblemReporter::slotTabSelected( int tabindex )
+{
+ m_widgetStack->raiseWidget(tabindex);
+}
+
+void ProblemReporter::InitListView(KListView* listview)
+{
+ listview->addColumn( i18n("File") );
+ listview->addColumn( i18n("Line") );
+ listview->addColumn( i18n("Column") );
+ listview->addColumn( i18n("Problem") );
+ listview->setAllColumnsShowFocus( TRUE );
+
+ connect( listview, SIGNAL(executed(QListViewItem*)),
+ this, SLOT(slotSelected(QListViewItem*)) );
+
+ connect( listview, SIGNAL(returnPressed(QListViewItem*)),
+ this, SLOT(slotSelected(QListViewItem* )) );
+
+}
+
+ProblemReporter::~ProblemReporter()
+{
+}
+
+void ProblemReporter::slotActivePartChanged( KParts::Part* part )
+{
+ m_currentList->clear();
+
+ KParts::ReadOnlyPart * ro_part = dynamic_cast<KParts::ReadOnlyPart*>( part );
+ m_markIface = dynamic_cast<KTextEditor::MarkInterface*>( part );
+
+ if ( !ro_part )
+ {
+ m_tabBar->setTabEnabled(0,false);
+ return;
+ }
+
+ m_fileName = ro_part->url().path();
+
+ initCurrentList();
+}
+
+void EfficientKListView::limitSize( int size )
+{
+ if( m_map.size() <= size + 50 ) return;
+
+ QMap<int, HashedString> backMap;
+ for( InsertionMap::const_iterator it = m_insertionNumbers.begin(); it != m_insertionNumbers.end(); ++it )
+ backMap[ (*it).second ] = (*it).first;
+
+ for( QMap<int, HashedString>::const_iterator it = backMap.begin(); it != backMap.end() && m_map.size() > size; ++it )
+ removeAllItems( (*it).str() );
+}
+
+void EfficientKListView::removeAllItems( const QString& str )
+{
+ HashedString h(str);
+ m_insertionNumbers.erase( h ) ;
+
+ std::pair<Map::iterator, Map::iterator> p = m_map.equal_range( h );
+
+ for( Map::iterator it = p.first; it != p.second; ++it ) {
+ delete( (*it).second );
+ }
+
+ m_map.erase( p.first, p.second );
+}
+
+void ProblemReporter::removeAllProblems( const QString& filename )
+{
+ QString relFileName = m_cppSupport->project()->relativeProjectFile(filename);
+
+ kdDebug(9007) << "ProblemReporter::removeAllProblems()" << relFileName << endl;
+
+ m_errorList.limitSize( 300 );
+ m_warningList.limitSize( 300 );
+ m_fixmeList.limitSize( 300 );
+ m_todoList.limitSize( 300 );
+
+ m_warningList.removeAllItems( relFileName );
+ m_errorList.removeAllItems( relFileName );
+ m_fixmeList.removeAllItems( relFileName );
+ m_todoList.removeAllItems( relFileName );
+
+ if( m_markIface )
+ {
+ QPtrList<KTextEditor::Mark> marks = m_markIface->marks();
+ QPtrListIterator<KTextEditor::Mark> it( marks );
+ while( it.current() )
+ {
+ m_markIface->removeMark( it.current()->line, KTextEditor::MarkInterface::markType07 );
+ ++it;
+ }
+ }
+ m_initCurrentTimer->start(500, true);
+}
+
+void ProblemReporter::initCurrentList()
+{
+ m_tabBar->setTabEnabled(0,true);
+
+ QString relFileName = m_cppSupport->project()->relativeProjectFile(m_fileName);
+
+ m_currentList->clear();
+
+ updateCurrentWith(m_errorList, i18n("Error"),relFileName);
+ updateCurrentWith(m_warningList, i18n("Warning"),relFileName);
+ updateCurrentWith(m_fixmeList,i18n("Fixme"),relFileName);
+ updateCurrentWith(m_todoList,i18n("Todo"),relFileName);
+
+// m_tabBar->setCurrentTab(0);
+}
+
+void ProblemReporter::updateCurrentWith(EfficientKListView& listview, const QString& level, const QString& filename)
+{
+ EfficientKListView::Range r = listview.getRange( filename );
+ for( ; r.first != r.second; ++r.first )
+ new ProblemItem(m_currentList,level,(*r.first).second->text(1),(*r.first).second->text(2),(*r.first).second->text(3));
+}
+
+void ProblemReporter::slotSelected( QListViewItem* item )
+{
+ bool is_filtered = false;
+ bool is_current = false;
+ if(item->listView() == m_filteredList)
+ is_filtered = true;
+ else if(item->listView() == m_currentList)
+ is_current = true;
+
+ //either use current file m_fileName or assemble a new one from current item (relative path) and projectDirectory
+ KURL url( is_current ? m_fileName : m_cppSupport->project()->projectDirectory() + "/" + item->text(0 + is_filtered) );
+ int line = item->text( 1 + is_filtered).toInt();
+ // int column = item->text( 3 ).toInt();
+ m_cppSupport->partController()->editDocument( url, line-1 );
+}
+
+bool ProblemReporter::hasErrors( const QString& fileName ) {
+ return m_errorList.hasItem( fileName );
+}
+
+void ProblemReporter::reportProblem( const QString& fileName, const Problem& p )
+{
+ int markType = levelToMarkType( p.level() );
+ if( markType != -1 && m_markIface && m_fileName == fileName )
+ m_markIface->addMark( p.line(), markType );
+
+ QString msg = p.text();
+ msg = msg.replace( QRegExp("\n"), "" );
+
+ QString relFileName = m_cppSupport->project()->relativeProjectFile(fileName);
+
+ EfficientKListView* list;
+
+ switch( p.level() )
+ {
+ case Problem::Level_Error:
+ list = &m_errorList;
+ break;
+ case Problem::Level_Warning:
+ list = &m_warningList;
+ break;
+ case Problem::Level_Todo:
+ list = &m_todoList;
+ break;
+ case Problem::Level_Fixme:
+ list = &m_fixmeList;
+ break;
+ default:
+ list = NULL;
+ }
+
+ if(list)
+ {
+ list->addItem( relFileName, new ProblemItem( *list,
+ relFileName,
+ QString::number( p.line() + 1 ),
+ QString::number( p.column() + 1 ),
+ msg ) );
+
+ }
+
+ m_initCurrentTimer->start( 500, true );
+}
+
+void ProblemReporter::slotPartAdded( KParts::Part* part )
+{
+ KTextEditor::MarkInterfaceExtension* iface = dynamic_cast<KTextEditor::MarkInterfaceExtension*>( part );
+
+ if( !iface )
+ return;
+
+ iface->setPixmap( KTextEditor::MarkInterface::markType07, SmallIcon("stop") );
+}
+
+QString ProblemReporter::levelToString( int level ) const
+{
+ switch( level )
+ {
+ case Problem::Level_Error:
+ return QString( i18n("Error") );
+ case Problem::Level_Warning:
+ return QString( i18n("Warning") );
+ case Problem::Level_Todo:
+ return QString( i18n("Todo") );
+ case Problem::Level_Fixme:
+ return QString( i18n("Fixme") );
+ default:
+ return QString::null;
+ }
+}
+
+int ProblemReporter::levelToMarkType( int level ) const
+{
+ switch( level )
+ {
+ case Problem::Level_Error:
+ return KTextEditor::MarkInterface::markType07;
+ case Problem::Level_Warning:
+ return -1;
+ case Problem::Level_Todo:
+ return -1;
+ case Problem::Level_Fixme:
+ return -1;
+ default:
+ return -1;
+ }
+}
+
+#include "problemreporter.moc"
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/problemreporter.h b/languages/cpp/problemreporter.h
new file mode 100644
index 00000000..7e66b864
--- /dev/null
+++ b/languages/cpp/problemreporter.h
@@ -0,0 +1,156 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef PROBLEMSREPORTER_H
+#define PROBLEMSREPORTER_H
+
+#include <klistview.h>
+#include <klineedit.h>
+#include <qguardedptr.h>
+#include <qdatetime.h>
+#include <map>
+#include <ext/hash_map>
+#include "hashedstring.h"
+
+class CppSupportPart;
+class QTimer;
+class QTabBar;
+class QWidgetStack;
+class QGridLayout;
+class KDialogBase;
+class Problem;
+class KURL;
+
+class EfficientKListView {
+public:
+ typedef __gnu_cxx::hash_multimap<HashedString, QListViewItem*> Map;
+ typedef std::pair< Map::const_iterator, Map::const_iterator > Range;
+ EfficientKListView( KListView* list = 0 ) : m_list( list ), m_insertionNumber( 0 ) {
+ }
+
+ EfficientKListView& operator = ( KListView* list ) {
+ m_list = list;
+ return *this;
+ }
+
+ operator KListView* () {
+ return m_list;
+ }
+
+ operator const KListView* () const {
+ return m_list;
+ }
+
+ KListView* operator -> () {
+ return m_list;
+ }
+
+ const KListView* operator -> () const {
+ return m_list;
+ }
+
+ void addItem( const QString& str, QListViewItem* item ) {
+ HashedString h( str );
+ m_insertionNumbers[h] = ++m_insertionNumber;
+ m_map.insert( std::make_pair( h, item ) );
+ }
+
+ Range getRange( const QString& str ) const {
+ return m_map.equal_range( HashedString(str) );
+ }
+
+ ///If the list has more then size items, the first items are removed until the size fits.
+ void limitSize( int size );
+
+ void removeAllItems( const QString& str );
+
+ bool hasItem( const QString& str ) const {
+ Map::const_iterator it = m_map.find( HashedString(str) );
+ return it != m_map.end();
+ }
+private:
+ int m_insertionNumber;
+ Map m_map;
+ typedef __gnu_cxx::hash_map<HashedString, int> InsertionMap;
+ InsertionMap m_insertionNumbers; //This is used to count which file was inserted first(higher insertion-number -> inserted later)
+ KListView* m_list;
+};
+
+namespace KParts
+{
+ class Part;
+}
+
+namespace KTextEditor
+{
+ class MarkInterface;
+ class Document;
+}
+
+class ProblemReporter: public QWidget
+{
+ Q_OBJECT
+public:
+ ProblemReporter( CppSupportPart* part, QWidget* parent = 0, const char* name = 0 );
+ virtual ~ProblemReporter();
+
+ void removeAllProblems( const QString& filename );
+ void reportProblem( const QString& fileName, const Problem& p );
+ bool hasErrors(const QString& file);
+
+public slots:
+
+private slots:
+ void slotPartAdded( KParts::Part* );
+ void slotActivePartChanged( KParts::Part* );
+ void slotSelected( QListViewItem* );
+ void slotTabSelected( int tabindex );
+ void slotFilter();
+ void initCurrentList();
+
+private:
+ QString levelToString( int level ) const;
+ int levelToMarkType( int level ) const;
+ void InitListView( KListView* listview );
+ void filterList( KListView* listview, const QString& level );
+ void updateCurrentWith( EfficientKListView& listview, const QString& level, const QString& filename );
+
+private:
+ QGridLayout* m_gridLayout;
+ QTabBar* m_tabBar;
+ QWidgetStack* m_widgetStack;
+ KListView* m_currentList;
+ QTimer* m_initCurrentTimer;
+ EfficientKListView m_errorList;
+ EfficientKListView m_fixmeList;
+ EfficientKListView m_todoList;
+ EfficientKListView m_warningList;
+ KListView* m_filteredList;
+ KLineEdit* m_filterEdit;
+
+ CppSupportPart* m_cppSupport;
+ KTextEditor::MarkInterface* m_markIface;
+ QString m_fileName;
+
+ ///@todo move these to cppsupportpart
+ int m_active;
+ int m_delay;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/qtbuildconfig.cpp b/languages/cpp/qtbuildconfig.cpp
new file mode 100644
index 00000000..809767bc
--- /dev/null
+++ b/languages/cpp/qtbuildconfig.cpp
@@ -0,0 +1,216 @@
+/*
+ Copyright (C) 2005 by Tobias Erbsland <te@profzone.ch>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+#include "qtbuildconfig.h"
+#include "cppsupportpart.h"
+
+#include <domutil.h>
+
+#include <kdebug.h>
+#include <qdom.h>
+
+#include <stdlib.h>
+
+const QString QtBuildConfig::m_configRoot = QString( "/kdevcppsupport/qt" );
+
+QtBuildConfig::QtBuildConfig( CppSupportPart * part, QDomDocument* dom )
+ : QObject( part ), m_part( part ), m_dom( dom )
+{
+ init();
+}
+
+QtBuildConfig::~QtBuildConfig()
+{
+}
+
+void QtBuildConfig::init( )
+{
+ m_used = DomUtil::readBoolEntry( *m_dom, m_configRoot + "/used", false );
+ m_version = DomUtil::readIntEntry( *m_dom, m_configRoot + "/version", 3 );
+ if( m_version < 3 || m_version > 4 )
+ {
+ m_version = 3;
+ }
+ m_includeStyle = DomUtil::readIntEntry( *m_dom, m_configRoot + "/includestyle", 3 );
+ if( m_includeStyle < 3 || m_includeStyle > 4 )
+ {
+ m_includeStyle = m_version;
+ }
+ m_root = DomUtil::readEntry( *m_dom, m_configRoot + "/root", "" );
+ m_qmakePath = DomUtil::readEntry(*m_dom, m_configRoot + "/qmake", "");
+ m_designerPath = DomUtil::readEntry(*m_dom, m_configRoot + "/designer", "");
+ m_designerPluginPaths = DomUtil::readListEntry(*m_dom, m_configRoot + "/designerpluginpaths", "path" );
+
+ if( m_root.isEmpty() || !isValidQtDir( m_root ) )
+ {
+ findQtDir();
+ }
+ if( m_qmakePath.isEmpty() || !isExecutable( m_qmakePath ) )
+ {
+ m_qmakePath = findExecutable( "qmake-qt"+ QString::number( m_version ) );
+ if( m_qmakePath.isEmpty() || !isExecutable( m_qmakePath ) )
+ m_qmakePath = findExecutable( "qmake" );
+ }
+ if( m_designerPath.isEmpty() || !isExecutable( m_designerPath ) )
+ {
+ m_designerPath = findExecutable( "designer-qt"+QString::number( m_version ) );
+ if( m_designerPath.isEmpty() || !isExecutable( m_designerPath ) )
+ m_designerPath = findExecutable( "designer" );
+ }
+
+
+ m_designerIntegration = DomUtil::readEntry( *m_dom, m_configRoot + "/designerintegration" );
+ if( m_designerIntegration.isEmpty() )
+ {
+ if ( m_version == 3 )
+ m_designerIntegration = "EmbeddedKDevDesigner";
+ else
+ m_designerIntegration = "ExternalDesigner";
+ }
+}
+
+bool QtBuildConfig::isValidQtDir( const QString& path ) const
+{
+ QFileInfo inc( path + QString( QChar( QDir::separator() ) )+
+ "include"+QString( QChar( QDir::separator() ) )+
+ "qt.h" );
+ return ( m_version == 4 || ( m_version != 4 && inc.exists() ) );
+}
+
+void QtBuildConfig::buildBinDirs( QStringList & dirs ) const
+{
+ if( m_version == 3 )
+ {
+ if( !m_root.isEmpty() )
+ dirs << (m_root + QString( QChar( QDir::separator() ) ) + "bin");
+ dirs << (::getenv("QTDIR") + QString( QChar( QDir::separator() ) ) + "bin");
+ }
+ QStringList paths = QStringList::split(":",::getenv("PATH"));
+ dirs += paths;
+ QString binpath = QDir::rootDirPath() + "bin";
+ if( dirs.findIndex( binpath ) != -1 )
+ dirs << binpath;
+
+ binpath = QDir::rootDirPath() + "usr" + QString( QChar( QDir::separator() ) ) + "bin";
+ if( dirs.findIndex( binpath ) != -1 )
+ dirs << binpath;
+ binpath = QDir::rootDirPath() + "usr" + QString( QChar( QDir::separator() ) ) + "local" + QString( QChar( QDir::separator() ) ) + "bin";
+ if( dirs.findIndex( binpath ) != -1 )
+ dirs << binpath;
+}
+
+
+QString QtBuildConfig::findExecutable( const QString& execname ) const
+{
+ QStringList dirs;
+ buildBinDirs( dirs );
+
+ for( QStringList::Iterator it=dirs.begin(); it!=dirs.end(); ++it )
+ {
+ QString designer = *it + QString( QChar( QDir::separator() ) ) + execname;
+ if( !designer.isEmpty() && isExecutable( designer ) )
+ {
+ return designer;
+ }
+ }
+ return "";
+}
+
+bool QtBuildConfig::isExecutable( const QString& path ) const
+{
+ QFileInfo fi(path);
+ return( fi.exists() && fi.isExecutable() );
+}
+
+void QtBuildConfig::findQtDir()
+{
+ QStringList qtdirs;
+ if( m_version == 3 )
+ qtdirs.push_back( ::getenv("QTDIR") );
+ qtdirs.push_back( QDir::rootDirPath()+"usr"+QString( QChar( QDir::separator() ) )+"lib"+QString( QChar( QDir::separator() ) )+"qt"+QString("%1").arg( m_version ) );
+ qtdirs.push_back( QDir::rootDirPath()+"usr"+QString( QChar( QDir::separator() ) )+"lib"+QString( QChar( QDir::separator() ) )+"qt"+QString( QChar( QDir::separator() ) )+QString("%1").arg( m_version ) );
+ qtdirs.push_back( QDir::rootDirPath()+"usr"+QString( QChar( QDir::separator() ) )+"share"+QString( QChar( QDir::separator() ) )+"qt"+QString("%1").arg( m_version ) );
+ qtdirs.push_back( QDir::rootDirPath()+"usr" );
+ qtdirs.push_back( QDir::rootDirPath()+"usr"+QString( QChar( QDir::separator() ) )+"lib"+QString( QChar( QDir::separator() ) )+"qt" );
+
+ for( QStringList::Iterator it=qtdirs.begin(); it!=qtdirs.end(); ++it )
+ {
+ QString qtdir = *it;
+ if( !qtdir.isEmpty() && isValidQtDir(qtdir) )
+ {
+ m_root = qtdir;
+ return;
+ }
+ }
+}
+
+void QtBuildConfig::store( )
+{
+ DomUtil::writeBoolEntry( *m_dom, m_configRoot + "/used", m_used );
+ DomUtil::writeIntEntry( *m_dom, m_configRoot + "/version", m_version );
+ DomUtil::writeIntEntry( *m_dom, m_configRoot + "/includestyle", m_includeStyle );
+ DomUtil::writeEntry( *m_dom, m_configRoot + "/root", m_root );
+ DomUtil::writeEntry( *m_dom, m_configRoot + "/designerintegration", m_designerIntegration );
+ DomUtil::writeEntry(*m_dom, m_configRoot + "/qmake", m_qmakePath );
+ DomUtil::writeEntry(*m_dom, m_configRoot + "/designer", m_designerPath );
+ DomUtil::writeListEntry(*m_dom, m_configRoot + "/designerpluginpaths", "path", m_designerPluginPaths );
+
+ emit stored();
+}
+
+void QtBuildConfig::setUsed( bool used )
+{
+ m_used = used;
+}
+
+void QtBuildConfig::setVersion( int version )
+{
+ m_version = version;
+}
+
+void QtBuildConfig::setIncludeStyle( int style )
+{
+ m_includeStyle = style;
+}
+
+void QtBuildConfig::setRoot( const QString& root )
+{
+ m_root = root;
+}
+
+void QtBuildConfig::setQMakePath( const QString& path )
+{
+ m_qmakePath = path;
+}
+
+void QtBuildConfig::setDesignerPluginPaths( const QStringList& pfx )
+{
+ m_designerPluginPaths = pfx;
+}
+
+void QtBuildConfig::setDesignerPath( const QString& path )
+{
+ m_designerPath = path;
+}
+
+void QtBuildConfig::setDesignerIntegration( const QString& designerIntegration )
+{
+ m_designerIntegration = designerIntegration;
+}
+#include "qtbuildconfig.moc"
+
+//kate: space-indent on; indent-width 4; tab-width 4; replace-tabs on
diff --git a/languages/cpp/qtbuildconfig.h b/languages/cpp/qtbuildconfig.h
new file mode 100644
index 00000000..080cf2c1
--- /dev/null
+++ b/languages/cpp/qtbuildconfig.h
@@ -0,0 +1,90 @@
+/*
+ Copyright (C) 2005 by Tobias Erbsland <te@profzone.ch>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+#ifndef QTBUILDCONFIG_H
+#define QTBUILDCONFIG_H
+
+#include <qobject.h>
+#include <qstringlist.h>
+
+class CppSupportPart;
+class QDomDocument;
+
+/**
+ @brief The QtBuildConfig class stores all parameters related to the used Qt library
+
+ @author Tobias Erbsland <te@profzone.ch>
+*/
+class QtBuildConfig : public QObject
+{
+ Q_OBJECT
+
+public:
+ QtBuildConfig( CppSupportPart* part, QDomDocument* dom );
+ virtual ~QtBuildConfig();
+
+ inline bool isUsed() const { return m_used; }
+ inline int version() const { return m_version; }
+ inline int includeStyle() const { return m_includeStyle; }
+ inline const QString& root() const { return m_root; }
+ inline const QString& qmakePath() const { return m_qmakePath; }
+ inline const QString& designerPath() const { return m_designerPath; }
+ inline const QStringList& designerPluginPaths() const { return m_designerPluginPaths; }
+ inline const QString& designerIntegration() const { return m_designerIntegration; }
+
+ void setUsed( bool used );
+ void setVersion( int version );
+ void setIncludeStyle( int style );
+ void setRoot( const QString& root );
+ void setDesignerPath( const QString& path );
+ void setDesignerPluginPaths( const QStringList& pfx );
+ void setQMakePath( const QString& path );
+ void setDesignerIntegration( const QString& designerIntegration );
+ void init();
+
+public slots:
+ void store();
+
+signals:
+ void stored();
+
+private:
+
+ bool isValidQtDir( const QString& ) const;
+ void findQtDir();
+ QString findExecutable( const QString& ) const;
+ void buildBinDirs( QStringList& ) const;
+ bool isExecutable( const QString& ) const;
+
+ CppSupportPart* m_part; ///< The cpp support part
+ QDomDocument* m_dom; ///< The project configuration
+
+ bool m_used; ///< Flag if qt is used in this project.
+ int m_version; ///< The major version of the qt library (3 or 4)
+ int m_includeStyle; ///< The type of include style used (qt 3 or 4)
+ QString m_root; ///< The root directory of the used qt installation for Qt3
+ QString m_designerPath; ///< The path including the binary name of Qt Designer
+ QString m_qmakePath; ///< The path including the binary name of QMake
+ QStringList m_designerPluginPaths; ///< The Prefix for Designer
+ QString m_designerIntegration; ///< The type of designer used, kdevdesigner or qt designer
+
+ static const QString m_configRoot; ///< The root path of the configuration
+};
+
+#endif
+
+// kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/qtdesignercppintegration.cpp b/languages/cpp/qtdesignercppintegration.cpp
new file mode 100644
index 00000000..76581003
--- /dev/null
+++ b/languages/cpp/qtdesignercppintegration.cpp
@@ -0,0 +1,218 @@
+/***************************************************************************
+* Copyright (C) 2004 by Alexander Dymo *
+* adymo@mksat.net *
+* Portions Copyright (C) 2003 Roberto Raggi (roberto@kdevelop.org) *
+* *
+* 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. *
+***************************************************************************/
+#include "qtdesignercppintegration.h"
+
+#include <qpair.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/viewcursorinterface.h>
+
+#include <domutil.h>
+#include <kdevpartcontroller.h>
+#include <kdevcreatefile.h>
+
+#include "backgroundparser.h"
+#include "cppsupportpart.h"
+#include "codemodel_utils.h"
+#include "implementationwidget.h"
+
+QtDesignerCppIntegration::QtDesignerCppIntegration( KDevLanguageSupport *part,
+ ImplementationWidget *impl )
+: QtDesignerIntegration( part, impl, true, 0 )
+{}
+
+void QtDesignerCppIntegration::addFunctionToClass( KInterfaceDesigner::Function function, ClassDom klass )
+{
+ m_part->partController() ->editDocument( KURL( klass->fileName() ) );
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( m_part->partController() ->activePart() );
+ if ( !editIface )
+ {
+ /// @todo show messagebox
+ // QDialog::accept();
+ return ;
+ }
+
+ int line, column;
+ klass->getEndPosition( &line, &column );
+
+ // compute the insertion point map
+ QMap<QString, QPair<int, int> > points;
+
+ const FunctionList functionList = klass->functionList();
+ for ( FunctionList::ConstIterator it = functionList.begin(); it != functionList.end(); ++it )
+ {
+ int funEndLine, funEndColumn;
+ ( *it ) ->getEndPosition( &funEndLine, &funEndColumn );
+ QString access = accessID( *it );
+ QPair<int, int> funEndPoint = qMakePair( funEndLine, funEndColumn );
+
+ if ( !points.contains( access ) || points[ access ] < funEndPoint )
+ {
+ points[ access ] = funEndPoint;
+ }
+ }
+
+ int insertedLine = 0;
+
+ QString access = function.access + ( function.type == KInterfaceDesigner::ftQtSlot ? " slots" : "" );
+
+ QString str = function.returnType + " " + function.function;
+ if ( function.specifier == "virtual" )
+ str = "virtual " + str;
+ else if ( function.specifier == "pure virtual" )
+ str = "virtual " + str + " = 0";
+ else if ( function.specifier == "static" )
+ str = "static " + str;
+ str += ";\n";
+ str = " " + str;
+
+ QPair<int, int> pt;
+ if ( points.contains( access ) )
+ {
+ pt = points[ access ];
+ }
+ else
+ {
+ str.prepend( access + ":\n" );
+ points[ access ] = qMakePair( line - 1, 0 );
+ pt = points[ access ]; // end of class declaration
+ }
+
+ editIface->insertText( pt.first + insertedLine + 1, 0 /*pt.second*/, str );
+ insertedLine += str.contains( QChar( '\n' ) );
+
+ CppSupportPart *cppPart = dynamic_cast<CppSupportPart *>( m_part );
+ cppPart->backgroundParser() ->addFile( klass->fileName() );
+
+ if ( function.specifier == "pure virtual" )
+ return ;
+
+
+ //implementation
+ QString stri = function.returnType + " " + klass->name() + "::" + function.function;
+ if ( function.specifier == "static" )
+ stri = "static " + stri;
+ stri += "\n{\n}\n";
+ stri = "\n" + stri;
+
+ QFileInfo fi( klass->fileName() );
+ QString implementationFile = fi.absFilePath();
+ implementationFile.replace( ".h", ".cpp" );
+
+ QFileInfo fileInfo( implementationFile );
+ if ( !QFile::exists( fileInfo.absFilePath() ) )
+ {
+ if ( KDevCreateFile * createFileSupp = m_part->extension<KDevCreateFile>( "KDevelop/CreateFile" ) )
+ createFileSupp->createNewFile( fileInfo.extension(), fileInfo.dirPath( true ), fileInfo.fileName() );
+ }
+
+ m_part->partController() ->editDocument( KURL( implementationFile ) );
+ editIface = dynamic_cast<KTextEditor::EditInterface*>( m_part->partController() ->activePart() );
+ if ( !editIface )
+ return ;
+
+ int atLine = 0, atColumn = 0;
+ TranslationUnitAST *translationUnit = 0;
+ ParsedFilePointer p = cppPart->backgroundParser() ->translationUnit( implementationFile );
+ if( p ) translationUnit = *p;
+ if ( translationUnit )
+ {
+ translationUnit->getEndPosition( &atLine, &atColumn );
+ kdDebug() << "atLine: " << atLine << endl;
+ stri = "\n" + stri;
+ }
+ else
+ {
+ atLine = editIface->numLines();
+ line = editIface->numLines();
+ while ( line > 0 )
+ {
+ if ( editIface->textLine( line ).isEmpty() )
+ {
+ --line;
+ continue;
+ }
+ else
+ {
+ if ( editIface->textLine( line ).contains( QRegExp( ".*#include .*\\.moc.*" ) ) )
+ atLine = line;
+ break;
+ }
+ }
+ kdDebug() << "atLine (2): " << atLine << endl;
+ atColumn = 0;
+ }
+
+ // editIface->insertLine( atLine + 1, QString::fromLatin1("") );
+ kdDebug() << "at line in intg: " << atLine << " atCol: " << atColumn << endl;
+ kdDebug() << "text: " << stri << endl;
+ editIface->insertText( atLine, atColumn, stri );
+ KTextEditor::View *activeView = dynamic_cast<KTextEditor::View*>( m_part->partController() ->activePart() ->widget() );
+ if ( activeView )
+ {
+ KTextEditor::ViewCursorInterface * cursor = dynamic_cast<KTextEditor::ViewCursorInterface*>( activeView );
+ if ( cursor )
+ cursor->setCursorPositionReal( atLine + 3, 1 );
+ }
+
+ cppPart->backgroundParser() ->addFile( implementationFile );
+}
+
+QString QtDesignerCppIntegration::accessID( FunctionDom fun ) const
+{
+ if ( fun->isSignal() )
+ return QString::fromLatin1( "signals" );
+
+ switch ( fun->access() )
+ {
+ case CodeModelItem::Public:
+ if ( fun->isSlot() )
+ return QString::fromLatin1( "public slots" );
+ return QString::fromLatin1( "public" );
+
+ case CodeModelItem::Protected:
+ if ( fun->isSlot() )
+ return QString::fromLatin1( "protected slots" );
+ return QString::fromLatin1( "protected" );
+
+ case CodeModelItem::Private:
+ if ( fun->isSlot() )
+ return QString::fromLatin1( "private slots" );
+ return QString::fromLatin1( "private" );
+ }
+
+ return QString::null;
+}
+
+void QtDesignerCppIntegration::processImplementationName( QString &name )
+{
+ name.replace( ".h", ".cpp" );
+}
+
+#include "qtdesignercppintegration.moc"
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/qtdesignercppintegration.h b/languages/cpp/qtdesignercppintegration.h
new file mode 100644
index 00000000..8709234d
--- /dev/null
+++ b/languages/cpp/qtdesignercppintegration.h
@@ -0,0 +1,40 @@
+/***************************************************************************
+* Copyright (C) 2004 by Alexander Dymo *
+* adymo@mksat.net *
+* *
+* 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. *
+***************************************************************************/
+#ifndef QTDESIGNERCPPINTEGRATION_H
+#define QTDESIGNERCPPINTEGRATION_H
+
+#include <qtdesignerintegration.h>
+
+class QtDesignerCppIntegration : public QtDesignerIntegration
+{
+ Q_OBJECT
+public:
+ QtDesignerCppIntegration( KDevLanguageSupport *part, ImplementationWidget *impl );
+
+protected:
+ virtual void addFunctionToClass( KInterfaceDesigner::Function function, ClassDom klass );
+ QString accessID( FunctionDom fun ) const;
+
+ virtual void processImplementationName( QString &name );
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/safetycounter.h b/languages/cpp/safetycounter.h
new file mode 100644
index 00000000..d4333176
--- /dev/null
+++ b/languages/cpp/safetycounter.h
@@ -0,0 +1,59 @@
+
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __SAFETYCOUNTER_H__
+#define __SAFETYCOUNTER_H__
+
+#include <kdebug.h>
+
+struct SafetyCounter {
+ int safetyCounter;
+ const int maxSafetyCounter;
+
+ SafetyCounter( int max = 40000 ) : safetyCounter(0), maxSafetyCounter(max) {
+ }
+
+ void init() {
+ safetyCounter = 0;
+ }
+
+ SafetyCounter& operator ++() {
+ safetyCounter++;
+ return *this;
+ }
+
+ ///Returns whether the counter is ok, but without increasing it
+ bool ok() const {
+ return safetyCounter < maxSafetyCounter;
+ }
+
+ operator bool() {
+ safetyCounter++;
+ bool ret = safetyCounter < maxSafetyCounter;
+ if( !ret ) {
+ if( safetyCounter == maxSafetyCounter ) {
+#ifdef DEPTHBACKTRACE
+ kdDebug( 9007) << "WARNING: Safety-counter reached count > " << maxSafetyCounter << ", operation stopped" << endl;
+#endif
+ kdDebug( 9007 ) << endl << kdBacktrace() << endl;
+ }
+ }
+
+ return ret;
+ }
+
+};
+
+#endif
diff --git a/languages/cpp/setuphelper.cpp b/languages/cpp/setuphelper.cpp
new file mode 100644
index 00000000..deab6135
--- /dev/null
+++ b/languages/cpp/setuphelper.cpp
@@ -0,0 +1,91 @@
+
+/***************************************************************************
+* Copyright (C) 2006 by Andras Mantia *
+* amantia@kde.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include "setuphelper.h"
+#include "blockingkprocess.h"
+#include "driver.h"
+#include <kdebug.h>
+#include "ktempfile.h" /* defines [function] KTempDir */
+#include "kstandarddirs.h" /* defines [function] locateLocal */
+#include "qdir.h" /* defines QDir */
+#include <stdio.h>
+
+namespace SetupHelper {
+
+QString getGccIncludePath(bool *ok)
+{
+ *ok = true;
+ QString processStdout;
+ BlockingKProcess proc;
+ proc << "gcc" ;
+ proc << "-print-file-name=include" ;
+ if ( !proc.start(KProcess::NotifyOnExit, KProcess::Stdout) ) {
+ kdWarning(9007) << "Couldn't start gcc" << endl;
+ *ok = false;
+ return QString();
+ }
+ processStdout = proc.stdOut();
+
+ return processStdout;
+}
+
+QString getVerboseGccIncludePath(bool *ok)
+{
+ *ok = false;
+ ///Create temp file
+ KTempFile tempFile(locateLocal("tmp", "kdevelop_temp"), ".cpp");
+ tempFile.setAutoDelete(true);
+ if( tempFile.status() != 0 )
+ return QString();//Failed to create temp file
+
+ QString path = tempFile.name();
+ QFileInfo pathInfo( path );
+
+ char fileText[] = "//This source-file is empty";
+ fwrite(fileText, strlen(fileText), 1, tempFile.fstream() );
+ tempFile.close();
+
+ BlockingKProcess proc;
+ proc.setUseShell(true);
+ proc.setWorkingDirectory(pathInfo.dir(true).path());
+ proc << "gcc -v " + pathInfo.fileName() + " 2>&1";
+ if ( !proc.start(KProcess::NotifyOnExit, KProcess::Stdout) ) {
+ kdWarning(9007) << "Couldn't start gcc" << endl;
+ *ok = false;
+ return QString();
+ }
+ *ok = true;
+ return proc.stdOut();
+}
+
+QStringList getGccMacros(bool *ok)
+{
+ *ok = true;
+ QString processStdout;
+ BlockingKProcess proc;
+ proc << "gcc";
+ proc << "-E";
+ proc << "-dM";
+ proc << "-ansi" ;
+ proc << "-";
+ if ( !proc.start(KProcess::NotifyOnExit, KProcess::Stdout) ) {
+ kdWarning(9007) << "Couldn't start gcc" << endl;
+ *ok = false;
+ return QStringList();
+ }
+ proc.closeStdin();
+ processStdout = proc.stdOut();
+ QStringList lines = QStringList::split('\n', processStdout);
+ return lines;
+}
+
+}
diff --git a/languages/cpp/setuphelper.h b/languages/cpp/setuphelper.h
new file mode 100644
index 00000000..380994b4
--- /dev/null
+++ b/languages/cpp/setuphelper.h
@@ -0,0 +1,42 @@
+
+/***************************************************************************
+* Copyright (C) 2006 by Andras Mantia *
+* amantia@kde.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef SETUPHELPER_H
+#define SETUPHELPER_H
+
+#include <qstringlist.h>
+
+/**
+ A helper methods for setting up the various Driver derivates.
+
+ @author Andras Mantia <amantia@kde.org>
+ */
+namespace SetupHelper {
+ /** Get the include paths returned by gcc.
+ * @param ok false if there was a problem running gcc
+ */
+ QString getGccIncludePath(bool *ok);
+
+ /** Get the include-path return by gcc -v
+ * this path includes the path from the environment,
+ * the c++-include-path, etc., and of couse it also includes the above path.
+ * @param ok false if there was a problem running gcc
+ * */
+ QString getVerboseGccIncludePath(bool* ok);
+
+ /** Get the predefined macros returned by gcc
+ * @param ok false if there was a problem running gcc
+ */
+ QStringList getGccMacros(bool *ok);
+};
+
+#endif
diff --git a/languages/cpp/simplecontext.cpp b/languages/cpp/simplecontext.cpp
new file mode 100644
index 00000000..08af929d
--- /dev/null
+++ b/languages/cpp/simplecontext.cpp
@@ -0,0 +1,68 @@
+/***************************************************************************
+ begin : Sat Jul 21 2001
+ copyright : (C) 2001 by Victor R�er
+ email : victor_roeder@gmx.de
+ copyright : (C) 2002,2003 by Roberto Raggi
+ email : roberto@kdevelop.org
+ copyright : (C) 2005 by Adam Treat
+ email : manyoso@yahoo.com
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "simplecontext.h"
+#include "safetycounter.h"
+
+SimpleType getGlobal( SimpleType t ) {
+ SimpleType global = t;
+ SafetyCounter s( 50 );
+ while( !global.scope().isEmpty() && s ) {
+ if( !s ) { kdDebug( 9007 ) << "error" << endl; break; }
+ global = global->parent();
+ }
+ if( !global.scope().isEmpty() ) {kdDebug( 9007 ) << "ERROR WITH GLOBAL SCOPE" << endl; return SimpleType(); }
+ return global;
+}
+
+void SimpleContext::offset( int lineOffset, int colOffset ) {
+ for( QValueList<SimpleVariable>::iterator it = m_vars.begin(); it != m_vars.end(); ++it ) {
+ if( (*it).endLine != (*it).startLine || (*it).endCol != (*it).startCol) {
+ if( (*it).startLine == 0 ) {
+ (*it).startCol += colOffset;
+ }
+ if( (*it).endLine == 0 ) {
+ (*it).endCol += colOffset;
+ }
+ (*it).startLine += lineOffset;
+ (*it).endLine += lineOffset;
+ }
+ }
+}
+
+SimpleVariable SimpleContext::findVariable( const QString& varname )
+{
+ SimpleContext * ctx = this;
+ while ( ctx )
+ {
+ const QValueList<SimpleVariable>& vars = ctx->vars();
+ for ( int i = vars.count() - 1; i >= 0; --i )
+ {
+ SimpleVariable v = vars[ i ];
+ if ( v.name == varname )
+ return v;
+ }
+ ctx = ctx->prev();
+ }
+ return SimpleVariable();
+}
+
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/simplecontext.h b/languages/cpp/simplecontext.h
new file mode 100644
index 00000000..310d4f4d
--- /dev/null
+++ b/languages/cpp/simplecontext.h
@@ -0,0 +1,171 @@
+/***************************************************************************
+ begin : Sat Jul 21 2001
+ copyright : (C) 2001 by Victor R�er
+ email : victor_roeder@gmx.de
+ copyright : (C) 2002,2003 by Roberto Raggi
+ email : roberto@kdevelop.org
+ copyright : (C) 2005 by Adam Treat
+ email : manyoso@yahoo.com
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef SIMPLECONTEXT_H
+#define SIMPLECONTEXT_H
+
+#include <qvaluelist.h>
+#include <qstringlist.h>
+
+#include "declarationinfo.h"
+#include "typedesc.h"
+#include "simpletype.h"
+
+extern SimpleType getGlobal(SimpleType t);
+
+class SimpleVariable
+{
+public:
+ SimpleVariable()
+ {
+ startLine = endLine = startCol = endCol = 0;
+ }
+
+ SimpleVariable( const SimpleVariable& source )
+ : name( source.name ),
+ comment(source.comment),
+ startLine(source.startLine),
+ startCol(source.startCol),
+ endLine(source.endLine),
+ endCol(source.endCol),
+ type( source.type ),
+ ptrList( source.ptrList )
+ {}
+ ~SimpleVariable()
+ {}
+
+ SimpleVariable& operator = ( SimpleVariable& source )
+ {
+ name = source.name;
+ type = source.type;
+ ptrList = source.ptrList;
+ comment = source.comment;
+ startLine = source.startLine;
+ startCol = source.startCol;
+ endLine = source.endLine;
+ endCol = source.endCol;
+ return *this;
+ }
+
+ QString name;
+ QString comment;
+ int startLine, startCol;
+ int endLine, endCol;
+ TypeDesc type;
+ QStringList ptrList;
+
+ DeclarationInfo toDeclarationInfo( QString activeFileName ) {
+ DeclarationInfo decl;
+ decl.name = name;
+ decl.file = activeFileName;
+ decl.comment = comment;
+ decl.startLine = startLine;decl.startCol = startCol;
+ decl.endLine = endLine; decl.endCol = endCol;
+ return decl;
+ }
+};
+
+
+
+class SimpleContext
+{
+ public:
+ SimpleContext( SimpleType container = SimpleType(), SimpleContext* prev = 0 )
+ : m_prev( prev ), m_container( container )
+ {
+ (*m_container); ///Make the type physically create itself
+ }
+
+ virtual ~SimpleContext()
+ {
+ if ( m_prev )
+ {
+ delete( m_prev );
+ m_prev = 0;
+ }
+ }
+
+ SimpleContext* prev() const
+ {
+ return m_prev;
+ }
+
+ void attach( SimpleContext* ctx )
+ {
+ m_prev = ctx;
+ }
+
+ void detach()
+ {
+ m_prev = 0;
+ }
+
+ const QValueList<SimpleVariable>& vars() const
+ {
+ return m_vars;
+ }
+
+ void add( const SimpleVariable& v )
+ {
+ m_vars.append( v );
+ }
+
+ void add( const QValueList<SimpleVariable>& vars )
+ {
+ m_vars += vars;
+ }
+
+ //First the new name, aka "" for real imports, second the name to be imported
+ void addImport( const QPair<QString, QString>& import ) {
+ m_imports << import;
+ }
+
+ //Key the new name, aka "" for real imports, second the name to be imported
+ QValueList<QPair<QString, QString> > imports() {
+ return m_imports;
+ }
+
+ void offset( int lineOffset, int colOffset );
+
+ SimpleVariable findVariable( const QString& varname );
+
+ SimpleType global() {
+ return getGlobal( container() );
+ }
+
+ SimpleType& container() {
+ return m_container;
+ }
+
+ void setContainer( SimpleType cnt ) {
+ m_container = cnt;
+ (*m_container); ///make the type physically create itself
+ }
+
+ private:
+ QValueList<SimpleVariable> m_vars;
+ QValueList<QPair<QString, QString> > m_imports;
+ SimpleContext* m_prev;
+ SimpleType m_container;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/simpletype.cpp b/languages/cpp/simpletype.cpp
new file mode 100644
index 00000000..e4334ae5
--- /dev/null
+++ b/languages/cpp/simpletype.cpp
@@ -0,0 +1,1051 @@
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "simpletype.h"
+#include "safetycounter.h"
+#include "simpletypefunction.h"
+#include <klocale.h>
+
+QMap<QString, QString> BuiltinTypes::m_types;
+BuiltinTypes builtin; //Needed so BuiltinTypes::BuiltinTypes is called and the types are initialized
+
+BuiltinTypes::BuiltinTypes() {
+ m_types[ "void" ] = i18n( "typeless" );
+ m_types[ "bool" ] = i18n("boolean value, 1 byte, ( \"true\" or \"false\" )");
+ m_types["char" ] = i18n("signed/unsigned character, 1 byte");
+ m_types["signed char" ] = i18n("signed character, 1 byte, ranged -128 to 127");
+ m_types["unsigned char"] = i18n("unsigned character, 1 byte, ranged 0 to 255");
+ m_types["wchar_t"] = i18n("wide character, 2 bytes, ranged 0 to 65.535");
+ m_types["long"] = m_types["long int"] = m_types["int"] = m_types["signed int"] = i18n("signed integer, 4 bytes, ranged -2.147.483.648 to 2.147.483.647");
+ m_types["unsigned"] = m_types["unsigned int"] = i18n("unsigned integer, 4 bytes, ranged 0 to 4.294.967.295");
+ m_types["short"] = m_types["short int"] = i18n("short integer, 2 bytes, ranged -32.768 to 32.768");
+ m_types["unsigned short int"] = i18n("unsigned short integer, 2 bytes, ranged 0 to 65.535");
+ m_types["float"] = i18n("floating point value, 4 bytes, ranged ca. -3,4E+38 to 3,4E+38");
+ m_types["double"] = i18n("double floating point value, 8 bytes, ranged ca. -1,8E+308 to 1,8E+308");
+ m_types["long double"] = i18n("double long floating point value, 10 bytes, ranged ca. -3,4E+4932 to 3,4E+4932");
+ m_types["size_t"] = i18n("unsigned integer, byte-count dependent on operating-system" );
+
+}
+
+bool BuiltinTypes::isBuiltin( const TypeDesc& desc ) {
+ return m_types.find( desc.name() ) != m_types.end();
+}
+
+QString BuiltinTypes::comment( const TypeDesc& desc ) {
+ QMap<QString, QString>::iterator it = m_types.find( desc.name() );
+ if( it != m_types.end() ) {
+ return *it;
+ } else {
+ return QString::null;
+ }
+}
+
+extern SafetyCounter safetyCounter;
+
+TypePointer SimpleType::m_globalNamespace;
+SimpleType::TypeStore SimpleType::m_typeStore;
+SimpleType::TypeStore SimpleType::m_destroyedStore;
+QString globalCurrentFile = "";
+
+//SimpleType implementation
+
+void SimpleType::resolve( Repository rep ) const {
+ if ( !m_resolved ) {
+ if ( m_globalNamespace ) {
+ if ( ( rep == RepoUndefined || rep == RepoBoth ) ) {
+ m_resolved = true;
+ if ( scope().isEmpty() || str().isEmpty() ) {
+ m_type = m_globalNamespace;
+ return ;
+ } else {
+ TypeDesc d( scope().join( "::" ) );
+ d.setIncludeFiles( m_includeFiles );
+ LocateResult t = m_globalNamespace->locateDecType( d );
+ if ( t && t->resolved() ) {
+ m_type = t->resolved();
+ return ;
+ } else {
+ ifVerbose( dbg() << "\"" << scope().join( "::" ) << "\": The type could not be located in the global scope while resolving it" << endl );
+ }
+ }
+ }
+ } else {
+ ifVerbose( dbg() << "warning: no global namespace defined! " << endl );
+ }
+
+ TypePointer cm;
+
+ if ( rep == RepoUndefined || rep == RepoCodeModel ) {
+ if ( !m_type ) {
+ cm = TypePointer( new SimpleTypeCachedCodeModel( scope() ) );
+ } else {
+ cm = TypePointer( new SimpleTypeCachedCodeModel( &( *m_type ) ) );
+ }
+
+ if ( cm->hasNode() || rep == RepoCodeModel ) {
+ if ( cm->hasNode() ) {
+ ifVerbose( dbg() << "resolved \"" << str() << "\" from the code-model" << endl );
+ if ( cm->isNamespace() && rep != RepoCodeModel ) {
+ ifVerbose( dbg() << "\"" << str() << "\": is namespace, resolving proxy" << endl );
+ resolve( RepoBoth );
+ return ;
+ }
+ } else {
+ ifVerbose( dbg() << "forced \"" << str() << "\" to be resolved from code-model" << endl );
+ }
+ m_type = cm;
+ m_resolved = true;
+ return ;
+ }
+ }
+ if ( rep == RepoUndefined || rep == RepoCatalog ) {
+
+ if ( !m_type ) {
+ cm = TypePointer( new SimpleTypeCachedCatalog( scope() ) );
+ } else {
+ cm = TypePointer( new SimpleTypeCachedCatalog( &( *m_type ) ) );
+ }
+
+ if ( cm->hasNode() || rep == RepoCatalog ) {
+ if ( cm->hasNode() ) {
+ ifVerbose( dbg() << "resolved \"" << str() << "\" from the catalog" << endl );
+ if ( cm->isNamespace() && rep != RepoCatalog ) {
+ ifVerbose( dbg() << "\"" << str() << "\": is namespace, resolving proxy" << endl );
+ resolve( RepoBoth );
+ return ;
+ }
+ } else {
+ ifVerbose( dbg() << "forced \"" << str() << "\" to be resolved from catalog" << endl );
+ }
+ m_type = cm;
+ m_resolved = true;
+ return ;
+ }
+ }
+
+ if ( rep == RepoBoth ) {
+ cm = new SimpleTypeCachedNamespace( scope() );
+ m_type = cm;
+ m_resolved = true;
+ return ;
+ }
+
+ m_resolved = true;
+ ifVerbose( dbg() << "could not resolve \"" << m_type->desc().fullNameChain() << "\"" << endl );
+ }
+}
+
+void SimpleType::destroyStore() {
+ resetGlobalNamespace();
+ int cnt = m_typeStore.size();
+ kdDebug( 9007 ) << cnt << "types in type-store before destruction" << endl;
+
+ SafetyCounter s( 30000 );
+ while ( !m_typeStore.empty() && s ) {
+ TypeStore::iterator it = m_typeStore.begin();
+ TypePointer tp = *it;
+ m_destroyedStore.insert( tp );
+ m_typeStore.erase( it );
+ tp->breakReferences();
+ }
+
+ if ( !m_destroyedStore.empty() ) {
+ kdDebug( 9007 ) << "type-store is not empty, " << m_destroyedStore.size() << " types are left over" << endl;
+ for ( TypeStore::iterator it = m_destroyedStore.begin(); it != m_destroyedStore.end(); ++it ) {
+ kdDebug( 9007 ) << "type left: " << ( *it ) ->describe() << endl;
+ }
+ }
+
+ ///move them over so they will be cleared again next time, hoping that they will vanish
+ m_typeStore = m_destroyedStore;
+ m_destroyedStore.clear();
+}
+
+///This does not necessarily make the TypeDesc's private, so before editing them
+///their makePrivate must be called too
+void SimpleType::makePrivate() {
+ m_type = m_type->clone();
+}
+
+const QStringList& SimpleType::scope() const {
+ return m_type -> scope();
+}
+
+const QString SimpleType::str() const {
+ return m_type -> str();
+}
+
+void SimpleType::init( const QStringList& scope, const HashedStringSet& files, Repository rep ) {
+ m_includeFiles = files;
+
+ m_type = TypePointer( new SimpleTypeImpl( scope ) );
+ if ( rep != RepoUndefined )
+ resolve( rep );
+}
+
+SimpleType::SimpleType( ItemDom item ) : m_resolved( true ) {
+ m_type = TypePointer( new SimpleTypeCachedCodeModel( item ) );
+}
+/*
+SimpleType::SimpleType( Tag tag ) : m_resolved(true) {
+ m_type = TypePointer( new SimpleTypeCatalog( tag ) );
+}*/
+//
+//SimpleTypeImpl implementation
+
+QValueList<LocateResult> SimpleTypeImpl::getBases() {
+QValueList<LocateResult> ret;
+ QStringList bases = getBaseStrings();
+ for( QStringList::const_iterator it = bases.begin(); it != bases.end(); ++it ) {
+ TypeDesc d( *it );
+ d.setIncludeFiles( m_findIncludeFiles );
+ LocateResult res = locateDecType( d, LocateBase );
+ //if( res )
+ ret << res;
+ }
+ return ret;
+}
+
+void SimpleTypeImpl::setFindIncludeFiles( const IncludeFiles& files ) {
+ m_findIncludeFiles = files;
+}
+
+IncludeFiles SimpleTypeImpl::getFindIncludeFiles() {
+ return m_findIncludeFiles;
+}
+
+/**
+Searches for a member called "name", considering all types selected through "typ"*/
+SimpleTypeImpl::TypeOfResult SimpleTypeImpl::typeOf( const TypeDesc& name, MemberInfo::MemberType typ ) {
+ Debug d( "#to#" );
+ if ( !d ) {
+ ifVerbose( dbg() << "stopping typeOf-evaluation because the recursion-depth is too high" << endl );
+ return TypeOfResult( LocateResult( TypeDesc( "CompletionError::too_much_recursion" ) ) );
+ }
+ ifVerbose( dbg() << "\"" << str() << "\"------------>: searching for type of member \"" << name.fullNameChain() << "\"" << endl );
+
+ TypeDesc td = resolveTemplateParams( name );
+
+ MemberInfo mem = findMember( td, typ );
+
+ if ( mem ) {
+ mem.type = resolveTemplateParams( mem.type );
+
+ ifVerbose( dbg() << "\"" << str() << "\": found member " << name.fullNameChain() << ", type: " << mem.type->fullNameChain() << endl );
+ if ( mem.memberType == MemberInfo::Function ) {
+ ///For functions, find all functions with the same name, so that overloaded functions can be identified correctly
+ TypePointer ret = mem.build();
+ if ( ret && ret->asFunction() ) {
+ return TypeOfResult( LocateResult( ret->desc() ) );
+ } else {
+ ifVerbose( dbg() << "error, using old function-type-evaluation" << endl );
+
+ TypeDesc d( mem.type );
+ if( m_findIncludeFiles.size() != 0 )
+ d.setIncludeFiles( m_findIncludeFiles );
+ else
+ d.setIncludeFiles( name.includeFiles() );
+
+ return TypeOfResult( locateDecType( d ), mem.decl );
+ }
+ } else if ( mem.memberType == MemberInfo::Variable ) {
+ TypeDesc d( mem.type );
+ if( m_findIncludeFiles.size() != 0 )
+ d.setIncludeFiles( m_findIncludeFiles );
+ else
+ d.setIncludeFiles( name.includeFiles() );
+
+ return TypeOfResult( locateDecType( d ), mem.decl );
+ } else {
+ ifVerbose( dbg() << "while searching for the type of \"" << name.fullNameChain() << "\" in \"" << str() << "\": member has wrong type: \"" << mem.memberTypeToString() << "\"" << endl );
+ return TypeOfResult();
+ }
+ }
+
+ TypeOfResult ret = searchBases( td );
+ if ( !ret ) {
+ ifVerbose( dbg() << "\"" << str() << "\"------------>: failed to resolve the type of member \"" << name.fullNameChain() << "\"" << endl );
+ } else {
+ ifVerbose( dbg() << "\"" << str() << "\"------------>: successfully resolved the type of the member \"" << name.fullNameChain() << "\"" << endl );
+ }
+ return ret;
+}
+
+SimpleTypeFunctionInterface* SimpleTypeImpl::asFunction() {
+ return dynamic_cast<SimpleTypeFunctionInterface*> ( this );
+}
+
+QString SimpleTypeImpl::operatorToString( Operator op ) {
+ switch ( op ) {
+ case NoOp:
+ return "NoOp";
+ case IndexOp:
+ return "index-operator";
+ case ArrowOp:
+ return "arrow-operator";
+ case StarOp:
+ return "star-operator";
+ case AddrOp:
+ return "address-operator";
+ case ParenOp:
+ return "paren-operator";
+ default:
+ return QString( "%1" ).arg( ( long ) op );
+ };
+}
+
+LocateResult SimpleTypeImpl::getFunctionReturnType( QString functionName, QValueList<LocateResult> params ) {
+ LocateResult t = typeOf( functionName, MemberInfo::Function ).type;
+ if ( t->resolved() && t->resolved() ->asFunction() ) {
+ return t->resolved() ->applyOperator( ParenOp, params );
+ } else {
+ ifVerbose( dbg() << "error : could not find function \"" << functionName << "\" in \"" << str() << "\"" << endl );
+ return LocateResult();
+ }
+}
+
+LocateResult SimpleTypeImpl::applyOperator( Operator op , QValueList<LocateResult> params ) {
+ Debug d( "#applyn#" );
+ if ( !d || !safetyCounter )
+ return LocateResult();
+
+ ifVerbose( dbg() << "applying operator " << operatorToString( op ) << " to \"" << desc().fullNameChain() << "\"" << endl );
+ LocateResult ret;
+ if ( op == NoOp )
+ return LocateResult( desc() );
+
+ switch ( op ) {
+ case IndexOp:
+ return getFunctionReturnType( "operator [ ]", params );
+ break;
+ case StarOp:
+ return getFunctionReturnType( "operator *", params );
+ break;
+ case ArrowOp:
+ /** Dereference one more because the type must be a pointer */
+ ret = getFunctionReturnType( "operator ->", params );
+ if ( ret->totalPointerDepth() ) {
+ ret->setTotalPointerDepth( ret->totalPointerDepth() - 1 );
+ } else {
+ ifVerbose( dbg() << "\"" << str() << "\": " << " \"operator ->\" returns a type with the wrong pointer-depth" << endl );
+ }
+ return ret;
+ break;
+ case ParenOp:
+ /** Dereference one more because the type must be a pointer */
+ return getFunctionReturnType( "operator ( )", params );
+ default:
+ ifVerbose( dbg() << "wrong operator\n" );
+ }
+
+ return LocateResult();
+}
+
+TypeDesc SimpleTypeImpl::replaceTemplateParams( TypeDesc desc, TemplateParamInfo& paramInfo ) {
+ Debug d( "#repl#" );
+ if ( !d || !safetyCounter )
+ return desc;
+
+ TypeDesc ret = desc;
+ if ( !ret.hasTemplateParams() && !ret.next() ) {
+ TemplateParamInfo::TemplateParam t;
+ if ( paramInfo.getParam( t, desc.name() ) ) {
+
+ if ( t.value )
+ ret = t.value;
+ else if ( t.def )
+ ret = t.def;
+
+ if ( ret.name() != desc.name() )
+ ret.setTotalPointerDepth( ret.totalPointerDepth() + desc.totalPointerDepth() );
+ }
+ } else {
+ TypeDesc::TemplateParams& params = ret.templateParams();
+ for ( TypeDesc::TemplateParams::iterator it = params.begin(); it != params.end(); ++it ) {
+ *it = new TypeDescShared( replaceTemplateParams( **it, paramInfo ) );
+ }
+ }
+
+ if ( ret.next() ) {
+ ret.setNext( new TypeDescShared( replaceTemplateParams( *ret.next(), paramInfo ) ) );
+ }
+
+ return ret;
+}
+
+TypeDesc SimpleTypeImpl::resolveTemplateParams( LocateResult desc, LocateMode mode ) {
+ Debug d( "#resd#" );
+ if ( !d || !safetyCounter )
+ return desc;
+
+ LocateResult ret = desc;
+ if ( ret->hasTemplateParams() ) {
+ TypeDesc::TemplateParams & params = ret->templateParams();
+ for ( TypeDesc::TemplateParams::iterator it = params.begin(); it != params.end(); ++it ) {
+ if ( !( *it ) ->resolved() && !( *it ) ->hasFlag( ResolutionTried ) ) {
+ TypeDesc d( **it );
+ if( d.includeFiles().size() == 0 )
+ d.setIncludeFiles( this->getFindIncludeFiles() );
+ *it = locateDecType( d, mode );
+ ( *it ) ->setFlag( ResolutionTried );
+ }
+ }
+ }
+
+ if ( ret->next() ) {
+ ret->setNext( new TypeDescShared( resolveTemplateParams( *ret->next(), mode ) ) );
+ }
+
+ return ret;
+}
+
+class TemplateParamMatch {
+ public:
+ TemplateParamMatch() : m_matched( false ), m_maxDepth( 0 ), m_candidate( 0 ) {}
+
+ TemplateParamMatch( TypePointer candidate, const TypeDesc& params ) : m_matched( false ), m_maxDepth( 0 ), m_candidate( candidate ) {
+ m_candidateParams = candidate->getTemplateParamInfo();
+ TypeDesc specialization( candidate->specialization() );
+
+ TypeDesc cleanParams = params;
+ cleanParams.setName( "" );
+
+ m_matched = matchParameters( specialization, cleanParams );
+
+ if( m_matched ) {
+ //Make sure that all template-parameters were found
+ for( int a = 0; a < m_candidateParams.count(); a++ ) {
+ SimpleTypeImpl::TemplateParamInfo::TemplateParam t;
+ if( m_candidateParams.getParam( t, a ) ) {
+ if( !m_hadParameters.contains( t.name ) ) {
+ m_matched = false;
+ }
+ } else {
+ m_matched = false;
+ }
+ }
+ }
+ }
+
+ ///@todo: use all default-parameters if some are missing
+ ///@todo: also use decoration like "const" or "&" for specialization.
+ bool matchParameters( const TypeDesc& specialization, const LocateResult& params, int depth = 0 ) {
+ if( depth > m_maxDepth ) m_maxDepth = depth;
+
+ if( specialization.name().isEmpty() ) {
+ if( specialization.templateParams().count() != params->templateParams().count() )
+ return false;
+ } else {
+ SimpleTypeImpl::TemplateParamInfo::TemplateParam t;
+ if( m_candidateParams.getParam( t, specialization.name() ) ) {
+ TypeDesc oldValue = t.value;
+
+ //Check if the decoration of the specialization matches the decoration of the arguments, if not we have a mismatch.
+
+ if( specialization.totalPointerDepth() > params->totalPointerDepth() ) {
+ return false; //The decoration does not match the given argument
+ } else {
+ depth += specialization.totalPointerDepth();
+ if( depth > m_maxDepth ) m_maxDepth = depth;
+ }
+
+ //Fill the template-parameter, or compare if the one we already found out matches this one
+ LocateResult val;
+ if( specialization.hasTemplateParams() ) {
+ val = params->decoratedName();
+ } else {
+ val = params; //No more parameters have to be checked, so take the value and return later
+ }
+
+ val->setTotalPointerDepth( val->totalPointerDepth() - specialization.totalPointerDepth() );
+
+ t.value = val;
+
+ if( m_hadParameters.contains( t.name ) && oldValue != t.value ) {
+ return false; ///We have a mismatch, two different values for the same template-parameter.
+ } else {
+ m_candidateParams.addParam( t );
+ m_hadParameters[ t.name ] = val;
+ if( !specialization.hasTemplateParams() ) return true;
+ }
+ } else {
+ if( m_candidate->locateDecType( specialization.decoratedName() )->decoratedName() != params->decoratedName() ) {
+ //We have a mismatch
+ return false;
+ }
+ }
+ }
+
+
+ if( specialization.templateParams().count() != params->templateParams().count() ) {
+ return false; //mismatch in count of template-parameters
+ }
+
+ TypeDesc::TemplateParams::const_iterator specialIt = specialization.templateParams().begin();
+ TypeDesc::TemplateParams::const_iterator paramsIt = params->templateParams().begin();
+
+ while( specialIt != specialization.templateParams().end() && paramsIt != params->templateParams().end() ) {
+ if( !matchParameters( (*specialIt).desc(), (*paramsIt), depth+10 ) ) return false;
+
+ ++paramsIt;
+ ++specialIt;
+ }
+ return true;
+ }
+
+ operator bool() const {
+ return m_matched;
+ }
+
+ ///True if this match is better than the given one
+ bool operator > ( const TemplateParamMatch& rhs ) const {
+ if( !m_matched ) return false;
+ if(!rhs.m_matched ) return true;
+ return m_maxDepth > rhs.m_maxDepth;
+ }
+
+ TypePointer type() {
+ if( m_candidate ) {
+ TypePointer ret = m_candidate->clone();
+ ret->descForEdit().templateParams().clear();
+ for( int a = 0; a < m_candidateParams.count(); a++ ) {
+ SimpleTypeImpl::TemplateParamInfo::TemplateParam tp;
+ if( m_candidateParams.getParam( tp, a ) ) {
+ ret->descForEdit().templateParams().push_back( m_hadParameters[tp.name] );
+ } else {
+ ret->descForEdit().templateParams().push_back( LocateResult() ); //error
+ }
+ }
+ return ret;
+ } else {
+ return 0;
+ }
+ }
+
+ SimpleTypeImpl::TemplateParamInfo& templateParams() {
+ return m_candidateParams;
+ }
+
+ private:
+ TypePointer m_candidate;
+ SimpleTypeImpl::TemplateParamInfo m_candidateParams;
+ QMap<QString, LocateResult> m_hadParameters;
+ bool m_matched;
+ int m_maxDepth;
+};
+
+void SimpleTypeImpl::chooseSpecialization( MemberInfo& member ) {
+
+ if ( member.memberType != MemberInfo::NestedType )
+ return ;
+ if ( !member.type->hasTemplateParams() )
+ return ;
+
+ TypePointer type = member.build();
+
+ if ( !type )
+ return ;
+
+ //Get a list of all candidate-classes
+ TypePointer t = this;
+ if ( m_masterProxy )
+ t = m_masterProxy;
+
+ QValueList<TypePointer> classes = t->getMemberClasses( type->desc() );
+
+ //Find the specialization that fits the given template-parameters the best
+
+ if ( !type->specialization().isEmpty() ) {
+ kdDebug( 9007 ) << "a specialized template-class was suggested as primary class while searching for specialization, search problematic" << endl;
+ //return;
+ } else {
+ TemplateParamInfo params = type->getTemplateParamInfo();
+
+ int dif = params.count() - member.type->templateParams().count();
+
+ if ( dif > 0 ) {
+ //fill up missing template-parameters with their default-parameters, maybe should be done in findMember
+ for ( int a = member.type->templateParams().count(); a < params.count(); a++ ) {
+ LocateResult r;
+ TemplateParamInfo::TemplateParam tp;
+ if ( params.getParam( tp, a ) ) {
+ r = t->locateDecType( tp.value );
+ }
+ member.type->templateParams().push_back( r );
+ }
+ }
+ }
+
+ //now find the class that is most specialized and matches the template-parameters
+
+ TemplateParamMatch bestMatch;
+
+ for ( QValueList<TypePointer>::iterator it = classes.begin(); it != classes.end(); ++it ) {
+ if ( ( *it ) ->specialization().isEmpty() )
+ continue;
+ TemplateParamMatch match( ( *it ), member.type.desc() );
+
+ if ( match > bestMatch )
+ bestMatch = match;
+ }
+
+ if ( bestMatch ) {
+ TypePointer tp = bestMatch.type();
+ if ( tp ) {
+ member.setBuilt( tp );
+ }
+ }
+}
+
+
+LocateResult SimpleTypeImpl::locateType( TypeDesc name , LocateMode mode , int dir , MemberInfo::MemberType typeMask ) {
+ Debug d( "#lo#" );
+ if( BuiltinTypes::isBuiltin( name ) )
+ return name;
+
+ if ( !name || !safetyCounter || !d ) {
+ return desc();
+ }
+ if ( !d ) {
+ ifVerbose( dbg() << "stopping location because the recursion-depth is too high" << endl );
+ return TypeDesc( "CompletionError::too_much_recursion" );
+ }
+ ifVerbose( dbg() << "\(" << uint(this) << ")\"" << str() << "\": locating type \"" << name.fullNameChain() << "\"" << endl );
+ if ( name.resolved() && !name.next() ) {
+ ifVerbose( dbg() << "\"" << desc().fullName() << "\": type \"" << name.fullNameChain() << "\" is already resolved, returning stored instance" << endl );
+ return name;
+ }
+ /*
+ if( name.resolved() && name.length() == name.resolved()->desc().length() ) {
+ ifVerbose( dbg() << "\"" << desc().fullName() << "\": type \"" << name.fullNameChain() << "\" is already resolved, returning stored instance" << endl;
+ SimpleType ret = SimpleType( name.resolved() );
+
+ if( ! (name == ret->desc()) ) {
+ ret.makePrivate(); ///Maybe some small parameters like the pointer-depth were changed, so customize those
+ ret->parseParams( name );
+ }
+
+ return ret;
+ }*/
+ /*
+ //This optimization is now disabled, because it allows following a wrong path.
+ if( name.next() ) {
+ //This is an optimization for better use of the cache: Find the elements separately, so searches
+ //For elements that start with the same scope will be speeded up.
+ LocateResult r = locateType( name.firstType(), mode, dir, typeMask );
+ if( r && r->resolved() && r.locateMode().valid ) {
+ ifVerbose( dbg() << "splitting location" );
+ TypeDesc d( *name.next() );
+ d.setIncludeFiles( name.includeFiles() );
+ return r->resolved()->locateType( d, (LocateMode)r.locateMode().mode, r.locateMode().dir );
+ }
+ }*/
+
+ LocateResult ret = name; ///In case the type cannot be located, this helps to find at least the best match
+ //LocateResult ret;
+
+ TypeDesc first = resolveTemplateParams( name.firstType(), mode );
+
+ MemberInfo mem = findMember( first, typeMask );
+
+ switch ( mem.memberType ) {
+ case MemberInfo::Namespace:
+ if ( mode & ExcludeNamespaces )
+ break;
+ case MemberInfo::NestedType: {
+ if ( mem.memberType == MemberInfo::NestedType && mode & ExcludeNestedTypes )
+ break;
+
+ SimpleType sub;
+ if ( TypePointer t = mem.build() ) {
+ sub = SimpleType( t );
+#ifdef PHYSICAL_IMPORT
+ setSlaveParent( *sub );
+#endif
+ } else {
+ ///Should not happen..
+ kdDebug( 9007 ) << "\"" << str() << "\": Warning: the nested-type " << name.name() << " was found, but has no build-info" << endl;
+ return TypeDesc( "CompletionError::unknown" );
+ }
+
+ TypeDesc rest;
+ LocateMode newMode = addFlag( mode, ExcludeTemplates );
+ int newDir = 1;
+ if ( name.next() ) {
+ ifVerbose( dbg() << "\"" << str() << "\": found nested type \"" << name.name() << "\", passing control to it\n" );
+ ret = sub->locateType( resolveTemplateParams( *name.next(), Normal ), newMode, newDir ); ///since template-names cannot be referenced from outside, exclude them for the first cycle
+ ret.increaseResolutionCount();
+ if ( ret->resolved() )
+ return ret.resetDepth();
+ } else {
+ ifVerbose( dbg() << "\"" << str() << "\": successfully located searched type \"" << name.fullNameChain() << "\"\n" );
+ ret->setResolved( sub.get() );
+ ret->resolved()->setFindIncludeFiles( name.includeFiles() );
+ ret.locateMode().valid = true;
+ ret.locateMode().mode = (uint)newMode;
+ ret.locateMode().dir = newDir;
+ return ret.resetDepth();
+ }
+ break;
+ }
+ case MemberInfo::Typedef:
+ if ( mode & ExcludeTypedefs )
+ break;
+ case MemberInfo::Template: {
+ if ( mem.memberType == MemberInfo::Template && ( mode & ExcludeTemplates ) )
+ break;
+ ifVerbose( dbg() << "\"" << str() << "\": found " << mem.memberTypeToString() << " \"" << name.name() << "\" -> \"" << mem.type->fullNameChain() << "\", recursing \n" );
+ if ( name.hasTemplateParams() ) {
+ ifVerbose( dbg() << "\"" << str() << "\":warning: \"" << name.fullName() << "\" is a " << mem.memberTypeToString() << ", but it has template-params itself! Not matching" << endl );
+ } else {
+ if ( mem.type->name() != name.name() ) {
+
+ MemberInfo m = mem;
+ if ( name.next() ) {
+ mem.type->makePrivate();
+ mem.type->append( name.next() );
+ }
+ ret = locateDecType( mem.type, remFlag( mode, ExcludeTemplates ) );
+
+ if ( mem.memberType == MemberInfo::Template )
+ ret.addResolutionFlag( HadTemplate );
+ if ( mem.memberType == MemberInfo::Typedef )
+ ret.addResolutionFlag( HadTypedef );
+ ret.increaseResolutionCount();
+ // if( mode & TraceAliases && ret->resolved() )
+ {
+ m.name = "";
+
+ if ( !scope().isEmpty() ) {
+ m.name = fullTypeUnresolvedWithScope() + "::";
+ }
+ m.name += name.nameWithParams();
+ //m.name += name.fullNameChain();
+
+ if ( name.next() ) {
+ if ( m.type.trace() ) {
+ ret.trace() ->prepend( *m.type.trace(), 1 );
+ }
+ ret.trace() ->prepend( m, *name.next() );
+ } else {
+ if ( m.type.trace() )
+ ret.trace() ->prepend( *m.type.trace(), 1 );
+ ret.trace() ->prepend( m );
+ }
+ }
+
+ if ( ret->resolved() )
+ return ret.resetDepth();
+ } else {
+ ifVerbose( dbg() << "\"" << str() << "\"recursive typedef/template found: \"" << name.fullNameChain() << "\" -> \"" << mem.type->fullNameChain() << "\"" << endl );
+ }
+ }
+ break;
+ }
+ ///A Function is treated similar to a type
+ case MemberInfo::Function: {
+ if ( !name.next() ) {
+ TypePointer t = mem.build();
+ if ( t ) {
+ return t->desc();
+ } else {
+ ifVerbose( dbg() << "\"" << str() << "\"" << ": could not build function: \"" << name.fullNameChain() << "\"" );
+ }
+ } else {
+ ifVerbose( dbg() << "\"" << str() << "\"" << ": name-conflict: searched for \"" << name.fullNameChain() << "\" and found function \"" << mem.name << "\"" );
+ }
+ break;
+ };
+ ///Currently there is no representation of a Variable as a SimpleType, so only the type of the variable is used.
+ case MemberInfo::Variable: {
+ return locateDecType( mem.type, remFlag( mode, ExcludeTemplates ) ).resetDepth();
+ }
+ }
+
+ ///Ask bases but only on this level
+ if ( ! ( mode & ExcludeBases ) ) {
+
+ QValueList<LocateResult> bases = getBases();
+ if ( !bases.isEmpty() ) {
+ TypeDesc nameInBase = resolveTemplateParams( name, LocateBase ); ///Resolve all template-params that are at least visible in the scope of the base-declaration
+
+ for ( QValueList<LocateResult>::iterator it = bases.begin(); it != bases.end(); ++it ) {
+ if ( !( *it ) ->resolved() )
+ continue;
+ LocateResult t = ( *it ) ->resolved() ->locateType( nameInBase, addFlag( addFlag( mode, ExcludeTemplates ), ExcludeParents ), dir ); ///The searched Type cannot directly be a template-param in the base-class, so ExcludeTemplates. It's forgotten early enough.
+ if ( t->resolved() )
+ return t.increaseDepth();
+ else
+ if ( t > ret )
+ ret = t.increaseDepth();
+ }
+ }
+ }
+
+ ///Ask parentsc
+ if ( !scope().isEmpty() && dir != 1 && ! ( mode & ExcludeParents ) ) {
+ LocateResult rett = parent() ->locateType( resolveTemplateParams( name, mode & ExcludeBases ? ExcludeBases : mode ), mode & ForgetModeUpwards ? Normal : mode );
+ if ( rett->resolved() )
+ return rett.increaseDepth();
+ else
+ if ( rett > ret )
+ ret = rett.increaseDepth();
+ }
+
+ ///Ask the bases and allow them to search in their parents.
+ if ( ! ( mode & ExcludeBases ) ) {
+ TypeDesc baseName = resolveTemplateParams( name, LocateBase ); ///Resolve all template-params that are at least visible in the scope of the base-declaration
+ QValueList<LocateResult> bases = getBases();
+ if ( !bases.isEmpty() ) {
+ for ( QValueList<LocateResult>::iterator it = bases.begin(); it != bases.end(); ++it ) {
+ if ( !( *it ) ->resolved() )
+ continue;
+ LocateResult t = ( *it ) ->resolved() ->locateType( baseName, addFlag( mode, ExcludeTemplates ), dir ); ///The searched Type cannot directly be a template-param in the base-class, so ExcludeTemplates. It's forgotten early enough.
+ if ( t->resolved() )
+ return t.increaseDepth();
+ else
+ if ( t > ret )
+ ret = t.increaseDepth();
+ }
+ }
+ }
+
+ ///Give the type a desc, so the nearest point to the searched type is stored
+ ifVerbose( dbg() << "\"" << str() << "\": search for \"" << name.fullNameChain() << "\" FAILED" << endl );
+ return ret;
+}
+
+void SimpleTypeImpl::breakReferences() {
+ TypePointer p( this ); ///necessary so this type is not deleted in between
+ m_parent = 0;
+ m_desc.resetResolved();
+ // m_trace.clear();
+ m_masterProxy = 0;
+ invalidateCache();
+}
+
+TypePointer SimpleTypeImpl::bigContainer() {
+ if ( m_masterProxy )
+ return m_masterProxy;
+ else
+ return TypePointer( this );
+}
+
+SimpleType SimpleTypeImpl::parent() {
+ if ( m_parent ) {
+ //ifVerbose( dbg() << "\"" << str() << "\": returning parent" << endl;
+ return SimpleType( m_parent );
+ } else {
+ ifVerbose( dbg() << "\"" << str() << "\": locating parent" << endl );
+ invalidateSecondaryCache();
+ QStringList sc = scope();
+
+ if ( !sc.isEmpty() ) {
+ sc.pop_back();
+ SimpleType r = SimpleType( sc, m_desc.includeFiles() );
+ if ( &( *r.get() ) == this ) {
+ kdDebug( 9007 ) << "error: self set as parent: " << m_scope.join( "::" ) << "(" << m_scope.count() << ")" << ", " << sc.join( "::" ) << "(" << sc.count() << ")" /* << kdBacktrace()*/ << endl;
+ return SimpleType( new SimpleTypeImpl( "" ) );
+ }
+ m_parent = r.get();
+ return r;
+ } else {
+ ifVerbose( dbg() << "\"" << str() << "\"warning: returning parent of global scope!" << endl );
+ return SimpleType( new SimpleTypeImpl( "" ) );
+ }
+ }
+}
+
+const TypeDesc& SimpleTypeImpl::desc() {
+ if ( m_desc.name().isEmpty() )
+ m_desc.setName( cutTemplateParams( scope().back() ) );
+ m_desc.setResolved( this );
+ return m_desc;
+}
+
+TypeDesc& SimpleTypeImpl::descForEdit() {
+ desc();
+ invalidateCache();
+ return m_desc;
+}
+
+QString SimpleTypeImpl::describeWithParams() {
+ TemplateParamInfo pinfo = getTemplateParamInfo();
+ int num = 0;
+ TemplateParamInfo::TemplateParam param;
+ QString str = desc().name();
+ if ( desc().hasTemplateParams() ) {
+ str += "< ";
+
+ for ( TypeDesc::TemplateParams::const_iterator it = desc().templateParams().begin(); it != desc().templateParams().end(); ++it ) {
+ if ( pinfo.getParam( param, num ) && !param.name.isEmpty() )
+ str += param.name;
+ else
+ str += "[unknown name]";
+
+ str += " = " + ( *it ) ->fullNameChain() + ", ";
+ ++num;
+ }
+
+ str.truncate( str.length() - 2 );
+ str += " >";
+ }
+ return str;
+}
+
+QString SimpleTypeImpl::fullTypeResolved( int depth ) {
+ Debug d( "#tre#" );
+
+ TypeDesc t = desc();
+ if ( !scope().isEmpty() ) {
+ if ( depth > 10 )
+ return "KDevParseError::ToDeep";
+ if ( !safetyCounter )
+ return "KDevParseError::MaximumCountReached";
+
+ ifVerbose( dbg() << "fully resolving type " << t.fullName() << endl );
+ if ( scope().size() != 0 ) {
+ t = resolveTemplateParams( t, LocateBase );
+ }
+ }
+
+ return t.fullNameChain();
+}
+
+
+QString SimpleTypeImpl::fullTypeUnresolvedWithScope( ) {
+ if ( m_parent && !m_parent->scope().isEmpty() ) {
+ return m_parent->fullTypeUnresolvedWithScope() + "::" + m_desc.fullNameChain();
+ } else {
+ return m_desc.fullNameChain();
+ }
+}
+
+QString SimpleTypeImpl::fullTypeResolvedWithScope( int depth ) {
+ Q_UNUSED( depth );
+ if ( !m_scope.isEmpty() && parent() ) {
+ return parent() ->fullTypeResolvedWithScope() + "::" + fullTypeResolved();
+ } else {
+ return fullTypeResolved();
+ }
+}
+
+void SimpleTypeImpl::checkTemplateParams () {
+ invalidateCache();
+ if ( ! m_scope.isEmpty() ) {
+ QString str = m_scope.back();
+ m_desc = str;
+ if ( !m_desc.name().isEmpty() ) {
+ m_scope.pop_back();
+ m_scope << m_desc.name();
+ } else {
+ kdDebug() << "checkTemplateParams() produced bad scope-tail: \"" << m_desc.name() << "\", \"" << m_scope.join( "::" ) << "\"" << endl;
+ }
+ }
+}
+
+void SimpleTypeImpl::setScope( const QStringList& scope ) {
+ invalidateCache();
+ m_scope = scope;
+ if ( m_scope.count() == 1 && m_scope.front().isEmpty() ) {
+ //kdDebug() << "bad scope set " << kdBacktrace() << endl;
+ m_scope = QStringList();
+ }
+}
+
+SimpleTypeImpl::TypeOfResult SimpleTypeImpl::searchBases ( const TypeDesc& name /*option!!*/ ) {
+ QValueList<LocateResult> parents = getBases();
+ for ( QValueList<LocateResult>::iterator it = parents.begin(); it != parents.end(); ++it ) {
+ if ( !( *it ) ->resolved() )
+ continue;
+ TypeOfResult type = ( *it ) ->resolved() ->typeOf( name );
+ if ( type )
+ return type;
+ }
+ return TypeOfResult();
+}
+
+void SimpleTypeImpl::setSlaveParent( SimpleTypeImpl& slave ) {
+ if ( ! m_masterProxy ) {
+ slave.setParent( this );
+ } else {
+ slave.setParent( m_masterProxy );
+ }
+}
+
+void SimpleTypeImpl::parseParams( TypeDesc desc ) {
+ invalidateCache();
+ m_desc = desc;
+ m_desc.clearInstanceInfo();
+}
+
+void SimpleTypeImpl::takeTemplateParams( TypeDesc desc ) {
+ invalidateCache();
+ m_desc.templateParams() = desc.templateParams();
+}
+
+//SimpleTypeImpl::TemplateParamInfo implementation
+
+bool SimpleTypeImpl::TemplateParamInfo::getParam( TemplateParam& target, QString name ) const {
+ QMap<QString, TemplateParam>::const_iterator it = m_paramsByName.find( name );
+ if ( it != m_paramsByName.end() ) {
+ target = *it;
+ return true;
+ }
+ return false;
+}
+
+bool SimpleTypeImpl::TemplateParamInfo::getParam( TemplateParam& target, int number ) const {
+ QMap<int, TemplateParam>::const_iterator it = m_paramsByNumber.find( number );
+ if ( it != m_paramsByNumber.end() ) {
+ target = *it;
+ return true;
+ }
+ return false;
+}
+
+void SimpleTypeImpl::TemplateParamInfo::removeParam( int number ) {
+ QMap<int, TemplateParam>::iterator it = m_paramsByNumber.find( number );
+ if ( it != m_paramsByNumber.end() ) {
+ m_paramsByName.remove( ( *it ).name );
+ m_paramsByNumber.remove( it );
+ }
+}
+
+void SimpleTypeImpl::TemplateParamInfo::addParam( const TemplateParam& param ) {
+ m_paramsByNumber[ param.number ] = param;
+ m_paramsByName[ param.name ] = param;
+}
+
+int SimpleTypeImpl::TemplateParamInfo::count() const {
+ QMap<int, TemplateParam>::const_iterator it = m_paramsByNumber.end();
+ if ( it != m_paramsByNumber.begin() ) {
+ --it;
+ return ( *it ).number + 1;
+ } else {
+ return 0;
+ }
+}
+
+void SimpleTypeConfiguration::setGlobalNamespace( TypePointer globalNamespace ) {
+ if ( !globalNamespace->scope().isEmpty() ) {
+ kdDebug( 9007 ) << "error while setting global scope\n" << kdBacktrace() << endl;
+ SimpleType::setGlobalNamespace( new SimpleTypeImpl( "" ) );
+ } else {
+ SimpleType::setGlobalNamespace( globalNamespace );
+ }
+}
+
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/simpletype.h b/languages/cpp/simpletype.h
new file mode 100644
index 00000000..3e6f82d3
--- /dev/null
+++ b/languages/cpp/simpletype.h
@@ -0,0 +1,819 @@
+
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __SIMPLETYPE_H__
+#define __SIMPLETYPE_H__
+
+#include <set>
+
+#include "bithelpers.h"
+#include "stringhelpers.h"
+#include "completiondebug.h"
+#include "typedesc.h"
+#include "declarationinfo.h"
+#include <qpair.h>
+
+#include "cpp_tags.h"
+#include "codemodel.h"
+
+#define NOBACKTRACE
+
+extern QString globalCurrentFile;
+
+using namespace CompletionDebug;
+using namespace BitHelpers;
+using namespace StringHelpers;
+
+class SimpleTypeImpl;
+class SimpleTypeNamespace;
+class SimpleTypeFunctionInterface;
+
+typedef KSharedPtr<SimpleTypeImpl> TypePointer;
+
+///if this is set, imported items will get their parent set to the node they were acquired through(which may increase the overall count of items, decrease the caching-performance, and may create other problems in locating stuff)
+//#define PHYSICAL_IMPORT
+
+enum Repository {
+ RepoCodeModel,
+ RepoCatalog,
+ RepoStringList,
+ RepoBoth,
+ RepoUndefined
+};
+
+class BuiltinTypes {
+ public:
+ ///This should be used for checking whether a type is builtin
+ static bool isBuiltin( const TypeDesc& desc );
+ ///If it is a builtin type this returns a short description of the type
+ static QString comment( const TypeDesc& desc );
+ BuiltinTypes();
+ private:
+ static QMap<QString, QString> m_types;
+};
+
+
+/**
+ A Type can be invalid( hasNode() returns false ) but still have a desc. In that case, the desc is the
+ nearest point reached in the resolution of the type.
+
+ Warning: The types are not copied when they are assigned to each other,
+ they manage internal references, so just changing a type may cause bugs.
+ Use makePrivate() before changing. */
+
+class SimpleType {
+ public:
+
+ friend class SimpleTypeImpl;
+
+ SimpleType( const SimpleType& rhs ) {
+ *this = rhs;
+ }
+
+ SimpleType( const QStringList& scope, const HashedStringSet& files, Repository rep = RepoUndefined ) : m_resolved( false ) {
+ init( scope, files, rep );
+ }
+
+ SimpleType( const QString& text,const HashedStringSet& files, Repository rep = RepoUndefined ) : m_resolved( false ) {
+ init( splitType( text ), files, rep );
+ };
+
+ SimpleType( Repository rep = RepoUndefined ) : m_resolved( false ) {
+ init( QStringList(), HashedStringSet(), rep );
+ };
+
+ SimpleType( SimpleTypeImpl* ip ) : m_type( TypePointer( ip ) ), m_resolved( true ) {}
+
+ SimpleType( ItemDom item );
+
+ bool operator < ( SimpleType& rhs );
+
+ /*SimpleType( Tag tag );*/
+
+ SimpleTypeImpl* operator -> () const {
+ resolve();
+ return &( *m_type );
+ }
+
+ TypePointer get
+ () const {
+ resolve();
+ return m_type;
+ }
+
+ SimpleTypeImpl& operator * () const {
+ resolve();
+ return *m_type;
+ }
+
+ SimpleType& operator = ( const SimpleType& rhs ) {
+ m_type = rhs.m_type;
+ m_resolved = rhs.m_resolved;
+ m_includeFiles = rhs.m_includeFiles;
+ return *this;
+ }
+
+ /** Just compares the scope */
+ bool operator == ( const SimpleType& rhs ) const {
+ return scope() == rhs.scope();
+ }
+
+ void makePrivate();
+
+ operator QString() const {
+ return str();
+ }
+
+ ///lazily returns the scope
+ const QStringList& scope() const;
+
+ const QString str() const;
+
+ ///valid() does not check whether the type was found in some model,
+ ///it just checks whether this theoretically represents a type.
+ inline operator bool () const {
+ return valid();
+ }
+
+ bool valid() const {
+ return !scope().isEmpty();
+ }
+
+ static TypePointer globalNamespace() {
+ return m_globalNamespace;
+ }
+
+ static void setGlobalNamespace( TypePointer tp ) {
+ m_globalNamespace = tp;
+ }
+
+ static void resetGlobalNamespace() {
+ m_globalNamespace = 0;
+ }
+
+ ///Since many cross-references are possible, this function breaks them all so that all SimpleTypeImpls can free themselves.
+ static void destroyStore();
+
+ private:
+
+ void init( const QStringList& scope, const HashedStringSet& files, Repository rep );
+
+ void resolve( Repository rep = RepoUndefined ) const ;
+
+ HashedStringSet m_includeFiles;
+
+ mutable TypePointer m_type;
+ mutable bool m_resolved;
+ static TypePointer m_globalNamespace; ///this is bad, but with the current parser we can't clearly determine the correct global-namespace for each class/file
+ typedef std::set
+ <SimpleTypeImpl*> TypeStore ;
+ static TypeStore m_typeStore; ///This is necessary because TypeDescs ind SimpleTypeImpls can have cross-references, and thereby make themselves unreleasable, so each SimpleTypeImpl is stored in this list and destroyed at once by SimpleTypeConfiguration( it breaks all references )
+ static TypeStore m_destroyedStore;
+
+ static void registerType( SimpleTypeImpl* tp ) {
+ if ( !tp )
+ return ;
+ m_typeStore.insert( tp );
+ }
+
+ static void unregisterType( SimpleTypeImpl* tp ) {
+ TypeStore::iterator it = m_typeStore.find( tp );
+ if ( it != m_typeStore.end() )
+ m_typeStore.erase( it );
+ else
+ m_destroyedStore.erase( tp );
+ }
+};
+
+
+class SimpleTypeConfiguration {
+ bool m_invalid;
+ public:
+ SimpleTypeConfiguration( QString currentFileName = "" ) : m_invalid( false ) {
+ globalCurrentFile = currentFileName;
+ dbgState.clearCounter();
+ }
+
+ void setGlobalNamespace( TypePointer globalNamespace );
+
+ virtual ~SimpleTypeConfiguration() {
+ if( !m_invalid ) {
+ SimpleType::resetGlobalNamespace();
+ SimpleType::destroyStore();
+ }
+ }
+ void invalidate() {
+ m_invalid = true;
+ }
+};
+
+
+class SimpleTypeImpl : public KShared {
+ /*enum ResolutionFlags {
+ NoFlag = 0,
+ HadTypedef = 1,
+ HadTemplate = 2,
+ HadAlias = 3
+ };*/
+
+ public:
+ typedef KSharedPtr<SimpleTypeImpl> TypePointer;
+
+ SimpleTypeImpl( const QStringList& scope ) : m_resolutionCount( 0 ), m_resolutionFlags( NoFlag ), m_scope( scope ) {
+ setScope( m_scope );
+ checkTemplateParams();
+ reg();
+ }
+
+ SimpleTypeImpl( const TypeDesc& desc ) : m_resolutionCount( 0 ), m_resolutionFlags( NoFlag ), m_desc( desc ) {
+ if ( !m_desc.name().isEmpty() )
+ m_scope.push_back( m_desc.name() );
+ else
+ m_scope.push_back( "BAD_NAME" );
+ reg();
+ }
+
+ SimpleTypeImpl( ) : m_resolutionCount( 0 ), m_resolutionFlags( NoFlag ) {
+ reg();
+ };
+
+ ///Returns the template-specialization-string for classes
+ virtual QString specialization() const {
+ return QString::null;
+ }
+
+ class TemplateParamInfo {
+ public:
+ struct TemplateParam {
+ QString name;
+ TypeDesc def;
+ TypeDesc value;
+ int number;
+ TemplateParam() : number( 0 ) {}
+ }
+ ;
+
+ TemplateParamInfo( ) {}
+
+ bool getParam( TemplateParam& target, QString name ) const;
+
+ bool getParam( TemplateParam& target, int number ) const;
+
+ void removeParam( int number );
+
+ void addParam( const TemplateParam& param );
+
+ int count() const;
+
+ private:
+ QMap<int, TemplateParam> m_paramsByNumber;
+ QMap<QString, TemplateParam> m_paramsByName;
+ };
+
+ int resolutionCount() {
+ return m_resolutionCount;
+ }
+
+ bool hasResolutionFlag( ResolutionFlags flag ) {
+ return m_resolutionFlags & flag;
+ }
+
+ enum Operator {
+ ArrowOp,
+ StarOp,
+ AddrOp,
+ IndexOp,
+ ParenOp,
+ NoOp
+ };
+
+ static CppCodeCompletion* data;
+ TypePointer m_masterProxy; ///If this is only a slave of a namespace-proxy, this holds the proxy.
+
+ virtual ~SimpleTypeImpl() {
+ unreg();
+ }
+
+ virtual Repository rep() {
+ return RepoStringList;
+ }
+
+ ///Returns the function-interface if this is a function, else zero
+ SimpleTypeFunctionInterface* asFunction();
+
+ virtual bool isNamespace() const {
+ return false;
+ };
+
+ virtual QString comment() const {
+ return "";
+ };
+
+
+ ///Sets the parent of the given slave to either this class, or the proxy of this class
+ virtual void setSlaveParent( SimpleTypeImpl& slave );
+
+ void setMasterProxy( TypePointer t ) {
+ m_masterProxy = t;
+ }
+
+ TypePointer masterProxy() const {
+ return m_masterProxy;
+ }
+
+ ///@todo remove this and use getTemplateParamInfo instead
+ virtual const LocateResult findTemplateParam( const QString& /*name*/ ) {
+ return LocateResult();
+ }
+
+ virtual TemplateParamInfo getTemplateParamInfo() {
+ return TemplateParamInfo();
+ }
+
+ virtual void parseParams( TypeDesc desc );
+
+ virtual void takeTemplateParams( TypeDesc desc );
+
+ ///Returns whether the type is really resolved( corresponds to an item in some model )
+ virtual bool hasNode() const {
+ return false;
+ };
+
+ virtual DeclarationInfo getDeclarationInfo() {
+ return DeclarationInfo();
+ }
+
+ virtual TypePointer clone() {
+ return new SimpleTypeImpl( this );
+ }
+
+ private:
+ int m_resolutionCount;
+ ResolutionFlags m_resolutionFlags;
+
+ SimpleTypeImpl( const SimpleTypeImpl& /*rhs*/ ) : KShared() {}
+
+ SimpleTypeImpl& operator = ( const SimpleTypeImpl& /*rhs*/ ) {
+ return * this;
+ }
+
+
+ void addResolutionFlag ( ResolutionFlags flag ) {
+ m_resolutionFlags = ( ResolutionFlags ) ( m_resolutionFlags | flag );
+ }
+
+ void removeResolutionFlag( ResolutionFlags flag ) {
+ m_resolutionFlags = remFlag( m_resolutionFlags, flag );
+ }
+
+ void increaseResolutionCount() {
+ ++m_resolutionCount;
+ }
+
+ void setResolutionCount( int val ) {
+ m_resolutionCount = val;
+ }
+#ifndef NOBACKTRACE
+ QString create_bt;
+#endif
+
+ inline QString createInfo() const {
+#ifndef NOBACKTRACE
+ return "\n" + create_bt + "\n";
+#endif
+
+ return "";
+ }
+
+ void reg() {
+#ifndef NOBACKTRACE
+ create_bt = kdBacktrace();
+#endif
+
+ SimpleType::registerType( this );
+ }
+
+ void unreg() {
+ SimpleType::unregisterType( this );
+ }
+
+ protected:
+ virtual void invalidateCache() {}
+ ;
+
+ ///Secondary cache also depends on the surrounding
+ virtual void invalidateSecondaryCache() {}
+
+ virtual void setSecondaryCacheActive( bool active ) {
+ Q_UNUSED( active );
+ }
+
+ ///Primary cache is the one associated only with this object. It must only be cleared
+ ///when the object pointed to changes
+ virtual void invalidatePrimaryCache( bool onlyNegative = false ) {}
+
+ static QString operatorToString( Operator op );
+
+ public:
+ /*
+ operator QString() const {
+ return str();
+ }
+
+ inline operator QStringList() const {
+ return m_scope;
+ }*/
+
+ int functionDepth() const {
+ return m_desc.pointerDepth();
+ }
+
+ void setFunctionDepth( int pc ) {
+ m_desc.setPointerDepth( pc );
+ }
+
+ void decreaseFunctionDepth() {
+ m_desc.setPointerDepth( m_desc.pointerDepth() - 1 );
+ }
+
+ int pointerDepth() const {
+ return m_desc.pointerDepth();
+ }
+
+ void setPointerDepth( int pc ) {
+ m_desc.setPointerDepth( pc );
+ }
+
+
+ ///returns the scope(including own name) as string
+ QString str() const {
+ if ( m_scope.isEmpty() )
+ return "";
+ return m_scope.join( "::" );
+ }
+
+ ///returns the scope(including own name) as string-list
+ inline const QStringList& scope() const {
+ return m_scope;
+ }
+
+ ///Returns the scope including template-specialization
+ QStringList specializedScope() const {
+ QStringList ts = m_scope;
+ if( !ts.isEmpty() ) {
+ QString s = ts.back() + specialization();
+ ts.pop_back();
+ ts.push_back( s );
+ }
+ return ts;
+ }
+
+ ///sets the parent-type(type this one is nested in)
+ void setParent( TypePointer parent ) {
+ if( parent == m_parent ) return;
+ invalidateSecondaryCache();
+ if ( &( *parent ) == this ) {
+ kdDebug( 9007 ) << "setSlaveParent error\n" << kdBacktrace() << endl;
+ return ;
+ }
+
+ m_parent = parent;
+ }
+
+ ///returns whether the type has template-parameters, or one of the parent-types has template-parameters.
+ bool usingTemplates() const {
+ return !m_desc.templateParams().isEmpty() || ( m_parent && m_parent->usingTemplates() );
+ }
+
+ ///This function should add aliases as well as namespace-imports into the given namespace
+ virtual void addAliasesTo( SimpleTypeNamespace* ns ) {
+ }
+
+ ///An abstract class for building types lazily
+ struct TypeBuildInfo : public KShared {
+ TypePointer buildCached() {
+ if ( m_cache )
+ return m_cache;
+ else {
+ m_cache = build();
+ return m_cache;
+ }
+ }
+
+ void setCache( const TypePointer& type ) {
+ m_cache = type;
+ }
+
+ virtual TypePointer build() = 0;
+
+ virtual ~TypeBuildInfo() {}
+
+ TypeBuildInfo() {}
+ private:
+
+ TypePointer m_cache;
+
+ TypeBuildInfo& operator =( const TypeBuildInfo& rhs ) {
+ Q_UNUSED( rhs );
+ return *this;
+ }
+ TypeBuildInfo( const TypeBuildInfo& rhs ) : KShared() {
+ Q_UNUSED( rhs );
+ }
+ };
+
+ ///A class that stores information about a member of some SimpleType
+ class MemberInfo {
+ KSharedPtr<TypeBuildInfo> m_build;
+ public:
+
+ enum MemberType {
+ NotFound = 0,
+ Function = 1,
+ Variable = 2,
+ Typedef = 4,
+ Template = 8,
+ NestedType = 16,
+ Namespace = 32,
+ AllTypes = 0xffffffff
+ } memberType;
+
+ MemberInfo() {
+ memberType = NotFound;
+ }
+
+ QString memberTypeToString() {
+ switch ( memberType ) {
+ case Namespace:
+ return "namespace";
+ case Function:
+ return "function";
+ case Variable:
+ return "variable";
+ case NotFound:
+ return "not found";
+ case Typedef:
+ return "typedef";
+ case Template:
+ return "template-parameter";
+ case NestedType:
+ return "nested-type";
+ default:
+ return "unknown";
+ };
+ }
+
+ typedef KSharedPtr<SimpleTypeImpl> TypePointer;
+
+ void setBuildInfo( KSharedPtr<TypeBuildInfo> build ) {
+ m_build = build;
+ }
+
+ void setBuilt( const TypePointer& item ) {
+ m_built = item;
+ }
+
+ TypePointer build() {
+ if( m_built ) return m_built;
+ if ( !m_build ) {
+ return TypePointer();
+ } else {
+ m_built = m_build->buildCached();
+ return m_built;
+ }
+ }
+
+ operator bool() const {
+ return memberType != NotFound;
+ }
+
+ QString name;
+ LocateResult type;
+
+ ///This member is only filles for variables, typedefs and template-params!
+ DeclarationInfo decl;
+ private:
+ TypePointer m_built;
+ };
+
+
+ enum LocateMode {
+ Normal = 1,
+ ExcludeTemplates = 2,
+ ExcludeTypedefs = 4,
+ ExcludeBases = 8,
+ ExcludeParents = 16,
+ ExcludeNestedTypes = 32,
+ ExcludeNamespaces = 64,
+ ForgetModeUpwards = 128, ///forgets everything, even NoFail, while passing control to the parent
+ LocateBase = 4 + 8 + 32 + 64 + 128, ///searching in the scope visible while the base-declaration of a class
+ NoFail = 256,
+ TraceAliases = 512, ///Stores a copy whenever an alias is applied
+ OnlyLocalTemplates = 4 + 8 + 16 + 32 + 64 + 256,
+ OnlyTemplates = 4 + 8 + 32 + 256
+ };
+
+ ///replaces template-parameters from the given structure with their value-types
+ TypeDesc replaceTemplateParams( TypeDesc desc, TemplateParamInfo& paramInfo );
+ TypeDesc resolveTemplateParams( LocateResult desc, LocateMode mode = Normal );
+
+ //typedef ::LocateResult LocateResult;
+
+
+ /**By default templates are included while the resolution, so when the type should be addressed from
+ outside of the class, ExcludeTemplates should be set as LocateMode, since templates can not be directly accessed from the outside.
+ The resulting type's template-params may not be completely resolved, but can all be resolved locally by that type*/
+ LocateResult locateDecType( TypeDesc desc , LocateMode mode = Normal, int dir = 0 , MemberInfo::MemberType typeMask = bitInvert( addFlag( MemberInfo::Variable, MemberInfo::Function ) ) ) {
+ TypeDesc td = desc;
+ td.clearInstanceInfo();
+ LocateResult r = locateType( td, mode, dir, typeMask );
+ r.desc() = resolveTemplateParams( r.desc() );
+ r->takeInstanceInfo( desc );
+ // r.desc().setPointerDepth( r.desc().pointerDepth() + td.pointerDepth() );
+ return r;
+ }
+
+ //protected:
+
+ virtual LocateResult locateType( TypeDesc name , LocateMode mode = Normal, int dir = 0 , MemberInfo::MemberType typeMask = bitInvert( addFlag( MemberInfo::Variable, MemberInfo::Function ) ) ) ;
+
+ public:
+
+ LocateResult getFunctionReturnType( QString functionName, QValueList<LocateResult> params = QValueList<LocateResult>() );
+
+ ///Tries to apply the operator and returns the new type. If it fails, it returns an invalid type.
+ virtual LocateResult applyOperator( Operator op , QValueList<LocateResult> params = QValueList<LocateResult>() );
+
+
+ /** In case of a class, returns all base-types */
+ virtual QValueList<LocateResult> getBases();
+
+ virtual QStringList getBaseStrings() {
+ return QStringList();
+ };
+
+ ///This pair contains the found type, and additionally the member-information that helped finding the type
+ struct TypeOfResult {
+ LocateResult type;
+ DeclarationInfo decl;
+
+ TypeOfResult( LocateResult t = LocateResult(), DeclarationInfo d = DeclarationInfo() ) : type( t ), decl( d ) {}
+
+ TypeDesc* operator -> () {
+ return & type.desc();
+ }
+
+ operator TypeDesc() {
+ return type;
+ }
+
+ ///should be removed
+ operator SimpleType() {
+ if ( type->resolved() ) {
+ return SimpleType( type->resolved() );
+ } else {
+ return SimpleType();
+ }
+ }
+
+ operator bool() {
+ return ( bool ) type;
+ }
+ };
+
+ public:
+
+ virtual TypeOfResult typeOf( const TypeDesc& name, MemberInfo::MemberType typ = addFlag( MemberInfo::Function, MemberInfo::Variable ) );
+
+
+ ///From outside this should only be called for members like functions/variables etc. Classes will not have their bases resolved when acquired using this function.
+ virtual MemberInfo findMember( TypeDesc name, MemberInfo::MemberType type = ( MemberInfo::MemberType ) 0xffffffff ) {
+ Q_UNUSED( name );
+ Q_UNUSED( type );
+ MemberInfo mem;
+ mem.memberType = MemberInfo::NotFound;
+ return mem;
+ };
+
+ ///Should return all specializations of a specific class-name
+ virtual QValueList<TypePointer> findSpecializations( const QString& name ) {
+ return QValueList<TypePointer>();
+ }
+
+ /**TypeDescs and SimpleTypeImpls usually have a cross-reference, which creates a circular dependency so that they are never freed using KShared. This function breaks the loop, and also breaks all other possible dependency-loops. After this function was called, the type still contains its private information, but can not not be used to resolve anything anymore. This function is called automatically while the destruction of SimpleTypeConfiguration */
+ virtual void breakReferences();
+
+ ///Returns either itself, or the (namespace-)proxy this type is a slave of.
+ TypePointer bigContainer();
+
+ ///Returns the parent, eg. the SimpleType this one is nested in.
+ SimpleType parent();
+
+ ///this must be a reference, so the desc can be manipulated in-place from outside
+ const TypeDesc& desc();
+
+ TypeDesc& descForEdit();
+
+ ///short version
+ QString fullType() const {
+ return m_desc.fullName();
+ }
+
+ ///Similar to fullTypeResolved, except that it also shows addition information about template-params
+ QString describeWithParams() ;
+
+ ///returns all information that is available constantly
+ QString describe() const {
+ QString description = m_desc.fullName() + " (" + m_scope.join( "::" ) + ")" + createInfo();
+ return description;
+ }
+
+ ///this completely evaluates everything
+ QString fullTypeResolved( int depth = 0 );
+
+ ///this completely evaluates everything
+ QString fullTypeResolvedWithScope( int depth = 0 );
+
+
+ QString fullTypeUnresolvedWithScope();
+
+ virtual QValueList<TypePointer> getMemberClasses( const TypeDesc& name ) {
+ return QValueList<TypePointer>();
+ }
+
+ ///Returns the include-file-set used for resolving this type
+ IncludeFiles getFindIncludeFiles();
+
+ private:
+ QStringList m_scope;
+ TypePointer m_parent;
+ IncludeFiles m_findIncludeFiles; //Set of include-files used for finding this object
+
+ protected:
+ SimpleTypeImpl( SimpleTypeImpl* rhs ) : m_masterProxy( rhs->m_masterProxy ), m_resolutionCount( rhs->m_resolutionCount ), m_resolutionFlags( rhs->m_resolutionFlags ), m_scope( rhs->m_scope ), m_parent( rhs->m_parent ), m_findIncludeFiles( rhs->m_findIncludeFiles ), m_desc( rhs->m_desc ) {
+ reg();
+ }
+
+ TypeDesc m_desc; ///descibes the local type(so next() must be null)
+
+ /** Tries to extract template-parameters from the scope, resets the params-list */
+ virtual void checkTemplateParams ();
+
+ void setScope( const QStringList& scope );
+
+ ///Searches the item IN the bases
+ TypeOfResult searchBases ( const TypeDesc& name );
+
+ ///Used to set the include-files that were used to find this type(needed for lazy evaluation of the base-classes)
+ void setFindIncludeFiles( const IncludeFiles& files );
+
+ ///Should be called within the parent-namespace/class
+ virtual void chooseSpecialization( MemberInfo& member );
+
+};
+
+
+class TypeTrace {
+ QValueList<QPair< SimpleTypeImpl::MemberInfo, TypeDesc> > m_trace;
+ public:
+
+ QValueList<QPair< SimpleTypeImpl::MemberInfo, TypeDesc> >& trace() {
+ return m_trace;
+ };
+
+ void prepend( const SimpleTypeImpl::MemberInfo& t, const TypeDesc& tail = TypeDesc() ) {
+ m_trace.push_front( QPair< SimpleTypeImpl::MemberInfo, TypeDesc>( t, tail ) );
+ }
+
+ void prepend( const TypeTrace& trace, int indent = 0 ) {
+/* if( indent != 0 ) {
+ QString ind;
+ for( int a = 0; a < indent; a++ ) ind += " ";
+ for( QValueList<QPair< SimpleTypeImpl::MemberInfo, TypeDesc> >::const_iterator it = trace.m_trace.end(); it != trace.m_trace.begin(); ) {
+ --it;
+ QPair<SimpleTypeImpl::MemberInfo, TypeDesc> item = *it;
+ item.second.prependDecoration( ind );
+ m_trace.push_front( item );
+ }
+ } else {*/
+ m_trace = trace.m_trace + m_trace;
+/* }*/
+ }
+};
+
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/simpletypecachebinder.h b/languages/cpp/simpletypecachebinder.h
new file mode 100644
index 00000000..0cc5e2b0
--- /dev/null
+++ b/languages/cpp/simpletypecachebinder.h
@@ -0,0 +1,348 @@
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __SIMPLETYPECACHEBINDER_H__
+#define __SIMPLETYPECACHEBINDER_H__
+
+#include "simpletypenamespace.h"
+
+///In case the hashing-stuff brings some regressions, it can be removed again using this switch.
+#include <ext/hash_map>
+#include <map>
+
+//#define TEST_REMAP
+
+template <class Base>
+class SimpleTypeCacheBinder : public Base {
+ public:
+
+ SimpleTypeCacheBinder( SimpleTypeCacheBinder<Base>* b ) : Base( b ), m_locateCache( b->m_locateCache ), m_memberCache( b->m_memberCache ), m_basesCache( b->m_basesCache ), secondaryActive( b->secondaryActive ), m_classListCache( b->m_classListCache ), primaryActive( b->primaryActive ), m_haveBasesCache( b->m_haveBasesCache ) {}
+
+ SimpleTypeCacheBinder() : Base(), m_haveBasesCache( false ), secondaryActive( true ), primaryActive( true ) {}
+
+ template <class InitType>
+ SimpleTypeCacheBinder( InitType t ) : Base ( t ), m_haveBasesCache( false ) , secondaryActive( true ), primaryActive( true ) {}
+
+ template <class InitType1, class InitType2>
+ SimpleTypeCacheBinder( InitType1 t, InitType2 t2 ) : Base ( t, t2 ), m_haveBasesCache( false ), secondaryActive( true ), primaryActive( true ) {}
+
+ using Base::LocateMode;
+
+ struct LocateDesc {
+ TypeDesc mname;
+ //QString fullName;
+ SimpleTypeImpl::LocateMode mmode;
+ int mdir;
+ SimpleTypeImpl::MemberInfo::MemberType mtypeMask;
+ size_t m_hashKey;
+
+ LocateDesc() {}
+
+ LocateDesc( const TypeDesc& name, SimpleTypeImpl::LocateMode mode, int dir, SimpleTypeImpl::MemberInfo::MemberType typeMask ) : mname( name ), mmode( mode ) , mdir( dir ) , mtypeMask( typeMask ), m_hashKey( name.hashKey() + 11*int(mode) + 13*dir + 17*int(typeMask) ) {
+ //fullName = mname.fullNameChain();//fullTypeStructure();
+
+ }
+
+ ///@todo this should use hashing too
+ int compare( const LocateDesc& rhs ) const {
+ if ( m_hashKey != rhs.m_hashKey ) {
+ if ( m_hashKey < rhs.m_hashKey )
+ return -1;
+ else
+ return 1;
+ }
+ if ( mname.hashKey2() != rhs.mname.hashKey2() ) {
+ if ( mname.hashKey2() < rhs.mname.hashKey2() )
+ return -1;
+ else
+ return 1;
+ }
+ if ( mmode != rhs.mmode ) {
+ if ( mmode < rhs.mmode )
+ return -1;
+ else
+ return 1;
+ }
+ if ( mdir != rhs.mdir ) {
+ if ( mdir < rhs.mdir )
+ return -1;
+ else
+ return 1;
+ }
+ if ( mtypeMask != rhs.mtypeMask ) {
+ if ( mtypeMask < rhs.mtypeMask )
+ return -1;
+ else
+ return 1;
+ }
+
+ return 0;
+ }
+
+ bool operator < ( const LocateDesc& rhs ) const {
+ return compare( rhs ) == -1;
+ }
+
+ bool operator == ( const LocateDesc& rhs ) const {
+ //return compare( rhs ) == 0;
+ if( m_hashKey == rhs.m_hashKey && mname.hashKey2() == rhs.mname.hashKey2() )
+ return mname.name() == rhs.mname.name();
+ else
+ return false;
+ }
+
+ bool operator > ( const LocateDesc& rhs ) const {
+ return compare( rhs ) == 1;
+ }
+
+ inline size_t hashKey() const {
+ return m_hashKey;
+ }
+
+ struct hash {
+ inline size_t operator () ( const LocateDesc& m ) const {
+ return m.hashKey();
+ }
+
+ };
+ };
+
+ struct MemberFindDesc {
+ TypeDesc m_desc;
+ QString fullName;
+ SimpleTypeImpl::MemberInfo::MemberType findType;
+ size_t m_hashKey; //in time check why it is necessary to cache this key
+ size_t m_hashKey2;
+
+ MemberFindDesc() : m_hashKey( 0 ) {}
+
+ MemberFindDesc( TypeDesc d, SimpleTypeImpl::MemberInfo::MemberType ft ) : m_desc( d ), findType( ft ), m_hashKey( d.hashKey() + findType ), m_hashKey2( d.hashKey2() + findType ) {
+ //m_desc.makePrivate();
+ }
+
+ int compare( const MemberFindDesc& rhs ) const {
+ if ( fullName.isEmpty() ) const_cast<MemberFindDesc*>(this)->fullName = m_desc.fullNameChain();
+ if ( rhs.fullName.isEmpty() ) const_cast<MemberFindDesc*>(&rhs)->fullName = rhs.m_desc.fullNameChain();
+ const QString& a = fullName; //m_desc.fullNameChain();
+ const QString& b = rhs.fullName; //m_desc.fullNameChain();
+ if ( a != b ) {
+ if ( a < b )
+ return -1;
+ else
+ return 1;
+ }
+ if ( findType != rhs.findType ) {
+ if ( findType < rhs.findType )
+ return -1;
+ else
+ return 1;
+ }
+
+ return 0;
+ }
+
+ bool operator < ( const MemberFindDesc& rhs ) const {
+ return compare( rhs ) == -1;
+ }
+ //#endif
+ inline size_t hashKey() const {
+ return m_hashKey;
+ }
+
+ bool operator == ( const MemberFindDesc& rhs ) const {
+ bool ret = m_hashKey2 == rhs.m_hashKey2 && findType == rhs.findType;
+ if( ret )
+ return m_desc.name() == rhs.m_desc.name(); //Just for a little more security
+ return ret;
+ }
+ /*
+ bool operator > ( const MemberFindDesc& rhs ) const {
+ return compare( rhs ) == 1;
+ }*/
+ struct hash {
+ inline size_t operator () ( const MemberFindDesc& m ) const {
+ return m.hashKey();
+ }
+ };
+ };
+
+ typedef __gnu_cxx::hash_map<LocateDesc, LocateResult, typename LocateDesc::hash > LocateMap;
+ typedef __gnu_cxx::hash_map<MemberFindDesc, SimpleTypeImpl::MemberInfo, typename MemberFindDesc::hash > MemberMap;
+ typedef __gnu_cxx::hash_map<MemberFindDesc, QValueList<TypePointer>, typename MemberFindDesc::hash > ClassListMap;
+
+ virtual SimpleTypeImpl::MemberInfo findMember( TypeDesc name, SimpleTypeImpl::MemberInfo::MemberType type ) {
+ if ( !primaryActive )
+ return Base::findMember( name, type );
+ MemberFindDesc key( name, type );
+ typename MemberMap::iterator it = m_memberCache.find( key );
+
+ if ( it != m_memberCache.end() ) {
+ ifVerbose( dbg() << "\"" << Base::str() << "\" took member-info for \"" << name.fullNameChain() << "\" from the cache: " << (*it).second.name << endl );
+ return (*it).second;
+ } else {
+ SimpleTypeImpl::MemberInfo mem;
+
+ m_memberCache.insert( std::make_pair( key, mem ) ); //This is done to prevent expensive endless recursion
+
+ mem = Base::findMember( name, type );
+
+ std::pair< typename MemberMap::iterator, bool > r = m_memberCache.insert( std::make_pair( key, mem ) );
+ if ( !r.second ) {
+ (*r.first).second = mem;
+ }
+
+#ifdef TEST_REMAP
+ typename MemberMap::iterator it = m_memberCache.find( key );
+ if ( it == m_memberCache.end() ) dbgMajor() << "\"" << Base::str() << "\"remap failed with \"" << name.fullNameChain() << "\"" << endl;
+#endif
+
+ return mem;
+ }
+ }
+
+ virtual QValueList<TypePointer> getMemberClasses( const TypeDesc& name ) {
+ if ( !primaryActive )
+ return Base::getMemberClasses( name );
+ MemberFindDesc key( name, Base::MemberInfo::NestedType );
+ typename ClassListMap::iterator it = m_classListCache.find( key );
+
+ if ( it != m_classListCache.end() ) {
+ /*ifVerbose( dbg() << "\"" << Base::str() << "\" took member-info for \"" << name.fullNameChain() << "\" from the cache: " << (*it).second. << endl );*/
+ return (*it).second;
+ } else {
+ QValueList<TypePointer> mem;
+
+ m_classListCache.insert( std::make_pair( key, mem ) );
+
+ mem = Base::getMemberClasses( name );
+ std::pair<typename ClassListMap::iterator, bool> r = m_classListCache.insert( std::make_pair( key, mem ) );
+ if ( !r.second )
+ (*r.first).second = mem;
+
+#ifdef TEST_REMAP
+ typename ClassListMap::iterator it = m_classListCache.find( key );
+ if ( it == m_classListCache.end() ) dbgMajor() << "\"" << Base::str() << "\"remap failed with \"" << name.fullNameChain() << "\"" << endl;
+#endif
+
+ return mem;
+ }
+ }
+
+ virtual LocateResult locateType( TypeDesc name , SimpleTypeImpl::LocateMode mode, int dir, SimpleTypeImpl::MemberInfo::MemberType typeMask ) {
+
+ if ( !secondaryActive )
+ return Base::locateType( name, mode, dir, typeMask );
+ LocateDesc desc( name, mode, dir, typeMask );
+
+ typename LocateMap::iterator it = m_locateCache.find( desc );
+
+ if ( it != m_locateCache.end() ) {
+ Debug d( "#lo#" );
+ ifVerbose( dbg() << "\"" << Base::str() << "\" located \"" << name.fullNameChain() << "\" from the cache" << endl );
+ return (*it).second;
+ } else {
+ LocateResult t;
+ m_locateCache.insert( std::make_pair( desc, t ) ); //Done to prevent expensive recursion.
+ t = Base::locateType( name, mode, dir, typeMask );
+ std::pair< typename LocateMap::iterator, bool > r = m_locateCache.insert( std::make_pair( desc, t ) );
+ if ( !r.second )
+ (*r.first).second = t;
+
+#ifdef TEST_REMAP
+ typename LocateMap::iterator it = m_locateCache.find( desc );
+ if ( it == m_locateCache.end() ) dbgMajor() << "\"" << Base::str() << "\"remap failed with \"" << name.fullNameChain() << "\"" << endl;
+#endif
+ return t;
+ }
+ }
+
+ virtual QValueList<LocateResult> getBases() {
+ ///@todo this needs a lookup for different includeFiles..
+ if ( m_haveBasesCache ) {
+ ifVerbose( dbg() << "\"" << Base::str() << "\" took base-info from the cache" << endl );
+ return m_basesCache;
+ } else {
+ m_basesCache = Base::getBases();
+ m_haveBasesCache = true;
+ return m_basesCache;
+ }
+ }
+
+ private:
+ LocateMap m_locateCache;
+ MemberMap m_memberCache;
+ ClassListMap m_classListCache;
+ QValueList<LocateResult> m_basesCache;
+ bool m_haveBasesCache;
+ bool secondaryActive, primaryActive;
+
+ protected:
+
+ virtual typename Base::TypePointer clone() {
+ return new SimpleTypeCacheBinder<Base>( this );
+ }
+
+ virtual void invalidatePrimaryCache( bool onlyNegative ) {
+ //if( !m_memberCache.isEmpty() ) dbg() << "\"" << Base::str() << "\" primary caches cleared" << endl;
+ if ( !onlyNegative)
+ m_memberCache.clear();
+ else {
+ for ( typename MemberMap::iterator it = m_memberCache.begin(); it != m_memberCache.end(); ) {
+ if ( (*it).second.memberType == SimpleTypeImpl::MemberInfo::NotFound )
+ m_memberCache.erase( it++ );
+ else
+ ++it;
+ }
+ }
+ m_classListCache.clear();
+ }
+ virtual void invalidateSecondaryCache() {
+ //if( !m_locateCache.isEmpty() ) dbg() << "\"" << Base::str() << "\" secondary caches cleared" << endl;
+ m_locateCache.clear();
+ m_haveBasesCache = false;
+ m_basesCache.clear();
+ }
+
+ virtual void setSecondaryCacheActive( bool active ) {
+ secondaryActive = active;
+ }
+
+ virtual void setPrimaryCacheActive( bool active ) {
+ primaryActive = active;
+ }
+
+ virtual void invalidateCache() {
+ invalidatePrimaryCache( false );
+ invalidateSecondaryCache();
+ };
+ };
+
+
+//typedef SimpleTypeCacheBinder<SimpleTypeImpl> SimpleTypeImpl;
+
+ class SimpleTypeCodeModel;
+ class SimpleTypeCatalog;
+ class SimpleTypeNamespace;
+ class SimpleTypeCodeModelFunction;
+ class SimpleTypeCatalogFunction;
+
+ typedef SimpleTypeCacheBinder<SimpleTypeCodeModel> SimpleTypeCachedCodeModel;
+ typedef SimpleTypeCacheBinder<SimpleTypeCatalog> SimpleTypeCachedCatalog;
+ typedef SimpleTypeCacheBinder<SimpleTypeNamespace> SimpleTypeCachedNamespace;
+ typedef SimpleTypeCacheBinder<SimpleTypeCodeModelFunction> SimpleTypeCachedCodeModelFunction;
+ typedef SimpleTypeCacheBinder<SimpleTypeCatalogFunction> SimpleTypeCachedCatalogFunction;
+
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/simpletypecatalog.cpp b/languages/cpp/simpletypecatalog.cpp
new file mode 100644
index 00000000..2b02cd9e
--- /dev/null
+++ b/languages/cpp/simpletypecatalog.cpp
@@ -0,0 +1,375 @@
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include "simpletypecatalog.h"
+#include "simpletypefunction.h"
+#include "safetycounter.h"
+
+extern SafetyCounter safetyCounter;
+extern CppCodeCompletion* cppCompletionInstance;
+
+//SimpleTypeCatalog implementation
+
+TypePointer SimpleTypeCatalog::clone() {
+ return new SimpleTypeCachedCatalog( this );
+}
+
+QString SimpleTypeCatalog::specialization() const {
+ return m_tag.getSpecializationDeclaration();
+}
+
+void SimpleTypeCatalog::addAliasesTo( SimpleTypeNamespace* ns ) {
+ if ( m_tag.kind() != Tag::Kind_Namespace ) return;
+ QValueList<Catalog::QueryArgument> args;
+
+///Insert all namespace-imports
+ args << Catalog::QueryArgument( "scope", specializedScope() );
+ args << Catalog::QueryArgument( "kind", Tag::Kind_UsingDirective );
+
+ QValueList<Tag> tags( cppCompletionInstance->m_repository->query( args ) );
+
+ for ( QValueList<Tag>::iterator it = tags.begin(); it != tags.end(); ++it ) {
+ TypeDesc d( (*it).name() );
+ d.setIncludeFiles( HashedString((*it).fileName()) ); ///@todo implement the include-file-logic
+ ns->addAliasMap( TypeDesc(), d, HashedString((*it).fileName()), true, false, bigContainer() );
+ }
+///Insert all namespace-aliases
+ args.clear();
+ args << Catalog::QueryArgument( "scope", specializedScope() );
+ args << Catalog::QueryArgument( "kind", Tag::Kind_NamespaceAlias );
+
+ tags = cppCompletionInstance->m_repository->query( args );
+
+ for ( QValueList<Tag>::iterator it = tags.begin(); it != tags.end(); ++it ) {
+ QVariant v = (*it).attribute( "alias" );
+ if ( v.type() == QVariant::String ) {
+ TypeDesc d( v.asString() );
+ d.setIncludeFiles( HashedString((*it).fileName()) );
+ ns->addAliasMap( (*it).name(), d, HashedString((*it).fileName()), true, false, bigContainer() );
+ } else
+ kdDebug( 9007 ) << "namespace-alias has no alias-text" << endl;
+ }
+}
+
+QValueList<TypePointer> SimpleTypeCatalog::getMemberClasses( const TypeDesc& name ) {
+ QValueList<TypePointer> ret;
+
+ QValueList<Catalog::QueryArgument> args;
+
+ args << Catalog::QueryArgument( "scope", specializedScope() );
+ args << Catalog::QueryArgument( "name", name.name() );
+
+ QValueList<Tag> tags( cppCompletionInstance->m_repository->query( args ) );
+
+ for ( QValueList<Tag>::iterator it = tags.begin(); it != tags.end(); ++it ) {
+ if ( (*it).kind() == Tag::Kind_Class ) {
+ ///It would be better to return all matched class-names from within findMember and use them from there so all this will be cached too.
+ CatalogBuildInfo b( *it, name, TypePointer( this ) );
+ TypePointer t = b.buildCached();
+ if ( t ) ret << t;
+ }
+ }
+
+ return ret;
+}
+
+SimpleTypeImpl::MemberInfo SimpleTypeCatalog::findMember( TypeDesc name, SimpleTypeImpl::MemberInfo::MemberType type ) {
+ MemberInfo ret;
+ ret.name = name.name();
+ ret.memberType = MemberInfo::NotFound;
+ if ( !name ) return ret;
+
+ if ( ( type & MemberInfo::Template) ) {
+ LocateResult s = findTemplateParam( name.name() );
+ if ( s ) {
+ ret.memberType = MemberInfo::Template;
+ ret.type = s;
+ ret.decl.name = name.name();
+ ret.decl.file = m_tag.fileName();
+ m_tag.getStartPosition( &ret.decl.startLine, &ret.decl.startCol );
+ m_tag.getEndPosition( &ret.decl.endLine, &ret.decl.endCol );
+ }
+ }
+
+ QValueList<Catalog::QueryArgument> args;
+
+ args << Catalog::QueryArgument( "scope", specializedScope() );
+ args << Catalog::QueryArgument( "name", name.name() );
+
+ QValueList<Tag> tags( cppCompletionInstance->m_repository->query( args ) );
+
+ if ( tags.isEmpty() ) return ret;
+
+///skip all using-directives
+ QValueList<Tag>::iterator it = tags.begin();
+ while ( ( (*it).kind() == Tag::Kind_UsingDirective || (*it).kind() == Tag::Kind_NamespaceAlias ) && it != tags.end() )
+ ++it;
+
+ if ( it == tags.end() ) return ret;
+
+ Tag tag = *it;
+
+ if ( tag.kind() == Tag::Kind_Variable && (type & MemberInfo::Variable) ) {
+ ret.memberType = MemberInfo::Variable;
+ ret.type = tagType( tag );
+ ret.decl.name = tag.name();
+ ret.decl.comment = tag.comment();
+ tag.getStartPosition( &ret.decl.startLine, &ret.decl.startCol );
+ tag.getEndPosition( &ret.decl.endLine, &ret.decl.endCol );
+ ret.decl.file = tag.fileName();
+ }
+ if ( tag.kind() == Tag::Kind_Enumerator && (type & MemberInfo::Variable) ) {
+ ret.memberType = MemberInfo::Variable;
+ if ( !tag.hasAttribute( "enum" ) ) {
+ ret.type = TypeDesc( "const int" );
+ } else {
+ ret.type = tag.attribute( "enum" ).asString();
+ if ( ret.type->name().isEmpty() )
+ ret.type = TypeDesc( "const int" );
+ }
+ ret.decl.name = tag.name();
+ ret.decl.comment = tag.comment();
+ tag.getStartPosition( &ret.decl.startLine, &ret.decl.startCol );
+ tag.getEndPosition( &ret.decl.endLine, &ret.decl.endCol );
+ ret.decl.file = tag.fileName();
+ } else if ( tag.kind() == Tag::Kind_Class && ( type & MemberInfo::NestedType ) ) {
+ //if( tag.hasSpecializationDeclaration() ) {
+ //Choose another tag(the main class, not a specialization).
+ bool hasSpecializationDeclaration = tag.hasSpecializationDeclaration();
+ bool isIncluded = name.includeFiles()[tag.fileName()];
+ if ( hasSpecializationDeclaration || !isIncluded ) {
+ for ( QValueList<Tag>::const_iterator it = tags.begin(); it != tags.end(); ++it ) {
+ if ( (*it).kind() == Tag::Kind_Class && !(*it).hasSpecializationDeclaration() ) {
+ if ( name.includeFiles()[(*it).fileName()] ) {
+ tag = *it;
+ isIncluded = true;
+ hasSpecializationDeclaration = false;
+ } else if ( hasSpecializationDeclaration ) {
+ tag = *it;
+ hasSpecializationDeclaration = false;
+ isIncluded = false;
+ }
+
+ if ( isIncluded && !hasSpecializationDeclaration ) break;
+ }
+ }
+ }
+ //only accept non-specialized classes
+ if ( !tag.hasSpecializationDeclaration() ) {
+ ret.setBuildInfo( new CatalogBuildInfo( tag, name, TypePointer( this ) ) );
+ ret.memberType = MemberInfo::NestedType;
+ ret.type = name;
+ }
+ } else if ( tag.kind() == Tag::Kind_Typedef && ( type & MemberInfo::Typedef ) ) {
+ ret.memberType = MemberInfo::Typedef;
+ ret.type = tagType( tag );
+ ret.decl.name = tag.name();
+ ret.decl.comment = tag.comment();
+ tag.getStartPosition( &ret.decl.startLine, &ret.decl.startCol );
+ tag.getEndPosition( &ret.decl.endLine, &ret.decl.endCol );
+ ret.decl.file = tag.fileName();
+ } else if ( tag.kind() == Tag::Kind_Enum && ( type & MemberInfo::Typedef ) ) {
+ ret.memberType = MemberInfo::Typedef;
+ ret.type = TypeDesc( "const int" );
+ ret.decl.name = tag.name();
+ ret.decl.comment = tag.comment();
+ tag.getStartPosition( &ret.decl.startLine, &ret.decl.startCol );
+ tag.getEndPosition( &ret.decl.endLine, &ret.decl.endCol );
+ ret.decl.file = tag.fileName();
+ } else if ( (tag.kind() == Tag::Kind_FunctionDeclaration || tag.kind() == Tag::Kind_Function) && ( type & MemberInfo::Function ) ) {
+ ret.memberType = MemberInfo::Function;
+ ret.type = tagType( tag );
+ ret.type->increaseFunctionDepth();
+ ret.setBuildInfo( new SimpleTypeCatalogFunction::CatalogFunctionBuildInfo( tags, name, TypePointer( this ) ) );
+ } else if ( tag.kind() == Tag::Kind_Namespace && ( type & MemberInfo::Namespace ) ) {
+ ret.setBuildInfo( new CatalogBuildInfo( tag , name, TypePointer( this ) ) );
+ ret.memberType = MemberInfo::Namespace;
+ ret.type = name;
+ }
+
+///Check if it is a template-name
+
+//if( !ret.type) ret.memberType = MemberInfo::NotFound; //constructor..
+
+ if( ret.memberType == MemberInfo::Function || ret.memberType == MemberInfo::Variable || ret.memberType == MemberInfo::Template || ret.memberType == MemberInfo::Typedef || ret.memberType == MemberInfo::NestedType ) {
+ //For redirected types it is necessary to add the include-files of the context they were searched in.
+ //That is not quite correct, but it makes sure that at least the same namespace-aliases will be activated while the search for the type.
+
+ ret.type->addIncludeFiles( name.includeFiles() );
+ }
+
+ chooseSpecialization( ret );
+ return ret;
+}
+
+Tag SimpleTypeCatalog::findSubTag( const QString& name ) {
+ if ( name.isEmpty() ) return Tag();
+
+ QValueList<Catalog::QueryArgument> args;
+ QTime t;
+
+ t.start();
+ args << Catalog::QueryArgument( "scope", specializedScope() );
+ args << Catalog::QueryArgument( "name", name );
+
+ QValueList<Tag> tags( cppCompletionInstance->m_repository->query( args ) );
+ if ( ! tags.isEmpty() ) {
+ //ifVerbose( dbg() << "findTag: \"" << str() << "\": tag \"" << name << "\" found " << endl );
+ return tags.front();
+ } else {
+ //ifVerbose( dbg() << "findTag: \"" << str() << "\": tag \"" << name << "\" not found " << endl );
+ return Tag();
+ }
+}
+
+QValueList<Tag> SimpleTypeCatalog::getBaseClassList( ) {
+ if ( scope().isEmpty() )
+ return QValueList<Tag>();
+ return cppCompletionInstance->m_repository->getBaseClassList( scope().join("::") + specialization() );
+}
+
+void SimpleTypeCatalog::initFromTag() {
+ QStringList l = m_tag.scope();
+ l << m_tag.name();
+ setScope( l );
+}
+
+void SimpleTypeCatalog::init() {
+ if ( !scope().isEmpty() ) {
+ QStringList l = scope();
+ QStringList cp = l;
+ cp.pop_back();
+ setScope( cp );
+ m_tag = findSubTag( l.back() );
+ setScope( l );
+ //initFromTag( ); ///must not be done, because it may initialize to wrong namespaces etc.
+ }
+}
+
+DeclarationInfo SimpleTypeCatalog::getDeclarationInfo() {
+ DeclarationInfo ret;
+
+ ret.name = fullTypeResolved();
+ if ( m_tag ) {
+ ret.file = m_tag.fileName();
+ m_tag.getStartPosition( &ret.startLine, &ret.startCol );
+ m_tag.getEndPosition( &ret.endLine, &ret.endCol );
+ ret.comment = m_tag.comment();
+ }
+
+ return ret;
+}
+
+QStringList SimpleTypeCatalog::getBaseStrings() {
+ Debug d( "#getbases#" );
+ if ( !d || !safetyCounter ) {
+ //ifVerbose( dbg() << "\"" << str() << "\": recursion to deep while getting bases" << endl );
+ return QStringList();
+ }
+
+ QStringList ret;
+ QMap<QString, bool> bases;
+// try with parentsc
+ QTime t;
+ t.restart();
+ QValueList<Tag> parents( getBaseClassList() );
+
+ QValueList<Tag>::Iterator it = parents.begin();
+ while ( it != parents.end() ) {
+ Tag & tag = *it;
+ ++it;
+
+ CppBaseClass<Tag> info( tag );
+
+ bases[ info.baseClass() ] = true;
+ }
+ return bases.keys();
+}
+
+SimpleTypeImpl::TemplateParamInfo SimpleTypeCatalog::getTemplateParamInfo() {
+ TemplateParamInfo ret;
+
+ if ( m_tag ) {
+ if ( m_tag.hasAttribute( "tpl" ) ) {
+ QStringList l = m_tag.attribute( "tpl" ).asStringList();
+
+ TypeDesc::TemplateParams templateParams = m_desc.templateParams();
+ uint pi = 0;
+ QStringList::const_iterator it = l.begin();
+ while ( it != l.end() ) {
+ TemplateParamInfo::TemplateParam curr;
+ curr.name = *it;
+ curr.number = pi;
+ ++pi;
+ ++it;
+ if ( it != l.end() ) {
+ curr.def = *it;
+ ++it;
+ }
+ if ( pi < templateParams.count() )
+ curr.value = *templateParams[pi];
+ ret.addParam( curr );
+ };
+ }
+ }
+
+ return ret;
+}
+
+const LocateResult SimpleTypeCatalog::findTemplateParam( const QString& name ) {
+ if ( m_tag ) {
+ if ( m_tag.hasAttribute( "tpl" ) ) {
+ QStringList l = m_tag.attribute( "tpl" ).asStringList();
+ ///we need the index, so count the items through
+ uint pi = 0;
+
+ QStringList::const_iterator it = l.begin();
+ while ( it != l.end() && *it != name ) {
+ ++pi;
+ ++it;
+ if ( it != l.end() ) ++it;
+ };
+
+ TypeDesc::TemplateParams templateParams = m_desc.templateParams();
+
+ if ( it != l.end() && pi < templateParams.count() ) {
+ return *templateParams[pi];
+ } else {
+ if ( it != l.end() && *it == name && !(*it).isEmpty()) {
+ ++it;
+ if ( it != l.end() && !(*it).isEmpty() ) {
+ ifVerbose( dbg() << "using default-template-type " << *it << " for " << name << endl );
+ return TypeDesc( *it ); ///return default-parameter
+ }
+ }
+ }
+ }
+ }
+ return LocateResult();
+}
+
+//SimpleTypeCatalog::CatalogBuildInfo implementation
+TypePointer SimpleTypeCatalog::CatalogBuildInfo::build() {
+ if ( !m_tag )
+ return TypePointer();
+ else {
+ TypePointer tp = new SimpleTypeCachedCatalog( m_tag );
+ tp->parseParams( m_desc );
+ if ( m_parent ) tp->setParent( m_parent->bigContainer() );
+ return tp;
+ }
+
+}
+
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/simpletypecatalog.h b/languages/cpp/simpletypecatalog.h
new file mode 100644
index 00000000..ecfdb833
--- /dev/null
+++ b/languages/cpp/simpletypecatalog.h
@@ -0,0 +1,119 @@
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef SIMPLETYPECATALOG_H
+#define SIMPLETYPECATALOG_H
+
+#include "simpletype.h"
+
+class SimpleTypeCatalog : public SimpleTypeImpl {
+
+public:
+
+ SimpleTypeCatalog() {
+ };
+
+ virtual DeclarationInfo getDeclarationInfo();
+
+ SimpleTypeCatalog( SimpleTypeCatalog* rhs ) : SimpleTypeImpl( rhs ), m_tag( rhs->m_tag ) {
+ };
+
+ static CppCodeCompletion* data;
+
+ virtual bool isNamespace() const {
+ return m_tag.kind() == Tag::Kind_Namespace;
+ }
+
+ /** empty scope means global scope */
+ SimpleTypeCatalog( const QStringList& scope ) : SimpleTypeImpl( scope ) {
+ init();
+ }
+
+ SimpleTypeCatalog( SimpleTypeImpl* rhs ) : SimpleTypeImpl( rhs ) {
+ init();
+ };
+
+ SimpleTypeCatalog( Tag& tag ) {
+ m_tag = tag;
+ initFromTag();
+ }
+
+ virtual QString comment() const {
+ return m_tag.comment();
+ };
+
+ virtual TypePointer clone();
+
+ virtual Repository rep() const {
+ return RepoCatalog;
+ }
+
+ virtual bool hasNode() const {
+ return (bool)m_tag;
+ };
+
+ virtual QStringList getBaseStrings();
+
+ virtual TemplateParamInfo getTemplateParamInfo();
+
+ virtual const LocateResult findTemplateParam( const QString& name );
+
+ virtual QString specialization() const;
+
+ virtual void addAliasesTo( SimpleTypeNamespace* ns );
+
+private:
+ Tag m_tag;
+
+ int pointerDepthFromString( const QString& str ) {
+ QRegExp ptrRx( "(\\*|\\&)" );
+ QString ptr = str.mid( str.find( ptrRx ) );
+ QStringList ptrList = QStringList::split( "", ptr );
+ return ptrList.size();
+ }
+
+ Tag findSubTag( const QString& name );
+
+ QValueList<Tag> getBaseClassList();
+
+ void initFromTag();
+
+ void init();
+
+protected:
+ const Tag& tag() {
+ return m_tag;
+ }
+
+ struct CatalogBuildInfo : public TypeBuildInfo {
+ Tag m_tag;
+ TypeDesc m_desc;
+ TypePointer m_parent;
+
+ CatalogBuildInfo( Tag tag , const TypeDesc& desc, TypePointer parent ) : m_tag( tag ) , m_desc( desc ), m_parent( parent ) {
+ }
+
+ virtual TypePointer build();
+ };
+
+ virtual MemberInfo findMember( TypeDesc name, MemberInfo::MemberType type = MemberInfo::AllTypes);
+
+ virtual QValueList<TypePointer> getMemberClasses( const TypeDesc& name ) ;
+};
+
+
+
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/simpletypefunction.cpp b/languages/cpp/simpletypefunction.cpp
new file mode 100644
index 00000000..898228bb
--- /dev/null
+++ b/languages/cpp/simpletypefunction.cpp
@@ -0,0 +1,726 @@
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "simpletypefunction.h"
+#include "safetycounter.h"
+#include "simpletypenamespace.h"
+
+extern SafetyCounter safetyCounter;
+extern CppCodeCompletion* cppCompletionInstance;
+
+HashedStringSet getIncludeFiles( const ItemDom& item ) {
+ if ( item ) {
+ FileDom f = item->file();
+ if ( f ) {
+ ParseResultPointer p = f->parseResult();
+ if ( p ) {
+ ParsedFilePointer pp = dynamic_cast<ParsedFile*>( p.data() );
+ if ( pp ) {
+ return pp->includeFiles();
+ }
+ }
+ }
+ }
+
+ return HashedStringSet();
+}
+
+
+
+//SimpleTypeFunctionInterface implementation
+
+QString SimpleTypeFunctionInterface::signature() {
+ QString sig = "( ";
+ SimpleTypeImpl* asType = dynamic_cast<SimpleTypeImpl*>( this );
+
+ QStringList argDefaults = getArgumentDefaults();
+ QStringList argNames = getArgumentNames();
+ QValueList<TypeDesc> argTypes = getArgumentTypes();
+ QValueList<LocateResult> argRealTypes;
+
+ if ( asType ) {
+ for ( QValueList<TypeDesc>::iterator it = argTypes.begin(); it != argTypes.end(); ++it ) {
+ argRealTypes << asType->locateDecType( *it );
+ }
+ }
+
+ QStringList::iterator def = argDefaults.begin();
+ QStringList::iterator name = argNames.begin();
+ QValueList<LocateResult>::iterator realType = argRealTypes.begin();
+
+ while ( realType != argRealTypes.end() ) {
+ if ( sig != "( " )
+ sig += ", ";
+
+ sig += ( *realType )->fullNameChain();
+ ++realType;
+
+ if ( name != argNames.end() ) {
+ if ( !( *name ).isEmpty() ) sig += " " + *name;
+ ++name;
+ }
+
+ if ( def != argDefaults.end() && !( *def ).isEmpty() ) {
+ sig += " = " + *def;
+ ++def;
+ }
+ }
+
+ sig += " )";
+ return sig;
+}
+
+bool SimpleTypeFunctionInterface::containsUndefinedTemplateParam( TypeDesc& desc, SimpleTypeImpl::TemplateParamInfo& paramInfo ) {
+ TypeDesc::TemplateParams& pm = desc.templateParams();
+ SimpleTypeImpl::TemplateParamInfo::TemplateParam t;
+
+ if ( pm.isEmpty() && paramInfo.getParam( t, desc.name() ) )
+ if ( !t.value ) return true;
+
+ if ( desc.next() )
+ if ( containsUndefinedTemplateParam( *desc.next(), paramInfo ) )
+ return true;
+
+ for ( TypeDesc::TemplateParams::iterator it = pm.begin(); it != pm.end(); ++it ) {
+ if ( containsUndefinedTemplateParam( **it, paramInfo ) ) return true;
+ }
+
+ return false;
+}
+
+void SimpleTypeFunctionInterface::resolveImplicitTypes( TypeDesc& argType, TypeDesc& gottenArgType, SimpleTypeImpl::TemplateParamInfo& paramInfo ) {
+ if ( argType.templateParams().isEmpty() ) { ///Template-types may not be templates.
+ SimpleTypeImpl::TemplateParamInfo::TemplateParam p;
+ if ( paramInfo.getParam( p, argType.name() ) && !p.value ) {
+ ifVerbose( dbg() << "choosing \"" << gottenArgType.fullNameChain() << "\" as implicit template-parameter for \"" << argType.name() << "\"" << endl );
+ p.value = gottenArgType;
+ p.value.makePrivate();
+ for ( int d = 0; d < argType.totalPointerDepth(); d++ )
+ p.value.setTotalPointerDepth( p.value.totalPointerDepth() - 1 );
+
+ paramInfo.addParam( p );
+ }
+ } else {
+ if ( argType.name() == gottenArgType.name() )
+ resolveImplicitTypes( argType.templateParams(), gottenArgType.templateParams(), paramInfo );
+ }
+}
+
+void SimpleTypeFunctionInterface::resolveImplicitTypes( TypeDesc::TemplateParams& argTypes, TypeDesc::TemplateParams& gottenArgTypes, SimpleTypeImpl::TemplateParamInfo& paramInfo ) {
+ TypeDesc::TemplateParams::iterator it = argTypes.begin();
+ TypeDesc::TemplateParams::iterator it2 = gottenArgTypes.begin();
+
+ while ( it != argTypes.end() && it2 != gottenArgTypes.end() ) {
+ resolveImplicitTypes( **it, **it2, paramInfo );
+ ++it;
+ ++it2;
+ }
+}
+
+void SimpleTypeFunctionInterface::resolveImplicitTypes( QValueList<TypeDesc>& argTypes, QValueList<TypeDesc>& gottenArgTypes, SimpleTypeImpl::TemplateParamInfo& paramInfo ) {
+ QValueList<TypeDesc>::iterator it = argTypes.begin();
+ QValueList<TypeDesc>::iterator it2 = gottenArgTypes.begin();
+
+ while ( it != argTypes.end() && it2 != gottenArgTypes.end() ) {
+ resolveImplicitTypes( *it, *it2, paramInfo );
+ ++it;
+ ++it2;
+ }
+}
+
+void SimpleTypeFunctionInterface::appendNextFunction( SimpleType func ) {
+ Debug d( "#fapp#" );
+ if ( !func || !d ) return;
+ if (( SimpleTypeImpl* ) func.get() == ( SimpleTypeImpl* ) this ) return;
+ if ( m_nextFunction && m_nextFunction->asFunction() ) {
+ m_nextFunction->asFunction()->appendNextFunction( func );
+ } else {
+ m_nextFunction = func;
+ }
+}
+
+//SimpleTypeCodeModel implementation
+
+void SimpleTypeCodeModel::addAliasesTo( SimpleTypeNamespace* ns ) {
+ const NamespaceModel* m = dynamic_cast<const NamespaceModel*>( m_item.data() );
+ if ( m ) {
+ const NamespaceModel::NamespaceAliasModelList& namespaceAliases = m->namespaceAliases();
+ const NamespaceModel::NamespaceImportModelList& namespaceImports = m->namespaceImports();
+ for ( NamespaceModel::NamespaceAliasModelList::const_iterator it = namespaceAliases.begin(); it != namespaceAliases.end(); ++it ) {
+ HashedStringSet searchFiles;
+ FileDom d = m->codeModel()->fileByName( it->fileName().str() );
+ ParsedFilePointer p = dynamic_cast<ParsedFile*>( d->parseResult().data() );
+ if ( p ) {
+ searchFiles = p->includeFiles();
+ } else {
+ searchFiles = HashedStringSet( HashedString( it->fileName() ) );
+ }
+ TypeDesc ds( it->aliasName() );
+ ds.setIncludeFiles( searchFiles );
+ ns->addAliasMap( it->name(), ds, HashedString( it->fileName() ), true, false, bigContainer() );
+ }
+ for ( NamespaceModel::NamespaceImportModelList::const_iterator it = namespaceImports.begin(); it != namespaceImports.end(); ++it ) {
+ HashedStringSet searchFiles;
+ FileDom d = m->codeModel()->fileByName( it->fileName().str() );
+ ParsedFilePointer p = dynamic_cast<ParsedFile*>( d->parseResult().data() );
+ if ( p ) {
+ searchFiles = p->includeFiles();
+ } else {
+ searchFiles = HashedStringSet( HashedString( it->fileName() ) );
+ }
+ TypeDesc ds( it->name() );
+ ds.setIncludeFiles( searchFiles );
+ ns->addAliasMap( TypeDesc(), ds, HashedString( it->fileName() ), true, false, bigContainer() );
+ }
+ }
+}
+
+SimpleTypeCodeModel::SimpleTypeCodeModel( ItemDom& item ) : m_item( item ) {
+ CodeModelItem* i = & ( *item );
+ FunctionModel* m = dynamic_cast<FunctionModel*>( i );
+ ClassModel* c = dynamic_cast<ClassModel*>( i );
+ if ( m ) {
+ QStringList l = m->scope();
+ l << m->name();
+ setScope( l );
+ return;
+ }
+ if ( c ) {
+ QStringList l = c->scope();
+ l << c->name();
+ setScope( l );
+ return;
+ }
+ ifVerbose( dbg() << "code-model-item has an unsupported type: " << i->name() << endl );
+}
+
+ItemDom SimpleTypeCodeModel::locateModelContainer( class CodeModel* m, TypeDesc t, ClassDom cnt ) {
+ if ( !cnt ) {
+ if ( m->globalNamespace() ) {
+ cnt = model_cast<ClassDom> ( m->globalNamespace() );
+ } else {
+ return ItemDom();
+ }
+ }
+ if ( t ) {
+ if ( cnt->hasClass( t.name() ) ) {
+ ClassList l = cnt->classByName( t.name() );
+ if ( !l.isEmpty() ) {
+ if ( t.next() )
+ return locateModelContainer( m, *t.next(), l.front() );
+ else
+ return model_cast<ItemDom> ( l.front() );
+ }
+ }
+ NamespaceModel* ns = dynamic_cast<NamespaceModel*>( & ( *cnt ) );
+ if ( ns ) {
+ NamespaceDom n = ns->namespaceByName( t.name() );
+ if ( t.next() )
+ return locateModelContainer( m, *t.next(), model_cast<ClassDom> ( n ) );
+ else
+ return model_cast<ItemDom> ( n );
+ }
+ }
+
+ return ItemDom();
+}
+
+///Until header-parsing is implemented, this tries to find the class that is most related to this item
+/*ClassDom SimpleTypeCodeModel::pickMostRelated( ClassList lst, QString fn ) {
+ if( lst.isEmpty() ) return ClassDom();
+
+ ClassDom best = lst.front();
+ uint bestMatch = 0;
+ //kdDebug() << "searching most related to " << fn << endl;
+
+ for( ClassList::iterator it = lst.begin(); it != lst.end(); ++it ) {
+ if( !(*it)->getSpecializationDeclaration().isEmpty() ) continue; ///Don't consider specialized classes
+ //kdDebug() << "comparing " << (*it)->fileName() << endl;
+ QString str = (*it)->fileName();
+ uint len = str.length();
+ if( fn.length() < len ) len = fn.length();
+
+ uint matchLen = 0;
+ for( uint a = 0; a < len; a++ ) {
+ if( str[a] == fn[a] )
+ matchLen++;
+ else
+ break;
+ }
+
+ if( matchLen > bestMatch ) {
+ //kdDebug() << "picking " << str << endl;
+ bestMatch = matchLen;
+ best = *it;
+ }
+ }
+
+ //kdDebug() << "picked " << best->fileName() << endl;
+ if( !best->getSpecializationDeclaration().isEmpty() ) best = 0; ///only accept non-specialized classes
+ return best;
+}*/
+
+/*QValueList<TypePointer> SimpleTypeCodeModel::findSpecializations( const QString& name ) {
+ ClassModel* klass = dynamic_cast<ClassModel*> ( & (*m_item) );
+ if( !klass ) {
+ ifVerbose( dbg() << "\"" << str() << "\": search for member " << name.name() << " unsuccessful because the own type is invalid" << endl );
+ return QValueList<TypePointer>();
+ }
+
+ ClassList l = klass->classByName( name.name() );
+
+ if( !l.isEmpty() ) {
+ ClassDom i = pickMostRelated( l, globalCurrentFile );
+ if( i ) {
+ ret.setBuildInfo( new CodeModelBuildInfo( model_cast<ItemDom>( i ), name, TypePointer( this ) ) );
+
+ ret.memberType = MemberInfo::NestedType;
+ ret.type = name;
+ }
+ }
+
+ return QValueList<TypePointer>();
+}*/
+
+
+QValueList<TypePointer> SimpleTypeCodeModel::getMemberClasses( const TypeDesc& name ) {
+ QValueList<TypePointer> ret;
+
+ if ( !m_item ) return ret;
+
+ ClassModel* klass = dynamic_cast<ClassModel*>( & ( *m_item ) );
+ if ( !klass ) {
+ ifVerbose( dbg() << "\"" << str() << "\": search for member " << name.name() << " unsuccessful because the own type is invalid" << endl );
+ return ret;
+ }
+
+ ClassList l = klass->classByName( name.name() );
+
+ if ( !l.isEmpty() ) {
+ for ( ClassList::iterator it = l.begin(); it != l.end(); ++it ) {
+ CodeModelBuildInfo b( model_cast<ItemDom> ( *it ), name, TypePointer( this ) );
+ TypePointer r = b.build();
+ if ( r )
+ ret << r;
+ }
+ }
+ return ret;
+}
+
+template<class Item>
+Item pickMostRelated( const HashedStringSet& includeFiles, const QValueList<Item>& list ) {
+ if ( list.isEmpty() ) return Item();
+
+ for ( typename QValueList<Item>::const_iterator it = list.begin(); it != list.end(); ++it ) {
+ if ( includeFiles[( *it )->fileName()] )
+ return *it;
+ }
+ return list.front();
+}
+
+template<>
+ClassDom pickMostRelated( const HashedStringSet& includeFiles, const QValueList<ClassDom>& list ) {
+ if ( list.isEmpty() ) return ClassDom(); ///@todo the current file must be preferred
+
+ for ( QValueList<ClassDom>::const_iterator it = list.begin(); it != list.end(); ++it ) {
+ if ( !( *it )->getSpecializationDeclaration().isEmpty() ) continue; ///Don't consider specialized classes
+ if ( includeFiles[( *it )->fileName()] )
+ return *it;
+ }
+
+
+ if ( !list.front()->getSpecializationDeclaration().isEmpty() ) return ClassDom(); ///Don't consider specialized classes
+ return list.front();
+}
+
+SimpleTypeImpl::MemberInfo SimpleTypeCodeModel::findMember( TypeDesc name , MemberInfo::MemberType type ) {
+ MemberInfo ret;
+ ret.name = name.name();
+ ret.memberType = MemberInfo::NotFound;
+ if ( !name || !m_item ) return ret;
+
+ ClassModel* klass = dynamic_cast<ClassModel*>( & ( *m_item ) );
+ if ( !klass ) {
+ ifVerbose( dbg() << "\"" << str() << "\": search for member " << name.name() << " unsuccessful because the own type is invalid" << endl );
+ return ret;
+ }
+ NamespaceModel* ns = dynamic_cast<NamespaceModel*>( klass );
+
+ if ( klass->hasVariable( name.name() ) && ( type & MemberInfo::Variable ) ) {
+ ret.memberType = MemberInfo::Variable;
+ VariableDom d = klass->variableByName( name.name() );
+ if ( d ) {
+ ret.type = d->type();
+ ret.type->setIncludeFiles( HashedString( d->fileName() ) );
+ ret.decl.name = d->name();
+ ret.decl.file = d->fileName();
+ ret.decl.comment = d->comment();
+ d->getStartPosition( &ret.decl.startLine, &ret.decl.startCol );
+ d->getEndPosition( &ret.decl.endLine, &ret.decl.endCol );
+ }
+ } else if ( klass->hasTypeAlias( name.name() ) && ( type & MemberInfo::Typedef ) ) {
+ ret.memberType = MemberInfo::Typedef;
+ TypeAliasList li = klass->typeAliasByName( name.name() );
+ TypeAliasDom a = pickMostRelated( name.includeFiles(), li );
+
+ if ( a ) {
+ ret.type = a->type();
+ ret.type->setIncludeFiles( getIncludeFiles( a.data() ) );
+ ret.decl.name = a->name();
+ ret.decl.file = a->fileName();
+ ret.decl.comment = a->comment();
+ a->getStartPosition( &ret.decl.startLine, &ret.decl.startCol );
+ a->getEndPosition( &ret.decl.endLine, &ret.decl.endCol );
+ }
+ } else if ( klass->hasEnum( name.name() ) && ( type & MemberInfo::Typedef ) ) {
+ ret.memberType = MemberInfo::Typedef;
+ EnumDom e = klass->enumByName( name.name() );
+ ret.type = TypeDesc( "const int" );
+ ret.type->setIncludeFiles( HashedString( e->fileName() ) );
+ ret.decl.name = e->name();
+ ret.decl.file = e->fileName();
+ ret.decl.comment = e->comment();
+ e->getStartPosition( &ret.decl.startLine, &ret.decl.startCol );
+ e->getEndPosition( &ret.decl.endLine, &ret.decl.endCol );
+ } else if ( klass->hasClass( name.name() ) && ( type & MemberInfo::NestedType ) ) {
+ ClassList l = klass->classByName( name.name() );
+
+ if ( !l.isEmpty() ) {
+ ClassDom i = pickMostRelated( name.includeFiles(), l );
+ if ( i ) {
+ ret.setBuildInfo( new CodeModelBuildInfo( model_cast<ItemDom> ( i ), name, TypePointer( this ) ) );
+
+ ret.memberType = MemberInfo::NestedType;
+ ret.type = name;
+ ret.type->setIncludeFiles( HashedString( i->fileName() ) );
+ }
+ }
+ } else if ( klass->hasFunction( name.name() ) && ( type & MemberInfo::Function ) ) {
+ ret.memberType = MemberInfo::Function;
+ FunctionList l = klass->functionByName( name.name() );
+ if ( !l.isEmpty() && l.front() ) {
+ ret.setBuildInfo( new SimpleTypeCodeModelFunction::CodeModelFunctionBuildInfo( l, name , TypePointer( this ) ) );
+ ret.type = l.front()->resultType();
+ ret.type->setIncludeFiles( HashedString( l.front()->fileName() ) );
+ ret.type->increaseFunctionDepth();
+ }
+ } else if ( ns && ns->hasNamespace( name.name() ) && ( type & MemberInfo::Namespace ) ) {
+ NamespaceDom n = ns->namespaceByName( name.name() );
+ ret.setBuildInfo( new CodeModelBuildInfo( model_cast<ItemDom> ( n ), name, TypePointer( this ) ) );
+ ret.memberType = MemberInfo::Namespace;
+ ret.type = name;
+ //ret.type->setIncludeFiles( d->fileName() );
+ } else if ( klass->hasFunctionDefinition( name.name() ) && ( type & MemberInfo::Function ) ) {
+ FunctionDefinitionList l = klass->functionDefinitionByName( name.name() );
+ for ( FunctionDefinitionList::iterator it = l.begin(); it != l.end(); ++it ) {
+ if ( !( *it )->scope().isEmpty() && ( *it )->scope() != scope() ) continue; ///Only use definitions with empty scope or that are within this class
+ ret.setBuildInfo( new SimpleTypeCodeModelFunction::CodeModelFunctionBuildInfo( l, name, TypePointer( this ) ) );
+ ret.type = l.front()->resultType();
+ ret.type->setIncludeFiles( HashedString(( *it )->fileName() ) );
+ ret.type->increaseFunctionDepth();
+ ret.memberType = MemberInfo::Function;
+ break;
+ }
+ }
+
+ if ( ret.memberType == MemberInfo::NotFound ) {
+ if ( type & MemberInfo::Template ) {
+ LocateResult s = findTemplateParam( name.name() );
+ if ( s ) {
+ ret.memberType = MemberInfo::Template;
+ ret.type = s;
+ if ( m_item )
+ ret.type->setIncludeFiles( getIncludeFiles( m_item.data() ) );
+ ret.decl.name = name.name();
+ if ( m_item ) {
+ ret.decl.file = m_item->fileName();
+ m_item->getStartPosition( &ret.decl.startLine, &ret.decl.startCol );
+ m_item->getEndPosition( &ret.decl.endLine, &ret.decl.endCol );
+ }
+ }
+ }
+ }
+
+ if ( ret.memberType == MemberInfo::Function || ret.memberType == MemberInfo::Variable || ret.memberType == MemberInfo::Template || ret.memberType == MemberInfo::Typedef || ret.memberType == MemberInfo::NestedType ) {
+ //For redirected types it is necessary to add the include-files of the context they were searched in.
+ //That is not quite correct, but it makes sure that at least the same namespace-aliases will be activated while the search for the type,
+ //Which is necessary because the alias is parented by exactly this class.
+
+ ret.type->addIncludeFiles( name.includeFiles() );
+ }
+
+ chooseSpecialization( ret );
+
+ return ret;
+}
+
+bool SimpleTypeCodeModel::findItem() {
+ QString key = str();
+ m_item = locateModelContainer( cppCompletionInstance->m_pSupport->codeModel(), str() );
+ return ( bool ) m_item;
+}
+
+void SimpleTypeCodeModel::init() {
+ if ( scope().isEmpty() ) {
+ m_item = cppCompletionInstance->m_pSupport->codeModel() ->globalNamespace();
+ } else {
+ findItem();
+ }
+}
+
+DeclarationInfo SimpleTypeCodeModel::getDeclarationInfo() {
+ DeclarationInfo ret;
+ ItemDom i = item();
+ ret.name = fullTypeResolved();
+ if ( i ) {
+ ret.file = i->fileName();
+ i->getStartPosition( &ret.startLine, &ret.startCol );
+ i->getEndPosition( &ret.endLine, &ret.endCol );
+ ret.comment = i->comment();
+ }
+ return ret;
+}
+
+QString SimpleTypeCodeModel::specialization() const {
+ const ClassModel* klass = dynamic_cast<const ClassModel*>( m_item.data() );
+ if ( !klass ) return QString::null;
+ return klass->getSpecializationDeclaration();
+}
+
+SimpleTypeImpl::TemplateParamInfo SimpleTypeCodeModel::getTemplateParamInfo() {
+ TemplateParamInfo ret;
+
+ if ( m_item ) {
+ TemplateModelItem* ti = dynamic_cast<TemplateModelItem*>( & ( *m_item ) );
+ TypeDesc::TemplateParams& templateParams = m_desc.templateParams();
+
+ TemplateModelItem::ParamMap m = ti->getTemplateParams();
+ for ( uint a = 0; a < m.size(); a++ ) {
+ TemplateParamInfo::TemplateParam t;
+ t.number = a;
+ t.name = m[a].first;
+ t.def = m[a].second;
+ if ( templateParams.count() > a )
+ t.value = *templateParams[a];
+ ret.addParam( t );
+ }
+ }
+
+ return ret;
+}
+
+const LocateResult SimpleTypeCodeModel::findTemplateParam( const QString& name ) {
+ if ( m_item ) {
+ TemplateModelItem* ti = dynamic_cast<TemplateModelItem*>( & ( *m_item ) );
+ TypeDesc::TemplateParams& templateParams = m_desc.templateParams();
+ int pi = ti->findTemplateParam( name );
+ if ( pi != -1 && ( int ) templateParams.count() > pi ) {
+ return *templateParams[pi];
+ } else {
+ if ( pi != -1 && !ti->getParam( pi ).second.isEmpty() ) {
+ QString def = ti->getParam( pi ).second;
+ ifVerbose( dbg() << "\"" << str() << "\": using default-template-parameter \"" << def << "\" for " << name << endl );
+ return TypeDesc( def );
+ } else if ( pi != -1 ) {
+ ifVerbose( dbg() << "\"" << str() << "\": template-type \"" << name << "\" has no pameter! " << endl );
+ }
+ }
+ }
+ return LocateResult();
+}
+
+QStringList SimpleTypeCodeModel::getBaseStrings() {
+ Debug d( "#getbases#" );
+ if ( !d || !safetyCounter ) {
+ //ifVerbose( dbg() << "\"" << str() << "\": recursion to deep while getting bases" << endl );
+ return QStringList();
+ }
+
+ QStringList ret;
+
+ ClassModel* klass;
+
+ if ( !m_item || ( klass = dynamic_cast<ClassModel*>( & ( *m_item ) ) ) == 0 ) return ret;
+
+ QStringList parents = klass->baseClassList();
+ for ( QStringList::Iterator it = parents.begin(); it != parents.end(); ++it ) {
+ ret << *it;
+ }
+
+ return ret;
+}
+
+TypePointer SimpleTypeCodeModel::CodeModelBuildInfo::build() {
+ TypePointer tp = new SimpleTypeCachedCodeModel( m_item );
+ tp->parseParams( m_desc );
+ if ( m_parent ) tp->setParent( m_parent->bigContainer() );
+ return tp;
+}
+
+//SimpleTypeCodeModelFunction implementation
+TypeDesc SimpleTypeCodeModelFunction::getReturnType() {
+ if ( item() ) {
+ IncludeFiles files;
+ if( parent() )
+ files = parent()->getFindIncludeFiles();
+ if ( FunctionModel* m = dynamic_cast<FunctionModel*>( & ( *item() ) ) ) {
+ TypeDesc d = m->resultType();
+ d.setIncludeFiles( files );
+ return d;
+ }
+ }
+
+ return TypeDesc();
+}
+
+bool SimpleTypeCodeModelFunction::isConst() {
+ if ( asFunctionModel() )
+ return asFunctionModel()->isConstant();
+
+ return false;
+}
+
+
+QValueList<TypeDesc> SimpleTypeCodeModelFunction::getArgumentTypes() {
+ QValueList<TypeDesc> ret;
+
+ if ( item() ) {
+ IncludeFiles files;
+ if( parent() )
+ files = parent()->getFindIncludeFiles();
+ if ( FunctionModel* m = dynamic_cast<FunctionModel*>( & ( *item() ) ) ) {
+ ArgumentList l = m->argumentList();
+ for ( ArgumentList::iterator it = l.begin(); it != l.end(); ++it ) {
+ ret << TypeDesc(( *it )->type() );
+ ret.back().setIncludeFiles( files );
+ }
+ }
+ }
+
+ return ret;
+}
+
+QStringList SimpleTypeCodeModelFunction::getArgumentNames() {
+ QStringList ret;
+
+ if ( item() ) {
+ if ( FunctionModel* m = dynamic_cast<FunctionModel*>( & ( *item() ) ) ) {
+ ArgumentList l = m->argumentList();
+ for ( ArgumentList::iterator it = l.begin(); it != l.end(); ++it )
+ ret << ( *it )->name();
+ }
+ }
+
+ return ret;
+}
+
+QStringList SimpleTypeCodeModelFunction::getArgumentDefaults() {
+ QStringList ret;
+
+ if ( item() ) {
+ if ( FunctionModel* m = dynamic_cast<FunctionModel*>( & ( *item() ) ) ) {
+ ArgumentList l = m->argumentList();
+ for ( ArgumentList::iterator it = l.begin(); it != l.end(); ++it )
+ ret << ( *it )->defaultValue();
+ }
+ }
+
+ return ret;
+}
+
+
+//SimpleTypeCodeModelFunction::CodeModelFunctionBuildInfo implementation
+
+SimpleTypeCodeModelFunction::CodeModelFunctionBuildInfo::CodeModelFunctionBuildInfo( FunctionDefinitionList items, TypeDesc& desc, TypePointer parent ) : m_desc( desc ), m_parent( parent ) {
+
+ for ( FunctionDefinitionList::iterator it = items.begin(); it != items.end(); ++it ) {
+ m_items << model_cast<FunctionDom> ( *it );
+ }
+}
+
+TypePointer SimpleTypeCodeModelFunction::CodeModelFunctionBuildInfo::build() {
+ QValueList<TypePointer> ret;
+ TypePointer last;
+ for ( FunctionList::iterator it = m_items.begin(); it != m_items.end(); ++it ) {
+ TypePointer tp = new SimpleTypeCodeModelFunction( model_cast<ItemDom> ( *it ) );
+ tp->takeTemplateParams( m_desc );
+ tp->descForEdit().increaseFunctionDepth();
+ tp->setParent( m_parent->bigContainer() );
+ if ( last && last->asFunction() ) last->asFunction()->appendNextFunction( SimpleType( tp ) );
+ last = tp;
+ ret << tp;
+ }
+
+ if ( ret.isEmpty() ) {
+ ifVerbose( dbg() << "error" << endl );
+ return TypePointer();
+ } else
+ return ret.front();
+}
+
+//SimpleTypeCatalogFunction implementation
+TypeDesc SimpleTypeCatalogFunction::getReturnType() {
+ if ( tag() ) {
+ return tagType( tag() );
+ }
+
+ return TypeDesc();
+}
+
+bool SimpleTypeCatalogFunction::isConst() {
+ Tag t = tag();
+ CppFunction<Tag> tagInfo( t );
+ return tagInfo.isConst();
+}
+
+QStringList SimpleTypeCatalogFunction::getArgumentNames() {
+ QStringList ret;
+ Tag t = tag();
+ CppFunction<Tag> tagInfo( t );
+ return tagInfo.argumentNames();
+}
+
+QValueList<TypeDesc> SimpleTypeCatalogFunction::getArgumentTypes() {
+ QValueList<TypeDesc> ret;
+ Tag t = tag();
+ CppFunction<Tag> tagInfo( t );
+ QStringList arguments = tagInfo.arguments();
+ for ( QStringList::iterator it = arguments.begin(); it != arguments.end(); ++it )
+ ret << TypeDesc( *it );
+ return ret;
+}
+
+//SimpleTypeCatalogFunction::CatalogFunctionBuildInfo implementation
+
+TypePointer SimpleTypeCatalogFunction::CatalogFunctionBuildInfo::build() {
+ QValueList<TypePointer> ret;
+ TypePointer last;
+ for ( QValueList<Tag>::iterator it = m_tags.begin(); it != m_tags.end(); ++it ) {
+ TypePointer tp = new SimpleTypeCatalogFunction( *it );
+ tp->takeTemplateParams( m_desc );
+ tp->descForEdit().increaseFunctionDepth();
+ if ( m_parent ) tp->setParent( m_parent->bigContainer() );
+ if ( last && last->asFunction() ) last->asFunction()->appendNextFunction( SimpleType( tp ) );
+ last = tp;
+ ret << tp;
+ }
+
+ if ( ret.isEmpty() ) {
+ ifVerbose( dbg() << "error" << endl );
+ return TypePointer();
+ }
+ return ret.front();
+}
+
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/simpletypefunction.h b/languages/cpp/simpletypefunction.h
new file mode 100644
index 00000000..a0bd34fc
--- /dev/null
+++ b/languages/cpp/simpletypefunction.h
@@ -0,0 +1,341 @@
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef SIMPLETYPEFUNCTION_H
+#define SIMPLETYPEFUNCTION_H
+
+#include "simpletype.h"
+#include "simpletypecachebinder.h"
+#include "simpletypecatalog.h"
+
+HashedStringSet getIncludeFiles( const ItemDom& item );
+
+
+///Interface that functions should implement
+class SimpleTypeFunctionInterface {
+ public:
+
+ SimpleTypeFunctionInterface() {
+ }
+
+ SimpleTypeFunctionInterface( SimpleTypeFunctionInterface* rhs ) {
+ m_nextFunction = rhs->m_nextFunction;
+ }
+
+ void clearNextFunctions() {
+ m_nextFunction = SimpleType();
+ }
+
+ void appendNextFunction( SimpleType func );
+
+ SimpleType nextFunction() {
+ return m_nextFunction;
+ }
+
+ ///Returns the totally unresolved return-type
+ virtual TypeDesc getReturnType() = 0;
+
+ virtual QValueList<TypeDesc> getArgumentTypes() = 0;
+
+ virtual QStringList getArgumentDefaults() = 0;
+
+ virtual QStringList getArgumentNames() = 0;
+
+ virtual bool isConst() = 0;
+
+ virtual QString signature();
+
+///TODO: This function should locate the correct overloaded method in the chain, fitting the parameters
+ ///should also moved into another class then
+ SimpleTypeImpl* match( const QValueList<LocateResult>& /*params*/ ) {
+ // QValueList<TypeDesc> args = getArgumentTypes();
+ return dynamic_cast<SimpleTypeImpl*>( this );
+ }
+
+ private:
+ ///Since functions can be overloaded, many functions with the same name can exist. Other functions that belong to this one
+ ///should be appended to this.
+ SimpleType m_nextFunction;
+
+
+ protected:
+
+ bool containsUndefinedTemplateParam( TypeDesc& desc, SimpleTypeImpl::TemplateParamInfo& paramInfo );
+
+ ///Tries to match the types, filling implicit template-params into paramInfo
+ void resolveImplicitTypes( TypeDesc& argType, TypeDesc& gottenArgType, SimpleTypeImpl::TemplateParamInfo& paramInfo );
+
+ ///Tries to match the types, filling implicit template-params into paramInfo
+ void resolveImplicitTypes( TypeDesc::TemplateParams& argTypes, TypeDesc::TemplateParams& gottenArgTypes, SimpleTypeImpl::TemplateParamInfo& paramInfo );
+
+ ///Tries to match the types, filling implicit template-params into paramInfo
+ void resolveImplicitTypes( QValueList<TypeDesc>& argTypes, QValueList<TypeDesc>& gottenArgTypes, SimpleTypeImpl::TemplateParamInfo& paramInfo );
+};
+
+template <class Base=SimpleTypeImpl>
+class SimpleTypeFunction : public Base, public SimpleTypeFunctionInterface {
+public:
+ SimpleTypeFunction() : Base() {
+ }
+
+ SimpleTypeFunction( SimpleTypeFunction<Base>* rhs ) : Base( rhs ), SimpleTypeFunctionInterface( rhs ) {
+ }
+
+ template <class Type>
+ SimpleTypeFunction( Type t ) : Base( t ) {
+ }
+
+ virtual ~SimpleTypeFunction() {
+ };
+
+ virtual SimpleTypeImpl::TypePointer clone() = 0;
+
+ virtual SimpleTypeImpl::MemberInfo findMember( TypeDesc name, SimpleTypeImpl::MemberInfo::MemberType type ){
+ SimpleTypeImpl::MemberInfo ret;
+ if( type & SimpleTypeImpl::MemberInfo::Template ) {
+ TypeDesc s = Base::findTemplateParam( name.name() );
+ if( s ) {
+ ret.memberType = SimpleTypeImpl::MemberInfo::Template;
+ ret.type = s;
+ }
+ }
+
+ return ret;
+ }
+
+ virtual LocateResult applyOperator( typename Base::Operator op , QValueList<LocateResult> params ) {
+ Debug d("#apply#");
+ if( !d )
+ return LocateResult();
+
+ if( op == SimpleTypeImpl::ParenOp ) {
+ ///First, try to find an overloaded function matching the parameter-types.
+ SimpleTypeImpl* f = match( params );
+ if( f && f->asFunction() ) {
+ ifVerbose( dbg() << "applying Operator " << this->operatorToString( op ) << " to \"" << f->desc().fullNameChain() << "\"" << endl );
+
+ TypeDesc rt = f->asFunction()->getReturnType();
+ SimpleTypeImpl::TemplateParamInfo paramInfo = f->getTemplateParamInfo();
+ if( containsUndefinedTemplateParam( rt, paramInfo ) ) {
+ /** This is the place where implicit template-function-instatiation takes place.
+ * Match the given param-types with the argument-types to resolve new template-params.
+ */
+ QValueList<TypeDesc> args = getArgumentTypes();
+ QValueList<TypeDesc> paramDescs;
+ for( QValueList<LocateResult>::iterator it = params.begin(); it != params.end(); ++it )
+ paramDescs << (TypeDesc)(*it);
+ resolveImplicitTypes( args, paramDescs, paramInfo );
+ ///paramInfo now contains the information for all implicit types
+ }
+
+ return this->parent()->locateDecType( f->replaceTemplateParams( rt, paramInfo ) );
+ } else {
+ ifVerbose( dbg() << "failed to find a fitting overloaded method" << endl );
+ }
+ }
+ return Base::applyOperator( op, params );
+ }
+
+};
+
+/**
+The SimpleTypeCodeModel and SimpleTypeCatalog can represent namespaces too,
+but they only represent a REAL(physical) namespace and only within either the catalog
+or the code-model. This is a proxy-class that handles namespace-aliases, imports, and splits requests to both, the catalog, and the code-model.
+There can be multiple namespaces aliased to the same one
+*/
+
+
+class SimpleTypeCodeModel : public SimpleTypeImpl {
+public:
+
+ SimpleTypeCodeModel( SimpleTypeCodeModel* rhs ) : SimpleTypeImpl( rhs ), m_item( rhs->m_item ) {
+ }
+
+ SimpleTypeCodeModel( SimpleTypeImpl* rhs ) : SimpleTypeImpl( rhs ) {
+ init();
+ }
+
+ SimpleTypeCodeModel( const QStringList& scope ) : SimpleTypeImpl( scope ) {
+ init();
+ }
+
+ virtual bool hasNode() const {
+ return (bool)m_item;
+ };
+
+ virtual QString comment() const {
+ if( m_item ) {
+ return m_item->comment();
+ } else {
+ return "";
+ }
+ };
+
+ virtual DeclarationInfo getDeclarationInfo();
+
+ SimpleTypeCodeModel( ItemDom& item );
+
+ virtual TypePointer clone() {
+ return new SimpleTypeCachedCodeModel( this );
+ }
+
+ virtual Repository rep() {
+ return RepoCodeModel;
+ }
+
+ virtual bool isNamespace() const {
+ if( m_item ) {
+ return m_item->isNamespace();
+ } else {
+ return false;
+ }
+ };
+
+ inline ItemDom& item() {
+ return m_item;
+ }
+
+ virtual TemplateParamInfo getTemplateParamInfo();
+
+ virtual const LocateResult findTemplateParam( const QString& name );
+
+ /** In case of a class, returns all base-types */
+ virtual QStringList getBaseStrings();
+
+ ItemDom locateModelContainer( class CodeModel* m, TypeDesc t, ClassDom cnt = ClassDom() );
+
+ virtual QString specialization() const;
+
+ virtual void addAliasesTo( SimpleTypeNamespace* ns );
+
+private:
+ ItemDom m_item;
+
+ bool findItem();
+
+ void init();
+
+ //ClassDom pickMostRelated( ClassList lst, QString fn );
+
+protected:
+ SimpleTypeCodeModel() : SimpleTypeImpl() {
+ };
+
+
+ struct CodeModelBuildInfo : public TypeBuildInfo {
+ ItemDom m_item;
+ TypeDesc m_desc;
+ TypePointer m_parent;
+
+ CodeModelBuildInfo( ItemDom item, const TypeDesc& desc, TypePointer parent ) : m_item( item ), m_desc( desc ), m_parent( parent ) {
+ }
+
+ virtual TypePointer build();
+ };
+
+ virtual MemberInfo findMember( TypeDesc name , MemberInfo::MemberType type = MemberInfo::AllTypes) ;
+
+ virtual QValueList<TypePointer> getMemberClasses( const TypeDesc& name ) ;
+};
+
+
+class SimpleTypeCodeModelFunction : public SimpleTypeFunction<SimpleTypeCodeModel> {
+public:
+ SimpleTypeCodeModelFunction() : SimpleTypeFunction<SimpleTypeCodeModel>() {
+ }
+
+ SimpleTypeCodeModelFunction( SimpleTypeCodeModelFunction* rhs ) : SimpleTypeFunction<SimpleTypeCodeModel> ( rhs ) {
+ }
+
+ virtual SimpleTypeImpl::TypePointer clone() {
+ return new SimpleTypeCodeModelFunction( this );
+ }
+
+ SimpleTypeCodeModelFunction( ItemDom item ) : SimpleTypeFunction<SimpleTypeCodeModel>( item ) {
+ }
+
+ virtual TypeDesc getReturnType();
+
+ virtual bool isConst();
+
+ virtual QValueList<TypeDesc> getArgumentTypes();
+
+ virtual QStringList getArgumentNames();
+
+ virtual QStringList getArgumentDefaults();
+
+ struct CodeModelFunctionBuildInfo : public TypeBuildInfo {
+ FunctionList m_items;
+ TypeDesc m_desc;
+ TypePointer m_parent;
+
+ CodeModelFunctionBuildInfo( FunctionList items, TypeDesc& desc, TypePointer parent ) : m_items( items ), m_desc( desc ), m_parent( parent ) {
+ }
+ CodeModelFunctionBuildInfo( FunctionDefinitionList items, TypeDesc& desc, TypePointer parent );
+
+ virtual TypePointer build();
+ };
+
+private:
+ FunctionModel* asFunctionModel() {
+ if( ! &(*item() ) ) return 0;
+ return dynamic_cast<FunctionModel*>( &(*item() ) );
+ }
+
+};
+
+
+class SimpleTypeCatalogFunction : public SimpleTypeFunction<SimpleTypeCatalog> {
+public:
+ SimpleTypeCatalogFunction() : SimpleTypeFunction<SimpleTypeCatalog>() {
+ }
+
+ SimpleTypeCatalogFunction( Tag tag ) : SimpleTypeFunction<SimpleTypeCatalog>( tag ) {
+ }
+
+ SimpleTypeCatalogFunction( SimpleTypeCatalogFunction* rhs ) : SimpleTypeFunction<SimpleTypeCatalog>( rhs ) {
+ }
+
+ virtual SimpleTypeImpl::TypePointer clone() {
+ return new SimpleTypeCatalogFunction( this );
+ }
+
+ struct CatalogFunctionBuildInfo : public TypeBuildInfo {
+ QValueList<Tag> m_tags;
+ TypeDesc m_desc;
+ TypePointer m_parent;
+
+ CatalogFunctionBuildInfo( QValueList<Tag> tags, TypeDesc& desc, TypePointer parent ) : m_tags( tags ), m_desc( desc ), m_parent( parent ) {
+ }
+
+ virtual TypePointer build();
+ };
+
+ virtual TypeDesc getReturnType();
+
+ virtual bool isConst ();
+
+ virtual QStringList getArgumentDefaults() {
+ return QStringList();
+ }
+
+ virtual QStringList getArgumentNames();
+
+ virtual QValueList<TypeDesc> getArgumentTypes();
+};
+
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/simpletypenamespace.cpp b/languages/cpp/simpletypenamespace.cpp
new file mode 100644
index 00000000..2ae35401
--- /dev/null
+++ b/languages/cpp/simpletypenamespace.cpp
@@ -0,0 +1,438 @@
+/***************************************************************************
+copyright : (C) 2006 by David Nolden
+email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include <qtl.h>
+#include <typeinfo>
+#include "simpletypenamespace.h"
+#include "simpletypecachebinder.h"
+
+#include "safetycounter.h"
+
+//#define PHYSICAL_IMPORT
+//Necessary, because else nested members cannot search the correct scope
+#define PHYSICALLY_IMPORT_NAMESPACES
+
+extern SafetyCounter safetyCounter;
+
+//SimpleTypeNamespace implementation
+
+TypePointer SimpleTypeNamespace::clone() {
+ return new SimpleTypeCachedNamespace( this );
+}
+
+SimpleTypeNamespace::SimpleTypeNamespace( const QStringList& fakeScope, const QStringList& realScope ) : SimpleTypeImpl( fakeScope ), m_currentSlaveId(0) {
+ ifVerbose( dbg() << "\"" << str() << "\": created namespace-proxy with real scope \"" << realScope.join( "::" ) << "\"" << endl );
+ SimpleType cm = SimpleType( realScope, HashedStringSet(), RepoCodeModel );
+ SimpleType ct = SimpleType( realScope, HashedStringSet(), RepoCatalog );
+ cm = SimpleType( cm->clone() );
+ ct = SimpleType( ct->clone() );
+ cm->setMasterProxy( this );
+ ct->setMasterProxy( this );
+ addImport( cm->desc() );
+ addImport( ct->desc() );
+}
+
+SimpleTypeNamespace::SimpleTypeNamespace( const QStringList& fakeScope ) : SimpleTypeImpl( fakeScope ), m_currentSlaveId(0) {
+ ifVerbose( dbg() << "\"" << str() << "\": created namespace-proxy" << endl );
+}
+
+SimpleTypeNamespace::SimpleTypeNamespace( SimpleTypeNamespace* ns ) : SimpleTypeImpl( ns ), m_currentSlaveId(0) {
+ ifVerbose( dbg() << "\"" << str() << "\": cloning namespace" << endl );
+ m_aliases = ns->m_aliases;
+ m_activeSlaves = ns->m_activeSlaves;
+ m_activeSlaveGroups = ns->m_activeSlaveGroups;
+}
+
+void SimpleTypeNamespace::breakReferences() {
+ m_aliases.clear();
+ m_activeSlaves.clear();
+ SimpleTypeImpl::breakReferences();
+}
+
+
+SimpleTypeImpl::MemberInfo SimpleTypeNamespace::findMember( TypeDesc name, MemberInfo::MemberType type ) {
+ std::set<HashedString> ignore;
+ SimpleTypeImpl::MemberInfo ret = findMember( name, type, ignore );
+///chooseSpecialization( ret ); should not be necessary
+ return ret;
+}
+
+QValueList<TypePointer> SimpleTypeNamespace::getMemberClasses( const TypeDesc& name ) {
+ std::set<HashedString> ignore;
+
+ return getMemberClasses( name, ignore );
+}
+
+QValueList<TypePointer> SimpleTypeNamespace::getMemberClasses( const TypeDesc& name, std::set<HashedString>& ignore ) {
+ HashedString myName = HashedString( scope().join( "::" ) +"%"+typeid( *this ).name() );
+ if ( ignore.find( myName ) != ignore.end() || !safetyCounter )
+ return QValueList<TypePointer>();
+
+ ignore.insert( myName );
+
+ QValueList<TypePointer> ret;
+
+ SlaveList l = getSlaves( name.includeFiles() );
+ for ( SlaveList::iterator it = l.begin(); it != l.end(); ++it ) {
+ if (( *it ).first.first.resolved() ) {
+ SimpleTypeNamespace* ns = dynamic_cast<SimpleTypeNamespace*>(( *it ).first.first.resolved().data() );
+ if ( !ns ) {
+ HashedString thatName = HashedString(( *it ).first.first.resolved()->scope().join( "::" ) +"%"+typeid( *( *it ).first.first.resolved() ).name() );
+ if ( ignore.find( thatName ) != ignore.end() ) continue;
+ ignore.insert( thatName );
+ ret += ( *it ).first.first.resolved()->getMemberClasses( name );
+ } else {
+ ret += ns->getMemberClasses( name, ignore );
+
+ }
+
+ }
+ }
+
+ return ret;
+}
+
+SimpleTypeImpl::MemberInfo SimpleTypeNamespace::findMember( TypeDesc name, MemberInfo::MemberType type, std::set
+ <HashedString>& ignore ) {
+ MemberInfo mem;
+ mem.name = "";
+ mem.memberType = MemberInfo::NotFound;
+ HashedString myName = HashedString( scope().join( "::" ) +"%"+typeid( *this ).name() );
+ if ( ignore.find( myName ) != ignore.end() || !safetyCounter )
+ return mem;
+ ignore.insert( myName );
+
+ SlaveList l = getSlaves( name.includeFiles() );
+
+ ImportList m_aliasImports;
+
+ AliasMap::iterator itt = m_aliases.find( name.name() );
+
+ if ( itt != m_aliases.end() && !( *itt ).empty() ) {
+ ifVerbose( dbg() << "\"" << str() << "\": namespace-sub-aliases \"" << name.name() << "\"" << "\" requested, locating targets" << endl );
+
+ for ( ImportList::iterator it = ( *itt ).begin(); it != ( *itt ).end(); ++it ) {
+ if ( !( /*name.includeFiles().size() < 1 ||*/ ( *it ).files <= name.includeFiles() ) ) continue; //filter the slave by the include-files
+
+ ifVerbose( dbg() << "\"" << str() << "\": namespace-sub-aliases \"" << name.name() << "\": taking target \"" << ( *it ).import.fullNameChain() << "\"" << endl );
+ /*TypeDesc d( (*it).import );
+ d.setIncludeFiles( name.includeFiles() );*/
+ m_aliasImports.insert( *it ); //@todo: what include-files should be used for searching the namespace?
+ /*LocateResult l = locateDecType( d, SimpleTypeImpl::Normal, 0, SimpleTypeImpl::MemberInfo::Namespace );
+ if ( !l || !l->resolved() || !dynamic_cast<SimpleTypeNamespace*>( l->resolved().data() ) ) {
+ ifVerbose( dbg() << "\"" << str() << "\": namespace-sub-aliases \"" << name.name() << "\" -> \"" << ( *it ).import.fullNameChain() << "\" could not be resolved" << endl );
+ } else {
+ m_aliasImports.insert( Import( d.includeFiles(), l, this ) );
+ }*/
+ }
+ }
+
+ for ( SlaveList::iterator it = l.begin(); it != l.end(); ++it ) {
+ if ( !( *it ).first.first.resolved() )
+ continue;
+ if ( ignore.find( HashedString(( *it ).first.first.resolved()->scope().join( "::" ) +"%"+ typeid( *( *it ).first.first.resolved() ).name() ) ) != ignore.end() ) continue;
+
+ ifVerbose( dbg() << "\"" << str() << "\": redirecting search for \"" << name.name() << "\" to \"" << ( *it ) .first.first.fullNameChain() << "\"" << endl );
+ if ( !( *it ).first.first.resolved() ) {
+ ifVerbose( dbg() << "\"" << str() << "\": while search for \"" << name.name() << "\": Imported namespace \"" << ( *it ) .first.first.fullNameChain() << "\" is not resolved(should have been resolved in updateAliases)" << endl );
+ continue;
+ }
+ ifVerbose( dbg() << "\"Class-type: " << typeid( *( *it ).first.first.resolved().data() ).name() << ")" << endl );
+ SimpleTypeNamespace* ns = dynamic_cast<SimpleTypeNamespace*>(( *it ).first.first.resolved().data() );
+
+ if ( ns )
+ mem = ns->findMember( name , type, ignore );
+ else
+ mem = ( *it ).first.first.resolved()->findMember( name, type );
+
+ if ( mem ) {
+ if ( mem.memberType != MemberInfo::Namespace ) {
+#ifdef PHYSICAL_IMPORT
+ TypePointer b = mem.build();
+ if ( b && !( b->parent()->masterProxy().data() == this ) ) {
+ b = b ->clone(); //expensive, cache is not shared
+ b->setParent( this );
+
+ mem.setBuilt( b );
+ }
+#else
+ if( mem.memberType == MemberInfo::NestedType )
+ chooseSpecialization( mem );
+ TypePointer b = mem.build();
+ if( b && b->parent() && b->parent()->masterProxy().data() == this )
+ b->setParent( this );
+#endif
+ return mem;
+ } else {
+ TypePointer b = mem.build();
+
+ if ( b )
+ m_aliasImports.insert( Import( IncludeFiles(), b->desc(), TypePointer() ) );
+ else
+ ifVerbose( dbg() << "\"" << str() << "\": found namespace \"" << name.name() << "\", but it is not resolved" << endl );
+ }
+ }
+ }
+
+ if ( !m_aliasImports.empty() ) {
+ return setupMemberInfo( name.fullNameList().join( "::" ), m_aliasImports );
+
+ }
+
+ return mem;
+}
+
+// LocateResult SimpleTypeNamespace::locateSlave( const SlaveList::const_iterator& target, const IncludeFiles& includeFiles ) {
+// for( SlaveList::const_iterator it = m_activeSlaves.begin(); it != target; ++it ) {
+//
+// }
+// }
+
+SimpleTypeImpl::MemberInfo SimpleTypeNamespace::setupMemberInfo( const QStringList& subName, const ImportList& imports ) {
+ MemberInfo mem;
+ mem.name = subName.join( "::" );
+ mem.memberType = MemberInfo::NotFound;
+ QStringList sc = scope();
+ sc += subName;
+ mem.type = sc.join( "::" );
+ mem.memberType = MemberInfo::Namespace;
+ mem.setBuildInfo( new NamespaceBuildInfo( sc, imports ) );
+ return mem;
+}
+
+///This must be optimized
+void SimpleTypeNamespace::addAliasMap( const TypeDesc& name, const TypeDesc& alias, const IncludeFiles& files, bool recurse, bool symmetric, const TypePointer& perspective ) {
+ Debug db;
+ if ( !db ) {
+ kdDebug( 9007 ) << str() << " addAliasMap: cannot add alias \"" << name.fullNameChain() << "\" -> \"" << alias.fullNameChain() << "\", recursion too deep" << endl;
+ return ;
+ }
+ if ( name.next() ) kdDebug( 9007 ) << "addAliasMap warning: type-alias-name has order higher than one: " << name.fullNameChain() << ", only " << name.name() << " will be used" << endl;
+ if ( name == alias )
+ return ;
+
+ if ( symmetric )
+ addAliasMap( alias, name, files, recurse, false );
+
+ invalidateSecondaryCache();
+ invalidatePrimaryCache( true ); //Only not-found items are cleared updated here for performance-reasons(found items will stay cached)
+
+ AliasMap::iterator it = m_aliases.find( name.name() );
+ if ( it == m_aliases.end() )
+ it = m_aliases.insert( name.name(), ImportList() );
+
+ Import a( files, alias, perspective );
+ std::pair< ImportList::const_iterator, ImportList::const_iterator > rng = ( *it ).equal_range( a );
+ while ( rng.first != rng.second ) {
+ if ( rng.first->files == files )
+ return ; //The same alias, with the same files, has already been added.
+ ++rng.first;
+ }
+
+ ( *it ).insert( a );
+ ifVerbose( dbg() << "\"" << str() << "\": adding namespace-alias \"" << name.name() << ( !symmetric ? "\" -> \"" : "\" = \"" ) << alias.name() << "\" files:\n[ " << files.print().c_str() << "]\n" << endl );
+ ifVerbose( if ( alias.resolved() ) dbg() << "Resolved type of the imported namespace: " << typeid( *alias.resolved() ).name() );
+
+ if ( name.name().isEmpty() ) {
+ addImport( alias, files, perspective );
+ }
+}
+
+std::set<size_t> SimpleTypeNamespace::updateAliases( const IncludeFiles& files/*, bool isRecursion */) {
+ std::set<size_t> possibleSlaves;
+ if ( m_activeSlaves.empty() || !safetyCounter.ok() ) return possibleSlaves;
+// if( !isRecursion ) {
+// ///Test the cache
+// SlavesCache::const_iterator it = m_slavesCache.find( files );
+// if( it != m_slavesCache.end() && it->second.first == m_slavesCache.size() ) return; ///The cache already contains a valid entry, and the work is done
+// }
+
+ m_activeSlaveGroups.findGroups( files, possibleSlaves );
+ if( possibleSlaves.empty() ) return possibleSlaves;
+
+ std::list<size_t> disabled;
+ for( std::set<size_t>::const_reverse_iterator it = possibleSlaves.rbegin(); it != possibleSlaves.rend(); ++it ) {
+ //Disable all slaves with higher ids
+ SlaveMap::iterator current = m_activeSlaves.find( *it );
+ if( current == m_activeSlaves.end() ) {
+ kdDebug( 9007 ) << "ERROR" << endl;
+ }
+
+ SlaveDesc& d( current->second );
+
+ if ( !d.first.first.resolved() ) {
+ for( SlaveMap::const_iterator itr = current; itr != m_activeSlaves.end(); ++it ) {
+ if( m_activeSlaveGroups.isDisabled( itr->first ) ) break; //stop searching when hitting the first disabled one(assuming that all behind are disabled too)
+ disabled.push_back( itr->first );
+ m_activeSlaveGroups.disableSet( itr->first );
+ }
+
+ TypeDesc descS = d.first.first;
+ TypePointer p = d.second; //perspective
+
+ HashedStringSet importIncludeFiles = d.first.second;
+
+ if ( !p ) p = this;
+
+ TypeDesc desc = p->locateDecType( descS, SimpleTypeImpl::Normal, 0, SimpleTypeImpl::MemberInfo::Namespace );
+ if ( !desc.resolved() ) {
+ ///If the namespace could not be found, help out by including the include-files of the current search
+ descS.setIncludeFiles( descS.includeFiles() + files );
+ desc = p->locateDecType( descS, SimpleTypeImpl::Normal, 0, SimpleTypeImpl::MemberInfo::Namespace );
+ }
+ if ( desc.resolved() ) {
+ ///If exactly the same namespace was already imported use the earlier imported instance, so they can share a single cache
+ ///@todo make more efficient.
+ for ( SlaveMap::const_iterator it = m_activeSlaves.begin(); it != m_activeSlaves.end(); ++it ) {
+ if (( *it ).second.first.first.resolved() && ( *it ).second.first.first.resolved()->scope() == desc.resolved()->scope() && typeid( *( *it ).second.first.first.resolved().data() ) == typeid( desc.resolved().data() ) ) {
+ desc.setResolved(( *it ).second.first.first.resolved() );
+ break;
+ }
+ }
+#ifdef PHYSICALLY_IMPORT_NAMESPACES
+ if ( desc.resolved()->masterProxy().data() != this ) {
+ desc.setResolved( desc.resolved()->clone() ); //expensive, cache is not shared
+ desc.resolved()->setMasterProxy( this ); //Possible solution: don't use this, simply set the parents of all found members correctly
+ }
+#endif
+ d.first.first = desc;
+ }
+ }
+ }
+
+ for( std::list<size_t>::const_iterator it = disabled.begin(); it != disabled.end(); ++it ) {
+ m_activeSlaveGroups.enableSet( *it );
+ }
+
+ return possibleSlaves;
+}
+
+
+void SimpleTypeNamespace::addAliases( QString map, const IncludeFiles& files ) {
+ while ( !map.isEmpty() ) {
+ int mid = map.find( "=" );
+ int mid2 = map.find( "<<" );
+ int found = mid;
+ int len = 1;
+ if ( mid2 != -1 && ( mid2 < found || found == -1 ) ) {
+ found = mid2;
+ len = 2;
+ }
+ if ( found == -1 )
+ break;
+
+ int end = map.find( ";", found + len );
+ if ( end == -1 ) {
+ //break;
+ end = map.length();
+ }
+ if ( end - ( found + len ) < 0 )
+ break;
+
+ addAliasMap( map.left( found ).stripWhiteSpace(), map.mid( found + len, end - found - len ).stripWhiteSpace(), files, true, found == mid );
+ map = map.mid( end + 1 );
+ }
+}
+
+void SimpleTypeNamespace::invalidatePrimaryCache( bool onlyNegative ) {
+ //m_slavesCache.clear();
+ SimpleTypeImpl::invalidatePrimaryCache( onlyNegative );
+}
+
+void SimpleTypeNamespace::addImport( const TypeDesc& import, const IncludeFiles& files, TypePointer perspective ) {
+ //ifVerbose( dbg() << "
+ if ( !perspective ) perspective = this;
+ invalidateCache();
+ TypeDesc d = import;
+ if ( d.resolved() ) {
+ #ifdef PHYSICALLY_IMPORT_NAMESPACES
+
+ if( d.resolved()->masterProxy().data() != this ) {
+ d.setResolved( d.resolved()->clone() ); //Expensive because of lost caching, think about how necessary this is
+ d.resolved()->setMasterProxy( this );
+ }
+ #endif
+ }
+
+ m_activeSlaves[ ++m_currentSlaveId ] = std::make_pair( std::make_pair( d, files ) , perspective );
+ m_activeSlaveGroups.addSet( m_currentSlaveId, files );
+
+ if( d.resolved() ) ///Must be called after the above, because it may insert new slaves, and the order in m_activeSlaves MUST be preserved
+ d.resolved()->addAliasesTo( this );
+}
+
+bool SimpleTypeNamespace::hasNode() const {
+ return true;
+}
+
+SimpleTypeNamespace::SlaveList SimpleTypeNamespace::getSlaves( const IncludeFiles& files ) {
+ /* ///Test the cache
+ SlavesCache::const_iterator it = m_slavesCache.find( files );
+ if( it != m_slavesCache.end() && it->second.first == m_activeSlaves.size() ) return it->second.second; ///The cache already contains a valid entry, and the work is done*/
+
+ std::set<size_t> allSlaves = updateAliases( files );
+ SlaveList ret;
+#ifdef IMPORT_DEBUG
+ for ( SlaveList::const_iterator it = m_activeSlaves.begin(); it != m_activeSlaves.end(); ++it ) {
+#ifdef IMPORT_DEBUG
+ ifVerbose( dbg() << "\"" << str() << "\": Checking whether \"" << (*it).second.first.first.fullNameChain() << "\" should be imported, current include-files: " << files.print().c_str() << "\nNeeded include-files: " << (*it).second.first.second.print().c_str() << "\n"; )
+#endif
+ if ( !(( *it ).second.first.second <= files ) ) {
+#ifdef IMPORT_DEBUG
+ ifVerbose( dbg() << "not imported." );
+#endif
+ continue;
+ }
+#ifdef IMPORT_DEBUG
+ ifVerbose( dbg() << "imported." << endl );
+#endif
+ ret.push_back( *it.second );
+ }
+#else
+ ifVerbose( dbg() << str() << " getSlaves() called for \n[ " << files.print().c_str() << endl );
+
+ for( std::set<size_t>::const_iterator it = allSlaves.begin(); it != allSlaves.end(); ++it ) {
+ SlaveMap::const_iterator itr = m_activeSlaves.find( *it );
+ if( itr != m_activeSlaves.end() ) {
+ ifVerbose( dbg() << str() << "getSlaves() returning " << (*itr).second.first.first.fullNameChain() << endl );
+ ret.push_back( (*itr).second );
+ } else {
+ kdDebug( 9007 ) << "ERROR in getSlaves()";
+ }
+ }
+#endif
+ /*if( it == m_slavesCache.end() || it->second.first < m_activeSlaves.size()
+ ) {
+ m_slavesCache.insert( std::make_pair( files, std::make_pair( m_activeSlaves.size(), ret ) ) );
+ }*/
+ return ret;
+}
+
+//SimpleTypeNamespace::NamespaceBuildInfo implementation
+
+TypePointer SimpleTypeNamespace::NamespaceBuildInfo::build() {
+ if ( m_built )
+ return m_built;
+ m_built = new SimpleTypeCachedNamespace( m_fakeScope );
+ for ( ImportList::iterator it = m_imports.begin(); it != m_imports.end(); ++it ) {
+ TypeDesc i = ( *it ).import;
+ if ( i.resolved() ) {
+ // i.setResolved( i.resolved()->clone() );
+ }
+
+ (( SimpleTypeCachedNamespace* ) m_built.data() ) ->addAliasMap( TypeDesc(), i, ( *it ).files, true, false, ( *it ).perspective );
+ }
+ return m_built;
+}
+
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/simpletypenamespace.h b/languages/cpp/simpletypenamespace.h
new file mode 100644
index 00000000..169c4548
--- /dev/null
+++ b/languages/cpp/simpletypenamespace.h
@@ -0,0 +1,165 @@
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef SIMPLETYPENAMESPACE_H
+#define SIMPLETYPENAMESPACE_H
+
+#include<hashedstring.h>
+#include "simpletype.h"
+#include "includefiles.h"
+#include <set>
+#include <ext/hash_map>
+#include <list>
+
+class SimpleTypeNamespace : public SimpleTypeImpl {
+ public:
+
+ struct Import {
+ Import( const TypeDesc& _import, const TypePointer& persp ) : import( _import ), perspective( persp ) {}
+
+ Import( const IncludeFiles& _files, const TypeDesc& _import, const TypePointer& persp ) : files( _files ), import( _import ), perspective( persp ) {}
+
+ ///Does not respect the include-file-list, only the import-name is compared
+ bool operator < ( const Import& rhs ) const {
+ return import.name() < rhs.import.name();
+ }
+
+ ///Does not respect the include-file-list, only the import-name is compared
+ bool operator == ( const Import& rhs ) const {
+ return import.name() == rhs.import.name();
+ }
+
+ IncludeFiles files;
+ TypeDesc import;
+ TypePointer perspective; //From where the import should be searched
+ /*
+ bool operator < ( const Alias& rhs ) const {
+ if( alias < rhs.alias ) return true;
+ return false;
+ }
+
+ bool operator == ( const Alias& rhs ) const {
+ return alias == rhs.alias && files == rhs.files;
+ }*/
+
+ };
+
+ //First.first is the desc(including include-file-information for searching), first.second is the set of include-files that activate this import, second is the perspective in which to search
+ typedef std::pair<std::pair<TypeDesc, IncludeFiles>, TypePointer> SlaveDesc;
+ typedef std::list<SlaveDesc> SlaveList;
+ //Maps IDs to slaves
+ typedef std::map<size_t, SlaveDesc> SlaveMap;
+
+ typedef std::multiset<Import> ImportList;
+
+ SimpleTypeNamespace( const QStringList& fakeScope, const QStringList& realScope );
+
+ SimpleTypeNamespace( const QStringList& fakeScope );
+
+ SimpleTypeNamespace( SimpleTypeNamespace* ns );
+
+ bool isANamespace( SimpleTypeImpl* t ) {
+ return dynamic_cast<SimpleTypeNamespace*>( t ) != 0;
+ }
+
+ virtual TypePointer clone();
+
+ ///Returns a list of all slave-namespaces that have an effect with the given set of include-files. Some of the returned type-descs may be unresolved, in case they could not be resolved.
+ SlaveList getSlaves( const IncludeFiles& includeFiles );
+
+ /**empty name means an import.
+ * @param files Set of files that must be included for this alias-map to be active. If the set is empty, the alias will be used globally.
+ * @param alias The type to import. May contain the include-file-set to search with.
+ * @param perspective The point from which to search for the item on demand
+ */
+ void addAliasMap( const TypeDesc& name, const TypeDesc& alias , const IncludeFiles& files = IncludeFiles(), bool recurse = true, bool symmetric = false, const TypePointer& perspective = TypePointer() );
+
+ /**Takes a map of multiple aliases in form "A=B;C=D;....;" similar to the C++ "namespace A=B;" statement
+ * @param files Set of files that must be included for this alias-map to be active. If the set is empty, the alias will be used globally.
+ */
+ void addAliases( QString map, const IncludeFiles& files = IncludeFiles() );
+
+ private:
+ SlaveMap m_activeSlaves;
+ size_t m_currentSlaveId;
+ HashedStringSetGroup m_activeSlaveGroups;
+ typedef QMap<QString, ImportList> AliasMap;
+ AliasMap m_aliases;
+
+ //Inserts all aliases necessary fo handling a request using the given IncludeFiles
+ std::set<size_t> updateAliases( const IncludeFiles& files/*, bool isRecursion = false */);
+
+// LocateResult locateSlave( const SlaveList::const_iterator& it, const IncludeFiles& includeFiles );
+
+ void addImport( const TypeDesc& import, const IncludeFiles& files = IncludeFiles(), TypePointer perspective = TypePointer() );
+
+ friend class NamespaceBuildInfo;
+
+ struct NamespaceBuildInfo : public TypeBuildInfo {
+ QStringList m_fakeScope;
+ ImportList m_imports;
+ TypePointer m_built;
+
+
+ NamespaceBuildInfo( QStringList fakeScope, const ImportList& imports ) {
+ m_fakeScope = fakeScope;
+ m_imports = imports;
+ }
+
+ virtual TypePointer build();
+ };
+
+ explicit SimpleTypeNamespace( const SimpleTypeNamespace& rhs ) {}
+
+ protected:
+
+ //void updateAliases( const HashedStringSet& files );
+
+ SimpleTypeImpl::MemberInfo findMember( TypeDesc name, MemberInfo::MemberType type, std::set<HashedString>& ignore );
+
+ virtual void breakReferences();
+
+ virtual bool hasNode() const;
+
+ virtual bool isNamespace() const {
+ return true;
+ }
+
+ virtual void invalidatePrimaryCache( bool onlyNegative = false );
+
+ virtual MemberInfo findMember( TypeDesc name, MemberInfo::MemberType type = MemberInfo::AllTypes );
+
+ virtual QValueList<TypePointer> getMemberClasses( const TypeDesc& name ) ;
+
+ private:
+ struct HashedStringHasher {
+ size_t operator () ( const HashedStringSet& s ) const {
+ return s.hash();
+ }
+ };
+ //Maps from HashedStringSet to the count of slaves when the item was cached, and the SlaveList
+// typedef __gnu_cxx::hash_map<HashedStringSet, std::pair<size_t, SlaveList>, HashedStringHasher> SlavesCache;
+ //SlavesCache m_slavesCache;
+ QValueList<TypePointer> getMemberClasses( const TypeDesc& name, std::set<HashedString>& ignore ) ;
+
+ MemberInfo setupMemberInfo( const QStringList& subName, const ImportList& imports );
+
+ //TypePointer locateNamespace( const TypeDesc& alias );
+
+ //void recurseAliasMap() ;
+};
+
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/store_walker.cpp b/languages/cpp/store_walker.cpp
new file mode 100644
index 00000000..cd66dd23
--- /dev/null
+++ b/languages/cpp/store_walker.cpp
@@ -0,0 +1,1081 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#include "store_walker.h"
+#include "ast_utils.h"
+#include "urlutil.h"
+#include "driver.h"
+
+#include <kdebug.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+
+StoreWalker::StoreWalker( const QString& fileName, CodeModel* store )
+: m_store( store ), m_anon( 0 )
+{
+ m_fileName = URLUtil::canonicalPath( fileName );
+ m_hashedFileName = HashedString( m_fileName );
+
+ //kdDebug(9007) << "StoreWalker::StoreWalker(" << m_fileName << ")" << endl;
+}
+
+StoreWalker::~StoreWalker()
+{}
+
+
+void StoreWalker::parseTranslationUnit( const ParsedFile& ast )
+{
+ m_file = m_store->create<FileModel>();
+ m_file->setName( m_fileName ); /// @todo ?!?
+
+ m_currentScope.clear();
+ m_currentNamespace.clear();
+ m_currentClass.clear();
+
+ ParsedFilePointer p = new ParsedFile( ast );
+ p->setTranslationUnit( 0 ); //Necessary so the memory is not bloated after the first parse
+ m_file->setParseResult( p.data() ); ///@todo beautify
+
+ m_currentAccess = CodeModelItem::Public;
+ m_inSlots = false;
+ m_inSignals = false;
+ m_inStorageSpec = false;
+ m_inTypedef = false;
+ m_currentDeclarator = 0;
+ m_anon = 0;
+ m_imports.clear();
+
+ m_imports << QPair<QMap<QString, ClassDom>, QStringList>(QMap<QString, ClassDom>(), QStringList());
+ TreeParser::parseTranslationUnit( ast );
+ m_imports.pop_back();
+}
+
+void StoreWalker::parseDeclaration( DeclarationAST* ast )
+{
+ TreeParser::parseDeclaration( ast );
+}
+
+void StoreWalker::parseLinkageSpecification( LinkageSpecificationAST* ast )
+{
+ int inStorageSpec = m_inStorageSpec;
+ m_inStorageSpec = true;
+ TreeParser::parseLinkageSpecification( ast );
+ m_inStorageSpec = inStorageSpec;
+}
+
+void StoreWalker::parseNamespace( NamespaceAST* ast )
+{
+ if ( !m_currentClass.isEmpty() )
+ {
+ kdDebug( 9007 ) << "!!!!!!!!!!!!!!!!!!!!!!!!!! **error** !!!!!!!!!!!!!!!!!!!!" << endl;
+ return ;
+ }
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+ ast->getStartPosition( &startLine, &startColumn );
+ ast->getEndPosition( &endLine, &endColumn );
+
+ QString nsName;
+ if ( !ast->namespaceName() || ast->namespaceName()->text().isEmpty() )
+ {
+ QFileInfo fileInfo( m_fileName );
+ QString shortFileName = fileInfo.baseName();
+
+ nsName.sprintf( "(%s_%d)", shortFileName.local8Bit().data(), m_anon++ );
+ }
+ else
+ {
+ nsName = ast->namespaceName() ->text();
+ }
+
+ NamespaceDom ns = findOrInsertNamespace( ast, nsName );
+
+ m_currentScope.push_back( nsName );
+ m_currentNamespace.push( ns );
+
+ TreeParser::parseNamespace( ast );
+
+ m_currentNamespace.pop();
+ m_currentScope.pop_back();
+}
+
+void StoreWalker::parseNamespaceAlias( NamespaceAliasAST* ast )
+{
+ QString nsName;
+ QString aliasName;
+
+ if( !ast->namespaceName() || ast->namespaceName()->text().isEmpty() )
+ {
+ // anonymous namespace
+ }
+ else
+ nsName = ast->namespaceName()->text();
+
+ if( ast->aliasName() )
+ aliasName = ast->aliasName()->text();
+
+
+ if( !nsName.isNull() ) {
+ NamespaceAliasModel m;
+ m.setName( nsName );
+ m.setAliasName( aliasName );
+ m.setFileName( m_hashedFileName );
+ if( m_currentNamespace.empty() )
+ m_file->addNamespaceAlias( m );
+ else
+ m_currentNamespace.top() ->addNamespaceAlias( m );
+ }
+
+ TreeParser::parseNamespaceAlias( ast );
+}
+
+void StoreWalker::parseUsing( UsingAST* ast )
+{
+ TreeParser::parseUsing( ast );
+}
+
+void StoreWalker::parseUsingDirective( UsingDirectiveAST* ast )
+{
+ QString name;
+ if( ast->name() )
+ name = ast->name()->text();
+
+ if( !name.isNull() ) {
+ NamespaceImportModel m;
+ m.setName( name );
+ m.setFileName( m_hashedFileName );
+ if( m_currentNamespace.empty() )
+ m_file->addNamespaceImport( m );
+ else
+ m_currentNamespace.top() ->addNamespaceImport( m );
+ }
+
+ m_imports.back().second.push_back( name );
+}
+
+void StoreWalker::parseTypedef( TypedefAST* ast )
+{
+#if 0
+ DeclaratorAST * oldDeclarator = m_currentDeclarator;
+
+ if ( ast && ast->initDeclaratorList() && ast->initDeclaratorList() ->initDeclaratorList().count() > 0 )
+ {
+ QPtrList<InitDeclaratorAST> lst( ast->initDeclaratorList() ->initDeclaratorList() );
+ m_currentDeclarator = lst.at( 0 ) ->declarator();
+ }
+
+ m_inTypedef = true;
+
+ TreeParser::parseTypedef( ast );
+
+ m_inTypedef = false;
+ m_currentDeclarator = oldDeclarator;
+#else
+
+ TypeSpecifierAST* typeSpec = ast->typeSpec();
+ InitDeclaratorListAST* declarators = ast->initDeclaratorList();
+
+ if ( typeSpec && declarators )
+ {
+ QString typeId;
+
+ if ( typeSpec->name() )
+ typeId = typeSpec->name() ->text();
+
+ QPtrList<InitDeclaratorAST> l( declarators->initDeclaratorList() );
+ QPtrListIterator<InitDeclaratorAST> it( l );
+
+ InitDeclaratorAST* initDecl = 0;
+ while ( 0 != ( initDecl = it.current() ) )
+ {
+
+ QString type, id;
+ if ( initDecl->declarator() )
+ {
+ type = typeOfDeclaration( typeSpec, initDecl->declarator() );
+
+ DeclaratorAST* d = initDecl->declarator();
+ while ( d->subDeclarator() )
+ {
+ d = d->subDeclarator();
+ }
+
+ if ( d->declaratorId() )
+ id = d->declaratorId() ->text();
+ }
+
+ TypeAliasDom typeAlias = m_store->create<TypeAliasModel>();
+ typeAlias->setFileName( m_fileName );
+ typeAlias->setName( id );
+ typeAlias->setType( type );
+ typeAlias->setComment( ast->comment() );
+
+ int line, col;
+ initDecl->getStartPosition( &line, &col );
+ typeAlias->setStartPosition( line, col );
+
+ initDecl->getEndPosition( &line, &col );
+ typeAlias->setEndPosition( line, col );
+
+ if ( m_currentClass.top() )
+ m_currentClass.top() ->addTypeAlias( typeAlias );
+ else if ( m_currentNamespace.top() )
+ m_currentNamespace.top() ->addTypeAlias( typeAlias );
+ else
+ m_file->addTypeAlias( typeAlias );
+
+#if 0
+
+ Tag tag;
+ tag.setKind( Tag::Kind_Typedef );
+ tag.setFileName( m_fileName );
+ tag.setName( id );
+ tag.setScope( m_currentScope );
+ tag.setAttribute( "t", type );
+ int line, col;
+ initDecl->getStartPosition( &line, &col );
+
+ tag.setStartPosition( line, col );
+
+ initDecl->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ m_catalog->addItem( tag );
+#endif
+
+ ++it;
+ }
+
+ }
+#endif
+}
+
+void StoreWalker::parseTemplateDeclaration( TemplateDeclarationAST* ast )
+{
+ m_currentTemplateDeclarator.push( ast );
+ if ( ast->declaration() )
+ parseDeclaration( ast->declaration() );
+
+
+
+ TreeParser::parseTemplateDeclaration( ast );
+
+ m_currentTemplateDeclarator.pop();
+}
+
+void StoreWalker::parseSimpleDeclaration( SimpleDeclarationAST* ast )
+{
+ TypeSpecifierAST * typeSpec = ast->typeSpec();
+ InitDeclaratorListAST* declarators = ast->initDeclaratorList();
+ CommentPusher push( *this, ast->comment() );
+
+ if ( typeSpec )
+ parseTypeSpecifier( typeSpec );
+
+ if ( declarators )
+ {
+ QPtrList<InitDeclaratorAST> l = declarators->initDeclaratorList();
+
+ QPtrListIterator<InitDeclaratorAST> it( l );
+ while ( it.current() )
+ {
+ parseDeclaration( ast->functionSpecifier(), ast->storageSpecifier(),
+ typeSpec, it.current() );
+ ++it;
+ }
+ }
+}
+
+
+QStringList StoreWalker::findScope( const QStringList& scope ) {
+ ClassDom d = findClassFromScope( scope );
+
+ if( d ) {
+ QStringList ret = d->scope();
+ ret << d->name();
+ return ret;
+ }
+
+ return scope;
+}
+
+
+void StoreWalker::parseFunctionDefinition( FunctionDefinitionAST* ast )
+{
+ TypeSpecifierAST * typeSpec = ast->typeSpec();
+ GroupAST* funSpec = ast->functionSpecifier();
+ GroupAST* storageSpec = ast->storageSpecifier();
+
+ if ( !ast->initDeclarator() )
+ return ;
+
+ DeclaratorAST* d = ast->initDeclarator() ->declarator();
+
+ if ( !d->declaratorId() )
+ return ;
+
+ bool isFriend = false;
+ bool isVirtual = false;
+ bool isStatic = false;
+ bool isInline = false;
+
+ if ( funSpec )
+ {
+ QPtrList<AST> l = funSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "virtual" )
+ isVirtual = true;
+ else if ( text == "inline" )
+ isInline = true;
+ ++it;
+ }
+ }
+
+ if ( storageSpec )
+ {
+ QPtrList<AST> l = storageSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "friend" )
+ isFriend = true;
+ else if ( text == "static" )
+ isStatic = true;
+ ++it;
+ }
+ }
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+ ast->getStartPosition( &startLine, &startColumn );
+ ast->getEndPosition( &endLine, &endColumn );
+
+ QString id = d->declaratorId() ->unqualifiedName() ->text().stripWhiteSpace();
+
+ QStringList scope = scopeOfDeclarator( d, m_currentScope );
+ ClassDom c; ///c should be nonzero if it is a function-definition for a function within another class
+ if( !m_currentClass.top() ) {
+ ///It is not a local definition within a class, so search the scope so it can be corrected using imports
+ c = findClassFromScope( scope );
+ }
+
+ if( c ) {
+ scope = c->scope();
+ scope << c->name();
+ }
+
+ FunctionDefinitionDom method = m_store->create<FunctionDefinitionModel>();
+ method->setScope( scope );
+ method->setName( id );
+
+ parseFunctionArguments( d, model_cast<FunctionDom>( method ) );
+
+ QString text = typeOfDeclaration( typeSpec, d );
+ if ( !text.isEmpty() )
+ method->setResultType( text );
+
+ method->setFileName( m_fileName );
+ method->setStartPosition( startLine, startColumn );
+ method->setEndPosition( endLine, endColumn );
+ if( !ast->comment().isEmpty() )
+ method->setComment( ast->comment() );
+
+ checkTemplateDeclarator( & (*method) );
+
+ if ( m_inSignals )
+ method->setSignal( true );
+
+ if ( m_inSlots )
+ method->setSlot( true );
+
+ if( c && c->isClass() )
+ method->setConstant( d->constant() != 0 );
+ else if ( m_currentClass.top() || ( method->name() == "main" && scope.isEmpty() ) )
+ {
+ method->setConstant( d->constant() != 0 );
+ method->setAccess( m_currentAccess );
+ method->setStatic( isStatic );
+ method->setVirtual( isVirtual );
+
+ if ( m_currentClass.top() )
+ m_currentClass.top() ->addFunction( model_cast<FunctionDom>( method ) );
+ else
+ m_file->addFunction( model_cast<FunctionDom>( method ) );
+ }
+
+ if ( m_currentClass.top() )
+ m_currentClass.top() ->addFunctionDefinition( method );
+ else if ( m_currentNamespace.top() )
+ m_currentNamespace.top() ->addFunctionDefinition( method );
+ else
+ m_file->addFunctionDefinition( method );
+}
+
+void StoreWalker::parseLinkageBody( LinkageBodyAST* ast )
+{
+ TreeParser::parseLinkageBody( ast );
+}
+
+void StoreWalker::parseTypeSpecifier( TypeSpecifierAST* ast )
+{
+ TreeParser::parseTypeSpecifier( ast );
+}
+
+void StoreWalker::takeTemplateParams( TemplateModelItem& target, TemplateDeclarationAST* ast) {
+ TemplateParameterListAST* pl = ast->templateParameterList();
+ if( pl ) {
+ QPtrList<TemplateParameterAST> list = pl->templateParameterList();
+
+ TemplateParameterAST* curr = list.first();
+ while( curr != 0 ) {
+ QString a, b;
+ if( curr->typeParameter() && curr->typeParameter()->name() ) {
+ a = curr->typeParameter()->name()->text();
+ if( curr->typeParameter()->typeId() )
+ b = curr->typeParameter()->typeId()->text();
+ }
+
+ target.addTemplateParam( a, b );
+ CodeModelItem* cmi = dynamic_cast<CodeModelItem*>(&target);
+ QString nm = "0";
+ if(cmi) nm = cmi->name();
+ kdDebug() << "item " << nm << " taking template-parameters " << a << ", default=" << b << "\n";
+ curr = list.next();
+ }
+ }
+}
+
+void StoreWalker::checkTemplateDeclarator( TemplateModelItem* item ) {
+ if( !m_currentTemplateDeclarator.empty() && m_currentTemplateDeclarator.top() != 0) {
+ TemplateDeclarationAST* a = m_currentTemplateDeclarator.top();
+
+ m_currentTemplateDeclarator.pop();
+ m_currentTemplateDeclarator.push(0);
+
+ takeTemplateParams( *item, a );
+ }
+}
+
+int StoreWalker::mergeGroups( int g1, int g2 ) {
+ int ng = m_store->mergeGroups( g1, g2 );
+ for( QMap<QString, FileDom>::iterator it = m_overrides.begin(); it != m_overrides.end(); ++it ) {
+ int g =(*it)->groupId();
+ if( g == g1 || g == g2 )
+ (*it)->setGroupId( ng );
+ }
+ return ng;
+}
+
+void StoreWalker::parseClassSpecifier( ClassSpecifierAST* ast )
+{
+ int startLine, startColumn;
+ int endLine, endColumn;
+ ast->getStartPosition( &startLine, &startColumn );
+ ast->getEndPosition( &endLine, &endColumn );
+
+ int oldAccess = m_currentAccess;
+ bool oldInSlots = m_inSlots;
+ bool oldInSignals = m_inSignals;
+
+ QString kind = ast->classKey() ->text();
+ if ( kind == "class" )
+ m_currentAccess = CodeModelItem::Private;
+ else
+ m_currentAccess = CodeModelItem::Public;
+ m_inSlots = false;
+ m_inSignals = false;
+
+ QString className;
+ if ( !ast->name() && m_currentDeclarator && m_currentDeclarator->declaratorId() )
+ {
+ className = m_currentDeclarator->declaratorId() ->text().stripWhiteSpace();
+ }
+ else if ( !ast->name() )
+ {
+ QFileInfo fileInfo( m_fileName );
+ QString shortFileName = fileInfo.baseName();
+ className.sprintf( "(%s_%d)", shortFileName.local8Bit().data(), m_anon++ );
+ }
+ else
+ {
+ className = ast->name() ->unqualifiedName() ->text().stripWhiteSpace();
+ }
+
+ ClassDom klass = m_store->create<ClassModel>();
+ klass->setStartPosition( startLine, startColumn );
+ klass->setEndPosition( endLine, endColumn );
+ klass->setFileName( m_fileName );
+
+ int i = className.find( '<' );
+ if( i != -1 ) {
+ klass->setSpecializationDeclaration( className.mid( i ) );
+ className = className.left( i );
+ }
+
+ klass->setName( className );
+ klass->setComment( ast->comment() );
+
+ checkTemplateDeclarator( &(*klass) );
+
+ bool embed = !scopeOfName( ast->name(), QStringList() ).isEmpty();
+
+ QStringList oldScope;
+
+
+ if( embed ) {
+ ClassDom embedderClass = findClassFromScope( m_currentScope + scopeOfName( ast->name(), QStringList() ));
+
+ if(embedderClass) {
+ if(embedderClass->fileName() != klass->fileName()) {
+ ///since we are creating a link between both files, put them into the same parsing-group
+ FileDom dm = embedderClass->file();
+ if( dm ) {
+ m_file->setGroupId( mergeGroups( dm->groupId(), m_file->groupId() ) );
+ }else{
+ kdDebug() << "file " << embedderClass->fileName() << " missing in store \n";
+ }
+ }
+
+ oldScope = m_currentScope;
+ m_currentScope = embedderClass->scope();
+ m_currentScope.push_back( embedderClass->name() );
+ m_currentClass.push( embedderClass );
+
+ //m_file->addClass( klass );//experiment
+ }else{
+ kdDebug( 9007 ) << "could not find embedding class " << QStringList(m_currentScope + scopeOfName( ast->name(), QStringList() )).join("::") << " for " << className << endl;
+ embed = false;
+ }
+ }
+
+ if ( m_currentClass.top() )
+ m_currentClass.top() ->addClass( klass );
+ else if ( m_currentNamespace.top() )
+ m_currentNamespace.top() ->addClass( klass );
+ else
+ m_file->addClass( klass );
+
+ klass->setScope( m_currentScope );
+
+
+ if ( ast->baseClause() )
+ parseBaseClause( ast->baseClause(), klass );
+
+ m_currentScope.push_back( className );
+ m_currentClass.push( klass );
+
+ //m_imports.push_back( QStringList() );
+
+ TreeParser::parseClassSpecifier( ast );
+
+
+ //m_imports.pop_back();
+ m_currentClass.pop();
+
+ m_currentScope.pop_back();
+
+ if( embed ) {
+ m_currentScope = oldScope;
+ m_currentClass.pop();
+ }
+
+ m_currentAccess = oldAccess;
+ m_inSlots = oldInSlots;
+ m_inSignals = oldInSignals;
+}
+
+void StoreWalker::parseEnumSpecifier( EnumSpecifierAST* ast )
+{
+ if( ast->name() ) {
+ TypeAliasDom typeAlias = m_store->create<TypeAliasModel>();
+ typeAlias->setFileName( m_fileName );
+ typeAlias->setName( ast->name()->text() );
+ typeAlias->setType( "const int" );
+ typeAlias->setComment( ast->comment() );
+
+ int line, col;
+ ast->getStartPosition( &line, &col );
+ typeAlias->setStartPosition( line, col );
+
+ ast->getEndPosition( &line, &col );
+ typeAlias->setEndPosition( line, col );
+
+ if ( m_currentClass.top() )
+ m_currentClass.top() ->addTypeAlias( typeAlias );
+ else if ( m_currentNamespace.top() )
+ m_currentNamespace.top() ->addTypeAlias( typeAlias );
+ else
+ m_file->addTypeAlias( typeAlias );
+ }
+
+ QPtrList<EnumeratorAST> l = ast->enumeratorList();
+ QPtrListIterator<EnumeratorAST> it( l );
+ while ( it.current() )
+ {
+ VariableDom attr = m_store->create<VariableModel>();
+ attr->setName( it.current() ->id() ->text() );
+ attr->setFileName( m_fileName );
+ attr->setAccess( m_currentAccess );
+
+ if( !ast->name() ) {
+ attr->setType( "const int" );
+ } else {
+ attr->setType( ast->name()->text() );
+ }
+
+ attr->setEnumeratorVariable( true );
+
+ attr->setComment( (*it)->comment() );
+ attr->setStatic( true );
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+ it.current() ->getStartPosition( &startLine, &startColumn );
+ attr->setStartPosition( startLine, startColumn );
+
+ it.current() ->getEndPosition( &endLine, &endColumn );
+ attr->setEndPosition( endLine, endColumn );
+
+ if ( m_currentClass.top() )
+ m_currentClass.top() ->addVariable( attr );
+ else if ( m_currentNamespace.top() )
+ m_currentNamespace.top() ->addVariable( attr );
+ else
+ m_file->addVariable( attr );
+
+ ++it;
+ }
+}
+
+void StoreWalker::parseElaboratedTypeSpecifier( ElaboratedTypeSpecifierAST* ast )
+{
+ TreeParser::parseElaboratedTypeSpecifier( ast );
+}
+
+void StoreWalker::parseTypeDeclaratation( TypeSpecifierAST* typeSpec )
+{
+ parseTypeSpecifier( typeSpec );
+}
+
+void StoreWalker::parseDeclaration( GroupAST* funSpec, GroupAST* storageSpec,
+ TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl )
+{
+ if ( m_inStorageSpec )
+ return ;
+
+ DeclaratorAST* d = decl->declarator();
+
+ if ( !d )
+ return ;
+
+ if ( !d->subDeclarator() && d->parameterDeclarationClause() )
+ return parseFunctionDeclaration( funSpec, storageSpec, typeSpec, decl );
+
+ DeclaratorAST* t = d;
+ while ( t && t->subDeclarator() )
+ t = t->subDeclarator();
+
+ QString id;
+ if ( t && t->declaratorId() && t->declaratorId() ->unqualifiedName() )
+ id = t->declaratorId() ->unqualifiedName() ->text();
+
+ if ( !scopeOfDeclarator( d, QStringList() ).isEmpty() )
+ {
+ kdDebug( 9007 ) << "skip declaration of " << QStringList(scopeOfDeclarator( d, QStringList() )).join("::") << "::" << id << endl;
+ return ;
+ }
+
+ VariableDom attr = m_store->create<VariableModel>();
+ attr->setName( id );
+ attr->setFileName( m_fileName );
+ attr->setComment( comment() );
+
+ if ( m_currentClass.top() )
+ m_currentClass.top() ->addVariable( attr );
+ else if ( m_currentNamespace.top() )
+ m_currentNamespace.top() ->addVariable( attr );
+ else
+ m_file->addVariable( attr );
+
+ attr->setAccess( m_currentAccess );
+
+ QString text = typeOfDeclaration( typeSpec, d );
+ if ( !text.isEmpty() ) {
+ attr->setType( text );
+ }
+
+ bool isFriend = false;
+ //bool isVirtual = false;
+ bool isStatic = false;
+ //bool isInline = false;
+ //bool isInitialized = decl->initializer() != 0;
+
+ if ( storageSpec )
+ {
+ QPtrList<AST> l = storageSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "friend" )
+ isFriend = true;
+ else if ( text == "static" )
+ isStatic = true;
+ ++it;
+ }
+ }
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+ decl->getStartPosition( &startLine, &startColumn );
+ decl->getEndPosition( &endLine, &endColumn );
+
+ attr->setStartPosition( startLine, startColumn );
+ attr->setEndPosition( endLine, endColumn );
+ attr->setStatic( isStatic );
+}
+
+void StoreWalker::parseAccessDeclaration( AccessDeclarationAST * access )
+{
+ QPtrList<AST> l = access->accessList();
+
+ QString accessStr = l.at( 0 ) ->text();
+ if ( accessStr == "public" )
+ m_currentAccess = CodeModelItem::Public;
+ else if ( accessStr == "protected" )
+ m_currentAccess = CodeModelItem::Protected;
+ else if ( accessStr == "private" )
+ m_currentAccess = CodeModelItem::Private;
+ else if ( accessStr == "signals" )
+ m_currentAccess = CodeModelItem::Protected;
+ else
+ m_currentAccess = CodeModelItem::Public;
+
+ m_inSlots = l.count() > 1 ? l.at( 1 ) ->text() == "slots" : false;
+ m_inSignals = l.count() >= 1 ? l.at( 0 ) ->text() == "signals" : false;
+}
+
+NamespaceDom StoreWalker::findOrInsertNamespace( NamespaceAST* ast, const QString & name )
+{
+ if ( m_currentNamespace.top() && m_currentNamespace.top() ->hasNamespace( name ) )
+ return m_currentNamespace.top() ->namespaceByName( name );
+
+ if ( m_file->hasNamespace( name ) )
+ return m_file->namespaceByName( name );
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+ ast->getStartPosition( &startLine, &startColumn );
+ ast->getEndPosition( &endLine, &endColumn );
+
+ NamespaceDom ns = m_store->create<NamespaceModel>();
+ ns->setFileName( m_fileName );
+ ns->setName( name );
+ ns->setStartPosition( startLine, startColumn );
+ ns->setEndPosition( endLine, endColumn );
+ ns->setComment( ast->comment() );
+
+ ns->setScope( m_currentScope );
+
+ if ( m_currentNamespace.top() )
+ m_currentNamespace.top() ->addNamespace( ns );
+ else
+ m_file->addNamespace( ns );
+
+ return ns;
+}
+
+void StoreWalker::parseFunctionDeclaration( GroupAST* funSpec, GroupAST* storageSpec,
+ TypeSpecifierAST * typeSpec, InitDeclaratorAST * decl )
+{
+ bool isFriend = false;
+ bool isVirtual = false;
+ bool isStatic = false;
+ bool isInline = false;
+ bool isPure = decl->initializer() != 0;
+
+ if ( funSpec )
+ {
+ QPtrList<AST> l = funSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "virtual" )
+ isVirtual = true;
+ else if ( text == "inline" )
+ isInline = true;
+ ++it;
+ }
+ }
+
+ if ( storageSpec )
+ {
+ QPtrList<AST> l = storageSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "friend" )
+ isFriend = true;
+ else if ( text == "static" )
+ isStatic = true;
+ ++it;
+ }
+ }
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+ decl->getStartPosition( &startLine, &startColumn );
+ decl->getEndPosition( &endLine, &endColumn );
+
+ DeclaratorAST* d = decl->declarator();
+ QString id = d->declaratorId() ->unqualifiedName() ->text();
+
+ FunctionDom method = m_store->create<FunctionModel>();
+ method->setName( id );
+
+ method->setComment( comment() );
+ method->setFileName( m_fileName );
+ method->setStartPosition( startLine, startColumn );
+ method->setEndPosition( endLine, endColumn );
+ method->setAccess( m_currentAccess );
+ method->setStatic( isStatic );
+ method->setVirtual( isVirtual );
+ method->setAbstract( isPure );
+ parseFunctionArguments( d, method );
+
+ checkTemplateDeclarator( & (*method) );
+
+
+ if ( m_inSignals )
+ method->setSignal( true );
+
+ if ( m_inSlots )
+ method->setSlot( true );
+
+ QString text = typeOfDeclaration( typeSpec, d );
+ if ( !text.isEmpty() )
+ method->setResultType( text );
+
+ method->setConstant( d->constant() != 0 );
+ method->setScope( scopeOfDeclarator( d, m_currentScope ) );
+
+ if ( m_currentClass.top() )
+ m_currentClass.top() ->addFunction( method );
+ else if ( m_currentNamespace.top() )
+ m_currentNamespace.top() ->addFunction( method );
+ else
+ m_file->addFunction( method );
+}
+
+void StoreWalker::parseFunctionArguments( DeclaratorAST* declarator, FunctionDom method )
+{
+ ParameterDeclarationClauseAST * clause = declarator->parameterDeclarationClause();
+
+ if ( clause && clause->parameterDeclarationList() )
+ {
+ ParameterDeclarationListAST * params = clause->parameterDeclarationList();
+ QPtrList<ParameterDeclarationAST> l( params->parameterList() );
+ QPtrListIterator<ParameterDeclarationAST> it( l );
+ while ( it.current() )
+ {
+ ParameterDeclarationAST * param = it.current();
+ ++it;
+
+ ArgumentDom arg = m_store->create<ArgumentModel>();
+
+ if ( param->declarator() )
+ {
+ QString text = declaratorToString( param->declarator(), QString::null, true );
+ if ( !text.isEmpty() )
+ arg->setName( text );
+ }
+
+ QString tp = typeOfDeclaration( param->typeSpec(), param->declarator() );
+ if ( !tp.isEmpty() )
+ arg->setType( tp );
+
+ method->addArgument( arg );
+ }
+ }
+}
+
+QString StoreWalker::typeOfDeclaration( TypeSpecifierAST* typeSpec, DeclaratorAST* declarator )
+{
+ if ( !typeSpec || !declarator )
+ return QString::null;
+
+ QString text;
+
+ text += typeSpec->text();
+
+ QPtrList<AST> ptrOpList = declarator->ptrOpList();
+ for ( QPtrListIterator<AST> it( ptrOpList ); it.current(); ++it )
+ {
+ text += it.current() ->text();
+ }
+
+ for( int a = 0; a < declarator->arrayDimensionList().count(); a++ )
+ text += "*";
+
+
+ return text;
+}
+
+void StoreWalker::parseBaseClause( BaseClauseAST * baseClause, ClassDom klass )
+{
+ QPtrList<BaseSpecifierAST> l = baseClause->baseSpecifierList();
+ QPtrListIterator<BaseSpecifierAST> it( l );
+ while ( it.current() )
+ {
+ BaseSpecifierAST * baseSpecifier = it.current();
+
+ QString baseName;
+ if ( baseSpecifier->name() )
+ baseName = baseSpecifier->name() ->text();
+
+ klass->addBaseClass( baseName );
+
+ ++it;
+ }
+}
+
+QStringList StoreWalker::scopeOfName( NameAST* id, const QStringList& startScope )
+{
+ QStringList scope = startScope;
+ if ( id && id->classOrNamespaceNameList().count() )
+ {
+ if ( id->isGlobal() )
+ scope.clear();
+ QPtrList<ClassOrNamespaceNameAST> l = id->classOrNamespaceNameList();
+ QPtrListIterator<ClassOrNamespaceNameAST> it( l );
+ while ( it.current() )
+ {
+ if ( it.current() ->name() )
+ {
+ scope << it.current() ->name() ->text();
+ }
+ ++it;
+ }
+ }
+
+ return scope;
+}
+
+
+///@todo respect the imports that result from the headers etc.
+ClassDom StoreWalker::findClassFromScope( const QStringList& scope )
+{
+ QString scopeText = scope.join("::");
+ if( !m_imports.isEmpty() ) {
+ QMapIterator<QString, ClassDom> it = m_imports.back().first.find( scopeText );
+ if( it != m_imports.back().first.end() ) {
+ return *it;
+ }
+ }
+
+ ClassDom c = classFromScope( scope );
+ if( c ) {
+ if( !m_imports.isEmpty() ) m_imports.back().first[ scopeText ] = c;
+ return c;
+ }
+
+ if(!m_imports.isEmpty() && !m_imports.back().second.isEmpty()) {
+ ///try the same using one of the imports(performance-wise this is not good, but simple)
+
+ QStringList::iterator it = m_imports.back().second.begin();
+ while(it != m_imports.back().second.end()) {
+ QStringList scp = QStringList::split("::", *it) + m_currentScope + scope;
+ c = classFromScope( scp );
+ if( c ) {
+ if( !m_imports.isEmpty() ) m_imports.back().first[ scopeText ] = c;
+ return c;
+ }
+ ++it;
+ }
+ }
+ return c;
+}
+
+ClassDom findScopeInFile( const QStringList& scope, NamespaceModel* glob ) {
+ if( !glob ) return ClassDom();
+
+ ClassModel* curr = glob ;
+
+ QStringList::const_iterator mit = scope.begin();
+
+ while(curr->isNamespace() && mit != scope.end() && ((NamespaceModel*)curr)->hasNamespace( *mit )) {
+ curr = &(*( ((NamespaceModel*)curr)->namespaceByName( *mit ) ));
+ ++mit;
+ }
+
+ while((curr->isNamespace() || curr->isClass()) && mit != scope.end() && curr->hasClass( *mit )) {
+ ClassList cl = curr->classByName( *mit );
+ curr = &(**cl.begin() );
+ ++mit;
+ }
+
+ if(mit == scope.end()) {
+ return curr;
+ } else {
+ return ClassDom(0);
+ }
+}
+
+ClassDom StoreWalker::classFromScope(const QStringList& scope) {
+ if(scope.isEmpty())return ClassDom(0);
+
+ //Since another instance of the current file may still be in the code-model this must be testede BEFORE the code-model
+ ClassDom c = findScopeInFile( scope, m_file.data() );
+ if( c ) return c;
+
+ NamespaceDom glob = m_store->globalNamespace();
+ if( !glob ) return ClassDom();
+ c = findScopeInFile( scope, glob );
+
+
+ QMap<QString, FileDom>::const_iterator it;
+
+ if( c ) {
+ ///Check the file that overrides the code-model file
+ it = m_overrides.find( c->fileName() );
+
+ //Find the class within the file that is overriding the one in code-model.
+ if( it != m_overrides.end() ) {
+ return findScopeInFile( scope, *it );
+ } else {
+ return c;
+ }
+ } else {
+ ///Search in all overrides, because they will be added later all at once
+ for( QMap<QString, FileDom>::const_iterator it = m_overrides.begin(); it != m_overrides.end(); ++it ) {
+ c = findScopeInFile( scope, *it );
+ if( c )
+ return c;
+ }
+ }
+
+ return ClassDom(0);
+}
+
+
+QStringList StoreWalker::scopeOfDeclarator( DeclaratorAST* d, const QStringList& startScope )
+{
+ return scopeOfName( d->declaratorId(), startScope );
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/store_walker.h b/languages/cpp/store_walker.h
new file mode 100644
index 00000000..488e692b
--- /dev/null
+++ b/languages/cpp/store_walker.h
@@ -0,0 +1,141 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef __store_walker_h
+#define __store_walker_h
+
+#include "tree_parser.h"
+#include <codemodel.h>
+#include <qstringlist.h>
+#include <qvaluestack.h>
+#include <hashedstring.h>
+
+class StoreWalker: public TreeParser
+{
+public:
+ StoreWalker( const QString& fileName, CodeModel* store );
+ virtual ~StoreWalker();
+
+ FileDom file()
+ {
+ return m_file;
+ }
+
+ // translation-unit
+ virtual void parseTranslationUnit( const ParsedFile& );
+
+ // declarations
+ virtual void parseDeclaration( DeclarationAST* );
+ virtual void parseLinkageSpecification( LinkageSpecificationAST* );
+ virtual void parseNamespace( NamespaceAST* );
+ virtual void parseNamespaceAlias( NamespaceAliasAST* );
+ virtual void parseUsing( UsingAST* );
+ virtual void parseUsingDirective( UsingDirectiveAST* );
+ virtual void parseTypedef( TypedefAST* );
+ virtual void parseTemplateDeclaration( TemplateDeclarationAST* );
+ virtual void parseSimpleDeclaration( SimpleDeclarationAST* );
+ virtual void parseFunctionDefinition( FunctionDefinitionAST* );
+ virtual void parseLinkageBody( LinkageBodyAST* );
+ virtual void parseAccessDeclaration( AccessDeclarationAST* );
+
+ void takeTemplateParams( TemplateModelItem& target, TemplateDeclarationAST*);
+
+ // type-specifier
+ virtual void parseTypeSpecifier( TypeSpecifierAST* );
+ virtual void parseClassSpecifier( ClassSpecifierAST* );
+ virtual void parseEnumSpecifier( EnumSpecifierAST* );
+ virtual void parseElaboratedTypeSpecifier( ElaboratedTypeSpecifierAST* );
+
+ virtual void parseTypeDeclaratation( TypeSpecifierAST* typeSpec );
+ virtual void parseDeclaration( GroupAST* funSpec, GroupAST* storageSpec, TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl );
+ virtual void parseFunctionDeclaration( GroupAST* funSpec, GroupAST* storageSpec, TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl );
+ virtual void parseFunctionArguments( DeclaratorAST* declarator, FunctionDom method );
+ virtual void parseBaseClause( BaseClauseAST* baseClause, ClassDom klass );
+
+private:
+ NamespaceDom findOrInsertNamespace( NamespaceAST* ast, const QString& name );
+ QString typeOfDeclaration( TypeSpecifierAST* typeSpec, DeclaratorAST* declarator );
+ QStringList scopeOfName( NameAST* id, const QStringList& scope );
+ QStringList scopeOfDeclarator( DeclaratorAST* d, const QStringList& scope );
+ ClassDom classFromScope(const QStringList& scope);
+ ClassDom findClassFromScope(const QStringList& scope);
+ void checkTemplateDeclarator( TemplateModelItem* item );
+private:
+
+ class CommentPusher {
+ StoreWalker& m_ref;
+ public:
+ CommentPusher( StoreWalker& ref, QString comment ) : m_ref( ref ) {
+ m_ref.pushComment( comment );
+ }
+ ~CommentPusher() {
+ m_ref.popComment();
+ }
+ };
+
+ QStringList m_comments;
+
+ QString comment() {
+ if( m_comments.isEmpty() ) {
+ return "";
+ } else {
+ return m_comments.front();
+ }
+ }
+
+ //Own implementation that also merges the groups of the overrides
+ int mergeGroups( int g1, int g2 );
+
+public:
+ void pushComment( QString comm ) {
+ m_comments.push_front( comm );
+ }
+
+ void popComment() {
+ m_comments.pop_front();
+ }
+
+ void setOverrides( const QMap<QString, FileDom>& overrides ) {
+ m_overrides = overrides;
+ }
+private:
+
+ QMap<QString, FileDom> m_overrides;
+
+ FileDom m_file;
+ QString m_fileName;
+ HashedString m_hashedFileName;
+ QStringList m_currentScope;
+ CodeModel* m_store;
+ QValueList<QPair<QMap<QString, ClassDom>, QStringList> > m_imports;
+ int m_currentAccess;
+ bool m_inSlots;
+ bool m_inSignals;
+ int m_anon;
+ bool m_inStorageSpec;
+ bool m_inTypedef;
+
+ DeclaratorAST* m_currentDeclarator;
+ QValueStack<TemplateDeclarationAST*> m_currentTemplateDeclarator;
+ QValueStack<NamespaceDom> m_currentNamespace;
+ QValueStack<ClassDom> m_currentClass;
+
+ QStringList findScope( const QStringList& scope );
+
+
+private:
+ StoreWalker( const StoreWalker& source );
+ void operator = ( const StoreWalker& source );
+};
+
+#endif // __store_walker_h
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/storeconverter.cpp b/languages/cpp/storeconverter.cpp
new file mode 100644
index 00000000..3569bdea
--- /dev/null
+++ b/languages/cpp/storeconverter.cpp
@@ -0,0 +1,149 @@
+/***************************************************************************
+* Copyright (C) 2003-2004 by Alexander Dymo *
+* adymo@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+#include "storeconverter.h"
+
+#include <qvaluelist.h>
+
+#include <kdebug.h>
+
+#include <kdevcoderepository.h>
+
+#include "cppcodecompletion.h"
+#include "codeinformationrepository.h"
+#include "cppsupportpart.h"
+
+StoreConverter::StoreConverter(CppSupportPart *part, CodeModel *model)
+:m_part(part), m_model(model)
+{
+}
+
+void StoreConverter::PCSClassToCodeModel(const QString &className, const QStringList &/*classScope*/)
+{
+ QValueList<Catalog*> catalogs = m_part->codeRepository()->registeredCatalogs();
+ for (QValueList<Catalog*>::iterator it = catalogs.begin();
+ it != catalogs.end(); ++it)
+ {
+ Catalog *catalog = *it;
+ kdDebug() << "looking in catalog: " << catalog->dbName() << endl;
+
+ QValueList<Catalog::QueryArgument> args;
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Class );
+ args << Catalog::QueryArgument( "name", className );
+ QValueList<Tag> tags = catalog->query(args);
+ for (QValueList<Tag>::iterator it = tags.begin(); it != tags.end(); ++it )
+ {
+ Tag& tag = *it;
+ kdDebug() << "TAG: " << tag.name() << " in file " << tag.fileName() << endl;
+ FileDom file;
+ bool addFile = false;
+ if (m_model->hasFile(tag.name()))
+ file = m_model->fileByName(tag.name());
+ else
+ {
+ file = m_model->create<FileModel>();
+ file->setName(tag.fileName());
+ addFile = true;
+ }
+ if (!file->hasClass(tag.name()))
+ parseClass(tag, file);
+ if (addFile) m_model->addFile(file);
+ }
+ }
+/* kdDebug() << "m_model class count: " << m_model->globalNamespace()->classList().count() << endl;
+ kdDebug() << "m_model file count: " << m_model->fileList().count() << endl;*/
+}
+
+void StoreConverter::parseClass(Tag &classTag, FileDom file)
+{
+ ClassDom klass = m_model->create<ClassModel>();
+ klass->setName(classTag.name());
+ klass->setFileName(classTag.fileName());
+
+ QStringList scope;
+ scope.append(classTag.name());
+ QValueList<Tag> symbolTags = m_part->codeCompletion()->repository()->
+ getTagsInScope(scope, false);
+
+// kdDebug() << "got tags: " << endl;
+ for (QValueList<Tag>::iterator sit = symbolTags.begin(); sit != symbolTags.end(); ++sit )
+ {
+ Tag &symbol = *sit;
+// kdDebug() << symbol.name() << endl;
+
+ switch (symbol.kind())
+ {
+ case Tag::Kind_FunctionDeclaration:
+ parseFunctionDeclaration(symbol, klass);
+ break;
+ case Tag::Kind_Variable:
+ parseVariable(symbol, klass);
+ }
+ }
+
+ QValueList<Tag> baseClassTags = m_part->codeCompletion()->repository()->getBaseClassList(classTag.name());
+ for (QValueList<Tag>::iterator bit = baseClassTags.begin();
+ bit != baseClassTags.end(); ++bit)
+ klass->addBaseClass((*bit).name());
+
+ file->addClass(klass);
+}
+
+void StoreConverter::parseFunctionDeclaration(Tag &fun, ClassDom klass)
+{
+ FunctionDom function = m_model->create<FunctionModel>();
+ function->setName(fun.name());
+ function->setFileName(fun.fileName());
+ function->setScope(fun.scope());
+
+ CppFunction<Tag> cppFun(fun);
+ function->setAccess(cppFun.access());
+ function->setSignal(cppFun.isSignal());
+ function->setSlot(cppFun.isSlot());
+ function->setVirtual(cppFun.isVirtual());
+ function->setStatic(cppFun.isStatic());
+ function->setInline(cppFun.isInline());
+ function->setConstant(cppFun.isConst());
+ function->setAbstract(cppFun.isPure());
+ function->setResultType(cppFun.type());
+
+ parseArguments(function, cppFun);
+
+ klass->addFunction(function);
+}
+
+void StoreConverter::parseVariable(Tag &var, ClassDom klass)
+{
+ VariableDom variable = m_model->create<VariableModel>();
+ variable->setName(var.name());
+ variable->setFileName(var.fileName());
+
+ CppVariable<Tag> cppVar(var);
+ variable->setAccess(cppVar.access());
+ variable->setStatic(cppVar.isStatic());
+ variable->setType(cppVar.type());
+
+ klass->addVariable(variable);
+}
+
+void StoreConverter::parseArguments(FunctionDom function, CppFunction<Tag> &cppFun)
+{
+ QStringList args = cppFun.arguments();
+ for (QStringList::const_iterator it = args.constBegin(); it != args.constEnd(); ++it)
+ {
+ ArgumentDom arg = m_model->create<ArgumentModel>();
+ arg->setType(*it);
+ arg->setName(cppFun.argumentNames()[args.findIndex(*it)]);
+
+ function->addArgument(arg);
+ }
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/storeconverter.h b/languages/cpp/storeconverter.h
new file mode 100644
index 00000000..34a5d3d3
--- /dev/null
+++ b/languages/cpp/storeconverter.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+* Copyright (C) 2003-2004 by Alexander Dymo *
+* adymo@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+#ifndef STORECONVERTER_H
+#define STORECONVERTER_H
+
+#include <qstringlist.h>
+
+#include <tag.h>
+#include <catalog.h>
+#include <codemodel.h>
+
+#include "cpp_tags.h"
+
+class CppSupportPart;
+
+class StoreConverter
+{
+public:
+ StoreConverter( CppSupportPart *part, CodeModel *model );
+
+ void PCSClassToCodeModel( const QString &className, const QStringList &classScope );
+
+protected:
+ /**Parses class from PCS and adds it into a file dom.*/
+ void parseClass( Tag &classTag, FileDom file );
+ /**Parses function declaration from PCS and adds it into a class dom.*/
+ void parseFunctionDeclaration( Tag &fun, ClassDom klass );
+ /**Parses variable from PCS and adds it into a class dom.*/
+ void parseVariable( Tag &var, ClassDom klass );
+ /**Parses function arguments from @p cppFun and adds them into a function dom.*/
+ void parseArguments( FunctionDom function, CppFunction<Tag> &cppFun );
+
+private:
+ CppSupportPart *m_part;
+ CodeModel *m_model;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/stringhelpers.cpp b/languages/cpp/stringhelpers.cpp
new file mode 100644
index 00000000..d380fd64
--- /dev/null
+++ b/languages/cpp/stringhelpers.cpp
@@ -0,0 +1,299 @@
+
+/***************************************************************************
+k copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "stringhelpers.h"
+#include "safetycounter.h"
+
+namespace StringHelpers
+{
+
+void clearStr( QString& str, int start, int end ) {
+ for( int a = start; a < end; a++) str[a] = ' ';
+}
+
+bool isValidIdentifierSign( const QChar& c ) {
+ if( c.isLetter() || c.isDigit() || c == '_' ) return true;
+ else return false;
+}
+
+
+QString clearComments( QString str ) {
+ if( str.isEmpty() ) return "";
+
+ SafetyCounter s( 1000 );
+ int lastPos = 0;
+ int pos;
+ int len = str.length();
+ while( (pos = str.find( "/*", lastPos )) != -1 ) {
+ if( !s ) return str;
+ int i = str.find( "*/", pos );
+ if( i != -1 && i <= len - 2 ) {
+ clearStr( str, pos, i+2 );
+ lastPos = i+2;
+ if( lastPos == len ) break;
+ } else {
+ break;
+ }
+ }
+
+ lastPos = 0;
+ while( (pos = str.find( "//", lastPos )) != -1 ) {
+ if( !s ) return str;
+ int i = str.find( "\n", pos );
+ if( i != -1 && i <= len - 1 ) {
+ clearStr( str, pos, i+1 );
+ lastPos = i+1;
+ } else {
+ clearStr( str, pos, len );
+ break;
+ }
+ }
+
+ return str;
+}
+
+QString cutTemplateParams( QString str ) {
+ int p;
+ if( (p = str.find('<') ) != -1) {
+ return str.left( p );
+ }
+
+ return str.stripWhiteSpace().replace('*',"");
+}
+
+QPair<QString, QString> splitTemplateParams( QString str ) {
+ QPair<QString, QString> ret;
+ int p;
+ if( (p = str.find('<') ) != -1) {
+ ret.first = str.left( p ).stripWhiteSpace();
+ ret.second = str.mid( p ).stripWhiteSpace();
+ } else {
+ ret.first = str.stripWhiteSpace();
+ }
+
+ return ret;
+}
+
+bool parenFits( QChar c1, QChar c2 ) {
+ if( c1 == '<' && c2 == '>' ) return true;
+ else if( c1 == '(' && c2 == ')' ) return true;
+ else if( c1 == '[' && c2 == ']' ) return true;
+ else if( c1 == '{' && c2 == '}' ) return true;
+ else
+ return false;
+}
+
+bool isParen( QChar c1 ) {
+ if( c1 == '<' || c1 == '>' ) return true;
+ else if( c1 == '(' || c1 == ')' ) return true;
+ else if( c1 == '[' || c1 == ']' ) return true;
+ else if( c1 == '{' || c1 == '}' ) return true;
+ else
+ return false;
+}
+
+bool isTypeParen( QChar c1 ) {
+ if( c1 == '<' || c1 == '>' ) return true;
+ else
+ return false;
+}
+
+bool isTypeOpenParen( QChar c1 ) {
+ if( c1 == '<' ) return true;
+ else
+ return false;
+}
+
+bool isTypeCloseParen( QChar c1 ) {
+ if( c1 == '>' ) return true;
+ else
+ return false;
+}
+
+bool isLeftParen( QChar c1 ) {
+ if( c1 == '<' ) return true;
+ else if( c1 == '(' ) return true;
+ else if( c1 == '[' ) return true;
+ else if( c1 == '{' ) return true;
+ else
+ return false;
+}
+
+int findClose( const QString& str , int pos ) {
+ int depth = 0;
+ QValueList<QChar> st;
+ QChar last = ' ';
+
+ for( int a = pos; a < (int)str.length(); a++) {
+ switch(str[a]) {
+ case '<':
+ case '(':
+ case '[':
+ case '{':
+ st.push_front( str[a] );
+ depth++;
+ break;
+ case '>':
+ if( last == '-' ) break;
+ case ')':
+ case ']':
+ case '}':
+ if( !st.isEmpty() && parenFits(st.front(), str[a]) ) {
+ depth--;
+ st.pop_front();
+ }
+ break;
+ case '"':
+ last = str[a];
+ a++;
+ while( a < (int)str.length() && (str[a] != '"' || last == '\\')) {
+ last = str[a];
+ a++;
+ }
+ continue;
+ break;
+ }
+
+ last = str[a];
+
+ if( depth == 0 ) {
+ return a;
+ }
+ }
+
+ return -1;
+}
+
+QString tagType( const Tag& tag )
+{
+ if ( tag.hasAttribute( "t" ) )
+ {
+ QString type = tag.attribute( "t" ).toString();
+ return type;
+ }
+ else if ( tag.kind() == Tag::Kind_Class || tag.kind() == Tag::Kind_Namespace )
+ {
+ QStringList l = tag.scope();
+ l << tag.name();
+ return l.join("::");
+ }
+ return QString();
+}
+
+int findCommaOrEnd( const QString& str , int pos, QChar validEnd) {
+
+ for( int a = pos; a < (int)str.length(); a++) {
+ switch(str[a]) {
+ case '"':
+ case '(':
+ case '[':
+ case '{':
+ case '<':
+ a = findClose( str, a );
+ if( a == -1 ) return str.length();
+ break;
+ case ')':
+ case ']':
+ case '}':
+ case '>':
+ if( validEnd != ' ' && validEnd != str[a] )
+ continue;
+ case ',':
+ return a;
+ }
+ }
+
+ return str.length();
+}
+
+int countExtract( QChar c, const QString& str ) {
+ int ret = 0;
+ for( int a = 0; a < (int)str.length(); a++) {
+ if( str[a] == c ) ++ret;
+ switch( str[a] ) {
+ case '"':
+ case '(':
+ case '[':
+ case '{':
+ case '<':
+ a = findClose( str, a );
+ if( a == -1 )
+ return ret;
+ }
+ }
+ return ret;
+}
+
+QString templateParamFromString( int num, QString str ) {
+ if( str.endsWith("::") ) str.truncate( str.length() - 2 );
+ int begin = str.find('<');
+ int end = str.findRev('>');
+
+ if(begin == -1 || end == -1) return "";
+
+ begin++;
+
+ for(int a = 0; a < num; a++) {
+ begin = findCommaOrEnd( str, begin );
+ if( begin == (int)str.length() ) return "";
+ begin++;
+ }
+ end = findCommaOrEnd( str, begin );
+
+ if( end == (int)str.length() ) return "";
+
+ return str.mid( begin, end - begin ).stripWhiteSpace();
+}
+
+QStringList splitType( QString str ) {
+ QStringList ret;
+ int currentStart = 0;
+ bool was = false;
+ for( int a = 0; a < (int)str.length(); ++a ) {
+ if( isLeftParen( str[a] ) ) {
+ a = findClose( str, a );
+ if( a == -1 ) {
+ CompletionDebug::dbg() << "misformatted type: " << str << endl;
+ return ret;
+ }
+ was = false;
+ } else {
+ if( str[a] == ':' ) {
+ if( was ) {
+ if( currentStart < a - 1 )
+ ret << str.mid( currentStart, (a - 1) - currentStart ).stripWhiteSpace();
+ currentStart = a + 1;
+ }
+ was = true;
+ } else {
+ was = false;
+ }
+ }
+ }
+ if( currentStart < (int)str.length() )
+ ret << str.mid( currentStart, str.length() - currentStart ).stripWhiteSpace();
+ return ret;
+}
+
+QString stringMult( int count, QString str ){
+ QString ret;
+ for( int a = 0; a < count; a++ ) ret += str;
+ return ret;
+}
+
+}
+
+
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/cpp/stringhelpers.h b/languages/cpp/stringhelpers.h
new file mode 100644
index 00000000..d15f57aa
--- /dev/null
+++ b/languages/cpp/stringhelpers.h
@@ -0,0 +1,118 @@
+
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __STRINGHELPERS_H__
+#define __STRINGHELPERS_H__
+
+
+#include "completiondebug.h"
+#include "codeinformationrepository.h"
+
+
+namespace StringHelpers {
+
+void clearStr( QString& str, int start, int end );
+
+///Fills all comments with whitespaces
+QString clearComments( QString str );
+
+QString cutTemplateParams( QString str );
+
+QPair<QString, QString> splitTemplateParams( QString str );
+
+bool parenFits( QChar c1, QChar c2 );
+
+bool isParen( QChar c1 );
+
+bool isTypeParen( QChar c1 );
+
+bool isTypeOpenParen( QChar c1 );
+
+bool isTypeCloseParen( QChar c1 );
+
+bool isLeftParen( QChar c1 );
+
+/*only from left to right
+searches a fitting closing sign ( a ')' for a '(', ']' for '['
+ignores quoted text
+comments are currently not allowed */
+int findClose( const QString& str , int pos ); //todo: make this respect strings
+
+QString tagType( const Tag& tag );
+
+int findCommaOrEnd( const QString& str , int pos, QChar validEnd = ' ' );
+
+int countExtract( QChar c, const QString& str );
+
+QString templateParamFromString( int num, QString str );
+
+QStringList splitType( QString str ) ;
+
+class ParamIterator {
+ public:
+ ParamIterator( QString parens, QString source ) : m_source( source ), m_parens( parens ), m_cur( 0 ), m_curEnd ( 0 ) {
+ int begin = m_source.find( m_parens[ 0 ] );
+ int end = m_source.findRev( m_parens[ 1 ] );
+ m_prefix = m_source.left( begin );
+
+ if ( begin == -1 || end == -1 && end - begin > 1 )
+ m_cur = m_source.length();
+ else {
+ m_source = source.mid( begin + 1, end - begin );
+ m_curEnd = next();
+ }
+ }
+
+ ParamIterator& operator ++() {
+ m_cur = m_curEnd + 1;
+ if ( m_cur < ( int ) m_source.length() ) {
+ m_curEnd = next();
+ }
+ return *this;
+ }
+
+ QString operator *() {
+ return m_source.mid( m_cur, m_curEnd - m_cur ).stripWhiteSpace();
+ }
+
+ operator bool() const {
+ return m_cur < ( int ) m_source.length();
+ }
+
+ QString prefix() const {
+ return m_prefix;
+ }
+
+ private:
+ QString m_prefix;
+ QString m_source;
+ QString m_parens;
+ int m_cur;
+ int m_curEnd;
+
+ int next() {
+ return findCommaOrEnd( m_source, m_cur, m_parens[ 1 ] );
+ }
+
+};
+
+bool isValidIdentifierSign( const QChar& c );
+
+QString stringMult( int count, QString str );
+}
+
+
+#endif
+// kate: tab-width 2;
diff --git a/languages/cpp/subclassing_template/.kdev_ignore b/languages/cpp/subclassing_template/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/cpp/subclassing_template/.kdev_ignore
diff --git a/languages/cpp/subclassing_template/Makefile.am b/languages/cpp/subclassing_template/Makefile.am
new file mode 100644
index 00000000..4e722ca0
--- /dev/null
+++ b/languages/cpp/subclassing_template/Makefile.am
@@ -0,0 +1,5 @@
+cppsupportdatadir = ${kde_datadir}/kdevcppsupport
+subclassingdir = ${cppsupportdatadir}/subclassing
+
+subclassing_DATA = subclass_template.h subclass_template.cpp \
+ subclass_qt4_template.h subclass_qt4_template.cpp
diff --git a/languages/cpp/subclassing_template/subclass_qt4_template.cpp b/languages/cpp/subclassing_template/subclass_qt4_template.cpp
new file mode 100644
index 00000000..6c008d43
--- /dev/null
+++ b/languages/cpp/subclassing_template/subclass_qt4_template.cpp
@@ -0,0 +1,16 @@
+
+
+#include "$NEWFILENAMELC$.h"
+
+$NEWCLASS$::$NEWCLASS$(QWidget* parent, Qt::WFlags fl)
+: $QTBASECLASS$( parent, fl ), Ui::$BASECLASS$()
+{
+ setupUi(this);
+}
+
+$NEWCLASS$::~$NEWCLASS$()
+{
+}
+
+/*$SPECIALIZATION$*/
+
diff --git a/languages/cpp/subclassing_template/subclass_qt4_template.h b/languages/cpp/subclassing_template/subclass_qt4_template.h
new file mode 100644
index 00000000..a8a02303
--- /dev/null
+++ b/languages/cpp/subclassing_template/subclass_qt4_template.h
@@ -0,0 +1,28 @@
+
+#ifndef $NEWFILENAMEUC$_H
+#define $NEWFILENAMEUC$_H
+
+#include <$QTBASECLASS$>
+#include "ui_$BASEFILENAME$.h"
+
+class $NEWCLASS$ : public $QTBASECLASS$, private Ui::$BASECLASS$
+{
+ Q_OBJECT
+
+public:
+ $NEWCLASS$(QWidget* parent = 0, Qt::WFlags fl = 0 );
+ ~$NEWCLASS$();
+ /*$PUBLIC_FUNCTIONS$*/
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+
+};
+
+#endif
diff --git a/languages/cpp/subclassing_template/subclass_template.cpp b/languages/cpp/subclassing_template/subclass_template.cpp
new file mode 100644
index 00000000..19269531
--- /dev/null
+++ b/languages/cpp/subclassing_template/subclass_template.cpp
@@ -0,0 +1,15 @@
+
+
+#include "$NEWFILENAMELC$.h"
+
+$NEWCLASS$::$NEWCLASS$(QWidget* parent, const char* name$CAN_BE_MODAL_CPP1$, WFlags fl)
+: $BASECLASS$(parent,name$CAN_BE_MODAL_CPP2$,fl)
+{
+}
+
+$NEWCLASS$::~$NEWCLASS$()
+{
+}
+
+/*$SPECIALIZATION$*/
+
diff --git a/languages/cpp/subclassing_template/subclass_template.h b/languages/cpp/subclassing_template/subclass_template.h
new file mode 100644
index 00000000..18846cc6
--- /dev/null
+++ b/languages/cpp/subclassing_template/subclass_template.h
@@ -0,0 +1,27 @@
+
+#ifndef $NEWFILENAMEUC$_H
+#define $NEWFILENAMEUC$_H
+
+#include "$BASEFILENAME$.h"
+
+class $NEWCLASS$ : public $BASECLASS$
+{
+ Q_OBJECT
+
+public:
+ $NEWCLASS$(QWidget* parent = 0, const char* name = 0$CAN_BE_MODAL_H$, WFlags fl = 0 );
+ ~$NEWCLASS$();
+ /*$PUBLIC_FUNCTIONS$*/
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+
+};
+
+#endif
diff --git a/languages/cpp/subclassingdlg.cpp b/languages/cpp/subclassingdlg.cpp
new file mode 100644
index 00000000..fa5aece9
--- /dev/null
+++ b/languages/cpp/subclassingdlg.cpp
@@ -0,0 +1,536 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Jakob Simon-Gaarde *
+ * jsgaarde@tdcspace.dk *
+ * Copyright (C) 2003 by Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "subclassingdlg.h"
+#include "cppsupportpart.h"
+#include "backgroundparser.h"
+#include "store_walker.h"
+#include "cppsupportfactory.h"
+#include "kdevsourceformatter.h"
+#include "kdevapi.h"
+#include "kdevproject.h"
+#include "filetemplate.h"
+#include "codemodel.h"
+
+#include <qradiobutton.h>
+#include <qstringlist.h>
+#include <qcheckbox.h>
+#include <qmessagebox.h>
+#include <kfiledialog.h>
+#include <klineedit.h>
+#include <qpushbutton.h>
+#include <domutil.h>
+#include <qdom.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <kconfig.h>
+
+
+#define WIDGET_CAPTION_NAME "widget/property|name=caption/string"
+#define WIDGET_CLASS_NAME "class"
+#define WIDGET_SLOTS "slots"
+#define WIDGET_FUNCTIONS "functions"
+
+// All widgets
+#define SLOT_ACCEPT SlotItem(m_slotView,"accept()","virtual","protected","void",false,true)
+#define SLOT_REJECT SlotItem(m_slotView,"reject()","virtual","protected","void",false,true)
+
+// Wizards
+#define SLOT_BACK SlotItem(m_slotView,"back()","virtual","protected","void",false,true)
+#define SLOT_NEXT SlotItem(m_slotView,"next()","virtual","protected","void",false,true)
+#define SLOT_HELP SlotItem(m_slotView,"help()","virtual","protected","void",false,true)
+
+
+SlotItem::SlotItem(QListView *parent,const QString &methodName,
+ const QString &specifier,
+ const QString &access, const QString &returnType,
+ bool isFunc,bool callBaseClass)
+: QCheckListItem(parent,methodName,QCheckListItem::CheckBox)
+{
+ setOn(true);
+ m_methodName = methodName;
+ m_access = access.isEmpty() ? (const QString) "public" : access;
+ m_specifier = specifier.isEmpty() ? (const QString) "virtual" : specifier;
+ m_returnType = returnType.isEmpty() ? (const QString) "void" : returnType;
+ m_isFunc = isFunc;
+ m_callBaseClass = callBaseClass;
+ setText(0,m_methodName);
+ setText(1,m_access);
+ setText(2,m_specifier);
+ setText(3,m_returnType);
+ setText(4,m_isFunc ? "Function" : "Slot");
+ if (m_access=="private" || m_specifier=="non virtual")
+ {
+ setOn(false);
+ setEnabled(false);
+ }
+ if (m_specifier=="pure virtual")
+ {
+ setOn(true);
+ setEnabled(false);
+ }
+ m_alreadyInSubclass = false;
+}
+
+void SlotItem::setAllreadyInSubclass()
+{
+ setOn(true);
+ setEnabled(false);
+ m_alreadyInSubclass = true;
+}
+
+
+SubclassingDlg::SubclassingDlg(CppSupportPart* cppSupport, const QString &formFile,
+ QStringList &newFileNames, QWidget* parent,
+ const char* name,bool modal, WFlags fl)
+: SubclassingDlgBase(parent,name,modal,fl),
+m_newFileNames(newFileNames), m_cppSupport( cppSupport )
+
+{
+ m_formFile = formFile;
+ readUiFile();
+ m_creatingNewSubclass = true;
+
+ KConfig *config = CppSupportFactory::instance()->config();
+ if (config)
+ {
+ config->setGroup("Subclassing");
+ reformatDefault_box->setChecked(config->readBoolEntry("Reformat Source", 0));
+ if (reformatDefault_box->isChecked())
+ reformat_box->setChecked(true);
+ }
+}
+
+
+SubclassingDlg::SubclassingDlg(CppSupportPart* cppSupport, const QString &formFile,
+ const QString &filename, QStringList &dummy,
+ QWidget* parent, const char* name, bool modal, WFlags fl)
+: SubclassingDlgBase(parent, name, modal, fl),
+m_newFileNames(dummy), m_cppSupport( cppSupport )
+
+{
+ m_formFile = formFile;
+ m_creatingNewSubclass = false;
+ m_filename = filename;
+
+ KConfig *config = CppSupportFactory::instance()->config();
+ if (config)
+ {
+ config->setGroup("Subclassing");
+ reformatDefault_box->setChecked(config->readBoolEntry("Reformat Source", 0));
+ if (reformatDefault_box->isChecked())
+ reformat_box->setChecked(true);
+ }
+
+ QStringList pathsplit(QStringList::split('/',filename));
+
+ QString baseClass = readBaseClassName();
+ if (!cppSupport->codeModel()->hasFile(filename+QString(".h")))
+ return;
+ ClassList myClasses = cppSupport->codeModel()->fileByName(filename+QString(".h"))->classList();
+ for (ClassList::const_iterator classIt = myClasses.begin(); classIt != myClasses.end(); ++classIt)
+ {
+ kdDebug() << "base class " << baseClass << " class " << (*classIt)->name()
+ << " parents " << (*classIt)->baseClassList().join(",") << endl;
+ if ( (*classIt)->baseClassList().findIndex(baseClass) != -1 )
+ {
+ kdDebug() << "base class matched " << endl;
+ m_edClassName->setText((*classIt)->name());
+ m_edFileName->setText(pathsplit[pathsplit.count()-1]);
+
+ FunctionList functionList = (*classIt)->functionList();
+ for (FunctionList::const_iterator methodIt = functionList.begin();
+ methodIt != functionList.end(); ++methodIt)
+ {
+ m_parsedMethods << (*methodIt)->name() + "(";
+ }
+ }
+ }
+ readUiFile();
+ m_btnOk->setEnabled(true);
+}
+
+bool SubclassingDlg::alreadyInSubclass(const QString &method)
+{
+ for (uint i=0;i<m_parsedMethods.count();i++)
+ {
+ if (method.find(m_parsedMethods[i])==0)
+ return true;
+ }
+ return false;
+}
+
+void SubclassingDlg::readUiFile()
+{
+ QStringList splitPath = QStringList::split('/',m_formFile);
+ m_formName = QStringList::split('.',splitPath[splitPath.count()-1])[0]; // "somedlg.ui" = "somedlg"
+ splitPath.pop_back();
+ m_formPath = "/" + splitPath.join("/"); // join path to ui-file
+
+ m_btnOk->setEnabled(false);
+ QDomDocument doc;
+
+ DomUtil::openDOMFile(doc,m_formFile);
+ m_baseClassName = DomUtil::elementByPathExt(doc,WIDGET_CLASS_NAME).text();
+
+ m_baseCaption = DomUtil::elementByPathExt(doc,WIDGET_CAPTION_NAME).text();
+ setCaption(i18n("Create Subclass of ")+m_baseClassName);
+
+ // Special widget specific slots
+ SlotItem *newSlot;
+ m_qtBaseClassName = DomUtil::elementByPathExt(doc,"widget").attribute("class","QDialog");
+
+ if ( (m_qtBaseClassName=="QMainWindow") || (m_qtBaseClassName=="QWidget") )
+ m_canBeModal = false;
+ else
+ m_canBeModal = true;
+ if (m_qtBaseClassName != "QWidget")
+ {
+ newSlot = new SLOT_ACCEPT;
+ newSlot->setOn(false);
+ if (alreadyInSubclass("accept()"))
+ newSlot->setAllreadyInSubclass();
+ m_slotView->insertItem(newSlot);
+ m_slots << newSlot;
+
+ newSlot = new SLOT_REJECT;
+ newSlot->setOn(false);
+ if (alreadyInSubclass("reject()"))
+ newSlot->setAllreadyInSubclass();
+ m_slotView->insertItem(newSlot);
+ m_slots << newSlot;
+ }
+
+ if (m_qtBaseClassName == "QWizard")
+ {
+ newSlot = new SLOT_NEXT;
+ m_slotView->insertItem(newSlot);
+ if (alreadyInSubclass("next()"))
+ newSlot->setAllreadyInSubclass();
+ m_slots << newSlot;
+ newSlot = new SLOT_BACK;
+ m_slotView->insertItem(newSlot);
+ if (alreadyInSubclass("back()"))
+ newSlot->setAllreadyInSubclass();
+ m_slots << newSlot;
+ newSlot = new SLOT_HELP;
+ newSlot->setOn(false);
+ if (alreadyInSubclass("help()"))
+ newSlot->setAllreadyInSubclass();
+ m_slotView->insertItem(newSlot);
+ m_slots << newSlot;
+ }
+
+ QDomElement slotsElem = DomUtil::elementByPathExt(doc,WIDGET_SLOTS);
+ QDomNodeList slotnodes = slotsElem.childNodes();
+
+ for (unsigned int i=0; i<slotnodes.count();i++)
+ {
+ QDomElement slotelem = slotnodes.item(i).toElement();
+ newSlot = new SlotItem(m_slotView,slotelem.text(),
+ slotelem.attributeNode("specifier").value(),
+ slotelem.attributeNode("access").value(),
+ slotelem.attributeNode("returnType").value(),false);
+ m_slotView->insertItem(newSlot);
+ if (alreadyInSubclass(slotelem.text()))
+ newSlot->setAllreadyInSubclass();
+ m_slots << newSlot;
+ }
+
+ QDomElement funcsElem = DomUtil::elementByPathExt(doc,WIDGET_FUNCTIONS);
+ QDomNodeList funcnodes = funcsElem.childNodes();
+ SlotItem *newFunc;
+ for (unsigned int i=0; i<funcnodes.count();i++)
+ {
+ QDomElement funcelem = funcnodes.item(i).toElement();
+ newFunc = new SlotItem(m_slotView,funcelem.text(),
+ funcelem.attributeNode("specifier").value(),
+ funcelem.attributeNode("access").value(),
+ funcelem.attributeNode("returnType").value(),true);
+ m_slotView->insertItem(newFunc);
+ if (alreadyInSubclass(funcelem.text()))
+ newFunc->setAllreadyInSubclass();
+ m_slots << newFunc;
+ }
+}
+
+SubclassingDlg::~SubclassingDlg()
+{
+}
+
+
+void SubclassingDlg::updateDlg()
+{
+}
+
+void SubclassingDlg::replace(QString &string, const QString& search, const QString& replace)
+{
+ int nextPos = string.find(search);
+ unsigned int searchLength = search.length();
+ while (nextPos>-1)
+ {
+ string = string.replace(nextPos,searchLength,replace);
+ nextPos = string.find(search,nextPos+replace.length());
+ }
+}
+
+bool SubclassingDlg::loadBuffer(QString &buffer, const QString& filename)
+{
+ // open file and buffer it
+ QFile dataFile(filename);
+ if (!dataFile.open(IO_ReadOnly))
+ return false;
+ char *temp = new char[dataFile.size()+1];
+ dataFile.readBlock(temp,dataFile.size());
+ temp[dataFile.size()]='\0';
+ buffer = temp;
+ delete [] temp;
+ dataFile.close();
+ return true;
+}
+
+bool SubclassingDlg::replaceKeywords(QString &buffer,bool canBeModal)
+{
+ replace(buffer,"$NEWFILENAMEUC$",m_edFileName->text().upper());
+ replace(buffer,"$BASEFILENAMELC$",m_formName.lower());
+ replace(buffer,"$BASEFILENAME$",m_formName);
+ replace(buffer,"$NEWCLASS$",m_edClassName->text());
+ replace(buffer,"$QTBASECLASS$", m_qtBaseClassName );
+ replace(buffer,"$BASECLASS$",m_baseClassName);
+ replace(buffer,"$NEWFILENAMELC$",m_edFileName->text().lower());
+ if (canBeModal)
+ {
+ replace(buffer,"$CAN_BE_MODAL_H$",", bool modal = FALSE");
+ replace(buffer,"$CAN_BE_MODAL_CPP1$",", bool modal");
+ replace(buffer,"$CAN_BE_MODAL_CPP2$",", modal");
+ }
+ else
+ {
+ replace(buffer,"$CAN_BE_MODAL_H$","");
+ replace(buffer,"$CAN_BE_MODAL_CPP1$","");
+ replace(buffer,"$CAN_BE_MODAL_CPP2$","");
+ }
+
+ return true;
+}
+
+bool SubclassingDlg::saveBuffer(QString &buffer, const QString& filename)
+{
+ // save buffer
+
+ QFile dataFile(filename);
+ if (!dataFile.open(IO_WriteOnly | IO_Truncate))
+ return false;
+ dataFile.writeBlock((buffer+"\n").ascii(),(buffer+"\n").length());
+ dataFile.close();
+ return true;
+}
+
+
+void SubclassingDlg::accept()
+{
+ KConfig *config = CppSupportFactory::instance()->config();
+ if (config)
+ {
+ config->setGroup("Subclassing");
+ config->writeEntry("Reformat Source", reformatDefault_box->isChecked());
+ }
+
+ unsigned int i;
+
+ // h - file
+
+ QString public_slot =
+ "/*$PUBLIC_SLOTS$*/\n ";
+
+ QString protected_slot =
+ "/*$PROTECTED_SLOTS$*/\n ";
+
+ QString public_func =
+ "/*$PUBLIC_FUNCTIONS$*/\n ";
+
+ QString protected_func =
+ "/*$PROTECTED_FUNCTIONS$*/\n ";
+
+ QString buffer;
+ int qtVersion = DomUtil::readIntEntry( *m_cppSupport->project()->projectDom(), "/kdevcppsupport/qt/version", 3 );
+ if (m_creatingNewSubclass)
+ {
+ if ( qtVersion == 3 )
+ loadBuffer(buffer,::locate("data", "kdevcppsupport/subclassing/subclass_template.h"));
+ else
+ loadBuffer(buffer,::locate("data", "kdevcppsupport/subclassing/subclass_qt4_template.h"));
+
+ buffer = FileTemplate::read(m_cppSupport, "h") + buffer;
+ QFileInfo fi(m_filename + ".h");
+ QString module = fi.baseName();
+ QString basefilename = fi.baseName(true);
+ buffer.replace(QRegExp("\\$MODULE\\$"),module);
+ buffer.replace(QRegExp("\\$FILENAME\\$"),basefilename);
+ }
+ else
+ loadBuffer(buffer,m_filename+".h");
+
+ replaceKeywords(buffer,m_canBeModal);
+ for (i=0; i<m_slots.count(); i++)
+ {
+ SlotItem *slitem = m_slots[i];
+ if (!slitem->isOn() ||
+ slitem->m_alreadyInSubclass)
+ continue;
+ QString declBuild;
+ if (slitem->m_access=="public")
+ if (!slitem->m_isFunc)
+ declBuild = public_slot;
+ else
+ declBuild = public_func;
+ if (slitem->m_access=="protected")
+ if (!slitem->m_isFunc)
+ declBuild = protected_slot;
+ else
+ declBuild = protected_func;
+ if (!(slitem->m_specifier=="non virtual"))
+ declBuild += "virtual ";
+ declBuild += slitem->m_returnType + " ";
+ QString spacer;
+ if (slitem->m_access=="public")
+ {
+ if (!slitem->m_isFunc)
+ {
+ declBuild += spacer.fill(' ',43-declBuild.length()) + slitem->m_methodName + ";";
+ replace(buffer,"/*$PUBLIC_SLOTS$*/",declBuild);
+ }
+ else
+ {
+ declBuild += spacer.fill(' ',47-declBuild.length()) + slitem->m_methodName + ";";
+ replace(buffer,"/*$PUBLIC_FUNCTIONS$*/",declBuild);
+ }
+ }
+ if (slitem->m_access=="protected")
+ {
+ if (!slitem->m_isFunc)
+ {
+ declBuild += spacer.fill(' ',46-declBuild.length()) + slitem->m_methodName + ";";
+ replace(buffer,"/*$PROTECTED_SLOTS$*/",declBuild);
+ }
+ else
+ {
+ declBuild += spacer.fill(' ',50-declBuild.length()) + slitem->m_methodName + ";";
+ replace(buffer,"/*$PROTECTED_FUNCTIONS$*/",declBuild);
+ }
+ }
+ }
+
+ if (reformat_box->isChecked())
+ {
+ KDevSourceFormatter *fmt = m_cppSupport->extension<KDevSourceFormatter>("KDevelop/SourceFormatter");
+ if (fmt)
+ buffer = fmt->formatSource(buffer);
+ }
+
+ if (m_creatingNewSubclass)
+ saveBuffer(buffer,m_formPath + "/" + m_edFileName->text()+".h");
+ else
+ saveBuffer(buffer,m_filename+".h");
+
+ // cpp - file
+
+ QString implementation =
+ "/*$SPECIALIZATION$*/\n"
+ "$RETURNTYPE$ $NEWCLASS$::$METHOD$\n"
+ "{\n"
+ "}\n";
+
+ QString implementation_callbase =
+ "/*$SPECIALIZATION$*/\n"
+ "$RETURNTYPE$ $NEWCLASS$::$METHOD$\n"
+ "{\n"
+ " $QTBASECLASS$::$METHOD$;\n"
+ "}\n";
+
+
+ if (m_creatingNewSubclass)
+ {
+ if ( qtVersion == 3 )
+ loadBuffer(buffer,::locate("data", "kdevcppsupport/subclassing/subclass_template.cpp"));
+ else
+ loadBuffer(buffer,::locate("data", "kdevcppsupport/subclassing/subclass_qt4_template.cpp"));
+
+ buffer = FileTemplate::read(m_cppSupport, "cpp") + buffer;
+ QFileInfo fi(m_filename + ".cpp");
+ QString module = fi.baseName();
+ QString basefilename = fi.baseName(true);
+ buffer.replace(QRegExp("\\$MODULE\\$"),module);
+ buffer.replace(QRegExp("\\$FILENAME\\$"),basefilename);
+ if ( (m_cppSupport->project()) && (m_cppSupport->project()->options() & KDevProject::UsesAutotoolsBuildSystem))
+ buffer += "\n#include \"$NEWFILENAMELC$.moc\"\n";
+ }
+ else
+ loadBuffer(buffer,m_filename+".cpp");
+
+ replaceKeywords(buffer,m_canBeModal);
+ for (i=0; i<m_slots.count(); i++)
+ {
+ SlotItem *slitem = m_slots[i];
+ if (!slitem->isOn() ||
+ slitem->m_alreadyInSubclass)
+ continue;
+ QString impl = slitem->m_callBaseClass ? implementation_callbase : implementation;
+ replace(impl,"$RETURNTYPE$",slitem->m_returnType);
+ replace(impl,"$NEWCLASS$",m_edClassName->text());
+ replace(impl,"$METHOD$", slitem->m_methodName);
+ replace(impl,"$QTBASECLASS$", m_qtBaseClassName);
+ replace(buffer,"/*$SPECIALIZATION$*/",impl);
+ }
+
+ if (reformat_box->isChecked())
+ {
+ KDevSourceFormatter *fmt = m_cppSupport->extension<KDevSourceFormatter>("KDevelop/SourceFormatter");
+ if (fmt)
+ buffer = fmt->formatSource(buffer);
+ }
+
+ if (m_creatingNewSubclass)
+ saveBuffer(buffer,m_formPath + "/" + m_edFileName->text()+".cpp");
+ else
+ saveBuffer(buffer,m_filename+".cpp");
+
+ if (m_creatingNewSubclass)
+ {
+ m_newFileNames.append(m_formPath + "/" + m_edFileName->text()+".cpp");
+ m_newFileNames.append(m_formPath + "/" + m_edFileName->text()+".h");
+ }
+ SubclassingDlgBase::accept();
+}
+
+void SubclassingDlg::onChangedClassName()
+{
+ m_edFileName->setText(m_edClassName->text().lower());
+ if (m_edFileName->text().isEmpty() ||
+ m_edClassName->text().isEmpty())
+ m_btnOk->setEnabled(false);
+ else
+ m_btnOk->setEnabled(true);
+}
+
+QString SubclassingDlg::readBaseClassName()
+{
+ QDomDocument doc;
+ DomUtil::openDOMFile(doc,m_formFile);
+ return DomUtil::elementByPathExt(doc,WIDGET_CLASS_NAME).text();
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/subclassingdlg.h b/languages/cpp/subclassingdlg.h
new file mode 100644
index 00000000..2f645f09
--- /dev/null
+++ b/languages/cpp/subclassingdlg.h
@@ -0,0 +1,85 @@
+/***************************************************************************
+* Copyright (C) 2002 by Jakob Simon-Gaarde *
+* jsgaarde@tdcspace.dk *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef SUBCLASSINGDLG_H
+#define SUBCLASSINGDLG_H
+
+#include <qlistview.h>
+
+#include "subclassingdlgbase.h"
+
+class QStringList;
+class QDomDocument;
+class CppSupportPart;
+
+class SlotItem : public QCheckListItem
+{
+public:
+ SlotItem( QListView *parent, const QString &text,
+ const QString &specifier, const QString &Access,
+ const QString &returnType, bool isFunc,
+ bool callBaseClass = false );
+ void setAllreadyInSubclass();
+ QString m_access;
+ QString m_methodName;
+ QString m_returnType;
+ QString m_specifier;
+ bool m_isFunc;
+ bool m_callBaseClass;
+ bool m_alreadyInSubclass;
+};
+
+
+class SubclassingDlg : public SubclassingDlgBase
+{
+public:
+ SubclassingDlg( CppSupportPart* cppSupport, const QString &formFile, QStringList &newFileNames,
+ QWidget* parent = 0, const char* name = 0,
+ bool modal = FALSE, WFlags fl = 0 );
+ SubclassingDlg( CppSupportPart* cppSupport, const QString &formFile, const QString &filename, QStringList &dummy,
+ QWidget* parent = 0, const char* name = 0,
+ bool modal = FALSE, WFlags fl = 0 );
+ ~SubclassingDlg();
+
+private:
+ void readUiFile();
+ QString readBaseClassName();
+ void updateDlg();
+ bool replaceKeywords( QString &buffer, bool canBeModal = true );
+ void replace( QString &string, const QString& search, const QString& replace );
+ bool saveBuffer( QString &buffer, const QString& filename );
+ bool loadBuffer( QString &buffer, const QString& filename );
+ bool alreadyInSubclass( const QString &method );
+ bool m_creatingNewSubclass;
+
+public slots:
+ virtual void accept();
+ virtual void onChangedClassName();
+
+protected:
+ QStringList &m_newFileNames;
+ QString m_filename;
+ QString m_formFile;
+ QString m_baseClassName;
+ QString m_qtBaseClassName;
+ QString m_baseCaption;
+ QString m_formName;
+ QString m_formPath;
+ QStringList m_parsedMethods;
+ bool m_canBeModal;
+ QValueList<SlotItem*> m_slots;
+ QValueList<SlotItem*> m_functions;
+ CppSupportPart* m_cppSupport;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/subclassingdlgbase.ui b/languages/cpp/subclassingdlgbase.ui
new file mode 100644
index 00000000..c732b244
--- /dev/null
+++ b/languages/cpp/subclassingdlgbase.ui
@@ -0,0 +1,244 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>SubclassingDlgBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SubclassingDlgBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>588</width>
+ <height>493</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Create Subclass</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Subclass Properties</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Specialize following slots:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_slotView</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_edClassName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>C&amp;lass name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_edClassName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>F&amp;ile name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_edFileName</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_edFileName</cstring>
+ </property>
+ </widget>
+ <widget class="QListView" row="3" column="0" rowspan="1" colspan="3">
+ <column>
+ <property name="text">
+ <string>Method</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Access</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Specifier</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Return Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_slotView</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>reformat_box</cstring>
+ </property>
+ <property name="text">
+ <string>Re&amp;format source</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="2">
+ <property name="name">
+ <cstring>reformatDefault_box</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Reformat source by &amp;default</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>m_btnOk</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;reate</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>m_btnCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>110</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_btnOk</sender>
+ <signal>clicked()</signal>
+ <receiver>SubclassingDlgBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>m_btnCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>SubclassingDlgBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>m_edClassName</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SubclassingDlgBase</receiver>
+ <slot>onChangedClassName()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot>onChangedClassName()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/cpp/tag_creator.cpp b/languages/cpp/tag_creator.cpp
new file mode 100644
index 00000000..8ad22d38
--- /dev/null
+++ b/languages/cpp/tag_creator.cpp
@@ -0,0 +1,884 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "tag_creator.h"
+#include "catalog.h"
+#include "ast_utils.h"
+#include "cpp_tags.h"
+#include "doxydoc.h"
+#include "driver.h"
+
+#include <kdebug.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+
+DoxyDoc* TagCreator::m_documentation = new DoxyDoc( QStringList() );
+
+TagCreator::TagCreator( const QString& fileName, Catalog* c )
+: m_catalog( c ), m_fileName( fileName ), m_anon( 0 )
+{
+}
+
+TagCreator::~TagCreator()
+{
+}
+
+void TagCreator::destroyDocumentation()
+{
+ delete m_documentation;
+}
+
+void TagCreator::setDocumentationDirectories( const QStringList& str )
+{
+ if ( m_documentation )
+ delete m_documentation;
+ m_documentation = new DoxyDoc( str );
+}
+
+void TagCreator::parseDeclaration( DeclarationAST* ast )
+{
+ if( ast->nodeType() == NodeType_AccessDeclaration ||
+ m_currentAccess.isEmpty() ||
+ m_currentAccess.contains("private") || ///In order to correctly evaluate templates, the private members are necessary too
+ m_currentAccess.contains("public") ||
+ m_currentAccess.contains("protected") ||
+ m_currentAccess.contains("signals") )
+ {
+ TreeParser::parseDeclaration( ast );
+ }
+}
+
+void TagCreator::parseTranslationUnit( const ParsedFile& ast )
+{
+ m_currentScope.clear();
+ m_currentAccess = QString::null;
+ m_inSlots = false;
+ m_inSignals = false;
+ m_anon = 0;
+ m_imports.clear();
+ m_inClass = false;
+
+ m_imports << QStringList();
+
+ Tag tag;
+ tag.setKind( Tag::Kind_TranslationUnit );
+ tag.setFileName( m_fileName );
+ tag.setName( m_fileName );
+
+ QByteArray data;
+ QDataStream stream(data, IO_WriteOnly );
+ ast.write( stream );
+ tag.setAttribute( "cppparsedfile", data );
+ tag.setAttribute( "includedFrom", ast.includedFrom() );
+ tag.setAttribute( "skippedLines", QString("%1").arg( ast.skippedLines()) );
+ tag.setAttribute( "macroValueHash", QString("%1").arg( ast.usedMacros().valueHash()) );
+ tag.setAttribute( "macroIdHash", QString("%1").arg( ast.usedMacros().idHash() ) );
+
+ tag.setScope( m_currentScope );
+ if( !ast->comment().isEmpty() )
+ tag.setComment( ast->comment() );
+
+ m_catalog->addItem( tag );
+
+ TreeParser::parseTranslationUnit( ast );
+ m_imports.pop_back();
+}
+
+void TagCreator::parseNamespaceAlias( NamespaceAliasAST* ast ) {
+ QString nsName;
+ QString aliasName;
+
+ if( !ast->namespaceName() || ast->namespaceName()->text().isEmpty() )
+ {
+ // anonymous namespace
+ }
+ else
+ nsName = ast->namespaceName()->text();
+
+ if( ast->aliasName() )
+ aliasName = ast->aliasName()->text();
+
+ Tag tag;
+ tag.setKind( Tag::Kind_Namespace );
+ tag.setFileName( m_fileName );
+ tag.setName( nsName ); ///nsName is the new name of the namespace
+ tag.setAttribute( "alias", aliasName ); ///aliasName is the name of the real namespace
+ tag.setScope( m_currentScope );
+ if( !ast->comment().isEmpty() )
+ tag.setComment( ast->comment() );
+
+ int line, col;
+ ast->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ ast->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ m_catalog->addItem( tag );
+
+ TreeParser::parseNamespaceAlias( ast );
+}
+
+void TagCreator::parseNamespace( NamespaceAST* ast )
+{
+ QString nsName;
+ if( !ast->namespaceName() || ast->namespaceName()->text().isEmpty() )
+ {
+ // anonymous namespace
+ }
+ else
+ nsName = ast->namespaceName()->text();
+
+ Tag tag;
+ tag.setKind( Tag::Kind_Namespace );
+ tag.setFileName( m_fileName );
+ tag.setName( nsName );
+ tag.setScope( m_currentScope );
+ if( !ast->comment().isEmpty() )
+ tag.setComment( ast->comment() );
+
+ int line, col;
+ ast->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ ast->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ m_catalog->addItem( tag );
+
+ m_currentScope.push_back( nsName );
+ TreeParser::parseNamespace( ast );
+ m_currentScope.pop_back();
+}
+
+void TagCreator::parseElaboratedTypeSpecifier( ElaboratedTypeSpecifierAST* ast )
+{
+ TreeParser::parseElaboratedTypeSpecifier( ast );
+}
+
+void TagCreator::parseUsingDirective( UsingDirectiveAST* ast )
+{
+ QString name;
+ if( ast->name() )
+ name = ast->name()->text();
+
+ if( !name.isNull() ){
+ Tag tag;
+ tag.setKind( Tag::Kind_UsingDirective );
+ tag.setFileName( m_fileName );
+ tag.setName( name );
+ tag.setScope( m_currentScope );
+
+ int line, col;
+ ast->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ ast->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ m_catalog->addItem( tag );
+ }
+
+ m_imports.back().push_back( name );
+}
+
+void TagCreator::parseTypedef( TypedefAST* ast )
+{
+ TypeSpecifierAST* typeSpec = ast->typeSpec();
+ InitDeclaratorListAST* declarators = ast->initDeclaratorList();
+
+ if( typeSpec && declarators ){
+ QString typeId;
+
+ if( typeSpec->name() )
+ typeId = typeSpec->name()->text();
+
+ QPtrList<InitDeclaratorAST> l( declarators->initDeclaratorList() );
+ QPtrListIterator<InitDeclaratorAST> it( l );
+
+ InitDeclaratorAST* initDecl = 0;
+ while( 0 != (initDecl = it.current()) )
+ {
+
+ QString type, id;
+ if( initDecl->declarator() )
+ {
+ type = typeOfDeclaration( typeSpec, initDecl->declarator() );
+
+ DeclaratorAST* d = initDecl->declarator();
+ while( d->subDeclarator() )
+ d = d->subDeclarator();
+
+ if( d->declaratorId() )
+ id = d->declaratorId()->text();
+ }
+
+ Tag tag;
+ if( !ast->comment().isEmpty() )
+ tag.setComment( ast->comment() );
+
+ tag.setKind( Tag::Kind_Typedef );
+ tag.setFileName( m_fileName );
+ tag.setName( id );
+ tag.setScope( m_currentScope );
+ tag.setAttribute( "t", type );
+
+ int line, col;
+ initDecl->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ initDecl->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ m_catalog->addItem( tag );
+
+ ++it;
+ }
+
+ }
+}
+
+void TagCreator::parseTemplateDeclaration( TemplateDeclarationAST* ast )
+{
+ m_currentTemplateDeclarator.push( ast );
+ if ( ast->declaration() )
+ parseDeclaration( ast->declaration() );
+
+
+
+ TreeParser::parseTemplateDeclaration( ast );
+
+ m_currentTemplateDeclarator.pop();
+}
+
+
+void TagCreator::parseSimpleDeclaration( SimpleDeclarationAST* ast )
+{
+ CommentPusher push( *this, ast->comment() );
+
+ TypeSpecifierAST* typeSpec = ast->typeSpec();
+ InitDeclaratorListAST* declarators = ast->initDeclaratorList();
+
+ if( typeSpec )
+ parseTypeSpecifier( typeSpec );
+
+ if( declarators )
+ {
+ QPtrList<InitDeclaratorAST> l = declarators->initDeclaratorList();
+
+ QPtrListIterator<InitDeclaratorAST> it( l );
+ while( it.current() )
+ {
+ parseMyDeclaration( ast->functionSpecifier(), ast->storageSpecifier(), typeSpec, it.current() );
+ ++it;
+ }
+ }
+}
+
+void TagCreator::parseFunctionDefinition( FunctionDefinitionAST* ast )
+{
+ TypeSpecifierAST * typeSpec = ast->typeSpec();
+ GroupAST* funSpec = ast->functionSpecifier();
+ GroupAST* storageSpec = ast->storageSpecifier();
+
+ if ( !ast->initDeclarator() )
+ return ;
+
+ DeclaratorAST* d = ast->initDeclarator() ->declarator();
+
+ if ( !d->declaratorId() )
+ return ;
+
+ bool isFriend = false;
+ bool isVirtual = false;
+ bool isStatic = false;
+ bool isInline = false;
+
+ if ( funSpec )
+ {
+ QPtrList<AST> l = funSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "virtual" )
+ isVirtual = true;
+ else if ( text == "inline" )
+ isInline = true;
+ ++it;
+ }
+ }
+
+ if ( storageSpec )
+ {
+ QPtrList<AST> l = storageSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "friend" )
+ isFriend = true;
+ else if ( text == "static" )
+ isStatic = true;
+ ++it;
+ }
+ }
+
+
+ QString id = d->declaratorId() ->unqualifiedName() ->text().stripWhiteSpace();
+ QString scopeStr = scopeOfDeclarator( d );
+
+ Tag tag;
+ if( !comment() )
+ tag.setComment( ast->comment() );
+
+ CppFunction<Tag> tagBuilder( tag );
+ tag.setKind( Tag::Kind_Function );
+
+ tag.setFileName( m_fileName );
+ tag.setName( id );
+ tag.setScope( QStringList::split( ".", scopeStr ) );
+ if( !ast->comment().isEmpty() )
+ tag.setComment( ast->comment() );
+
+ int line, col;
+ ast->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ ast->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ tagBuilder.setType( typeOfDeclaration( typeSpec, d ) );
+
+ parseFunctionArguments( tag, d );
+ checkTemplateDeclarator( tag );
+
+ QString arguments = tag.attribute( "a" ).toStringList().join( "," );
+tag.setAttribute( "description", m_documentation->functionDescription( scopeStr.replace( QRegExp( "." ), ":" ), id, typeOfDeclaration( typeSpec, d ), arguments ) );
+
+ tagBuilder.setAccess( TagUtils::stringToAccess( m_currentAccess ) );
+
+ tagBuilder.setFriend( isFriend );
+ tagBuilder.setVirtual( isVirtual );
+ tagBuilder.setStatic( isStatic );
+ tagBuilder.setInline( isInline );
+ tagBuilder.setPure( false );
+ tagBuilder.setConst( d->constant() != 0 );
+ tagBuilder.setSignal( m_inSignals );
+ tagBuilder.setSlot( m_inSlots );
+
+ m_catalog->addItem( tag );
+
+ if ( !m_currentAccess.isEmpty() )
+ {
+ tag.setKind( Tag::Kind_FunctionDeclaration );
+ m_catalog->addItem( tag );
+ }
+}
+
+void TagCreator::parseLinkageBody( LinkageBodyAST* ast )
+{
+ QPtrList<DeclarationAST> l = ast->declarationList();
+ QPtrListIterator<DeclarationAST> it( l );
+ while ( it.current() )
+ {
+ parseDeclaration( it.current() );
+ ++it;
+ }
+}
+
+void TagCreator::checkTemplateDeclarator( Tag& tag ) {
+ if( !m_currentTemplateDeclarator.empty() && m_currentTemplateDeclarator.top() != 0) {
+ TemplateDeclarationAST* a = m_currentTemplateDeclarator.top();
+
+ m_currentTemplateDeclarator.pop();
+ m_currentTemplateDeclarator.push(0);
+
+ ///the template-declarator belongs to exactly this declaration
+ takeTemplateParams( tag, a );
+ }
+}
+
+
+void TagCreator::takeTemplateParams( Tag& target, TemplateDeclarationAST* ast) {
+ TemplateParameterListAST* pl = ast->templateParameterList();
+ if( pl ) {
+ QPtrList<TemplateParameterAST> list = pl->templateParameterList();
+
+ TemplateParameterAST* curr = list.first();
+ while( curr != 0 ) {
+ QString a, b;
+ if( curr->typeParameter() ) {
+ if( curr->typeParameter()->name() )
+ a = curr->typeParameter()->name()->text();
+ if( curr->typeParameter()->typeId() )
+ b = curr->typeParameter()->typeId()->text();
+ }
+
+ target.addTemplateParam( a, b );
+ curr = list.next();
+ }
+ }
+}
+
+
+void TagCreator::parseClassSpecifier( ClassSpecifierAST* ast )
+{
+ int startLine, startColumn;
+ int endLine, endColumn;
+ ast->getStartPosition( &startLine, &startColumn );
+ ast->getEndPosition( &endLine, &endColumn );
+
+ QString oldAccess = m_currentAccess;
+ bool oldInSlots = m_inSlots;
+ bool oldInSignals = m_inSignals;
+
+ QString kind = ast->classKey() ->text();
+ if ( kind == "class" )
+ m_currentAccess = "private";
+ else
+ m_currentAccess = "public";
+ m_inSlots = false;
+ m_inSignals = false;
+
+ QString className;
+ if ( !ast->name() )
+ {
+ //QFileInfo fileInfo( m_fileName );
+ //QString shortFileName = fileInfo.baseName();
+ //className.sprintf( "(%s_%d)", shortFileName.local8Bit(), m_anon++ );
+ }
+ else
+ {
+ className = ast->name() ->text();
+ }
+
+ Tag tag;
+ if( !ast->comment().isEmpty() )
+ tag.setComment( ast->comment() );
+
+ tag.setKind( Tag::Kind_Class );
+
+ tag.setFileName( m_fileName );
+
+ int i = className.find( '<' );
+ QString specialization;
+
+ if( i != -1 ) {
+ specialization = className.mid( i );
+ tag.setSpecializationDeclaration( specialization );
+ className = className.left( i );
+ }
+
+ tag.setName( className );
+ tag.setScope( m_currentScope );
+
+ int line, col;
+ ast->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ ast->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ checkTemplateDeclarator( tag );
+
+ m_catalog->addItem( tag );
+
+ if ( ast->baseClause() )
+ parseBaseClause( tag.path()+specialization, ast->baseClause() );
+
+ m_currentScope.push_back( className + specialization );
+ int oldInClass = m_inClass;
+ m_inClass = true;
+ TreeParser::parseClassSpecifier( ast );
+ m_currentScope.pop_back();
+ m_inClass = oldInClass;
+
+ m_currentAccess = oldAccess;
+ m_inSlots = oldInSlots;
+ m_inSignals = oldInSignals;
+}
+
+void TagCreator::parseEnumSpecifier( EnumSpecifierAST* ast )
+{
+ Tag tag;
+ if( !ast->comment().isEmpty() )
+ tag.setComment( ast->comment() );
+
+ tag.setKind( Tag::Kind_Enum );
+
+ tag.setFileName( m_fileName );
+ if ( ast->name() )
+ tag.setName( ast->name() ->text() );
+ tag.setScope( m_currentScope );
+
+ int line, col;
+ ast->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ ast->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ m_catalog->addItem( tag );
+
+ QPtrList<EnumeratorAST> l = ast->enumeratorList();
+ QPtrListIterator<EnumeratorAST> it( l );
+ while ( it.current() )
+ {
+ QString name = it.current() ->id() ->text();
+
+ Tag tag;
+ tag.setKind( Tag::Kind_Enumerator );
+ tag.setComment( it.current()->comment() );
+
+ tag.setFileName( m_fileName );
+ tag.setName( name );
+ tag.setScope( m_currentScope );
+
+ if( ast->name() ) {
+ tag.setAttribute( "enum", ast->name()->text() );
+ } else {
+ tag.setAttribute( "enum", "const int" );
+ }
+
+ int line, col;
+ it.current() ->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ it.current() ->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ m_catalog->addItem( tag );
+
+ ++it;
+ }
+
+ TreeParser::parseEnumSpecifier( ast );
+}
+
+void TagCreator::parseMyDeclaration( GroupAST* funSpec, GroupAST* storageSpec, TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl )
+{
+ DeclaratorAST * d = decl->declarator();
+
+ if ( !d )
+ return ;
+
+ if ( !d->subDeclarator() && d->parameterDeclarationClause() )
+ return parseFunctionDeclaration( funSpec, storageSpec, typeSpec, decl );
+
+ DeclaratorAST* t = d;
+ while ( t && t->subDeclarator() )
+ t = t->subDeclarator();
+
+ QString id;
+ if ( t && t->declaratorId() && t->declaratorId() ->unqualifiedName() )
+ id = t->declaratorId() ->unqualifiedName() ->text();
+
+ QString scopeStr = scopeOfDeclarator( d );
+
+ QString type = typeOfDeclaration( typeSpec, d );
+
+
+ bool isFriend = false;
+ //bool isVirtual = false;
+ bool isStatic = false;
+ //bool isInline = false;
+ //bool isInitialized = decl->initializer() != 0;
+
+ if ( storageSpec )
+ {
+ QPtrList<AST> l = storageSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "friend" )
+ isFriend = true;
+ else if ( text == "static" )
+ isStatic = true;
+ ++it;
+ }
+ }
+
+ Tag tag;
+ CppVariable<Tag> tagBuilder( tag );
+
+ tag.setKind( Tag::Kind_Variable );
+ tag.setFileName( m_fileName );
+ tag.setName( id );
+ tag.setScope( QStringList::split( ".", scopeStr ) );
+ if( !comment().isEmpty() )
+ tag.setComment( comment() );
+
+ int line, col;
+ decl->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ decl->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ tagBuilder.setType( type );
+ tagBuilder.setFriend( isFriend );
+ tagBuilder.setStatic( isStatic );
+ tagBuilder.setAccess( TagUtils::stringToAccess( m_currentAccess ) );
+
+ m_catalog->addItem( tag );
+}
+
+void TagCreator::parseAccessDeclaration( AccessDeclarationAST * access )
+{
+ QPtrList<AST> l = access->accessList();
+
+ m_currentAccess = l.at( 0 )->text();
+ if( m_currentAccess == "signals" )
+ m_currentAccess = "protected";
+
+ m_inSlots = l.count() > 1 ? l.at( 1 )->text() == "slots" : false;
+ m_inSignals = l.count() >= 1 ? l.at( 0 )->text() == "signals" : false;
+}
+
+void TagCreator::parseFunctionDeclaration( GroupAST* funSpec, GroupAST* storageSpec,
+ TypeSpecifierAST * typeSpec, InitDeclaratorAST * decl )
+{
+ bool isFriend = false;
+ bool isVirtual = false;
+ bool isStatic = false;
+ bool isInline = false;
+ bool isPure = decl->initializer() != 0;
+
+ if ( funSpec )
+ {
+ QPtrList<AST> l = funSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "virtual" )
+ isVirtual = true;
+ else if ( text == "inline" )
+ isInline = true;
+ ++it;
+ }
+ }
+
+ if ( storageSpec )
+ {
+ QPtrList<AST> l = storageSpec->nodeList();
+ QPtrListIterator<AST> it( l );
+ while ( it.current() )
+ {
+ QString text = it.current() ->text();
+ if ( text == "friend" )
+ isFriend = true;
+ else if ( text == "static" )
+ isStatic = true;
+ ++it;
+ }
+ }
+
+ int startLine, startColumn;
+ int endLine, endColumn;
+ decl->getStartPosition( &startLine, &startColumn );
+ decl->getEndPosition( &endLine, &endColumn );
+
+ DeclaratorAST* d = decl->declarator();
+ QString id = d->declaratorId() ->unqualifiedName() ->text();
+
+ QString type = typeOfDeclaration( typeSpec, d );
+
+ Tag tag;
+ CppFunction<Tag> tagBuilder( tag );
+
+ if( !comment().isEmpty() )
+ tag.setComment( comment() );
+ tag.setKind( Tag::Kind_FunctionDeclaration );
+ tag.setFileName( m_fileName );
+ tag.setName( id );
+ tag.setScope( m_currentScope );
+
+ int line, col;
+ decl->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ decl->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ tagBuilder.setType( type );
+ tagBuilder.setFriend( isFriend );
+ tagBuilder.setVirtual( isVirtual );
+ tagBuilder.setStatic( isStatic );
+ tagBuilder.setInline( isInline );
+ tagBuilder.setPure( isPure );
+ tagBuilder.setConst( d->constant() != 0 );
+ tagBuilder.setSignal( m_inSignals );
+ tagBuilder.setSlot( m_inSlots );
+
+ parseFunctionArguments( tag, d );
+ checkTemplateDeclarator( tag );
+
+ QString arguments = tag.attribute( "a" ).toStringList().join( "," );
+ QString scopeStr = m_currentScope.join( "::" );
+ tag.setAttribute( "description", m_documentation->functionDescription( scopeStr, id, type, arguments ) );
+
+ m_catalog->addItem( tag );
+}
+
+void TagCreator::parseFunctionArguments( Tag& tag, DeclaratorAST* declarator )
+{
+ ParameterDeclarationClauseAST* clause = declarator->parameterDeclarationClause();
+
+ QStringList types;
+ QStringList args;
+ if( clause && clause->parameterDeclarationList() ){
+ ParameterDeclarationListAST* params = clause->parameterDeclarationList();
+ QPtrList<ParameterDeclarationAST> l( params->parameterList() );
+ QPtrListIterator<ParameterDeclarationAST> it( l );
+
+ while( it.current() ){
+ ParameterDeclarationAST* param = it.current();
+ ++it;
+
+ QString name;
+ if( param->declarator() ){
+ name = declaratorToString(param->declarator(), QString::null, true );
+ }
+
+ QString type = typeOfDeclaration( param->typeSpec(), param->declarator() );
+
+ types << type;
+ args << name;
+ }
+
+ if( clause->ellipsis() ){
+ types << "...";
+ args << "";
+ }
+
+ }
+
+ CppFunction<Tag> tagBuilder( tag );
+
+ tagBuilder.setArguments( types );
+ tagBuilder.setArgumentNames( args );
+}
+
+QString TagCreator::typeOfDeclaration( TypeSpecifierAST* typeSpec, DeclaratorAST* declarator )
+{
+ if( !typeSpec || !declarator )
+ return QString::null;
+
+ QString text;
+
+ text += typeSpec->text();
+ text = text.simplifyWhiteSpace();
+
+ QPtrList<AST> ptrOpList = declarator->ptrOpList();
+ for( QPtrListIterator<AST> it(ptrOpList); it.current(); ++it )
+ text += it.current()->text();
+
+ for( int a = 0; a < declarator->arrayDimensionList().count(); a++ )
+ text += "*";
+
+ return text;
+}
+
+void TagCreator::parseBaseClause( const QString& className, BaseClauseAST * baseClause )
+{
+ QPtrList<BaseSpecifierAST> l = baseClause->baseSpecifierList();
+ QPtrListIterator<BaseSpecifierAST> it( l );
+ while ( it.current() )
+ {
+ BaseSpecifierAST * baseSpecifier = it.current();
+
+ QString access;
+ if ( baseSpecifier->access() )
+ access = baseSpecifier->access() ->text();
+ bool isVirtual = baseSpecifier->isVirtual() != 0;
+
+ if( baseSpecifier->name() == 0 ) return; ///Workaround for some bug elsewhere
+
+ QString baseName;
+ if ( baseSpecifier->name() )
+ baseName = baseSpecifier->name() ->text();
+
+ Tag tag;
+ CppBaseClass<Tag> tagBuilder( tag );
+
+ tag.setKind( Tag::Kind_Base_class );
+ tag.setFileName( m_fileName );
+ tag.setName( className );
+ tag.setScope( m_currentScope );
+
+ tagBuilder.setBaseClass( baseName );
+ tagBuilder.setVirtual( isVirtual );
+ tagBuilder.setAccess( TagUtils::stringToAccess( access ) );
+
+ int line, col;
+ baseClause->getStartPosition( &line, &col );
+ tag.setStartPosition( line, col );
+
+ baseClause->getEndPosition( &line, &col );
+ tag.setEndPosition( line, col );
+
+ m_catalog->addItem( tag );
+
+ ++it;
+ }
+}
+
+QString TagCreator::scopeOfDeclarator( DeclaratorAST* d )
+{
+ QStringList scope = m_currentScope;
+ if ( d && d->declaratorId() && d->declaratorId() ->classOrNamespaceNameList().count() )
+ {
+ if ( d->declaratorId() ->isGlobal() )
+ scope.clear();
+ QPtrList<ClassOrNamespaceNameAST> l = d->declaratorId() ->classOrNamespaceNameList();
+ QPtrListIterator<ClassOrNamespaceNameAST> it( l );
+ while ( it.current() )
+ {
+ if ( it.current() ->name() )
+ scope << it.current() ->name() ->text();
+
+ ++it;
+ }
+ }
+
+ return scope.join( "." );
+}
+
+int TagUtils::stringToAccess( const QString & access )
+{
+ QStringList l = QStringList()
+ << "public" << "protected" << "private"
+ << "public slots" << "protected slots" << "private slots"
+ << "signals";
+
+ int idx = l.findIndex( access );
+ return idx == -1 ? 0 : idx+1;
+}
+
+QString TagUtils::accessToString( int id )
+{
+ if( id == 0 ) return "unknown";
+
+ QStringList l = QStringList()
+ << "public" << "protected" << "private"
+ << "public slots" << "protected slots" << "private slots"
+ << "signals";
+
+ if( l.at(id-1) != l.end() )
+ return l[ id-1 ];
+
+ return QString::null;
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;
diff --git a/languages/cpp/tag_creator.h b/languages/cpp/tag_creator.h
new file mode 100644
index 00000000..47d0b66f
--- /dev/null
+++ b/languages/cpp/tag_creator.h
@@ -0,0 +1,131 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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. *
+* *
+***************************************************************************/
+
+#ifndef __tag_creator_h
+#define __tag_creator_h
+
+#include "tree_parser.h"
+
+#include <qstringlist.h>
+#include <qvaluestack.h>
+
+class Catalog;
+class Tag;
+
+namespace TagUtils
+{
+ int stringToAccess( const QString& access );
+ QString accessToString( int id );
+}
+
+class TagCreator: public TreeParser
+{
+public:
+ TagCreator( const QString& fileName, Catalog* c );
+ virtual ~TagCreator();
+
+ // translation-unit
+ virtual void parseTranslationUnit( const ParsedFile& );
+
+ // declarations
+ virtual void parseDeclaration( DeclarationAST* );
+ virtual void parseNamespace( NamespaceAST* );
+ virtual void parseNamespaceAlias( NamespaceAliasAST* decl );
+ virtual void parseUsingDirective( UsingDirectiveAST* );
+ virtual void parseTypedef( TypedefAST* );
+ virtual void parseTemplateDeclaration( TemplateDeclarationAST* );
+ virtual void parseSimpleDeclaration( SimpleDeclarationAST* );
+ virtual void parseFunctionDefinition( FunctionDefinitionAST* );
+ virtual void parseLinkageBody( LinkageBodyAST* );
+ virtual void parseAccessDeclaration( AccessDeclarationAST* );
+
+ // type-specifier
+ virtual void parseClassSpecifier( ClassSpecifierAST* );
+ virtual void parseEnumSpecifier( EnumSpecifierAST* );
+ virtual void parseElaboratedTypeSpecifier( ElaboratedTypeSpecifierAST* );
+
+ virtual void parseMyDeclaration( GroupAST* funSpec, GroupAST* storageSpec, TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl );
+ virtual void parseFunctionDeclaration( GroupAST* funSpec, GroupAST* storageSpec, TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl );
+ virtual void parseFunctionArguments( Tag& tag, DeclaratorAST* declarator );
+ virtual void parseBaseClause( const QString& className, BaseClauseAST* baseClause );
+
+ /**
+ call this function after the last use of a TagCreator object, to do cleanup work
+ */
+ static void destroyDocumentation();
+
+ /**
+ This sets the directories, where the doxygen documentation should be searched in.
+ @param dirs QStringList containing strings, which define the pathes, where documentation is searched in
+ */
+ static void setDocumentationDirectories( const QStringList& dirs );
+
+
+private:
+ QString scopeOfDeclarator( DeclaratorAST* d );
+ QString typeOfDeclaration( TypeSpecifierAST* typeSpec, DeclaratorAST* declarator );
+
+private:
+
+ void takeTemplateParams( Tag& target, TemplateDeclarationAST* ast );
+ void checkTemplateDeclarator( Tag& tag );
+
+ class CommentPusher {
+ TagCreator& m_ref;
+ public:
+ CommentPusher( TagCreator& ref, QString comment ) : m_ref( ref ) {
+ m_ref.pushComment( comment );
+ }
+ ~CommentPusher() {
+ m_ref.popComment();
+ }
+ };
+
+ QStringList m_comments;
+
+ QString comment() {
+ if( m_comments.isEmpty() ) {
+ return "";
+ } else {
+ return m_comments.front();
+ }
+ }
+
+ void pushComment( QString comm ) {
+ m_comments.push_front( comm );
+ }
+
+ void popComment() {
+ m_comments.pop_front();
+ }
+
+ Catalog* m_catalog;
+ QString m_fileName;
+ QStringList m_currentScope;
+ QValueList<QStringList> m_imports;
+ QString m_currentAccess;
+ bool m_inClass;
+ bool m_inSlots;
+ bool m_inSignals;
+ int m_anon;
+
+ QValueStack<TemplateDeclarationAST*> m_currentTemplateDeclarator;
+
+ static class DoxyDoc* m_documentation;
+
+private:
+ TagCreator( const TagCreator& source );
+ void operator = ( const TagCreator& source );
+};
+
+#endif // __tag_creator_h
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/templates/Makefile.am b/languages/cpp/templates/Makefile.am
new file mode 100644
index 00000000..21f95fa8
--- /dev/null
+++ b/languages/cpp/templates/Makefile.am
@@ -0,0 +1,2 @@
+templatesdata_DATA = default.cpp default.h
+templatesdatadir = $(kde_datadir)/kdevcppsupport/templates
diff --git a/languages/cpp/templates/default.cpp b/languages/cpp/templates/default.cpp
new file mode 100644
index 00000000..9f3c6258
--- /dev/null
+++ b/languages/cpp/templates/default.cpp
@@ -0,0 +1,12 @@
+// -*-c++-*-
+//
+// C++ Implementation: $MODULE$
+//
+// Description:
+//
+//
+// Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
diff --git a/languages/cpp/templates/default.h b/languages/cpp/templates/default.h
new file mode 100644
index 00000000..aa63e1e2
--- /dev/null
+++ b/languages/cpp/templates/default.h
@@ -0,0 +1,12 @@
+// -*-c++-*-
+//
+// C++ Interface: $MODULE$
+//
+// Description:
+//
+//
+// Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
diff --git a/languages/cpp/typedecoration.h b/languages/cpp/typedecoration.h
new file mode 100644
index 00000000..3d2e8382
--- /dev/null
+++ b/languages/cpp/typedecoration.h
@@ -0,0 +1,119 @@
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __TYPEDECORATION_H__
+#define __TYPEDECORATION_H__
+
+
+class TypeDecoration {
+
+ public:
+ TypeDecoration() {
+ }
+
+ ///Removes the decoration from the given string
+ TypeDecoration( QString& str ) {
+ init( str );
+ }
+
+ ~TypeDecoration() {}
+
+ ///Removes the decoration from the assigned
+ TypeDecoration& operator = ( QString& str ) {
+ clear();
+ init( str );
+ return *this;
+ }
+
+ QString apply( const QString& str ) const {
+ QString ret = str;
+ if ( !ret.startsWith( m_decoration_front ) )
+ ret = m_decoration_front + ret;
+
+ if ( !ret.endsWith( m_decoration_back ) )
+ ret = ret + m_decoration_back;
+ return ret;
+ }
+
+ void operator += ( const TypeDecoration& rhs ) {
+ if ( !m_decoration_front.contains( rhs.m_decoration_front ) )
+ m_decoration_front += rhs.m_decoration_front;
+ if ( !m_decoration_back.contains( rhs.m_decoration_back ) )
+ m_decoration_back += rhs.m_decoration_back;
+ }
+
+ void clear() {
+ m_decoration_front = QString();
+ m_decoration_back = QString();
+ }
+
+ void prepend( const QString& str ) {
+ m_decoration_front = str + m_decoration_front;
+ }
+
+ /*bool smaller( const TypeDecoration& rhs ) const {
+ }
+
+ int depth() const {
+
+ }*/
+
+ private:
+ void init( QString& str ) {
+ str = str.stripWhiteSpace();
+
+ static const QString cnst = "const";
+ static const QString ref = "&";
+ if ( str.startsWith( cnst ) ) {
+ str.remove( 0, cnst.length() );
+ if( str.isEmpty() || ( !str[0].isLetterOrNumber() && str[0] != '_' ) ) {
+ m_decoration_front += cnst + " ";
+ str = str.stripWhiteSpace();
+ } else {
+ str = cnst + str; ///The const was not alone
+ }
+ }
+
+ if( str.endsWith( cnst ) ) {
+ str.remove( str.length() - cnst.length(), cnst.length() );
+ if( str.isEmpty() || ( !str[str.length()-1].isLetterOrNumber() && str[str.length()-1] != '_' ) ) {
+ m_decoration_back = (m_decoration_back + " " + cnst);
+ str = str.stripWhiteSpace();
+ } else {
+ str = str + cnst; ///The const was not alone
+ }
+ }
+
+ if ( str.endsWith( ref ) ) {
+ m_decoration_back = ref + m_decoration_back;
+ str = str.remove( str.length() - ref.length(), ref.length() ).stripWhiteSpace();
+
+ if( str.endsWith( cnst ) ) {
+ str.remove( str.length() - cnst.length(), cnst.length() );
+ if( str.isEmpty() || ( !str[str.length()-1].isLetterOrNumber() && str[str.length()-1] != '_' ) ) {
+ m_decoration_back = m_decoration_back + " " + cnst;
+ str = str.stripWhiteSpace();
+ } else {
+ str = str + cnst; ///The const was not alone
+ }
+ }
+ }
+ }
+
+ QString m_decoration_front, m_decoration_back;
+};
+
+#endif
+// kate: indent-mode csands; tab-width 4;
+
diff --git a/languages/cpp/typedesc.cpp b/languages/cpp/typedesc.cpp
new file mode 100644
index 00000000..2e4e28a0
--- /dev/null
+++ b/languages/cpp/typedesc.cpp
@@ -0,0 +1,788 @@
+/***************************************************************************
+ cppcodecompletion.cpp - description
+ -------------------
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "typedesc.h"
+#include "stringhelpers.h"
+#include "simpletype.h"
+
+#include "driver.h"
+#include "lexer.h"
+#include "parser.h"
+#include <qtextstream.h>
+
+#include <kglobal.h>
+
+const char* TypeDesc::functionMark = "[function] ";
+
+///Activated because of expressions like "const char* const"(the other algorithm chooses the const)
+//#define USELEXER
+
+using namespace StringHelpers;
+
+struct LocateResult::D {
+ TypeDesc m_desc;
+};
+
+LocateResult& LocateResult::operator = ( const TypeDesc& rhs ) {
+ *this = LocateResult( rhs );
+ return *this;
+}
+
+LocateResult::LocateResult() : d( new D() ), m_resolutionCount( 0 ), m_flags( NoFlag ), m_trace( 0 ), m_locateDepth( 0 ) {}
+
+LocateResult::LocateResult( const TypeDesc& desc ) : d( new D() ), m_resolutionCount( 0 ), m_flags( NoFlag ), m_trace( 0 ), m_locateDepth( 0 ) {
+ d->m_desc = desc;
+}
+
+LocateResult::LocateResult( const TypeDescPointer& desc ) : d( new D() ), m_resolutionCount( 0 ), m_flags( NoFlag ), m_trace( 0 ), m_locateDepth( 0 ) {
+ d->m_desc = *desc;
+}
+
+LocateResult::LocateResult( TypeDescShared* desc ) : d( new D() ), m_resolutionCount( 0 ), m_flags( NoFlag ), m_trace( 0 ), m_locateDepth( 0 ) {
+ d->m_desc = *desc;
+}
+
+LocateResult::LocateResult( const LocateResult& rhs ) : d( new D() ), m_resolutionCount( rhs.m_resolutionCount ), m_flags( rhs.m_flags ), m_trace( 0 ), m_locateDepth( rhs.m_locateDepth ) {
+ d->m_desc = rhs.d->m_desc;
+ if ( rhs.m_trace )
+ m_trace = new TypeTrace( *rhs.m_trace );
+}
+
+
+LocateResult::~LocateResult() {
+ if ( m_trace )
+ delete m_trace;
+ delete d;
+}
+
+LocateResult& LocateResult::operator = ( const LocateResult& rhs ) {
+ if ( &rhs == this )
+ return * this;
+ d->m_desc = rhs.d->m_desc;
+ m_locateDepth = rhs.m_locateDepth;
+ m_flags = rhs.m_flags;
+ m_resolutionCount = rhs.m_resolutionCount;
+
+ if ( m_trace )
+ delete m_trace;
+ if ( !rhs.m_trace ) {
+ m_trace = 0;
+ } else {
+ m_trace = new TypeTrace( *rhs.m_trace );
+ }
+ return *this;
+}
+
+
+LocateResult::operator const TypeDesc&() const {
+ return d->m_desc;
+}
+
+LocateResult::operator TypeDesc&() {
+ return d->m_desc;
+}
+
+TypeDesc& LocateResult::desc() {
+ return d->m_desc;
+}
+
+const TypeDesc& LocateResult::desc() const {
+ return d->m_desc;
+}
+
+const TypeDesc* LocateResult::operator ->() const {
+ return &d->m_desc;
+}
+
+TypeDesc* LocateResult::operator ->() {
+ return &d->m_desc;
+}
+
+LocateResult::operator bool() const {
+ return d->m_desc;
+}
+
+/*
+LocateResult::operator TypeDescPointer() {
+ if ( !m_desc )
+ m_desc = new TypeDescShared();
+ return m_desc;
+}*/
+
+
+void LocateResult::addResolutionFlag( ResolutionFlags flag ) {
+ m_flags = addFlag( flag, m_flags );
+}
+
+bool LocateResult::hasResolutionFlag( ResolutionFlags flag ) const {
+ return ( bool ) ( m_flags & flag );
+}
+
+TypeTrace* LocateResult::trace() {
+ if ( !m_trace )
+ m_trace = new TypeTrace();
+ return m_trace;
+}
+
+TypeDesc::TypeDesc() {}
+
+TypeDesc::TypeDesc( const QString& name ) {
+ init( name );
+}
+
+TypeDesc::TypeDesc( const TypeDesc& rhs ) {
+ *this = rhs;
+}
+
+bool TypeDesc::isValidType() const {
+ if ( !m_data )
+ return false;
+ if ( m_data->m_cleanName.find( "->" ) != -1 || m_data->m_cleanName.contains( '.' ) || m_data->m_cleanName.contains( ' ' ) || m_data->m_cleanName.isEmpty() )
+ return false;
+
+ for ( TemplateParams::const_iterator it = m_data->m_templateParams.begin(); it != m_data->m_templateParams.end(); ++it ) {
+ if ( !( *it ) ->isValidType() )
+ return false;
+ }
+
+ if ( m_data->m_nextType )
+ if ( !m_data->m_nextType->isValidType() )
+ return false;
+ return true;
+}
+
+TypeDesc& TypeDesc::operator = ( const TypeDesc& rhs ) {
+ m_data = rhs.m_data;
+ return *this;
+}
+
+void TypeDesc::prependDecoration( const QString& str ) {
+ makePrivate();
+ m_data->m_dec.prepend( str );
+}
+
+int TypeDesc::depth() const {
+ if ( !m_data )
+ return 0;
+ int ret = 1;
+ for ( TemplateParams::const_iterator it = m_data->m_templateParams.begin(); it != m_data->m_templateParams.end(); ++it ) {
+ ret = kMax( ( *it ) ->depth() + 1, ret );
+ }
+
+ if ( m_data->m_nextType ) {
+ ret = kMax( m_data->m_nextType->depth(), ret );
+ }
+
+ return ret;
+}
+
+int TypeDesc::length() const {
+ if ( !m_data )
+ return 0;
+ if ( !m_data->m_nextType && m_data->m_cleanName.isEmpty() )
+ return 0;
+ return m_data->m_nextType ? 1 + m_data->m_nextType->length() : 1;
+}
+
+HashedStringSet TypeDesc::includeFiles() const {
+ if( !m_data ) return HashedStringSet();
+ return m_data->m_includeFiles;
+}
+
+void TypeDesc::setIncludeFiles( const HashedStringSet& files ) {
+ makeDataPrivate();
+ m_data->m_includeFiles = files;
+ for ( TemplateParams::iterator it = m_data->m_templateParams.begin(); it != m_data->m_templateParams.end(); ++it ) {
+ (*it)->setIncludeFiles( files );
+ }
+ if( m_data->m_nextType ) {
+ if( m_data->m_nextType->_KShared_count() != 1 )
+ m_data->m_nextType = new TypeDescShared( *(m_data->m_nextType) );
+ m_data->m_nextType->setIncludeFiles( files );
+ }
+}
+
+void TypeDesc::addIncludeFiles( const HashedStringSet& files ) {
+ makeDataPrivate();
+ m_data->m_includeFiles += files;
+ for ( TemplateParams::iterator it = m_data->m_templateParams.begin(); it != m_data->m_templateParams.end(); ++it ) {
+ (*it)->addIncludeFiles( files );
+ }
+ if( m_data->m_nextType ) {
+ if( m_data->m_nextType->_KShared_count() != 1 )
+ m_data->m_nextType = new TypeDescShared( *(m_data->m_nextType) );
+ m_data->m_nextType->addIncludeFiles( files );
+ }
+}
+
+size_t TypeDescData::hashKey() {
+ size_t ret = 0;
+ if ( m_hashValid ) {
+ ret = m_hashKey;
+ } else {
+ ret += 89 * m_pointerDepth;
+ ret += 101 * m_functionDepth;
+
+ int len = m_cleanName.length();
+ for ( int a = 0; a < len; a++ )
+ ret += m_cleanName[ a ].unicode() * 3 * (11*(a+1));
+
+
+ int n = 1;
+ for ( TemplateParams::const_iterator it = m_templateParams.begin(); it != m_templateParams.end() ; ++it ) {
+ ret += 107 * n * ( *it ) ->hashKey();
+ n++;
+ }
+
+ m_hashKey = ret;
+ m_hashValid = true;
+ }
+
+ if ( m_nextType )
+ ret += 109 * m_nextType->hashKey();
+ return ret;
+}
+
+size_t TypeDescData::hashKey2() {
+ size_t ret = 0;
+ if( m_hash2Valid ) {
+ ret = m_hashKey2;
+ } else {
+ ret += 13 * m_pointerDepth;
+ ret += 17 * m_functionDepth;
+
+ int len = m_cleanName.length();
+ for ( int a = 0; a < len; a++ )
+ ret += m_cleanName[ a ].unicode() * 19 * (7*(a+1));
+
+
+ int n = 1;
+ for ( TemplateParams::const_iterator it = m_templateParams.begin(); it != m_templateParams.end() ; ++it ) {
+ ret += 23 * n * ( *it ) ->hashKey2();
+ n++;
+ }
+ m_hashKey2 = ret;
+ m_hash2Valid = true;
+ }
+
+ if ( m_nextType )
+ ret += 29 * m_nextType->hashKey2();
+ return ret;
+}
+
+///Something is wrong with this function.. so i use the string-comparison
+int TypeDesc::compare ( const TypeDesc& rhs ) const {
+ if ( m_data == rhs.m_data )
+ return 0;
+ if ( !m_data )
+ return -1;
+ if ( !rhs.m_data )
+ return 1;
+
+ /*static int dpth = 0;
+ dpth++;
+ if( dpth == 1 && (*this == rhs) )kdDebug( 9007 ) << "failed comparing " << fullNameChain() << " and " << rhs.fullNameChain() << " hashes: " << hashKey() << " " << rhs.hashKey() << endl;
+ dpth--;*/
+
+ if ( m_data->m_functionDepth != rhs.m_data->m_functionDepth ) {
+ if ( m_data->m_functionDepth < rhs.m_data->m_functionDepth )
+ return -1;
+ else
+ return 1;
+ }
+
+ if ( m_data->m_pointerDepth != rhs.m_data->m_pointerDepth ) {
+ if ( m_data->m_pointerDepth < rhs.m_data->m_pointerDepth )
+ return -1;
+ else
+ return 1;
+ }
+
+ if ( m_data->m_cleanName != rhs.m_data->m_cleanName ) {
+ if ( m_data->m_cleanName < rhs.m_data->m_cleanName )
+ return -1;
+ else
+ return 1;
+ }
+ if ( m_data->m_templateParams.size() != rhs.m_data->m_templateParams.size() ) {
+ if ( m_data->m_templateParams.size() < rhs.m_data->m_templateParams.size() )
+ return -1;
+ else
+ return 1;
+ }
+
+ TemplateParams::const_iterator it2 = rhs.m_data->m_templateParams.begin();
+ TemplateParams::const_iterator it = m_data->m_templateParams.begin();
+
+ for ( ; it != m_data->m_templateParams.end() && it2 != rhs.m_data->m_templateParams.end(); ) {
+ int cmp = ( *it ) ->compare( **it2 );
+ if ( cmp != 0 ) {
+ return cmp;
+ }
+ ++it2;
+ ++it;
+ }
+
+ if ( !( ( bool ) m_data->m_nextType ) != ( ( bool ) rhs.m_data->m_nextType ) ) {
+ if ( m_data->m_nextType )
+ return 1;
+ else
+ return -1;
+ }
+
+ if ( m_data->m_nextType && rhs.m_data->m_nextType )
+ return m_data->m_nextType->compare( *rhs.m_data->m_nextType );
+
+ return 0;
+}
+
+#ifdef USE_TEXT_STREAM
+QString TypeDesc::nameWithParams() const {
+ if ( !m_data )
+ return "";
+
+ QString ret;
+ {
+ QTextStream s( &ret, IO_WriteOnly );
+ s << m_data->m_cleanName;
+ if ( !m_data->m_templateParams.isEmpty() ) {
+ s << "<";
+ bool first = true;
+ for ( TemplateParams::const_iterator it = m_data->m_templateParams.begin(); it != m_data->m_templateParams.end(); ++it ) {
+ if ( !first )
+ s << ", ";
+ s << ( *it ) ->fullNameChain();
+ first = false;
+ }
+ }
+ s << ">";
+ }
+ return ret;
+}
+
+#else
+
+QString TypeDesc::nameWithParams() const {
+ if( compare( *this ) != 0 ) {
+ compare( *this );
+ }
+ if ( !m_data )
+ return "";
+
+ QString ret = m_data->m_cleanName;
+ if ( !m_data->m_templateParams.isEmpty() ) {
+ ret += "<";
+ bool first = true;
+ for ( TemplateParams::const_iterator it = m_data->m_templateParams.begin(); it != m_data->m_templateParams.end(); ++it ) {
+ if ( !first )
+ ret += ", ";
+ ret += ( *it ) ->fullNameChain();
+ first = false;
+ }
+ ret += ">";
+ }
+ return ret;
+}
+
+#endif
+
+QString TypeDesc::fullName( ) const {
+ if ( !m_data )
+ return "";
+
+ QString ret = nameWithParams();
+ for ( int a = 0; a < m_data->m_functionDepth; ++a )
+ ret = QString( functionMark ) + ret;
+ for ( int a = 0; a < m_data->m_pointerDepth; ++a )
+ ret += "*";
+ return m_data->m_dec.apply( ret );
+}
+
+size_t TypeDesc::hashKey() const {
+ if ( !m_data )
+ return 0;
+ size_t ret = const_cast<TypeDescData*>( m_data.data() ) ->hashKey();
+ //kdDebug( 9007 ) << "computed hash-key: " << fullName() << ": " << ret << endl;
+ return ret;
+}
+
+size_t TypeDesc::hashKey2() const {
+ if ( !m_data )
+ return 0;
+ size_t ret = const_cast<TypeDescData*>( m_data.data() ) ->hashKey2();
+ //kdDebug( 9007 ) << "computed hash-key: " << fullName() << ": " << ret << endl;
+ return ret;
+}
+
+QString TypeDesc::fullNameChain( ) const {
+ if ( !m_data )
+ return "";
+ QString ret = fullName();
+ if ( m_data->m_nextType ) {
+ ret += "::" + m_data->m_nextType->fullNameChain();
+ }
+ return m_data->m_dec.apply( ret );
+}
+
+QString TypeDesc::fullTypeStructure() const {
+ if ( !m_data )
+ return "";
+
+ QString ret = m_data->m_cleanName;
+ if ( !m_data->m_templateParams.isEmpty() ) {
+ ret += "<";
+ for ( TemplateParams::const_iterator it = m_data->m_templateParams.begin(); it != m_data->m_templateParams.end(); ++it ) {
+ ret += ( *it ) ->fullTypeStructure();
+ ret += ", ";
+ }
+ ret.truncate( ret.length() - 2 );
+ ret += ">";
+ }
+ return ret;
+}
+
+
+QStringList TypeDesc::fullNameList( ) const {
+ if ( !m_data )
+ return "";
+ QStringList ret;
+ ret << fullName();
+ if ( m_data->m_nextType ) {
+ ret += m_data->m_nextType->fullNameList();
+ }
+ return ret;
+}
+
+
+/// The template-params may be changed in-place
+/// this list is local, but the params pointed by them not
+TypeDesc::TemplateParams& TypeDesc::templateParams() {
+ makeDataPrivate();
+ return m_data->m_templateParams;
+}
+
+const TypeDesc::TemplateParams& TypeDesc::templateParams() const {
+ const_cast<TypeDesc*>( this ) ->maybeInit();
+ return m_data->m_templateParams;
+}
+
+TypeDescPointer TypeDesc::next() {
+ if ( !m_data )
+ return 0;
+ return m_data->m_nextType;
+}
+
+KSharedPtr<const TypeDescShared> TypeDesc::next() const {
+ if ( !m_data )
+ return 0;
+ return m_data->m_nextType.data();
+}
+
+bool TypeDesc::hasTemplateParams() const {
+ if ( !m_data )
+ return false;
+ return !m_data->m_templateParams.isEmpty();
+}
+
+void TypeDesc::setNext( TypeDescPointer type ) {
+ makeDataPrivate();
+ m_data->m_nextType = type;
+}
+
+void TypeDesc::append( TypeDescPointer type ) {
+ if ( type ) {
+ makeDataPrivate();
+ if ( m_data->m_nextType )
+ m_data->m_nextType->append( type );
+ else
+ m_data->m_nextType = type;
+ }
+}
+
+TypePointer TypeDesc::resolved() const {
+ if ( !m_data )
+ return 0;
+ return m_data->m_resolved;
+}
+
+void TypeDesc::setResolved( TypePointer resolved ) {
+ makeDataPrivate();
+ m_data->m_resolved = resolved;
+}
+
+void TypeDesc::resetResolved() {
+ if ( !m_data )
+ return ;
+ makeDataPrivate();
+ m_data->m_resolved = 0;
+ if ( m_data->m_nextType )
+ m_data->m_nextType->resetResolved();
+}
+
+///Resets the resolved-pointers of this type, and all template-types
+void TypeDesc::resetResolvedComplete() {
+ if ( !m_data )
+ return ;
+ makeDataPrivate();
+ resetResolved();
+ for ( TemplateParams::iterator it = m_data->m_templateParams.begin(); it != m_data->m_templateParams.end(); ++it )
+ ( *it ) ->resetResolvedComplete();
+}
+
+///these might be changed in future to an own data-member
+void TypeDesc::increaseFunctionDepth() {
+ makeDataPrivate();
+ m_data->m_functionDepth++;
+}
+
+void TypeDesc::decreaseFunctionDepth() {
+ makeDataPrivate();
+ if ( m_data->m_functionDepth > 0 )
+ m_data->m_functionDepth--;
+}
+
+int TypeDesc::functionDepth() const {
+ if ( !m_data )
+ return 0;
+ return m_data->m_functionDepth;
+}
+
+void TypeDesc::takeInstanceInfo( const TypeDesc& rhs ) {
+ makeDataPrivate();
+ if( !rhs.m_data ) return;
+ m_data->m_pointerDepth += rhs.m_data->m_pointerDepth;
+ m_data->m_dec += rhs.m_data->m_dec;
+}
+
+void TypeDesc::clearInstanceInfo() {
+ if ( !m_data )
+ return ;
+ makeDataPrivate();
+ m_data->m_pointerDepth = 0;
+ m_data->m_dec.clear();
+}
+
+void TypeDesc::takeTemplateParams( const QString& string ) {
+ makeDataPrivate();
+ m_data->m_templateParams.clear();
+ for ( ParamIterator it( "<>", string ); it; ++it )
+ m_data->m_templateParams.append( new TypeDescShared( *it ) );
+}
+
+void TypeDesc::makeDataPrivate() {
+ if ( !m_data ) {
+ maybeInit();
+ return ;
+ }
+ if ( m_data.count() > 1 ) {
+ m_data = new TypeDescData( *m_data );
+ }
+ m_data->invalidateKey();
+}
+
+TypeDesc& TypeDesc::makePrivate() {
+ makeDataPrivate();
+ TemplateParams nList;
+ for ( TemplateParams::const_iterator it = m_data->m_templateParams.begin(); it != m_data->m_templateParams.end(); ++it ) {
+ TypeDescPointer tp( new TypeDescShared( ) );
+ *tp = **it;
+ tp->makePrivate();
+ nList.append( tp );
+ }
+ m_data->m_templateParams = nList;
+
+ if ( m_data->m_nextType ) {
+ TypeDescPointer tmp = m_data->m_nextType;
+ m_data->m_nextType = new TypeDescShared();
+ *m_data->m_nextType = *tmp;
+ m_data->m_nextType->makePrivate();
+ }
+ return *this;
+}
+
+int TypeDesc::totalPointerDepth() const {
+ if( next() )
+ return next()->totalPointerDepth();
+ else
+ return pointerDepth();
+}
+
+void TypeDesc::setTotalPointerDepth( int d ) {
+ makePrivate();
+ if( next() )
+ next()->setTotalPointerDepth( d );
+ else
+ setPointerDepth( d );
+}
+
+void TypeDesc::maybeInit() {
+ if ( m_data )
+ return ;
+ m_data = new TypeDescData();
+ m_data->m_pointerDepth = 0;
+ m_data->m_functionDepth = 0;
+ m_data->m_nextType = 0;
+ m_data->m_flags = Standard;
+}
+/*
+bool TypeDesc::decorationSmaller( const TypeDesc& rhs ) {
+ maybeInit();
+ rhs.maybeInit();
+ return m_data->m_dec.smaller( rhs.m_data.m_dec );
+
+}
+
+int TypeDesc::decorationDepth() {
+ if( !m_data ) return 0;
+ return m_data->m_dec.depth();
+}*/
+
+void TypeDesc::init( QString stri ) {
+ m_data = 0;
+ maybeInit();
+
+ if ( stri.isEmpty() )
+ return ;
+
+ m_data->m_dec = stri; ///Store the decoration
+
+ QStringList ls = splitType( stri );
+ QString str = ls.front().stripWhiteSpace();
+
+ ///Extract multiple types that may be written as a scope and put them to the next-types-list
+ if ( !ls.isEmpty() ) {
+ ls.pop_front();
+ if ( !ls.isEmpty() ) {
+ m_data->m_nextType = TypeDescPointer( new TypeDescShared( ls.join( "::" ) ) );
+ }
+ }
+
+ while ( str.startsWith( QString( functionMark ) ) ) {
+ m_data->m_functionDepth++;
+ str = str.mid( strlen( functionMark ) ).stripWhiteSpace();
+ }
+ bool isFunction = false, shorten = true;
+
+ //Little hack done for performance-reasons, to do less comparing
+ if( str.length() >= 4 ) {
+ QChar c = str[0];
+ switch( c.latin1() ) {
+ case 's':
+ if( str[1] == 'h' ) {
+ if( str.startsWith( "short" ) )
+ shorten = false;
+ } else if( str[1] == 'i' ) {
+ if( str.startsWith( "signed" ) )
+ shorten = false;
+ }
+ break;
+ case 'l':
+ if( str.startsWith( "long" ) )
+ shorten = false;
+ break;
+ case 'u':
+ if( str.startsWith( "unsigned" ) )
+ shorten = false;
+ break;
+ case 'o':
+ if( str.startsWith( "operator " ) ) {
+ isFunction = true;
+ shorten = false;
+ }
+ }
+ }
+
+ ///Since function-names are also processed by this function, this check has to be done
+ if( shorten ) {
+ ///Remove any prefixes like const or typename(very limited algorithm)
+ int len = str.find( "<" );
+ if ( len == -1 )
+ len = str.length();
+ int currentStart = 0;
+ bool wasEmpty = false;
+ for ( int a = 0; a < len; a++ ) {
+ if ( str[ a ] == ' ' ) {
+ wasEmpty = true;
+ } else if( wasEmpty && isValidIdentifierSign( str[a] ) ){
+ currentStart = a;
+ wasEmpty = false;
+ }
+ }
+ str = str.mid( currentStart );
+ }
+
+#ifdef USELEXER
+
+ Driver d;
+ Lexer lex( &d );
+ lex.setSource( str );
+ Parser parser( &d, &lex );
+
+ TypeSpecifierAST::Node typeSpec;
+ if ( parser.parseTypeSpecifier( typeSpec ) ) {
+ NameAST * name = typeSpec->name();
+
+ QPtrList<ClassOrNamespaceNameAST> l = name->classOrNamespaceNameList();
+ QPtrListIterator<ClassOrNamespaceNameAST> it( l );
+
+ QString type;
+ while ( it.current() ) {
+ if ( it.current() ->name() ) {
+ type += it.current() ->name() ->text() + "::";
+ }
+ ++it;
+ }
+
+ if ( name->unqualifiedName() && name->unqualifiedName() ->name() ) {
+ type += name->unqualifiedName() ->name() ->text();
+ }
+
+ m_data->m_cleanName = type.stripWhiteSpace();
+ takeTemplateParams( str );
+ m_data->m_pointerDepth = countExtract( '*', str );
+ }
+#else
+ if( !isFunction ) {
+ takeData( str );
+ m_data->m_pointerDepth = countExtract( '*', str );
+ } else {
+ m_data->m_cleanName = str;
+ }
+
+#endif
+
+}
+
+void TypeDesc::takeData( const QString& string ) {
+ makeDataPrivate();
+ m_data->m_templateParams.clear();
+ ParamIterator it( "<>", string );
+ QString name = it.prefix();
+ name.remove( "*" );
+ name.remove( "&" );
+ m_data->m_cleanName = name.stripWhiteSpace();
+ for ( ; it; ++it )
+ m_data->m_templateParams.append( new TypeDescShared( *it ) );
+}
+
+TypeDesc operator + ( const TypeDesc& lhs, const TypeDesc& rhs ) {
+ TypeDesc ret = lhs;
+ ret.makePrivate();
+ ret.append( new TypeDescShared( rhs ) );
+ return ret;
+}
+
+
diff --git a/languages/cpp/typedesc.h b/languages/cpp/typedesc.h
new file mode 100644
index 00000000..924372df
--- /dev/null
+++ b/languages/cpp/typedesc.h
@@ -0,0 +1,403 @@
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+ email : david.nolden.kdevelop@art-master.de
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __TYPEDESC_H__
+#define __TYPEDESC_H__
+
+#include <ktexteditor/codecompletioninterface.h>
+#include <ksharedptr.h>
+
+#include "includefiles.h"
+#include "typedecoration.h"
+
+class TypeDesc;
+class TypeDescShared;
+class SimpleTypeImpl;
+
+class TypeTrace;
+
+typedef KSharedPtr<TypeDescShared> TypeDescPointer;
+typedef KSharedPtr<SimpleTypeImpl> TypePointer;
+
+enum ResolutionFlags {
+ NoFlag = 0,
+ HadTypedef = 1,
+ HadTemplate = 2,
+ HadAlias = 3
+};
+
+class LocateResult {
+ public:
+ struct NewLocateMode { ///This is a helper that saves the influence on the behavior of locateType(..)
+ NewLocateMode() : mode(0), dir(0), valid(false) {
+ }
+ uint mode;
+ int dir;
+ bool valid;
+ };
+ private:
+ struct D;
+ D* d;
+ int m_resolutionCount;
+ ResolutionFlags m_flags;
+ TypeTrace* m_trace; ///pointer to the previous type in the trace-chain
+ int m_locateDepth; ///How far away from the beginning the type was found(counting steps upwards and steps into base-classes. Counter is stopped on the first typedef.)
+
+ NewLocateMode m_locateMode;
+ public:
+ LocateResult();
+ LocateResult( const TypeDesc& desc );
+
+ LocateResult( const TypeDescPointer& desc );
+ LocateResult( TypeDescShared* desc );
+ LocateResult( const LocateResult& rhs );
+ ~LocateResult();
+ /*
+ LocateResult& operator = ( const TypeDesc& rhs ) {
+ m_desc = new rhs;
+ return *this;
+ }*/
+
+ ///Returns the locate-flags that would have been used for locating a sub-item of this one(given the flags this was located with)
+ NewLocateMode& locateMode() {
+ return m_locateMode;
+ }
+
+ LocateResult& operator = ( const TypeDesc& rhs );
+
+ operator const TypeDesc&() const;
+
+ operator TypeDesc&() ;
+
+ TypeDesc& desc();
+
+ const TypeDesc& desc() const;
+
+ int depth() const {
+ return m_locateDepth;
+ }
+
+ ///This may be used to simply increase the depth while returning a LocateResult
+ LocateResult& increaseDepth() {
+ m_locateDepth++;
+ return *this;
+ }
+
+ ///This may be used to simply reset the depth while returning a LocateResult
+ LocateResult& resetDepth() {
+ m_locateDepth = 0;
+ return *this;
+ }
+
+ LocateResult& operator * () {
+ return * this;
+ }
+
+ const LocateResult& operator * () const {
+ return * this;
+ }
+
+ //operator TypeDescPointer();
+
+ operator bool() const;
+
+ LocateResult& operator = ( const LocateResult& rhs );
+
+ bool operator >( const LocateResult& rhs ) const {
+ return m_resolutionCount > rhs.m_resolutionCount;
+ }
+
+ const TypeDesc* operator ->() const;
+
+ TypeDesc* operator ->();
+
+ int resolutionCount() const {
+ return m_resolutionCount;
+ }
+
+ void increaseResolutionCount() {
+ m_resolutionCount++;
+ }
+
+ void addResolutionFlag( ResolutionFlags flag );
+
+ bool hasResolutionFlag( ResolutionFlags flag ) const;
+
+ TypeTrace* trace();
+};
+
+ ///These flags have no internal use, they are set and read from the outside
+enum TypeDescFlags {
+ Standard = 0,
+ ResolutionTried = 1 ///means that the resolution was tried, and should not be retried.
+};
+
+
+struct TypeDescData : public KShared {
+ typedef QValueList<LocateResult> TemplateParams;
+ QString m_cleanName;
+ int m_pointerDepth;
+ int m_functionDepth;
+ TemplateParams m_templateParams;
+ TypeDescPointer m_nextType;
+ TypePointer m_resolved;
+ TypeDecoration m_dec;
+ TypeDescFlags m_flags;
+ HashedStringSet m_includeFiles;
+
+ TypeDescData() : m_hashValid( false ), m_hash2Valid( false ) {
+ }
+ void invalidateKey() {
+ m_hashValid = false;
+ m_hash2Valid = false;
+ }
+
+ size_t hashKey();
+ size_t hashKey2();
+private:
+ bool m_hashValid;
+ uint m_hashKey;
+ bool m_hash2Valid;
+ uint m_hashKey2;
+};
+
+
+class TypeDesc {
+ public:
+ typedef QValueList<LocateResult> TemplateParams;
+
+ TypeDesc();
+
+ TypeDesc( const QString& str );
+
+ TypeDesc( const TypeDesc& rhs );
+
+ bool deeper( const TypeDesc& rhs ) const {
+ return depth() > rhs.depth();
+ }
+
+ bool longer( const TypeDesc& rhs ) const {
+ return length() > rhs.length();
+ }
+
+ TypeDesc& operator = ( const TypeDesc& rhs );
+
+ TypeDesc& operator = ( const QString& rhs ) {
+ init( rhs );
+ return *this;
+ }
+
+ TypeDesc firstType() const {
+ TypeDesc ret = *this;
+ ret.setNext( 0 );
+ return ret;
+ }
+
+ size_t hashKey() const;
+
+ /**Returns a hash-key that is computed in a different way than the first.
+ * If both keys match, it is pretty sure that typedescs are same.
+ * */
+ size_t hashKey2() const;
+
+///this function must be remade
+ bool isValidType() const ;
+
+ int depth() const;
+
+ int length() const ;
+
+ ///Does not respect include-files
+ int compare ( const TypeDesc& rhs ) const;
+
+ ///Does not respect include-files
+ bool operator < ( const TypeDesc& rhs ) const {
+ return compare( rhs ) == -1;
+ }
+
+ ///Does not respect include-files
+ bool operator > ( const TypeDesc& rhs ) const {
+ return compare( rhs ) == 1;
+ }
+
+ ///Does not respect include-files
+ bool operator == ( const TypeDesc& rhs ) const {
+ return compare( rhs ) == 0;
+ }
+
+ HashedStringSet includeFiles() const;
+
+ ///Sets the include-files for this desc, the next-desc, and all template-params
+ void setIncludeFiles( const HashedStringSet& files );
+
+ void addIncludeFiles( const HashedStringSet& files );
+
+ QString nameWithParams() const;
+
+ ///returns the type including template-parameters and pointer-depth
+ QString fullName( ) const;
+
+ /**returns the type include template-parameters, pointer-depth, and possible sub-types.
+ Example "A::B": A is the type, and B is the subtype */
+ QString fullNameChain( ) const ;
+
+ ///Returns the type-structure(full name-chain without any instance-info)
+ QString fullTypeStructure() const;
+
+ void prependDecoration( const QString& str );
+
+ ///Since the pointer-depth of a resolved type is always stored in the last element of its chain, this gives fast access to that depth
+ int totalPointerDepth() const;
+
+ void setTotalPointerDepth( int d );
+
+ int pointerDepth() const {
+ if( !m_data ) return 0;
+
+ return m_data->m_pointerDepth;
+ }
+
+ void setPointerDepth( int d ) {
+ makeDataPrivate();
+ m_data->m_pointerDepth = d;
+ }
+
+ /*void decreasePointerDepth() {
+ maybeInit();
+
+ if ( m_data->m_pointerDepth > 0 ) {
+ makeDataPrivate();
+ m_data->m_pointerDepth--;
+ }
+ }*/
+
+ ///returns a list include the full name of this type, and all subtypes
+ QStringList fullNameList( ) const;
+
+ QString decoratedName() const {
+ if( !m_data ) return "";
+ QString ret = m_data->m_dec.apply( name() );
+ for( int a = 0; a < pointerDepth(); a++ )
+ ret += "*";
+ return ret;
+ }
+
+ QString name() const {
+ if( !m_data ) return "";
+ return m_data->m_cleanName;
+ };
+
+ void setName( QString name ) {
+ makeDataPrivate();
+ m_data->m_cleanName = name;
+ }
+
+ /** The template-params may be changed in-place
+ this list is local, but the params pointed by them not(call makePrivate before changing) */
+ TemplateParams& templateParams();
+
+ const TemplateParams& templateParams() const;
+
+ ///clears the current template-parameters, and extracts those from the given string
+ void takeTemplateParams( const QString& string );
+
+ /**makes all references/pointers private, so everything about this structure may be changed without side-effects*/
+ TypeDesc& makePrivate();
+
+ operator bool () const {
+ if( !m_data ) return false;
+
+ return !m_data->m_cleanName.isEmpty();
+ }
+
+ TypeDescPointer next();
+
+ KSharedPtr<const TypeDescShared> next() const;
+
+ bool hasTemplateParams() const ;
+
+ void setNext( TypeDescPointer type );
+
+ void append( TypeDescPointer type );
+
+ TypePointer resolved() const ;
+
+ void setResolved( TypePointer resolved );
+
+ void resetResolved();
+
+ ///Resets the resolved-pointers of this type, and all template-types
+ void resetResolvedComplete();
+
+ void increaseFunctionDepth();
+
+ void decreaseFunctionDepth();
+
+ int functionDepth() const;
+
+ static const char* functionMark;
+
+ void setFlag( TypeDescFlags flag ) {
+ makeDataPrivate();
+ m_data->m_flags = ( TypeDescFlags ) ( m_data->m_flags | flag );
+ }
+
+ bool hasFlag( TypeDescFlags flag ) {
+ if( !m_data ) return false;
+
+ return ( bool ) ( m_data->m_flags & flag );
+ }
+
+ ///instance-information consists of things like the pointer-depth and the decoration
+ void takeInstanceInfo( const TypeDesc& rhs );
+
+ /*bool decorationSmaller( const TypeDesc& rhs );
+
+ int decorationDepth();*/
+
+ void clearInstanceInfo();
+
+
+ private:
+ void takeData( const QString& string );
+ void makeDataPrivate();
+ KSharedPtr<TypeDescData> m_data;
+
+ void maybeInit();
+ void init( QString stri );
+
+};
+
+class TypeDescShared : public TypeDesc, public KShared {
+ public:
+
+
+ TypeDescShared( const TypeDescShared& rhs ) : TypeDesc( rhs ), KShared() {}
+
+ TypeDescShared( const TypeDesc& rhs ) : TypeDesc( rhs ), KShared() {}
+
+ TypeDescShared& operator = ( const TypeDesc& rhs ) {
+ ( *( TypeDesc* ) this ) = rhs;
+ return *this;
+ }
+
+ TypeDescShared( const QString& name ) : TypeDesc( name ) {}
+ TypeDescShared() : TypeDesc() {}
+}
+;
+
+extern TypeDesc operator + ( const TypeDesc& lhs, const TypeDesc& rhs );
+
+#endif
+// kate: indent-mode csands; tab-width 4;
diff --git a/languages/csharp/Makefile.am b/languages/csharp/Makefile.am
new file mode 100644
index 00000000..51d0c110
--- /dev/null
+++ b/languages/csharp/Makefile.am
@@ -0,0 +1,25 @@
+# Here resides the CSharp support part.
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+SUBDIRS = app_templates file_templates doc
+
+
+kde_module_LTLIBRARIES = libkdevcsharpsupport.la kio_csharpdoc.la
+libkdevcsharpsupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevcsharpsupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la
+
+libkdevcsharpsupport_la_SOURCES = csharpsupportpart.cpp csharpconfigwidget.cpp csharpconfigwidgetbase.ui
+
+kio_csharpdoc_la_SOURCES = csharpdoc.cpp
+kio_csharpdoc_la_LIBADD = $(LIB_KIO)
+kio_csharpdoc_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevcsharpsupport.desktop csharpdoc.protocol
+
+rcdir = $(kde_datadir)/kdevcsharpsupport
+rc_DATA = kdevcsharpsupport.rc
diff --git a/languages/csharp/README.dox b/languages/csharp/README.dox
new file mode 100644
index 00000000..6d256b08
--- /dev/null
+++ b/languages/csharp/README.dox
@@ -0,0 +1,46 @@
+/** \class CSharpSupportPart
+This is csharp language support plugin.
+
+Put a more detailed description of your part in these lines. It can span
+over several lines. You can even use some html commands in these lines like:
+<code>This is code</code>, html links <a href="http://somelocation">link text</a>,
+and images.
+
+\authors <a href="mailto:bernd AT kdevelop.org">Bernd Gehrmann</a>
+\authors <a href="mailto:willems.luc AT pandora.be">Luc Willems</a>
+
+\maintainer <a href="mailto:willems.luc AT pandora.be">Luc Willems</a>
+
+\feature csharp programming language support
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/csharp/app_templates/Makefile.am b/languages/csharp/app_templates/Makefile.am
new file mode 100644
index 00000000..14608ada
--- /dev/null
+++ b/languages/csharp/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS =
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/ScriptingLanguageIDE/CSharpIDE
+profiles_DATA = csharp.appwizard
diff --git a/languages/csharp/app_templates/csharp.appwizard b/languages/csharp/app_templates/csharp.appwizard
new file mode 100644
index 00000000..44c9faf9
--- /dev/null
+++ b/languages/csharp/app_templates/csharp.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=perlhello
diff --git a/languages/csharp/csharpconfigwidget.cpp b/languages/csharp/csharpconfigwidget.cpp
new file mode 100644
index 00000000..b18d3e69
--- /dev/null
+++ b/languages/csharp/csharpconfigwidget.cpp
@@ -0,0 +1,38 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "csharpconfigwidget.h"
+
+#include <qcheckbox.h>
+#include <klineedit.h>
+#include "domutil.h"
+
+
+CSharpConfigWidget::CSharpConfigWidget(QDomDocument &projectDom,
+ QWidget *parent, const char *name)
+ : CSharpConfigWidgetBase(parent, name), dom(projectDom)
+{
+ interpreter_edit->setText(DomUtil::readEntry(dom, "/kdevcsharpsupport/run/interpreter"));
+ terminal_box->setChecked(DomUtil::readBoolEntry(dom, "/kdevcsharpsupport/run/terminal"));
+}
+
+
+CSharpConfigWidget::~CSharpConfigWidget()
+{}
+
+
+void CSharpConfigWidget::accept()
+{
+ DomUtil::writeEntry(dom, "/kdevcsharpsupport/run/interpreter", interpreter_edit->text());
+ DomUtil::writeBoolEntry(dom, "/kdevcsharpsupport/run/terminal", terminal_box->isChecked());
+}
+
+#include "csharpconfigwidget.moc"
diff --git a/languages/csharp/csharpconfigwidget.h b/languages/csharp/csharpconfigwidget.h
new file mode 100644
index 00000000..bf1b063e
--- /dev/null
+++ b/languages/csharp/csharpconfigwidget.h
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _CSHARPCONFIGWIDGET_H_
+#define _CSHARPCONFIGWIDGET_H_
+
+#include "csharpconfigwidgetbase.h"
+#include <qdom.h>
+
+
+class CSharpConfigWidget : public CSharpConfigWidgetBase
+{
+ Q_OBJECT
+
+public:
+ CSharpConfigWidget( QDomDocument &projectDom, QWidget *parent=0, const char *name=0 );
+ ~CSharpConfigWidget();
+
+public slots:
+ void accept();
+
+private:
+ QDomDocument &dom;
+};
+
+#endif
diff --git a/languages/csharp/csharpconfigwidgetbase.ui b/languages/csharp/csharpconfigwidgetbase.ui
new file mode 100644
index 00000000..dbf4d3ae
--- /dev/null
+++ b/languages/csharp/csharpconfigwidgetbase.ui
@@ -0,0 +1,101 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>CSharpConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>csharp_config_widget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>CSharp</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>interpreter_label</cstring>
+ </property>
+ <property name="text">
+ <string>CSharp &amp;interpreter:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>interpreter_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>interpreter_edit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>terminal_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Execute programs in a terminal</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/csharp/csharpdoc.cpp b/languages/csharp/csharpdoc.cpp
new file mode 100644
index 00000000..8755be2b
--- /dev/null
+++ b/languages/csharp/csharpdoc.cpp
@@ -0,0 +1,133 @@
+#include "csharpdoc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <qtextstream.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kinstance.h>
+#include <kprocess.h>
+#include <kdeversion.h>
+#include <kglobal.h>
+
+using namespace KIO;
+
+
+CSharpdocProtocol::CSharpdocProtocol(const QCString &pool, const QCString &app)
+ : SlaveBase("csharpdoc", pool, app)
+{}
+
+
+CSharpdocProtocol::~CSharpdocProtocol()
+{}
+
+
+void CSharpdocProtocol::get(const KURL& url)
+{
+ QStringList l = QStringList::split('/', url.path());
+
+ mimeType("text/html");
+
+ bool plain = false;
+ QString cmd = "csharpdoc ";
+ if (l[0] == "functions") {
+ plain = true;
+ cmd += "-t -f ";
+ cmd += KProcess::quote(l[1]);
+ } else if (l[0] == "faq") {
+ cmd += "-u -q ";
+ cmd += KProcess::quote(l[1]);
+ cmd += " | pod2html";
+ } else {
+ QCString errstr(i18n("The only existing directories are functions and faq.").local8Bit());
+ data(errstr);
+ finished();
+ return;
+ }
+
+ kdDebug() << "Command: " << cmd << endl;
+
+ if (plain)
+ data(QCString("<blockquote>"));
+
+ FILE *fd = popen(cmd.local8Bit().data(), "r");
+ char buffer[4090];
+ QByteArray array;
+
+ while (!feof(fd)) {
+ int n = fread(buffer, 1, 2048, fd);
+ if (n == -1) {
+ pclose(fd);
+ return;
+ }
+ array.setRawData(buffer, n);
+ data(array);
+ array.resetRawData(buffer, n);
+ }
+
+ pclose(fd);
+
+ if (plain)
+ data(QCString("</blockquote>"));
+
+ finished();
+}
+
+
+void CSharpdocProtocol::mimetype(const KURL &url)
+{
+ QStringList l = QStringList::split('/', url.path());
+ mimeType((l[0] == "faq")? "text/html" : "text/plain");
+ finished();
+}
+
+
+QCString CSharpdocProtocol::errorMessage()
+{
+ return QCString( "<html><body bgcolor=\"#FFFFFF\">" + i18n("Error in csharpdoc").local8Bit() + "</body></html>" );
+}
+
+
+void CSharpdocProtocol::stat(const KURL &/*url*/)
+{
+ UDSAtom uds_atom;
+ uds_atom.m_uds = KIO::UDS_FILE_TYPE;
+ uds_atom.m_long = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
+
+ UDSEntry uds_entry;
+ uds_entry.append(uds_atom);
+
+ statEntry(uds_entry);
+ finished();
+}
+
+
+void CSharpdocProtocol::listDir(const KURL &url)
+{
+ error( KIO::ERR_CANNOT_ENTER_DIRECTORY, url.path() );
+}
+
+
+extern "C" {
+
+ int kdemain(int argc, char **argv)
+ {
+ KInstance instance( "kio_csharpdoc" );
+ KGlobal::locale()->setMainCatalogue("kdevelop");
+
+ if (argc != 4) {
+ fprintf(stderr, "Usage: kio_csharpdoc protocol domain-socket1 domain-socket2\n");
+ exit(-1);
+ }
+
+ CSharpdocProtocol slave(argv[2], argv[3]);
+ slave.dispatchLoop();
+
+ return 0;
+ }
+
+}
diff --git a/languages/csharp/csharpdoc.h b/languages/csharp/csharpdoc.h
new file mode 100644
index 00000000..85fa8cf5
--- /dev/null
+++ b/languages/csharp/csharpdoc.h
@@ -0,0 +1,25 @@
+#ifndef _CSHARPDOC_H_
+#define _CSHARPDOC_H_
+
+#include <qobject.h>
+#include <kio/slavebase.h>
+
+
+class CSharpdocProtocol : public KIO::SlaveBase
+{
+public:
+ CSharpdocProtocol(const QCString &pool, const QCString &app);
+ virtual ~CSharpdocProtocol();
+
+ virtual void get(const KURL& url);
+ virtual void stat(const KURL& url);
+ virtual void mimetype(const KURL& url);
+ virtual void listDir(const KURL& url);
+
+protected:
+ void decodeURL(const KURL &url);
+ void decodePath(QString path);
+ QCString errorMessage();
+};
+
+#endif
diff --git a/languages/csharp/csharpdoc.protocol b/languages/csharp/csharpdoc.protocol
new file mode 100644
index 00000000..9b813b02
--- /dev/null
+++ b/languages/csharp/csharpdoc.protocol
@@ -0,0 +1,9 @@
+[Protocol]
+exec=kio_csharpdoc
+protocol=csharpdoc
+input=none
+output=filesystem
+reading=true
+listing=Name
+determineMimetypeFromExtension=false
+Icon=help
diff --git a/languages/csharp/csharpsupportpart.cpp b/languages/csharp/csharpsupportpart.cpp
new file mode 100644
index 00000000..01a21ffb
--- /dev/null
+++ b/languages/csharp/csharpsupportpart.cpp
@@ -0,0 +1,331 @@
+/***************************************************************************
+ * Copyright (C) 2001-2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "csharpsupportpart.h"
+
+#include <qfileinfo.h>
+#include <qpopupmenu.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdevgenericfactory.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <qregexp.h>
+#include <codemodel.h>
+#include <qprogressbar.h>
+#include <kstatusbar.h>
+#include "kdevmainwindow.h"
+
+#include <kprocess.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevpartcontroller.h"
+#include "kdevplugininfo.h"
+#include "kdevappfrontend.h"
+//#include "classstore.h"
+//#include "parsedclass.h"
+//#include "parsedmethod.h"
+//#include "parsedscript.h"
+#include "domutil.h"
+//#include "programmingbycontract.h"
+
+typedef KDevGenericFactory<CSharpSupportPart> CSharpSupportFactory;
+static const KDevPluginInfo data("kdevcsharpsupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevcsharpsupport, CSharpSupportFactory( data ) )
+
+CSharpSupportPart::CSharpSupportPart(QObject *parent, const char *name, const QStringList &)
+ : KDevLanguageSupport(&data, parent, name ? name : "CSharpSupportPart")
+{
+ setInstance(CSharpSupportFactory::instance());
+
+ setXMLFile("kdevcsharpsupport.rc");
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+
+ KAction *action;
+
+ action = new KAction( i18n("Execute Main Program"), "exec", 0,
+ this, SLOT(slotExecute()),
+ actionCollection(), "build_exec" );
+ action->setToolTip( i18n("Runs the CSharp program") );
+
+ action = new KAction( i18n("Execute String..."), "exec", 0,
+ this, SLOT(slotExecuteString()),
+ actionCollection(), "build_execstring" );
+ action->setToolTip( i18n("Executes a string as CSharp code") );
+
+ action = new KAction( i18n("Start CSharp Interpreter"), "exec", 0,
+ this, SLOT(slotStartInterpreter()),
+ actionCollection(), "build_runinterpreter" );
+ action->setToolTip( i18n("Starts the CSharp interpreter without a program") );
+
+ action = new KAction( i18n("Find CSharp Function Documentation..."), 0,
+ this, SLOT(slotCSharpdocFunction()),
+ actionCollection(), "help_csharpdocfunction" );
+ action->setToolTip( i18n("Show the documentation page of a CSharp function") );
+
+ action = new KAction( i18n("Find CSharp FAQ Entry..."), 0,
+ this, SLOT(slotCSharpdocFAQ()),
+ actionCollection(), "help_csharpdocfaq" );
+ action->setToolTip( i18n("Show the FAQ entry for a keyword") );
+
+ //csharp parser for codemodel
+ // m_parser = new csharpparser(core(),codeModel(),interpreter());
+}
+
+
+CSharpSupportPart::~CSharpSupportPart()
+{
+ if (project())
+ projectClosed();
+
+ // delete m_parser;
+ // m_parser=0;
+}
+
+
+void CSharpSupportPart::projectOpened()
+{
+ kdDebug(9007) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ // We want to parse only after all components have been
+ // procsharpy initialized
+ QTimer::singleShot(0, this, SLOT(initialParse()));
+}
+
+
+void CSharpSupportPart::projectClosed()
+{
+}
+
+void CSharpSupportPart::maybeParse(const QString fileName)
+{
+ QFileInfo fi(fileName);
+ QString path = fi.filePath();
+ QString extension = fi.extension();
+ if (extension == "cs") {
+ kdDebug(9016) << "maybe " << fileName << endl;
+ removeWithReference(fileName);
+ // m_parser->parse(fileName);
+ emit addedSourceInfo( fileName);
+ }
+}
+
+void CSharpSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug(9016) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ maybeParse(project()->projectDirectory() + "/" + ( *it ));
+ }
+}
+
+
+void CSharpSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug(9016) << "removedFilesFromProject()" << endl;
+ QStringList::ConstIterator it;
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ removeWithReference(fileName);
+ }
+ emit updatedSourceInfo();
+}
+
+
+void CSharpSupportPart::savedFile(const KURL &fileName)
+{
+ Q_UNUSED( fileName.path() );
+#if 0 // not needed anymore
+ kdDebug(9016) << "savedFile()" << endl;
+
+ if (project()->allFiles().contains(fileName.mid ( project()->projectDirectory().length() + 1 ))) {
+ maybeParse(fileName);
+ emit updatedSourceInfo();
+ }
+#endif
+}
+
+
+KDevLanguageSupport::Features CSharpSupportPart::features()
+{
+ return KDevLanguageSupport::Features(Classes | Functions | Variables | Namespaces | /*Scripts | */NewClass | AddMethod | AddAttribute /*| NewScript*/);
+// return Functions;
+}
+
+QString CSharpSupportPart::interpreter()
+{
+ QString prog = DomUtil::readEntry(*projectDom(), "/kdevcsharpsupport/run/interpreter");
+ if (prog.isEmpty())
+ prog = "csharp";
+
+ return prog;
+}
+
+
+void CSharpSupportPart::startApplication(const QString &program)
+{
+ bool inTerminal = DomUtil::readBoolEntry(*projectDom(), "/kdevcsharpsupport/run/terminal");
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), program, inTerminal);
+}
+
+
+void CSharpSupportPart::slotExecute()
+{
+ QString program = project()->mainProgram();
+ QString cmd = interpreter() + " " + program;
+ startApplication(cmd);
+}
+
+
+void CSharpSupportPart::slotStartInterpreter()
+{
+ startApplication(interpreter());
+}
+
+
+void CSharpSupportPart::slotExecuteString()
+{
+ bool ok;
+ QString cmd = KInputDialog::getText(i18n("String to Execute"), i18n("String to execute:"), QString::null, &ok, 0);
+ if (ok) {
+ cmd.prepend("'");
+ cmd.append("'");
+ startApplication(cmd);
+ }
+}
+
+
+void CSharpSupportPart::slotCSharpdocFunction()
+{
+ bool ok;
+ QString key = KInputDialog::getText(i18n("Show CSharp Documentation"), i18n("Show CSharp documentation for function:"), "", &ok, 0);
+ if (ok && !key.isEmpty()) {
+ QString url = "csharpdoc:functions/";
+ url += key;
+ partController()->showDocument(KURL(url));
+ }
+}
+
+
+void CSharpSupportPart::slotCSharpdocFAQ()
+{
+ bool ok;
+ QString key = KInputDialog::getText(i18n("Show FAQ Entry"), i18n("Show FAQ entry for keyword:"), "", &ok, 0);
+ if (ok && !key.isEmpty()) {
+ QString url = "csharpdoc:faq/";
+ url += key;
+ partController()->showDocument(KURL(url));
+ }
+}
+KMimeType::List CSharpSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "application/x-csharp" );
+ if( mime )
+ list << mime;
+ return list;
+}
+
+void CSharpSupportPart::initialParse()
+{
+ kdDebug(9016) << "initialParse()" << endl;
+
+ if (project()) {
+ //copy from cpp support : give user some feedback
+ mainWindow()->statusBar()->message( i18n("Updating...") );
+ kapp->processEvents( );
+
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ // m_parser->initialParse();
+
+ //progress bar
+ QProgressBar* bar = new QProgressBar( files.count( ), mainWindow( )->statusBar( ) );
+ bar->setMinimumWidth( 120 );
+ bar->setCenterIndicator( true );
+ mainWindow( )->statusBar( )->addWidget( bar );
+ bar->show( );
+ int n = 0;
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it) {
+// kdDebug(9016) << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+ maybeParse(project()->projectDirectory() + "/" + *it);
+ //update progress bar
+ bar->setProgress( n++ );
+ if( (n%5) == 0 )
+ kapp->processEvents();
+ }
+ parseUseFiles();
+ emit updatedSourceInfo();
+
+ //remove progressbar
+ mainWindow( )->statusBar( )->removeWidget( bar );
+ delete bar;
+ kapp->restoreOverrideCursor();
+ mainWindow()->statusBar()->message( i18n("Done") );
+
+ } else {
+ kdDebug(9016) << "No project" << endl;
+ }
+}
+
+void CSharpSupportPart::removeWithReference( const QString & fileName )
+{
+ kdDebug(9016) << "remove with references: " << fileName << endl;
+ //m_timestamp.remove( fileName );
+ if( !codeModel()->hasFile(fileName) )
+ return;
+
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+}
+
+void CSharpSupportPart::parseUseFiles()
+{
+ kdDebug(9016) << "parse addional libs" << endl;
+ return;
+ QString filename;
+ QStringList m_usefiles;
+ // QStringList m_usefiles = m_parser->UseFiles();
+
+ //parse addional use files
+ for (QStringList::Iterator it = m_usefiles.begin(); it != m_usefiles.end() ;++it)
+ {
+ // filename = m_parser->findLib(*it);
+ //if something found , parse it
+ if (!filename.isEmpty()) {
+ //kdDebug(9016) << "found " << filename << endl;
+ maybeParse(filename);
+ }
+ }
+}
+
+#include "csharpsupportpart.moc"
diff --git a/languages/csharp/csharpsupportpart.h b/languages/csharp/csharpsupportpart.h
new file mode 100644
index 00000000..166285a6
--- /dev/null
+++ b/languages/csharp/csharpsupportpart.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ * Copyright (C) 2001-2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _CSHARPSUPPORTPART_H_
+#define _CSHARPSUPPORTPART_H_
+
+#include "kdevlanguagesupport.h"
+#include <codemodel.h>
+// #include "csharpparser.h"
+
+class CSharpSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+ CSharpSupportPart( QObject *parent, const char *name, const QStringList & );
+ ~CSharpSupportPart();
+
+protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+private slots:
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void slotExecute();
+ void slotExecuteString();
+ void slotStartInterpreter();
+
+ // Internal
+ void initialParse();
+ void slotCSharpdocFunction();
+ void slotCSharpdocFAQ();
+
+private:
+ QString interpreter();
+ void startApplication(const QString &program);
+ void maybeParse(const QString fileName);
+ void parse(const QString &fileName);
+ void parseLines(QStringList* lines,const QString& fileName);
+ void removeWithReference( const QString & fileName );
+ void parseUseFiles();
+ //CSharp Parser
+// csharpparser* m_parser;
+
+};
+
+#endif
diff --git a/languages/csharp/doc/Makefile.am b/languages/csharp/doc/Makefile.am
new file mode 100644
index 00000000..e0dfb9eb
--- /dev/null
+++ b/languages/csharp/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA =
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA =
+
diff --git a/languages/csharp/file_templates/Makefile.am b/languages/csharp/file_templates/Makefile.am
new file mode 100644
index 00000000..b4f0a30c
--- /dev/null
+++ b/languages/csharp/file_templates/Makefile.am
@@ -0,0 +1,4 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA =
+
+
diff --git a/languages/csharp/kdevcsharpsupport.desktop b/languages/csharp/kdevcsharpsupport.desktop
new file mode 100644
index 00000000..dbd9492b
--- /dev/null
+++ b/languages/csharp/kdevcsharpsupport.desktop
@@ -0,0 +1,57 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=CSharp Support
+Comment[ca]=Suport per a CSharp
+Comment[da]=Csharp understøttelse
+Comment[de]=CSharp-Unterstützung für KDevelop
+Comment[el]=ΥποστήÏιξη CSharp
+Comment[es]=Soporte para CSharp
+Comment[et]=CSharp'i toetus
+Comment[fr]=Prise en charge du langage CSharp
+Comment[hu]=CSharp-támogatás
+Comment[it]=Supporto per CSharp
+Comment[ja]=CSharp サãƒãƒ¼ãƒˆ
+Comment[nds]=Ünnerstütten för CSharp
+Comment[nl]=Ondersteuning voor CSharp
+Comment[pl]=Obsługa CSharp
+Comment[pt]=Suporte a C#
+Comment[pt_BR]=Suporte a C#
+Comment[ru]=Поддержка CSharp
+Comment[sk]=CSharp podpora
+Comment[sr]=Подршка за CSharp
+Comment[sr@Latn]=Podrška za CSharp
+Comment[sv]=C#-stöd
+Comment[zh_TW]=C# 支æ´
+Name=KDevCSharpSupport
+Name[de]=Unterstützung für CSharp (KDevelop)
+Name[nds]=CSharp-Ünnerstütten för KDevelop
+Name[sv]=KDevelop C#-stöd
+Name[zh_TW]=KDevelop C# 支æ´
+GenericName=CSharp Support
+GenericName[ca]=Suport per a CSharp
+GenericName[da]=CSharp understøttelse
+GenericName[de]=Unterstützung für CSharp
+GenericName[el]=ΥποστήÏιξη CSharp
+GenericName[es]=Soporte para CSharp
+GenericName[et]=CSharp'i toetus
+GenericName[fr]=Prise en charge du langage CSharp
+GenericName[hu]=CSharp-támogatás
+GenericName[it]=Supporto CSharp
+GenericName[ja]=CSharp サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för CSharp
+GenericName[nl]=Ondersteuning voor CSharp
+GenericName[pl]=Obsługa CSharp
+GenericName[pt]=Suporte a C#
+GenericName[pt_BR]=Suporte a C#
+GenericName[ru]=Поддержка CSharp
+GenericName[sk]=CSharp podpora
+GenericName[sr]=Подршка за CSharp
+GenericName[sr@Latn]=Podrška za CSharp
+GenericName[sv]=C#-stöd
+GenericName[zh_TW]=C# 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevcsharpsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=CSharp
+
diff --git a/languages/csharp/kdevcsharpsupport.rc b/languages/csharp/kdevcsharpsupport.rc
new file mode 100644
index 00000000..b5f735e2
--- /dev/null
+++ b/languages/csharp/kdevcsharpsupport.rc
@@ -0,0 +1,14 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevCSharpSupport" version="1">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_exec" />
+ <Action name="build_runinterpreter" />
+ <Action name="build_execstring" />
+ </Menu>
+ <Menu name="help">
+ <Action name="help_csharpdocfunction"/>
+ <Action name="help_csharpdocfaq"/>
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/fortran/Makefile.am b/languages/fortran/Makefile.am
new file mode 100644
index 00000000..ac6f5be2
--- /dev/null
+++ b/languages/fortran/Makefile.am
@@ -0,0 +1,20 @@
+# Here resides the Fortran support part.
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+SUBDIRS = file_templates app_templates compiler doc
+
+kde_module_LTLIBRARIES = libkdevfortransupport.la
+libkdevfortransupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevfortransupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la
+
+libkdevfortransupport_la_SOURCES = fortransupportpart.cpp fixedformparser.cpp ftnchekconfigwidget.cpp ftnchekconfigwidgetbase.ui
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevfortransupport.desktop
+
+rcdir = $(kde_datadir)/kdevfortransupport
+rc_DATA = kdevfortransupport.rc
diff --git a/languages/fortran/README.dox b/languages/fortran/README.dox
new file mode 100644
index 00000000..65a4e645
--- /dev/null
+++ b/languages/fortran/README.dox
@@ -0,0 +1,48 @@
+/** \class FortranSupportPart
+This is Fortran language support plugin.
+
+Put a more detailed description of your part in these lines. It can span
+over several lines. You can even use some html commands in these lines like:
+<code>This is code</code>, html links <a href="http://somelocation">link text</a>,
+and images.
+
+\authors <a href="mailto:bernd AT kdevelop.org">Bernd Gehrmann</a>
+
+\maintainer <a href="mailto:$EMAIL$">$AUTHOR$</a>
+\maintainer <a href="mailto:2nd maintainer AT provider.com">2nd maintainer full name</a>
+...
+\maintainer <a href="mailto:nth maintainer AT provider.com">nth maintainer full name</a>
+
+\feature Fortran language support
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/fortran/app_templates/Makefile.am b/languages/fortran/app_templates/Makefile.am
new file mode 100644
index 00000000..056dc759
--- /dev/null
+++ b/languages/fortran/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = fortranhello
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/CompiledLanguageIDE/FortranIDE
+profiles_DATA = fortran.appwizard
diff --git a/languages/fortran/app_templates/fortran.appwizard b/languages/fortran/app_templates/fortran.appwizard
new file mode 100644
index 00000000..7cd8232e
--- /dev/null
+++ b/languages/fortran/app_templates/fortran.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=fortranhello
diff --git a/languages/fortran/app_templates/fortranhello/.kdev_ignore b/languages/fortran/app_templates/fortranhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/.kdev_ignore
diff --git a/languages/fortran/app_templates/fortranhello/Makefile.am b/languages/fortran/app_templates/fortranhello/Makefile.am
new file mode 100644
index 00000000..ba97453d
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = main.f src-Makefile.am fortran-Makefile.am fortran-Makefile.cvs \
+ configure.in fortranhello.png app.kdevelop
+templateName = fortranhello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/fortran/app_templates/fortranhello/app.kdevelop b/languages/fortran/app_templates/fortranhello/app.kdevelop
new file mode 100644
index 00000000..b4abc5ae
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/app.kdevelop
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>Fortran77</primarylanguage>
+ <keywords>
+ <keyword>Fortran</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevCTags</part>
+ </ignoreparts>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/%{APPNAMELC}</activetarget>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ <terminal>true</terminal>
+ </run>
+ <makeenvvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </makeenvvars>
+ </kdevautoproject>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="F"/>
+ <type ext="fpp"/>
+ <type ext="f"/>
+ <type ext="for"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfortransupport>
+ <ftnchek>
+ <division>false</division>
+ <extern>false</extern>
+ <declare>false</declare>
+ <pure>false</pure>
+ <argumentsall>false</argumentsall>
+ <commonall>false</commonall>
+ <truncationall>false</truncationall>
+ <usageall>false</usageall>
+ <f77all>false</f77all>
+ <portabilityall>false</portabilityall>
+ <argumentsonly></argumentsonly>
+ <commononly></commononly>
+ <truncationonly></truncationonly>
+ <usageonly></usageonly>
+ <f77only></f77only>
+ <portabilityonly></portabilityonly>
+ </ftnchek>
+ </kdevfortransupport>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.f;*.for;*.FOR" name="Preprocessed Fortran" />
+ <group pattern="*.F;*.fpp;*.FPP" name="Fortran77 source files" />
+ </groups>
+ </kdevfileview>
+</kdevelop>
diff --git a/languages/fortran/app_templates/fortranhello/configure.in b/languages/fortran/app_templates/fortranhello/configure.in
new file mode 100644
index 00000000..e1b885a7
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/configure.in
@@ -0,0 +1,10 @@
+AC_INIT(configure.in)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, %{VERSION})
+AM_CONFIG_HEADER(config.h)
+
+AC_LANG_FORTRAN77
+AC_PROG_F77
+AC_F77_LIBRARY_LDFLAGS
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/languages/fortran/app_templates/fortranhello/fortran-Makefile.am b/languages/fortran/app_templates/fortranhello/fortran-Makefile.am
new file mode 100644
index 00000000..02520f20
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/fortran-Makefile.am
@@ -0,0 +1,5 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = src
diff --git a/languages/fortran/app_templates/fortranhello/fortran-Makefile.cvs b/languages/fortran/app_templates/fortranhello/fortran-Makefile.cvs
new file mode 100644
index 00000000..d1607023
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/fortran-Makefile.cvs
@@ -0,0 +1,8 @@
+default: all
+
+all:
+ aclocal
+ autoheader
+ automake
+ autoconf
+
diff --git a/languages/fortran/app_templates/fortranhello/fortranhello b/languages/fortran/app_templates/fortranhello/fortranhello
new file mode 100644
index 00000000..1028a814
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/fortranhello
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=Simple Hello world program
+Name[fr]=Un simple programme de test « Hello world »
+Icon=fortranhello.png
+Category=Fortran
+Comment=Generates a simple Hello world program in Fortran
+Comment[fr]=Génère un simple programme de test du type « Hello world » dans le language FORTRAN.
+FileTemplates=f,None
+ShowFilesAfterGeneration=src/APPNAMELC.f
diff --git a/languages/fortran/app_templates/fortranhello/fortranhello.kdevtemplate b/languages/fortran/app_templates/fortranhello/fortranhello.kdevtemplate
new file mode 100644
index 00000000..b6580853
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/fortranhello.kdevtemplate
@@ -0,0 +1,140 @@
+# KDE Config File
+[General]
+Name=Simple Hello world program
+Name[ca]=Simple programa Hello world
+Name[da]=Simpelt Goddag verden program
+Name[de]=Ein einfaches "Hello World"-Programm
+Name[el]=Απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε
+Name[es]=Programa «Hola mundo» sencillo
+Name[et]=Lihtne "Tere, maailm" programm
+Name[eu]="Kaixo mundua" programa sinplea
+Name[fa]=برنامۀ سادۀ Hello world
+Name[fr]=Programme « Bonjour monde » simple
+Name[ga]=Ríomhchlár simplí "Hello World"
+Name[gl]=Programa sinxelo Ola mundo
+Name[hu]=Egyszerű Hello world program
+Name[it]=Semplice programma di "Hello world"
+Name[ja]=ç°¡å˜ãª Hello world プログラム
+Name[ms]=Program Hello World mudah
+Name[nds]=En eenfach "Moin Welt"-Programm
+Name[ne]=साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Eenvoudig 'Hello World' programma
+Name[pl]=Prosty program witaj świecie
+Name[pt]=Programa simples Olá Mundo
+Name[pt_BR]=Programa simples Olá Mundo
+Name[ru]=ПроÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Hello world
+Name[sk]=Jednoduchý "Ahoj svet" program
+Name[sl]=Preprost program Hello world
+Name[sr]=ЈедноÑтаван „Здраво Ñвете“ програм
+Name[sr@Latn]=Jednostavan „Zdravo svete“ program
+Name[sv]=Enkelt Hello world-program
+Name[tr]=Basit Merhaba dünya programı
+Name[zh_CN]=简å•çš„ Hello world 程åº
+Name[zh_TW]=簡單的 Hello world 程å¼
+Icon=fortranhello.png
+Category=Fortran
+Comment=Generates a simple Hello world program in Fortran
+Comment[ca]=Genera un simple programa de Hello world en Fortran
+Comment[da]=Genererer et simpelt Goddag verden program i Fortran
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in Fortran
+Comment[el]=ΔημιουÏγία ενός Î±Ï€Î»Î¿Ï Ï€ÏογÏάμματος Γεια σου σε Fortran
+Comment[es]=Genera un sencillo programa «Hola mundo» en Fortran
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine Fortranis
+Comment[eu]="Kaixo mundua" programa sinple bat sortzen du Fortran lengoaian
+Comment[fa]=یک برنامۀ سادۀ Hello world در Ùرترن تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en Fortran
+Comment[gl]=Xera un programa sinxelo Ola mundo en Fortran
+Comment[hu]=Létrehoz egy egyszerű Hello world programot Fortran nyelven
+Comment[it]=Genera un semplice programma di "Hello world" in Fortran
+Comment[ja]=ç°¡å˜ãª Hello world プログラムを Fortran ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach "Moin Welt"-Programm in Fortran op
+Comment[ne]=फोरà¥à¤Ÿà¥à¤°à¤¾à¤¨à¤®à¤¾ साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudig Hello World-programma in Fortran
+Comment[pl]=Generuje prosty program Witaj świecie w Fortranie
+Comment[pt]=Gera um programa simples Olá Mundo em Fortran
+Comment[pt_BR]=Gera um programa simples Olá Mundo em Fortran
+Comment[ru]=Создание проÑтой программы Hello world на Fortran
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program vo Fortran
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ у Fortran-у
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ u Fortran-u
+Comment[sv]=Skapar ett enkelt Hello world-program i Fortran
+Comment[tr]=Fortran'da basit bir Merhaba Dünya programı yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªç®€å•çš„ Fortran 语言 Hello world 程åº
+Comment[zh_TW]=產生一個簡單的 Fortran Hello world 程å¼
+FileTemplates=f,None
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.f
+Archive=fortranhello.tar.gz
+
+[INCADMIN]
+Type=include
+File=%{kdevelop}/template-common/incadmin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/fortran-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE3]
+Type=install
+Source=%{src}/fortran-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE4]
+Type=install
+Source=%{src}/configure.in
+Dest=%{dest}/configure.in
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{src}/main.f
+Dest=%{dest}/src/%{APPNAMELC}.f
+
+[MSG]
+Type=message
+Comment=a simple "Hello world" program in fortran was created in %{dest}
+Comment[ca]=Un simple programa de "Hello world" en fortran ha estat creat en %{dest}
+Comment[da]=et simpelt "Goddag verden" program i fortran blev oprettet i %{dest}
+Comment[de]=Ein einfaches "Hello World"-Programm in Fortran wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό Ï€ÏόγÏαμμα "Γεια σου κόσμε" σε fortran δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo programa «Hola mundo» en Fortran ha sido creado en %{dest}
+Comment[et]=Lihtne "Tere, maailm" programm Fortranis loodi asukohta %{dest}
+Comment[eu]="Kaixo mundua" programa sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در Ùرترن در %{dest} ایجاد شد
+Comment[fr]=Un programme « Bonjour monde » simple en Fortran a été créé dans %{dest}
+Comment[gl]=Creouse un programa sinxelo "Ola mundo" en fortran en %{dest}
+Comment[hu]=Létrejött egy egyszerű, Fortran nyelvű Hello world program itt: %{dest}
+Comment[it]=È stato creato un semplice programma di "Hello world" in Fortran in %{dest}
+Comment[ja]=Fortran ã§è¨˜è¿°ã•ã‚ŒãŸç°¡å˜ãª Hello world プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach "Moin Welt"-Programm in Fortran opstellt
+Comment[ne]=फोरà¥à¤Ÿà¥à¤°à¤¾à¤¨à¤®à¤¾ साधारण "हेलà¥à¤²à¥‹ वोलà¥à¤¡" कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=een eenvoudig "Hello World"-programma in Fortran is aangemaakt in %{dest}
+Comment[pl]=Prosty program "Witaj świecie" w Fortranie został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples "Olá mundo" em Fortran em %{dest}
+Comment[pt_BR]=Foi criado um programa simples "Olá mundo" em Fortran em %{dest}
+Comment[ru]=ПроÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° "Hello world" на Fortran Ñоздана в %{dest}
+Comment[sk]=Jednoduchý "Ahoj svet" program vo Fortran bol vytvorený v %{dest}
+Comment[sr]=ЈедноÑтаван „Здраво Ñвете“ у Fortran-у направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan „Zdravo svete“ u Fortran-u napravljen je u %{dest}
+Comment[sv]=Ett enkelt "Hello world"-program i Fortran skapades i %{dest}
+Comment[tr]=Fortran'da basit bir "Merhaba Dünya" programı %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简å•çš„ Fortran 语言“Hello worldâ€ç¨‹åº
+Comment[zh_TW]=一個 fortran 的簡單的 "Hello world" 程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/fortran/app_templates/fortranhello/fortranhello.png b/languages/fortran/app_templates/fortranhello/fortranhello.png
new file mode 100644
index 00000000..888d4f13
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/fortranhello.png
Binary files differ
diff --git a/languages/fortran/app_templates/fortranhello/main.f b/languages/fortran/app_templates/fortranhello/main.f
new file mode 100644
index 00000000..3f5d29ca
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/main.f
@@ -0,0 +1,7 @@
+c
+c This is the Hello World example
+c
+ program hello
+ print *,'Hello World!'
+ stop
+ end
diff --git a/languages/fortran/app_templates/fortranhello/src-Makefile.am b/languages/fortran/app_templates/fortranhello/src-Makefile.am
new file mode 100644
index 00000000..f3f03092
--- /dev/null
+++ b/languages/fortran/app_templates/fortranhello/src-Makefile.am
@@ -0,0 +1,8 @@
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.f
+
+# set the include path found by configure
+INCLUDES= $(all_includes)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries)
diff --git a/languages/fortran/compiler/Makefile.am b/languages/fortran/compiler/Makefile.am
new file mode 100644
index 00000000..3489a85c
--- /dev/null
+++ b/languages/fortran/compiler/Makefile.am
@@ -0,0 +1,6 @@
+# This is the collection of plugins. In contrast to the parts
+# directory, these are 'transient' in a sense and don't
+# share the complete KDevComponent interface.
+
+SUBDIRS = pgioptions
+
diff --git a/languages/fortran/compiler/pgioptions/Makefile.am b/languages/fortran/compiler/pgioptions/Makefile.am
new file mode 100644
index 00000000..3c3dd54e
--- /dev/null
+++ b/languages/fortran/compiler/pgioptions/Makefile.am
@@ -0,0 +1,18 @@
+# Here resides the pgi option dialog plugin.
+# This defines the options for the Portland Group compiler
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/extras \
+ $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevpgioptions.la
+libkdevpgioptions_la_LDFLAGS = -module $(all_libraries) $(KDE_PLUGIN)
+libkdevpgioptions_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/lib/interfaces/extras/libkdevextras.la
+
+libkdevpgioptions_la_SOURCES = pgioptionsfactory.cpp pgioptionsplugin.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevpghpfoptions.desktop kdevpgf77options.desktop
+
diff --git a/languages/fortran/compiler/pgioptions/kdevpgf77options.desktop b/languages/fortran/compiler/pgioptions/kdevpgf77options.desktop
new file mode 100644
index 00000000..8af14494
--- /dev/null
+++ b/languages/fortran/compiler/pgioptions/kdevpgf77options.desktop
@@ -0,0 +1,53 @@
+[Desktop Entry]
+Type=Service
+Exec=pgf77
+Comment=Portland Group Fortran77 Compiler
+Comment[br]=Dastumer Fortran 77 ar strollad Portland
+Comment[ca]=Compilador Fortran 77 de Portland Group
+Comment[da]=Portland Group Fortran77 oversætter
+Comment[el]=Μεταγλωττιστής Fortran77 ομάδας Portland
+Comment[es]=Compilador de Fortran 77 de Portland Group
+Comment[et]=Portland Group Fortran77 kompilaator
+Comment[eu]=Portland Group Fortran77 konpiladorea
+Comment[fa]=مترجم Ùرترن Û·Û· گروه Portland
+Comment[fr]=Compilateur Fortran77 du Portland Group
+Comment[gl]=Compilador de Fortran77 de Portland Group
+Comment[hi]=पोरà¥à¤Ÿà¤²à¥ˆà¤‚ड समूह फ़ोरटà¥à¤°à¥‰à¤¨77 कमà¥à¤ªà¤¾à¤¯à¤²à¤°
+Comment[hu]=Portland Group Fortran 77 fordítóprogram
+Comment[is]=Portland Group Fortran77 þýðandi
+Comment[it]=Compilatore per Portland Group Fortran77
+Comment[ja]=Portland グループ Fortran77 コンパイラ
+Comment[nds]=Portland Group-Fortran77-Kompilerer
+Comment[ne]=पोरà¥à¤Ÿà¤²à¥à¤¯à¤¾à¤¨à¥à¤¡ समूह फोरà¥à¤Ÿà¥à¤°à¤¾à¤¨ ७७ कमà¥à¤ªà¤¾à¤‡à¤²à¤°
+Comment[nl]=Portland Group Fortran77-compiler
+Comment[pl]=Kompilator Portland Group Fortran77
+Comment[pt]=Compilador de Fortran77 do Portland Group
+Comment[pt_BR]=Compilador Portland Group Fortran77
+Comment[ru]=КомпилÑтор Portland Group Fortran77
+Comment[sk]=Portland Group Fortran77 kompilátor
+Comment[sl]=Prevajalnik za Portland Group Fortran77
+Comment[sr]=Преводилац Fortran-а 77 од Portland Group-а
+Comment[sr@Latn]=Prevodilac Fortran-a 77 od Portland Group-a
+Comment[sv]=Portland gruppens Fortran 77-kompilator
+Comment[ta]=பொரà¯à®Ÿà¯à®²à®¾à®©à¯à®Ÿà¯ கà¯à®´à¯ பொரà¯à®Ÿà¯à®°à®¾à®©à¯ 77 தொகà¯à®ªà¯à®ªà®¿
+Comment[tg]=Талфифгари Portland Group Fortran77
+Comment[tr]=Portland Grubu Fortran 77 Derleyicisi
+Comment[zh_CN]=Portland Group Fortran77 编译器
+Comment[zh_TW]=Portland Group Fortran 77 編譯器
+Name=Pgf77Options
+Name[da]=Portland Group Fortran77 indstillinger
+Name[de]=Pgf77-Einstellungen (KDevelop)
+Name[hi]=पीजीà¤à¤«à¤¼77विकलà¥à¤ª
+Name[nds]=Pgf77-Instellen (KDevelop)
+Name[pl]=Opcje Pgf77
+Name[sk]=Pgf77 možnosti
+Name[sl]=Možnosti Pgf77
+Name[sv]=Alternativ för pgf77
+Name[ta]=Pgf77 விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯
+Name[tg]=Pgf77Интихобҳо
+Name[zh_TW]=Pgf77 é¸é …
+ServiceTypes=KDevelop/CompilerOptions
+X-KDE-Library=libkdevpgioptions
+X-KDevelop-Version=5
+X-KDevelop-Language=Fortran
+X-KDevelop-Args=pgf77
diff --git a/languages/fortran/compiler/pgioptions/kdevpghpfoptions.desktop b/languages/fortran/compiler/pgioptions/kdevpghpfoptions.desktop
new file mode 100644
index 00000000..56923deb
--- /dev/null
+++ b/languages/fortran/compiler/pgioptions/kdevpghpfoptions.desktop
@@ -0,0 +1,50 @@
+[Desktop Entry]
+Type=Service
+Exec=pghpf
+Comment=Portland Group High Performance Fortran compiler
+Comment[ca]=Compilador Fortran d'altes prestacions de Portland Group
+Comment[da]=Portland Group Fortran oversætter
+Comment[de]=Portland Group High Performance Fortran Compiler
+Comment[el]=Μεταγλωττιστής υψηλής ταχÏτητας Fortran της ομάδας Portland
+Comment[es]=Compilador de Fortran de alto rendimiento de Portland Group
+Comment[et]=Portland Groupi suure jõudlusega Fortrani kompilaator
+Comment[eu]=Portland Group-en errendimendu handiko Fortran konpiladorea
+Comment[fa]=مترجم Ùرترن با کارایی بالای گروه Portland
+Comment[fr]=Compilateur Fortran hautes performances du Portland Group
+Comment[gl]=Compilador de High Performance Fortran de Portland Group
+Comment[hi]=पोरà¥à¤Ÿà¤²à¥ˆà¤‚ड समूह उचà¥à¤š परफ़ारà¥à¤®à¥‡à¤‚स फ़ोरटà¥à¤°à¥‰à¤¨ कमà¥à¤ªà¤¾à¤¯à¤²à¤°
+Comment[hu]=Portland Group nagyteljesítményű Fortran fordítóprogram
+Comment[it]=Compilatore ad alte prestazioni per Fortran del Portland Group
+Comment[ja]=Portland グループ ãƒã‚¤ãƒ‘フォーマンス Fortran コンパイラ
+Comment[nds]=Portland Group-Hoochleistenkompilerer för Fortran
+Comment[ne]=पोरà¥à¤Ÿà¤²à¥à¤¯à¤¾à¤¨à¥à¤¡ समूह उचà¥à¤š कारà¥à¤¯à¤¸à¤®à¥à¤ªà¤¾à¤¦à¤¨ फोरà¥à¤Ÿà¥à¤°à¤¾à¤¨ कमà¥à¤ªà¤¾à¤‡à¤²à¤°
+Comment[nl]=Portland Group High Performance Fortran-compiler
+Comment[pl]=Kompilator Portland Group High Performance Fortran
+Comment[pt]=Compilador Portland Group High Performance Fortran
+Comment[pt_BR]=Compilador Portland Group Alta Performance
+Comment[ru]=КомпилÑтор Portland Group High Performance Fortran
+Comment[sk]=Portland Group vysoko výkonný Fortran kompilátor
+Comment[sr]=Преводилац Fortran-а виÑоких перформанÑи, из Portland Group-а
+Comment[sr@Latn]=Prevodilac Fortran-a visokih performansi, iz Portland Group-a
+Comment[sv]=Portland gruppens högprestanda Fortran 77-kompilator
+Comment[ta]=பொரà¯à®Ÿà¯à®²à®¾à®©à¯à®Ÿà¯ கà¯à®´à¯ உயர௠செயலà¯à®ªà®¾à®Ÿà¯ பொரà¯à®Ÿà¯à®°à®¾à®©à¯ தொகà¯à®ªà¯à®ªà®¿
+Comment[tg]=Талфифгари Portland Group High Performance Fortran
+Comment[tr]=Portland Grubu Yüksek Başarımlı Fortran Derleyicisi
+Comment[zh_CN]=Portland Group 高性能 Fortran 编译器
+Comment[zh_TW]=Portland Group 高效能 Fortran 編譯器
+Name=PghpfOptions
+Name[da]=Portland Group oversætter-indstillinger
+Name[de]=Pghpf-Einstellungen (KDevelop)
+Name[hi]=पीजीà¤à¤šà¤ªà¥€à¤à¤«à¤¼-विकलà¥à¤ª
+Name[nds]=Pghpf-Optschonen
+Name[pl]=Opcje Pghpf
+Name[sk]=Pghpf možnosti
+Name[sv]=Alternativ för pghpf
+Name[ta]=Pghpf விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯
+Name[tg]=PghpfИнтихобҳо
+Name[zh_TW]=Pghpf é¸é …
+ServiceTypes=KDevelop/CompilerOptions
+X-KDE-Library=libkdevpgioptions
+X-KDevelop-Version=5
+X-KDevelop-Language=Fortran
+X-KDevelop-Args=pghpf
diff --git a/languages/fortran/compiler/pgioptions/pgioptionsfactory.cpp b/languages/fortran/compiler/pgioptions/pgioptionsfactory.cpp
new file mode 100644
index 00000000..5fad6630
--- /dev/null
+++ b/languages/fortran/compiler/pgioptions/pgioptionsfactory.cpp
@@ -0,0 +1,69 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include <kdebug.h>
+#include <kinstance.h>
+#include "pgioptionsplugin.h"
+#include "pgioptionsfactory.h"
+
+
+extern "C" {
+
+ void *init_libkdevpgioptions()
+ {
+ return new PgiOptionsFactory;
+ }
+
+}
+
+
+PgiOptionsFactory::PgiOptionsFactory(QObject *parent, const char *name)
+ : KLibFactory(parent, name)
+{
+ instance();
+}
+
+
+PgiOptionsFactory::~PgiOptionsFactory()
+{
+ delete s_instance;
+ s_instance = 0;
+}
+
+
+QObject *PgiOptionsFactory::createObject(QObject *parent, const char *name,
+ const char * /*classname*/, const QStringList &args)
+{
+ if (args.count() > 0 && qstrcmp(args[0].latin1(), "pghpf") == 0) {
+ kdDebug(9021) << "Building PgiOptions for PGHPF" << endl;
+ return new PgiOptionsPlugin(PgiOptionsPlugin::PGHPF, parent, name);
+ } else if (args.count() > 0 && qstrcmp(args[0].latin1(), "pgf77") == 0) {
+ kdDebug(9021) << "Building PgiOptions for PGF77" << endl;
+ return new PgiOptionsPlugin(PgiOptionsPlugin::PGF77, parent, name);
+ } else {
+ kdDebug(9021) << "Wrong args for kdevpgioptions library" << endl;
+ if (args.count() > 0)
+ kdDebug(9021) << args[0] << endl;
+ return 0;
+ }
+}
+
+
+KInstance *PgiOptionsFactory::s_instance = 0;
+KInstance *PgiOptionsFactory::instance()
+{
+ if (!s_instance)
+ s_instance = new KInstance("kdevpgioptions");
+
+ return s_instance;
+}
+
+#include "pgioptionsfactory.moc"
diff --git a/languages/fortran/compiler/pgioptions/pgioptionsfactory.h b/languages/fortran/compiler/pgioptions/pgioptionsfactory.h
new file mode 100644
index 00000000..9e3113a7
--- /dev/null
+++ b/languages/fortran/compiler/pgioptions/pgioptionsfactory.h
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PGIOPTIONSFACTORY_H_
+#define _PGIOPTIONSFACTORY_H_
+
+#include <klibloader.h>
+
+
+class PgiOptionsFactory : public KLibFactory
+{
+ Q_OBJECT
+
+public:
+ PgiOptionsFactory( QObject *parent=0, const char *name=0 );
+ ~PgiOptionsFactory();
+
+ virtual QObject* createObject( QObject *parent, const char *name,
+ const char *classname, const QStringList &args);
+ static KInstance *instance();
+
+private:
+ static KInstance *s_instance;
+};
+
+#endif
diff --git a/languages/fortran/compiler/pgioptions/pgioptionsplugin.cpp b/languages/fortran/compiler/pgioptions/pgioptionsplugin.cpp
new file mode 100644
index 00000000..8bed362e
--- /dev/null
+++ b/languages/fortran/compiler/pgioptions/pgioptionsplugin.cpp
@@ -0,0 +1,324 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include <qapplication.h>
+#include <qheader.h>
+#include <qlayout.h>
+#include <qlistview.h>
+#include <qradiobutton.h>
+#include <qvbox.h>
+#include <qvbuttongroup.h>
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "pgioptionsplugin.h"
+
+
+const char * const optimization_flags[] = {
+ "-Mautopar",
+ "-Mextract",
+ "-Minline",
+ "-Mipa",
+ 0
+};
+
+
+const char * const hpf_flags[] = {
+ "-Mbackslash",
+ "-Mcmf",
+ "-Mdclchk",
+ "-Mextend",
+ "-Mf90",
+ "-Mnofree",
+ "-Mstandard",
+ "-Mupcase",
+ "-Mbyteswapio",
+ "-Mdepchk",
+ "-Mdlines",
+ "-Mg",
+ "-Mftn",
+ "-Minfo",
+ "-Minform",
+ "-Mkeepft",
+ "-Mkeepstaticn",
+ "-Mmpi",
+ "-Mmpl",
+ "-Mlist",
+ "-Mnohpfc",
+ "-Mnoindependent",
+ "-Mnoprelink",
+ "-Moverlap",
+ "-Mpreprocess",
+ "-Mprof",
+ "-Mpvm",
+ "-Mr8",
+ "-Mrecursive",
+ "-Mreplicate",
+ "-Mrpm",
+ "-Mrpm1",
+ "-M[no]sequence",
+ "-Msmp",
+ "-Mstats",
+ 0
+};
+
+
+
+class GeneralTab : public QWidget
+{
+public:
+ GeneralTab( QWidget *parent=0, const char *name=0 );
+ ~GeneralTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+};
+
+
+class OptimizationTab : public QWidget
+{
+public:
+ OptimizationTab( PgiOptionsPlugin::Type type, QWidget *parent=0, const char *name=0 );
+ ~OptimizationTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ QRadioButton *Odefault, *O0, *O1, *O2;
+ QListView *optBox;
+};
+
+
+class HpfTab : public QWidget
+{
+public:
+ HpfTab( QWidget *parent=0, const char *name=0 );
+ ~HpfTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ QListView *hpfBox;
+};
+
+
+OptimizationTab::OptimizationTab(PgiOptionsPlugin::Type type, QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ QVButtonGroup *group = new QVButtonGroup(i18n("Optimization Level"), this);
+ Odefault = new QRadioButton(i18n("Default"), group);
+ Odefault->setChecked(true);
+ O0 = new QRadioButton(i18n("No optimization"), group);
+ O1 = new QRadioButton(i18n("Level 1"), group);
+ O2 = new QRadioButton(i18n("Level 2"), group);
+
+ if (type == PgiOptionsPlugin::PGHPF) {
+ optBox = new QListView(this);
+ optBox->addColumn(QString::null);
+ optBox->header()->hide();
+ for (const char * const *p = optimization_flags; *p; ++p) {
+ new QCheckListItem(optBox, *p, QCheckListItem::CheckBox);
+ kdDebug() << (*p) << endl;
+ }
+ } else
+ optBox = 0;
+
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addStretch();
+}
+
+
+OptimizationTab::~OptimizationTab()
+{}
+
+
+void OptimizationTab::readFlags(QStringList *list)
+{
+ if (optBox) {
+ QListViewItem *item = optBox->firstChild();
+ for (; item; item = item->nextSibling()) {
+ QStringList::Iterator sli = list->find(item->text(0));
+ if (sli != list->end()) {
+ static_cast<QCheckListItem*>(item)->setOn(true);
+ list->remove(sli);
+ }
+ }
+ }
+
+ QStringList::Iterator sli;
+ sli = list->find("-O0");
+ if (sli != list->end()) {
+ O0->setChecked(true);
+ list->remove(sli);
+ }
+ sli = list->find("-O1");
+ if (sli != list->end()) {
+ O1->setChecked(true);
+ list->remove(sli);
+ }
+ sli = list->find("-O2");
+ if (sli != list->end()) {
+ O2->setChecked(true);
+ list->remove(sli);
+ }
+}
+
+
+void OptimizationTab::writeFlags(QStringList *list)
+{
+ if (optBox) {
+ QListViewItem *item = optBox->firstChild();
+ for (; item; item = item->nextSibling())
+ if (static_cast<QCheckListItem*>(item)->isOn())
+ (*list) << item->text(0);
+ }
+
+ if (O0->isChecked())
+ (*list) << "-O0";
+ else if (O1->isChecked())
+ (*list) << "-O1";
+ else if (O2->isChecked())
+ (*list) << "-O2";
+}
+
+
+HpfTab::HpfTab(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ hpfBox = new QListView(this);
+ hpfBox->addColumn(QString::null);
+ hpfBox->header()->hide();
+ for (const char * const *p = hpf_flags; *p; ++p)
+ new QCheckListItem(hpfBox, *p, QCheckListItem::CheckBox);
+
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addStretch();
+}
+
+
+HpfTab::~HpfTab()
+{}
+
+
+void HpfTab::readFlags(QStringList *list)
+{
+ QListViewItem *item = hpfBox->firstChild();
+ for (; item; item = item->nextSibling()) {
+ QStringList::Iterator sli = list->find(item->text(0));
+ if (sli != list->end()) {
+ static_cast<QCheckListItem*>(item)->setOn(true);
+ list->remove(sli);
+ }
+ }
+}
+
+
+void HpfTab::writeFlags(QStringList *list)
+{
+ QListViewItem *item = hpfBox->firstChild();
+ for (; item; item = item->nextSibling()) {
+ if (static_cast<QCheckListItem*>(item)->isOn())
+ (*list) << item->text(0);
+ }
+}
+
+
+PgiOptionsDialog::PgiOptionsDialog(PgiOptionsPlugin::Type type, QWidget *parent, const char *name)
+ : KDialogBase(Tabbed, (type == PgiOptionsPlugin::PGHPF)? i18n("PGHPF Compiler Options") : i18n("PGF77 Compiler Options"),
+ Ok|Cancel, Ok, parent, name, true)
+{
+ QVBox *vbox;
+
+ // vbox = addVBoxPage(i18n("General"));
+ // general = new GeneralTab(vbox, "general tab");
+
+ vbox = addVBoxPage(i18n("Optimization"));
+ optimization = new OptimizationTab(type, vbox, "optimization tab");
+
+ if (type == PgiOptionsPlugin::PGHPF) {
+ vbox = addVBoxPage(i18n("HPF"));
+ hpf = new HpfTab(vbox, "optimization tab");
+ } else
+ hpf = 0;
+
+}
+
+
+PgiOptionsDialog::~PgiOptionsDialog()
+{
+}
+
+
+void PgiOptionsDialog::setFlags(const QString &flags)
+{
+ QStringList flaglist = QStringList::split(" ", flags);
+
+ // Hand them to 'general' at last, so it can make a line edit
+ // with the unprocessed items
+ if (hpf)
+ hpf->readFlags(&flaglist);
+ optimization->readFlags(&flaglist);
+ // general->readFlags(&flaglist);
+}
+
+
+QString PgiOptionsDialog::flags() const
+{
+ QStringList flaglist;
+
+ if (hpf)
+ hpf->writeFlags(&flaglist);
+ optimization->writeFlags(&flaglist);
+ // general->writeFlags(&flaglist);
+
+ QString flags;
+ QStringList::ConstIterator li;
+ for (li = flaglist.begin(); li != flaglist.end(); ++li) {
+ flags += (*li);
+ flags += " ";
+ }
+
+ flags.truncate(flags.length()-1);
+ return flags;
+}
+
+
+PgiOptionsPlugin::PgiOptionsPlugin(Type type, QObject *parent, const char *name)
+ : KDevCompilerOptions(parent, name)
+{
+ pgitype = type;
+}
+
+
+PgiOptionsPlugin::~PgiOptionsPlugin()
+{}
+
+
+QString PgiOptionsPlugin::exec(QWidget *parent, const QString &flags)
+{
+ PgiOptionsDialog *dlg = new PgiOptionsDialog(pgitype, parent, "pgi options dialog");
+ QString newFlags = flags;
+ dlg->setFlags(flags);
+ if (dlg->exec() == QDialog::Accepted)
+ newFlags = dlg->flags();
+ delete dlg;
+ return newFlags;
+}
+
+#include "pgioptionsplugin.moc"
diff --git a/languages/fortran/compiler/pgioptions/pgioptionsplugin.h b/languages/fortran/compiler/pgioptions/pgioptionsplugin.h
new file mode 100644
index 00000000..dfbf4547
--- /dev/null
+++ b/languages/fortran/compiler/pgioptions/pgioptionsplugin.h
@@ -0,0 +1,55 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PGIOPTIONSPLUGIN_H_
+#define _PGIOPTIONSPLUGIN_H_
+
+#include <kdialogbase.h>
+
+#include "kdevcompileroptions.h"
+
+class GeneralTab;
+class OptimizationTab;
+class HpfTab;
+
+
+class PgiOptionsPlugin : public KDevCompilerOptions
+{
+ Q_OBJECT
+
+public:
+ enum Type { PGHPF, PGF77 };
+
+ PgiOptionsPlugin( Type type, QObject *parent=0, const char *name=0 );
+ ~PgiOptionsPlugin();
+
+ virtual QString exec(QWidget *parent, const QString &flags);
+
+private:
+ Type pgitype;
+};
+
+
+class PgiOptionsDialog : public KDialogBase
+{
+public:
+ PgiOptionsDialog(PgiOptionsPlugin::Type type, QWidget *parent=0, const char *name=0 );
+ ~PgiOptionsDialog();
+
+ void setFlags(const QString &flags);
+ QString flags() const;
+
+private:
+ OptimizationTab *optimization;
+ HpfTab *hpf;
+};
+
+#endif
diff --git a/languages/fortran/doc/Makefile.am b/languages/fortran/doc/Makefile.am
new file mode 100644
index 00000000..5e7eab51
--- /dev/null
+++ b/languages/fortran/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = fortran_bugs_gcc.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA =
+
diff --git a/languages/fortran/doc/fortran_bugs_gcc.toc b/languages/fortran/doc/fortran_bugs_gcc.toc
new file mode 100644
index 00000000..444a2a05
--- /dev/null
+++ b/languages/fortran/doc/fortran_bugs_gcc.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Fortran bugs (GCC)</title>
+<base href="http://gcc.gnu.org/bugzilla/"/>
+<tocsect1 name="Query" url="query.cgi">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/fortran/file_templates/Makefile.am b/languages/fortran/file_templates/Makefile.am
new file mode 100644
index 00000000..2a8e4365
--- /dev/null
+++ b/languages/fortran/file_templates/Makefile.am
@@ -0,0 +1,2 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = f f77 f90 f95 for fpp ftn
diff --git a/languages/fortran/file_templates/f b/languages/fortran/file_templates/f
new file mode 100644
index 00000000..909182fc
--- /dev/null
+++ b/languages/fortran/file_templates/f
@@ -0,0 +1,11 @@
+c
+c Preprocessed Fortran Implementation: $MODULE$
+c
+c Description:
+c
+c
+c Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+c
+c Copyright: See COPYING file that comes with this distribution
+c
+
diff --git a/languages/fortran/file_templates/f77 b/languages/fortran/file_templates/f77
new file mode 100644
index 00000000..a3628bc1
--- /dev/null
+++ b/languages/fortran/file_templates/f77
@@ -0,0 +1,11 @@
+c
+c Fortran 77 Implementation: $MODULE$
+c
+c Description:
+c
+c
+c Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+c
+c Copyright: See COPYING file that comes with this distribution
+c
+
diff --git a/languages/fortran/file_templates/f90 b/languages/fortran/file_templates/f90
new file mode 100644
index 00000000..b3800d65
--- /dev/null
+++ b/languages/fortran/file_templates/f90
@@ -0,0 +1,11 @@
+c
+c Fortran 90 Implementation: $MODULE$
+c
+c Description:
+c
+c
+c Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+c
+c Copyright: See COPYING file that comes with this distribution
+c
+
diff --git a/languages/fortran/file_templates/f95 b/languages/fortran/file_templates/f95
new file mode 100644
index 00000000..a4f452cf
--- /dev/null
+++ b/languages/fortran/file_templates/f95
@@ -0,0 +1,11 @@
+c
+c Fortran 95 Implementation: $MODULE$
+c
+c Description:
+c
+c
+c Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+c
+c Copyright: See COPYING file that comes with this distribution
+c
+
diff --git a/languages/fortran/file_templates/for b/languages/fortran/file_templates/for
new file mode 100644
index 00000000..909182fc
--- /dev/null
+++ b/languages/fortran/file_templates/for
@@ -0,0 +1,11 @@
+c
+c Preprocessed Fortran Implementation: $MODULE$
+c
+c Description:
+c
+c
+c Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+c
+c Copyright: See COPYING file that comes with this distribution
+c
+
diff --git a/languages/fortran/file_templates/fpp b/languages/fortran/file_templates/fpp
new file mode 100644
index 00000000..d8a7ad6c
--- /dev/null
+++ b/languages/fortran/file_templates/fpp
@@ -0,0 +1,11 @@
+c
+c Fortran Implementation: $MODULE$
+c
+c Description:
+c
+c
+c Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+c
+c Copyright: See COPYING file that comes with this distribution
+c
+
diff --git a/languages/fortran/file_templates/ftn b/languages/fortran/file_templates/ftn
new file mode 100644
index 00000000..a3628bc1
--- /dev/null
+++ b/languages/fortran/file_templates/ftn
@@ -0,0 +1,11 @@
+c
+c Fortran 77 Implementation: $MODULE$
+c
+c Description:
+c
+c
+c Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+c
+c Copyright: See COPYING file that comes with this distribution
+c
+
diff --git a/languages/fortran/fixedformparser.cpp b/languages/fortran/fixedformparser.cpp
new file mode 100644
index 00000000..7084fbba
--- /dev/null
+++ b/languages/fortran/fixedformparser.cpp
@@ -0,0 +1,94 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "fixedformparser.h"
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <kdebug.h>
+#include <codemodel.h>
+
+
+FixedFormParser::FixedFormParser(CodeModel* model)
+{
+ m_model = model;
+
+ functionre.setPattern("(integer|real|logical|complex|character|"
+ "double(precision)?)function([^(]+).*");
+ subroutinere.setPattern("subroutine([^(]+).*");
+
+ functionre.setCaseSensitive( false );
+ subroutinere.setCaseSensitive( false );
+}
+
+
+void FixedFormParser::process(const QCString &line, const QString &fileName, int lineNum)
+{
+ QCString simplified;
+ int l = line.length();
+ for (int i=0; i < l; ++i)
+ if (line[i] != ' ')
+ simplified += line[i];
+
+ if ( simplified.isEmpty() ) return;
+
+ QString name;
+ if (functionre.search(simplified) != -1)
+ name = functionre.cap(3);
+ else if (subroutinere.search(simplified) != -1)
+ name = subroutinere.cap(1);
+ else
+ return;
+
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName(fileName);
+ method->setStartPosition(lineNum, 0);
+
+ if( !m_file->hasFunction(method->name()) )
+ m_file->addFunction(method);
+}
+
+
+void FixedFormParser::parse(const QString &fileName)
+{
+ QFile f(QFile::encodeName(fileName));
+ if (!f.open(IO_ReadOnly))
+ return;
+ QTextStream stream(&f);
+
+ m_file = m_model->create<FileModel>();
+ m_file->setName( fileName );
+
+ QCString line;
+ int lineNum=0, startLineNum=0;
+ while (!stream.atEnd()) {
+ ++lineNum;
+ QCString str = stream.readLine().local8Bit();
+ if (!str.isEmpty() && QCString("*Cc#!").find(str[0]) != -1)
+ continue;
+ // Continuation line
+ if (str.length() > 6 && str.left(5) == " " && str[5] != ' ') {
+ line += str.right(str.length()-6);
+ continue;
+ }
+ // An initial or invalid line. We don't care
+ // about validity
+ process(line, fileName, startLineNum);
+ line = str.right(str.length()-6);
+ startLineNum = lineNum-1;
+ }
+ process(line, fileName, startLineNum);
+
+ f.close();
+
+ m_model->addFile( m_file );
+}
diff --git a/languages/fortran/fixedformparser.h b/languages/fortran/fixedformparser.h
new file mode 100644
index 00000000..a7016510
--- /dev/null
+++ b/languages/fortran/fixedformparser.h
@@ -0,0 +1,35 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _FIXEDFORMPARSER_H_
+#define _FIXEDFORMPARSER_H_
+
+#include <qstring.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+#include <codemodel.h>
+
+
+class FixedFormParser
+{
+public:
+ FixedFormParser(CodeModel* model);
+
+ void parse(const QString &fileName);
+
+private:
+ void process(const QCString &line, const QString &fileName, int lineNum);
+ CodeModel* m_model;
+ FileDom m_file;
+ QRegExp functionre, subroutinere;
+};
+
+#endif
diff --git a/languages/fortran/fortransupportpart.cpp b/languages/fortran/fortransupportpart.cpp
new file mode 100644
index 00000000..e0c0bde9
--- /dev/null
+++ b/languages/fortran/fortransupportpart.cpp
@@ -0,0 +1,287 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ * The tooltips for ftnchek contained in this source file are taken *
+ * from the ftnchek man page. ftnchek is written by Robert Moniot and *
+ * others. *
+ * *
+ ***************************************************************************/
+
+#include "fortransupportpart.h"
+#include "ftnchekconfigwidget.h"
+#include "fixedformparser.h"
+
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qpopupmenu.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <qvbox.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdialogbase.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kregexp.h>
+#include <kdevgenericfactory.h>
+#include <kaction.h>
+#include <kiconloader.h>
+
+#include <kdevcore.h>
+#include <kdevproject.h>
+#include <kdevmakefrontend.h>
+#include <kdevpartcontroller.h>
+#include <domutil.h>
+#include <codemodel.h>
+#include <kdevplugininfo.h>
+
+
+typedef KDevGenericFactory<FortranSupportPart> FortranSupportFactory;
+static const KDevPluginInfo data("kdevfortransupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevfortransupport, FortranSupportFactory( data ) )
+
+FortranSupportPart::FortranSupportPart(QObject *parent, const char *name, const QStringList &)
+ : KDevLanguageSupport(&data, parent, name ? name : "FortranSupportPart")
+{
+ setInstance(FortranSupportFactory::instance());
+
+ setXMLFile("kdevfortransupport.rc");
+
+ connect( core(), SIGNAL(projectConfigWidget(KDialogBase*)),
+ this, SLOT(projectConfigWidget(KDialogBase*)) );
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+
+ KAction *action;
+
+ action = new KAction( i18n("&Ftnchek"), 0,
+ this, SLOT(slotFtnchek()),
+ actionCollection(), "project_ftnchek" );
+ action->setToolTip(i18n("Run ftnchek"));
+ action->setWhatsThis(i18n("<b>Run ftnchek</b><p>Runs <b>ftnchek</b> to check fortran programs for semantic errors. Configure ftnchek options in project settings dialog, <b>Ftnchek</b> tab."));
+
+ parser = 0;
+}
+
+
+FortranSupportPart::~FortranSupportPart()
+{}
+
+
+void FortranSupportPart::slotFtnchek()
+{
+ // Do something smarter here...
+ if (makeFrontend()->isRunning()) {
+ KMessageBox::sorry(0, i18n("There is currently a job running."));
+ return;
+ }
+
+ if (partController()->saveAllFiles()==false)
+ return; //user cancelled
+
+ QDomDocument &dom = *projectDom();
+
+ QString cmdline = "cd ";
+ cmdline += KProcess::quote(project()->projectDirectory());
+ cmdline += "&& ftnchek -nonovice ";
+
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/division"))
+ cmdline += "-division ";
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/extern"))
+ cmdline += "-extern ";
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/declare"))
+ cmdline += "-declare ";
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/pure"))
+ cmdline += "-pure ";
+
+ cmdline += "-arguments=";
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/argumentsall"))
+ cmdline += "all ";
+ else
+ cmdline += DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/argumentsonly") + " ";
+
+ cmdline += "-common=";
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/commonall"))
+ cmdline += "all ";
+ else
+ cmdline += DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/commononly") + " ";
+
+ cmdline += "-truncation=";
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/truncationall"))
+ cmdline += "all ";
+ else
+ cmdline += DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/truncationonly") + " ";
+
+ cmdline += "-usage=";
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/usageall"))
+ cmdline += "all ";
+ else
+ cmdline += DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/usageonly") + " ";
+
+ cmdline += "-f77=";
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/f77all"))
+ cmdline += "all ";
+ else
+ cmdline += DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/f77only") + " ";
+
+ cmdline += "-portability=";
+ if (DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/portabilityall"))
+ cmdline += "all ";
+ else
+ cmdline += DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/portabilityonly") + " ";
+
+ QStringList list = project()->allFiles();
+ QStringList::ConstIterator it;
+ for (it = list.begin(); it != list.end(); ++it) {
+ QFileInfo fi(*it);
+ QString extension = fi.extension();
+ if (extension == "f77" || extension == "f" || extension == "for"
+ || extension == "ftn") {
+ cmdline += *it + " ";
+ }
+ }
+
+ makeFrontend()->queueCommand(QString::null, cmdline);
+}
+
+
+void FortranSupportPart::projectConfigWidget(KDialogBase *dlg)
+{
+ QVBox *vbox = dlg->addVBoxPage(i18n("Ftnchek"), i18n("Ftnchek"), BarIcon("kdevelop", KIcon::SizeMedium));
+ FtnchekConfigWidget *w = new FtnchekConfigWidget(*projectDom(), vbox, "ftnchek config widget");
+ connect( dlg, SIGNAL(okClicked()), w, SLOT(accept()) );
+}
+
+
+void FortranSupportPart::projectOpened()
+{
+ kdDebug(9019) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ // We want to parse only after all components have been
+ // properly initialized
+ parser = new FixedFormParser(codeModel());
+
+ QTimer::singleShot(0, this, SLOT(initialParse()));
+}
+
+
+void FortranSupportPart::projectClosed()
+{
+ delete parser;
+ parser = 0;
+}
+
+
+void FortranSupportPart::maybeParse(const QString fileName)
+{
+ QFileInfo fi(fileName);
+ QString extension = fi.extension();
+ if (extension == "f77" || extension == "f" || extension == "for" || extension == "ftn") {
+
+ if( codeModel()->hasFile(fileName) ){
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+
+ parser->parse(fileName);
+ }
+}
+
+
+void FortranSupportPart::initialParse()
+{
+ kdDebug(9019) << "initialParse()" << endl;
+
+ if (project()) {
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it) {
+ QFileInfo fileInfo( project()->projectDirectory(), *it );
+ kdDebug(9019) << "maybe parse " << fileInfo.absFilePath() << endl;
+ maybeParse( fileInfo.absFilePath() );
+ }
+
+ emit updatedSourceInfo();
+ kapp->restoreOverrideCursor();
+ } else {
+ kdDebug(9019) << "No project" << endl;
+ }
+}
+
+
+void FortranSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug(9019) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QFileInfo fileInfo( project()->projectDirectory(), *it );
+ QString path = fileInfo.absFilePath();
+ maybeParse( path );
+ emit addedSourceInfo( path );
+ }
+
+ //emit updatedSourceInfo();
+}
+
+
+void FortranSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug(9019) << "removedFilesFromProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QFileInfo fileInfo( project()->projectDirectory(), *it );
+ QString path = fileInfo.absFilePath();
+
+ if( codeModel()->hasFile(path) ){
+ emit aboutToRemoveSourceInfo( path );
+ codeModel()->removeFile( codeModel()->fileByName(path) );
+ }
+ }
+
+ //emit updatedSourceInfo();
+}
+
+
+void FortranSupportPart::savedFile(const KURL &fileName)
+{
+ kdDebug(9019) << "savedFile()" << endl;
+
+ if (project()->allFiles().contains(fileName.path().mid ( project()->projectDirectory().length() + 1 ))) {
+ maybeParse(fileName.path());
+ emit addedSourceInfo( fileName.path() );
+ }
+}
+
+
+KDevLanguageSupport::Features FortranSupportPart::features()
+{
+ return Features(Functions);
+}
+
+KDevMakeFrontend * FortranSupportPart::makeFrontend( )
+{
+ return extension<KDevMakeFrontend>("KDevelop/MakeFrontend");
+}
+
+#include "fortransupportpart.moc"
diff --git a/languages/fortran/fortransupportpart.h b/languages/fortran/fortransupportpart.h
new file mode 100644
index 00000000..52dcba5a
--- /dev/null
+++ b/languages/fortran/fortransupportpart.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _FORTRANSUPPORTPART_H_
+#define _FORTRANSUPPORTPART_H_
+
+class FixedFormParser;
+class KDialogBase;
+class QStringList;
+class KDevMakeFrontend;
+
+#include "kdevlanguagesupport.h"
+
+
+class FortranSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+ FortranSupportPart( QObject *parent, const char *name, const QStringList & );
+ ~FortranSupportPart();
+
+protected:
+ virtual KDevLanguageSupport::Features features();
+
+private slots:
+ void slotFtnchek();
+ void projectConfigWidget(KDialogBase *dlg);
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+
+ // Internal
+ void initialParse();
+
+private:
+ void maybeParse(const QString fileName);
+ KDevMakeFrontend *makeFrontend();
+
+ FixedFormParser *parser;
+};
+
+#endif
diff --git a/languages/fortran/ftnchekconfigwidget.cpp b/languages/fortran/ftnchekconfigwidget.cpp
new file mode 100644
index 00000000..fd4f7a87
--- /dev/null
+++ b/languages/fortran/ftnchekconfigwidget.cpp
@@ -0,0 +1,290 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "ftnchekconfigwidget.h"
+
+#include <qcheckbox.h>
+#include <qbuttongroup.h>
+#include <qheader.h>
+#include <qlistview.h>
+#include <qradiobutton.h>
+#include <qtooltip.h>
+#include <klocale.h>
+
+#include "domutil.h"
+
+
+class FtnchekItem : public QCheckListItem
+{
+public:
+ FtnchekItem(QListView *parent, const QString &flagstr,
+ const QString &description)
+ : QCheckListItem(parent, flagstr, QCheckListItem::CheckBox),
+ flag(flagstr), desc(description)
+ {
+ setText(1, desc);
+ }
+
+ static void readFlagsToListView(QListView *listview, QStringList *list);
+ static void writeFlagsFromListView(QListView *listview, QStringList *list);
+
+private:
+ QString flag;
+ QString desc;
+ friend class FtnchekToolTip;
+};
+
+
+void FtnchekItem::readFlagsToListView(QListView *listview, QStringList *list)
+{
+ QListViewItem *item = listview->firstChild();
+ for (; item; item = item->nextSibling()) {
+ FtnchekItem *flitem = static_cast<FtnchekItem*>(item);
+ QStringList::Iterator sli = list->find(flitem->flag);
+ if (sli != list->end()) {
+ flitem->setOn(true);
+ list->remove(sli);
+ }
+ }
+}
+
+
+void FtnchekItem::writeFlagsFromListView(QListView *listview, QStringList *list)
+{
+ (*list).clear();
+
+ QListViewItem *item = listview->firstChild();
+ for (; item; item = item->nextSibling()) {
+ FtnchekItem *flitem = static_cast<FtnchekItem*>(item);
+ if (flitem->isOn())
+ (*list) << flitem->flag;
+ }
+}
+
+
+class FtnchekToolTip : public QToolTip
+{
+public:
+ FtnchekToolTip(QWidget *parent)
+ : QToolTip(parent)
+ {}
+protected:
+ void maybeTip(const QPoint &pos)
+ {
+ QListView *listview = static_cast<QListView*>(parentWidget());
+ QListViewItem *item = listview->itemAt(pos);
+ FtnchekItem *flitem = static_cast<FtnchekItem*>(item);
+
+ if (item)
+ tip(listview->itemRect(item), flitem->desc);
+ }
+};
+
+
+const char *arguments_flags[] = {
+ "arrayness", I18N_NOOP("Warn about inconsistent use of arguments that use arrays"),
+ "type", I18N_NOOP("Warn about dummy arguments of a data type different from "
+ "the actual arguments"),
+ "function-type", I18N_NOOP("Warn if the invocation assumes a different data type for the return type, "
+ "different from the actual return type"),
+ "number", I18N_NOOP("Warn about invoking a subprogram with an incorrect number of arguments"),
+ 0, 0
+};
+
+
+const char *common_flags[] = {
+ "dimension", I18N_NOOP("Corresponding arrays in each declaration of a block must agree in size "
+ "and number of dimensions"),
+ "exact", I18N_NOOP("The comparison of two blocks is done variable-by-variable"),
+ "length", I18N_NOOP("Warn if different declarations of the same block are not equal in total length"),
+ "type", I18N_NOOP("In each declaration of a block, corresponding memory locations "
+ "must agree in data type"),
+ 0, 0
+};
+
+
+const char *truncation_flags[] = {
+ "int-div-exponent", I18N_NOOP("Use of the result of integer division as an exponent"),
+ "int-div-real", I18N_NOOP("Conversion of an expression involving an integer division to real"),
+ "int-div-zero", I18N_NOOP("Division in an integer constant expression that yields a result of zero"),
+ 0, 0
+};
+
+
+const char *usage_flags[] = {
+ "arg-alias", I18N_NOOP("A scalar dummy argument is actually the same as another "
+ "and is (or may be) modified"),
+ "arg-array-alias", I18N_NOOP("A dummy argument which is an array or array element "
+ "is the same array as another and is modified"),
+ "arg-common-alias", I18N_NOOP("A scalar dummy argument is the same as a common variable in "
+ "the subprogram, and either is modified"),
+ 0, 0
+};
+
+
+const char *f77_flags[] = {
+ "accept-type", I18N_NOOP("ACCEPT and TYPE I/O statements"),
+ "array-bounds", I18N_NOOP("Expressions defining array bounds that contain array "
+ "elements or function references"),
+ "assignment-stmt", I18N_NOOP("Assignment statements involving arrays"),
+ 0, 0
+};
+
+
+const char *portability_flags[] = {
+ "backslash", I18N_NOOP("Backslash characters in strings"),
+ "common-alignment", I18N_NOOP("COMMON block variables not in descending order of storage sizes"),
+ "hollerith", I18N_NOOP("Hollerith constants"),
+ 0, 0
+};
+
+
+FtnchekConfigWidget::FtnchekConfigWidget(QDomDocument &projectDom, QWidget *parent, const char *name)
+ : FtnchekConfigWidgetBase(parent, name), dom(projectDom)
+{
+ arguments_group = new QButtonGroup;
+ arguments_group->insert(argumentsall_button);
+ arguments_group->insert(argumentsonly_button);
+ common_group = new QButtonGroup;
+ common_group->insert(commonall_button);
+ common_group->insert(commononly_button);
+ truncation_group = new QButtonGroup;
+ truncation_group->insert(truncationall_button);
+ truncation_group->insert(truncationonly_button);
+ usage_group = new QButtonGroup;
+ usage_group->insert(usageall_button);
+ usage_group->insert(usageonly_button);
+ f77_group = new QButtonGroup;
+ f77_group->insert(f77all_button);
+ f77_group->insert(f77only_button);
+ portability_group = new QButtonGroup;
+ portability_group->insert(portabilityall_button);
+ portability_group->insert(portabilityonly_button);
+
+ arguments_listview->header()->hide();
+ new FtnchekToolTip(arguments_listview);
+
+ common_listview->header()->hide();
+ new FtnchekToolTip(common_listview);
+
+ truncation_listview->header()->hide();
+ new FtnchekToolTip(truncation_listview);
+
+ usage_listview->header()->hide();
+ new FtnchekToolTip(usage_listview);
+
+ f77_listview->header()->hide();
+ new FtnchekToolTip(f77_listview);
+
+ portability_listview->header()->hide();
+ new FtnchekToolTip(portability_listview);
+
+ for (const char **p = arguments_flags; *p; p += 2)
+ new FtnchekItem(arguments_listview, QString::fromUtf8(*p), i18n(*(p+1)));
+
+ for (const char **p = common_flags; *p; p += 2)
+ new FtnchekItem(common_listview, QString::fromUtf8(*p), i18n(*(p+1)));
+
+ for (const char **p = truncation_flags; *p; p += 2)
+ new FtnchekItem(truncation_listview, QString::fromUtf8(*p), i18n(*(p+1)));
+
+ for (const char **p = usage_flags; *p; p += 2)
+ new FtnchekItem(usage_listview, QString::fromUtf8(*p), i18n(*(p+1)));
+
+ for (const char **p = f77_flags; *p; p += 2)
+ new FtnchekItem(f77_listview, QString::fromUtf8(*p), i18n(*(p+1)));
+
+ for (const char **p = portability_flags; *p; p += 2)
+ new FtnchekItem(portability_listview, QString::fromUtf8(*p), i18n(*(p+1)));
+
+ readConfig();
+}
+
+
+FtnchekConfigWidget::~FtnchekConfigWidget()
+{
+ delete arguments_group;
+ delete common_group;
+ delete truncation_group;
+ delete usage_group;
+ delete f77_group;
+ delete portability_group;
+}
+
+
+void FtnchekConfigWidget::accept()
+{
+ storeConfig();
+}
+
+
+void FtnchekConfigWidget::readConfig()
+{
+ division_box->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/division"));
+ extern_box->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/extern"));
+ declare_box->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/declare"));
+ pure_box->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/pure"));
+
+ argumentsall_button->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/argumentsall"));
+ commonall_button->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/commonall"));
+ truncationall_button->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/truncationall"));
+ usageall_button->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/usageall"));
+ f77all_button->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/f77all"));
+ portabilityall_button->setChecked(DomUtil::readBoolEntry(dom, "/kdevfortransupport/ftnchek/portabilityall"));
+
+ QStringList list;
+
+ list = QStringList::split(',', DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/argumentsonly"));
+ FtnchekItem::readFlagsToListView(arguments_listview, &list);
+ list = QStringList::split(',', DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/commononly"));
+ FtnchekItem::readFlagsToListView(common_listview, &list);
+ list = QStringList::split(',', DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/truncationonly"));
+ FtnchekItem::readFlagsToListView(truncation_listview, &list);
+ list = QStringList::split(',', DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/usageonly"));
+ FtnchekItem::readFlagsToListView(usage_listview, &list);
+ list = QStringList::split(',', DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/f77only"));
+ FtnchekItem::readFlagsToListView(f77_listview, &list);
+ list = QStringList::split(',', DomUtil::readEntry(dom, "/kdevfortransupport/ftnchek/portabilityonly"));
+ FtnchekItem::readFlagsToListView(portability_listview, &list);
+}
+
+
+void FtnchekConfigWidget::storeConfig()
+{
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/division", division_box->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/extern", extern_box->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/declare", declare_box->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/pure", pure_box->isChecked());
+
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/argumentsall", argumentsall_button->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/commonall", commonall_button->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/truncationall", truncationall_button->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/usageall", usageall_button->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/f77all", f77all_button->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevfortransupport/ftnchek/portabilityall", portabilityall_button->isChecked());
+
+ QStringList list;
+
+ FtnchekItem::writeFlagsFromListView(arguments_listview, &list);
+ DomUtil::writeEntry(dom, "/kdevfortransupport/ftnchek/argumentsonly", list.join(","));
+ FtnchekItem::writeFlagsFromListView(common_listview, &list);
+ DomUtil::writeEntry(dom, "/kdevfortransupport/ftnchek/commononly", list.join(","));
+ FtnchekItem::writeFlagsFromListView(truncation_listview, &list);
+ DomUtil::writeEntry(dom, "/kdevfortransupport/ftnchek/truncationonly", list.join(","));
+ FtnchekItem::writeFlagsFromListView(usage_listview, &list);
+ DomUtil::writeEntry(dom, "/kdevfortransupport/ftnchek/usageonly", list.join(","));
+ FtnchekItem::writeFlagsFromListView(f77_listview, &list);
+ DomUtil::writeEntry(dom, "/kdevfortransupport/ftnchek/f77only", list.join(","));
+ FtnchekItem::writeFlagsFromListView(portability_listview, &list);
+ DomUtil::writeEntry(dom, "/kdevfortransupport/ftnchek/portabilityonly", list.join(","));
+}
+
+#include "ftnchekconfigwidget.moc"
diff --git a/languages/fortran/ftnchekconfigwidget.h b/languages/fortran/ftnchekconfigwidget.h
new file mode 100644
index 00000000..053b2598
--- /dev/null
+++ b/languages/fortran/ftnchekconfigwidget.h
@@ -0,0 +1,41 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _FTNCHEKCONFIGWIDGET_H_
+#define _FTNCHEKCONFIGWIDGET_H_
+
+#include <qdom.h>
+#include "ftnchekconfigwidgetbase.h"
+
+class QButtonGroup;
+
+class FtnchekConfigWidget : public FtnchekConfigWidgetBase
+{
+ Q_OBJECT
+
+public:
+ FtnchekConfigWidget(QDomDocument &projectDom, QWidget *parent, const char *name);
+ ~FtnchekConfigWidget();
+
+public slots:
+ void accept();
+
+private:
+ void readConfig();
+ void storeConfig();
+
+ QButtonGroup *arguments_group, *common_group;
+ QButtonGroup *truncation_group, *usage_group;
+ QButtonGroup *f77_group, *portability_group;
+ QDomDocument dom;
+};
+
+#endif
diff --git a/languages/fortran/ftnchekconfigwidgetbase.ui b/languages/fortran/ftnchekconfigwidgetbase.ui
new file mode 100644
index 00000000..b6bb2184
--- /dev/null
+++ b/languages/fortran/ftnchekconfigwidgetbase.ui
@@ -0,0 +1,584 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>FtnchekConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ftcheck_config_widget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>798</width>
+ <height>507</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Ftnchek Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>TabWidget4</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;1</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="2">
+ <property name="name">
+ <cstring>extern_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;External subprograms without definition</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="2">
+ <property name="name">
+ <cstring>division_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Divisions</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>declare_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Identifiers without explicit type</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>pure_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Assume functions have no side effects</string>
+ </property>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>Spacer2_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Ar&amp;guments:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>argumentsall_button</cstring>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="4" column="0">
+ <property name="name">
+ <cstring>argumentsall_button</cstring>
+ </property>
+ <property name="text">
+ <string>All</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="5" column="0">
+ <property name="name">
+ <cstring>argumentsonly_button</cstring>
+ </property>
+ <property name="text">
+ <string>Only the following:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="6" column="1">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QRadioButton" row="4" column="2">
+ <property name="name">
+ <cstring>commonall_button</cstring>
+ </property>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="5" column="2">
+ <property name="name">
+ <cstring>commononly_button</cstring>
+ </property>
+ <property name="text">
+ <string>Only the following:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QListView" row="6" column="0">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>arguments_listview</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>NoColumn</enum>
+ </property>
+ </widget>
+ <widget class="QListView" row="6" column="2">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>common_listview</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>NoColumn</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="2">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Common &amp;blocks:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>commonall_button</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;2</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>truncationonly_button</cstring>
+ </property>
+ <property name="text">
+ <string>Only the following:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Truncation and roundoff errors:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>truncationall_button</cstring>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>truncationall_button</cstring>
+ </property>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use of variables:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>usageall_button</cstring>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="2">
+ <property name="name">
+ <cstring>usageall_button</cstring>
+ </property>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="3" column="0">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>truncation_listview</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>NoColumn</enum>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="2">
+ <property name="name">
+ <cstring>usageonly_button</cstring>
+ </property>
+ <property name="text">
+ <string>Only the following:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QListView" row="3" column="2">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>usage_listview</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>NoColumn</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;3</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>f77all_button</cstring>
+ </property>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>f77only_button</cstring>
+ </property>
+ <property name="text">
+ <string>Only the following:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QListView" row="3" column="0">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>f77_listview</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>NoColumn</enum>
+ </property>
+ </widget>
+ <widget class="QListView" row="3" column="2">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>portability_listview</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>NoColumn</enum>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>Fortran 77 language &amp;extensions:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>f77all_button</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>TextLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>Other &amp;portability warnings:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>portabilityall_button</cstring>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="2">
+ <property name="name">
+ <cstring>portabilityall_button</cstring>
+ </property>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="2">
+ <property name="name">
+ <cstring>portabilityonly_button</cstring>
+ </property>
+ <property name="text">
+ <string>Only the following:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>declare_box</tabstop>
+ <tabstop>pure_box</tabstop>
+ <tabstop>extern_box</tabstop>
+ <tabstop>division_box</tabstop>
+ <tabstop>argumentsall_button</tabstop>
+ <tabstop>argumentsonly_button</tabstop>
+ <tabstop>arguments_listview</tabstop>
+ <tabstop>commonall_button</tabstop>
+ <tabstop>commononly_button</tabstop>
+ <tabstop>common_listview</tabstop>
+ <tabstop>TabWidget4</tabstop>
+ <tabstop>truncationall_button</tabstop>
+ <tabstop>truncationonly_button</tabstop>
+ <tabstop>truncation_listview</tabstop>
+ <tabstop>usageall_button</tabstop>
+ <tabstop>usageonly_button</tabstop>
+ <tabstop>usage_listview</tabstop>
+ <tabstop>f77all_button</tabstop>
+ <tabstop>f77only_button</tabstop>
+ <tabstop>f77_listview</tabstop>
+ <tabstop>portabilityall_button</tabstop>
+ <tabstop>portabilityonly_button</tabstop>
+ <tabstop>portability_listview</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/fortran/kdevfortransupport.desktop b/languages/fortran/kdevfortransupport.desktop
new file mode 100644
index 00000000..ad4f8185
--- /dev/null
+++ b/languages/fortran/kdevfortransupport.desktop
@@ -0,0 +1,80 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Fortran 77 Support
+Comment[ca]=Suport per a Fortran 77
+Comment[da]=Fortran 77 understøttelse
+Comment[de]=Unterstützung für Fortran 77 für KDevelop
+Comment[el]=ΥποστήÏιξη Fortran 77
+Comment[es]=Soporte para Fortran 77
+Comment[et]=Fortran 77 toetus
+Comment[eu]=Fortran 77 euskarria
+Comment[fa]=پشتیبانی Ùرترن Û·Û·
+Comment[fr]=Prise en charge du langage Fortran77
+Comment[ga]=Tacaíocht Fortran 77
+Comment[gl]=Soporte para Fortran 77
+Comment[hi]=फ़ोरटà¥à¤°à¥‰à¤¨ 77 समरà¥à¤¥à¤¨
+Comment[hu]=Fortran 77-támogatás
+Comment[is]=Fortran 77 stuðningur
+Comment[it]=Supporto per Fortran 77
+Comment[ja]=Fortran 77 サãƒãƒ¼ãƒˆ
+Comment[nds]=Ünnerstütten för Fortran 77
+Comment[ne]=फोरà¥à¤Ÿà¥à¤°à¤¾à¤¨ ७७ समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor Fortran 77
+Comment[pl]=Obsługa Fortrana 77
+Comment[pt]=Suporte a Fortran 77
+Comment[pt_BR]=Suporte ao Fortran 77
+Comment[ru]=Поддержка Ñзыка Fortran 77
+Comment[sk]=Fortran 77 podpora
+Comment[sl]=Podpora za Fortran 77
+Comment[sr]=Подршка за Fortran 77
+Comment[sr@Latn]=Podrška za Fortran 77
+Comment[sv]=Fortran 77-stöd
+Comment[ta]=பொரà¯à®Ÿà¯à®°à®¾à®©à¯ 77 ஆதரவà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони 77 Support
+Comment[tr]=Fortran 77 DesteÄŸi
+Comment[zh_CN]=Fortran 77 支æŒ
+Comment[zh_TW]=Fortran 77 支æ´
+Name=KDevFortranSupport
+Name[da]=KDevelop Fortran77 understøttelse
+Name[nds]=Fortran-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaFortrana
+Name[sk]=KDev Fortran podpora
+Name[sv]=KDevelop Fortran-stöd
+Name[zh_TW]=KDevelop Fortran 支æ´
+GenericName=Fortran 77 Support
+GenericName[ca]=Suport per a Fortran 77
+GenericName[da]=Fortran 77 understøttelse
+GenericName[de]=Unterstützung für Fortran 77
+GenericName[el]=ΥποστήÏιξη Fortran 77
+GenericName[es]=Soporte para Fortran 77
+GenericName[et]=Fortran 77 toetus
+GenericName[eu]=Fortran 77 euskarria
+GenericName[fa]=پشتیبانی Ùرترن Û·Û·
+GenericName[fr]=Prise en charge du langage Fortran 77
+GenericName[ga]=Tacaíocht Fortran 77
+GenericName[gl]=Soporte para Fortran 77
+GenericName[hi]=फ़ोरटà¥à¤°à¥‰à¤¨ 77 समरà¥à¤¥à¤¨
+GenericName[hu]=Fortran 77-támogatás
+GenericName[it]=Supporto Fortran 77
+GenericName[ja]=Fortran 77 サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för Fortran-77
+GenericName[ne]=फोरà¥à¤Ÿà¥à¤°à¤¾à¤¨ ७७ समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor Fortran 77
+GenericName[pl]=Obsługa Fortrana 77
+GenericName[pt]=Suporte a Fortran 77
+GenericName[pt_BR]=Suporte ao Fortran 77
+GenericName[ru]=Поддержка Ñзыка Fortran 77
+GenericName[sk]=Fortran 77 podpora
+GenericName[sl]=Podpora za Fortran 77
+GenericName[sr]=Подршка за Fortran 77
+GenericName[sr@Latn]=Podrška za Fortran 77
+GenericName[sv]=Fortran 77-stöd
+GenericName[tg]=ÐÑ€Ó£ намудани забони 77 Support
+GenericName[tr]=Fortran 77 DesteÄŸi
+GenericName[zh_CN]=Fortran 77 支æŒ
+GenericName[zh_TW]=Fortran 77 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevfortransupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Fortran77
diff --git a/languages/fortran/kdevfortransupport.rc b/languages/fortran/kdevfortransupport.rc
new file mode 100644
index 00000000..40e3f80a
--- /dev/null
+++ b/languages/fortran/kdevfortransupport.rc
@@ -0,0 +1,9 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevFortranSupport" version="1">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="project_ftnchek" />
+ </Menu>
+</MenuBar>
+</kpartgui>
+
diff --git a/languages/java/JavaAST.hpp b/languages/java/JavaAST.hpp
new file mode 100644
index 00000000..7108fca1
--- /dev/null
+++ b/languages/java/JavaAST.hpp
@@ -0,0 +1,77 @@
+#ifndef JAVAAST_HPP
+#define JAVAAST_HPP
+
+#include <antlr/CommonAST.hpp>
+#include <antlr/ASTFactory.hpp>
+
+class JavaAST;
+typedef ANTLR_USE_NAMESPACE(antlr)ASTRefCount<JavaAST> RefJavaAST;
+
+class JavaAST : public ANTLR_USE_NAMESPACE(antlr)CommonAST
+{
+public:
+ JavaAST()
+ : m_line(0), m_column(0) {}
+
+ virtual ~JavaAST() {}
+
+ int getLine() const { return m_line; }
+ void setLine( int line ) { m_line = line; }
+
+ int getColumn() const { return m_column; }
+ void setColumn( int column ) { m_column = column; }
+
+ void initialize( ANTLR_USE_NAMESPACE(antlr)RefToken t )
+ {
+ CommonAST::initialize(t);
+ m_line = t->getLine() - 1;
+ m_column = t->getColumn() - 1;
+ }
+
+ void initialize( ANTLR_USE_NAMESPACE(antlr)RefAST t )
+ {
+ CommonAST::initialize( t );
+
+ m_line = 0;
+ m_column = 0;
+
+ RefJavaAST a( dynamic_cast<JavaAST*>(t.get()) );
+ m_line = a->getLine();
+ m_column = a->getColumn();
+ }
+
+ void initialize(int t, const ANTLR_USE_NAMESPACE(std)string& txt)
+ {
+ CommonAST::initialize( t, txt );
+ m_line = 0;
+ m_column = 0;
+ }
+
+ static ANTLR_USE_NAMESPACE(antlr)RefAST factory()
+ {
+ RefJavaAST n(new JavaAST);
+ return n.get();
+ }
+
+
+private:
+ int m_line;
+ int m_column;
+
+private:
+ JavaAST( const JavaAST& source );
+ void operator = ( const JavaAST& source );
+};
+
+namespace antlr
+{
+
+class JavaASTFactory: public ASTFactory
+{
+public:
+ JavaASTFactory(): ASTFactory( "JavaAST", JavaAST::factory ) {}
+};
+
+} // namespace antlr
+
+#endif
diff --git a/languages/java/JavaLexer.cpp b/languages/java/JavaLexer.cpp
new file mode 100644
index 00000000..623e816f
--- /dev/null
+++ b/languages/java/JavaLexer.cpp
@@ -0,0 +1,2183 @@
+/* $ANTLR 2.7.7 (20061129): "java.g" -> "JavaLexer.cpp"$ */
+#include "JavaLexer.hpp"
+#include <antlr/CharBuffer.hpp>
+#include <antlr/TokenStreamException.hpp>
+#include <antlr/TokenStreamIOException.hpp>
+#include <antlr/TokenStreamRecognitionException.hpp>
+#include <antlr/CharStreamException.hpp>
+#include <antlr/CharStreamIOException.hpp>
+#include <antlr/NoViableAltForCharException.hpp>
+
+#line 1041 "java.g"
+
+#include <string>
+
+#line 16 "JavaLexer.cpp"
+JavaLexer::JavaLexer(ANTLR_USE_NAMESPACE(std)istream& in)
+ : ANTLR_USE_NAMESPACE(antlr)CharScanner(new ANTLR_USE_NAMESPACE(antlr)CharBuffer(in),true)
+{
+ initLiterals();
+}
+
+JavaLexer::JavaLexer(ANTLR_USE_NAMESPACE(antlr)InputBuffer& ib)
+ : ANTLR_USE_NAMESPACE(antlr)CharScanner(ib,true)
+{
+ initLiterals();
+}
+
+JavaLexer::JavaLexer(const ANTLR_USE_NAMESPACE(antlr)LexerSharedInputState& state)
+ : ANTLR_USE_NAMESPACE(antlr)CharScanner(state,true)
+{
+ initLiterals();
+}
+
+void JavaLexer::initLiterals()
+{
+ literals["byte"] = 51;
+ literals["public"] = 62;
+ literals["case"] = 94;
+ literals["short"] = 53;
+ literals["break"] = 89;
+ literals["while"] = 87;
+ literals["new"] = 137;
+ literals["instanceof"] = 122;
+ literals["implements"] = 76;
+ literals["synchronized"] = 68;
+ literals["float"] = 55;
+ literals["package"] = 44;
+ literals["return"] = 91;
+ literals["throw"] = 93;
+ literals["null"] = 136;
+ literals["threadsafe"] = 67;
+ literals["protected"] = 63;
+ literals["class"] = 70;
+ literals["throws"] = 82;
+ literals["do"] = 88;
+ literals["strictfp"] = 41;
+ literals["super"] = 80;
+ literals["transient"] = 65;
+ literals["native"] = 66;
+ literals["interface"] = 72;
+ literals["final"] = 39;
+ literals["if"] = 84;
+ literals["double"] = 57;
+ literals["volatile"] = 69;
+ literals["catch"] = 98;
+ literals["try"] = 96;
+ literals["int"] = 54;
+ literals["for"] = 86;
+ literals["extends"] = 71;
+ literals["boolean"] = 50;
+ literals["char"] = 52;
+ literals["private"] = 61;
+ literals["default"] = 95;
+ literals["false"] = 135;
+ literals["this"] = 79;
+ literals["static"] = 64;
+ literals["abstract"] = 40;
+ literals["continue"] = 90;
+ literals["finally"] = 97;
+ literals["else"] = 85;
+ literals["import"] = 46;
+ literals["void"] = 49;
+ literals["switch"] = 92;
+ literals["true"] = 134;
+ literals["long"] = 56;
+}
+
+ANTLR_USE_NAMESPACE(antlr)RefToken JavaLexer::nextToken()
+{
+ ANTLR_USE_NAMESPACE(antlr)RefToken theRetToken;
+ for (;;) {
+ ANTLR_USE_NAMESPACE(antlr)RefToken theRetToken;
+ int _ttype = ANTLR_USE_NAMESPACE(antlr)Token::INVALID_TYPE;
+ resetText();
+ try { // for lexical and char stream error handling
+ switch ( LA(1)) {
+ case 0x3f /* '?' */ :
+ {
+ mQUESTION(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x28 /* '(' */ :
+ {
+ mLPAREN(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x29 /* ')' */ :
+ {
+ mRPAREN(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x5b /* '[' */ :
+ {
+ mLBRACK(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x5d /* ']' */ :
+ {
+ mRBRACK(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x7b /* '{' */ :
+ {
+ mLCURLY(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x7d /* '}' */ :
+ {
+ mRCURLY(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x3a /* ':' */ :
+ {
+ mCOLON(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x2c /* ',' */ :
+ {
+ mCOMMA(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x7e /* '~' */ :
+ {
+ mBNOT(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x3b /* ';' */ :
+ {
+ mSEMI(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x9 /* '\t' */ :
+ case 0xa /* '\n' */ :
+ case 0xc /* '\14' */ :
+ case 0xd /* '\r' */ :
+ case 0x20 /* ' ' */ :
+ {
+ mWS(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x27 /* '\'' */ :
+ {
+ mCHAR_LITERAL(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x22 /* '\"' */ :
+ {
+ mSTRING_LITERAL(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x24 /* '$' */ :
+ case 0x41 /* 'A' */ :
+ case 0x42 /* 'B' */ :
+ case 0x43 /* 'C' */ :
+ case 0x44 /* 'D' */ :
+ case 0x45 /* 'E' */ :
+ case 0x46 /* 'F' */ :
+ case 0x47 /* 'G' */ :
+ case 0x48 /* 'H' */ :
+ case 0x49 /* 'I' */ :
+ case 0x4a /* 'J' */ :
+ case 0x4b /* 'K' */ :
+ case 0x4c /* 'L' */ :
+ case 0x4d /* 'M' */ :
+ case 0x4e /* 'N' */ :
+ case 0x4f /* 'O' */ :
+ case 0x50 /* 'P' */ :
+ case 0x51 /* 'Q' */ :
+ case 0x52 /* 'R' */ :
+ case 0x53 /* 'S' */ :
+ case 0x54 /* 'T' */ :
+ case 0x55 /* 'U' */ :
+ case 0x56 /* 'V' */ :
+ case 0x57 /* 'W' */ :
+ case 0x58 /* 'X' */ :
+ case 0x59 /* 'Y' */ :
+ case 0x5a /* 'Z' */ :
+ case 0x5f /* '_' */ :
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ case 0x67 /* 'g' */ :
+ case 0x68 /* 'h' */ :
+ case 0x69 /* 'i' */ :
+ case 0x6a /* 'j' */ :
+ case 0x6b /* 'k' */ :
+ case 0x6c /* 'l' */ :
+ case 0x6d /* 'm' */ :
+ case 0x6e /* 'n' */ :
+ case 0x6f /* 'o' */ :
+ case 0x70 /* 'p' */ :
+ case 0x71 /* 'q' */ :
+ case 0x72 /* 'r' */ :
+ case 0x73 /* 's' */ :
+ case 0x74 /* 't' */ :
+ case 0x75 /* 'u' */ :
+ case 0x76 /* 'v' */ :
+ case 0x77 /* 'w' */ :
+ case 0x78 /* 'x' */ :
+ case 0x79 /* 'y' */ :
+ case 0x7a /* 'z' */ :
+ {
+ mIDENT(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x2e /* '.' */ :
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ mNUM_INT(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ default:
+ if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3e /* '>' */ ) && (LA(3) == 0x3e /* '>' */ ) && (LA(4) == 0x3d /* '=' */ )) {
+ mBSR_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3e /* '>' */ ) && (LA(3) == 0x3d /* '=' */ )) {
+ mSR_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3e /* '>' */ ) && (LA(3) == 0x3e /* '>' */ ) && (true)) {
+ mBSR(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3c /* '<' */ ) && (LA(3) == 0x3d /* '=' */ )) {
+ mSL_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3d /* '=' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mEQUAL(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x21 /* '!' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mNOT_EQUAL(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2f /* '/' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mDIV_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2b /* '+' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mPLUS_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2b /* '+' */ ) && (LA(2) == 0x2b /* '+' */ )) {
+ mINC(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2d /* '-' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mMINUS_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2d /* '-' */ ) && (LA(2) == 0x2d /* '-' */ )) {
+ mDEC(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2a /* '*' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mSTAR_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x25 /* '%' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mMOD_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3e /* '>' */ ) && (true)) {
+ mSR(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mGE(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3c /* '<' */ ) && (true)) {
+ mSL(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mLE(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x5e /* '^' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mBXOR_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x7c /* '|' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mBOR_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x7c /* '|' */ ) && (LA(2) == 0x7c /* '|' */ )) {
+ mLOR(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x26 /* '&' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mBAND_ASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x26 /* '&' */ ) && (LA(2) == 0x26 /* '&' */ )) {
+ mLAND(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2f /* '/' */ ) && (LA(2) == 0x2f /* '/' */ )) {
+ mSL_COMMENT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2f /* '/' */ ) && (LA(2) == 0x2a /* '*' */ )) {
+ mML_COMMENT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3d /* '=' */ ) && (true)) {
+ mASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x21 /* '!' */ ) && (true)) {
+ mLNOT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2f /* '/' */ ) && (true)) {
+ mDIV(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2b /* '+' */ ) && (true)) {
+ mPLUS(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2d /* '-' */ ) && (true)) {
+ mMINUS(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2a /* '*' */ ) && (true)) {
+ mSTAR(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x25 /* '%' */ ) && (true)) {
+ mMOD(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (true)) {
+ mGT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (true)) {
+ mLT_(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x5e /* '^' */ ) && (true)) {
+ mBXOR(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x7c /* '|' */ ) && (true)) {
+ mBOR(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x26 /* '&' */ ) && (true)) {
+ mBAND(true);
+ theRetToken=_returnToken;
+ }
+ else {
+ if (LA(1)==EOF_CHAR)
+ {
+ uponEOF();
+ _returnToken = makeToken(ANTLR_USE_NAMESPACE(antlr)Token::EOF_TYPE);
+ }
+ else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+ }
+ if ( !_returnToken )
+ goto tryAgain; // found SKIP token
+
+ _ttype = _returnToken->getType();
+ _returnToken->setType(_ttype);
+ return _returnToken;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& e) {
+ throw ANTLR_USE_NAMESPACE(antlr)TokenStreamRecognitionException(e);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)CharStreamIOException& csie) {
+ throw ANTLR_USE_NAMESPACE(antlr)TokenStreamIOException(csie.io);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)CharStreamException& cse) {
+ throw ANTLR_USE_NAMESPACE(antlr)TokenStreamException(cse.getMessage());
+ }
+tryAgain:;
+ }
+}
+
+void JavaLexer::mQUESTION(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = QUESTION;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('?' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mLPAREN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LPAREN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('(' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mRPAREN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = RPAREN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(')' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mLBRACK(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LBRACK;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('[' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mRBRACK(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = RBRACK;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(']' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mLCURLY(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LCURLY;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('{' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mRCURLY(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = RCURLY;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('}' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mCOLON(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COLON;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(':' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mCOMMA(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COMMA;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(',' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('=' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mEQUAL(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = EQUAL;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("==");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mLNOT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LNOT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('!' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mBNOT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BNOT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('~' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mNOT_EQUAL(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = NOT_EQUAL;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("!=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mDIV(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = DIV;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('/' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mDIV_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = DIV_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("/=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mPLUS(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = PLUS;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('+' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mPLUS_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = PLUS_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("+=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mINC(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = INC;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("++");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mMINUS(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = MINUS;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('-' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mMINUS_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = MINUS_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("-=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mDEC(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = DEC;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("--");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mSTAR(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = STAR;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('*' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mSTAR_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = STAR_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("*=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mMOD(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = MOD;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('%' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mMOD_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = MOD_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("%=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mSR(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SR;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(">>");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mSR_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SR_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(">>=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mBSR(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BSR;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(">>>");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mBSR_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BSR_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(">>>=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mGE(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = GE;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(">=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mGT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = GT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(">");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mSL(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SL;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("<<");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mSL_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SL_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("<<=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mLE(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LE;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("<=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mLT_(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LT_;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('<' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mBXOR(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BXOR;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('^' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mBXOR_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BXOR_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("^=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mBOR(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BOR;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('|' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mBOR_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BOR_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("|=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mLOR(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LOR;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("||");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mBAND(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BAND;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('&' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mBAND_ASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = BAND_ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("&=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mLAND(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LAND;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("&&");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mSEMI(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SEMI;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(';' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mWS(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = WS;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ { // ( ... )+
+ int _cnt245=0;
+ for (;;) {
+ switch ( LA(1)) {
+ case 0x20 /* ' ' */ :
+ {
+ match(' ' /* charlit */ );
+ break;
+ }
+ case 0x9 /* '\t' */ :
+ {
+ match('\t' /* charlit */ );
+ break;
+ }
+ case 0xc /* '\14' */ :
+ {
+ match('\14' /* charlit */ );
+ break;
+ }
+ case 0xa /* '\n' */ :
+ case 0xd /* '\r' */ :
+ {
+ {
+ if ((LA(1) == 0xd /* '\r' */ ) && (LA(2) == 0xa /* '\n' */ ) && (true) && (true)) {
+ match("\r\n");
+ }
+ else if ((LA(1) == 0xd /* '\r' */ ) && (true) && (true) && (true)) {
+ match('\r' /* charlit */ );
+ }
+ else if ((LA(1) == 0xa /* '\n' */ )) {
+ match('\n' /* charlit */ );
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+
+ }
+#line 1137 "java.g"
+ newline();
+#line 1109 "JavaLexer.cpp"
+ break;
+ }
+ default:
+ {
+ if ( _cnt245>=1 ) { goto _loop245; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+ }
+ _cnt245++;
+ }
+ _loop245:;
+ } // ( ... )+
+#line 1139 "java.g"
+ _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP;
+#line 1123 "JavaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mSL_COMMENT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SL_COMMENT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("//");
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_0.member(LA(1)))) {
+ {
+ match(_tokenSet_0);
+ }
+ }
+ else {
+ goto _loop249;
+ }
+
+ }
+ _loop249:;
+ } // ( ... )*
+ {
+ switch ( LA(1)) {
+ case 0xa /* '\n' */ :
+ {
+ match('\n' /* charlit */ );
+ break;
+ }
+ case 0xd /* '\r' */ :
+ {
+ match('\r' /* charlit */ );
+ {
+ if ((LA(1) == 0xa /* '\n' */ )) {
+ match('\n' /* charlit */ );
+ }
+ else {
+ }
+
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+#line 1146 "java.g"
+
+ _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP;
+ newline();
+
+#line 1183 "JavaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mML_COMMENT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = ML_COMMENT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("/*");
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == 0xd /* '\r' */ ) && (LA(2) == 0xa /* '\n' */ ) && ((LA(3) >= 0x3 /* '\3' */ && LA(3) <= 0xff)) && ((LA(4) >= 0x3 /* '\3' */ && LA(4) <= 0xff))) {
+ match('\r' /* charlit */ );
+ match('\n' /* charlit */ );
+#line 1167 "java.g"
+ newline();
+#line 1205 "JavaLexer.cpp"
+ }
+ else if (((LA(1) == 0x2a /* '*' */ ) && ((LA(2) >= 0x3 /* '\3' */ && LA(2) <= 0xff)) && ((LA(3) >= 0x3 /* '\3' */ && LA(3) <= 0xff)))&&( LA(2)!='/' )) {
+ match('*' /* charlit */ );
+ }
+ else if ((LA(1) == 0xd /* '\r' */ ) && ((LA(2) >= 0x3 /* '\3' */ && LA(2) <= 0xff)) && ((LA(3) >= 0x3 /* '\3' */ && LA(3) <= 0xff)) && (true)) {
+ match('\r' /* charlit */ );
+#line 1168 "java.g"
+ newline();
+#line 1214 "JavaLexer.cpp"
+ }
+ else if ((LA(1) == 0xa /* '\n' */ )) {
+ match('\n' /* charlit */ );
+#line 1169 "java.g"
+ newline();
+#line 1220 "JavaLexer.cpp"
+ }
+ else if ((_tokenSet_1.member(LA(1)))) {
+ {
+ match(_tokenSet_1);
+ }
+ }
+ else {
+ goto _loop255;
+ }
+
+ }
+ _loop255:;
+ } // ( ... )*
+ match("*/");
+#line 1173 "java.g"
+ _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP;
+#line 1237 "JavaLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mCHAR_LITERAL(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = CHAR_LITERAL;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('\'' /* charlit */ );
+ {
+ if ((LA(1) == 0x5c /* '\\' */ )) {
+ mESC(false);
+ }
+ else if ((_tokenSet_2.member(LA(1)))) {
+ matchNot('\'' /* charlit */ );
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+
+ }
+ match('\'' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mESC(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = ESC;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('\\' /* charlit */ );
+ {
+ switch ( LA(1)) {
+ case 0x6e /* 'n' */ :
+ {
+ match('n' /* charlit */ );
+ break;
+ }
+ case 0x72 /* 'r' */ :
+ {
+ match('r' /* charlit */ );
+ break;
+ }
+ case 0x74 /* 't' */ :
+ {
+ match('t' /* charlit */ );
+ break;
+ }
+ case 0x62 /* 'b' */ :
+ {
+ match('b' /* charlit */ );
+ break;
+ }
+ case 0x66 /* 'f' */ :
+ {
+ match('f' /* charlit */ );
+ break;
+ }
+ case 0x22 /* '\"' */ :
+ {
+ match('\"' /* charlit */ );
+ break;
+ }
+ case 0x27 /* '\'' */ :
+ {
+ match('\'' /* charlit */ );
+ break;
+ }
+ case 0x5c /* '\\' */ :
+ {
+ match('\\' /* charlit */ );
+ break;
+ }
+ case 0x75 /* 'u' */ :
+ {
+ { // ( ... )+
+ int _cnt265=0;
+ for (;;) {
+ if ((LA(1) == 0x75 /* 'u' */ )) {
+ match('u' /* charlit */ );
+ }
+ else {
+ if ( _cnt265>=1 ) { goto _loop265; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt265++;
+ }
+ _loop265:;
+ } // ( ... )+
+ mHEX_DIGIT(false);
+ mHEX_DIGIT(false);
+ mHEX_DIGIT(false);
+ mHEX_DIGIT(false);
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ {
+ matchRange('0','3');
+ {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x37 /* '7' */ )) && ((LA(2) >= 0x3 /* '\3' */ && LA(2) <= 0xff)) && (true) && (true)) {
+ matchRange('0','7');
+ {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x37 /* '7' */ )) && ((LA(2) >= 0x3 /* '\3' */ && LA(2) <= 0xff)) && (true) && (true)) {
+ matchRange('0','7');
+ }
+ else if (((LA(1) >= 0x3 /* '\3' */ && LA(1) <= 0xff)) && (true) && (true) && (true)) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+
+ }
+ }
+ else if (((LA(1) >= 0x3 /* '\3' */ && LA(1) <= 0xff)) && (true) && (true) && (true)) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+
+ }
+ break;
+ }
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ {
+ matchRange('4','7');
+ {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x37 /* '7' */ )) && ((LA(2) >= 0x3 /* '\3' */ && LA(2) <= 0xff)) && (true) && (true)) {
+ matchRange('0','7');
+ }
+ else if (((LA(1) >= 0x3 /* '\3' */ && LA(1) <= 0xff)) && (true) && (true) && (true)) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mSTRING_LITERAL(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = STRING_LITERAL;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('\"' /* charlit */ );
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == 0x5c /* '\\' */ )) {
+ mESC(false);
+ }
+ else if ((_tokenSet_3.member(LA(1)))) {
+ {
+ match(_tokenSet_3);
+ }
+ }
+ else {
+ goto _loop261;
+ }
+
+ }
+ _loop261:;
+ } // ( ... )*
+ match('\"' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mHEX_DIGIT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = HEX_DIGIT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ switch ( LA(1)) {
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ matchRange('0','9');
+ break;
+ }
+ case 0x41 /* 'A' */ :
+ case 0x42 /* 'B' */ :
+ case 0x43 /* 'C' */ :
+ case 0x44 /* 'D' */ :
+ case 0x45 /* 'E' */ :
+ case 0x46 /* 'F' */ :
+ {
+ matchRange('A','F');
+ break;
+ }
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ {
+ matchRange('a','f');
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mVOCAB(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = VOCAB;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ matchRange('\3',static_cast<unsigned char>('\377'));
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mIDENT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = IDENT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ switch ( LA(1)) {
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ case 0x67 /* 'g' */ :
+ case 0x68 /* 'h' */ :
+ case 0x69 /* 'i' */ :
+ case 0x6a /* 'j' */ :
+ case 0x6b /* 'k' */ :
+ case 0x6c /* 'l' */ :
+ case 0x6d /* 'm' */ :
+ case 0x6e /* 'n' */ :
+ case 0x6f /* 'o' */ :
+ case 0x70 /* 'p' */ :
+ case 0x71 /* 'q' */ :
+ case 0x72 /* 'r' */ :
+ case 0x73 /* 's' */ :
+ case 0x74 /* 't' */ :
+ case 0x75 /* 'u' */ :
+ case 0x76 /* 'v' */ :
+ case 0x77 /* 'w' */ :
+ case 0x78 /* 'x' */ :
+ case 0x79 /* 'y' */ :
+ case 0x7a /* 'z' */ :
+ {
+ matchRange('a','z');
+ break;
+ }
+ case 0x41 /* 'A' */ :
+ case 0x42 /* 'B' */ :
+ case 0x43 /* 'C' */ :
+ case 0x44 /* 'D' */ :
+ case 0x45 /* 'E' */ :
+ case 0x46 /* 'F' */ :
+ case 0x47 /* 'G' */ :
+ case 0x48 /* 'H' */ :
+ case 0x49 /* 'I' */ :
+ case 0x4a /* 'J' */ :
+ case 0x4b /* 'K' */ :
+ case 0x4c /* 'L' */ :
+ case 0x4d /* 'M' */ :
+ case 0x4e /* 'N' */ :
+ case 0x4f /* 'O' */ :
+ case 0x50 /* 'P' */ :
+ case 0x51 /* 'Q' */ :
+ case 0x52 /* 'R' */ :
+ case 0x53 /* 'S' */ :
+ case 0x54 /* 'T' */ :
+ case 0x55 /* 'U' */ :
+ case 0x56 /* 'V' */ :
+ case 0x57 /* 'W' */ :
+ case 0x58 /* 'X' */ :
+ case 0x59 /* 'Y' */ :
+ case 0x5a /* 'Z' */ :
+ {
+ matchRange('A','Z');
+ break;
+ }
+ case 0x5f /* '_' */ :
+ {
+ match('_' /* charlit */ );
+ break;
+ }
+ case 0x24 /* '$' */ :
+ {
+ match('$' /* charlit */ );
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ case 0x67 /* 'g' */ :
+ case 0x68 /* 'h' */ :
+ case 0x69 /* 'i' */ :
+ case 0x6a /* 'j' */ :
+ case 0x6b /* 'k' */ :
+ case 0x6c /* 'l' */ :
+ case 0x6d /* 'm' */ :
+ case 0x6e /* 'n' */ :
+ case 0x6f /* 'o' */ :
+ case 0x70 /* 'p' */ :
+ case 0x71 /* 'q' */ :
+ case 0x72 /* 'r' */ :
+ case 0x73 /* 's' */ :
+ case 0x74 /* 't' */ :
+ case 0x75 /* 'u' */ :
+ case 0x76 /* 'v' */ :
+ case 0x77 /* 'w' */ :
+ case 0x78 /* 'x' */ :
+ case 0x79 /* 'y' */ :
+ case 0x7a /* 'z' */ :
+ {
+ matchRange('a','z');
+ break;
+ }
+ case 0x41 /* 'A' */ :
+ case 0x42 /* 'B' */ :
+ case 0x43 /* 'C' */ :
+ case 0x44 /* 'D' */ :
+ case 0x45 /* 'E' */ :
+ case 0x46 /* 'F' */ :
+ case 0x47 /* 'G' */ :
+ case 0x48 /* 'H' */ :
+ case 0x49 /* 'I' */ :
+ case 0x4a /* 'J' */ :
+ case 0x4b /* 'K' */ :
+ case 0x4c /* 'L' */ :
+ case 0x4d /* 'M' */ :
+ case 0x4e /* 'N' */ :
+ case 0x4f /* 'O' */ :
+ case 0x50 /* 'P' */ :
+ case 0x51 /* 'Q' */ :
+ case 0x52 /* 'R' */ :
+ case 0x53 /* 'S' */ :
+ case 0x54 /* 'T' */ :
+ case 0x55 /* 'U' */ :
+ case 0x56 /* 'V' */ :
+ case 0x57 /* 'W' */ :
+ case 0x58 /* 'X' */ :
+ case 0x59 /* 'Y' */ :
+ case 0x5a /* 'Z' */ :
+ {
+ matchRange('A','Z');
+ break;
+ }
+ case 0x5f /* '_' */ :
+ {
+ match('_' /* charlit */ );
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ matchRange('0','9');
+ break;
+ }
+ case 0x24 /* '$' */ :
+ {
+ match('$' /* charlit */ );
+ break;
+ }
+ default:
+ {
+ goto _loop275;
+ }
+ }
+ }
+ _loop275:;
+ } // ( ... )*
+ _ttype = testLiteralsTable(_ttype);
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mNUM_INT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = NUM_INT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+ ANTLR_USE_NAMESPACE(antlr)RefToken f1;
+ ANTLR_USE_NAMESPACE(antlr)RefToken f2;
+ ANTLR_USE_NAMESPACE(antlr)RefToken f3;
+ ANTLR_USE_NAMESPACE(antlr)RefToken f4;
+#line 1251 "java.g"
+
+ bool isDecimal = false;
+ ANTLR_USE_NAMESPACE(antlr)RefToken t = ANTLR_USE_NAMESPACE(antlr)nullToken;
+
+#line 1707 "JavaLexer.cpp"
+
+ switch ( LA(1)) {
+ case 0x2e /* '.' */ :
+ {
+ match('.' /* charlit */ );
+#line 1256 "java.g"
+ _ttype = DOT;
+#line 1715 "JavaLexer.cpp"
+ {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ { // ( ... )+
+ int _cnt279=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ matchRange('0','9');
+ }
+ else {
+ if ( _cnt279>=1 ) { goto _loop279; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt279++;
+ }
+ _loop279:;
+ } // ( ... )+
+ {
+ if ((LA(1) == 0x45 /* 'E' */ || LA(1) == 0x65 /* 'e' */ )) {
+ mEXPONENT(false);
+ }
+ else {
+ }
+
+ }
+ {
+ if ((LA(1) == 0x44 /* 'D' */ || LA(1) == 0x46 /* 'F' */ || LA(1) == 0x64 /* 'd' */ || LA(1) == 0x66 /* 'f' */ )) {
+ mFLOAT_SUFFIX(true);
+ f1=_returnToken;
+#line 1257 "java.g"
+ t=f1;
+#line 1746 "JavaLexer.cpp"
+ }
+ else {
+ }
+
+ }
+#line 1258 "java.g"
+
+ if ( t &&
+ (t->getText().find('f') != ANTLR_USE_NAMESPACE(std)string::npos ||
+ t->getText().find('F') != ANTLR_USE_NAMESPACE(std)string::npos ) ) {
+ _ttype = NUM_FLOAT;
+ }
+ else {
+ _ttype = NUM_DOUBLE; // assume double
+ }
+
+#line 1763 "JavaLexer.cpp"
+ }
+ else {
+ }
+
+ }
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ {
+ switch ( LA(1)) {
+ case 0x30 /* '0' */ :
+ {
+ match('0' /* charlit */ );
+#line 1270 "java.g"
+ isDecimal = true;
+#line 1789 "JavaLexer.cpp"
+ {
+ switch ( LA(1)) {
+ case 0x58 /* 'X' */ :
+ case 0x78 /* 'x' */ :
+ {
+ {
+ switch ( LA(1)) {
+ case 0x78 /* 'x' */ :
+ {
+ match('x' /* charlit */ );
+ break;
+ }
+ case 0x58 /* 'X' */ :
+ {
+ match('X' /* charlit */ );
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ { // ( ... )+
+ int _cnt286=0;
+ for (;;) {
+ if ((_tokenSet_4.member(LA(1))) && (true) && (true) && (true)) {
+ mHEX_DIGIT(false);
+ }
+ else {
+ if ( _cnt286>=1 ) { goto _loop286; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt286++;
+ }
+ _loop286:;
+ } // ( ... )+
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ {
+ { // ( ... )+
+ int _cnt288=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x37 /* '7' */ ))) {
+ matchRange('0','7');
+ }
+ else {
+ if ( _cnt288>=1 ) { goto _loop288; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt288++;
+ }
+ _loop288:;
+ } // ( ... )+
+ break;
+ }
+ default:
+ {
+ }
+ }
+ }
+ break;
+ }
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ {
+ matchRange('1','9');
+ }
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ matchRange('0','9');
+ }
+ else {
+ goto _loop291;
+ }
+
+ }
+ _loop291:;
+ } // ( ... )*
+#line 1285 "java.g"
+ isDecimal=true;
+#line 1888 "JavaLexer.cpp"
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ {
+ if ((LA(1) == 0x4c /* 'L' */ || LA(1) == 0x6c /* 'l' */ )) {
+ {
+ switch ( LA(1)) {
+ case 0x6c /* 'l' */ :
+ {
+ match('l' /* charlit */ );
+ break;
+ }
+ case 0x4c /* 'L' */ :
+ {
+ match('L' /* charlit */ );
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+#line 1287 "java.g"
+ _ttype = NUM_LONG;
+#line 1919 "JavaLexer.cpp"
+ }
+ else if (((LA(1) == 0x2e /* '.' */ || LA(1) == 0x44 /* 'D' */ || LA(1) == 0x45 /* 'E' */ || LA(1) == 0x46 /* 'F' */ || LA(1) == 0x64 /* 'd' */ || LA(1) == 0x65 /* 'e' */ || LA(1) == 0x66 /* 'f' */ ))&&(isDecimal)) {
+ {
+ switch ( LA(1)) {
+ case 0x2e /* '.' */ :
+ {
+ match('.' /* charlit */ );
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ matchRange('0','9');
+ }
+ else {
+ goto _loop296;
+ }
+
+ }
+ _loop296:;
+ } // ( ... )*
+ {
+ if ((LA(1) == 0x45 /* 'E' */ || LA(1) == 0x65 /* 'e' */ )) {
+ mEXPONENT(false);
+ }
+ else {
+ }
+
+ }
+ {
+ if ((LA(1) == 0x44 /* 'D' */ || LA(1) == 0x46 /* 'F' */ || LA(1) == 0x64 /* 'd' */ || LA(1) == 0x66 /* 'f' */ )) {
+ mFLOAT_SUFFIX(true);
+ f2=_returnToken;
+#line 1291 "java.g"
+ t=f2;
+#line 1953 "JavaLexer.cpp"
+ }
+ else {
+ }
+
+ }
+ break;
+ }
+ case 0x45 /* 'E' */ :
+ case 0x65 /* 'e' */ :
+ {
+ mEXPONENT(false);
+ {
+ if ((LA(1) == 0x44 /* 'D' */ || LA(1) == 0x46 /* 'F' */ || LA(1) == 0x64 /* 'd' */ || LA(1) == 0x66 /* 'f' */ )) {
+ mFLOAT_SUFFIX(true);
+ f3=_returnToken;
+#line 1292 "java.g"
+ t=f3;
+#line 1971 "JavaLexer.cpp"
+ }
+ else {
+ }
+
+ }
+ break;
+ }
+ case 0x44 /* 'D' */ :
+ case 0x46 /* 'F' */ :
+ case 0x64 /* 'd' */ :
+ case 0x66 /* 'f' */ :
+ {
+ mFLOAT_SUFFIX(true);
+ f4=_returnToken;
+#line 1293 "java.g"
+ t=f4;
+#line 1988 "JavaLexer.cpp"
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+#line 1295 "java.g"
+
+ if ( t &&
+ (t->getText().find('f') != ANTLR_USE_NAMESPACE(std)string::npos ||
+ t->getText().find('F') != ANTLR_USE_NAMESPACE(std)string::npos ) ) {
+ _ttype = NUM_FLOAT;
+ }
+ else {
+ _ttype = NUM_DOUBLE; // assume double
+ }
+
+#line 2008 "JavaLexer.cpp"
+ }
+ else {
+ }
+
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mEXPONENT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = EXPONENT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ switch ( LA(1)) {
+ case 0x65 /* 'e' */ :
+ {
+ match('e' /* charlit */ );
+ break;
+ }
+ case 0x45 /* 'E' */ :
+ {
+ match('E' /* charlit */ );
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case 0x2b /* '+' */ :
+ {
+ match('+' /* charlit */ );
+ break;
+ }
+ case 0x2d /* '-' */ :
+ {
+ match('-' /* charlit */ );
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ { // ( ... )+
+ int _cnt304=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ matchRange('0','9');
+ }
+ else {
+ if ( _cnt304>=1 ) { goto _loop304; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt304++;
+ }
+ _loop304:;
+ } // ( ... )+
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void JavaLexer::mFLOAT_SUFFIX(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = FLOAT_SUFFIX;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ switch ( LA(1)) {
+ case 0x66 /* 'f' */ :
+ {
+ match('f' /* charlit */ );
+ break;
+ }
+ case 0x46 /* 'F' */ :
+ {
+ match('F' /* charlit */ );
+ break;
+ }
+ case 0x64 /* 'd' */ :
+ {
+ match('d' /* charlit */ );
+ break;
+ }
+ case 0x44 /* 'D' */ :
+ {
+ match('D' /* charlit */ );
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+
+const unsigned long JavaLexer::_tokenSet_0_data_[] = { 4294958072UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12 0x13 0x14
+// 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f ! \" # $ %
+// & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G
+// H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a b c d e f g h
+// i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81 0x82 0x83
+// 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90 0x91
+// 0x92 0x93 0x94 0x95 0x96 0x97
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaLexer::_tokenSet_0(_tokenSet_0_data_,16);
+const unsigned long JavaLexer::_tokenSet_1_data_[] = { 4294958072UL, 4294966271UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12 0x13 0x14
+// 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f ! \" # $ %
+// & \' ( ) + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H
+// I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a b c d e f g h i
+// j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81 0x82 0x83 0x84
+// 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90 0x91 0x92
+// 0x93 0x94 0x95 0x96 0x97
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaLexer::_tokenSet_1(_tokenSet_1_data_,16);
+const unsigned long JavaLexer::_tokenSet_2_data_[] = { 4294967288UL, 4294967167UL, 4026531839UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 0x11 0x12 0x13
+// 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f ! \" #
+// $ % & ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F
+// G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i
+// j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81 0x82 0x83 0x84
+// 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90 0x91 0x92
+// 0x93 0x94 0x95 0x96 0x97
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaLexer::_tokenSet_2(_tokenSet_2_data_,16);
+const unsigned long JavaLexer::_tokenSet_3_data_[] = { 4294967288UL, 4294967291UL, 4026531839UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 0x11 0x12 0x13
+// 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f ! # $
+// % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F
+// G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i
+// j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81 0x82 0x83 0x84
+// 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90 0x91 0x92
+// 0x93 0x94 0x95 0x96 0x97
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaLexer::_tokenSet_3(_tokenSet_3_data_,16);
+const unsigned long JavaLexer::_tokenSet_4_data_[] = { 0UL, 67043328UL, 126UL, 126UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaLexer::_tokenSet_4(_tokenSet_4_data_,10);
+
diff --git a/languages/java/JavaLexer.hpp b/languages/java/JavaLexer.hpp
new file mode 100644
index 00000000..a46022cd
--- /dev/null
+++ b/languages/java/JavaLexer.hpp
@@ -0,0 +1,132 @@
+#ifndef INC_JavaLexer_hpp_
+#define INC_JavaLexer_hpp_
+
+#line 2 "java.g"
+
+ #include "driver.h"
+ #include "JavaAST.hpp"
+
+ #include <qlistview.h>
+ #include <kdebug.h>
+
+ #define SET_POSITION(ast,t)\
+ { \
+ RefJavaAST(ast)->setLine( t->getLine() );\
+ RefJavaAST(ast)->setColumn( t->getColumn() ); \
+ }
+
+#line 19 "JavaLexer.hpp"
+#include <antlr/config.hpp>
+/* $ANTLR 2.7.7 (20061129): "java.g" -> "JavaLexer.hpp"$ */
+#include <antlr/CommonToken.hpp>
+#include <antlr/InputBuffer.hpp>
+#include <antlr/BitSet.hpp>
+#include "JavaTokenTypes.hpp"
+#include <antlr/CharScanner.hpp>
+class CUSTOM_API JavaLexer : public ANTLR_USE_NAMESPACE(antlr)CharScanner, public JavaTokenTypes
+{
+#line 1058 "java.g"
+
+private:
+ Driver* m_driver;
+
+public:
+ void setDriver( Driver* d ) { m_driver = d; }
+ void setFileName( const QString& fileName ) { m_driver->currentFileName() = fileName; }
+
+ virtual void reportError( const ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(ex.getMessage().c_str()), ex.getLine(), ex.getColumn()) );
+ }
+
+ virtual void reportError( const ANTLR_USE_NAMESPACE(std)string& errorMessage ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(errorMessage.c_str()), getLine(), getColumn()) );
+ }
+
+ virtual void reportWarning( const ANTLR_USE_NAMESPACE(std)string& warnMessage ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(warnMessage.c_str()), getLine(), getColumn()) );
+ }
+#line 30 "JavaLexer.hpp"
+private:
+ void initLiterals();
+public:
+ bool getCaseSensitiveLiterals() const
+ {
+ return true;
+ }
+public:
+ JavaLexer(ANTLR_USE_NAMESPACE(std)istream& in);
+ JavaLexer(ANTLR_USE_NAMESPACE(antlr)InputBuffer& ib);
+ JavaLexer(const ANTLR_USE_NAMESPACE(antlr)LexerSharedInputState& state);
+ ANTLR_USE_NAMESPACE(antlr)RefToken nextToken();
+ public: void mQUESTION(bool _createToken);
+ public: void mLPAREN(bool _createToken);
+ public: void mRPAREN(bool _createToken);
+ public: void mLBRACK(bool _createToken);
+ public: void mRBRACK(bool _createToken);
+ public: void mLCURLY(bool _createToken);
+ public: void mRCURLY(bool _createToken);
+ public: void mCOLON(bool _createToken);
+ public: void mCOMMA(bool _createToken);
+ public: void mASSIGN(bool _createToken);
+ public: void mEQUAL(bool _createToken);
+ public: void mLNOT(bool _createToken);
+ public: void mBNOT(bool _createToken);
+ public: void mNOT_EQUAL(bool _createToken);
+ public: void mDIV(bool _createToken);
+ public: void mDIV_ASSIGN(bool _createToken);
+ public: void mPLUS(bool _createToken);
+ public: void mPLUS_ASSIGN(bool _createToken);
+ public: void mINC(bool _createToken);
+ public: void mMINUS(bool _createToken);
+ public: void mMINUS_ASSIGN(bool _createToken);
+ public: void mDEC(bool _createToken);
+ public: void mSTAR(bool _createToken);
+ public: void mSTAR_ASSIGN(bool _createToken);
+ public: void mMOD(bool _createToken);
+ public: void mMOD_ASSIGN(bool _createToken);
+ public: void mSR(bool _createToken);
+ public: void mSR_ASSIGN(bool _createToken);
+ public: void mBSR(bool _createToken);
+ public: void mBSR_ASSIGN(bool _createToken);
+ public: void mGE(bool _createToken);
+ public: void mGT(bool _createToken);
+ public: void mSL(bool _createToken);
+ public: void mSL_ASSIGN(bool _createToken);
+ public: void mLE(bool _createToken);
+ public: void mLT_(bool _createToken);
+ public: void mBXOR(bool _createToken);
+ public: void mBXOR_ASSIGN(bool _createToken);
+ public: void mBOR(bool _createToken);
+ public: void mBOR_ASSIGN(bool _createToken);
+ public: void mLOR(bool _createToken);
+ public: void mBAND(bool _createToken);
+ public: void mBAND_ASSIGN(bool _createToken);
+ public: void mLAND(bool _createToken);
+ public: void mSEMI(bool _createToken);
+ public: void mWS(bool _createToken);
+ public: void mSL_COMMENT(bool _createToken);
+ public: void mML_COMMENT(bool _createToken);
+ public: void mCHAR_LITERAL(bool _createToken);
+ protected: void mESC(bool _createToken);
+ public: void mSTRING_LITERAL(bool _createToken);
+ protected: void mHEX_DIGIT(bool _createToken);
+ protected: void mVOCAB(bool _createToken);
+ public: void mIDENT(bool _createToken);
+ public: void mNUM_INT(bool _createToken);
+ protected: void mEXPONENT(bool _createToken);
+ protected: void mFLOAT_SUFFIX(bool _createToken);
+private:
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+ static const unsigned long _tokenSet_2_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2;
+ static const unsigned long _tokenSet_3_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3;
+ static const unsigned long _tokenSet_4_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_4;
+};
+
+#endif /*INC_JavaLexer_hpp_*/
diff --git a/languages/java/JavaRecognizer.cpp b/languages/java/JavaRecognizer.cpp
new file mode 100644
index 00000000..1021c6a0
--- /dev/null
+++ b/languages/java/JavaRecognizer.cpp
@@ -0,0 +1,6540 @@
+/* $ANTLR 2.7.7 (20061129): "java.g" -> "JavaRecognizer.cpp"$ */
+#include "JavaRecognizer.hpp"
+#include <antlr/NoViableAltException.hpp>
+#include <antlr/SemanticException.hpp>
+#include <antlr/ASTFactory.hpp>
+#line 1 "java.g"
+#line 8 "JavaRecognizer.cpp"
+JavaRecognizer::JavaRecognizer(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf, int k)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(tokenBuf,k)
+{
+}
+
+JavaRecognizer::JavaRecognizer(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(tokenBuf,2)
+{
+}
+
+JavaRecognizer::JavaRecognizer(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer, int k)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(lexer,k)
+{
+}
+
+JavaRecognizer::JavaRecognizer(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(lexer,2)
+{
+}
+
+JavaRecognizer::JavaRecognizer(const ANTLR_USE_NAMESPACE(antlr)ParserSharedInputState& state)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(state,2)
+{
+}
+
+void JavaRecognizer::compilationUnit() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST compilationUnit_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LITERAL_package:
+ {
+ packageDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case ANTLR_USE_NAMESPACE(antlr)Token::EOF_TYPE:
+ case FINAL:
+ case ABSTRACT:
+ case STRICTFP:
+ case SEMI:
+ case LITERAL_import:
+ case LITERAL_private:
+ case LITERAL_public:
+ case LITERAL_protected:
+ case LITERAL_static:
+ case LITERAL_transient:
+ case LITERAL_native:
+ case LITERAL_threadsafe:
+ case LITERAL_synchronized:
+ case LITERAL_volatile:
+ case LITERAL_class:
+ case LITERAL_interface:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == LITERAL_import)) {
+ importDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop4;
+ }
+
+ }
+ _loop4:;
+ } // ( ... )*
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_0.member(LA(1)))) {
+ typeDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop6;
+ }
+
+ }
+ _loop6:;
+ } // ( ... )*
+ match(ANTLR_USE_NAMESPACE(antlr)Token::EOF_TYPE);
+ compilationUnit_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_1);
+ } else {
+ throw;
+ }
+ }
+ returnAST = compilationUnit_AST;
+}
+
+void JavaRecognizer::packageDefinition() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST packageDefinition_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken p = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST p_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ p = LT(1);
+ if ( inputState->guessing == 0 ) {
+ p_AST = astFactory->create(p);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(p_AST));
+ }
+ match(LITERAL_package);
+ if ( inputState->guessing==0 ) {
+#line 196 "java.g"
+ p_AST->setType(PACKAGE_DEF);
+#line 137 "JavaRecognizer.cpp"
+ }
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ packageDefinition_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_2);
+ } else {
+ throw;
+ }
+ }
+ returnAST = packageDefinition_AST;
+}
+
+void JavaRecognizer::importDefinition() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST importDefinition_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken i = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST i_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ i = LT(1);
+ if ( inputState->guessing == 0 ) {
+ i_AST = astFactory->create(i);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(i_AST));
+ }
+ match(LITERAL_import);
+ if ( inputState->guessing==0 ) {
+#line 202 "java.g"
+ i_AST->setType(IMPORT);
+#line 174 "JavaRecognizer.cpp"
+ }
+ identifierStar();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ importDefinition_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_2);
+ } else {
+ throw;
+ }
+ }
+ returnAST = importDefinition_AST;
+}
+
+void JavaRecognizer::typeDefinition() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST typeDefinition_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST m_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case FINAL:
+ case ABSTRACT:
+ case STRICTFP:
+ case LITERAL_private:
+ case LITERAL_public:
+ case LITERAL_protected:
+ case LITERAL_static:
+ case LITERAL_transient:
+ case LITERAL_native:
+ case LITERAL_threadsafe:
+ case LITERAL_synchronized:
+ case LITERAL_volatile:
+ case LITERAL_class:
+ case LITERAL_interface:
+ {
+ modifiers();
+ if (inputState->guessing==0) {
+ m_AST = returnAST;
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_class:
+ {
+ classDefinition(m_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case LITERAL_interface:
+ {
+ interfaceDefinition(m_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ typeDefinition_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case SEMI:
+ {
+ match(SEMI);
+ typeDefinition_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_3);
+ } else {
+ throw;
+ }
+ }
+ returnAST = typeDefinition_AST;
+}
+
+void JavaRecognizer::identifier() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST identifier_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST tmp5_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp5_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp5_AST));
+ }
+ match(IDENT);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == DOT)) {
+ RefJavaAST tmp6_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp6_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp6_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp7_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp7_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp7_AST));
+ }
+ match(IDENT);
+ }
+ else {
+ goto _loop23;
+ }
+
+ }
+ _loop23:;
+ } // ( ... )*
+ identifier_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_4);
+ } else {
+ throw;
+ }
+ }
+ returnAST = identifier_AST;
+}
+
+void JavaRecognizer::identifierStar() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST identifierStar_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST tmp8_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp8_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp8_AST));
+ }
+ match(IDENT);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == DOT) && (LA(2) == IDENT)) {
+ RefJavaAST tmp9_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp9_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp9_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp10_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp10_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp10_AST));
+ }
+ match(IDENT);
+ }
+ else {
+ goto _loop26;
+ }
+
+ }
+ _loop26:;
+ } // ( ... )*
+ {
+ switch ( LA(1)) {
+ case DOT:
+ {
+ RefJavaAST tmp11_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp11_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp11_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp12_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp12_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp12_AST));
+ }
+ match(STAR);
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ identifierStar_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_5);
+ } else {
+ throw;
+ }
+ }
+ returnAST = identifierStar_AST;
+}
+
+void JavaRecognizer::modifiers() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST modifiers_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_6.member(LA(1)))) {
+ modifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop30;
+ }
+
+ }
+ _loop30:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ modifiers_AST = RefJavaAST(currentAST.root);
+#line 290 "java.g"
+ modifiers_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(modifiers_AST))));
+#line 420 "JavaRecognizer.cpp"
+ currentAST.root = modifiers_AST;
+ if ( modifiers_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ modifiers_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = modifiers_AST->getFirstChild();
+ else
+ currentAST.child = modifiers_AST;
+ currentAST.advanceChildToEnd();
+ }
+ modifiers_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_7);
+ } else {
+ throw;
+ }
+ }
+ returnAST = modifiers_AST;
+}
+
+void JavaRecognizer::classDefinition(
+ RefJavaAST modifiers
+) {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST classDefinition_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST sc_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST ic_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST cb_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LITERAL_class);
+ RefJavaAST tmp14_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp14_AST = astFactory->create(LT(1));
+ }
+ match(IDENT);
+ superClassClause();
+ if (inputState->guessing==0) {
+ sc_AST = returnAST;
+ }
+ implementsClause();
+ if (inputState->guessing==0) {
+ ic_AST = returnAST;
+ }
+ classBlock();
+ if (inputState->guessing==0) {
+ cb_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ classDefinition_AST = RefJavaAST(currentAST.root);
+#line 319 "java.g"
+ classDefinition_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(6))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(CLASS_DEF,"CLASS_DEF")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(modifiers))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(tmp14_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(sc_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(ic_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(cb_AST))));
+#line 475 "JavaRecognizer.cpp"
+ currentAST.root = classDefinition_AST;
+ if ( classDefinition_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ classDefinition_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = classDefinition_AST->getFirstChild();
+ else
+ currentAST.child = classDefinition_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_8);
+ } else {
+ throw;
+ }
+ }
+ returnAST = classDefinition_AST;
+}
+
+void JavaRecognizer::interfaceDefinition(
+ RefJavaAST modifiers
+) {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST interfaceDefinition_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST ie_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST cb_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LITERAL_interface);
+ RefJavaAST tmp16_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp16_AST = astFactory->create(LT(1));
+ }
+ match(IDENT);
+ interfaceExtends();
+ if (inputState->guessing==0) {
+ ie_AST = returnAST;
+ }
+ classBlock();
+ if (inputState->guessing==0) {
+ cb_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ interfaceDefinition_AST = RefJavaAST(currentAST.root);
+#line 335 "java.g"
+ interfaceDefinition_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(5))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(INTERFACE_DEF,"INTERFACE_DEF")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(modifiers))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(tmp16_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(ie_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(cb_AST))));
+#line 524 "JavaRecognizer.cpp"
+ currentAST.root = interfaceDefinition_AST;
+ if ( interfaceDefinition_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ interfaceDefinition_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = interfaceDefinition_AST->getFirstChild();
+ else
+ currentAST.child = interfaceDefinition_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_9);
+ } else {
+ throw;
+ }
+ }
+ returnAST = interfaceDefinition_AST;
+}
+
+/** A declaration is the creation of a reference or primitive-type variable
+ * Create a separate Type/Var tree for each var in the var list.
+ */
+void JavaRecognizer::declaration() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST declaration_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST m_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST t_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST v_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ modifiers();
+ if (inputState->guessing==0) {
+ m_AST = returnAST;
+ }
+ typeSpec(false);
+ if (inputState->guessing==0) {
+ t_AST = returnAST;
+ }
+ variableDefinitions(m_AST,t_AST);
+ if (inputState->guessing==0) {
+ v_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ declaration_AST = RefJavaAST(currentAST.root);
+#line 220 "java.g"
+ declaration_AST = v_AST;
+#line 573 "JavaRecognizer.cpp"
+ currentAST.root = declaration_AST;
+ if ( declaration_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ declaration_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = declaration_AST->getFirstChild();
+ else
+ currentAST.child = declaration_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_5);
+ } else {
+ throw;
+ }
+ }
+ returnAST = declaration_AST;
+}
+
+void JavaRecognizer::typeSpec(
+ bool addImagNode
+) {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST typeSpec_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ classTypeSpec(addImagNode);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ typeSpec_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ {
+ builtInTypeSpec(addImagNode);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ typeSpec_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_10);
+ } else {
+ throw;
+ }
+ }
+ returnAST = typeSpec_AST;
+}
+
+void JavaRecognizer::variableDefinitions(
+ RefJavaAST mods, RefJavaAST t
+) {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST variableDefinitions_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ variableDeclarator((RefJavaAST)getASTFactory()->dupTree((antlr::RefAST)mods),
+ (RefJavaAST)getASTFactory()->dupTree((antlr::RefAST)t));
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ variableDeclarator((RefJavaAST)getASTFactory()->dupTree((antlr::RefAST)mods),
+ (RefJavaAST)getASTFactory()->dupTree((antlr::RefAST)t));
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop59;
+ }
+
+ }
+ _loop59:;
+ } // ( ... )*
+ variableDefinitions_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_5);
+ } else {
+ throw;
+ }
+ }
+ returnAST = variableDefinitions_AST;
+}
+
+void JavaRecognizer::classTypeSpec(
+ bool addImagNode
+) {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST classTypeSpec_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lb = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lb_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == LBRACK)) {
+ lb = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lb_AST = astFactory->create(lb);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lb_AST));
+ }
+ match(LBRACK);
+ if ( inputState->guessing==0 ) {
+#line 233 "java.g"
+ lb_AST->setType(ARRAY_DECLARATOR);
+#line 715 "JavaRecognizer.cpp"
+ }
+ match(RBRACK);
+ }
+ else {
+ goto _loop15;
+ }
+
+ }
+ _loop15:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ classTypeSpec_AST = RefJavaAST(currentAST.root);
+#line 234 "java.g"
+
+ if ( addImagNode ) {
+ classTypeSpec_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(TYPE,"TYPE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(classTypeSpec_AST))));
+ }
+
+#line 734 "JavaRecognizer.cpp"
+ currentAST.root = classTypeSpec_AST;
+ if ( classTypeSpec_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ classTypeSpec_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = classTypeSpec_AST->getFirstChild();
+ else
+ currentAST.child = classTypeSpec_AST;
+ currentAST.advanceChildToEnd();
+ }
+ classTypeSpec_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_10);
+ } else {
+ throw;
+ }
+ }
+ returnAST = classTypeSpec_AST;
+}
+
+void JavaRecognizer::builtInTypeSpec(
+ bool addImagNode
+) {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST builtInTypeSpec_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lb = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lb_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ builtInType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == LBRACK)) {
+ lb = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lb_AST = astFactory->create(lb);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lb_AST));
+ }
+ match(LBRACK);
+ if ( inputState->guessing==0 ) {
+#line 244 "java.g"
+ lb_AST->setType(ARRAY_DECLARATOR);
+#line 782 "JavaRecognizer.cpp"
+ }
+ match(RBRACK);
+ }
+ else {
+ goto _loop18;
+ }
+
+ }
+ _loop18:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ builtInTypeSpec_AST = RefJavaAST(currentAST.root);
+#line 245 "java.g"
+
+ if ( addImagNode ) {
+ builtInTypeSpec_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(TYPE,"TYPE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(builtInTypeSpec_AST))));
+ }
+
+#line 801 "JavaRecognizer.cpp"
+ currentAST.root = builtInTypeSpec_AST;
+ if ( builtInTypeSpec_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ builtInTypeSpec_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = builtInTypeSpec_AST->getFirstChild();
+ else
+ currentAST.child = builtInTypeSpec_AST;
+ currentAST.advanceChildToEnd();
+ }
+ builtInTypeSpec_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_10);
+ } else {
+ throw;
+ }
+ }
+ returnAST = builtInTypeSpec_AST;
+}
+
+void JavaRecognizer::builtInType() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST builtInType_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case LITERAL_void:
+ {
+ RefJavaAST tmp20_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp20_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp20_AST));
+ }
+ match(LITERAL_void);
+ builtInType_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_boolean:
+ {
+ RefJavaAST tmp21_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp21_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp21_AST));
+ }
+ match(LITERAL_boolean);
+ builtInType_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_byte:
+ {
+ RefJavaAST tmp22_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp22_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp22_AST));
+ }
+ match(LITERAL_byte);
+ builtInType_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_char:
+ {
+ RefJavaAST tmp23_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp23_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp23_AST));
+ }
+ match(LITERAL_char);
+ builtInType_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_short:
+ {
+ RefJavaAST tmp24_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp24_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp24_AST));
+ }
+ match(LITERAL_short);
+ builtInType_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_int:
+ {
+ RefJavaAST tmp25_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp25_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp25_AST));
+ }
+ match(LITERAL_int);
+ builtInType_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_float:
+ {
+ RefJavaAST tmp26_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp26_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp26_AST));
+ }
+ match(LITERAL_float);
+ builtInType_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_long:
+ {
+ RefJavaAST tmp27_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp27_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp27_AST));
+ }
+ match(LITERAL_long);
+ builtInType_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_double:
+ {
+ RefJavaAST tmp28_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp28_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp28_AST));
+ }
+ match(LITERAL_double);
+ builtInType_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_11);
+ } else {
+ throw;
+ }
+ }
+ returnAST = builtInType_AST;
+}
+
+void JavaRecognizer::type() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST type_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ {
+ builtInType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_12);
+ } else {
+ throw;
+ }
+ }
+ returnAST = type_AST;
+}
+
+void JavaRecognizer::modifier() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST modifier_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case LITERAL_private:
+ {
+ RefJavaAST tmp29_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp29_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp29_AST));
+ }
+ match(LITERAL_private);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_public:
+ {
+ RefJavaAST tmp30_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp30_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp30_AST));
+ }
+ match(LITERAL_public);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_protected:
+ {
+ RefJavaAST tmp31_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp31_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp31_AST));
+ }
+ match(LITERAL_protected);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_static:
+ {
+ RefJavaAST tmp32_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp32_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp32_AST));
+ }
+ match(LITERAL_static);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_transient:
+ {
+ RefJavaAST tmp33_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp33_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp33_AST));
+ }
+ match(LITERAL_transient);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case FINAL:
+ {
+ RefJavaAST tmp34_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp34_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp34_AST));
+ }
+ match(FINAL);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case ABSTRACT:
+ {
+ RefJavaAST tmp35_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp35_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp35_AST));
+ }
+ match(ABSTRACT);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_native:
+ {
+ RefJavaAST tmp36_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp36_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp36_AST));
+ }
+ match(LITERAL_native);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_threadsafe:
+ {
+ RefJavaAST tmp37_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp37_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp37_AST));
+ }
+ match(LITERAL_threadsafe);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_synchronized:
+ {
+ RefJavaAST tmp38_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp38_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp38_AST));
+ }
+ match(LITERAL_synchronized);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_volatile:
+ {
+ RefJavaAST tmp39_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp39_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp39_AST));
+ }
+ match(LITERAL_volatile);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case STRICTFP:
+ {
+ RefJavaAST tmp40_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp40_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp40_AST));
+ }
+ match(STRICTFP);
+ modifier_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_13);
+ } else {
+ throw;
+ }
+ }
+ returnAST = modifier_AST;
+}
+
+void JavaRecognizer::superClassClause() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST superClassClause_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST id_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LITERAL_extends:
+ {
+ match(LITERAL_extends);
+ identifier();
+ if (inputState->guessing==0) {
+ id_AST = returnAST;
+ }
+ break;
+ }
+ case LCURLY:
+ case LITERAL_implements:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ superClassClause_AST = RefJavaAST(currentAST.root);
+#line 325 "java.g"
+ superClassClause_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(EXTENDS_CLAUSE,"EXTENDS_CLAUSE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(id_AST))));
+#line 1185 "JavaRecognizer.cpp"
+ currentAST.root = superClassClause_AST;
+ if ( superClassClause_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ superClassClause_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = superClassClause_AST->getFirstChild();
+ else
+ currentAST.child = superClassClause_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_14);
+ } else {
+ throw;
+ }
+ }
+ returnAST = superClassClause_AST;
+}
+
+void JavaRecognizer::implementsClause() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST implementsClause_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken i = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST i_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LITERAL_implements:
+ {
+ i = LT(1);
+ if ( inputState->guessing == 0 ) {
+ i_AST = astFactory->create(i);
+ }
+ match(LITERAL_implements);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop46;
+ }
+
+ }
+ _loop46:;
+ } // ( ... )*
+ break;
+ }
+ case LCURLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ implementsClause_AST = RefJavaAST(currentAST.root);
+#line 363 "java.g"
+ implementsClause_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(IMPLEMENTS_CLAUSE,"IMPLEMENTS_CLAUSE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(implementsClause_AST))));
+#line 1259 "JavaRecognizer.cpp"
+ currentAST.root = implementsClause_AST;
+ if ( implementsClause_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ implementsClause_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = implementsClause_AST->getFirstChild();
+ else
+ currentAST.child = implementsClause_AST;
+ currentAST.advanceChildToEnd();
+ }
+ implementsClause_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_15);
+ } else {
+ throw;
+ }
+ }
+ returnAST = implementsClause_AST;
+}
+
+void JavaRecognizer::classBlock() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST classBlock_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LCURLY);
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case FINAL:
+ case ABSTRACT:
+ case STRICTFP:
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LITERAL_private:
+ case LITERAL_public:
+ case LITERAL_protected:
+ case LITERAL_static:
+ case LITERAL_transient:
+ case LITERAL_native:
+ case LITERAL_threadsafe:
+ case LITERAL_synchronized:
+ case LITERAL_volatile:
+ case LITERAL_class:
+ case LITERAL_interface:
+ case LCURLY:
+ {
+ field();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ {
+ match(SEMI);
+ break;
+ }
+ default:
+ {
+ goto _loop38;
+ }
+ }
+ }
+ _loop38:;
+ } // ( ... )*
+ match(RCURLY);
+ if ( inputState->guessing==0 ) {
+ classBlock_AST = RefJavaAST(currentAST.root);
+#line 345 "java.g"
+ classBlock_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(OBJBLOCK,"OBJBLOCK")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(classBlock_AST))));
+#line 1341 "JavaRecognizer.cpp"
+ currentAST.root = classBlock_AST;
+ if ( classBlock_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ classBlock_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = classBlock_AST->getFirstChild();
+ else
+ currentAST.child = classBlock_AST;
+ currentAST.advanceChildToEnd();
+ }
+ classBlock_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = classBlock_AST;
+}
+
+void JavaRecognizer::interfaceExtends() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST interfaceExtends_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken e = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST e_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LITERAL_extends:
+ {
+ e = LT(1);
+ if ( inputState->guessing == 0 ) {
+ e_AST = astFactory->create(e);
+ }
+ match(LITERAL_extends);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop42;
+ }
+
+ }
+ _loop42:;
+ } // ( ... )*
+ break;
+ }
+ case LCURLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ interfaceExtends_AST = RefJavaAST(currentAST.root);
+#line 354 "java.g"
+ interfaceExtends_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(EXTENDS_CLAUSE,"EXTENDS_CLAUSE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(interfaceExtends_AST))));
+#line 1416 "JavaRecognizer.cpp"
+ currentAST.root = interfaceExtends_AST;
+ if ( interfaceExtends_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ interfaceExtends_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = interfaceExtends_AST->getFirstChild();
+ else
+ currentAST.child = interfaceExtends_AST;
+ currentAST.advanceChildToEnd();
+ }
+ interfaceExtends_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_15);
+ } else {
+ throw;
+ }
+ }
+ returnAST = interfaceExtends_AST;
+}
+
+void JavaRecognizer::field() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST field_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST mods_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST h_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST s_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST cd_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST id_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST t_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST param_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST rt_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST tc_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST s2_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST v_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST s3_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST s4_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if ((_tokenSet_13.member(LA(1))) && (_tokenSet_17.member(LA(2)))) {
+ modifiers();
+ if (inputState->guessing==0) {
+ mods_AST = returnAST;
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_class:
+ {
+ classDefinition(mods_AST);
+ if (inputState->guessing==0) {
+ cd_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ field_AST = RefJavaAST(currentAST.root);
+#line 378 "java.g"
+ field_AST = cd_AST;
+#line 1474 "JavaRecognizer.cpp"
+ currentAST.root = field_AST;
+ if ( field_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ field_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = field_AST->getFirstChild();
+ else
+ currentAST.child = field_AST;
+ currentAST.advanceChildToEnd();
+ }
+ break;
+ }
+ case LITERAL_interface:
+ {
+ interfaceDefinition(mods_AST);
+ if (inputState->guessing==0) {
+ id_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ field_AST = RefJavaAST(currentAST.root);
+#line 381 "java.g"
+ field_AST = id_AST;
+#line 1495 "JavaRecognizer.cpp"
+ currentAST.root = field_AST;
+ if ( field_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ field_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = field_AST->getFirstChild();
+ else
+ currentAST.child = field_AST;
+ currentAST.advanceChildToEnd();
+ }
+ break;
+ }
+ default:
+ if ((LA(1) == IDENT) && (LA(2) == LPAREN)) {
+ ctorHead();
+ if (inputState->guessing==0) {
+ h_AST = returnAST;
+ }
+ constructorBody();
+ if (inputState->guessing==0) {
+ s_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ field_AST = RefJavaAST(currentAST.root);
+#line 375 "java.g"
+ field_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(4))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(CTOR_DEF,"CTOR_DEF")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(mods_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(h_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST))));
+#line 1520 "JavaRecognizer.cpp"
+ currentAST.root = field_AST;
+ if ( field_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ field_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = field_AST->getFirstChild();
+ else
+ currentAST.child = field_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ else if (((LA(1) >= LITERAL_void && LA(1) <= IDENT)) && (_tokenSet_18.member(LA(2)))) {
+ typeSpec(false);
+ if (inputState->guessing==0) {
+ t_AST = returnAST;
+ }
+ {
+ if ((LA(1) == IDENT) && (LA(2) == LPAREN)) {
+ RefJavaAST tmp47_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp47_AST = astFactory->create(LT(1));
+ }
+ match(IDENT);
+ match(LPAREN);
+ parameterDeclarationList();
+ if (inputState->guessing==0) {
+ param_AST = returnAST;
+ }
+ match(RPAREN);
+ declaratorBrackets(t_AST);
+ if (inputState->guessing==0) {
+ rt_AST = returnAST;
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_throws:
+ {
+ throwsClause();
+ if (inputState->guessing==0) {
+ tc_AST = returnAST;
+ }
+ break;
+ }
+ case SEMI:
+ case LCURLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case LCURLY:
+ {
+ compoundStatement();
+ if (inputState->guessing==0) {
+ s2_AST = returnAST;
+ }
+ break;
+ }
+ case SEMI:
+ {
+ RefJavaAST tmp50_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp50_AST = astFactory->create(LT(1));
+ }
+ match(SEMI);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ field_AST = RefJavaAST(currentAST.root);
+#line 396 "java.g"
+ field_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(7))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(METHOD_DEF,"METHOD_DEF")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(mods_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(TYPE,"TYPE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(rt_AST))))))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(tmp47_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(param_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(tc_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(s2_AST))));
+#line 1602 "JavaRecognizer.cpp"
+ currentAST.root = field_AST;
+ if ( field_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ field_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = field_AST->getFirstChild();
+ else
+ currentAST.child = field_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ else if ((LA(1) == IDENT) && (_tokenSet_19.member(LA(2)))) {
+ variableDefinitions(mods_AST,t_AST);
+ if (inputState->guessing==0) {
+ v_AST = returnAST;
+ }
+ RefJavaAST tmp51_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp51_AST = astFactory->create(LT(1));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+ field_AST = RefJavaAST(currentAST.root);
+#line 405 "java.g"
+ field_AST = v_AST;
+#line 1626 "JavaRecognizer.cpp"
+ currentAST.root = field_AST;
+ if ( field_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ field_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = field_AST->getFirstChild();
+ else
+ currentAST.child = field_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else if ((LA(1) == LITERAL_static) && (LA(2) == LCURLY)) {
+ match(LITERAL_static);
+ compoundStatement();
+ if (inputState->guessing==0) {
+ s3_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ field_AST = RefJavaAST(currentAST.root);
+#line 411 "java.g"
+ field_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(STATIC_INIT,"STATIC_INIT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(s3_AST))));
+#line 1658 "JavaRecognizer.cpp"
+ currentAST.root = field_AST;
+ if ( field_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ field_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = field_AST->getFirstChild();
+ else
+ currentAST.child = field_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ else if ((LA(1) == LCURLY)) {
+ compoundStatement();
+ if (inputState->guessing==0) {
+ s4_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ field_AST = RefJavaAST(currentAST.root);
+#line 415 "java.g"
+ field_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(INSTANCE_INIT,"INSTANCE_INIT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(s4_AST))));
+#line 1677 "JavaRecognizer.cpp"
+ currentAST.root = field_AST;
+ if ( field_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ field_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = field_AST->getFirstChild();
+ else
+ currentAST.child = field_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_20);
+ } else {
+ throw;
+ }
+ }
+ returnAST = field_AST;
+}
+
+void JavaRecognizer::ctorHead() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST ctorHead_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST tmp53_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp53_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp53_AST));
+ }
+ match(IDENT);
+ match(LPAREN);
+ parameterDeclarationList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ {
+ switch ( LA(1)) {
+ case LITERAL_throws:
+ {
+ throwsClause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case LCURLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ ctorHead_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_15);
+ } else {
+ throw;
+ }
+ }
+ returnAST = ctorHead_AST;
+}
+
+void JavaRecognizer::constructorBody() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST constructorBody_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lc = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lc_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ lc = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lc_AST = astFactory->create(lc);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lc_AST));
+ }
+ match(LCURLY);
+ if ( inputState->guessing==0 ) {
+#line 419 "java.g"
+ lc_AST->setType(SLIST);
+#line 1771 "JavaRecognizer.cpp"
+ }
+ {
+ if ((LA(1) == LITERAL_this || LA(1) == LITERAL_super) && (LA(2) == LPAREN)) {
+ explicitConstructorInvocation();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((_tokenSet_21.member(LA(1))) && (_tokenSet_22.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_23.member(LA(1)))) {
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop55;
+ }
+
+ }
+ _loop55:;
+ } // ( ... )*
+ match(RCURLY);
+ constructorBody_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_20);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constructorBody_AST;
+}
+
+void JavaRecognizer::parameterDeclarationList() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST parameterDeclarationList_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case FINAL:
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ {
+ parameterDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ parameterDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop80;
+ }
+
+ }
+ _loop80:;
+ } // ( ... )*
+ break;
+ }
+ case RPAREN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ parameterDeclarationList_AST = RefJavaAST(currentAST.root);
+#line 508 "java.g"
+ parameterDeclarationList_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PARAMETERS,"PARAMETERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(parameterDeclarationList_AST))));
+#line 1872 "JavaRecognizer.cpp"
+ currentAST.root = parameterDeclarationList_AST;
+ if ( parameterDeclarationList_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ parameterDeclarationList_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = parameterDeclarationList_AST->getFirstChild();
+ else
+ currentAST.child = parameterDeclarationList_AST;
+ currentAST.advanceChildToEnd();
+ }
+ parameterDeclarationList_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_24);
+ } else {
+ throw;
+ }
+ }
+ returnAST = parameterDeclarationList_AST;
+}
+
+void JavaRecognizer::declaratorBrackets(
+ RefJavaAST typ
+) {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST declaratorBrackets_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lb = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lb_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if ( inputState->guessing==0 ) {
+ declaratorBrackets_AST = RefJavaAST(currentAST.root);
+#line 452 "java.g"
+ declaratorBrackets_AST=typ;
+#line 1908 "JavaRecognizer.cpp"
+ currentAST.root = declaratorBrackets_AST;
+ if ( declaratorBrackets_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ declaratorBrackets_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = declaratorBrackets_AST->getFirstChild();
+ else
+ currentAST.child = declaratorBrackets_AST;
+ currentAST.advanceChildToEnd();
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == LBRACK)) {
+ lb = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lb_AST = astFactory->create(lb);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lb_AST));
+ }
+ match(LBRACK);
+ if ( inputState->guessing==0 ) {
+#line 453 "java.g"
+ lb_AST->setType(ARRAY_DECLARATOR);
+#line 1929 "JavaRecognizer.cpp"
+ }
+ match(RBRACK);
+ }
+ else {
+ goto _loop63;
+ }
+
+ }
+ _loop63:;
+ } // ( ... )*
+ declaratorBrackets_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_25);
+ } else {
+ throw;
+ }
+ }
+ returnAST = declaratorBrackets_AST;
+}
+
+void JavaRecognizer::throwsClause() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST throwsClause_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST tmp59_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp59_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp59_AST));
+ }
+ match(LITERAL_throws);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop76;
+ }
+
+ }
+ _loop76:;
+ } // ( ... )*
+ throwsClause_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_26);
+ } else {
+ throw;
+ }
+ }
+ returnAST = throwsClause_AST;
+}
+
+void JavaRecognizer::compoundStatement() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST compoundStatement_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lc = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lc_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ lc = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lc_AST = astFactory->create(lc);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lc_AST));
+ }
+ match(LCURLY);
+ if ( inputState->guessing==0 ) {
+#line 535 "java.g"
+ lc_AST->setType(SLIST);
+#line 2015 "JavaRecognizer.cpp"
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_23.member(LA(1)))) {
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop86;
+ }
+
+ }
+ _loop86:;
+ } // ( ... )*
+ match(RCURLY);
+ compoundStatement_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_27);
+ } else {
+ throw;
+ }
+ }
+ returnAST = compoundStatement_AST;
+}
+
+/** Catch obvious constructor calls, but not the expr.super(...) calls */
+void JavaRecognizer::explicitConstructorInvocation() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST explicitConstructorInvocation_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lp1 = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lp1_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lp2 = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lp2_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case LITERAL_this:
+ {
+ match(LITERAL_this);
+ lp1 = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lp1_AST = astFactory->create(lp1);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lp1_AST));
+ }
+ match(LPAREN);
+ argList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 428 "java.g"
+ lp1_AST->setType(CTOR_CALL);
+#line 2076 "JavaRecognizer.cpp"
+ }
+ explicitConstructorInvocation_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_super:
+ {
+ match(LITERAL_super);
+ lp2 = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lp2_AST = astFactory->create(lp2);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lp2_AST));
+ }
+ match(LPAREN);
+ argList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 430 "java.g"
+ lp2_AST->setType(SUPER_CTOR_CALL);
+#line 2099 "JavaRecognizer.cpp"
+ }
+ explicitConstructorInvocation_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_21);
+ } else {
+ throw;
+ }
+ }
+ returnAST = explicitConstructorInvocation_AST;
+}
+
+void JavaRecognizer::statement() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST statement_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST m_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken c = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST c_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken s = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST s_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case LCURLY:
+ {
+ compoundStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_if:
+ {
+ RefJavaAST tmp68_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp68_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp68_AST));
+ }
+ match(LITERAL_if);
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ if ((LA(1) == LITERAL_else) && (_tokenSet_23.member(LA(2)))) {
+ match(LITERAL_else);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((_tokenSet_28.member(LA(1))) && (_tokenSet_29.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_for:
+ {
+ RefJavaAST tmp72_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp72_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp72_AST));
+ }
+ match(LITERAL_for);
+ match(LPAREN);
+ forInit();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ forCond();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ forIter();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_while:
+ {
+ RefJavaAST tmp77_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp77_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp77_AST));
+ }
+ match(LITERAL_while);
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_do:
+ {
+ RefJavaAST tmp80_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp80_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp80_AST));
+ }
+ match(LITERAL_do);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(LITERAL_while);
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ match(SEMI);
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_break:
+ {
+ RefJavaAST tmp85_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp85_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp85_AST));
+ }
+ match(LITERAL_break);
+ {
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ RefJavaAST tmp86_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp86_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp86_AST));
+ }
+ match(IDENT);
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_continue:
+ {
+ RefJavaAST tmp88_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp88_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp88_AST));
+ }
+ match(LITERAL_continue);
+ {
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ RefJavaAST tmp89_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp89_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp89_AST));
+ }
+ match(IDENT);
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_return:
+ {
+ RefJavaAST tmp91_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp91_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp91_AST));
+ }
+ match(LITERAL_return);
+ {
+ switch ( LA(1)) {
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case PLUS:
+ case MINUS:
+ case INC:
+ case DEC:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_switch:
+ {
+ RefJavaAST tmp93_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp93_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp93_AST));
+ }
+ match(LITERAL_switch);
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ match(LCURLY);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == LITERAL_case || LA(1) == LITERAL_default)) {
+ casesGroup();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop95;
+ }
+
+ }
+ _loop95:;
+ } // ( ... )*
+ match(RCURLY);
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_try:
+ {
+ tryBlock();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_throw:
+ {
+ RefJavaAST tmp98_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp98_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp98_AST));
+ }
+ match(LITERAL_throw);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case SEMI:
+ {
+ s = LT(1);
+ if ( inputState->guessing == 0 ) {
+ s_AST = astFactory->create(s);
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST));
+ }
+ match(SEMI);
+ if ( inputState->guessing==0 ) {
+#line 617 "java.g"
+ s_AST->setType(EMPTY_STAT);
+#line 2451 "JavaRecognizer.cpp"
+ }
+ statement_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ bool synPredMatched89 = false;
+ if (((_tokenSet_30.member(LA(1))) && (_tokenSet_31.member(LA(2))))) {
+ int _m89 = mark();
+ synPredMatched89 = true;
+ inputState->guessing++;
+ try {
+ {
+ declaration();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched89 = false;
+ }
+ rewind(_m89);
+ inputState->guessing--;
+ }
+ if ( synPredMatched89 ) {
+ declaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ statement_AST = RefJavaAST(currentAST.root);
+ }
+ else if ((_tokenSet_32.member(LA(1))) && (_tokenSet_33.member(LA(2)))) {
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ statement_AST = RefJavaAST(currentAST.root);
+ }
+ else if ((_tokenSet_34.member(LA(1))) && (_tokenSet_35.member(LA(2)))) {
+ modifiers();
+ if (inputState->guessing==0) {
+ m_AST = returnAST;
+ }
+ classDefinition(m_AST);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ statement_AST = RefJavaAST(currentAST.root);
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == COLON)) {
+ RefJavaAST tmp102_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp102_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp102_AST));
+ }
+ match(IDENT);
+ c = LT(1);
+ if ( inputState->guessing == 0 ) {
+ c_AST = astFactory->create(c);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(c_AST));
+ }
+ match(COLON);
+ if ( inputState->guessing==0 ) {
+#line 560 "java.g"
+ c_AST->setType(LABELED_STAT);
+#line 2516 "JavaRecognizer.cpp"
+ }
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ statement_AST = RefJavaAST(currentAST.root);
+ }
+ else if ((LA(1) == LITERAL_synchronized) && (LA(2) == LPAREN)) {
+ RefJavaAST tmp103_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp103_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp103_AST));
+ }
+ match(LITERAL_synchronized);
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ compoundStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ statement_AST = RefJavaAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_28);
+ } else {
+ throw;
+ }
+ }
+ returnAST = statement_AST;
+}
+
+void JavaRecognizer::argList() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST argList_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case PLUS:
+ case MINUS:
+ case INC:
+ case DEC:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ expressionList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RPAREN:
+ {
+ if ( inputState->guessing==0 ) {
+ argList_AST = RefJavaAST(currentAST.root);
+#line 1008 "java.g"
+ argList_AST = astFactory->create(ELIST,"ELIST");
+#line 2609 "JavaRecognizer.cpp"
+ currentAST.root = argList_AST;
+ if ( argList_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ argList_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = argList_AST->getFirstChild();
+ else
+ currentAST.child = argList_AST;
+ currentAST.advanceChildToEnd();
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ argList_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_24);
+ } else {
+ throw;
+ }
+ }
+ returnAST = argList_AST;
+}
+
+/** Declaration of a variable. This can be a class/instance variable,
+ * or a local variable in a method
+ * It can also include possible initialization.
+ */
+void JavaRecognizer::variableDeclarator(
+ RefJavaAST mods, RefJavaAST t
+) {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST variableDeclarator_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken id = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST id_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST d_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST v_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ id = LT(1);
+ if ( inputState->guessing == 0 ) {
+ id_AST = astFactory->create(id);
+ }
+ match(IDENT);
+ declaratorBrackets(t);
+ if (inputState->guessing==0) {
+ d_AST = returnAST;
+ }
+ varInitializer();
+ if (inputState->guessing==0) {
+ v_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ variableDeclarator_AST = RefJavaAST(currentAST.root);
+#line 448 "java.g"
+ variableDeclarator_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(5))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(VARIABLE_DEF,"VARIABLE_DEF")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(mods))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(TYPE,"TYPE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(d_AST))))))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(id_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(v_AST))));
+#line 2672 "JavaRecognizer.cpp"
+ currentAST.root = variableDeclarator_AST;
+ if ( variableDeclarator_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ variableDeclarator_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = variableDeclarator_AST->getFirstChild();
+ else
+ currentAST.child = variableDeclarator_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_36);
+ } else {
+ throw;
+ }
+ }
+ returnAST = variableDeclarator_AST;
+}
+
+void JavaRecognizer::varInitializer() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST varInitializer_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case ASSIGN:
+ {
+ RefJavaAST tmp106_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp106_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp106_AST));
+ }
+ match(ASSIGN);
+ initializer();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case COMMA:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ varInitializer_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_36);
+ } else {
+ throw;
+ }
+ }
+ returnAST = varInitializer_AST;
+}
+
+void JavaRecognizer::initializer() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST initializer_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case PLUS:
+ case MINUS:
+ case INC:
+ case DEC:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ initializer_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LCURLY:
+ {
+ arrayInitializer();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ initializer_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_37);
+ } else {
+ throw;
+ }
+ }
+ returnAST = initializer_AST;
+}
+
+void JavaRecognizer::arrayInitializer() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST arrayInitializer_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lc = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lc_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ lc = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lc_AST = astFactory->create(lc);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lc_AST));
+ }
+ match(LCURLY);
+ if ( inputState->guessing==0 ) {
+#line 462 "java.g"
+ lc_AST->setType(ARRAY_INIT);
+#line 2826 "JavaRecognizer.cpp"
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LCURLY:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case PLUS:
+ case MINUS:
+ case INC:
+ case DEC:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ initializer();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA) && (_tokenSet_38.member(LA(2)))) {
+ match(COMMA);
+ initializer();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop69;
+ }
+
+ }
+ _loop69:;
+ } // ( ... )*
+ {
+ switch ( LA(1)) {
+ case COMMA:
+ {
+ match(COMMA);
+ break;
+ }
+ case RCURLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case RCURLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(RCURLY);
+ arrayInitializer_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_39);
+ } else {
+ throw;
+ }
+ }
+ returnAST = arrayInitializer_AST;
+}
+
+void JavaRecognizer::expression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST expression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ assignmentExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ expression_AST = RefJavaAST(currentAST.root);
+#line 715 "java.g"
+ expression_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(EXPR,"EXPR")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(expression_AST))));
+#line 2938 "JavaRecognizer.cpp"
+ currentAST.root = expression_AST;
+ if ( expression_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ expression_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = expression_AST->getFirstChild();
+ else
+ currentAST.child = expression_AST;
+ currentAST.advanceChildToEnd();
+ }
+ expression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_40);
+ } else {
+ throw;
+ }
+ }
+ returnAST = expression_AST;
+}
+
+void JavaRecognizer::parameterDeclaration() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST parameterDeclaration_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST pm_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST t_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken id = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST id_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefJavaAST pd_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ parameterModifier();
+ if (inputState->guessing==0) {
+ pm_AST = returnAST;
+ }
+ typeSpec(false);
+ if (inputState->guessing==0) {
+ t_AST = returnAST;
+ }
+ id = LT(1);
+ if ( inputState->guessing == 0 ) {
+ id_AST = astFactory->create(id);
+ }
+ match(IDENT);
+ declaratorBrackets(t_AST);
+ if (inputState->guessing==0) {
+ pd_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ parameterDeclaration_AST = RefJavaAST(currentAST.root);
+#line 516 "java.g"
+ parameterDeclaration_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(4))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(PARAMETER_DEF,"PARAMETER_DEF")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(pm_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(TYPE,"TYPE")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(pd_AST))))))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(id_AST))));
+#line 2992 "JavaRecognizer.cpp"
+ currentAST.root = parameterDeclaration_AST;
+ if ( parameterDeclaration_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ parameterDeclaration_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = parameterDeclaration_AST->getFirstChild();
+ else
+ currentAST.child = parameterDeclaration_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_41);
+ } else {
+ throw;
+ }
+ }
+ returnAST = parameterDeclaration_AST;
+}
+
+void JavaRecognizer::parameterModifier() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST parameterModifier_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken f = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST f_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case FINAL:
+ {
+ f = LT(1);
+ if ( inputState->guessing == 0 ) {
+ f_AST = astFactory->create(f);
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(f_AST));
+ }
+ match(FINAL);
+ break;
+ }
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ parameterModifier_AST = RefJavaAST(currentAST.root);
+#line 522 "java.g"
+ parameterModifier_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(MODIFIERS,"MODIFIERS")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(f_AST))));
+#line 3056 "JavaRecognizer.cpp"
+ currentAST.root = parameterModifier_AST;
+ if ( parameterModifier_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ parameterModifier_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = parameterModifier_AST->getFirstChild();
+ else
+ currentAST.child = parameterModifier_AST;
+ currentAST.advanceChildToEnd();
+ }
+ parameterModifier_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_42);
+ } else {
+ throw;
+ }
+ }
+ returnAST = parameterModifier_AST;
+}
+
+void JavaRecognizer::forInit() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST forInit_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ bool synPredMatched107 = false;
+ if (((_tokenSet_30.member(LA(1))) && (_tokenSet_31.member(LA(2))))) {
+ int _m107 = mark();
+ synPredMatched107 = true;
+ inputState->guessing++;
+ try {
+ {
+ declaration();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched107 = false;
+ }
+ rewind(_m107);
+ inputState->guessing--;
+ }
+ if ( synPredMatched107 ) {
+ declaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((_tokenSet_32.member(LA(1))) && (_tokenSet_43.member(LA(2)))) {
+ expressionList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((LA(1) == SEMI)) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ if ( inputState->guessing==0 ) {
+ forInit_AST = RefJavaAST(currentAST.root);
+#line 651 "java.g"
+ forInit_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(FOR_INIT,"FOR_INIT")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(forInit_AST))));
+#line 3124 "JavaRecognizer.cpp"
+ currentAST.root = forInit_AST;
+ if ( forInit_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ forInit_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = forInit_AST->getFirstChild();
+ else
+ currentAST.child = forInit_AST;
+ currentAST.advanceChildToEnd();
+ }
+ forInit_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_5);
+ } else {
+ throw;
+ }
+ }
+ returnAST = forInit_AST;
+}
+
+void JavaRecognizer::forCond() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST forCond_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case PLUS:
+ case MINUS:
+ case INC:
+ case DEC:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ forCond_AST = RefJavaAST(currentAST.root);
+#line 656 "java.g"
+ forCond_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(FOR_CONDITION,"FOR_CONDITION")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(forCond_AST))));
+#line 3204 "JavaRecognizer.cpp"
+ currentAST.root = forCond_AST;
+ if ( forCond_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ forCond_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = forCond_AST->getFirstChild();
+ else
+ currentAST.child = forCond_AST;
+ currentAST.advanceChildToEnd();
+ }
+ forCond_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_5);
+ } else {
+ throw;
+ }
+ }
+ returnAST = forCond_AST;
+}
+
+void JavaRecognizer::forIter() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST forIter_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case PLUS:
+ case MINUS:
+ case INC:
+ case DEC:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ expressionList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RPAREN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ if ( inputState->guessing==0 ) {
+ forIter_AST = RefJavaAST(currentAST.root);
+#line 661 "java.g"
+ forIter_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(FOR_ITERATOR,"FOR_ITERATOR")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(forIter_AST))));
+#line 3284 "JavaRecognizer.cpp"
+ currentAST.root = forIter_AST;
+ if ( forIter_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ forIter_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = forIter_AST->getFirstChild();
+ else
+ currentAST.child = forIter_AST;
+ currentAST.advanceChildToEnd();
+ }
+ forIter_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_24);
+ } else {
+ throw;
+ }
+ }
+ returnAST = forIter_AST;
+}
+
+void JavaRecognizer::casesGroup() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST casesGroup_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ { // ( ... )+
+ int _cnt98=0;
+ for (;;) {
+ if ((LA(1) == LITERAL_case || LA(1) == LITERAL_default) && (_tokenSet_44.member(LA(2)))) {
+ aCase();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ if ( _cnt98>=1 ) { goto _loop98; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt98++;
+ }
+ _loop98:;
+ } // ( ... )+
+ caseSList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ if ( inputState->guessing==0 ) {
+ casesGroup_AST = RefJavaAST(currentAST.root);
+#line 632 "java.g"
+ casesGroup_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(CASE_GROUP,"CASE_GROUP")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(casesGroup_AST))));
+#line 3337 "JavaRecognizer.cpp"
+ currentAST.root = casesGroup_AST;
+ if ( casesGroup_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ casesGroup_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = casesGroup_AST->getFirstChild();
+ else
+ currentAST.child = casesGroup_AST;
+ currentAST.advanceChildToEnd();
+ }
+ casesGroup_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_45);
+ } else {
+ throw;
+ }
+ }
+ returnAST = casesGroup_AST;
+}
+
+void JavaRecognizer::tryBlock() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST tryBlock_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST tmp110_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp110_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp110_AST));
+ }
+ match(LITERAL_try);
+ compoundStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == LITERAL_catch)) {
+ handler();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop114;
+ }
+
+ }
+ _loop114:;
+ } // ( ... )*
+ {
+ switch ( LA(1)) {
+ case LITERAL_finally:
+ {
+ finallyClause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case FINAL:
+ case ABSTRACT:
+ case STRICTFP:
+ case SEMI:
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LITERAL_private:
+ case LITERAL_public:
+ case LITERAL_protected:
+ case LITERAL_static:
+ case LITERAL_transient:
+ case LITERAL_native:
+ case LITERAL_threadsafe:
+ case LITERAL_synchronized:
+ case LITERAL_volatile:
+ case LITERAL_class:
+ case LCURLY:
+ case RCURLY:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case LITERAL_if:
+ case LITERAL_else:
+ case LITERAL_for:
+ case LITERAL_while:
+ case LITERAL_do:
+ case LITERAL_break:
+ case LITERAL_continue:
+ case LITERAL_return:
+ case LITERAL_switch:
+ case LITERAL_throw:
+ case LITERAL_case:
+ case LITERAL_default:
+ case LITERAL_try:
+ case PLUS:
+ case MINUS:
+ case INC:
+ case DEC:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ tryBlock_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_28);
+ } else {
+ throw;
+ }
+ }
+ returnAST = tryBlock_AST;
+}
+
+void JavaRecognizer::aCase() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST aCase_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LITERAL_case:
+ {
+ RefJavaAST tmp111_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp111_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp111_AST));
+ }
+ match(LITERAL_case);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case LITERAL_default:
+ {
+ RefJavaAST tmp112_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp112_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp112_AST));
+ }
+ match(LITERAL_default);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(COLON);
+ aCase_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_46);
+ } else {
+ throw;
+ }
+ }
+ returnAST = aCase_AST;
+}
+
+void JavaRecognizer::caseSList() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST caseSList_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_23.member(LA(1)))) {
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop103;
+ }
+
+ }
+ _loop103:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ caseSList_AST = RefJavaAST(currentAST.root);
+#line 641 "java.g"
+ caseSList_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(SLIST,"SLIST")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(caseSList_AST))));
+#line 3557 "JavaRecognizer.cpp"
+ currentAST.root = caseSList_AST;
+ if ( caseSList_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ caseSList_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = caseSList_AST->getFirstChild();
+ else
+ currentAST.child = caseSList_AST;
+ currentAST.advanceChildToEnd();
+ }
+ caseSList_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_45);
+ } else {
+ throw;
+ }
+ }
+ returnAST = caseSList_AST;
+}
+
+void JavaRecognizer::expressionList() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST expressionList_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop121;
+ }
+
+ }
+ _loop121:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ expressionList_AST = RefJavaAST(currentAST.root);
+#line 721 "java.g"
+ expressionList_AST = RefJavaAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(ELIST,"ELIST")))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(expressionList_AST))));
+#line 3609 "JavaRecognizer.cpp"
+ currentAST.root = expressionList_AST;
+ if ( expressionList_AST!=RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ expressionList_AST->getFirstChild() != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = expressionList_AST->getFirstChild();
+ else
+ currentAST.child = expressionList_AST;
+ currentAST.advanceChildToEnd();
+ }
+ expressionList_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_47);
+ } else {
+ throw;
+ }
+ }
+ returnAST = expressionList_AST;
+}
+
+void JavaRecognizer::handler() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST handler_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST tmp115_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp115_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp115_AST));
+ }
+ match(LITERAL_catch);
+ match(LPAREN);
+ parameterDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ compoundStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ handler_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_48);
+ } else {
+ throw;
+ }
+ }
+ returnAST = handler_AST;
+}
+
+void JavaRecognizer::finallyClause() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST finallyClause_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST tmp118_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp118_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp118_AST));
+ }
+ match(LITERAL_finally);
+ compoundStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ finallyClause_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_28);
+ } else {
+ throw;
+ }
+ }
+ returnAST = finallyClause_AST;
+}
+
+void JavaRecognizer::assignmentExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST assignmentExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ conditionalExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case ASSIGN:
+ case PLUS_ASSIGN:
+ case MINUS_ASSIGN:
+ case STAR_ASSIGN:
+ case DIV_ASSIGN:
+ case MOD_ASSIGN:
+ case SR_ASSIGN:
+ case BSR_ASSIGN:
+ case SL_ASSIGN:
+ case BAND_ASSIGN:
+ case BXOR_ASSIGN:
+ case BOR_ASSIGN:
+ {
+ {
+ switch ( LA(1)) {
+ case ASSIGN:
+ {
+ RefJavaAST tmp119_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp119_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp119_AST));
+ }
+ match(ASSIGN);
+ break;
+ }
+ case PLUS_ASSIGN:
+ {
+ RefJavaAST tmp120_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp120_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp120_AST));
+ }
+ match(PLUS_ASSIGN);
+ break;
+ }
+ case MINUS_ASSIGN:
+ {
+ RefJavaAST tmp121_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp121_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp121_AST));
+ }
+ match(MINUS_ASSIGN);
+ break;
+ }
+ case STAR_ASSIGN:
+ {
+ RefJavaAST tmp122_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp122_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp122_AST));
+ }
+ match(STAR_ASSIGN);
+ break;
+ }
+ case DIV_ASSIGN:
+ {
+ RefJavaAST tmp123_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp123_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp123_AST));
+ }
+ match(DIV_ASSIGN);
+ break;
+ }
+ case MOD_ASSIGN:
+ {
+ RefJavaAST tmp124_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp124_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp124_AST));
+ }
+ match(MOD_ASSIGN);
+ break;
+ }
+ case SR_ASSIGN:
+ {
+ RefJavaAST tmp125_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp125_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp125_AST));
+ }
+ match(SR_ASSIGN);
+ break;
+ }
+ case BSR_ASSIGN:
+ {
+ RefJavaAST tmp126_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp126_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp126_AST));
+ }
+ match(BSR_ASSIGN);
+ break;
+ }
+ case SL_ASSIGN:
+ {
+ RefJavaAST tmp127_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp127_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp127_AST));
+ }
+ match(SL_ASSIGN);
+ break;
+ }
+ case BAND_ASSIGN:
+ {
+ RefJavaAST tmp128_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp128_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp128_AST));
+ }
+ match(BAND_ASSIGN);
+ break;
+ }
+ case BXOR_ASSIGN:
+ {
+ RefJavaAST tmp129_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp129_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp129_AST));
+ }
+ match(BXOR_ASSIGN);
+ break;
+ }
+ case BOR_ASSIGN:
+ {
+ RefJavaAST tmp130_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp130_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp130_AST));
+ }
+ match(BOR_ASSIGN);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ assignmentExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case RBRACK:
+ case RCURLY:
+ case COMMA:
+ case RPAREN:
+ case COLON:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ assignmentExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_40);
+ } else {
+ throw;
+ }
+ }
+ returnAST = assignmentExpression_AST;
+}
+
+void JavaRecognizer::conditionalExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST conditionalExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ logicalOrExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case QUESTION:
+ {
+ RefJavaAST tmp131_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp131_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp131_AST));
+ }
+ match(QUESTION);
+ assignmentExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ conditionalExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case RBRACK:
+ case RCURLY:
+ case COMMA:
+ case RPAREN:
+ case ASSIGN:
+ case COLON:
+ case PLUS_ASSIGN:
+ case MINUS_ASSIGN:
+ case STAR_ASSIGN:
+ case DIV_ASSIGN:
+ case MOD_ASSIGN:
+ case SR_ASSIGN:
+ case BSR_ASSIGN:
+ case SL_ASSIGN:
+ case BAND_ASSIGN:
+ case BXOR_ASSIGN:
+ case BOR_ASSIGN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ conditionalExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_49);
+ } else {
+ throw;
+ }
+ }
+ returnAST = conditionalExpression_AST;
+}
+
+void JavaRecognizer::logicalOrExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST logicalOrExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ logicalAndExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == LOR)) {
+ RefJavaAST tmp133_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp133_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp133_AST));
+ }
+ match(LOR);
+ logicalAndExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop129;
+ }
+
+ }
+ _loop129:;
+ } // ( ... )*
+ logicalOrExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_50);
+ } else {
+ throw;
+ }
+ }
+ returnAST = logicalOrExpression_AST;
+}
+
+void JavaRecognizer::logicalAndExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST logicalAndExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ inclusiveOrExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == LAND)) {
+ RefJavaAST tmp134_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp134_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp134_AST));
+ }
+ match(LAND);
+ inclusiveOrExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop132;
+ }
+
+ }
+ _loop132:;
+ } // ( ... )*
+ logicalAndExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_51);
+ } else {
+ throw;
+ }
+ }
+ returnAST = logicalAndExpression_AST;
+}
+
+void JavaRecognizer::inclusiveOrExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST inclusiveOrExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ exclusiveOrExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == BOR)) {
+ RefJavaAST tmp135_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp135_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp135_AST));
+ }
+ match(BOR);
+ exclusiveOrExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop135;
+ }
+
+ }
+ _loop135:;
+ } // ( ... )*
+ inclusiveOrExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_52);
+ } else {
+ throw;
+ }
+ }
+ returnAST = inclusiveOrExpression_AST;
+}
+
+void JavaRecognizer::exclusiveOrExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST exclusiveOrExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ andExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == BXOR)) {
+ RefJavaAST tmp136_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp136_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp136_AST));
+ }
+ match(BXOR);
+ andExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop138;
+ }
+
+ }
+ _loop138:;
+ } // ( ... )*
+ exclusiveOrExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_53);
+ } else {
+ throw;
+ }
+ }
+ returnAST = exclusiveOrExpression_AST;
+}
+
+void JavaRecognizer::andExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST andExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ equalityExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == BAND)) {
+ RefJavaAST tmp137_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp137_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp137_AST));
+ }
+ match(BAND);
+ equalityExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop141;
+ }
+
+ }
+ _loop141:;
+ } // ( ... )*
+ andExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_54);
+ } else {
+ throw;
+ }
+ }
+ returnAST = andExpression_AST;
+}
+
+void JavaRecognizer::equalityExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST equalityExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ relationalExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == NOT_EQUAL || LA(1) == EQUAL)) {
+ {
+ switch ( LA(1)) {
+ case NOT_EQUAL:
+ {
+ RefJavaAST tmp138_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp138_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp138_AST));
+ }
+ match(NOT_EQUAL);
+ break;
+ }
+ case EQUAL:
+ {
+ RefJavaAST tmp139_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp139_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp139_AST));
+ }
+ match(EQUAL);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ relationalExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop145;
+ }
+
+ }
+ _loop145:;
+ } // ( ... )*
+ equalityExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_55);
+ } else {
+ throw;
+ }
+ }
+ returnAST = equalityExpression_AST;
+}
+
+void JavaRecognizer::relationalExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST relationalExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ shiftExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case SEMI:
+ case RBRACK:
+ case RCURLY:
+ case COMMA:
+ case RPAREN:
+ case ASSIGN:
+ case COLON:
+ case PLUS_ASSIGN:
+ case MINUS_ASSIGN:
+ case STAR_ASSIGN:
+ case DIV_ASSIGN:
+ case MOD_ASSIGN:
+ case SR_ASSIGN:
+ case BSR_ASSIGN:
+ case SL_ASSIGN:
+ case BAND_ASSIGN:
+ case BXOR_ASSIGN:
+ case BOR_ASSIGN:
+ case QUESTION:
+ case LOR:
+ case LAND:
+ case BOR:
+ case BXOR:
+ case BAND:
+ case NOT_EQUAL:
+ case EQUAL:
+ case LT_:
+ case GT:
+ case LE:
+ case GE:
+ {
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= LT_ && LA(1) <= GE))) {
+ {
+ switch ( LA(1)) {
+ case LT_:
+ {
+ RefJavaAST tmp140_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp140_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp140_AST));
+ }
+ match(LT_);
+ break;
+ }
+ case GT:
+ {
+ RefJavaAST tmp141_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp141_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp141_AST));
+ }
+ match(GT);
+ break;
+ }
+ case LE:
+ {
+ RefJavaAST tmp142_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp142_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp142_AST));
+ }
+ match(LE);
+ break;
+ }
+ case GE:
+ {
+ RefJavaAST tmp143_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp143_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp143_AST));
+ }
+ match(GE);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ shiftExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop150;
+ }
+
+ }
+ _loop150:;
+ } // ( ... )*
+ break;
+ }
+ case LITERAL_instanceof:
+ {
+ RefJavaAST tmp144_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp144_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp144_AST));
+ }
+ match(LITERAL_instanceof);
+ typeSpec(true);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ relationalExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_56);
+ } else {
+ throw;
+ }
+ }
+ returnAST = relationalExpression_AST;
+}
+
+void JavaRecognizer::shiftExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST shiftExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ additiveExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= SL && LA(1) <= BSR))) {
+ {
+ switch ( LA(1)) {
+ case SL:
+ {
+ RefJavaAST tmp145_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp145_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp145_AST));
+ }
+ match(SL);
+ break;
+ }
+ case SR:
+ {
+ RefJavaAST tmp146_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp146_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp146_AST));
+ }
+ match(SR);
+ break;
+ }
+ case BSR:
+ {
+ RefJavaAST tmp147_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp147_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp147_AST));
+ }
+ match(BSR);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ additiveExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop154;
+ }
+
+ }
+ _loop154:;
+ } // ( ... )*
+ shiftExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_57);
+ } else {
+ throw;
+ }
+ }
+ returnAST = shiftExpression_AST;
+}
+
+void JavaRecognizer::additiveExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST additiveExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ multiplicativeExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == PLUS || LA(1) == MINUS)) {
+ {
+ switch ( LA(1)) {
+ case PLUS:
+ {
+ RefJavaAST tmp148_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp148_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp148_AST));
+ }
+ match(PLUS);
+ break;
+ }
+ case MINUS:
+ {
+ RefJavaAST tmp149_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp149_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp149_AST));
+ }
+ match(MINUS);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ multiplicativeExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop158;
+ }
+
+ }
+ _loop158:;
+ } // ( ... )*
+ additiveExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_58);
+ } else {
+ throw;
+ }
+ }
+ returnAST = additiveExpression_AST;
+}
+
+void JavaRecognizer::multiplicativeExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST multiplicativeExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ unaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_59.member(LA(1)))) {
+ {
+ switch ( LA(1)) {
+ case STAR:
+ {
+ RefJavaAST tmp150_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp150_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp150_AST));
+ }
+ match(STAR);
+ break;
+ }
+ case DIV:
+ {
+ RefJavaAST tmp151_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp151_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp151_AST));
+ }
+ match(DIV);
+ break;
+ }
+ case MOD:
+ {
+ RefJavaAST tmp152_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp152_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp152_AST));
+ }
+ match(MOD);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ unaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop162;
+ }
+
+ }
+ _loop162:;
+ } // ( ... )*
+ multiplicativeExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_60);
+ } else {
+ throw;
+ }
+ }
+ returnAST = multiplicativeExpression_AST;
+}
+
+void JavaRecognizer::unaryExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST unaryExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case INC:
+ {
+ RefJavaAST tmp153_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp153_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp153_AST));
+ }
+ match(INC);
+ unaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case DEC:
+ {
+ RefJavaAST tmp154_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp154_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp154_AST));
+ }
+ match(DEC);
+ unaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case MINUS:
+ {
+ RefJavaAST tmp155_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp155_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp155_AST));
+ }
+ match(MINUS);
+ if ( inputState->guessing==0 ) {
+#line 812 "java.g"
+ tmp155_AST->setType(UNARY_MINUS);
+#line 4646 "JavaRecognizer.cpp"
+ }
+ unaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case PLUS:
+ {
+ RefJavaAST tmp156_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp156_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp156_AST));
+ }
+ match(PLUS);
+ if ( inputState->guessing==0 ) {
+#line 813 "java.g"
+ tmp156_AST->setType(UNARY_PLUS);
+#line 4666 "JavaRecognizer.cpp"
+ }
+ unaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ unaryExpressionNotPlusMinus();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_61);
+ } else {
+ throw;
+ }
+ }
+ returnAST = unaryExpression_AST;
+}
+
+void JavaRecognizer::unaryExpressionNotPlusMinus() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST unaryExpressionNotPlusMinus_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lpb = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lpb_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lp = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lp_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case BNOT:
+ {
+ RefJavaAST tmp157_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp157_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp157_AST));
+ }
+ match(BNOT);
+ unaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unaryExpressionNotPlusMinus_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LNOT:
+ {
+ RefJavaAST tmp158_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp158_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp158_AST));
+ }
+ match(LNOT);
+ unaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unaryExpressionNotPlusMinus_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ {
+ if ((LA(1) == LPAREN) && ((LA(2) >= LITERAL_void && LA(2) <= LITERAL_double))) {
+ lpb = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lpb_AST = astFactory->create(lpb);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lpb_AST));
+ }
+ match(LPAREN);
+ if ( inputState->guessing==0 ) {
+#line 829 "java.g"
+ lpb_AST->setType(TYPECAST);
+#line 4801 "JavaRecognizer.cpp"
+ }
+ builtInTypeSpec(true);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ unaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ bool synPredMatched167 = false;
+ if (((LA(1) == LPAREN) && (LA(2) == IDENT))) {
+ int _m167 = mark();
+ synPredMatched167 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(LPAREN);
+ classTypeSpec(true);
+ match(RPAREN);
+ unaryExpressionNotPlusMinus();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched167 = false;
+ }
+ rewind(_m167);
+ inputState->guessing--;
+ }
+ if ( synPredMatched167 ) {
+ lp = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lp_AST = astFactory->create(lp);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lp_AST));
+ }
+ match(LPAREN);
+ if ( inputState->guessing==0 ) {
+#line 836 "java.g"
+ lp_AST->setType(TYPECAST);
+#line 4843 "JavaRecognizer.cpp"
+ }
+ classTypeSpec(true);
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ unaryExpressionNotPlusMinus();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((_tokenSet_62.member(LA(1))) && (_tokenSet_63.member(LA(2)))) {
+ postfixExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ unaryExpressionNotPlusMinus_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_61);
+ } else {
+ throw;
+ }
+ }
+ returnAST = unaryExpressionNotPlusMinus_AST;
+}
+
+void JavaRecognizer::postfixExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST postfixExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lp = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lp_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lp3 = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lp3_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lps = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lps_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lb = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lb_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken in = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST in_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken de = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST de_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ primaryExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == DOT) && (LA(2) == IDENT)) {
+ RefJavaAST tmp161_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp161_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp161_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp162_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp162_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp162_AST));
+ }
+ match(IDENT);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ lp = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lp_AST = astFactory->create(lp);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lp_AST));
+ }
+ match(LPAREN);
+ if ( inputState->guessing==0 ) {
+#line 867 "java.g"
+ lp_AST->setType(METHOD_CALL);
+#line 4936 "JavaRecognizer.cpp"
+ }
+ argList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ break;
+ }
+ case SEMI:
+ case LBRACK:
+ case RBRACK:
+ case DOT:
+ case STAR:
+ case RCURLY:
+ case COMMA:
+ case RPAREN:
+ case ASSIGN:
+ case COLON:
+ case PLUS_ASSIGN:
+ case MINUS_ASSIGN:
+ case STAR_ASSIGN:
+ case DIV_ASSIGN:
+ case MOD_ASSIGN:
+ case SR_ASSIGN:
+ case BSR_ASSIGN:
+ case SL_ASSIGN:
+ case BAND_ASSIGN:
+ case BXOR_ASSIGN:
+ case BOR_ASSIGN:
+ case QUESTION:
+ case LOR:
+ case LAND:
+ case BOR:
+ case BXOR:
+ case BAND:
+ case NOT_EQUAL:
+ case EQUAL:
+ case LT_:
+ case GT:
+ case LE:
+ case GE:
+ case LITERAL_instanceof:
+ case SL:
+ case SR:
+ case BSR:
+ case PLUS:
+ case MINUS:
+ case DIV:
+ case MOD:
+ case INC:
+ case DEC:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else if ((LA(1) == DOT) && (LA(2) == LITERAL_this)) {
+ RefJavaAST tmp164_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp164_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp164_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp165_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp165_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp165_AST));
+ }
+ match(LITERAL_this);
+ }
+ else if ((LA(1) == DOT) && (LA(2) == LITERAL_super)) {
+ RefJavaAST tmp166_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp166_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp166_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp167_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp167_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp167_AST));
+ }
+ match(LITERAL_super);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ lp3 = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lp3_AST = astFactory->create(lp3);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lp3_AST));
+ }
+ match(LPAREN);
+ argList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ if ( inputState->guessing==0 ) {
+#line 876 "java.g"
+ lp3_AST->setType(SUPER_CTOR_CALL);
+#line 5043 "JavaRecognizer.cpp"
+ }
+ break;
+ }
+ case DOT:
+ {
+ RefJavaAST tmp169_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp169_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp169_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp170_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp170_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp170_AST));
+ }
+ match(IDENT);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ lps = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lps_AST = astFactory->create(lps);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lps_AST));
+ }
+ match(LPAREN);
+ if ( inputState->guessing==0 ) {
+#line 878 "java.g"
+ lps_AST->setType(METHOD_CALL);
+#line 5074 "JavaRecognizer.cpp"
+ }
+ argList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ break;
+ }
+ case SEMI:
+ case LBRACK:
+ case RBRACK:
+ case DOT:
+ case STAR:
+ case RCURLY:
+ case COMMA:
+ case RPAREN:
+ case ASSIGN:
+ case COLON:
+ case PLUS_ASSIGN:
+ case MINUS_ASSIGN:
+ case STAR_ASSIGN:
+ case DIV_ASSIGN:
+ case MOD_ASSIGN:
+ case SR_ASSIGN:
+ case BSR_ASSIGN:
+ case SL_ASSIGN:
+ case BAND_ASSIGN:
+ case BXOR_ASSIGN:
+ case BOR_ASSIGN:
+ case QUESTION:
+ case LOR:
+ case LAND:
+ case BOR:
+ case BXOR:
+ case BAND:
+ case NOT_EQUAL:
+ case EQUAL:
+ case LT_:
+ case GT:
+ case LE:
+ case GE:
+ case LITERAL_instanceof:
+ case SL:
+ case SR:
+ case BSR:
+ case PLUS:
+ case MINUS:
+ case DIV:
+ case MOD:
+ case INC:
+ case DEC:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else if ((LA(1) == DOT) && (LA(2) == LITERAL_new)) {
+ RefJavaAST tmp172_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp172_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp172_AST));
+ }
+ match(DOT);
+ newExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((LA(1) == LBRACK)) {
+ lb = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lb_AST = astFactory->create(lb);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lb_AST));
+ }
+ match(LBRACK);
+ if ( inputState->guessing==0 ) {
+#line 884 "java.g"
+ lb_AST->setType(INDEX_OP);
+#line 5166 "JavaRecognizer.cpp"
+ }
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RBRACK);
+ }
+ else {
+ goto _loop173;
+ }
+
+ }
+ _loop173:;
+ } // ( ... )*
+ {
+ switch ( LA(1)) {
+ case INC:
+ {
+ in = LT(1);
+ if ( inputState->guessing == 0 ) {
+ in_AST = astFactory->create(in);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(in_AST));
+ }
+ match(INC);
+ if ( inputState->guessing==0 ) {
+#line 889 "java.g"
+ in_AST->setType(POST_INC);
+#line 5194 "JavaRecognizer.cpp"
+ }
+ break;
+ }
+ case DEC:
+ {
+ de = LT(1);
+ if ( inputState->guessing == 0 ) {
+ de_AST = astFactory->create(de);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(de_AST));
+ }
+ match(DEC);
+ if ( inputState->guessing==0 ) {
+#line 890 "java.g"
+ de_AST->setType(POST_DEC);
+#line 5209 "JavaRecognizer.cpp"
+ }
+ break;
+ }
+ case SEMI:
+ case RBRACK:
+ case STAR:
+ case RCURLY:
+ case COMMA:
+ case RPAREN:
+ case ASSIGN:
+ case COLON:
+ case PLUS_ASSIGN:
+ case MINUS_ASSIGN:
+ case STAR_ASSIGN:
+ case DIV_ASSIGN:
+ case MOD_ASSIGN:
+ case SR_ASSIGN:
+ case BSR_ASSIGN:
+ case SL_ASSIGN:
+ case BAND_ASSIGN:
+ case BXOR_ASSIGN:
+ case BOR_ASSIGN:
+ case QUESTION:
+ case LOR:
+ case LAND:
+ case BOR:
+ case BXOR:
+ case BAND:
+ case NOT_EQUAL:
+ case EQUAL:
+ case LT_:
+ case GT:
+ case LE:
+ case GE:
+ case LITERAL_instanceof:
+ case SL:
+ case SR:
+ case BSR:
+ case PLUS:
+ case MINUS:
+ case DIV:
+ case MOD:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ postfixExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_61);
+ } else {
+ throw;
+ }
+ }
+ returnAST = postfixExpression_AST;
+}
+
+void JavaRecognizer::primaryExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST primaryExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lbt = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lbt_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ identPrimary();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ if ((LA(1) == DOT) && (LA(2) == LITERAL_class)) {
+ RefJavaAST tmp174_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp174_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp174_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp175_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp175_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp175_AST));
+ }
+ match(LITERAL_class);
+ }
+ else if ((_tokenSet_39.member(LA(1))) && (_tokenSet_64.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_true:
+ {
+ RefJavaAST tmp176_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp176_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp176_AST));
+ }
+ match(LITERAL_true);
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_false:
+ {
+ RefJavaAST tmp177_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp177_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp177_AST));
+ }
+ match(LITERAL_false);
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_null:
+ {
+ RefJavaAST tmp178_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp178_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp178_AST));
+ }
+ match(LITERAL_null);
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_new:
+ {
+ newExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_this:
+ {
+ RefJavaAST tmp179_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp179_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp179_AST));
+ }
+ match(LITERAL_this);
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_super:
+ {
+ RefJavaAST tmp180_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp180_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp180_AST));
+ }
+ match(LITERAL_super);
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LPAREN:
+ {
+ match(LPAREN);
+ assignmentExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ {
+ builtInType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == LBRACK)) {
+ lbt = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lbt_AST = astFactory->create(lbt);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lbt_AST));
+ }
+ match(LBRACK);
+ if ( inputState->guessing==0 ) {
+#line 907 "java.g"
+ lbt_AST->setType(ARRAY_DECLARATOR);
+#line 5429 "JavaRecognizer.cpp"
+ }
+ match(RBRACK);
+ }
+ else {
+ goto _loop178;
+ }
+
+ }
+ _loop178:;
+ } // ( ... )*
+ RefJavaAST tmp184_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp184_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp184_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp185_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp185_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp185_AST));
+ }
+ match(LITERAL_class);
+ primaryExpression_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_39);
+ } else {
+ throw;
+ }
+ }
+ returnAST = primaryExpression_AST;
+}
+
+/** object instantiation.
+ * Trees are built as illustrated by the following input/tree pairs:
+ *
+ * new T()
+ *
+ * new
+ * |
+ * T -- ELIST
+ * |
+ * arg1 -- arg2 -- .. -- argn
+ *
+ * new int[]
+ *
+ * new
+ * |
+ * int -- ARRAY_DECLARATOR
+ *
+ * new int[] {1,2}
+ *
+ * new
+ * |
+ * int -- ARRAY_DECLARATOR -- ARRAY_INIT
+ * |
+ * EXPR -- EXPR
+ * | |
+ * 1 2
+ *
+ * new int[3]
+ * new
+ * |
+ * int -- ARRAY_DECLARATOR
+ * |
+ * EXPR
+ * |
+ * 3
+ *
+ * new int[1][2]
+ *
+ * new
+ * |
+ * int -- ARRAY_DECLARATOR
+ * |
+ * ARRAY_DECLARATOR -- EXPR
+ * | |
+ * EXPR 1
+ * |
+ * 2
+ *
+ */
+void JavaRecognizer::newExpression() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST newExpression_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST tmp186_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp186_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp186_AST));
+ }
+ match(LITERAL_new);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ argList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ {
+ switch ( LA(1)) {
+ case LCURLY:
+ {
+ classBlock();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case LBRACK:
+ case RBRACK:
+ case DOT:
+ case STAR:
+ case RCURLY:
+ case COMMA:
+ case RPAREN:
+ case ASSIGN:
+ case COLON:
+ case PLUS_ASSIGN:
+ case MINUS_ASSIGN:
+ case STAR_ASSIGN:
+ case DIV_ASSIGN:
+ case MOD_ASSIGN:
+ case SR_ASSIGN:
+ case BSR_ASSIGN:
+ case SL_ASSIGN:
+ case BAND_ASSIGN:
+ case BXOR_ASSIGN:
+ case BOR_ASSIGN:
+ case QUESTION:
+ case LOR:
+ case LAND:
+ case BOR:
+ case BXOR:
+ case BAND:
+ case NOT_EQUAL:
+ case EQUAL:
+ case LT_:
+ case GT:
+ case LE:
+ case GE:
+ case LITERAL_instanceof:
+ case SL:
+ case SR:
+ case BSR:
+ case PLUS:
+ case MINUS:
+ case DIV:
+ case MOD:
+ case INC:
+ case DEC:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case LBRACK:
+ {
+ newArrayDeclarator();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case LCURLY:
+ {
+ arrayInitializer();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case LBRACK:
+ case RBRACK:
+ case DOT:
+ case STAR:
+ case RCURLY:
+ case COMMA:
+ case RPAREN:
+ case ASSIGN:
+ case COLON:
+ case PLUS_ASSIGN:
+ case MINUS_ASSIGN:
+ case STAR_ASSIGN:
+ case DIV_ASSIGN:
+ case MOD_ASSIGN:
+ case SR_ASSIGN:
+ case BSR_ASSIGN:
+ case SL_ASSIGN:
+ case BAND_ASSIGN:
+ case BXOR_ASSIGN:
+ case BOR_ASSIGN:
+ case QUESTION:
+ case LOR:
+ case LAND:
+ case BOR:
+ case BXOR:
+ case BAND:
+ case NOT_EQUAL:
+ case EQUAL:
+ case LT_:
+ case GT:
+ case LE:
+ case GE:
+ case LITERAL_instanceof:
+ case SL:
+ case SR:
+ case BSR:
+ case PLUS:
+ case MINUS:
+ case DIV:
+ case MOD:
+ case INC:
+ case DEC:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ newExpression_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_39);
+ } else {
+ throw;
+ }
+ }
+ returnAST = newExpression_AST;
+}
+
+/** Match a, a.b.c refs, a.b.c(...) refs, a.b.c[], a.b.c[].class,
+ * and a.b.c.class refs. Also this(...) and super(...). Match
+ * this or super.
+ */
+void JavaRecognizer::identPrimary() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST identPrimary_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lp = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lp_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lbc = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lbc_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST tmp189_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp189_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp189_AST));
+ }
+ match(IDENT);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == DOT) && (LA(2) == IDENT)) {
+ RefJavaAST tmp190_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp190_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp190_AST));
+ }
+ match(DOT);
+ RefJavaAST tmp191_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp191_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp191_AST));
+ }
+ match(IDENT);
+ }
+ else {
+ goto _loop181;
+ }
+
+ }
+ _loop181:;
+ } // ( ... )*
+ {
+ if ((LA(1) == LPAREN)) {
+ {
+ lp = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lp_AST = astFactory->create(lp);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lp_AST));
+ }
+ match(LPAREN);
+ if ( inputState->guessing==0 ) {
+#line 933 "java.g"
+ lp_AST->setType(METHOD_CALL);
+#line 5755 "JavaRecognizer.cpp"
+ }
+ argList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ }
+ }
+ else if ((LA(1) == LBRACK) && (LA(2) == RBRACK)) {
+ { // ( ... )+
+ int _cnt185=0;
+ for (;;) {
+ if ((LA(1) == LBRACK) && (LA(2) == RBRACK)) {
+ lbc = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lbc_AST = astFactory->create(lbc);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lbc_AST));
+ }
+ match(LBRACK);
+ if ( inputState->guessing==0 ) {
+#line 935 "java.g"
+ lbc_AST->setType(ARRAY_DECLARATOR);
+#line 5778 "JavaRecognizer.cpp"
+ }
+ match(RBRACK);
+ }
+ else {
+ if ( _cnt185>=1 ) { goto _loop185; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt185++;
+ }
+ _loop185:;
+ } // ( ... )+
+ }
+ else if ((_tokenSet_39.member(LA(1))) && (_tokenSet_64.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ identPrimary_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_39);
+ } else {
+ throw;
+ }
+ }
+ returnAST = identPrimary_AST;
+}
+
+void JavaRecognizer::constant() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST constant_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case NUM_INT:
+ {
+ RefJavaAST tmp194_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp194_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp194_AST));
+ }
+ match(NUM_INT);
+ constant_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case CHAR_LITERAL:
+ {
+ RefJavaAST tmp195_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp195_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp195_AST));
+ }
+ match(CHAR_LITERAL);
+ constant_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case STRING_LITERAL:
+ {
+ RefJavaAST tmp196_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp196_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp196_AST));
+ }
+ match(STRING_LITERAL);
+ constant_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case NUM_FLOAT:
+ {
+ RefJavaAST tmp197_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp197_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp197_AST));
+ }
+ match(NUM_FLOAT);
+ constant_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case NUM_LONG:
+ {
+ RefJavaAST tmp198_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp198_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp198_AST));
+ }
+ match(NUM_LONG);
+ constant_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ case NUM_DOUBLE:
+ {
+ RefJavaAST tmp199_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp199_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp199_AST));
+ }
+ match(NUM_DOUBLE);
+ constant_AST = RefJavaAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_39);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constant_AST;
+}
+
+void JavaRecognizer::newArrayDeclarator() {
+ returnAST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefJavaAST newArrayDeclarator_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken lb = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefJavaAST lb_AST = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ { // ( ... )+
+ int _cnt195=0;
+ for (;;) {
+ if ((LA(1) == LBRACK) && (_tokenSet_65.member(LA(2)))) {
+ lb = LT(1);
+ if ( inputState->guessing == 0 ) {
+ lb_AST = astFactory->create(lb);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(lb_AST));
+ }
+ match(LBRACK);
+ if ( inputState->guessing==0 ) {
+#line 1023 "java.g"
+ lb_AST->setType(ARRAY_DECLARATOR);
+#line 5922 "JavaRecognizer.cpp"
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case LPAREN:
+ case LITERAL_this:
+ case LITERAL_super:
+ case PLUS:
+ case MINUS:
+ case INC:
+ case DEC:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ case NUM_LONG:
+ case NUM_DOUBLE:
+ {
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RBRACK:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(RBRACK);
+ }
+ else {
+ if ( _cnt195>=1 ) { goto _loop195; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt195++;
+ }
+ _loop195:;
+ } // ( ... )+
+ newArrayDeclarator_AST = RefJavaAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_66);
+ } else {
+ throw;
+ }
+ }
+ returnAST = newArrayDeclarator_AST;
+}
+
+void JavaRecognizer::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory )
+{
+ factory.setMaxNodeType(151);
+}
+const char* JavaRecognizer::tokenNames[] = {
+ "<0>",
+ "EOF",
+ "<2>",
+ "NULL_TREE_LOOKAHEAD",
+ "BLOCK",
+ "MODIFIERS",
+ "OBJBLOCK",
+ "SLIST",
+ "CTOR_DEF",
+ "METHOD_DEF",
+ "VARIABLE_DEF",
+ "INSTANCE_INIT",
+ "STATIC_INIT",
+ "TYPE",
+ "CLASS_DEF",
+ "INTERFACE_DEF",
+ "PACKAGE_DEF",
+ "ARRAY_DECLARATOR",
+ "EXTENDS_CLAUSE",
+ "IMPLEMENTS_CLAUSE",
+ "PARAMETERS",
+ "PARAMETER_DEF",
+ "LABELED_STAT",
+ "TYPECAST",
+ "INDEX_OP",
+ "POST_INC",
+ "POST_DEC",
+ "METHOD_CALL",
+ "EXPR",
+ "ARRAY_INIT",
+ "IMPORT",
+ "UNARY_MINUS",
+ "UNARY_PLUS",
+ "CASE_GROUP",
+ "ELIST",
+ "FOR_INIT",
+ "FOR_CONDITION",
+ "FOR_ITERATOR",
+ "EMPTY_STAT",
+ "\"final\"",
+ "\"abstract\"",
+ "\"strictfp\"",
+ "SUPER_CTOR_CALL",
+ "CTOR_CALL",
+ "\"package\"",
+ "SEMI",
+ "\"import\"",
+ "LBRACK",
+ "RBRACK",
+ "\"void\"",
+ "\"boolean\"",
+ "\"byte\"",
+ "\"char\"",
+ "\"short\"",
+ "\"int\"",
+ "\"float\"",
+ "\"long\"",
+ "\"double\"",
+ "IDENT",
+ "DOT",
+ "STAR",
+ "\"private\"",
+ "\"public\"",
+ "\"protected\"",
+ "\"static\"",
+ "\"transient\"",
+ "\"native\"",
+ "\"threadsafe\"",
+ "\"synchronized\"",
+ "\"volatile\"",
+ "\"class\"",
+ "\"extends\"",
+ "\"interface\"",
+ "LCURLY",
+ "RCURLY",
+ "COMMA",
+ "\"implements\"",
+ "LPAREN",
+ "RPAREN",
+ "\"this\"",
+ "\"super\"",
+ "ASSIGN",
+ "\"throws\"",
+ "COLON",
+ "\"if\"",
+ "\"else\"",
+ "\"for\"",
+ "\"while\"",
+ "\"do\"",
+ "\"break\"",
+ "\"continue\"",
+ "\"return\"",
+ "\"switch\"",
+ "\"throw\"",
+ "\"case\"",
+ "\"default\"",
+ "\"try\"",
+ "\"finally\"",
+ "\"catch\"",
+ "PLUS_ASSIGN",
+ "MINUS_ASSIGN",
+ "STAR_ASSIGN",
+ "DIV_ASSIGN",
+ "MOD_ASSIGN",
+ "SR_ASSIGN",
+ "BSR_ASSIGN",
+ "SL_ASSIGN",
+ "BAND_ASSIGN",
+ "BXOR_ASSIGN",
+ "BOR_ASSIGN",
+ "QUESTION",
+ "LOR",
+ "LAND",
+ "BOR",
+ "BXOR",
+ "BAND",
+ "NOT_EQUAL",
+ "EQUAL",
+ "LT_",
+ "GT",
+ "LE",
+ "GE",
+ "\"instanceof\"",
+ "SL",
+ "SR",
+ "BSR",
+ "PLUS",
+ "MINUS",
+ "DIV",
+ "MOD",
+ "INC",
+ "DEC",
+ "BNOT",
+ "LNOT",
+ "\"true\"",
+ "\"false\"",
+ "\"null\"",
+ "\"new\"",
+ "NUM_INT",
+ "CHAR_LITERAL",
+ "STRING_LITERAL",
+ "NUM_FLOAT",
+ "NUM_LONG",
+ "NUM_DOUBLE",
+ "WS",
+ "SL_COMMENT",
+ "ML_COMMENT",
+ "ESC",
+ "HEX_DIGIT",
+ "VOCAB",
+ "EXPONENT",
+ "FLOAT_SUFFIX",
+ 0
+};
+
+const unsigned long JavaRecognizer::_tokenSet_0_data_[] = { 0UL, 3758105472UL, 383UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+// "interface"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_0(_tokenSet_0_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_1_data_[] = { 2UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_1(_tokenSet_1_data_,6);
+const unsigned long JavaRecognizer::_tokenSet_2_data_[] = { 2UL, 3758121856UL, 383UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF "final" "abstract" "strictfp" SEMI "import" "private" "public" "protected"
+// "static" "transient" "native" "threadsafe" "synchronized" "volatile"
+// "class" "interface"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_2(_tokenSet_2_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_3_data_[] = { 2UL, 3758105472UL, 383UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF "final" "abstract" "strictfp" SEMI "private" "public" "protected"
+// "static" "transient" "native" "threadsafe" "synchronized" "volatile"
+// "class" "interface"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_3(_tokenSet_3_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_4_data_[] = { 0UL, 67215360UL, 687616UL, 4194296UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LBRACK RBRACK IDENT LCURLY RCURLY COMMA "implements" LPAREN RPAREN
+// ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN
+// SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN BXOR_ASSIGN BOR_ASSIGN QUESTION
+// LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_4(_tokenSet_4_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_5_data_[] = { 0UL, 8192UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_5(_tokenSet_5_data_,6);
+const unsigned long JavaRecognizer::_tokenSet_6_data_[] = { 0UL, 3758097280UL, 63UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_6(_tokenSet_6_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_7_data_[] = { 0UL, 134086656UL, 320UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "void" "boolean" "byte" "char" "short" "int" "float" "long" "double"
+// IDENT "class" "interface"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_7(_tokenSet_7_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_8_data_[] = { 2UL, 3892192128UL, 4294027135UL, 3221225473UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF "final" "abstract" "strictfp" SEMI "void" "boolean" "byte" "char"
+// "short" "int" "float" "long" "double" IDENT "private" "public" "protected"
+// "static" "transient" "native" "threadsafe" "synchronized" "volatile"
+// "class" "interface" LCURLY RCURLY LPAREN "this" "super" "if" "else"
+// "for" "while" "do" "break" "continue" "return" "switch" "throw" "case"
+// "default" "try" PLUS MINUS INC DEC BNOT LNOT "true" "false" "null" "new"
+// NUM_INT CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_8(_tokenSet_8_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_9_data_[] = { 2UL, 3892192128UL, 1919UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF "final" "abstract" "strictfp" SEMI "void" "boolean" "byte" "char"
+// "short" "int" "float" "long" "double" IDENT "private" "public" "protected"
+// "static" "transient" "native" "threadsafe" "synchronized" "volatile"
+// "class" "interface" LCURLY RCURLY
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_9(_tokenSet_9_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_10_data_[] = { 0UL, 67182592UL, 674816UL, 4194296UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK IDENT RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_10(_tokenSet_10_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_11_data_[] = { 0UL, 201433088UL, 683008UL, 4194296UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LBRACK RBRACK IDENT DOT RCURLY COMMA LPAREN RPAREN ASSIGN COLON
+// PLUS_ASSIGN MINUS_ASSIGN STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN
+// BSR_ASSIGN SL_ASSIGN BAND_ASSIGN BXOR_ASSIGN BOR_ASSIGN QUESTION LOR
+// LAND BOR BXOR BAND NOT_EQUAL EQUAL
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_11(_tokenSet_11_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_12_data_[] = { 0UL, 32768UL, 8192UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LBRACK LPAREN
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_12(_tokenSet_12_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_13_data_[] = { 0UL, 3892183936UL, 383UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" "void" "boolean" "byte" "char" "short"
+// "int" "float" "long" "double" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+// "interface"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_13(_tokenSet_13_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_14_data_[] = { 0UL, 0UL, 4608UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LCURLY "implements"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_14(_tokenSet_14_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_15_data_[] = { 0UL, 0UL, 512UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LCURLY
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_15(_tokenSet_15_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_16_data_[] = { 2UL, 4294943616UL, 4294700927UL, 4294967289UL, 65535UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF "final" "abstract" "strictfp" SEMI LBRACK RBRACK "void" "boolean"
+// "byte" "char" "short" "int" "float" "long" "double" IDENT DOT STAR "private"
+// "public" "protected" "static" "transient" "native" "threadsafe" "synchronized"
+// "volatile" "class" "interface" LCURLY RCURLY COMMA LPAREN RPAREN "this"
+// "super" ASSIGN COLON "if" "else" "for" "while" "do" "break" "continue"
+// "return" "switch" "throw" "case" "default" "try" PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+// LT_ GT LE GE "instanceof" SL SR BSR PLUS MINUS DIV MOD INC DEC BNOT
+// LNOT "true" "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL
+// NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_16(_tokenSet_16_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_17_data_[] = { 0UL, 4026434432UL, 8575UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" LBRACK "void" "boolean" "byte" "char"
+// "short" "int" "float" "long" "double" IDENT DOT "private" "public" "protected"
+// "static" "transient" "native" "threadsafe" "synchronized" "volatile"
+// "class" "interface" LPAREN
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_17(_tokenSet_17_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_18_data_[] = { 0UL, 201359360UL, 0UL, 0UL, 0UL, 0UL };
+// LBRACK IDENT DOT
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_18(_tokenSet_18_data_,6);
+const unsigned long JavaRecognizer::_tokenSet_19_data_[] = { 0UL, 40960UL, 133120UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LBRACK COMMA ASSIGN
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_19(_tokenSet_19_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_20_data_[] = { 0UL, 3892192128UL, 1919UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI "void" "boolean" "byte" "char" "short"
+// "int" "float" "long" "double" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+// "interface" LCURLY RCURLY
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_20(_tokenSet_20_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_21_data_[] = { 0UL, 3892192128UL, 1070704255UL, 3221225473UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI "void" "boolean" "byte" "char" "short"
+// "int" "float" "long" "double" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+// LCURLY RCURLY LPAREN "this" "super" "if" "for" "while" "do" "break"
+// "continue" "return" "switch" "throw" "try" PLUS MINUS INC DEC BNOT LNOT
+// "true" "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL NUM_FLOAT
+// NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_21(_tokenSet_21_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_22_data_[] = { 0UL, 4294878080UL, 1071359871UL, 4294967289UL, 65535UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI LBRACK "void" "boolean" "byte" "char"
+// "short" "int" "float" "long" "double" IDENT DOT STAR "private" "public"
+// "protected" "static" "transient" "native" "threadsafe" "synchronized"
+// "volatile" "class" "interface" LCURLY RCURLY LPAREN "this" "super" ASSIGN
+// COLON "if" "for" "while" "do" "break" "continue" "return" "switch" "throw"
+// "try" PLUS_ASSIGN MINUS_ASSIGN STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN
+// BSR_ASSIGN SL_ASSIGN BAND_ASSIGN BXOR_ASSIGN BOR_ASSIGN QUESTION LOR
+// LAND BOR BXOR BAND NOT_EQUAL EQUAL LT_ GT LE GE "instanceof" SL SR BSR
+// PLUS MINUS DIV MOD INC DEC BNOT LNOT "true" "false" "null" "new" NUM_INT
+// CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_22(_tokenSet_22_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_23_data_[] = { 0UL, 3892192128UL, 1070703231UL, 3221225473UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI "void" "boolean" "byte" "char" "short"
+// "int" "float" "long" "double" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+// LCURLY LPAREN "this" "super" "if" "for" "while" "do" "break" "continue"
+// "return" "switch" "throw" "try" PLUS MINUS INC DEC BNOT LNOT "true"
+// "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG
+// NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_23(_tokenSet_23_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_24_data_[] = { 0UL, 0UL, 16384UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// RPAREN
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_24(_tokenSet_24_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_25_data_[] = { 0UL, 8192UL, 412160UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LCURLY COMMA RPAREN ASSIGN "throws"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_25(_tokenSet_25_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_26_data_[] = { 0UL, 8192UL, 512UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LCURLY
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_26(_tokenSet_26_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_27_data_[] = { 0UL, 3892192128UL, 4294027135UL, 3221225479UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI "void" "boolean" "byte" "char" "short"
+// "int" "float" "long" "double" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+// "interface" LCURLY RCURLY LPAREN "this" "super" "if" "else" "for" "while"
+// "do" "break" "continue" "return" "switch" "throw" "case" "default" "try"
+// "finally" "catch" PLUS MINUS INC DEC BNOT LNOT "true" "false" "null"
+// "new" NUM_INT CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_27(_tokenSet_27_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_28_data_[] = { 0UL, 3892192128UL, 4294026879UL, 3221225473UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI "void" "boolean" "byte" "char" "short"
+// "int" "float" "long" "double" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+// LCURLY RCURLY LPAREN "this" "super" "if" "else" "for" "while" "do" "break"
+// "continue" "return" "switch" "throw" "case" "default" "try" PLUS MINUS
+// INC DEC BNOT LNOT "true" "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL
+// NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_28(_tokenSet_28_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_29_data_[] = { 0UL, 4294878080UL, 4294682495UL, 4294967295UL, 65535UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI LBRACK "void" "boolean" "byte" "char"
+// "short" "int" "float" "long" "double" IDENT DOT STAR "private" "public"
+// "protected" "static" "transient" "native" "threadsafe" "synchronized"
+// "volatile" "class" "interface" LCURLY RCURLY LPAREN "this" "super" ASSIGN
+// COLON "if" "else" "for" "while" "do" "break" "continue" "return" "switch"
+// "throw" "case" "default" "try" "finally" "catch" PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+// LT_ GT LE GE "instanceof" SL SR BSR PLUS MINUS DIV MOD INC DEC BNOT
+// LNOT "true" "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL
+// NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_29(_tokenSet_29_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_30_data_[] = { 0UL, 3892183936UL, 63UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" "void" "boolean" "byte" "char" "short"
+// "int" "float" "long" "double" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_30(_tokenSet_30_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_31_data_[] = { 0UL, 4026434432UL, 63UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" LBRACK "void" "boolean" "byte" "char"
+// "short" "int" "float" "long" "double" IDENT DOT "private" "public" "protected"
+// "static" "transient" "native" "threadsafe" "synchronized" "volatile"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_31(_tokenSet_31_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_32_data_[] = { 0UL, 134086656UL, 106496UL, 3221225472UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "void" "boolean" "byte" "char" "short" "int" "float" "long" "double"
+// IDENT LPAREN "this" "super" PLUS MINUS INC DEC BNOT LNOT "true" "false"
+// "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG
+// NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_32(_tokenSet_32_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_33_data_[] = { 0UL, 536780800UL, 237568UL, 4294967288UL, 65535UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LBRACK "void" "boolean" "byte" "char" "short" "int" "float" "long"
+// "double" IDENT DOT STAR LPAREN "this" "super" ASSIGN PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+// LT_ GT LE GE "instanceof" SL SR BSR PLUS MINUS DIV MOD INC DEC BNOT
+// LNOT "true" "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL
+// NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_33(_tokenSet_33_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_34_data_[] = { 0UL, 3758097280UL, 127UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_34(_tokenSet_34_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_35_data_[] = { 0UL, 3825206144UL, 127UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_35(_tokenSet_35_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_36_data_[] = { 0UL, 8192UL, 2048UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI COMMA
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_36(_tokenSet_36_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_37_data_[] = { 0UL, 8192UL, 3072UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RCURLY COMMA
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_37(_tokenSet_37_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_38_data_[] = { 0UL, 134086656UL, 107008UL, 3221225472UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "void" "boolean" "byte" "char" "short" "int" "float" "long" "double"
+// IDENT LCURLY LPAREN "this" "super" PLUS MINUS INC DEC BNOT LNOT "true"
+// "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG
+// NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_38(_tokenSet_38_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_39_data_[] = { 0UL, 402759680UL, 674816UL, 4294967288UL, 15UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LBRACK RBRACK DOT STAR RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN
+// MINUS_ASSIGN STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN
+// SL_ASSIGN BAND_ASSIGN BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR
+// BAND NOT_EQUAL EQUAL LT_ GT LE GE "instanceof" SL SR BSR PLUS MINUS
+// DIV MOD INC DEC
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_39(_tokenSet_39_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_40_data_[] = { 0UL, 73728UL, 543744UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN COLON
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_40(_tokenSet_40_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_41_data_[] = { 0UL, 0UL, 18432UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// COMMA RPAREN
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_41(_tokenSet_41_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_42_data_[] = { 0UL, 134086656UL, 0UL, 0UL, 0UL, 0UL };
+// "void" "boolean" "byte" "char" "short" "int" "float" "long" "double"
+// IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_42(_tokenSet_42_data_,6);
+const unsigned long JavaRecognizer::_tokenSet_43_data_[] = { 0UL, 536780800UL, 239616UL, 4294967288UL, 65535UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LBRACK "void" "boolean" "byte" "char" "short" "int" "float" "long"
+// "double" IDENT DOT STAR COMMA LPAREN "this" "super" ASSIGN PLUS_ASSIGN
+// MINUS_ASSIGN STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN
+// SL_ASSIGN BAND_ASSIGN BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR
+// BAND NOT_EQUAL EQUAL LT_ GT LE GE "instanceof" SL SR BSR PLUS MINUS
+// DIV MOD INC DEC BNOT LNOT "true" "false" "null" "new" NUM_INT CHAR_LITERAL
+// STRING_LITERAL NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_43(_tokenSet_43_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_44_data_[] = { 0UL, 134086656UL, 630784UL, 3221225472UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "void" "boolean" "byte" "char" "short" "int" "float" "long" "double"
+// IDENT LPAREN "this" "super" COLON PLUS MINUS INC DEC BNOT LNOT "true"
+// "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG
+// NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_44(_tokenSet_44_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_45_data_[] = { 0UL, 0UL, 3221226496UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// RCURLY "case" "default"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_45(_tokenSet_45_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_46_data_[] = { 0UL, 3892192128UL, 4291929727UL, 3221225473UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI "void" "boolean" "byte" "char" "short"
+// "int" "float" "long" "double" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+// LCURLY RCURLY LPAREN "this" "super" "if" "for" "while" "do" "break"
+// "continue" "return" "switch" "throw" "case" "default" "try" PLUS MINUS
+// INC DEC BNOT LNOT "true" "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL
+// NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_46(_tokenSet_46_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_47_data_[] = { 0UL, 8192UL, 16384UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RPAREN
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_47(_tokenSet_47_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_48_data_[] = { 0UL, 3892192128UL, 4294026879UL, 3221225479UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI "void" "boolean" "byte" "char" "short"
+// "int" "float" "long" "double" IDENT "private" "public" "protected" "static"
+// "transient" "native" "threadsafe" "synchronized" "volatile" "class"
+// LCURLY RCURLY LPAREN "this" "super" "if" "else" "for" "while" "do" "break"
+// "continue" "return" "switch" "throw" "case" "default" "try" "finally"
+// "catch" PLUS MINUS INC DEC BNOT LNOT "true" "false" "null" "new" NUM_INT
+// CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_48(_tokenSet_48_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_49_data_[] = { 0UL, 73728UL, 674816UL, 16376UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_49(_tokenSet_49_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_50_data_[] = { 0UL, 73728UL, 674816UL, 32760UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_50(_tokenSet_50_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_51_data_[] = { 0UL, 73728UL, 674816UL, 65528UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_51(_tokenSet_51_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_52_data_[] = { 0UL, 73728UL, 674816UL, 131064UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_52(_tokenSet_52_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_53_data_[] = { 0UL, 73728UL, 674816UL, 262136UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_53(_tokenSet_53_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_54_data_[] = { 0UL, 73728UL, 674816UL, 524280UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_54(_tokenSet_54_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_55_data_[] = { 0UL, 73728UL, 674816UL, 1048568UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_55(_tokenSet_55_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_56_data_[] = { 0UL, 73728UL, 674816UL, 4194296UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_56(_tokenSet_56_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_57_data_[] = { 0UL, 73728UL, 674816UL, 134217720UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+// LT_ GT LE GE "instanceof"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_57(_tokenSet_57_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_58_data_[] = { 0UL, 73728UL, 674816UL, 1073741816UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+// LT_ GT LE GE "instanceof" SL SR BSR
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_58(_tokenSet_58_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_59_data_[] = { 0UL, 268435456UL, 0UL, 0UL, 3UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// STAR DIV MOD
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_59(_tokenSet_59_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_60_data_[] = { 0UL, 73728UL, 674816UL, 4294967288UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+// LT_ GT LE GE "instanceof" SL SR BSR PLUS MINUS
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_60(_tokenSet_60_data_,8);
+const unsigned long JavaRecognizer::_tokenSet_61_data_[] = { 0UL, 268509184UL, 674816UL, 4294967288UL, 3UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RBRACK STAR RCURLY COMMA RPAREN ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+// LT_ GT LE GE "instanceof" SL SR BSR PLUS MINUS DIV MOD
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_61(_tokenSet_61_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_62_data_[] = { 0UL, 134086656UL, 106496UL, 0UL, 65472UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "void" "boolean" "byte" "char" "short" "int" "float" "long" "double"
+// IDENT LPAREN "this" "super" "true" "false" "null" "new" NUM_INT CHAR_LITERAL
+// STRING_LITERAL NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_62(_tokenSet_62_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_63_data_[] = { 0UL, 536846336UL, 781312UL, 4294967288UL, 65535UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LBRACK RBRACK "void" "boolean" "byte" "char" "short" "int" "float"
+// "long" "double" IDENT DOT STAR RCURLY COMMA LPAREN RPAREN "this" "super"
+// ASSIGN COLON PLUS_ASSIGN MINUS_ASSIGN STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN
+// SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN BXOR_ASSIGN BOR_ASSIGN QUESTION
+// LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL LT_ GT LE GE "instanceof" SL
+// SR BSR PLUS MINUS DIV MOD INC DEC BNOT LNOT "true" "false" "null" "new"
+// NUM_INT CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_63(_tokenSet_63_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_64_data_[] = { 0UL, 4294943616UL, 4294700927UL, 4294967289UL, 65535UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "strictfp" SEMI LBRACK RBRACK "void" "boolean" "byte"
+// "char" "short" "int" "float" "long" "double" IDENT DOT STAR "private"
+// "public" "protected" "static" "transient" "native" "threadsafe" "synchronized"
+// "volatile" "class" "interface" LCURLY RCURLY COMMA LPAREN RPAREN "this"
+// "super" ASSIGN COLON "if" "else" "for" "while" "do" "break" "continue"
+// "return" "switch" "throw" "case" "default" "try" PLUS_ASSIGN MINUS_ASSIGN
+// STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN BSR_ASSIGN SL_ASSIGN BAND_ASSIGN
+// BXOR_ASSIGN BOR_ASSIGN QUESTION LOR LAND BOR BXOR BAND NOT_EQUAL EQUAL
+// LT_ GT LE GE "instanceof" SL SR BSR PLUS MINUS DIV MOD INC DEC BNOT
+// LNOT "true" "false" "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL
+// NUM_FLOAT NUM_LONG NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_64(_tokenSet_64_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_65_data_[] = { 0UL, 134152192UL, 106496UL, 3221225472UL, 65532UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// RBRACK "void" "boolean" "byte" "char" "short" "int" "float" "long" "double"
+// IDENT LPAREN "this" "super" PLUS MINUS INC DEC BNOT LNOT "true" "false"
+// "null" "new" NUM_INT CHAR_LITERAL STRING_LITERAL NUM_FLOAT NUM_LONG
+// NUM_DOUBLE
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_65(_tokenSet_65_data_,12);
+const unsigned long JavaRecognizer::_tokenSet_66_data_[] = { 0UL, 402759680UL, 675328UL, 4294967288UL, 15UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LBRACK RBRACK DOT STAR LCURLY RCURLY COMMA RPAREN ASSIGN COLON
+// PLUS_ASSIGN MINUS_ASSIGN STAR_ASSIGN DIV_ASSIGN MOD_ASSIGN SR_ASSIGN
+// BSR_ASSIGN SL_ASSIGN BAND_ASSIGN BXOR_ASSIGN BOR_ASSIGN QUESTION LOR
+// LAND BOR BXOR BAND NOT_EQUAL EQUAL LT_ GT LE GE "instanceof" SL SR BSR
+// PLUS MINUS DIV MOD INC DEC
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaRecognizer::_tokenSet_66(_tokenSet_66_data_,12);
+
+
diff --git a/languages/java/JavaRecognizer.hpp b/languages/java/JavaRecognizer.hpp
new file mode 100644
index 00000000..e9e426b7
--- /dev/null
+++ b/languages/java/JavaRecognizer.hpp
@@ -0,0 +1,423 @@
+#ifndef INC_JavaRecognizer_hpp_
+#define INC_JavaRecognizer_hpp_
+
+#line 2 "java.g"
+
+ #include "driver.h"
+ #include "JavaAST.hpp"
+
+ #include <qlistview.h>
+ #include <kdebug.h>
+
+ #define SET_POSITION(ast,t)\
+ { \
+ RefJavaAST(ast)->setLine( t->getLine() );\
+ RefJavaAST(ast)->setColumn( t->getColumn() ); \
+ }
+
+#line 19 "JavaRecognizer.hpp"
+#include <antlr/config.hpp>
+/* $ANTLR 2.7.7 (20061129): "java.g" -> "JavaRecognizer.hpp"$ */
+#include <antlr/TokenStream.hpp>
+#include <antlr/TokenBuffer.hpp>
+#include "JavaTokenTypes.hpp"
+#include <antlr/LLkParser.hpp>
+
+/** Java 1.3 Recognizer
+ *
+ * Run 'java Main [-showtree] directory-full-of-java-files'
+ *
+ * [The -showtree option pops up a Swing frame that shows
+ * the AST constructed from the parser.]
+ *
+ * Run 'java Main <directory full of java files>'
+ *
+ * Contributing authors:
+ * John Mitchell johnm@non.net
+ * Terence Parr parrt@magelang.com
+ * John Lilley jlilley@empathy.com
+ * Scott Stanchfield thetick@magelang.com
+ * Markus Mohnen mohnen@informatik.rwth-aachen.de
+ * Peter Williams pete.williams@sun.com
+ * Allan Jacobs Allan.Jacobs@eng.sun.com
+ * Steve Messick messick@redhills.com
+ * John Pybus john@pybus.org
+ *
+ * Version 1.00 December 9, 1997 -- initial release
+ * Version 1.01 December 10, 1997
+ * fixed bug in octal def (0..7 not 0..8)
+ * Version 1.10 August 1998 (parrt)
+ * added tree construction
+ * fixed definition of WS,comments for mac,pc,unix newlines
+ * added unary plus
+ * Version 1.11 (Nov 20, 1998)
+ * Added "shutup" option to turn off last ambig warning.
+ * Fixed inner class def to allow named class defs as statements
+ * synchronized requires compound not simple statement
+ * add [] after builtInType DOT class in primaryExpression
+ * "const" is reserved but not valid..removed from modifiers
+ * Version 1.12 (Feb 2, 1999)
+ * Changed LITERAL_xxx to xxx in tree grammar.
+ * Updated java.g to use tokens {...} now for 2.6.0 (new feature).
+ *
+ * Version 1.13 (Apr 23, 1999)
+ * Didn't have (stat)? for else clause in tree parser.
+ * Didn't gen ASTs for interface extends. Updated tree parser too.
+ * Updated to 2.6.0.
+ * Version 1.14 (Jun 20, 1999)
+ * Allowed final/abstract on local classes.
+ * Removed local interfaces from methods
+ * Put instanceof precedence where it belongs...in relationalExpr
+ * It also had expr not type as arg; fixed it.
+ * Missing ! on SEMI in classBlock
+ * fixed: (expr) + "string" was parsed incorrectly (+ as unary plus).
+ * fixed: didn't like Object[].class in parser or tree parser
+ * Version 1.15 (Jun 26, 1999)
+ * Screwed up rule with instanceof in it. :( Fixed.
+ * Tree parser didn't like (expr).something; fixed.
+ * Allowed multiple inheritance in tree grammar. oops.
+ * Version 1.16 (August 22, 1999)
+ * Extending an interface built a wacky tree: had extra EXTENDS.
+ * Tree grammar didn't allow multiple superinterfaces.
+ * Tree grammar didn't allow empty var initializer: {}
+ * Version 1.17 (October 12, 1999)
+ * ESC lexer rule allowed 399 max not 377 max.
+ * java.tree.g didn't handle the expression of synchronized
+ * statements.
+ * Version 1.18 (August 12, 2001)
+ * Terence updated to Java 2 Version 1.3 by
+ * observing/combining work of Allan Jacobs and Steve
+ * Messick. Handles 1.3 src. Summary:
+ * o primary didn't include boolean.class kind of thing
+ * o constructor calls parsed explicitly now:
+ * see explicitConstructorInvocation
+ * o add strictfp modifier
+ * o missing objBlock after new expression in tree grammar
+ * o merged local class definition alternatives, moved after declaration
+ * o fixed problem with ClassName.super.field
+ * o reordered some alternatives to make things more efficient
+ * o long and double constants were not differentiated from int/float
+ * o whitespace rule was inefficient: matched only one char
+ * o add an examples directory with some nasty 1.3 cases
+ * o made Main.java use buffered IO and a Reader for Unicode support
+ * o supports UNICODE?
+ * Using Unicode charVocabulay makes code file big, but only
+ * in the bitsets at the end. I need to make ANTLR generate
+ * unicode bitsets more efficiently.
+ * Version 1.19 (April 25, 2002)
+ * Terence added in nice fixes by John Pybus concerning floating
+ * constants and problems with super() calls. John did a nice
+ * reorg of the primary/postfix expression stuff to read better
+ * and makes f.g.super() parse properly (it was METHOD_CALL not
+ * a SUPER_CTOR_CALL). Also:
+ *
+ * o "finally" clause was a root...made it a child of "try"
+ * o Added stuff for asserts too for Java 1.4, but *commented out*
+ * as it is not backward compatible.
+ *
+ * Version 1.20 (October 27, 2002)
+ *
+ * Terence ended up reorging John Pybus' stuff to
+ * remove some nondeterminisms and some syntactic predicates.
+ * Note that the grammar is stricter now; e.g., this(...) must
+ * be the first statement.
+ *
+ * Trinary ?: operator wasn't working as array name:
+ * (isBig ? bigDigits : digits)[i];
+ *
+ * Checked parser/tree parser on source for
+ * Resin-2.0.5, jive-2.1.1, jdk 1.3.1, Lucene, antlr 2.7.2a4,
+ * and the 110k-line jGuru server source.
+ *
+ * Version tracking now done with following ID:
+ *
+ * $Id$
+ *
+ * This grammar is in the PUBLIC DOMAIN
+ */
+class CUSTOM_API JavaRecognizer : public ANTLR_USE_NAMESPACE(antlr)LLkParser, public JavaTokenTypes
+{
+#line 154 "java.g"
+
+private:
+ Driver* m_driver;
+
+public:
+ void setDriver( Driver* d ) { m_driver = d; }
+ void setFileName( const QString& fileName ) { m_driver->currentFileName() = fileName; }
+
+ void reportError( const ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(ex.getMessage().c_str()), ex.getLine(), ex.getColumn()) );
+ }
+
+ void reportError( const ANTLR_USE_NAMESPACE(std)string& errorMessage ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(errorMessage.c_str()), LT(1)->getLine(), LT(1)->getColumn()) );
+ }
+
+ void reportMessage( const ANTLR_USE_NAMESPACE(std)string& message ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(message.c_str()), LT(1)->getLine(), LT(1)->getColumn()) );
+ }
+#line 142 "JavaRecognizer.hpp"
+public:
+ void initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory );
+protected:
+ JavaRecognizer(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf, int k);
+public:
+ JavaRecognizer(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf);
+protected:
+ JavaRecognizer(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer, int k);
+public:
+ JavaRecognizer(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer);
+ JavaRecognizer(const ANTLR_USE_NAMESPACE(antlr)ParserSharedInputState& state);
+ int getNumTokens() const
+ {
+ return JavaRecognizer::NUM_TOKENS;
+ }
+ const char* getTokenName( int type ) const
+ {
+ if( type > getNumTokens() ) return 0;
+ return JavaRecognizer::tokenNames[type];
+ }
+ const char* const* getTokenNames() const
+ {
+ return JavaRecognizer::tokenNames;
+ }
+ public: void compilationUnit();
+ public: void packageDefinition();
+ public: void importDefinition();
+ public: void typeDefinition();
+ public: void identifier();
+ public: void identifierStar();
+ public: void modifiers();
+ public: void classDefinition(
+ RefJavaAST modifiers
+ );
+ public: void interfaceDefinition(
+ RefJavaAST modifiers
+ );
+ public: void declaration();
+ public: void typeSpec(
+ bool addImagNode
+ );
+ public: void variableDefinitions(
+ RefJavaAST mods, RefJavaAST t
+ );
+ public: void classTypeSpec(
+ bool addImagNode
+ );
+ public: void builtInTypeSpec(
+ bool addImagNode
+ );
+ public: void builtInType();
+ public: void type();
+ public: void modifier();
+ public: void superClassClause();
+ public: void implementsClause();
+ public: void classBlock();
+ public: void interfaceExtends();
+ public: void field();
+ public: void ctorHead();
+ public: void constructorBody();
+ public: void parameterDeclarationList();
+ public: void declaratorBrackets(
+ RefJavaAST typ
+ );
+ public: void throwsClause();
+ public: void compoundStatement();
+ public: void explicitConstructorInvocation();
+ public: void statement();
+ public: void argList();
+ public: void variableDeclarator(
+ RefJavaAST mods, RefJavaAST t
+ );
+ public: void varInitializer();
+ public: void initializer();
+ public: void arrayInitializer();
+ public: void expression();
+ public: void parameterDeclaration();
+ public: void parameterModifier();
+ public: void forInit();
+ public: void forCond();
+ public: void forIter();
+ public: void casesGroup();
+ public: void tryBlock();
+ public: void aCase();
+ public: void caseSList();
+ public: void expressionList();
+ public: void handler();
+ public: void finallyClause();
+ public: void assignmentExpression();
+ public: void conditionalExpression();
+ public: void logicalOrExpression();
+ public: void logicalAndExpression();
+ public: void inclusiveOrExpression();
+ public: void exclusiveOrExpression();
+ public: void andExpression();
+ public: void equalityExpression();
+ public: void relationalExpression();
+ public: void shiftExpression();
+ public: void additiveExpression();
+ public: void multiplicativeExpression();
+ public: void unaryExpression();
+ public: void unaryExpressionNotPlusMinus();
+ public: void postfixExpression();
+ public: void primaryExpression();
+ public: void newExpression();
+ public: void identPrimary();
+ public: void constant();
+ public: void newArrayDeclarator();
+public:
+ ANTLR_USE_NAMESPACE(antlr)RefAST getAST()
+ {
+ return ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST);
+ }
+
+protected:
+ RefJavaAST returnAST;
+private:
+ static const char* tokenNames[];
+#ifndef NO_STATIC_CONSTS
+ static const int NUM_TOKENS = 152;
+#else
+ enum {
+ NUM_TOKENS = 152
+ };
+#endif
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+ static const unsigned long _tokenSet_2_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2;
+ static const unsigned long _tokenSet_3_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3;
+ static const unsigned long _tokenSet_4_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_4;
+ static const unsigned long _tokenSet_5_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_5;
+ static const unsigned long _tokenSet_6_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_6;
+ static const unsigned long _tokenSet_7_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_7;
+ static const unsigned long _tokenSet_8_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_8;
+ static const unsigned long _tokenSet_9_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_9;
+ static const unsigned long _tokenSet_10_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_10;
+ static const unsigned long _tokenSet_11_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_11;
+ static const unsigned long _tokenSet_12_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_12;
+ static const unsigned long _tokenSet_13_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_13;
+ static const unsigned long _tokenSet_14_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_14;
+ static const unsigned long _tokenSet_15_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_15;
+ static const unsigned long _tokenSet_16_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_16;
+ static const unsigned long _tokenSet_17_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_17;
+ static const unsigned long _tokenSet_18_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_18;
+ static const unsigned long _tokenSet_19_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_19;
+ static const unsigned long _tokenSet_20_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_20;
+ static const unsigned long _tokenSet_21_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_21;
+ static const unsigned long _tokenSet_22_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_22;
+ static const unsigned long _tokenSet_23_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_23;
+ static const unsigned long _tokenSet_24_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_24;
+ static const unsigned long _tokenSet_25_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_25;
+ static const unsigned long _tokenSet_26_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_26;
+ static const unsigned long _tokenSet_27_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_27;
+ static const unsigned long _tokenSet_28_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_28;
+ static const unsigned long _tokenSet_29_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_29;
+ static const unsigned long _tokenSet_30_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_30;
+ static const unsigned long _tokenSet_31_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_31;
+ static const unsigned long _tokenSet_32_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_32;
+ static const unsigned long _tokenSet_33_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_33;
+ static const unsigned long _tokenSet_34_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_34;
+ static const unsigned long _tokenSet_35_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_35;
+ static const unsigned long _tokenSet_36_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_36;
+ static const unsigned long _tokenSet_37_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_37;
+ static const unsigned long _tokenSet_38_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_38;
+ static const unsigned long _tokenSet_39_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_39;
+ static const unsigned long _tokenSet_40_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_40;
+ static const unsigned long _tokenSet_41_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_41;
+ static const unsigned long _tokenSet_42_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_42;
+ static const unsigned long _tokenSet_43_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_43;
+ static const unsigned long _tokenSet_44_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_44;
+ static const unsigned long _tokenSet_45_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_45;
+ static const unsigned long _tokenSet_46_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_46;
+ static const unsigned long _tokenSet_47_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_47;
+ static const unsigned long _tokenSet_48_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_48;
+ static const unsigned long _tokenSet_49_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_49;
+ static const unsigned long _tokenSet_50_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_50;
+ static const unsigned long _tokenSet_51_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_51;
+ static const unsigned long _tokenSet_52_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_52;
+ static const unsigned long _tokenSet_53_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_53;
+ static const unsigned long _tokenSet_54_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_54;
+ static const unsigned long _tokenSet_55_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_55;
+ static const unsigned long _tokenSet_56_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_56;
+ static const unsigned long _tokenSet_57_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_57;
+ static const unsigned long _tokenSet_58_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_58;
+ static const unsigned long _tokenSet_59_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_59;
+ static const unsigned long _tokenSet_60_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_60;
+ static const unsigned long _tokenSet_61_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_61;
+ static const unsigned long _tokenSet_62_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_62;
+ static const unsigned long _tokenSet_63_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_63;
+ static const unsigned long _tokenSet_64_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_64;
+ static const unsigned long _tokenSet_65_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_65;
+ static const unsigned long _tokenSet_66_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_66;
+};
+
+#endif /*INC_JavaRecognizer_hpp_*/
diff --git a/languages/java/JavaStoreWalker.cpp b/languages/java/JavaStoreWalker.cpp
new file mode 100644
index 00000000..b442aafd
--- /dev/null
+++ b/languages/java/JavaStoreWalker.cpp
@@ -0,0 +1,3441 @@
+/* $ANTLR 2.7.7 (20061129): "java.store.g" -> "JavaStoreWalker.cpp"$ */
+#include "JavaStoreWalker.hpp"
+#include <antlr/Token.hpp>
+#include <antlr/AST.hpp>
+#include <antlr/NoViableAltException.hpp>
+#include <antlr/MismatchedTokenException.hpp>
+#include <antlr/SemanticException.hpp>
+#include <antlr/BitSet.hpp>
+#line 1 "java.store.g"
+#line 11 "JavaStoreWalker.cpp"
+JavaStoreWalker::JavaStoreWalker()
+ : ANTLR_USE_NAMESPACE(antlr)TreeParser() {
+}
+
+void JavaStoreWalker::compilationUnit(RefJavaAST _t) {
+ RefJavaAST compilationUnit_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 75 "java.store.g"
+ QString package; QString imp; QStringList imports;
+#line 20 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+#line 76 "java.store.g"
+ init();
+#line 25 "JavaStoreWalker.cpp"
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PACKAGE_DEF:
+ {
+ package=packageDefinition(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ case CLASS_DEF:
+ case INTERFACE_DEF:
+ case IMPORT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IMPORT)) {
+ imp=importDefinition(_t);
+ _t = _retTree;
+#line 78 "java.store.g"
+ imports << imp;
+#line 58 "JavaStoreWalker.cpp"
+ }
+ else {
+ goto _loop4;
+ }
+
+ }
+ _loop4:;
+ } // ( ... )*
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == CLASS_DEF || _t->getType() == INTERFACE_DEF)) {
+ typeDefinition(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop6;
+ }
+
+ }
+ _loop6:;
+ } // ( ... )*
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+ QString JavaStoreWalker::packageDefinition(RefJavaAST _t) {
+#line 82 "java.store.g"
+ QString id ;
+#line 94 "JavaStoreWalker.cpp"
+ RefJavaAST packageDefinition_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t8 = _t;
+ RefJavaAST tmp1_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKAGE_DEF);
+ _t = _t->getFirstChild();
+ id=identifier(_t);
+ _t = _retTree;
+ _t = __t8;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return id ;
+}
+
+ QString JavaStoreWalker::importDefinition(RefJavaAST _t) {
+#line 86 "java.store.g"
+ QString id ;
+#line 119 "JavaStoreWalker.cpp"
+ RefJavaAST importDefinition_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t10 = _t;
+ RefJavaAST tmp2_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IMPORT);
+ _t = _t->getFirstChild();
+ id=identifierStar(_t);
+ _t = _retTree;
+ _t = __t10;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return id ;
+}
+
+void JavaStoreWalker::typeDefinition(RefJavaAST _t) {
+ RefJavaAST typeDefinition_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 90 "java.store.g"
+ QStringList bases; QString className; ClassDom klass; QStringList m;
+#line 145 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case CLASS_DEF:
+ {
+ RefJavaAST __t12 = _t;
+ RefJavaAST tmp3_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CLASS_DEF);
+ _t = _t->getFirstChild();
+ m=modifiers(_t);
+ _t = _retTree;
+ RefJavaAST tmp4_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+#line 92 "java.store.g"
+
+ klass = m_model->create<ClassModel>();
+ QString name = QString::fromUtf8( tmp4_AST_in->getText().c_str(), tmp4_AST_in->getText().length() );
+ QStringList path = QStringList::split( ".", name );
+ className = path.back();
+
+ klass->setName( path.back() );
+ klass->setScope( m_currentScope );
+ klass->setStartPosition( tmp4_AST_in->getLine(), tmp4_AST_in->getColumn() );
+ /// @todo klass->setEndPositon()
+
+ klass->setFileName( m_file->name() );
+ if( m_currentClass.top() )
+ m_currentClass.top()->addClass( klass );
+ else
+ m_file->addClass( klass );
+
+#line 180 "JavaStoreWalker.cpp"
+ bases=extendsClause(_t);
+ _t = _retTree;
+#line 110 "java.store.g"
+
+ for( QStringList::Iterator it = bases.begin(); it != bases.end(); ++it )
+ klass->addBaseClass( *it );
+
+#line 188 "JavaStoreWalker.cpp"
+ implementsClause(_t);
+ _t = _retTree;
+#line 115 "java.store.g"
+
+ m_currentClass.push( klass );
+ m_currentScope.push_back( className );
+
+#line 196 "JavaStoreWalker.cpp"
+ objBlock(_t,klass);
+ _t = _retTree;
+#line 120 "java.store.g"
+
+ m_currentClass.pop();
+ m_currentScope.pop_back();
+
+#line 204 "JavaStoreWalker.cpp"
+ _t = __t12;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INTERFACE_DEF:
+ {
+ RefJavaAST __t13 = _t;
+ RefJavaAST tmp5_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INTERFACE_DEF);
+ _t = _t->getFirstChild();
+ m=modifiers(_t);
+ _t = _retTree;
+ RefJavaAST tmp6_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+#line 126 "java.store.g"
+
+ klass = m_model->create<ClassModel>();
+ QString name = QString::fromUtf8( tmp6_AST_in->getText().c_str(), tmp6_AST_in->getText().length() );
+ QStringList path = QStringList::split( ".", name );
+ className = path.back();
+
+ klass->setName( path.back() );
+ klass->setScope( m_currentScope );
+ klass->setStartPosition( tmp6_AST_in->getLine(), tmp6_AST_in->getColumn() );
+ /// @todo klass->setEndPositon()
+
+ klass->setFileName( m_file->name() );
+
+ if( m_currentClass.top() )
+ m_currentClass.top()->addClass( klass );
+ else
+ m_file->addClass( klass );
+
+#line 239 "JavaStoreWalker.cpp"
+ bases=extendsClause(_t);
+ _t = _retTree;
+#line 145 "java.store.g"
+
+ m_currentClass.push( klass );
+ m_currentScope.push_back( className );
+
+#line 247 "JavaStoreWalker.cpp"
+ interfaceBlock(_t,klass);
+ _t = _retTree;
+#line 150 "java.store.g"
+
+ m_currentClass.pop();
+ m_currentScope.pop_back();
+
+#line 255 "JavaStoreWalker.cpp"
+ _t = __t13;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+ QString JavaStoreWalker::identifier(RefJavaAST _t) {
+#line 363 "java.store.g"
+ QString id ;
+#line 277 "JavaStoreWalker.cpp"
+ RefJavaAST identifier_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ {
+ RefJavaAST tmp7_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+#line 364 "java.store.g"
+
+ id = tmp7_AST_in->getText().c_str();
+
+#line 293 "JavaStoreWalker.cpp"
+ break;
+ }
+ case DOT:
+ {
+ RefJavaAST __t74 = _t;
+ RefJavaAST tmp8_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT);
+ _t = _t->getFirstChild();
+ id=identifier(_t);
+ _t = _retTree;
+ RefJavaAST tmp9_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ _t = __t74;
+ _t = _t->getNextSibling();
+#line 367 "java.store.g"
+
+ id += QString(".") + tmp9_AST_in->getText().c_str();
+
+#line 313 "JavaStoreWalker.cpp"
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return id ;
+}
+
+ QString JavaStoreWalker::identifierStar(RefJavaAST _t) {
+#line 372 "java.store.g"
+ QString id ;
+#line 334 "JavaStoreWalker.cpp"
+ RefJavaAST identifierStar_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ {
+ RefJavaAST tmp10_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+#line 373 "java.store.g"
+
+ id = tmp10_AST_in->getText().c_str();
+
+#line 350 "JavaStoreWalker.cpp"
+ break;
+ }
+ case DOT:
+ {
+ RefJavaAST __t76 = _t;
+ RefJavaAST tmp11_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT);
+ _t = _t->getFirstChild();
+ id=identifier(_t);
+ _t = _retTree;
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case STAR:
+ {
+ RefJavaAST tmp12_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STAR);
+ _t = _t->getNextSibling();
+#line 376 "java.store.g"
+ id += QString(".") + tmp12_AST_in->getText().c_str();
+#line 372 "JavaStoreWalker.cpp"
+ break;
+ }
+ case IDENT:
+ {
+ RefJavaAST tmp13_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+#line 377 "java.store.g"
+ id += QString(".") + tmp13_AST_in->getText().c_str();
+#line 382 "JavaStoreWalker.cpp"
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t76;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return id ;
+}
+
+ QStringList JavaStoreWalker::modifiers(RefJavaAST _t) {
+#line 183 "java.store.g"
+ QStringList l ;
+#line 413 "JavaStoreWalker.cpp"
+ RefJavaAST modifiers_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ RefJavaAST m = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefJavaAST __t21 = _t;
+ RefJavaAST tmp14_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MODIFIERS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_0.member(_t->getType()))) {
+ m = (_t == ASTNULL) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ modifier(_t);
+ _t = _retTree;
+#line 184 "java.store.g"
+ l << m->getText().c_str();
+#line 432 "JavaStoreWalker.cpp"
+ }
+ else {
+ goto _loop23;
+ }
+
+ }
+ _loop23:;
+ } // ( ... )*
+ _t = __t21;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return l ;
+}
+
+ QStringList JavaStoreWalker::extendsClause(RefJavaAST _t) {
+#line 202 "java.store.g"
+ QStringList l ;
+#line 456 "JavaStoreWalker.cpp"
+ RefJavaAST extendsClause_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 202 "java.store.g"
+ QString id;
+#line 460 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST __t26 = _t;
+ RefJavaAST tmp15_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EXTENDS_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENT || _t->getType() == DOT)) {
+ id=identifier(_t);
+ _t = _retTree;
+#line 203 "java.store.g"
+ l << id;
+#line 476 "JavaStoreWalker.cpp"
+ }
+ else {
+ goto _loop28;
+ }
+
+ }
+ _loop28:;
+ } // ( ... )*
+ _t = __t26;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return l ;
+}
+
+ QStringList JavaStoreWalker::implementsClause(RefJavaAST _t) {
+#line 206 "java.store.g"
+ QStringList l ;
+#line 500 "JavaStoreWalker.cpp"
+ RefJavaAST implementsClause_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 206 "java.store.g"
+ QString id;
+#line 504 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST __t30 = _t;
+ RefJavaAST tmp16_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IMPLEMENTS_CLAUSE);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENT || _t->getType() == DOT)) {
+ id=identifier(_t);
+ _t = _retTree;
+#line 207 "java.store.g"
+ l << id;
+#line 520 "JavaStoreWalker.cpp"
+ }
+ else {
+ goto _loop32;
+ }
+
+ }
+ _loop32:;
+ } // ( ... )*
+ _t = __t30;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return l ;
+}
+
+void JavaStoreWalker::objBlock(RefJavaAST _t,
+ ClassDom klass
+) {
+ RefJavaAST objBlock_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 221 "java.store.g"
+ FunctionDom meth; VariableDom attr;
+#line 547 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST __t38 = _t;
+ RefJavaAST tmp17_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OBJBLOCK);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case CTOR_DEF:
+ {
+ meth=ctorDef(_t);
+ _t = _retTree;
+#line 223 "java.store.g"
+
+ klass->addFunction( meth );
+
+#line 567 "JavaStoreWalker.cpp"
+ break;
+ }
+ case METHOD_DEF:
+ {
+ meth=methodDef(_t);
+ _t = _retTree;
+#line 226 "java.store.g"
+
+ klass->addFunction( meth );
+
+#line 578 "JavaStoreWalker.cpp"
+ break;
+ }
+ case VARIABLE_DEF:
+ {
+ attr=variableDef(_t);
+ _t = _retTree;
+#line 229 "java.store.g"
+
+ klass->addVariable( attr );
+
+#line 589 "JavaStoreWalker.cpp"
+ break;
+ }
+ case CLASS_DEF:
+ case INTERFACE_DEF:
+ {
+ typeDefinition(_t);
+ _t = _retTree;
+ break;
+ }
+ case STATIC_INIT:
+ {
+ RefJavaAST __t40 = _t;
+ RefJavaAST tmp18_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STATIC_INIT);
+ _t = _t->getFirstChild();
+ slist(_t);
+ _t = _retTree;
+ _t = __t40;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INSTANCE_INIT:
+ {
+ RefJavaAST __t41 = _t;
+ RefJavaAST tmp19_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INSTANCE_INIT);
+ _t = _t->getFirstChild();
+ slist(_t);
+ _t = _retTree;
+ _t = __t41;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ goto _loop42;
+ }
+ }
+ }
+ _loop42:;
+ } // ( ... )*
+ _t = __t38;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::interfaceBlock(RefJavaAST _t,
+ ClassDom klass
+) {
+ RefJavaAST interfaceBlock_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 210 "java.store.g"
+ FunctionDom meth; VariableDom attr;
+#line 648 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST __t34 = _t;
+ RefJavaAST tmp20_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OBJBLOCK);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case METHOD_DEF:
+ {
+ meth=methodDecl(_t);
+ _t = _retTree;
+#line 212 "java.store.g"
+
+
+#line 667 "JavaStoreWalker.cpp"
+ break;
+ }
+ case VARIABLE_DEF:
+ {
+ attr=variableDef(_t);
+ _t = _retTree;
+#line 215 "java.store.g"
+
+
+#line 677 "JavaStoreWalker.cpp"
+ break;
+ }
+ default:
+ {
+ goto _loop36;
+ }
+ }
+ }
+ _loop36:;
+ } // ( ... )*
+ _t = __t34;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+ QString JavaStoreWalker::typeSpec(RefJavaAST _t) {
+#line 157 "java.store.g"
+ QString tp ;
+#line 702 "JavaStoreWalker.cpp"
+ RefJavaAST typeSpec_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t15 = _t;
+ RefJavaAST tmp21_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TYPE);
+ _t = _t->getFirstChild();
+ tp=typeSpecArray(_t);
+ _t = _retTree;
+ _t = __t15;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return tp ;
+}
+
+ QString JavaStoreWalker::typeSpecArray(RefJavaAST _t) {
+#line 161 "java.store.g"
+ QString tp ;
+#line 727 "JavaStoreWalker.cpp"
+ RefJavaAST typeSpecArray_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARRAY_DECLARATOR:
+ {
+ RefJavaAST __t17 = _t;
+ RefJavaAST tmp22_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARRAY_DECLARATOR);
+ _t = _t->getFirstChild();
+ tp=typeSpecArray(_t);
+ _t = _retTree;
+ _t = __t17;
+ _t = _t->getNextSibling();
+#line 162 "java.store.g"
+ tp += "[]";
+#line 746 "JavaStoreWalker.cpp"
+ break;
+ }
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ case IDENT:
+ case DOT:
+ {
+ tp=type(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return tp ;
+}
+
+ QString JavaStoreWalker::type(RefJavaAST _t) {
+#line 166 "java.store.g"
+ QString tp ;
+#line 783 "JavaStoreWalker.cpp"
+ RefJavaAST type_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ RefJavaAST b = RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ case DOT:
+ {
+ tp=identifier(_t);
+ _t = _retTree;
+ break;
+ }
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ {
+ b = (_t == ASTNULL) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+ builtInType(_t);
+ _t = _retTree;
+#line 168 "java.store.g"
+ tp = b->getText().c_str();
+#line 813 "JavaStoreWalker.cpp"
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return tp ;
+}
+
+void JavaStoreWalker::builtInType(RefJavaAST _t) {
+ RefJavaAST builtInType_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LITERAL_void:
+ {
+ RefJavaAST tmp23_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_void);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_boolean:
+ {
+ RefJavaAST tmp24_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_boolean);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_byte:
+ {
+ RefJavaAST tmp25_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_byte);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_char:
+ {
+ RefJavaAST tmp26_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_char);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_short:
+ {
+ RefJavaAST tmp27_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_short);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_int:
+ {
+ RefJavaAST tmp28_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_int);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_float:
+ {
+ RefJavaAST tmp29_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_float);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_long:
+ {
+ RefJavaAST tmp30_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_long);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_double:
+ {
+ RefJavaAST tmp31_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_double);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::modifier(RefJavaAST _t) {
+ RefJavaAST modifier_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LITERAL_private:
+ {
+ RefJavaAST tmp32_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_private);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_public:
+ {
+ RefJavaAST tmp33_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_public);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_protected:
+ {
+ RefJavaAST tmp34_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_protected);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_static:
+ {
+ RefJavaAST tmp35_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_static);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_transient:
+ {
+ RefJavaAST tmp36_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_transient);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FINAL:
+ {
+ RefJavaAST tmp37_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FINAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ABSTRACT:
+ {
+ RefJavaAST tmp38_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ABSTRACT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_native:
+ {
+ RefJavaAST tmp39_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_native);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_threadsafe:
+ {
+ RefJavaAST tmp40_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_threadsafe);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_synchronized:
+ {
+ RefJavaAST tmp41_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_synchronized);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_const:
+ {
+ RefJavaAST tmp42_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_const);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_volatile:
+ {
+ RefJavaAST tmp43_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_volatile);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+ FunctionDom JavaStoreWalker::methodDecl(RefJavaAST _t) {
+#line 257 "java.store.g"
+ FunctionDom meth ;
+#line 1023 "JavaStoreWalker.cpp"
+ RefJavaAST methodDecl_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 257 "java.store.g"
+
+ QStringList m;
+ QString tp;
+ meth = m_model->create<FunctionModel>();
+ meth->setFileName( m_file->name() );
+
+#line 1032 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST __t46 = _t;
+ RefJavaAST tmp44_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),METHOD_DEF);
+ _t = _t->getFirstChild();
+ m=modifiers(_t);
+ _t = _retTree;
+ tp=typeSpec(_t);
+ _t = _retTree;
+ methodHead(_t,meth);
+ _t = _retTree;
+ _t = __t46;
+ _t = _t->getNextSibling();
+#line 264 "java.store.g"
+
+ meth->setResultType( tp );
+ if( m.contains("public") )
+ meth->setAccess( CodeModelItem::Public );
+ else if( m.contains("protected") )
+ meth->setAccess( CodeModelItem::Protected );
+ else
+ meth->setAccess( CodeModelItem::Private );
+
+#line 1057 "JavaStoreWalker.cpp"
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return meth ;
+}
+
+ VariableDom JavaStoreWalker::variableDef(RefJavaAST _t) {
+#line 293 "java.store.g"
+ VariableDom attr ;
+#line 1071 "JavaStoreWalker.cpp"
+ RefJavaAST variableDef_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 293 "java.store.g"
+
+ QStringList m;
+ QString tp;
+ attr = m_model->create<VariableModel>();
+ attr->setFileName( m_file->name() );
+
+#line 1080 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST __t51 = _t;
+ RefJavaAST tmp45_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VARIABLE_DEF);
+ _t = _t->getFirstChild();
+ m=modifiers(_t);
+ _t = _retTree;
+ tp=typeSpec(_t);
+ _t = _retTree;
+ variableDeclarator(_t,attr);
+ _t = _retTree;
+ varInitializer(_t);
+ _t = _retTree;
+ _t = __t51;
+ _t = _t->getNextSibling();
+#line 300 "java.store.g"
+
+ attr->setType( tp );
+ if( m.contains("public") )
+ attr->setAccess( CodeModelItem::Public );
+ else if( m.contains("protected") )
+ attr->setAccess( CodeModelItem::Protected );
+ else
+ attr->setAccess( CodeModelItem::Private );
+
+ attr->setStatic( m.contains("static") );
+
+#line 1109 "JavaStoreWalker.cpp"
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return attr ;
+}
+
+ FunctionDom JavaStoreWalker::ctorDef(RefJavaAST _t) {
+#line 239 "java.store.g"
+ FunctionDom meth ;
+#line 1123 "JavaStoreWalker.cpp"
+ RefJavaAST ctorDef_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 239 "java.store.g"
+
+ QStringList m;
+ meth = m_model->create<FunctionModel>();
+ meth->setFileName( m_file->name() );
+
+#line 1131 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST __t44 = _t;
+ RefJavaAST tmp46_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CTOR_DEF);
+ _t = _t->getFirstChild();
+ m=modifiers(_t);
+ _t = _retTree;
+ methodHead(_t,meth);
+ _t = _retTree;
+ slist(_t);
+ _t = _retTree;
+ _t = __t44;
+ _t = _t->getNextSibling();
+#line 247 "java.store.g"
+
+ if( m.contains("public") )
+ meth->setAccess( CodeModelItem::Public );
+ else if( m.contains("protected") )
+ meth->setAccess( CodeModelItem::Protected );
+ else
+ meth->setAccess( CodeModelItem::Private );
+
+#line 1155 "JavaStoreWalker.cpp"
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return meth ;
+}
+
+ FunctionDom JavaStoreWalker::methodDef(RefJavaAST _t) {
+#line 275 "java.store.g"
+ FunctionDom meth ;
+#line 1169 "JavaStoreWalker.cpp"
+ RefJavaAST methodDef_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 275 "java.store.g"
+
+ QStringList m;
+ QString tp;
+ meth = m_model->create<FunctionModel>();
+ meth->setFileName( m_file->name() );
+
+#line 1178 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST __t48 = _t;
+ RefJavaAST tmp47_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),METHOD_DEF);
+ _t = _t->getFirstChild();
+ m=modifiers(_t);
+ _t = _retTree;
+ tp=typeSpec(_t);
+ _t = _retTree;
+ methodHead(_t,meth);
+ _t = _retTree;
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case SLIST:
+ {
+ slist(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t48;
+ _t = _t->getNextSibling();
+#line 282 "java.store.g"
+
+ meth->setResultType( tp );
+ if( m.contains("public") )
+ meth->setAccess( CodeModelItem::Public );
+ else if( m.contains("protected") )
+ meth->setAccess( CodeModelItem::Protected );
+ else
+ meth->setAccess( CodeModelItem::Private );
+
+#line 1223 "JavaStoreWalker.cpp"
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return meth ;
+}
+
+void JavaStoreWalker::slist(RefJavaAST _t) {
+ RefJavaAST slist_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t79 = _t;
+ RefJavaAST tmp48_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SLIST);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_1.member(_t->getType()))) {
+ stat(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop81;
+ }
+
+ }
+ _loop81:;
+ } // ( ... )*
+ _t = __t79;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::methodHead(RefJavaAST _t,
+ FunctionDom meth
+) {
+ RefJavaAST methodHead_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 350 "java.store.g"
+ ArgumentDom arg;
+#line 1274 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST tmp49_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ RefJavaAST __t65 = _t;
+ RefJavaAST tmp50_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PARAMETERS);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == PARAMETER_DEF)) {
+ arg=parameterDef(_t);
+ _t = _retTree;
+#line 351 "java.store.g"
+ meth->addArgument(arg);
+#line 1293 "JavaStoreWalker.cpp"
+ }
+ else {
+ goto _loop67;
+ }
+
+ }
+ _loop67:;
+ } // ( ... )*
+ _t = __t65;
+ _t = _t->getNextSibling();
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LITERAL_throws:
+ {
+ throwsClause(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ case SLIST:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+#line 352 "java.store.g"
+
+ meth->setName( tmp49_AST_in->getText().c_str() );
+ meth->setScope( m_currentScope );
+ meth->setStartPosition( tmp49_AST_in->getLine(), tmp49_AST_in->getColumn() );
+
+#line 1331 "JavaStoreWalker.cpp"
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::variableDeclarator(RefJavaAST _t,
+ VariableDom attr
+) {
+ RefJavaAST variableDeclarator_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ {
+ RefJavaAST tmp51_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+#line 329 "java.store.g"
+
+ attr->setName( tmp51_AST_in->getText().c_str() );
+ attr->setStartPosition( tmp51_AST_in->getLine(), tmp51_AST_in->getColumn() );
+
+#line 1360 "JavaStoreWalker.cpp"
+ break;
+ }
+ case LBRACK:
+ {
+ RefJavaAST tmp52_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LBRACK);
+ _t = _t->getNextSibling();
+ variableDeclarator(_t,attr);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::varInitializer(RefJavaAST _t) {
+ RefJavaAST varInitializer_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ASSIGN:
+ {
+ RefJavaAST __t58 = _t;
+ RefJavaAST tmp53_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ASSIGN);
+ _t = _t->getFirstChild();
+ initializer(_t);
+ _t = _retTree;
+ _t = __t58;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+ ArgumentDom JavaStoreWalker::parameterDef(RefJavaAST _t) {
+#line 313 "java.store.g"
+ ArgumentDom arg ;
+#line 1426 "JavaStoreWalker.cpp"
+ RefJavaAST parameterDef_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+#line 313 "java.store.g"
+
+ QString tp;
+ arg = m_model->create<ArgumentModel>();
+
+#line 1433 "JavaStoreWalker.cpp"
+
+ try { // for error handling
+ RefJavaAST __t53 = _t;
+ RefJavaAST tmp54_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PARAMETER_DEF);
+ _t = _t->getFirstChild();
+ modifiers(_t);
+ _t = _retTree;
+ tp=typeSpec(_t);
+ _t = _retTree;
+ RefJavaAST tmp55_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ _t = __t53;
+ _t = _t->getNextSibling();
+#line 318 "java.store.g"
+
+ arg->setType( tp );
+ arg->setName( tmp55_AST_in->getText().c_str() );
+
+#line 1454 "JavaStoreWalker.cpp"
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+ return arg ;
+}
+
+void JavaStoreWalker::objectinitializer(RefJavaAST _t) {
+ RefJavaAST objectinitializer_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t55 = _t;
+ RefJavaAST tmp56_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INSTANCE_INIT);
+ _t = _t->getFirstChild();
+ slist(_t);
+ _t = _retTree;
+ _t = __t55;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::initializer(RefJavaAST _t) {
+ RefJavaAST initializer_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case EXPR:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case ARRAY_INIT:
+ {
+ arrayInitializer(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::expression(RefJavaAST _t) {
+ RefJavaAST expression_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t124 = _t;
+ RefJavaAST tmp57_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EXPR);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ _t = __t124;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::arrayInitializer(RefJavaAST _t) {
+ RefJavaAST arrayInitializer_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t61 = _t;
+ RefJavaAST tmp58_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARRAY_INIT);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == EXPR || _t->getType() == ARRAY_INIT)) {
+ initializer(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop63;
+ }
+
+ }
+ _loop63:;
+ } // ( ... )*
+ _t = __t61;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::throwsClause(RefJavaAST _t) {
+ RefJavaAST throwsClause_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t70 = _t;
+ RefJavaAST tmp59_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_throws);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENT || _t->getType() == DOT)) {
+ identifier(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop72;
+ }
+
+ }
+ _loop72:;
+ } // ( ... )*
+ _t = __t70;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::stat(RefJavaAST _t) {
+ RefJavaAST stat_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case CLASS_DEF:
+ case INTERFACE_DEF:
+ {
+ typeDefinition(_t);
+ _t = _retTree;
+ break;
+ }
+ case VARIABLE_DEF:
+ {
+ variableDef(_t);
+ _t = _retTree;
+ break;
+ }
+ case EXPR:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case LABELED_STAT:
+ {
+ RefJavaAST __t83 = _t;
+ RefJavaAST tmp60_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LABELED_STAT);
+ _t = _t->getFirstChild();
+ RefJavaAST tmp61_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ stat(_t);
+ _t = _retTree;
+ _t = __t83;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_if:
+ {
+ RefJavaAST __t84 = _t;
+ RefJavaAST tmp62_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_if);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ stat(_t);
+ _t = _retTree;
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case SLIST:
+ case VARIABLE_DEF:
+ case CLASS_DEF:
+ case INTERFACE_DEF:
+ case LABELED_STAT:
+ case EXPR:
+ case EMPTY_STAT:
+ case LITERAL_synchronized:
+ case LITERAL_if:
+ case LITERAL_for:
+ case LITERAL_while:
+ case LITERAL_do:
+ case LITERAL_break:
+ case LITERAL_continue:
+ case LITERAL_return:
+ case LITERAL_switch:
+ case LITERAL_throw:
+ case LITERAL_try:
+ {
+ stat(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t84;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_for:
+ {
+ RefJavaAST __t86 = _t;
+ RefJavaAST tmp63_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_for);
+ _t = _t->getFirstChild();
+ RefJavaAST __t87 = _t;
+ RefJavaAST tmp64_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FOR_INIT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case VARIABLE_DEF:
+ {
+ variableDef(_t);
+ _t = _retTree;
+ break;
+ }
+ case ELIST:
+ {
+ elist(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t87;
+ _t = _t->getNextSibling();
+ RefJavaAST __t89 = _t;
+ RefJavaAST tmp65_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FOR_CONDITION);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case EXPR:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t89;
+ _t = _t->getNextSibling();
+ RefJavaAST __t91 = _t;
+ RefJavaAST tmp66_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FOR_ITERATOR);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ELIST:
+ {
+ elist(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t91;
+ _t = _t->getNextSibling();
+ stat(_t);
+ _t = _retTree;
+ _t = __t86;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_while:
+ {
+ RefJavaAST __t93 = _t;
+ RefJavaAST tmp67_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_while);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ stat(_t);
+ _t = _retTree;
+ _t = __t93;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_do:
+ {
+ RefJavaAST __t94 = _t;
+ RefJavaAST tmp68_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_do);
+ _t = _t->getFirstChild();
+ stat(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t94;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_break:
+ {
+ RefJavaAST __t95 = _t;
+ RefJavaAST tmp69_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_break);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ {
+ RefJavaAST tmp70_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t95;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_continue:
+ {
+ RefJavaAST __t97 = _t;
+ RefJavaAST tmp71_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_continue);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ {
+ RefJavaAST tmp72_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t97;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_return:
+ {
+ RefJavaAST __t99 = _t;
+ RefJavaAST tmp73_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_return);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case EXPR:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t99;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_switch:
+ {
+ RefJavaAST __t101 = _t;
+ RefJavaAST tmp74_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_switch);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == CASE_GROUP)) {
+ caseGroup(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop103;
+ }
+
+ }
+ _loop103:;
+ } // ( ... )*
+ _t = __t101;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_throw:
+ {
+ RefJavaAST __t104 = _t;
+ RefJavaAST tmp75_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_throw);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ _t = __t104;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_synchronized:
+ {
+ RefJavaAST __t105 = _t;
+ RefJavaAST tmp76_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_synchronized);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ stat(_t);
+ _t = _retTree;
+ _t = __t105;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_try:
+ {
+ tryBlock(_t);
+ _t = _retTree;
+ break;
+ }
+ case SLIST:
+ {
+ slist(_t);
+ _t = _retTree;
+ break;
+ }
+ case EMPTY_STAT:
+ {
+ RefJavaAST tmp77_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EMPTY_STAT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::elist(RefJavaAST _t) {
+ RefJavaAST elist_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t120 = _t;
+ RefJavaAST tmp78_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ELIST);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == EXPR)) {
+ expression(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop122;
+ }
+
+ }
+ _loop122:;
+ } // ( ... )*
+ _t = __t120;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::caseGroup(RefJavaAST _t) {
+ RefJavaAST caseGroup_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t107 = _t;
+ RefJavaAST tmp79_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CASE_GROUP);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt110=0;
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LITERAL_case:
+ {
+ RefJavaAST __t109 = _t;
+ RefJavaAST tmp80_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_case);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ _t = __t109;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_default:
+ {
+ RefJavaAST tmp81_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_default);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ if ( _cnt110>=1 ) { goto _loop110; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+ }
+ _cnt110++;
+ }
+ _loop110:;
+ } // ( ... )+
+ slist(_t);
+ _t = _retTree;
+ _t = __t107;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::tryBlock(RefJavaAST _t) {
+ RefJavaAST tryBlock_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t112 = _t;
+ RefJavaAST tmp82_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_try);
+ _t = _t->getFirstChild();
+ slist(_t);
+ _t = _retTree;
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == LITERAL_catch)) {
+ handler(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop114;
+ }
+
+ }
+ _loop114:;
+ } // ( ... )*
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LITERAL_finally:
+ {
+ RefJavaAST __t116 = _t;
+ RefJavaAST tmp83_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_finally);
+ _t = _t->getFirstChild();
+ slist(_t);
+ _t = _retTree;
+ _t = __t116;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t112;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::handler(RefJavaAST _t) {
+ RefJavaAST handler_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t118 = _t;
+ RefJavaAST tmp84_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_catch);
+ _t = _t->getFirstChild();
+ parameterDef(_t);
+ _t = _retTree;
+ slist(_t);
+ _t = _retTree;
+ _t = __t118;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::expr(RefJavaAST _t) {
+ RefJavaAST expr_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case QUESTION:
+ {
+ RefJavaAST __t126 = _t;
+ RefJavaAST tmp85_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),QUESTION);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t126;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ASSIGN:
+ {
+ RefJavaAST __t127 = _t;
+ RefJavaAST tmp86_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t127;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PLUS_ASSIGN:
+ {
+ RefJavaAST __t128 = _t;
+ RefJavaAST tmp87_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PLUS_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t128;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MINUS_ASSIGN:
+ {
+ RefJavaAST __t129 = _t;
+ RefJavaAST tmp88_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MINUS_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t129;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case STAR_ASSIGN:
+ {
+ RefJavaAST __t130 = _t;
+ RefJavaAST tmp89_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STAR_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t130;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DIV_ASSIGN:
+ {
+ RefJavaAST __t131 = _t;
+ RefJavaAST tmp90_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DIV_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t131;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MOD_ASSIGN:
+ {
+ RefJavaAST __t132 = _t;
+ RefJavaAST tmp91_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MOD_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t132;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SR_ASSIGN:
+ {
+ RefJavaAST __t133 = _t;
+ RefJavaAST tmp92_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SR_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t133;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BSR_ASSIGN:
+ {
+ RefJavaAST __t134 = _t;
+ RefJavaAST tmp93_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BSR_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t134;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SL_ASSIGN:
+ {
+ RefJavaAST __t135 = _t;
+ RefJavaAST tmp94_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SL_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t135;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BAND_ASSIGN:
+ {
+ RefJavaAST __t136 = _t;
+ RefJavaAST tmp95_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BAND_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t136;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BXOR_ASSIGN:
+ {
+ RefJavaAST __t137 = _t;
+ RefJavaAST tmp96_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BXOR_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t137;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BOR_ASSIGN:
+ {
+ RefJavaAST __t138 = _t;
+ RefJavaAST tmp97_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BOR_ASSIGN);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t138;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LOR:
+ {
+ RefJavaAST __t139 = _t;
+ RefJavaAST tmp98_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LOR);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t139;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LAND:
+ {
+ RefJavaAST __t140 = _t;
+ RefJavaAST tmp99_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LAND);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t140;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BOR:
+ {
+ RefJavaAST __t141 = _t;
+ RefJavaAST tmp100_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BOR);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t141;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BXOR:
+ {
+ RefJavaAST __t142 = _t;
+ RefJavaAST tmp101_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BXOR);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t142;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BAND:
+ {
+ RefJavaAST __t143 = _t;
+ RefJavaAST tmp102_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BAND);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t143;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NOT_EQUAL:
+ {
+ RefJavaAST __t144 = _t;
+ RefJavaAST tmp103_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NOT_EQUAL);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t144;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case EQUAL:
+ {
+ RefJavaAST __t145 = _t;
+ RefJavaAST tmp104_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EQUAL);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t145;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LT_:
+ {
+ RefJavaAST __t146 = _t;
+ RefJavaAST tmp105_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LT_);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t146;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GT:
+ {
+ RefJavaAST __t147 = _t;
+ RefJavaAST tmp106_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GT);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t147;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LE:
+ {
+ RefJavaAST __t148 = _t;
+ RefJavaAST tmp107_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LE);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t148;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GE:
+ {
+ RefJavaAST __t149 = _t;
+ RefJavaAST tmp108_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GE);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t149;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SL:
+ {
+ RefJavaAST __t150 = _t;
+ RefJavaAST tmp109_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SL);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t150;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SR:
+ {
+ RefJavaAST __t151 = _t;
+ RefJavaAST tmp110_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SR);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t151;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BSR:
+ {
+ RefJavaAST __t152 = _t;
+ RefJavaAST tmp111_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BSR);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t152;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PLUS:
+ {
+ RefJavaAST __t153 = _t;
+ RefJavaAST tmp112_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PLUS);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t153;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MINUS:
+ {
+ RefJavaAST __t154 = _t;
+ RefJavaAST tmp113_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MINUS);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t154;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DIV:
+ {
+ RefJavaAST __t155 = _t;
+ RefJavaAST tmp114_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DIV);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t155;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MOD:
+ {
+ RefJavaAST __t156 = _t;
+ RefJavaAST tmp115_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MOD);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t156;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case STAR:
+ {
+ RefJavaAST __t157 = _t;
+ RefJavaAST tmp116_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STAR);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t157;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INC:
+ {
+ RefJavaAST __t158 = _t;
+ RefJavaAST tmp117_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INC);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ _t = __t158;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DEC:
+ {
+ RefJavaAST __t159 = _t;
+ RefJavaAST tmp118_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DEC);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ _t = __t159;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case POST_INC:
+ {
+ RefJavaAST __t160 = _t;
+ RefJavaAST tmp119_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),POST_INC);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ _t = __t160;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case POST_DEC:
+ {
+ RefJavaAST __t161 = _t;
+ RefJavaAST tmp120_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),POST_DEC);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ _t = __t161;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BNOT:
+ {
+ RefJavaAST __t162 = _t;
+ RefJavaAST tmp121_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BNOT);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ _t = __t162;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LNOT:
+ {
+ RefJavaAST __t163 = _t;
+ RefJavaAST tmp122_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LNOT);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ _t = __t163;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_instanceof:
+ {
+ RefJavaAST __t164 = _t;
+ RefJavaAST tmp123_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_instanceof);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t164;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case UNARY_MINUS:
+ {
+ RefJavaAST __t165 = _t;
+ RefJavaAST tmp124_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),UNARY_MINUS);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ _t = __t165;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case UNARY_PLUS:
+ {
+ RefJavaAST __t166 = _t;
+ RefJavaAST tmp125_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),UNARY_PLUS);
+ _t = _t->getFirstChild();
+ expr(_t);
+ _t = _retTree;
+ _t = __t166;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TYPE:
+ case TYPECAST:
+ case INDEX_OP:
+ case METHOD_CALL:
+ case IDENT:
+ case DOT:
+ case LITERAL_this:
+ case LITERAL_super:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ {
+ primaryExpression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::primaryExpression(RefJavaAST _t) {
+ RefJavaAST primaryExpression_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ {
+ RefJavaAST tmp126_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ RefJavaAST __t168 = _t;
+ RefJavaAST tmp127_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case TYPE:
+ case TYPECAST:
+ case INDEX_OP:
+ case POST_INC:
+ case POST_DEC:
+ case METHOD_CALL:
+ case UNARY_MINUS:
+ case UNARY_PLUS:
+ case IDENT:
+ case DOT:
+ case STAR:
+ case LITERAL_this:
+ case LITERAL_super:
+ case ASSIGN:
+ case PLUS_ASSIGN:
+ case MINUS_ASSIGN:
+ case STAR_ASSIGN:
+ case DIV_ASSIGN:
+ case MOD_ASSIGN:
+ case SR_ASSIGN:
+ case BSR_ASSIGN:
+ case SL_ASSIGN:
+ case BAND_ASSIGN:
+ case BXOR_ASSIGN:
+ case BOR_ASSIGN:
+ case QUESTION:
+ case LOR:
+ case LAND:
+ case BOR:
+ case BXOR:
+ case BAND:
+ case NOT_EQUAL:
+ case EQUAL:
+ case LT_:
+ case GT:
+ case LE:
+ case GE:
+ case LITERAL_instanceof:
+ case SL:
+ case SR:
+ case BSR:
+ case PLUS:
+ case MINUS:
+ case DIV:
+ case MOD:
+ case INC:
+ case DEC:
+ case BNOT:
+ case LNOT:
+ case LITERAL_true:
+ case LITERAL_false:
+ case LITERAL_null:
+ case LITERAL_new:
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ {
+ expr(_t);
+ _t = _retTree;
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ {
+ RefJavaAST tmp128_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INDEX_OP:
+ {
+ arrayIndex(_t);
+ _t = _retTree;
+ break;
+ }
+ case LITERAL_this:
+ {
+ RefJavaAST tmp129_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_this);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_class:
+ {
+ RefJavaAST tmp130_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_class);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_new:
+ {
+ RefJavaAST __t171 = _t;
+ RefJavaAST tmp131_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_new);
+ _t = _t->getFirstChild();
+ RefJavaAST tmp132_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ elist(_t);
+ _t = _retTree;
+ _t = __t171;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ break;
+ }
+ case ARRAY_DECLARATOR:
+ {
+ RefJavaAST __t172 = _t;
+ RefJavaAST tmp133_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARRAY_DECLARATOR);
+ _t = _t->getFirstChild();
+ type(_t);
+ _t = _retTree;
+ _t = __t172;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_void:
+ case LITERAL_boolean:
+ case LITERAL_byte:
+ case LITERAL_char:
+ case LITERAL_short:
+ case LITERAL_int:
+ case LITERAL_float:
+ case LITERAL_long:
+ case LITERAL_double:
+ {
+ builtInType(_t);
+ _t = _retTree;
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LITERAL_class:
+ {
+ RefJavaAST tmp134_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_class);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t168;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INDEX_OP:
+ {
+ arrayIndex(_t);
+ _t = _retTree;
+ break;
+ }
+ case METHOD_CALL:
+ {
+ RefJavaAST __t174 = _t;
+ RefJavaAST tmp135_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),METHOD_CALL);
+ _t = _t->getFirstChild();
+ primaryExpression(_t);
+ _t = _retTree;
+ elist(_t);
+ _t = _retTree;
+ _t = __t174;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TYPECAST:
+ {
+ RefJavaAST __t175 = _t;
+ RefJavaAST tmp136_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TYPECAST);
+ _t = _t->getFirstChild();
+ typeSpec(_t);
+ _t = _retTree;
+ expr(_t);
+ _t = _retTree;
+ _t = __t175;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_new:
+ {
+ newExpression(_t);
+ _t = _retTree;
+ break;
+ }
+ case NUM_INT:
+ case CHAR_LITERAL:
+ case STRING_LITERAL:
+ case NUM_FLOAT:
+ {
+ constant(_t);
+ _t = _retTree;
+ break;
+ }
+ case LITERAL_super:
+ {
+ RefJavaAST tmp137_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_super);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_true:
+ {
+ RefJavaAST tmp138_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_true);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_false:
+ {
+ RefJavaAST tmp139_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_false);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_this:
+ {
+ RefJavaAST tmp140_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_this);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LITERAL_null:
+ {
+ RefJavaAST tmp141_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_null);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case TYPE:
+ {
+ typeSpec(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::arrayIndex(RefJavaAST _t) {
+ RefJavaAST arrayIndex_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t177 = _t;
+ RefJavaAST tmp142_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INDEX_OP);
+ _t = _t->getFirstChild();
+ primaryExpression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t177;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::newExpression(RefJavaAST _t) {
+ RefJavaAST newExpression_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t180 = _t;
+ RefJavaAST tmp143_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_new);
+ _t = _t->getFirstChild();
+ type(_t);
+ _t = _retTree;
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARRAY_DECLARATOR:
+ {
+ newArrayDeclarator(_t);
+ _t = _retTree;
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARRAY_INIT:
+ {
+ arrayInitializer(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ break;
+ }
+ case ELIST:
+ {
+ elist(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t180;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::constant(RefJavaAST _t) {
+ RefJavaAST constant_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NUM_INT:
+ {
+ RefJavaAST tmp144_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_INT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHAR_LITERAL:
+ {
+ RefJavaAST tmp145_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHAR_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case STRING_LITERAL:
+ {
+ RefJavaAST tmp146_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STRING_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUM_FLOAT:
+ {
+ RefJavaAST tmp147_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_FLOAT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::newArrayDeclarator(RefJavaAST _t) {
+ RefJavaAST newArrayDeclarator_AST_in = (_t == RefJavaAST(ASTNULL)) ? RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefJavaAST __t184 = _t;
+ RefJavaAST tmp148_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARRAY_DECLARATOR);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARRAY_DECLARATOR:
+ {
+ newArrayDeclarator(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ case EXPR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ {
+ if (_t == RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case EXPR:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t184;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefJavaAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void JavaStoreWalker::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& )
+{
+}
+const char* JavaStoreWalker::tokenNames[] = {
+ "<0>",
+ "EOF",
+ "<2>",
+ "NULL_TREE_LOOKAHEAD",
+ "BLOCK",
+ "MODIFIERS",
+ "OBJBLOCK",
+ "SLIST",
+ "CTOR_DEF",
+ "METHOD_DEF",
+ "VARIABLE_DEF",
+ "INSTANCE_INIT",
+ "STATIC_INIT",
+ "TYPE",
+ "CLASS_DEF",
+ "INTERFACE_DEF",
+ "PACKAGE_DEF",
+ "ARRAY_DECLARATOR",
+ "EXTENDS_CLAUSE",
+ "IMPLEMENTS_CLAUSE",
+ "PARAMETERS",
+ "PARAMETER_DEF",
+ "LABELED_STAT",
+ "TYPECAST",
+ "INDEX_OP",
+ "POST_INC",
+ "POST_DEC",
+ "METHOD_CALL",
+ "EXPR",
+ "ARRAY_INIT",
+ "IMPORT",
+ "UNARY_MINUS",
+ "UNARY_PLUS",
+ "CASE_GROUP",
+ "ELIST",
+ "FOR_INIT",
+ "FOR_CONDITION",
+ "FOR_ITERATOR",
+ "EMPTY_STAT",
+ "\"final\"",
+ "\"abstract\"",
+ "\"strictfp\"",
+ "SUPER_CTOR_CALL",
+ "CTOR_CALL",
+ "\"package\"",
+ "SEMI",
+ "\"import\"",
+ "LBRACK",
+ "RBRACK",
+ "\"void\"",
+ "\"boolean\"",
+ "\"byte\"",
+ "\"char\"",
+ "\"short\"",
+ "\"int\"",
+ "\"float\"",
+ "\"long\"",
+ "\"double\"",
+ "IDENT",
+ "DOT",
+ "STAR",
+ "\"private\"",
+ "\"public\"",
+ "\"protected\"",
+ "\"static\"",
+ "\"transient\"",
+ "\"native\"",
+ "\"threadsafe\"",
+ "\"synchronized\"",
+ "\"volatile\"",
+ "\"class\"",
+ "\"extends\"",
+ "\"interface\"",
+ "LCURLY",
+ "RCURLY",
+ "COMMA",
+ "\"implements\"",
+ "LPAREN",
+ "RPAREN",
+ "\"this\"",
+ "\"super\"",
+ "ASSIGN",
+ "\"throws\"",
+ "COLON",
+ "\"if\"",
+ "\"else\"",
+ "\"for\"",
+ "\"while\"",
+ "\"do\"",
+ "\"break\"",
+ "\"continue\"",
+ "\"return\"",
+ "\"switch\"",
+ "\"throw\"",
+ "\"case\"",
+ "\"default\"",
+ "\"try\"",
+ "\"finally\"",
+ "\"catch\"",
+ "PLUS_ASSIGN",
+ "MINUS_ASSIGN",
+ "STAR_ASSIGN",
+ "DIV_ASSIGN",
+ "MOD_ASSIGN",
+ "SR_ASSIGN",
+ "BSR_ASSIGN",
+ "SL_ASSIGN",
+ "BAND_ASSIGN",
+ "BXOR_ASSIGN",
+ "BOR_ASSIGN",
+ "QUESTION",
+ "LOR",
+ "LAND",
+ "BOR",
+ "BXOR",
+ "BAND",
+ "NOT_EQUAL",
+ "EQUAL",
+ "LT_",
+ "GT",
+ "LE",
+ "GE",
+ "\"instanceof\"",
+ "SL",
+ "SR",
+ "BSR",
+ "PLUS",
+ "MINUS",
+ "DIV",
+ "MOD",
+ "INC",
+ "DEC",
+ "BNOT",
+ "LNOT",
+ "\"true\"",
+ "\"false\"",
+ "\"null\"",
+ "\"new\"",
+ "NUM_INT",
+ "CHAR_LITERAL",
+ "STRING_LITERAL",
+ "NUM_FLOAT",
+ "NUM_LONG",
+ "NUM_DOUBLE",
+ "WS",
+ "SL_COMMENT",
+ "ML_COMMENT",
+ "ESC",
+ "HEX_DIGIT",
+ "VOCAB",
+ "EXPONENT",
+ "FLOAT_SUFFIX",
+ "\"const\"",
+ 0
+};
+
+const unsigned long JavaStoreWalker::_tokenSet_0_data_[] = { 0UL, 3758096768UL, 63UL, 0UL, 16777216UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "final" "abstract" "private" "public" "protected" "static" "transient"
+// "native" "threadsafe" "synchronized" "volatile" "const"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaStoreWalker::_tokenSet_0(_tokenSet_0_data_,12);
+const unsigned long JavaStoreWalker::_tokenSet_1_data_[] = { 272680064UL, 64UL, 1070596112UL, 1UL, 0UL, 0UL, 0UL, 0UL };
+// SLIST VARIABLE_DEF CLASS_DEF INTERFACE_DEF LABELED_STAT EXPR EMPTY_STAT
+// "synchronized" "if" "for" "while" "do" "break" "continue" "return" "switch"
+// "throw" "try"
+const ANTLR_USE_NAMESPACE(antlr)BitSet JavaStoreWalker::_tokenSet_1(_tokenSet_1_data_,8);
+
+
diff --git a/languages/java/JavaStoreWalker.hpp b/languages/java/JavaStoreWalker.hpp
new file mode 100644
index 00000000..ed43efcc
--- /dev/null
+++ b/languages/java/JavaStoreWalker.hpp
@@ -0,0 +1,164 @@
+#ifndef INC_JavaStoreWalker_hpp_
+#define INC_JavaStoreWalker_hpp_
+
+#line 3 "java.store.g"
+
+ #include <codemodel.h>
+ #include "JavaAST.hpp"
+
+ #include <qstring.h>
+ #include <qstringlist.h>
+ #include <qvaluestack.h>
+ #include <qfileinfo.h>
+
+#line 15 "JavaStoreWalker.hpp"
+#include <antlr/config.hpp>
+#include "JavaStoreWalkerTokenTypes.hpp"
+/* $ANTLR 2.7.7 (20061129): "java.store.g" -> "JavaStoreWalker.hpp"$ */
+#include <antlr/TreeParser.hpp>
+
+#line 13 "java.store.g"
+
+ #include <codemodel.h>
+
+ #include <kdebug.h>
+
+#line 27 "JavaStoreWalker.hpp"
+/** Java 1.2 AST Recognizer Grammar
+ *
+ * Author:
+ * Terence Parr parrt@magelang.com
+ *
+ * Version tracking now done with following ID:
+ *
+ * $Id$
+ *
+ * This grammar is in the PUBLIC DOMAIN
+ *
+ * BUGS
+ */
+class CUSTOM_API JavaStoreWalker : public ANTLR_USE_NAMESPACE(antlr)TreeParser, public JavaStoreWalkerTokenTypes
+{
+#line 43 "java.store.g"
+
+private:
+ QStringList m_currentScope;
+ CodeModel* m_model;
+ FileDom m_file;
+ QValueStack<ClassDom> m_currentClass;
+ int m_currentAccess;
+ int m_anon;
+ ANTLR_USE_NAMESPACE(antlr)JavaASTFactory ast_factory;
+
+public:
+ void setCodeModel( CodeModel* model )
+ {
+ m_model = model;
+ }
+
+ void setFile( FileDom file )
+ {
+ m_file = file;
+ }
+
+ void init()
+ {
+ m_currentScope.clear();
+ m_currentAccess = CodeModelItem::Public;
+ m_anon = 0;
+
+ initializeASTFactory (ast_factory);
+ setASTFactory (&ast_factory);
+ }
+#line 44 "JavaStoreWalker.hpp"
+public:
+ JavaStoreWalker();
+ static void initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory );
+ int getNumTokens() const
+ {
+ return JavaStoreWalker::NUM_TOKENS;
+ }
+ const char* getTokenName( int type ) const
+ {
+ if( type > getNumTokens() ) return 0;
+ return JavaStoreWalker::tokenNames[type];
+ }
+ const char* const* getTokenNames() const
+ {
+ return JavaStoreWalker::tokenNames;
+ }
+ public: void compilationUnit(RefJavaAST _t);
+ public: QString packageDefinition(RefJavaAST _t);
+ public: QString importDefinition(RefJavaAST _t);
+ public: void typeDefinition(RefJavaAST _t);
+ public: QString identifier(RefJavaAST _t);
+ public: QString identifierStar(RefJavaAST _t);
+ public: QStringList modifiers(RefJavaAST _t);
+ public: QStringList extendsClause(RefJavaAST _t);
+ public: QStringList implementsClause(RefJavaAST _t);
+ public: void objBlock(RefJavaAST _t,
+ ClassDom klass
+ );
+ public: void interfaceBlock(RefJavaAST _t,
+ ClassDom klass
+ );
+ public: QString typeSpec(RefJavaAST _t);
+ public: QString typeSpecArray(RefJavaAST _t);
+ public: QString type(RefJavaAST _t);
+ public: void builtInType(RefJavaAST _t);
+ public: void modifier(RefJavaAST _t);
+ public: FunctionDom methodDecl(RefJavaAST _t);
+ public: VariableDom variableDef(RefJavaAST _t);
+ public: FunctionDom ctorDef(RefJavaAST _t);
+ public: FunctionDom methodDef(RefJavaAST _t);
+ public: void slist(RefJavaAST _t);
+ public: void methodHead(RefJavaAST _t,
+ FunctionDom meth
+ );
+ public: void variableDeclarator(RefJavaAST _t,
+ VariableDom attr
+ );
+ public: void varInitializer(RefJavaAST _t);
+ public: ArgumentDom parameterDef(RefJavaAST _t);
+ public: void objectinitializer(RefJavaAST _t);
+ public: void initializer(RefJavaAST _t);
+ public: void expression(RefJavaAST _t);
+ public: void arrayInitializer(RefJavaAST _t);
+ public: void throwsClause(RefJavaAST _t);
+ public: void stat(RefJavaAST _t);
+ public: void elist(RefJavaAST _t);
+ public: void caseGroup(RefJavaAST _t);
+ public: void tryBlock(RefJavaAST _t);
+ public: void handler(RefJavaAST _t);
+ public: void expr(RefJavaAST _t);
+ public: void primaryExpression(RefJavaAST _t);
+ public: void arrayIndex(RefJavaAST _t);
+ public: void newExpression(RefJavaAST _t);
+ public: void constant(RefJavaAST _t);
+ public: void newArrayDeclarator(RefJavaAST _t);
+public:
+ ANTLR_USE_NAMESPACE(antlr)RefAST getAST()
+ {
+ return ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST);
+ }
+
+protected:
+ RefJavaAST returnAST;
+ RefJavaAST _retTree;
+private:
+ static const char* tokenNames[];
+#ifndef NO_STATIC_CONSTS
+ static const int NUM_TOKENS = 153;
+#else
+ enum {
+ NUM_TOKENS = 153
+ };
+#endif
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+};
+
+#endif /*INC_JavaStoreWalker_hpp_*/
diff --git a/languages/java/JavaStoreWalkerTokenTypes.hpp b/languages/java/JavaStoreWalkerTokenTypes.hpp
new file mode 100644
index 00000000..44322944
--- /dev/null
+++ b/languages/java/JavaStoreWalkerTokenTypes.hpp
@@ -0,0 +1,169 @@
+#ifndef INC_JavaStoreWalkerTokenTypes_hpp_
+#define INC_JavaStoreWalkerTokenTypes_hpp_
+
+/* $ANTLR 2.7.7 (20061129): "java.store.g" -> "JavaStoreWalkerTokenTypes.hpp"$ */
+
+#ifndef CUSTOM_API
+# define CUSTOM_API
+#endif
+
+#ifdef __cplusplus
+struct CUSTOM_API JavaStoreWalkerTokenTypes {
+#endif
+ enum {
+ EOF_ = 1,
+ BLOCK = 4,
+ MODIFIERS = 5,
+ OBJBLOCK = 6,
+ SLIST = 7,
+ CTOR_DEF = 8,
+ METHOD_DEF = 9,
+ VARIABLE_DEF = 10,
+ INSTANCE_INIT = 11,
+ STATIC_INIT = 12,
+ TYPE = 13,
+ CLASS_DEF = 14,
+ INTERFACE_DEF = 15,
+ PACKAGE_DEF = 16,
+ ARRAY_DECLARATOR = 17,
+ EXTENDS_CLAUSE = 18,
+ IMPLEMENTS_CLAUSE = 19,
+ PARAMETERS = 20,
+ PARAMETER_DEF = 21,
+ LABELED_STAT = 22,
+ TYPECAST = 23,
+ INDEX_OP = 24,
+ POST_INC = 25,
+ POST_DEC = 26,
+ METHOD_CALL = 27,
+ EXPR = 28,
+ ARRAY_INIT = 29,
+ IMPORT = 30,
+ UNARY_MINUS = 31,
+ UNARY_PLUS = 32,
+ CASE_GROUP = 33,
+ ELIST = 34,
+ FOR_INIT = 35,
+ FOR_CONDITION = 36,
+ FOR_ITERATOR = 37,
+ EMPTY_STAT = 38,
+ FINAL = 39,
+ ABSTRACT = 40,
+ STRICTFP = 41,
+ SUPER_CTOR_CALL = 42,
+ CTOR_CALL = 43,
+ LITERAL_package = 44,
+ SEMI = 45,
+ LITERAL_import = 46,
+ LBRACK = 47,
+ RBRACK = 48,
+ LITERAL_void = 49,
+ LITERAL_boolean = 50,
+ LITERAL_byte = 51,
+ LITERAL_char = 52,
+ LITERAL_short = 53,
+ LITERAL_int = 54,
+ LITERAL_float = 55,
+ LITERAL_long = 56,
+ LITERAL_double = 57,
+ IDENT = 58,
+ DOT = 59,
+ STAR = 60,
+ LITERAL_private = 61,
+ LITERAL_public = 62,
+ LITERAL_protected = 63,
+ LITERAL_static = 64,
+ LITERAL_transient = 65,
+ LITERAL_native = 66,
+ LITERAL_threadsafe = 67,
+ LITERAL_synchronized = 68,
+ LITERAL_volatile = 69,
+ LITERAL_class = 70,
+ LITERAL_extends = 71,
+ LITERAL_interface = 72,
+ LCURLY = 73,
+ RCURLY = 74,
+ COMMA = 75,
+ LITERAL_implements = 76,
+ LPAREN = 77,
+ RPAREN = 78,
+ LITERAL_this = 79,
+ LITERAL_super = 80,
+ ASSIGN = 81,
+ LITERAL_throws = 82,
+ COLON = 83,
+ LITERAL_if = 84,
+ LITERAL_else = 85,
+ LITERAL_for = 86,
+ LITERAL_while = 87,
+ LITERAL_do = 88,
+ LITERAL_break = 89,
+ LITERAL_continue = 90,
+ LITERAL_return = 91,
+ LITERAL_switch = 92,
+ LITERAL_throw = 93,
+ LITERAL_case = 94,
+ LITERAL_default = 95,
+ LITERAL_try = 96,
+ LITERAL_finally = 97,
+ LITERAL_catch = 98,
+ PLUS_ASSIGN = 99,
+ MINUS_ASSIGN = 100,
+ STAR_ASSIGN = 101,
+ DIV_ASSIGN = 102,
+ MOD_ASSIGN = 103,
+ SR_ASSIGN = 104,
+ BSR_ASSIGN = 105,
+ SL_ASSIGN = 106,
+ BAND_ASSIGN = 107,
+ BXOR_ASSIGN = 108,
+ BOR_ASSIGN = 109,
+ QUESTION = 110,
+ LOR = 111,
+ LAND = 112,
+ BOR = 113,
+ BXOR = 114,
+ BAND = 115,
+ NOT_EQUAL = 116,
+ EQUAL = 117,
+ LT_ = 118,
+ GT = 119,
+ LE = 120,
+ GE = 121,
+ LITERAL_instanceof = 122,
+ SL = 123,
+ SR = 124,
+ BSR = 125,
+ PLUS = 126,
+ MINUS = 127,
+ DIV = 128,
+ MOD = 129,
+ INC = 130,
+ DEC = 131,
+ BNOT = 132,
+ LNOT = 133,
+ LITERAL_true = 134,
+ LITERAL_false = 135,
+ LITERAL_null = 136,
+ LITERAL_new = 137,
+ NUM_INT = 138,
+ CHAR_LITERAL = 139,
+ STRING_LITERAL = 140,
+ NUM_FLOAT = 141,
+ NUM_LONG = 142,
+ NUM_DOUBLE = 143,
+ WS = 144,
+ SL_COMMENT = 145,
+ ML_COMMENT = 146,
+ ESC = 147,
+ HEX_DIGIT = 148,
+ VOCAB = 149,
+ EXPONENT = 150,
+ FLOAT_SUFFIX = 151,
+ LITERAL_const = 152,
+ NULL_TREE_LOOKAHEAD = 3
+ };
+#ifdef __cplusplus
+};
+#endif
+#endif /*INC_JavaStoreWalkerTokenTypes_hpp_*/
diff --git a/languages/java/JavaStoreWalkerTokenTypes.txt b/languages/java/JavaStoreWalkerTokenTypes.txt
new file mode 100644
index 00000000..c81c4b44
--- /dev/null
+++ b/languages/java/JavaStoreWalkerTokenTypes.txt
@@ -0,0 +1,151 @@
+// $ANTLR 2.7.7 (20061129): java.store.g -> JavaStoreWalkerTokenTypes.txt$
+JavaStoreWalker // output token vocab name
+BLOCK=4
+MODIFIERS=5
+OBJBLOCK=6
+SLIST=7
+CTOR_DEF=8
+METHOD_DEF=9
+VARIABLE_DEF=10
+INSTANCE_INIT=11
+STATIC_INIT=12
+TYPE=13
+CLASS_DEF=14
+INTERFACE_DEF=15
+PACKAGE_DEF=16
+ARRAY_DECLARATOR=17
+EXTENDS_CLAUSE=18
+IMPLEMENTS_CLAUSE=19
+PARAMETERS=20
+PARAMETER_DEF=21
+LABELED_STAT=22
+TYPECAST=23
+INDEX_OP=24
+POST_INC=25
+POST_DEC=26
+METHOD_CALL=27
+EXPR=28
+ARRAY_INIT=29
+IMPORT=30
+UNARY_MINUS=31
+UNARY_PLUS=32
+CASE_GROUP=33
+ELIST=34
+FOR_INIT=35
+FOR_CONDITION=36
+FOR_ITERATOR=37
+EMPTY_STAT=38
+FINAL="final"=39
+ABSTRACT="abstract"=40
+STRICTFP="strictfp"=41
+SUPER_CTOR_CALL=42
+CTOR_CALL=43
+LITERAL_package="package"=44
+SEMI=45
+LITERAL_import="import"=46
+LBRACK=47
+RBRACK=48
+LITERAL_void="void"=49
+LITERAL_boolean="boolean"=50
+LITERAL_byte="byte"=51
+LITERAL_char="char"=52
+LITERAL_short="short"=53
+LITERAL_int="int"=54
+LITERAL_float="float"=55
+LITERAL_long="long"=56
+LITERAL_double="double"=57
+IDENT=58
+DOT=59
+STAR=60
+LITERAL_private="private"=61
+LITERAL_public="public"=62
+LITERAL_protected="protected"=63
+LITERAL_static="static"=64
+LITERAL_transient="transient"=65
+LITERAL_native="native"=66
+LITERAL_threadsafe="threadsafe"=67
+LITERAL_synchronized="synchronized"=68
+LITERAL_volatile="volatile"=69
+LITERAL_class="class"=70
+LITERAL_extends="extends"=71
+LITERAL_interface="interface"=72
+LCURLY=73
+RCURLY=74
+COMMA=75
+LITERAL_implements="implements"=76
+LPAREN=77
+RPAREN=78
+LITERAL_this="this"=79
+LITERAL_super="super"=80
+ASSIGN=81
+LITERAL_throws="throws"=82
+COLON=83
+LITERAL_if="if"=84
+LITERAL_else="else"=85
+LITERAL_for="for"=86
+LITERAL_while="while"=87
+LITERAL_do="do"=88
+LITERAL_break="break"=89
+LITERAL_continue="continue"=90
+LITERAL_return="return"=91
+LITERAL_switch="switch"=92
+LITERAL_throw="throw"=93
+LITERAL_case="case"=94
+LITERAL_default="default"=95
+LITERAL_try="try"=96
+LITERAL_finally="finally"=97
+LITERAL_catch="catch"=98
+PLUS_ASSIGN=99
+MINUS_ASSIGN=100
+STAR_ASSIGN=101
+DIV_ASSIGN=102
+MOD_ASSIGN=103
+SR_ASSIGN=104
+BSR_ASSIGN=105
+SL_ASSIGN=106
+BAND_ASSIGN=107
+BXOR_ASSIGN=108
+BOR_ASSIGN=109
+QUESTION=110
+LOR=111
+LAND=112
+BOR=113
+BXOR=114
+BAND=115
+NOT_EQUAL=116
+EQUAL=117
+LT_=118
+GT=119
+LE=120
+GE=121
+LITERAL_instanceof="instanceof"=122
+SL=123
+SR=124
+BSR=125
+PLUS=126
+MINUS=127
+DIV=128
+MOD=129
+INC=130
+DEC=131
+BNOT=132
+LNOT=133
+LITERAL_true="true"=134
+LITERAL_false="false"=135
+LITERAL_null="null"=136
+LITERAL_new="new"=137
+NUM_INT=138
+CHAR_LITERAL=139
+STRING_LITERAL=140
+NUM_FLOAT=141
+NUM_LONG=142
+NUM_DOUBLE=143
+WS=144
+SL_COMMENT=145
+ML_COMMENT=146
+ESC=147
+HEX_DIGIT=148
+VOCAB=149
+EXPONENT=150
+FLOAT_SUFFIX=151
+LITERAL_const="const"=152
diff --git a/languages/java/JavaTokenTypes.hpp b/languages/java/JavaTokenTypes.hpp
new file mode 100644
index 00000000..e36fa54c
--- /dev/null
+++ b/languages/java/JavaTokenTypes.hpp
@@ -0,0 +1,168 @@
+#ifndef INC_JavaTokenTypes_hpp_
+#define INC_JavaTokenTypes_hpp_
+
+/* $ANTLR 2.7.7 (20061129): "java.g" -> "JavaTokenTypes.hpp"$ */
+
+#ifndef CUSTOM_API
+# define CUSTOM_API
+#endif
+
+#ifdef __cplusplus
+struct CUSTOM_API JavaTokenTypes {
+#endif
+ enum {
+ EOF_ = 1,
+ BLOCK = 4,
+ MODIFIERS = 5,
+ OBJBLOCK = 6,
+ SLIST = 7,
+ CTOR_DEF = 8,
+ METHOD_DEF = 9,
+ VARIABLE_DEF = 10,
+ INSTANCE_INIT = 11,
+ STATIC_INIT = 12,
+ TYPE = 13,
+ CLASS_DEF = 14,
+ INTERFACE_DEF = 15,
+ PACKAGE_DEF = 16,
+ ARRAY_DECLARATOR = 17,
+ EXTENDS_CLAUSE = 18,
+ IMPLEMENTS_CLAUSE = 19,
+ PARAMETERS = 20,
+ PARAMETER_DEF = 21,
+ LABELED_STAT = 22,
+ TYPECAST = 23,
+ INDEX_OP = 24,
+ POST_INC = 25,
+ POST_DEC = 26,
+ METHOD_CALL = 27,
+ EXPR = 28,
+ ARRAY_INIT = 29,
+ IMPORT = 30,
+ UNARY_MINUS = 31,
+ UNARY_PLUS = 32,
+ CASE_GROUP = 33,
+ ELIST = 34,
+ FOR_INIT = 35,
+ FOR_CONDITION = 36,
+ FOR_ITERATOR = 37,
+ EMPTY_STAT = 38,
+ FINAL = 39,
+ ABSTRACT = 40,
+ STRICTFP = 41,
+ SUPER_CTOR_CALL = 42,
+ CTOR_CALL = 43,
+ LITERAL_package = 44,
+ SEMI = 45,
+ LITERAL_import = 46,
+ LBRACK = 47,
+ RBRACK = 48,
+ LITERAL_void = 49,
+ LITERAL_boolean = 50,
+ LITERAL_byte = 51,
+ LITERAL_char = 52,
+ LITERAL_short = 53,
+ LITERAL_int = 54,
+ LITERAL_float = 55,
+ LITERAL_long = 56,
+ LITERAL_double = 57,
+ IDENT = 58,
+ DOT = 59,
+ STAR = 60,
+ LITERAL_private = 61,
+ LITERAL_public = 62,
+ LITERAL_protected = 63,
+ LITERAL_static = 64,
+ LITERAL_transient = 65,
+ LITERAL_native = 66,
+ LITERAL_threadsafe = 67,
+ LITERAL_synchronized = 68,
+ LITERAL_volatile = 69,
+ LITERAL_class = 70,
+ LITERAL_extends = 71,
+ LITERAL_interface = 72,
+ LCURLY = 73,
+ RCURLY = 74,
+ COMMA = 75,
+ LITERAL_implements = 76,
+ LPAREN = 77,
+ RPAREN = 78,
+ LITERAL_this = 79,
+ LITERAL_super = 80,
+ ASSIGN = 81,
+ LITERAL_throws = 82,
+ COLON = 83,
+ LITERAL_if = 84,
+ LITERAL_else = 85,
+ LITERAL_for = 86,
+ LITERAL_while = 87,
+ LITERAL_do = 88,
+ LITERAL_break = 89,
+ LITERAL_continue = 90,
+ LITERAL_return = 91,
+ LITERAL_switch = 92,
+ LITERAL_throw = 93,
+ LITERAL_case = 94,
+ LITERAL_default = 95,
+ LITERAL_try = 96,
+ LITERAL_finally = 97,
+ LITERAL_catch = 98,
+ PLUS_ASSIGN = 99,
+ MINUS_ASSIGN = 100,
+ STAR_ASSIGN = 101,
+ DIV_ASSIGN = 102,
+ MOD_ASSIGN = 103,
+ SR_ASSIGN = 104,
+ BSR_ASSIGN = 105,
+ SL_ASSIGN = 106,
+ BAND_ASSIGN = 107,
+ BXOR_ASSIGN = 108,
+ BOR_ASSIGN = 109,
+ QUESTION = 110,
+ LOR = 111,
+ LAND = 112,
+ BOR = 113,
+ BXOR = 114,
+ BAND = 115,
+ NOT_EQUAL = 116,
+ EQUAL = 117,
+ LT_ = 118,
+ GT = 119,
+ LE = 120,
+ GE = 121,
+ LITERAL_instanceof = 122,
+ SL = 123,
+ SR = 124,
+ BSR = 125,
+ PLUS = 126,
+ MINUS = 127,
+ DIV = 128,
+ MOD = 129,
+ INC = 130,
+ DEC = 131,
+ BNOT = 132,
+ LNOT = 133,
+ LITERAL_true = 134,
+ LITERAL_false = 135,
+ LITERAL_null = 136,
+ LITERAL_new = 137,
+ NUM_INT = 138,
+ CHAR_LITERAL = 139,
+ STRING_LITERAL = 140,
+ NUM_FLOAT = 141,
+ NUM_LONG = 142,
+ NUM_DOUBLE = 143,
+ WS = 144,
+ SL_COMMENT = 145,
+ ML_COMMENT = 146,
+ ESC = 147,
+ HEX_DIGIT = 148,
+ VOCAB = 149,
+ EXPONENT = 150,
+ FLOAT_SUFFIX = 151,
+ NULL_TREE_LOOKAHEAD = 3
+ };
+#ifdef __cplusplus
+};
+#endif
+#endif /*INC_JavaTokenTypes_hpp_*/
diff --git a/languages/java/JavaTokenTypes.txt b/languages/java/JavaTokenTypes.txt
new file mode 100644
index 00000000..48ff0ca3
--- /dev/null
+++ b/languages/java/JavaTokenTypes.txt
@@ -0,0 +1,150 @@
+// $ANTLR 2.7.7 (20061129): java.g -> JavaTokenTypes.txt$
+Java // output token vocab name
+BLOCK=4
+MODIFIERS=5
+OBJBLOCK=6
+SLIST=7
+CTOR_DEF=8
+METHOD_DEF=9
+VARIABLE_DEF=10
+INSTANCE_INIT=11
+STATIC_INIT=12
+TYPE=13
+CLASS_DEF=14
+INTERFACE_DEF=15
+PACKAGE_DEF=16
+ARRAY_DECLARATOR=17
+EXTENDS_CLAUSE=18
+IMPLEMENTS_CLAUSE=19
+PARAMETERS=20
+PARAMETER_DEF=21
+LABELED_STAT=22
+TYPECAST=23
+INDEX_OP=24
+POST_INC=25
+POST_DEC=26
+METHOD_CALL=27
+EXPR=28
+ARRAY_INIT=29
+IMPORT=30
+UNARY_MINUS=31
+UNARY_PLUS=32
+CASE_GROUP=33
+ELIST=34
+FOR_INIT=35
+FOR_CONDITION=36
+FOR_ITERATOR=37
+EMPTY_STAT=38
+FINAL="final"=39
+ABSTRACT="abstract"=40
+STRICTFP="strictfp"=41
+SUPER_CTOR_CALL=42
+CTOR_CALL=43
+LITERAL_package="package"=44
+SEMI=45
+LITERAL_import="import"=46
+LBRACK=47
+RBRACK=48
+LITERAL_void="void"=49
+LITERAL_boolean="boolean"=50
+LITERAL_byte="byte"=51
+LITERAL_char="char"=52
+LITERAL_short="short"=53
+LITERAL_int="int"=54
+LITERAL_float="float"=55
+LITERAL_long="long"=56
+LITERAL_double="double"=57
+IDENT=58
+DOT=59
+STAR=60
+LITERAL_private="private"=61
+LITERAL_public="public"=62
+LITERAL_protected="protected"=63
+LITERAL_static="static"=64
+LITERAL_transient="transient"=65
+LITERAL_native="native"=66
+LITERAL_threadsafe="threadsafe"=67
+LITERAL_synchronized="synchronized"=68
+LITERAL_volatile="volatile"=69
+LITERAL_class="class"=70
+LITERAL_extends="extends"=71
+LITERAL_interface="interface"=72
+LCURLY=73
+RCURLY=74
+COMMA=75
+LITERAL_implements="implements"=76
+LPAREN=77
+RPAREN=78
+LITERAL_this="this"=79
+LITERAL_super="super"=80
+ASSIGN=81
+LITERAL_throws="throws"=82
+COLON=83
+LITERAL_if="if"=84
+LITERAL_else="else"=85
+LITERAL_for="for"=86
+LITERAL_while="while"=87
+LITERAL_do="do"=88
+LITERAL_break="break"=89
+LITERAL_continue="continue"=90
+LITERAL_return="return"=91
+LITERAL_switch="switch"=92
+LITERAL_throw="throw"=93
+LITERAL_case="case"=94
+LITERAL_default="default"=95
+LITERAL_try="try"=96
+LITERAL_finally="finally"=97
+LITERAL_catch="catch"=98
+PLUS_ASSIGN=99
+MINUS_ASSIGN=100
+STAR_ASSIGN=101
+DIV_ASSIGN=102
+MOD_ASSIGN=103
+SR_ASSIGN=104
+BSR_ASSIGN=105
+SL_ASSIGN=106
+BAND_ASSIGN=107
+BXOR_ASSIGN=108
+BOR_ASSIGN=109
+QUESTION=110
+LOR=111
+LAND=112
+BOR=113
+BXOR=114
+BAND=115
+NOT_EQUAL=116
+EQUAL=117
+LT_=118
+GT=119
+LE=120
+GE=121
+LITERAL_instanceof="instanceof"=122
+SL=123
+SR=124
+BSR=125
+PLUS=126
+MINUS=127
+DIV=128
+MOD=129
+INC=130
+DEC=131
+BNOT=132
+LNOT=133
+LITERAL_true="true"=134
+LITERAL_false="false"=135
+LITERAL_null="null"=136
+LITERAL_new="new"=137
+NUM_INT=138
+CHAR_LITERAL=139
+STRING_LITERAL=140
+NUM_FLOAT=141
+NUM_LONG=142
+NUM_DOUBLE=143
+WS=144
+SL_COMMENT=145
+ML_COMMENT=146
+ESC=147
+HEX_DIGIT=148
+VOCAB=149
+EXPONENT=150
+FLOAT_SUFFIX=151
diff --git a/languages/java/KDevJavaSupportIface.cpp b/languages/java/KDevJavaSupportIface.cpp
new file mode 100644
index 00000000..306ad76e
--- /dev/null
+++ b/languages/java/KDevJavaSupportIface.cpp
@@ -0,0 +1,24 @@
+
+#include "KDevJavaSupportIface.h"
+#include "javasupportpart.h"
+
+KDevJavaSupportIface::KDevJavaSupportIface( JavaSupportPart* javaSupport )
+ : QObject( javaSupport ), DCOPObject( "KDevJavaSupport" ), m_javaSupport( javaSupport )
+{
+}
+
+KDevJavaSupportIface::~KDevJavaSupportIface()
+{
+}
+
+void KDevJavaSupportIface::addClass()
+{
+ m_javaSupport->slotNewClass();
+}
+
+void KDevJavaSupportIface::parseProject()
+{
+ m_javaSupport->parseProject();
+}
+
+#include "KDevJavaSupportIface.moc"
diff --git a/languages/java/KDevJavaSupportIface.h b/languages/java/KDevJavaSupportIface.h
new file mode 100644
index 00000000..e0dce53f
--- /dev/null
+++ b/languages/java/KDevJavaSupportIface.h
@@ -0,0 +1,26 @@
+
+#ifndef KDEVJAVASUPPORTIFACE_H
+#define KDEVJAVASUPPORTIFACE_H
+
+#include <qobject.h>
+#include <dcopobject.h>
+
+class JavaSupportPart;
+
+class KDevJavaSupportIface : public QObject, public DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+public:
+ KDevJavaSupportIface( JavaSupportPart* javaSupport );
+ ~KDevJavaSupportIface();
+
+k_dcop:
+ void addClass();
+ void parseProject();
+
+private:
+ JavaSupportPart* m_javaSupport;
+};
+
+#endif
diff --git a/languages/java/Makefile.am b/languages/java/Makefile.am
new file mode 100644
index 00000000..386f220f
--- /dev/null
+++ b/languages/java/Makefile.am
@@ -0,0 +1,37 @@
+# Here resides the Java support part.
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+
+# SUBDIRS = templates subclassing_template newclass_templates file_templates
+SUBDIRS = file_templates app_templates doc
+
+INCLUDES = -I$(top_srcdir)/lib/antlr -I$(top_srcdir)/lib/catalog \
+ -I$(top_srcdir)/lib/compat -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevjavasupport.la
+libkdevjavasupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevjavasupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la $(top_builddir)/lib/antlr/src/libantlr.la $(top_builddir)/lib/catalog/libkdevcatalog.la
+
+libkdevjavasupport_la_SOURCES = JavaLexer.cpp KDevJavaSupportIface.cpp javasupportfactory.cpp \
+JavaRecognizer.cpp backgroundparser.cpp configproblemreporter.ui javasupportpart.cpp \
+JavaStoreWalker.cpp javasupport_utils.cpp problemreporter.cpp driver.cpp kdevdriver.cpp KDevJavaSupportIface.skel
+
+
+EXTRA_DIST = java.g java.tree.g java.store.g
+
+
+#JavaLexer.hpp JavaLexer.cpp JavaRecognizer.hpp JavaRecognizer.cpp: # java.g
+# antlr java.g
+
+#JavaStoreWalker.hpp JavaStoreWalker.cpp: # java.store.g
+# antlr java.store.g
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevjavasupport.desktop
+
+rcdir = $(kde_datadir)/kdevjavasupport
+rc_DATA = kdevjavasupport.rc
diff --git a/languages/java/README.dox b/languages/java/README.dox
new file mode 100644
index 00000000..49af1e43
--- /dev/null
+++ b/languages/java/README.dox
@@ -0,0 +1,48 @@
+/** \class JavaSupportPart
+This is Java language support plugin.
+
+Put a more detailed description of your part in these lines. It can span
+over several lines. You can even use some html commands in these lines like:
+<code>This is code</code>, html links <a href="http://somelocation">link text</a>,
+and images.
+
+\authors <a href="mailto:jonas.nordin AT syncom.se">Jonas Nordin</a> Copyright (C) 1999
+\authors <a href="mailto:bernd AT kdevelop.org">Bernd Gehrmann</a> Copyright (C) 2000-2001
+\authors <a href="mailto:roberto AT kdevelop.org">Roberto Raggi</a> Copyright (C) 2002-2003
+
+\maintainer <a href="mailto:roberto AT kdevelop.org">Roberto Raggi</a> Copyright (C) 2002-2003
+
+\feature Java language support
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug bugs in <a href="http://bugs.kde.org/buglist.cgi?product=kdevelop&component=javasupport&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=Bug+Number">javasupport component at Bugzilla database</a>
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/java/app_templates/Makefile.am b/languages/java/app_templates/Makefile.am
new file mode 100644
index 00000000..b47abfca
--- /dev/null
+++ b/languages/java/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = javahello kappjava superwaba
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/CompiledLanguageIDE/JavaIDE
+profiles_DATA = java.appwizard
diff --git a/languages/java/app_templates/java.appwizard b/languages/java/app_templates/java.appwizard
new file mode 100644
index 00000000..087d6c0c
--- /dev/null
+++ b/languages/java/app_templates/java.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=javahello,kappjava,superwaba
diff --git a/languages/java/app_templates/javahello/.kdev_ignore b/languages/java/app_templates/javahello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/java/app_templates/javahello/.kdev_ignore
diff --git a/languages/java/app_templates/javahello/Main.java b/languages/java/app_templates/javahello/Main.java
new file mode 100644
index 00000000..dc757fe5
--- /dev/null
+++ b/languages/java/app_templates/javahello/Main.java
@@ -0,0 +1,7 @@
+
+class Main{
+
+ public static void main( String[] args ){
+ System.out.println( "Hello, world!" );
+ }
+}
diff --git a/languages/java/app_templates/javahello/Makefile.am b/languages/java/app_templates/javahello/Makefile.am
new file mode 100644
index 00000000..8551a6ac
--- /dev/null
+++ b/languages/java/app_templates/javahello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = Main.java build.xml javahello.filelist javahello.kdevelop
+templateName= javahello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/java/app_templates/javahello/build.xml b/languages/java/app_templates/javahello/build.xml
new file mode 100644
index 00000000..27b6046d
--- /dev/null
+++ b/languages/java/app_templates/javahello/build.xml
@@ -0,0 +1,37 @@
+<project name="%{APPNAME}" default="dist" basedir=".">
+ <description>
+ hello application
+ </description>
+ <!-- set global properties for this build -->
+ <property name="src" location="." />
+ <property name="build" location="build" />
+ <property name="dist" location="dist" />
+
+ <target name="init">
+ <!-- Create the time stamp -->
+ <tstamp/>
+ <!-- Create the build directory structure used by compile -->
+ <mkdir dir="${build}"/>
+ </target>
+
+ <target name="compile" depends="init"
+ description="compile the source " >
+ <!-- Compile the java code from ${src} into ${build} -->
+ <javac srcdir="${src}" destdir="${build}"/>
+ </target>
+
+ <target name="dist" depends="compile"
+ description="generate the distribution" >
+ <!-- Create the distribution directory -->
+ <mkdir dir="${dist}/lib"/>
+
+ <jar jarfile="${dist}/lib/%{APPNAMELC}.jar" basedir="${build}"/>
+ </target>
+
+ <target name="clean"
+ description="clean up" >
+ <!-- Delete the ${build} and ${dist} directory trees -->
+ <delete dir="${build}"/>
+ <delete dir="${dist}"/>
+ </target>
+</project>
diff --git a/languages/java/app_templates/javahello/javahello b/languages/java/app_templates/javahello/javahello
new file mode 100644
index 00000000..a2225ce5
--- /dev/null
+++ b/languages/java/app_templates/javahello/javahello
@@ -0,0 +1,11 @@
+# Java application
+[General]
+Name=Application
+Name[fr]=Une application JAVA / Ant
+Icon=qmakeapp.png
+Category=Java/Ant project
+Category[fr]=Java/Ant
+Comment=Generate a Java application
+Comment[fr]=Génère une application dans le language JAVA en utilisant Ant
+FileTemplates=java,JavaStyle
+ShowFilesAfterGeneration=Main.java
diff --git a/languages/java/app_templates/javahello/javahello.filelist b/languages/java/app_templates/javahello/javahello.filelist
new file mode 100644
index 00000000..97da44be
--- /dev/null
+++ b/languages/java/app_templates/javahello/javahello.filelist
@@ -0,0 +1,2 @@
+# KDevelop Custom Project File List
+Main.java
diff --git a/languages/java/app_templates/javahello/javahello.kdevelop b/languages/java/app_templates/javahello/javahello.kdevelop
new file mode 100644
index 00000000..c3eb6898
--- /dev/null
+++ b/languages/java/app_templates/javahello/javahello.kdevelop
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAntProject</projectmanagement>
+ <primarylanguage>Java</primarylanguage>
+ <ignoreparts>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevcustomproject>
+ <build>
+ <buildtool>ant</buildtool>
+ </build>
+ </kdevcustomproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ </kdevfileview>
+</kdevelop>
diff --git a/languages/java/app_templates/javahello/javahello.kdevtemplate b/languages/java/app_templates/javahello/javahello.kdevtemplate
new file mode 100644
index 00000000..a7427704
--- /dev/null
+++ b/languages/java/app_templates/javahello/javahello.kdevtemplate
@@ -0,0 +1,124 @@
+# KDE Config File
+[General]
+Name=Application
+Name[br]=Arload
+Name[ca]=Aplicació
+Name[cy]=Cymhwysiad
+Name[da]=Program
+Name[de]=Anwendung
+Name[el]=ΕφαÏμογή
+Name[es]=Aplicación
+Name[et]=Rakendus
+Name[eu]=Aplikazioa
+Name[fa]=کاربرد
+Name[ga]=Feidhmchlár
+Name[gl]=Aplicación
+Name[hu]=Alkalmazások
+Name[it]=Applicazione
+Name[ja]=アプリケーション
+Name[lt]=Programa
+Name[ms]=Aplikasi
+Name[nds]=Programm
+Name[ne]=अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Toepassing
+Name[pl]=Program
+Name[pt]=Aplicação
+Name[pt_BR]=Aplicativo
+Name[ru]=Приложение
+Name[rw]=Porogaramu
+Name[sk]=Aplikácia
+Name[sl]=Program
+Name[sr]=Програм
+Name[sr@Latn]=Program
+Name[sv]=Program
+Name[tr]=Uygulama
+Name[zh_CN]=应用程åº
+Name[zh_TW]=應用程å¼
+Icon=qmakeapp.png
+Category=Java/Ant project
+Category[fr]=Java/Ant
+Comment=Generate a Java application
+Comment[ca]=Genera una aplicació Java
+Comment[da]=Generér et Java-program
+Comment[de]=Erstellt eine Java-Anwendung
+Comment[el]=ΔημιουÏγία μιας εφαÏμογής Java
+Comment[es]=Genera una aplicación en Java
+Comment[et]=Java rakenduse loomine
+Comment[eu]=Sortu Java aplikazio bat
+Comment[fa]=یک کاربرد جاوا تولید می‌کند
+Comment[fr]=Génère une application Java
+Comment[ga]=Cruthaigh feidhmchlár Java
+Comment[gl]=Xera unha aplicación Java
+Comment[hu]=Létrehoz egy Java-alkalmazást
+Comment[it]=Genera un'applicazione Java
+Comment[ja]= Java アプリケーションを作æˆ
+Comment[nds]=Stellt en Java-Programm op
+Comment[ne]=जाभा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Genereer een Java-toepassing
+Comment[pl]=Generuj program w Javie
+Comment[pt]=Gera uma aplicação em Java
+Comment[pt_BR]=Gera uma aplicação em Java
+Comment[ru]=Создание Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Java
+Comment[sk]=Vygeneruje Java aplikáciu
+Comment[sr]=Прави Java програм
+Comment[sr@Latn]=Pravi Java program
+Comment[sv]=Skapa ett Java-program
+Comment[tr]=Bir Java uygulaması yarat
+Comment[zh_CN]=生æˆä¸€ä¸ª Java 应用程åº
+Comment[zh_TW]=產生 Java 應用程å¼
+FileTemplates=java,JavaStyle
+ShowFilesAfterGeneration=%{dest}/Main.java
+Archive=javahello.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/javahello.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/javahello.filelist
+Dest=%{dest}/%{APPNAMELC}.filelist
+
+[FILE3]
+Type=install
+Source=%{src}/Main.java
+Dest=%{dest}/Main.java
+
+[FILE4]
+Type=install
+Source=%{src}/build.xml
+Dest=%{dest}/build.xml
+
+[msg]
+Type=message
+Comment=A JAVA application was created in %{dest}
+Comment[ca]=Una aplicació JAVA ha estat creada en %{dest}
+Comment[da]=Et JAVA-program blev oprettet i %{dest}
+Comment[de]=Eine Java-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή JAVA δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación en Java ha sido creada en %{dest}
+Comment[et]=Java rakendus loodi asukohta %{dest}
+Comment[eu]=JAVA aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد جاوا در %{dest} ایجاد شد
+Comment[fr]=Une application Java a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár JAVA i %{dest}
+Comment[gl]=Creouse una aplicación JAVA en %{dest}
+Comment[hu]=Létrejött egy Java-alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Java in %{dest}
+Comment[ja]=JAVA アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en JAVA-Programm opstellt
+Comment[ne]= जाभा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Java-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program w Javie został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação em Java em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação em Java em %{dest}
+Comment[ru]=Приложение Java Ñоздано в %{dest}
+Comment[sk]=Java aplikácia bola vytvorená v %{dest}
+Comment[sr]=Java програм је направљен у %{dest}
+Comment[sr@Latn]=Java program je napravljen u %{dest}
+Comment[sv]=Ett Java-program skapades i %{dest}
+Comment[tr]=Bir JAVA uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个 Java 应用程åº
+Comment[zh_TW]=一個 Java 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/java/app_templates/javahello/javahello.png b/languages/java/app_templates/javahello/javahello.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/java/app_templates/javahello/javahello.png
Binary files differ
diff --git a/languages/java/app_templates/kappjava/.kdev_ignore b/languages/java/app_templates/kappjava/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/java/app_templates/kappjava/.kdev_ignore
diff --git a/languages/java/app_templates/kappjava/Makefile.am b/languages/java/app_templates/kappjava/Makefile.am
new file mode 100644
index 00000000..4cda2ef7
--- /dev/null
+++ b/languages/java/app_templates/kappjava/Makefile.am
@@ -0,0 +1,17 @@
+dataFiles = app.java pref.java appview.java app_client.java appui.rc \
+ src-Makefile.am kappjava.png app.kdevelop subdirs
+templateName = kappjava
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/java/app_templates/kappjava/app.desktop b/languages/java/app_templates/kappjava/app.desktop
new file mode 100644
index 00000000..941c0846
--- /dev/null
+++ b/languages/java/app_templates/kappjava/app.desktop
@@ -0,0 +1,41 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC} %i -caption "%c"
+Icon=%{APPNAMELC}
+Type=Application
+X-DocPath=%{APPNAMELC}/%{APPNAMELC}.html
+Comment=A Java KDE KPart Application
+Comment[ca]=Una aplicació KPart en Java per al KDE
+Comment[da]=Et Java KDE KPart-program
+Comment[de]=Eine KDE-Komponten-Anwendung in Java
+Comment[el]=Μια εφαÏμογή Java KDE KPart
+Comment[es]=Una aplicación KPart en Java para KDE
+Comment[et]=Java KDE KPart rakendus
+Comment[eu]=Java KDE KPart aplikazio bat
+Comment[fa]=یک کاربرد KDE KPart جاوا
+Comment[fr]=Une application KPart en JAVA pour KDE
+Comment[ga]=Feidhmchlár KPart KDE i Java
+Comment[gl]=Unha aplicación KPart de KDE en Java
+Comment[hi]=à¤à¤• जावा केडीई के-पारà¥à¤Ÿ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=Java-ban írt, KPart-alapú KDE-alkalmazás
+Comment[is]=Java KDE KPart forrit
+Comment[it]=Un'applicazione Java KDE KPart
+Comment[ja]= Java KDE KPart アプリケーション
+Comment[nds]=En KDE-Programm in Java
+Comment[ne]=जाभा केडीई KPart अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een Java KDE KPart-toepassing
+Comment[pl]=Element osadzalny KPart Javy
+Comment[pt]=Uma Aplicação KDE KPart em Java
+Comment[pt_BR]=Um Aplicativo KPart do KDE para Java
+Comment[ru]=Приложение KPart Ð´Ð»Ñ KDE на Java
+Comment[sk]=Java KDE KPart aplikácia
+Comment[sl]=Program za Javo KDE KPart
+Comment[sr]=Java KDE KPart програм
+Comment[sr@Latn]=Java KDE KPart program
+Comment[sv]=Ett Java KDE Kpart-program
+Comment[ta]=ஜாவா கெடி கெபாகம௠பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Гузориш KPart барои KDE дар Java
+Comment[tr]=Bir Java KDE KPart Uygulaması
+Comment[zh_CN]=一个 Java KDE KPart 应用程åº
+Comment[zh_TW]=Java KDE KPart 應用程å¼
+Terminal=false
diff --git a/languages/java/app_templates/kappjava/app.java b/languages/java/app_templates/kappjava/app.java
new file mode 100644
index 00000000..2cb3e94a
--- /dev/null
+++ b/languages/java/app_templates/kappjava/app.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) %{YEAR} %{AUTHOR} <%{EMAIL}>
+ */
+
+import java.util.*;
+import org.kde.qt.*;
+import org.kde.koala.*;
+
+/**
+ * This class serves as the main window for %{APPNAME}. It handles the
+ * menus, toolbars, and status bars.
+ *
+ * @short Main window class
+ * @author $AUTHOR <$EMAIL>
+ * @version $APP_VERSION
+ */
+public class %{APPNAME} extends KMainWindow
+{
+ private %{APPNAME}View m_view;
+ private QPrinter m_printer;
+
+%{APPNAME}()
+{
+ super( null, "%{APPNAME}" );
+ m_view = new %{APPNAME}View(this);
+ m_printer = new QPrinter();
+ // accept dnd
+ setAcceptDrops(true);
+
+ // tell the KMainWindow that this is indeed the main widget
+ setCentralWidget(m_view);
+
+ // then, setup our actions
+ setupActions();
+
+ // and a status bar
+ statusBar().show();
+
+ // Apply the create the main window and ask the mainwindow to
+ // automatically save settings if changed: window size, toolbar
+ // position, icon size, etc. Also to add actions for the statusbar
+ // toolbar, and keybindings if necessary.
+ setupGUI();
+
+ // allow the view to change the statusbar and caption
+ connect(m_view, SIGNAL("signalChangeStatusbar(String)"),
+ this, SLOT("changeStatusbar(String)"));
+ connect(m_view, SIGNAL("signalChangeCaption(String)"),
+ this, SLOT("changeCaption(String)"));
+
+}
+
+public void load(KURL url)
+{
+ StringBuffer target = new StringBuffer();
+ // the below code is what you should normally do. in this
+ // example case, we want the url to our own. you probably
+ // want to use this code instead for your app
+
+ // download the contents
+ if (NetAccess.download(url, target, null))
+ {
+ // set our caption
+ setCaption(url.fileName());
+
+ // load in the file (target is always local)
+// loadFile(target);
+
+ // and remove the temp file
+ NetAccess.removeTempFile(target.toString());
+ }
+
+ setCaption(url.url());
+ m_view.openURL(url);
+}
+
+public void setupActions()
+{
+ KApplication kapp = KApplication.kApplication();
+ KStdAction.openNew(this, SLOT("fileNew()"), actionCollection());
+ KStdAction.open(this, SLOT("fileOpen()"), actionCollection());
+ KStdAction.save(this, SLOT("fileSave()"), actionCollection());
+ KStdAction.saveAs(this, SLOT("fileSaveAs()"), actionCollection());
+ KStdAction.print(this, SLOT("filePrint()"), actionCollection());
+ KStdAction.quit(kapp, SLOT("quit()"), actionCollection());
+
+ KStdAction.preferences(this, SLOT("optionsPreferences()"), actionCollection());
+
+ // this doesn't do anything useful. it's just here to illustrate
+ // how to insert a custom menu and menu item
+ KAction custom = new KAction(tr("Cus&tom Menuitem"), new KShortcut(),
+ this, SLOT("optionsPreferences()"),
+ actionCollection(), "custom_action");
+}
+
+protected void saveProperties(KConfig config)
+{
+ // the 'config' object points to the session managed
+ // config file. anything you write here will be available
+ // later when this app is restored
+
+ if (m_view.currentURL() != null)
+ config.writeEntry("lastURL", m_view.currentURL());
+}
+
+protected void readProperties(KConfig config)
+{
+ // the 'config' object points to the session managed
+ // config file. this function is automatically called whenever
+ // the app is being restored. read in here whatever you wrote
+ // in 'saveProperties'
+
+ String url = config.readPathEntry("lastURL");
+
+ if (url != null)
+ m_view.openURL(new KURL(url));
+}
+
+protected void dragEnterEvent(QDragEnterEvent event)
+{
+ // accept uri drops only
+ event.accept(QUriDrag.canDecode(event));
+}
+
+protected void dropEvent(QDropEvent event)
+{
+ // this is a very simplistic implementation of a drop event. we
+ // will only accept a dropped URL. the Qt dnd code can do *much*
+ // much more, so please read the docs there
+ ArrayList uri = new ArrayList();
+
+ // see if we can decode a URI.. if not, just ignore it
+ if (QUriDrag.decode(event, (String[]) uri.toArray()))
+ {
+ // okay, we have a URI.. process it
+ String url, target;
+ url = (String) uri.get(0);
+
+ // load in the file
+ load(new KURL(url));
+ }
+}
+
+private void fileNew()
+{
+ // this slot is called whenever the File.New menu is selected,
+ // the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ // button is clicked
+
+ // create a new window
+ (new %{APPNAME}()).show();
+}
+
+private void fileOpen()
+{
+ // this slot is called whenever the File.Open menu is selected,
+ // the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
+ // button is clicked
+ KURL url = KURLRequesterDlg.getURL(null, this, tr("Open Location") );
+ if (!url.isEmpty())
+ m_view.openURL(url);
+}
+
+private void fileSave()
+{
+ // this slot is called whenever the File.Save menu is selected,
+ // the Save shortcut is pressed (usually CTRL+S) or the Save toolbar
+ // button is clicked
+
+ // save the current file
+}
+
+private void fileSaveAs()
+{
+ // this slot is called whenever the File.Save As menu is selected,
+ KURL file_url = KFileDialog.getSaveURL();
+ if (!file_url.isEmpty() && file_url.isValid())
+ {
+ // save your info, here
+ }
+}
+
+private void filePrint()
+{
+ // this slot is called whenever the File.Print menu is selected,
+ // the Print shortcut is pressed (usually CTRL+P) or the Print toolbar
+ // button is clicked
+ if (m_printer == null) m_printer = new QPrinter();
+ if (QPrintDialog.getPrinterSetup(m_printer))
+ {
+ // setup the printer. with Qt, you always "print" to a
+ // QPainter.. whether the output medium is a pixmap, a screen,
+ // or paper
+ QPainter p = new QPainter();
+ p.begin(m_printer);
+
+ // we let our view do the actual printing
+ QPaintDeviceMetrics metrics = new QPaintDeviceMetrics(m_printer);
+ m_view.print(p, metrics.height(), metrics.width());
+
+ // and send the result to the printer
+ p.end();
+ }
+}
+
+private void optionsPreferences()
+{
+ // popup some sort of preference dialog, here
+ %{APPNAME}Preferences dlg = new %{APPNAME}Preferences();
+ if (dlg.exec() != 0)
+ {
+ // redo your settings
+ }
+}
+
+private void changeStatusbar(String text)
+{
+ // display the text on the statusbar
+ statusBar().message(text);
+}
+
+private void changeCaption(String text)
+{
+ // display the text on the caption
+ setCaption(text);
+}
+
+static String description =
+ "A KDE Application";
+
+static String version = "%{VERSION}";
+
+static String[][] options =
+{
+ { "+[URL]", "Document to open.", null }
+};
+
+static void main(String[] cmdLineArgs)
+{
+ KAboutData about = new KAboutData("%{APPNAMELC}", "%{APPNAME}", version, description,
+ KAboutData.License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", null, null, "%{EMAIL}");
+ about.addAuthor( "%{AUTHOR}", null, "%{EMAIL}" );
+ KCmdLineArgs.init(cmdLineArgs, about);
+ KCmdLineArgs.addCmdLineOptions(options);
+ KApplication app = new KApplication();
+
+ // see if we are starting with session management
+ if (app.isRestored())
+ RESTORE("%{APPNAME}");
+ else
+ {
+ // no session.. just start up normally
+ KCmdLineArgs args = KCmdLineArgs.parsedArgs();
+ if (args.count() == 0)
+ {
+ %{APPNAME} widget = new %{APPNAME}();
+ widget.show();
+ }
+ else
+ {
+ int i = 0;
+ for (; i < args.count(); i++)
+ {
+ %{APPNAME} widget = new %{APPNAME}();
+ widget.show();
+ widget.load(args.url(i));
+ }
+ }
+ args.clear();
+ }
+
+ app.exec();
+ return;
+}
+
+ static {
+ qtjava.initialize();
+ kdejava.initialize();
+ }
+}
+
diff --git a/languages/java/app_templates/kappjava/app.kdevelop b/languages/java/app_templates/kappjava/app.kdevelop
new file mode 100644
index 00000000..078f5c1a
--- /dev/null
+++ b/languages/java/app_templates/kappjava/app.kdevelop
@@ -0,0 +1,88 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>Java</primarylanguage>
+ <keywords>
+ <keyword>Java</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/java</activetarget>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.java" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdebugger>
+ <general>
+ </general>
+ </kdevdebugger>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="java"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/java/app_templates/kappjava/app_client.java b/languages/java/app_templates/kappjava/app_client.java
new file mode 100644
index 00000000..9ed90c8a
--- /dev/null
+++ b/languages/java/app_templates/kappjava/app_client.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) %{YEAR} %{AUTHOR} <%{EMAIL}>
+ */
+
+#include <kapp.h>
+#include <dcopclient.h>
+#include <qdatastream.h>
+#include <qstring.h>
+
+int main(int argc, char **argv)
+{
+ KApplication app(argc, argv, "%{APPNAMELC}_client", false);
+
+ // get our DCOP client and attach so that we may use it
+ DCOPClient *client = app.dcopClient();
+ client->attach();
+
+ // do a 'send' for now
+ QByteArray data;
+ QDataStream ds(data, IO_WriteOnly);
+ if (argc > 1)
+ ds << QString(argv[1]);
+ else
+ ds << QString("http://www.kde.org");
+ client->send("%{APPNAMELC}", "%{APPNAME}Iface", "openURL(QString)", data);
+
+ return app.exec();
+}
diff --git a/languages/java/app_templates/kappjava/appui.rc b/languages/java/app_templates/kappjava/appui.rc
new file mode 100644
index 00000000..ceb4f14e
--- /dev/null
+++ b/languages/java/app_templates/kappjava/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="custom"><text>C&amp;ustom</text>
+ <Action name="custom_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/java/app_templates/kappjava/appview.java b/languages/java/app_templates/kappjava/appview.java
new file mode 100644
index 00000000..1ead5458
--- /dev/null
+++ b/languages/java/app_templates/kappjava/appview.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) %{YEAR} %{AUTHOR} <%{EMAIL}>
+ */
+
+import java.util.*;
+import org.kde.qt.*;
+import org.kde.koala.*;
+
+/**
+ * This is the main view class for %{APPNAME}. Most of the non-menu,
+ * non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ * here.
+ *
+ * This %{APPNAMELC} uses an HTML component as an example.
+ *
+ * @short Main view
+ * @author %{AUTHOR} <%{EMAIL}>
+ * @version %{VERSION}
+ */
+public class %{APPNAME}View extends QWidget
+{
+
+ QHBoxLayout top_layout;
+
+public %{APPNAME}View(QWidget parent)
+{
+ super(parent, null);
+ // setup our layout manager to automatically add our widgets
+ top_layout = new QHBoxLayout(this);
+ top_layout.setAutoAdd(true);
+
+ // we want to look for all components that satisfy our needs. the
+ // trader will actually search through *all* registered KDE
+ // applications and components -- not just KParts. So we have to
+ // specify two things: a service type and a constraint
+ //
+ // the service type is like a mime type. we say that we want all
+ // applications and components that can handle HTML -- 'text/html'
+ //
+ // however, by itself, this will return such things as Netscape..
+ // not what we wanted. so we constrain it by saying that the
+ // string 'KParts/ReadOnlyPart' must be found in the ServiceTypes
+ // field. with this, only components of the type we want will be
+ // returned.
+ ArrayList offers = KTrader.self().query("text/html", "'KParts/ReadOnlyPart' in ServiceTypes");
+
+ KLibFactory factory = null;
+ // in theory, we only care about the first one.. but let's try all
+ // offers just in case the first can't be loaded for some reason
+ Iterator it = offers.iterator();
+ while(it.hasNext())
+ {
+ KService ptr = (KService) it.next();
+
+ // we now know that our offer can handle HTML and is a part.
+ // since it is a part, it must also have a library... let's try to
+ // load that now
+ factory = KLibLoader.self().factory( ptr.library() );
+ if (factory != null)
+ {
+ m_html = (ReadOnlyPart) factory.create(this, ptr.name(), "KParts::ReadOnlyPart");
+ break;
+ }
+ }
+
+ // if our factory is invalid, then we never found our component
+ // and we might as well just exit now
+ if (factory == null)
+ {
+ KMessageBox.error(this, "Could not find a suitable HTML component");
+ return;
+ }
+
+ connect(m_html, SIGNAL("setWindowCaption(String)"),
+ this, SLOT("slotSetTitle(String)"));
+ connect(m_html, SIGNAL("setStatusBarText(String)"),
+ this, SLOT("slotOnURL(String)"));
+
+}
+
+
+public void print(QPainter p, int height, int width)
+{
+ // do the actual printing, here
+ // p.drawText(etc..)
+}
+
+public String currentURL()
+{
+ return m_html.url().url();
+}
+
+public void openURL(String url)
+{
+ openURL(new KURL(url));
+}
+
+public void openURL(KURL url)
+{
+ m_html.openURL(url);
+}
+
+private void slotOnURL(String url)
+{
+ emit("signalChangeStatusbar", url);
+}
+
+private void slotSetTitle(String title)
+{
+ emit("signalChangeCaption", title);
+}
+
+private ReadOnlyPart m_html;
+
+}
diff --git a/languages/java/app_templates/kappjava/kappjava b/languages/java/app_templates/kappjava/kappjava
new file mode 100644
index 00000000..e199ac25
--- /dev/null
+++ b/languages/java/app_templates/kappjava/kappjava
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=Application framework
+Name[fr]=Squelette d'application
+Icon=kappjava.png
+Category=Java/KDE
+Comment=Generates a simple Java KDE application with one toplevel window, menus and toolbars.
+Comment[fr]=Génère une simple application KDE dans le language JAVA avec une fenêtre principale, des menus, et des barres d'outils.
+FileTemplates=java,CStyle
+ShowFilesAfterGeneration=src/APPNAMEView.java
diff --git a/languages/java/app_templates/kappjava/kappjava.kdevtemplate b/languages/java/app_templates/kappjava/kappjava.kdevtemplate
new file mode 100644
index 00000000..3fd80ca8
--- /dev/null
+++ b/languages/java/app_templates/kappjava/kappjava.kdevtemplate
@@ -0,0 +1,163 @@
+# KDE Config File
+[General]
+Name=Application framework
+Name[ca]=Infraestructura d'aplicacions
+Name[da]=Programskelet
+Name[de]=Anwendungsgrundgerüst
+Name[el]=Πλαίσιο εφαÏμογής
+Name[es]=Infraestructura de aplicación
+Name[et]=Rakenduse raamistik
+Name[eu]=Aplikazioen lan-markoa
+Name[fa]=چارچوب کاربرد
+Name[fr]=Infrastructure d'application
+Name[ga]=Creatlach feidhmchláir
+Name[gl]=Entorno de traballo para aplicación
+Name[hu]=Alkalmazás-keretrendszer
+Name[it]=Infrastruttura applicativa
+Name[ja]=アプリケーションフレームワーク
+Name[nds]=Programmrahmenwark
+Name[ne]=अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤•
+Name[nl]=Applicationframework
+Name[pl]=Szablon programu
+Name[pt]=Plataforma de aplicações
+Name[pt_BR]=Plataforma de aplicações
+Name[ru]=Приложение KDE
+Name[sk]=AplikaÄný framework
+Name[sl]=Ogrodje programa
+Name[sr]=Радни оквир програма
+Name[sr@Latn]=Radni okvir programa
+Name[sv]=Programramverk
+Name[tr]=Uygulama Çatısı
+Name[zh_CN]=应用程åºæ¡†æž¶
+Name[zh_TW]=應用程å¼æ¡†æž¶
+Icon=kappjava.png
+Category=Java/KDE
+Comment=Generates a simple Java KDE application with one toplevel window, menus and toolbars.
+Comment[ca]=Genera una simple aplicació per al KDE en Java amb una finestra principal, menús i barres d'eines.
+Comment[da]=Genererer et simpelt Java KDE program med et vindue på topniveau, menuer og værktøjslinjer.
+Comment[de]=Erstellt eine einfache Java-KDE-Anwendung mit einem Toplevel-Fenster, Menüs und Werkzeugleisten.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή Java του KDE με ένα ανώτεÏο παÏάθυÏο, μενοÏ, και γÏαμμές εÏγαλείων.
+Comment[es]=Genera una sencilla aplicación para KDE en Java, con una ventana principal, menús y barras de herramientas.
+Comment[et]=Lihtsa Java KDE rakenduse loomine ühe tipptaseme akna, menüüde ja tööriistaribadega.
+Comment[eu]=Goi-mailako lehio bat, menuak eta tresna-barrak dituen Java KDE aplikazio bat sortzen du.
+Comment[fa]=یک کاربرد سادۀ KDE جاوا با یک پنجرۀ سطح بالا، گزینگان و میله‌های ابزار تولید می‌کند.
+Comment[fr]=Génère une application KDE simple en Java comprenant une fenêtre de premier niveau, des menus et des barres d'outils.
+Comment[gl]=Xera unha aplicación sinxela KDE en Java cunha xanela principal, menús e barras de ferramentas.
+Comment[hu]=Létrehoz egy egyszerű Java-alapú KDE-alkalmazást egy főablakkal, menükkel és eszköztárakkal.
+Comment[it]=Genera una semplice applicazione KDE Java con una finestra toplevel, menu e barre degli strumenti.
+Comment[nds]=Stellt en eenfach KDE-Programm in Java mit een böverst Finster, Menüs un Warktüüchbalkens op.
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ उचà¥à¤šà¤¤à¤¹ सञà¥à¤à¥à¤¯à¤¾à¤², मेनॠर उपकरणपटà¥à¤Ÿà¥€à¤¸à¤à¤— साधारण जाभा केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een eenvoudige Java KDE-toepassing met een toplevel window, menu's en toolbars.
+Comment[pl]=Generuje prosty program KDE w Javie posiadający okno, menu i paski narzędzi.
+Comment[pt]=Gera uma aplicação para KDE simples em Java, com uma janela de topo, menus e barras de ferramentas.
+Comment[pt_BR]=Gera uma aplicação para KDE simples em Java, com uma janela de topo, menus e barras de ferramentas.
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Java KDE Ñ Ð¾ÐºÐ½Ð¾Ð¼, меню и панелÑми инÑтрументов.
+Comment[sk]=Vygeneruje jednoduchú Java KDE aplikáciu s jedným oknom, menu a panelom nástrojov.
+Comment[sr]=Прави једноÑтаван Java KDE програм Ñа једним прозором највишег нивоа, менијима и тракама Ñа алатом.
+Comment[sr@Latn]=Pravi jednostavan Java KDE program sa jednim prozorom najvišeg nivoa, menijima i trakama sa alatom.
+Comment[sv]=Skapar ett enkelt Java KDE-program med ett toppnivåfönster, menyer och verktygsrader.
+Comment[tr]=Bir üst seviye penceresi, menüleri ve araç çubukları olan basit bir Java KDE uygulaması yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªç®€å•çš„带有顶级窗å£ã€èœå•å’Œå·¥å…·æ çš„ Java KDE 应用程åºã€‚
+Comment[zh_TW]=產生一個簡單的 Java KDE 應用程å¼ï¼Œå…§å«é ‚層視窗ã€é¸å–®èˆ‡å·¥å…·åˆ—。
+FileTemplates=java,CStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAME}View.java
+Archive=kappjava.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[DOCBOOK]
+Type=include
+File=%{kdevelop}/template-common/dockbook.kdevtemplate
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE13]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE14]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE15]
+Type=install
+Source=%{src}/app.java
+Dest=%{dest}/src/%{APPNAME}.java
+
+[FILE16]
+Type=install
+Source=%{src}/appview.java
+Dest=%{dest}/src/%{APPNAME}View.java
+
+[FILE17]
+Type=install
+Source=%{src}/pref.java
+Dest=%{dest}/src/%{APPNAME}Preferences.java
+
+[FILE18]
+Type=install
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
diff --git a/languages/java/app_templates/kappjava/kappjava.png b/languages/java/app_templates/kappjava/kappjava.png
new file mode 100644
index 00000000..913ebb87
--- /dev/null
+++ b/languages/java/app_templates/kappjava/kappjava.png
Binary files differ
diff --git a/languages/java/app_templates/kappjava/pref.java b/languages/java/app_templates/kappjava/pref.java
new file mode 100644
index 00000000..a50fdb31
--- /dev/null
+++ b/languages/java/app_templates/kappjava/pref.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) %{YEAR} %{AUTHOR} <%{EMAIL}>
+ */
+
+import java.util.*;
+import org.kde.qt.*;
+import org.kde.koala.*;
+
+public class %{APPNAME}Preferences extends KDialogBase
+{
+private %{APPNAME}PrefPageOne m_pageOne;
+private %{APPNAME}PrefPageTwo m_pageTwo;
+
+public %{APPNAME}Preferences()
+{
+ super(TreeList, "%{APPNAME} Preferences",
+ Help|Default|Ok|Apply|Cancel, Ok);
+
+ // this is the base class for your preferences dialog. it is now
+ // a Treelist dialog.. but there are a number of other
+ // possibilities (including Tab, Swallow, and just Plain)
+ QFrame frame;
+ frame = addPage(tr("First Page"), tr("Page One Options"));
+ m_pageOne = new %{APPNAME}PrefPageOne(frame);
+
+ frame = addPage(tr("Second Page"), tr("Page Two Options"));
+ m_pageTwo = new %{APPNAME}PrefPageTwo(frame);
+}
+
+public class %{APPNAME}PrefPageOne extends QFrame {
+public %{APPNAME}PrefPageOne(QWidget parent)
+{
+ super(parent);
+ QHBoxLayout layout = new QHBoxLayout(this);
+ layout.setAutoAdd(true);
+
+ new QLabel("Add something here", this);
+}
+}
+
+public class %{APPNAME}PrefPageTwo extends QFrame {
+public %{APPNAME}PrefPageTwo(QWidget parent)
+{
+ super(parent);
+ QHBoxLayout layout = new QHBoxLayout(this);
+ layout.setAutoAdd(true);
+
+ new QLabel("Add something here", this);
+}
+}
+
+}
diff --git a/languages/java/app_templates/kappjava/src-Makefile.am b/languages/java/app_templates/kappjava/src-Makefile.am
new file mode 100644
index 00000000..6468994c
--- /dev/null
+++ b/languages/java/app_templates/kappjava/src-Makefile.am
@@ -0,0 +1,18 @@
+## Makefile.am for %{APPNAMELC}
+
+JAVAROOT = .
+
+# which sources should be compiled for %{APPNAMELC}
+java_JAVA = %{APPNAME}.java %{APPNAME}View.java \
+ %{APPNAME}Preferences.java
+
+
+KDE_ICON = %{APPNAMELC}
+
+# this is where the kdelnk file will go
+kdelnkdir = $(kde_appsdir)/Utilities
+kdelnk_DATA = %{APPNAMELC}.desktop
+
+# this is where the XML-GUI resource file goes
+rcdir = $(kde_datadir)/%{APPNAMELC}
+rc_DATA = %{APPNAMELC}ui.rc
diff --git a/languages/java/app_templates/kappjava/subdirs b/languages/java/app_templates/kappjava/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/java/app_templates/kappjava/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/java/app_templates/superwaba/.kdev_ignore b/languages/java/app_templates/superwaba/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/java/app_templates/superwaba/.kdev_ignore
diff --git a/languages/java/app_templates/superwaba/Makefile.am b/languages/java/app_templates/superwaba/Makefile.am
new file mode 100644
index 00000000..8c27b8d5
--- /dev/null
+++ b/languages/java/app_templates/superwaba/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = superwaba.png sw.java src-Makefile sw.kdevelop sw.filelist
+templateName = superwaba
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/java/app_templates/superwaba/src-Makefile b/languages/java/app_templates/superwaba/src-Makefile
new file mode 100644
index 00000000..84b55ece
--- /dev/null
+++ b/languages/java/app_templates/superwaba/src-Makefile
@@ -0,0 +1,226 @@
+# Makefile template
+#
+# for using WABA and SUPERWABA on Linux systems
+#
+# Doug Lawson (dlawson@cablespeed.com)
+# Modified for use with KDevelop by Ian Reinhart Geiser <geiseri@kde.org>
+
+# Copyright (c) Doug Lawson 2003
+# developed for classes I teach.
+#
+# may be distributed under GPL
+# (http://www.gnu.org/licenses/gpl.html)
+# or any other license that allows it to be freely used.
+#
+# please let me know about any improvements you make
+
+VERSION = %{VERSION}
+# What are we building? We put the names here at the
+# top to make it easy to change
+
+MAINCLASSNAME = %{APPNAME}
+
+# ExtraClassList will be blank if the app consists of
+# only one class
+EXTRACLASSLIST =
+
+# Is there an icon for this program? If there
+# is, create an icon argument for exegen
+#
+# Exegen will automatically look for icons
+# so this may not be needed. Run
+# java Exegen /?
+# for help on Exegen
+#
+# If you use this line, make sure to un-comment it!
+#
+# ICONFLAG = /I Icon
+
+# Like ICONFLAG, height and width may be specified, or
+# you may accept the default. On PalmOS, the app will run
+# full-screen by default, which is usually what you want.
+#
+# If you want the same look on PalmOS as on
+# Windows CE, you should specify height and width
+#
+# run
+# java Exegen /?
+# for more information, or see the docs.
+#
+# HEIGHT = /h 160
+# WIDTH = /w 160
+
+# CAB Options
+# The /Z parameter is used to create eight cab files so your application can
+# easily be installed in all compatible Windows CE platforms. You may pass,
+# optionally, a .swz file with some global and local libraries used by your
+# app. For example, if you need to install the TinyLarge.pdb font and also a
+# custom database, E.g. mydata.pdb, you must copy all files to the current
+# directory, then create a myapp.swz file with the following contents:
+#
+# [G]TinyLarge.pdb
+# [L]mydata.pdb
+#
+# The [G] denotes a global library (fonts are always global libraries), and the
+# [L] denotes a local library.
+# The user will then have two options to start the installation process:
+# 1. Run the created xxx_install.bat file, or
+# 2. If the cab files are available in the internet, the user may launch the
+# browser from inside the device, connect to the site and choose the appropriate
+# cab file. The browser will then download and install the file.
+# The /Z parameter works on in the Windows platform.
+SWZFILE =
+CABFLAGS = /Z $(SWZFILE)
+
+# ------------------------------------------------------
+# Most of the stuff below this line will not change
+# very often. If you change Java SDKs or re-install
+# waba or superwaba, you may need to change it.
+
+# first, the locations of the various java components.
+# On a *NIX system, they will usually be in something
+# like the directories listed here.
+
+
+# The flags and arguments here have been developed for use with
+# the SUN jdk v1.3. Read your java documentation carefully,
+# don't just blindly assume that what I have here will work
+# with your setup.
+
+JAVADIR = %{JAVADIR}
+JAVABINDIR = $(JAVADIR)/bin
+JAVAC = $(JAVABINDIR)/javac
+JAR = $(JAVABINDIR)/jar
+
+# Java Compiler flags and arguments. For these makefiles,
+# it is easiest if we include the CLASSPATH in the command
+# line.
+JCFLAGS = -classpath $(CLASSPATH)
+
+JAVA = $(JAVABINDIR)/java
+JAVAFLAGS = -classpath $(CLASSPATH)
+
+APPLETVIEWER = $(JAVABINDIR)/appletviewer
+AVFLAGS = -J-classpath -J$(CLASSPATH)
+
+
+# next, where are all the WABA bits and pieces?
+WABADIR = %{WABADIR}
+WABABINDIR = $(WABADIR)/superwaba/bin
+WABAEXTRADIR = $(WABADIR)/superwaba
+
+################################################################################
+# You should not have to change anything below this line.
+################################################################################
+# the classpath will have to tell java where to find the waba stuff.
+#
+# the CLASSPATH here is set to let java find
+# - the classes it needs to produce the executable class files
+# - the waba.applet class, Warp.class, and Exegen.class
+#
+# This strategy works so far, but it may (conceivably) produce a
+# conflict at some point. Be warned. You may want to use a CLASSPATH
+# that leaves out waba.applet, Warp and/or Exegen.
+#
+CLASSPATH = $(WABADIR):$(WABAEXTRADIR):$(WABAEXTRADIR)/classes:$(WABABINDIR):.
+
+# exegen and warp
+#
+# exegen is the EXEcutable GENerator. It takes the
+# main waba/java class (which usually extends MainWindow)
+# and makes it into a program that will automagically run
+# itself under waba or superwaba on a PalmOS gadget.
+#
+# Since the palm program has a .prc extension, it is called
+# PRCFILE here.
+#
+# Exegen also creates a .exe file for Window CE
+#
+# warp is the Waba Application Resource Packager.
+# It bundles the classes and other resources into
+# a single PALM database file (which is also used
+# by the Win CE executable). This file has a .pdb
+# extension. In this makefile it is called PDBFILE
+#
+# The standard waba SDK has only the MS-Windows *.exe files.
+# for exegen and warp
+#
+# Although there are exegen and warp native binaries for Linux,
+# they don't seem to work very well. The solution has been to
+# write those programs in Java.
+#
+# for waba, use the java apps
+# from http://www.wn.com.au/rnielsen/wextras/
+# (Rob Nielsen). Getting all the paths to fall into the right
+# place takes a little tuning, though (which is why this makefile
+# is here, I suppose)
+#
+# For superwaba, the same programs are included in the
+# distribution
+
+
+EXEGEN = $(JAVA) $(JAVAFLAGS) Exegen
+EXEGENFLAGS = $(HEIGHT) $(WIDTH) $(ICONFLAG) /L /V $(VERSION) $(CABFLAGS)
+
+WARP = $(JAVA) $(JAVAFLAGS) Warp
+WARPFLAGS = c
+
+MAINCLASS = $(MAINCLASSNAME).class
+EXTRACLASSES = $(EXTRACLASSLIST)
+
+WEBPAGE = $(MAINCLASSNAME).html
+
+PRCBASENAME = $(MAINCLASSNAME)
+PDBBASENAME = $(MAINCLASSNAME)
+
+PDBFILE = $(PDBBASENAME).pdb
+PRCFILE = $(PRCBASENAME).prc
+
+
+all: $(PDBFILE) $(PRCFILE)
+
+$(PRCFILE): $(PDBFILE)
+ $(EXEGEN) $(EXEGENFLAGS) $(PRCBASENAME) $(MAINCLASSNAME) $(PDBBASENAME)
+
+# you may want to change this one so that Warp only handles
+# the classes you tell it to (instead of using the wildcard '*.class')
+# Use the second pair of lines below, which are commented out.
+#
+# Note that there is a potential problem if your program generates
+# inner classes (which have names like
+# 'ClockPanel$SettingsWindow.class'.
+# If that is the case, the wildcard *.class filespec is guaranteed to
+# include them in the make dependency.
+
+$(PDBFILE): $(MAINCLASS) $(EXTRACLASSES)
+ $(WARP) $(WARPFLAGS) $(PDBBASENAME) *.class
+
+# $(PDBFILE): $(MAINCLASS) $(EXTRACLASSES)
+# $(WARP) $(WARPFLAGS) $(PDBBASENAME) $(MAINCLASS) $(EXTRACLASSES)
+
+# Below, we just tell make how to create foo.class if it can find
+# foo.java
+
+%.class: %.java
+ $(JAVAC) $(JCFLAGS) $<
+
+# note that the 'test' target DOES NOT INCLUDE A DEPENDENCY
+# for the java classes. This way, you can keep doing tests of the old
+# class while you rewrite the source (foo.java).
+
+test:
+ echo "running this test does not rebuild any of the targets" ;\
+ $(JAVA) $(JAVAFLAGS) waba.applet.Applet $(MAINCLASSNAME)
+
+# Since I haven't (yet) got the code written to generate the
+# web page, target 'applettest' is commented out. If you want
+# to create the web page by hand and test it, be my guest.
+
+# applettest: $(WEBPAGE)
+# $(APPLETVIEWER) $(AVFLAGS) $(webpage)
+
+clean:
+ rm -f *.class *.pdb *.prc *.lnk
+
+jar: $(MAINCLASS) $(EXTRACLASSES)
+ $(JAR) -cvfm $(MAINCLASSNAME).jar $(MAINCLASSNAME).mft $(MAINCLASS) $(EXTRACLASSES)
diff --git a/languages/java/app_templates/superwaba/superwaba b/languages/java/app_templates/superwaba/superwaba
new file mode 100644
index 00000000..eea98775
--- /dev/null
+++ b/languages/java/app_templates/superwaba/superwaba
@@ -0,0 +1,54 @@
+# KDE Config File
+[General]
+Name=SuperWaba
+Name[fr]=Une application SuperWaba
+Icon=superwaba.png
+Category=Java
+Comment=A simple template for building SuperWaba Java based apps on WinCE and PalmOS. More information can be found at http://www.superwaba.org
+Comment[fr]=Génère un simple modéle d'application JAVA en utilisant SuperWaba pour les environnements WinCE et PalmOS. Plus d'informations peuvent être trouvé à l'URL suivante : http://www.superwaba.org.
+FileTemplates=java
+ShowFilesAfterGeneration=APPNAME.java
+Archive=superwaba.tar.gz
+
+[JAVA]
+Type=value
+Value=JAVA
+Comment=Path to your java root
+Default=/usr/lib/java
+ValueType=QString
+
+[WABA]
+Type=value
+Value=WABA
+Comment=Path to your SuperWaba root
+Default=/usr/lib
+ValueType=QString
+
+[GNU]
+Type=install archive
+Source=%{kdevelop}/template-common/gnu.tar.gz
+Dest=%{dest}
+
+[PROJECT]
+Type=install
+Source=%{src}/sw.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILELIST]
+Type=install
+Source=%{src}/sw.filelist
+Dest=%{dest}/%{APPNAMELC}.filelist
+
+[MAKEFILE]
+Type=install
+Source=%{src}/src-Makefile
+Dest=%{dest}/Makefile
+
+[SOURCE]
+Type=install
+Source=%{src}/sw.java
+Dest=%{dest}/%{APPNAME}.java
+
+[MESSAGE]
+Type=Message
+Comment=Your application is setup to build. Edit the make targets to customize the file.
diff --git a/languages/java/app_templates/superwaba/superwaba.kdevtemplate b/languages/java/app_templates/superwaba/superwaba.kdevtemplate
new file mode 100644
index 00000000..a963caac
--- /dev/null
+++ b/languages/java/app_templates/superwaba/superwaba.kdevtemplate
@@ -0,0 +1,166 @@
+# KDE Config File
+[General]
+Name=SuperWaba
+Name[ne]=सà¥à¤ªà¤°à¤µà¤¾à¤­à¤¾
+Icon=superwaba.png
+Category=Java
+Comment=A simple template for building SuperWaba Java based apps on WinCE and PalmOS. More information can be found at http://www.superwaba.org
+Comment[ca]=Una simple plantilla per a construir aplicacions basades en SuperWaba Java per a WinCE i PalmOS. Podeu trobar més informació a http://www.superwaba.org
+Comment[da]=En simpel skabelon til at bygge SuperWaba Java baserede programmer på WinCE og PalmOS. Mere information kan findes på http://www.superwaba.org
+Comment[de]=Eine einfache Vorlage zum Erstellen von auf Java basierenden SuperWaba-Anwendungen unter WinCE und PalmOS. Weitere Informationen erhalten Sie auf http://www.superwaba.org.
+Comment[el]=Ένα απλό Ï€Ïότυπο για την κατασκευή εφαÏμογών SuperWaba Java για τα WinCE και PalmOS. ΠεÏισσότεÏες πληÏοφοÏίες μποÏοÏν να βÏεθοÏν στο http://www.superwaba.org
+Comment[es]=Una plantilla sencilla para crear aplicaciones basadas en SuperWaba Java para WinCE y PalmOS. Puede encontrar más información en http://www.superwaba.org
+Comment[et]=Lihtne mall rakenduste loomiseks SuperWaba Java põhjal WinCE ja PalmOS'i tarbeks. Rohkem infot annab http://www.superwaba.org
+Comment[eu]=WinCE eta PalmOS sistema eragileetan SuperWaba Javan oinarritutako aplikazioak sortzeko txantiloi sinple bat. Informazio gehiagorako: http://www.superwaba.org
+Comment[fa]=یک قالب ساده برای ساختن کاربردهای بر مبنای SuperWaba جاوا روی WinCE Ùˆ PalmOS. اطلاعات بیشتر می‌تواند در http://www.superwaba.org یاÙت شود
+Comment[fr]=Un modèle simple pour construire des applications basées sur Java SuperWaba pour WinCE et PalmOS. Vous trouverez plus d'informations sur http://www.superwaba.org
+Comment[gl]=Un modelo sinxelo para crear aplicacións SuperWaba baseadas en Java para WinCE e PalmOS. Pode atopar máis información en http://www.superwaba.org
+Comment[hu]=Egyszerű sablon SuperWaba Java-alkalmazások készítéséhez, WinCE és PalmOS platformra. Részletes információ itt található: http://www.superwaba.org
+Comment[it]=Un semplice modello per compilare applicazioni Java SuperWaba basato su WinCE e PalmOS. Ulteriori informazioni possono essere trovate visitando http://www.superwaba.org/
+Comment[nds]=En eenfach Vörlaag för't Opstellen vun op WinCE un PalmOS opbuut SuperWaba-Programmen. Mehr Informatschonen laat sik op http://www.superwaba.org finnen
+Comment[ne]=WinCE र PalmOS मा सà¥à¤ªà¤°à¤µà¤¾à¤­à¤¾ जाभा आधारित अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— निरà¥à¤®à¤¾à¤£à¤•à¤¾ लागि साधारण टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ । बढी जानकारी http://www.superwaba.org मा फेला पारà¥à¤¨ सकिनà¥à¤› ।
+Comment[nl]=Een eenvouidg sjabloon voor het bouwen van SuperWaba Java-gebaseerde toepassingen op WinCE en PalmOS. Meer informatie vindt u op http://www.superwaba.org.
+Comment[pl]=Prosty szablon do budowania programów w Javie wykorzystujących SuperWaba w środowiskach WinCE oraz PalmOS. Więcej informacji można znaleźć na stronie http://www.superwaba.org
+Comment[pt]=Um modelo simples para criara aplicações Java, baseadas no SuperWaba, para o WinCE e o PalmOS. Poderá encontrar mais informações em http://www.superwaba.org
+Comment[pt_BR]=Um modelo simples para criara aplicações Java, baseadas no SuperWaba, para o WinCE e o PalmOS. Poderá encontrar mais informações em http://www.superwaba.org
+Comment[ru]=Создание Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ SuperWaba Java Ð´Ð»Ñ ÑƒÑтройÑтв WinCE и PalmOS. Дополнительную информацию можно найти на http://www.superwaba.org
+Comment[sk]=Jednoduchá šablóna pre vytváranie SuperWaba Java Aplikácií na WinCE a PalmOS. Viac informácií môžte nájsť na http://www.superwaba.org
+Comment[sr]=ЈедноÑтаван шаблон за градњу SuperWaba програма на оÑнову Java-е, за WinCE и PalmOS. Више информација на http://www.superwaba.org
+Comment[sr@Latn]=Jednostavan šablon za gradnju SuperWaba programa na osnovu Java-e, za WinCE i PalmOS. Više informacija na http://www.superwaba.org
+Comment[sv]=En enkel mall för att bygga SuperWaba Java-baserade program på WinCE och PalmOS. Mer information hittas på http://www.superwaba.org.
+Comment[tr]=WinCE ve PalmOS üstünde SuperWaba tabanlı Java uygulamarı yapmak için basit bir şablon. Daha fazla bilgi http://www.superwaba.org/ adresinde bulunabilir.
+Comment[zh_CN]=在 WinCE å’Œ PalmOS 上构建基于 SuperWaba Java 应用程åºçš„简å•æ¨¡æ¿ã€‚更多信æ¯å¯ä»¥åœ¨ http://www.superwaba.org 找到
+Comment[zh_TW]=一個簡單的建立在 WinCE 與 PalmOS 上執行的 SuperWaba Java 應用程å¼ã€‚您å¯ä»¥åœ¨ http://www.superwaba.org å–得更多資訊。
+FileTemplates=java
+ShowFilesAfterGeneration=%{dest}/%{APPNAME}.java
+Archive=superwaba.tar.gz
+
+[JAVA]
+Type=value
+Value=JAVA
+Comment=Path to your java root
+Comment[ca]=Ruta cap a la vostra arrel Java
+Comment[da]=Sti til din java-rod
+Comment[de]=Pfad zum Stammordner von Java
+Comment[el]=ΔιαδÏομή στο κατάλογό σας της java
+Comment[es]=Ruta a su carpeta raíz Java
+Comment[et]=Java juurkataloogi asukoht
+Comment[eu]=Zure java erroaren bide-izena
+Comment[fa]=مسیر ریشۀ جاوای شما
+Comment[fr]=Chemin vers votre racine Java
+Comment[gl]=Ruta a súa instalación de java
+Comment[hu]=A Java-alapkönyvtár elérési útja
+Comment[it]=Percorso alla radice java
+Comment[ja]=Java ルートã¸ã®ãƒ‘ス
+Comment[nds]=Padd na Dien Java-Wörtelorner
+Comment[ne]=तपाईà¤à¤•à¥‹ जाभा रूटको मारà¥à¤—
+Comment[nl]=Pad naar uw Java-hoofdmap
+Comment[pl]=Ścieżka do głównego katalogu Javy
+Comment[pt]=A localização de base do seu Java
+Comment[pt_BR]=A localização de base do seu Java
+Comment[ru]=Путь к корневому каталогу Java
+Comment[sk]=Cesta ku java koreňu
+Comment[sr]=Путања до вашег корена Java-е
+Comment[sr@Latn]=Putanja do vašeg korena Java-e
+Comment[sv]=Sökväg till Java-rotkatalog
+Comment[zh_CN]=您的 Java 根路径
+Comment[zh_TW]=您的 java 根路徑
+Default=/usr/lib/java
+ValueType=QString
+
+[WABA]
+Type=value
+Value=WABA
+Comment=Path to your SuperWaba root
+Comment[ca]=Ruta cap a la vostra arrel SuperWaba
+Comment[da]=Sti til din SuperWaba-rod
+Comment[de]=Pfad zum Stammordner von SuperWaba
+Comment[el]=ΔιαδÏομή στο κατάλογό σας της SuperWaba
+Comment[es]=Ruta a su carpeta raíz de SuperWaba
+Comment[et]=SuperWaba juurkataloogi asukoht
+Comment[eu]=Zure SuperWaba erroaren bide-izena
+Comment[fa]=مسیر ریشۀ SuperWaba شما
+Comment[fr]=Chemin vers votre racine SuperWaba
+Comment[gl]=Ruta a súa instalación de SuperWaba
+Comment[hu]=A SuperWaba-alapkönyvtár elérési útja
+Comment[it]=Percorso alla radice SuperWaba
+Comment[ja]=SuperWaba ルートã¸ã®ãƒ‘ス
+Comment[nds]=Padd na Dien SuperWaba-Wörtelorner
+Comment[ne]=तपाईà¤à¤•à¥‹ सà¥à¤ªà¤°à¤µà¤¾à¤­à¤¾ रूटको मारà¥à¤—
+Comment[nl]=Pad naar uw SuperWaba-hoofdmap
+Comment[pl]=Ścieżka do głównego katalogu SuperWaba
+Comment[pt]=A localização de base do seu SuperWaba
+Comment[pt_BR]=A localização de base do seu SuperWaba
+Comment[ru]=Путь к корневому каталогу SuperWaba
+Comment[sk]=Cesta ku SuperWaba koreňu
+Comment[sr]=Путања до вашег корена SuperWaba-е
+Comment[sr@Latn]=Putanja do vašeg korena SuperWaba-e
+Comment[sv]=Sökväg till SuperWaba-rotkatalog
+Comment[tr]=SuperWaba kök dizininizin yolu
+Comment[zh_CN]=您的 SuperWaba 根路径
+Comment[zh_TW]=您的 SuperWaba 根路徑
+Default=/usr/lib
+ValueType=QString
+
+[GNU]
+Type=install archive
+Source=%{kdevelop}/template-common/gnu.tar.gz
+Dest=%{dest}
+
+[PROJECT]
+Type=install
+EscapeXML=true
+Source=%{src}/sw.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILELIST]
+Type=install
+Source=%{src}/sw.filelist
+Dest=%{dest}/%{APPNAMELC}.filelist
+
+[MAKEFILE]
+Type=install
+Source=%{src}/src-Makefile
+Dest=%{dest}/Makefile
+
+[SOURCE]
+Type=install
+Source=%{src}/sw.java
+Dest=%{dest}/%{APPNAME}.java
+
+[MESSAGE]
+Type=Message
+Comment=Your application is setup to build. Edit the make targets to customize the file.
+Comment[ca]=La vostra aplicació està llesta per a ser construïda. Editeu els objectius de make per a personalitzar el fitxer.
+Comment[da]=Dit program er parat til at blive bygget. Redigér make targets for at indstille filen.
+Comment[de]=Ihre Anwendung ist bereit für das Erstellen. Bearbeiten Sie die Make-Targets, um die Datei an Ihre Bedürfnisse anzupassen.
+Comment[el]=Η εφαÏμογή σας έχει Ïυθμιστεί για κατασκευή. ΕπεξεÏγαστείτε τους Ï€ÏοοÏισμοÏÏ‚ κατασκευής για την Ï€ÏοσαÏμογή του αÏχείου.
+Comment[en_GB]=Your application is setup to build. Edit the make targets to customise the file.
+Comment[es]=Su aplicación está lista para ser construída. Edite los objetivos make para personalizar el archivo.
+Comment[et]=Rakendus on ehitamiseks valmis. Faili kohandamiseks redigeeri ehitamise sihtmärke.
+Comment[eu]=Zure aplikazioa eraikitzeko konfiguratu da. Editatu make-en helburuak fitxategia pertsonalizatzeko.
+Comment[fa]=کاربرد شما برای ساختن برپا می‌شود. برای سÙارشی کردن پرونده، هدÙهای make را ویرایش کنید.
+Comment[fr]=Votre application est prête à être construite. Modifiez les cibles de « make » pour personnaliser le fichier.
+Comment[gl]=A súa aplicación esta configurada para compilar. Edite os obxectivos make para persoalizalo ficheiro.
+Comment[hu]=Az alkalmazás készen áll a lefordításra. A make-célpontok szerkeszthetők, ha szükséges.
+Comment[it]=L'applicazione è configurata per compilare. Modifica i target di make per personalizzare il file.
+Comment[nds]=Dien Programm kann opstellt warrn. Bewerk de "Make"-Telen för't Topassen vun de Datei.
+Comment[ne]=तपाईà¤à¤•à¥‹ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— निरà¥à¤®à¤¾à¤£ गरà¥à¤¨à¤•à¤¾ लागि सेटअप भà¤à¤•à¥‹ छ । फाइललाई अनà¥à¤•à¥‚ल गरà¥à¤¨à¤•à¤¾ लागि मेक तारà¥à¤—ेटलाई समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।
+Comment[nl]=Uw toepassing kan worden gebouwd. Bewerk de make targets om het bestand naar eigen inzicht aan te passen.
+Comment[pl]=Program skonfigurowany. Dostosowanie pliku do własnych potrzeb jest możliwe przez modyfikację celów make.
+Comment[pt]=A sua aplicação está preparada para ser compilada. Edite os alvos do 'make' para personalizar o ficheiro.
+Comment[pt_BR]=A sua aplicação está preparada para ser compilada. Edite os alvos do 'make' para personalizar o ficheiro.
+Comment[ru]=Ваше приложение готово Ð´Ð»Ñ Ñборки.
+Comment[sk]=Aplikácia je pripravená na build. Môžte si prispôsobiť make ciele.
+Comment[sr]=Ваш програм је Ñпреман за градњу. Уредите циљеве Ñправљача да биÑте прилагодили фајл.
+Comment[sr@Latn]=VaÅ¡ program je spreman za gradnju. Uredite ciljeve spravljaÄa da biste prilagodili fajl.
+Comment[sv]=Programmet är inställt att byggas. Redigera byggmålen för att anpassa filen.
+Comment[tr]=Uygulamanız derlenmeye hazır. Dosyayı özelleştirmek için make hedeflerini düzenleyin.
+Comment[zh_CN]=您的应用程åºå·²è®¾ç½®ä¸ºæž„建。编辑 make 目标å¯è‡ªå®šä¹‰æ–‡ä»¶ã€‚
+Comment[zh_TW]=您的應用程å¼å·²è¨­å®šå¥½å¯å»ºç«‹äº†ã€‚請編輯 make 目標來調整檔案。
+Archive=superwaba.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
diff --git a/languages/java/app_templates/superwaba/superwaba.png b/languages/java/app_templates/superwaba/superwaba.png
new file mode 100644
index 00000000..3492333d
--- /dev/null
+++ b/languages/java/app_templates/superwaba/superwaba.png
Binary files differ
diff --git a/languages/java/app_templates/superwaba/sw.filelist b/languages/java/app_templates/superwaba/sw.filelist
new file mode 100644
index 00000000..f219d672
--- /dev/null
+++ b/languages/java/app_templates/superwaba/sw.filelist
@@ -0,0 +1 @@
+%{APPNAME}.java
diff --git a/languages/java/app_templates/superwaba/sw.java b/languages/java/app_templates/superwaba/sw.java
new file mode 100644
index 00000000..e1c9927c
--- /dev/null
+++ b/languages/java/app_templates/superwaba/sw.java
@@ -0,0 +1,97 @@
+
+/** An example that shows the new user interface gadgets for grayscale */
+
+import waba.fx.*;
+import waba.sys.*;
+import waba.ui.*;
+
+public class %{APPNAME} extends MainWindow
+{
+ MenuBar mbar;
+ Button pushB;
+
+public %{APPNAME}()
+{
+ super( "%{APPNAME}", TAB_ONLY_BORDER );
+
+ setDoubleBuffer( true );
+ // use native style?
+ if ( waba.sys.Settings.platform.equals( "PalmOS" ) )
+ {
+ waba.sys.Settings.setPalmOSStyle( true );
+ }
+ // if we are a color device then we can use a nice color
+ // otherwise WHITE is the most readable
+ if ( !waba.sys.Settings.isColor )
+ {
+ Color.defaultBackColor = Color.WHITE;
+ waba.ui.MainWindow.getMainWindow().setBackColor( Color.WHITE );
+ }
+ else
+ {
+ Color.defaultBackColor = new Color( 213, 210, 205 );
+ waba.ui.MainWindow.getMainWindow().setBackColor( new Color( 213, 210, 205 ) );
+ }
+}
+
+public void onStart()
+{
+
+ initGUI();
+ Settings.appSecretKey = "installed";
+}
+
+// Called by the system to pass events to the application.
+public void onEvent( Event event )
+{
+ if ( event.type == ControlEvent.WINDOW_CLOSED )
+ {
+ if ( event.target == mbar )
+ {
+ switch ( mbar.getSelectedMenuItem() )
+ {
+ case 1:
+ quitApp();
+ break;
+ case 101:
+ showAbout();
+ break;
+ default :
+ break;
+ }
+ }
+ }
+ else if ( event.type == ControlEvent.PRESSED )
+ {
+ if ( event.target == pushB )
+ {
+ showAbout();
+ }
+ }
+}
+
+private void showAbout( )
+{
+ MessageBox mb = new MessageBox( "%{APPNAME}", "This is a small test app." );
+ mb.setDoubleBuffer( true );
+ popupBlockingModal( mb );
+}
+
+private void quitApp()
+{
+ exit( 0 );
+}
+
+
+private void initGUI()
+{
+ String col0[] = { "File","Exit..."};
+ String col1[] = { "Help","About" };
+
+ pushB = new Button( "Push me" );
+ add(pushB, CENTER, CENTER);
+ setMenuBar( mbar = new MenuBar( new String[][]{ col0, col1 }) );
+
+}
+
+}
diff --git a/languages/java/app_templates/superwaba/sw.kdevelop b/languages/java/app_templates/superwaba/sw.kdevelop
new file mode 100644
index 00000000..bddee282
--- /dev/null
+++ b/languages/java/app_templates/superwaba/sw.kdevelop
@@ -0,0 +1,94 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>Java</primarylanguage>
+ <ignoreparts>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ <keywords>
+ <keyword>Java</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevcustomproject>
+ <run>
+ <mainprogram>make test</mainprogram>
+ <programargs/>
+ <terminal>true</terminal>
+ <envvars/>
+ </run>
+ <envvars/>
+ <build>
+ <buildtool>make</buildtool>
+ <builddir/>
+ </build>
+ <make>
+ <abortonerror>true</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ <envvars/>
+ </make>
+ <makeenvvars/>
+ </kdevcustomproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="Makefile" name="Build" />
+ <group pattern="*.java" name="Source" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="java"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/java/backgroundparser.cpp b/languages/java/backgroundparser.cpp
new file mode 100644
index 00000000..4081949c
--- /dev/null
+++ b/languages/java/backgroundparser.cpp
@@ -0,0 +1,363 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "backgroundparser.h"
+#include "javasupportpart.h"
+#include "javasupport_events.h"
+#include "driver.h"
+#include "kdevdeepcopy.h"
+#include "kdevdriver.h"
+
+#if QT_VERSION < 0x030100
+#include <kdevmutex.h>
+#else
+#include <qmutex.h>
+#endif
+
+#include <kparts/part.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/document.h>
+#include <ktexteditor/view.h>
+
+#include <kdevpartcontroller.h>
+#include <kdevproject.h>
+
+#include <kurl.h>
+#include <kdebug.h>
+#include <kapplication.h>
+
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+
+class KDevSourceProvider: public SourceProvider
+{
+public:
+ KDevSourceProvider( JavaSupportPart* javaSupport )
+ : m_javaSupport( javaSupport ),
+ m_readFromDisk( false ) {}
+
+ void setReadFromDisk( bool b ) { m_readFromDisk = b; }
+ bool readFromDisk() const { return m_readFromDisk; }
+
+ virtual QString contents( const QString& fileName )
+ {
+ if( !m_readFromDisk ){
+ //kdDebug(9013) << "-------> kapp is locked = " << kapp->locked() << endl;
+ bool needToLock = kapp->locked() == false;
+
+ if( needToLock )
+ kapp->lock();
+
+ //kdDebug(9013) << "-------> kapp locked" << endl;
+
+ QPtrList<KParts::Part> parts( *m_javaSupport->partController()->parts() );
+ QPtrListIterator<KParts::Part> it( parts );
+ while( it.current() ){
+ KTextEditor::Document* doc = dynamic_cast<KTextEditor::Document*>( it.current() );
+ ++it;
+
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( doc );
+ if( !doc || !editIface || doc->url().path() != fileName )
+ continue;
+
+ QString contents = QString( editIface->text().ascii() ); // deep copy
+
+ if( needToLock )
+ kapp->unlock();
+
+ //kdDebug(9013) << "-------> kapp unlocked" << endl;
+
+ return contents;
+ }
+
+ if( needToLock )
+ kapp->unlock();
+ //kdDebug(9013) << "-------> kapp unlocked" << endl;
+ }
+
+ QFile f( fileName );
+ QTextStream stream( &f );
+ if( f.open(IO_ReadOnly) ){
+ QString contents = stream.read();
+ f.close();
+ return contents;
+ }
+
+ return QString::null;
+ }
+
+ virtual bool isModified( const QString& fileName )
+ {
+ Q_UNUSED( fileName );
+ return true;
+ }
+
+private:
+ JavaSupportPart* m_javaSupport;
+ bool m_readFromDisk;
+private:
+ KDevSourceProvider( const KDevSourceProvider& source );
+ void operator = ( const KDevSourceProvider& source );
+};
+
+class SynchronizedFileList
+{
+public:
+ SynchronizedFileList() {}
+
+ bool isEmpty() const
+ {
+ QMutexLocker locker( &m_mutex );
+ return m_fileList.isEmpty();
+ }
+
+ uint count() const
+ {
+ QMutexLocker locker( &m_mutex );
+ return m_fileList.count();
+ }
+
+ QPair<QString, bool> front() const
+ {
+ QMutexLocker locker( &m_mutex );
+ return m_fileList.front();
+ }
+
+ void clear()
+ {
+ QMutexLocker locker( &m_mutex );
+ m_fileList.clear();
+ }
+
+ void push_back( const QString& fileName, bool readFromDisk=false )
+ {
+ QMutexLocker locker( &m_mutex );
+ m_fileList.append( qMakePair(fileName, readFromDisk) ); /// \FIXME ROBE deepcopy?!
+ }
+
+ void pop_front()
+ {
+ QMutexLocker locker( &m_mutex );
+ m_fileList.pop_front();
+ }
+
+ bool contains( const QString& fileName ) const
+ {
+ QMutexLocker locker( &m_mutex );
+ QValueList< QPair<QString, bool> >::ConstIterator it = m_fileList.begin();
+ while( it != m_fileList.end() ){
+ if( (*it).first == fileName )
+ return true;
+ ++it;
+ }
+ return false;
+ }
+
+ void remove( const QString& fileName )
+ {
+ QMutexLocker locker( &m_mutex );
+ QValueList< QPair<QString, bool> >::Iterator it = m_fileList.begin();
+ while( it != m_fileList.end() ){
+ if( (*it).first == fileName )
+ m_fileList.remove( it );
+ ++it;
+ }
+ }
+
+private:
+ mutable QMutex m_mutex;
+ QValueList< QPair<QString, bool> > m_fileList;
+};
+
+BackgroundParser::BackgroundParser( JavaSupportPart* part, QWaitCondition* consumed )
+ : m_consumed( consumed ), m_javaSupport( part ), m_close( false )
+{
+ m_fileList = new SynchronizedFileList();
+ m_driver = new KDevDriver( m_javaSupport );
+ m_driver->setSourceProvider( new KDevSourceProvider(m_javaSupport) );
+ //disabled for now m_driver->setResolveDependencesEnabled( true );
+}
+
+BackgroundParser::~BackgroundParser()
+{
+ removeAllFiles();
+
+ delete( m_driver );
+ m_driver = 0;
+
+ delete m_fileList;
+ m_fileList = 0;
+}
+
+void BackgroundParser::addFile( const QString& fileName, bool readFromDisk )
+{
+ QString fn = deepCopy( fileName );
+
+ bool added = false;
+ if( !m_fileList->contains(fn) ){
+ m_fileList->push_back( fn, readFromDisk );
+ added = true;
+ }
+
+ if( added )
+ m_canParse.wakeAll();
+}
+
+void BackgroundParser::removeAllFiles()
+{
+ kdDebug(9013) << "BackgroundParser::removeAllFiles()" << endl;
+ QMutexLocker locker( &m_mutex );
+
+ QMap<QString, Unit*>::Iterator it = m_unitDict.begin();
+ while( it != m_unitDict.end() ){
+ Unit* unit = it.data();
+ ++it;
+ delete( unit );
+ unit = 0;
+ }
+ m_unitDict.clear();
+ m_driver->reset();
+ m_fileList->clear();
+
+ m_isEmpty.wakeAll();
+}
+
+void BackgroundParser::removeFile( const QString& fileName )
+{
+ QMutexLocker locker( &m_mutex );
+
+ if( Unit* unit = findUnit(fileName) ){
+ m_driver->remove( fileName );
+ m_unitDict.remove( fileName );
+ delete( unit );
+ unit = 0;
+ }
+
+ if( m_fileList->isEmpty() )
+ m_isEmpty.wakeAll();
+}
+
+Unit* BackgroundParser::parseFile( const QString& fileName, bool readFromDisk )
+{
+ static_cast<KDevSourceProvider*>( m_driver->sourceProvider() )->setReadFromDisk( readFromDisk );
+
+ m_driver->remove( fileName );
+ m_driver->parseFile( fileName );
+ RefJavaAST translationUnit = m_driver->takeTranslationUnit( fileName );
+
+ Unit* unit = new Unit;
+ unit->fileName = fileName;
+ unit->translationUnit = translationUnit;
+ unit->problems = m_driver->problems( fileName );
+
+ static_cast<KDevSourceProvider*>( m_driver->sourceProvider() )->setReadFromDisk( false );
+
+ if( m_unitDict.find(fileName) != m_unitDict.end() ){
+ Unit* u = m_unitDict[ fileName ];
+ m_unitDict.remove( fileName );
+ delete( u );
+ u = 0;
+ }
+
+ m_unitDict.insert( fileName, unit );
+
+ if( m_fileList->contains(fileName) ){
+ kdDebug(9013) << "========================> FILE: " << fileName << " IN QUEUE <=============" << endl;
+ } else {
+ KApplication::postEvent( m_javaSupport, new FileParsedEvent(fileName, unit->problems) );
+ }
+
+ m_currentFile = QString::null;
+
+ if( m_fileList->isEmpty() )
+ m_isEmpty.wakeAll();
+
+ return unit;
+}
+
+Unit* BackgroundParser::findUnit( const QString& fileName )
+{
+ QMap<QString, Unit*>::Iterator it = m_unitDict.find( fileName );
+ return it != m_unitDict.end() ? *it : 0;
+}
+
+RefJavaAST BackgroundParser::translationUnit( const QString& fileName )
+{
+ Unit* u = 0;
+ if( (u = findUnit(fileName)) == 0 ){
+ m_fileList->remove( fileName );
+ u = parseFile( fileName, false );
+ }
+
+ return u->translationUnit;
+}
+
+QValueList<Problem> BackgroundParser::problems( const QString& fileName )
+{
+ Unit* u = 0;
+ if( (u = findUnit(fileName)) == 0 ){
+ m_fileList->remove( fileName );
+ u = parseFile( fileName, false );
+ }
+
+ return u ? u->problems : QValueList<Problem>();
+}
+
+void BackgroundParser::close()
+{
+ QMutexLocker locker( &m_mutex );
+ m_close = true;
+ m_canParse.wakeAll();
+}
+
+bool BackgroundParser::filesInQueue()
+{
+ QMutexLocker locker( &m_mutex );
+
+ return m_fileList->count() || !m_currentFile.isEmpty();
+}
+
+void BackgroundParser::run()
+{
+ // (void) m_javaSupport->codeCompletion()->repository()->getEntriesInScope( QStringList(), false );
+
+ while( !m_close ){
+
+ m_mutex.lock();
+ while( m_fileList->isEmpty() ){
+ m_canParse.wait( &m_mutex );
+
+ if( m_close ){
+ break;
+ }
+ }
+
+ if( m_close ){
+ m_mutex.unlock();
+ break;
+ }
+
+ QPair<QString, bool> entry = m_fileList->front();
+ QString fileName = entry.first;
+ bool readFromDisk = entry.second;
+ m_currentFile = fileName;
+ m_fileList->pop_front();
+
+ (void) parseFile( fileName, readFromDisk );
+ m_mutex.unlock();
+ }
+
+ kdDebug(9013) << "!!!!!!!!!!!!!!!!!! BG PARSER DESTROYED !!!!!!!!!!!!" << endl;
+
+ //commented to fix #83352
+ //QThread::exit();
+}
diff --git a/languages/java/backgroundparser.h b/languages/java/backgroundparser.h
new file mode 100644
index 00000000..2029ebf5
--- /dev/null
+++ b/languages/java/backgroundparser.h
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef BACKGROUNDPARSER_H
+#define BACKGROUNDPARSER_H
+
+#include "driver.h"
+#include "JavaAST.hpp"
+
+#include <qthread.h>
+#include <qwaitcondition.h>
+#include <qmutex.h>
+#include <qmap.h>
+#include <kdebug.h>
+
+class JavaSupportPart;
+class TranslationUnitAST;
+class SynchronizedFileList;
+
+class Unit
+{
+public:
+ Unit() {}
+ ~Unit() {}
+
+ QString fileName;
+ QValueList<Problem> problems;
+ RefJavaAST translationUnit;
+
+protected:
+ Unit( const Unit& source );
+ void operator = ( const Unit& source );
+};
+
+class BackgroundParser: public QThread
+{
+public:
+ BackgroundParser( JavaSupportPart*, QWaitCondition* consumed );
+ virtual ~BackgroundParser();
+
+ QMutex& mutex() { return m_mutex; }
+ void lock() { m_mutex.lock(); }
+ void unlock() { m_mutex.unlock(); }
+
+ QWaitCondition& canParse() { return m_canParse; }
+ QWaitCondition& isEmpty() { return m_isEmpty; }
+
+ bool filesInQueue();
+
+ void addFile( const QString& fileName, bool readFromDisk=false );
+ void removeFile( const QString& fileName );
+ void removeAllFiles();
+
+ RefJavaAST translationUnit( const QString& fileName );
+ QValueList<Problem> problems( const QString& fileName );
+
+ void close();
+
+ virtual void run();
+
+protected:
+ Unit* findUnit( const QString& fileName );
+ Unit* parseFile( const QString& fileName, bool readFromDisk );
+
+private:
+ class KDevDriver* m_driver;
+ QString m_currentFile;
+ QWaitCondition m_canParse;
+ QWaitCondition m_isEmpty;
+ QWaitCondition* m_consumed;
+ QMutex m_mutex;
+ SynchronizedFileList* m_fileList;
+ JavaSupportPart* m_javaSupport;
+ bool m_close;
+ QMap<QString, Unit*> m_unitDict;
+};
+
+#endif
diff --git a/languages/java/configproblemreporter.ui b/languages/java/configproblemreporter.ui
new file mode 100644
index 00000000..580f60c4
--- /dev/null
+++ b/languages/java/configproblemreporter.ui
@@ -0,0 +1,257 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ConfigureProblemReporter</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ConfigureProblemReporter</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>588</width>
+ <height>490</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>&amp;Parsing</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>bgParserCheckbox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Enable background parsing</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>delayLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>msec</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignLeft</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>delaySlider</cstring>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="lineStep">
+ <number>250</number>
+ </property>
+ <property name="pageStep">
+ <number>500</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ <property name="tickInterval">
+ <number>250</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Special Headers</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView" row="0" column="0" rowspan="5" colspan="1">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>specialHeaderListView</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>61</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>pushButton6</cstring>
+ </property>
+ <property name="text">
+ <string>Move &amp;Down</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>pushButton5</cstring>
+ </property>
+ <property name="text">
+ <string>Move &amp;Up</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>pushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>pushButton4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>delaySlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>setDelayLabel(int)</slot>
+ </connection>
+ <connection>
+ <sender>bgParserCheckbox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>bgParserCheckbox_toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>pushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>addSpecialHeader()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton4</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>removeSpecialHeader()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton5</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>moveUpSpecialHeader()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton6</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>moveDownSpecialHeader()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>bgParserCheckbox</tabstop>
+ <tabstop>delaySlider</tabstop>
+ <tabstop>specialHeaderListView</tabstop>
+ <tabstop>pushButton3</tabstop>
+ <tabstop>pushButton4</tabstop>
+ <tabstop>pushButton5</tabstop>
+ <tabstop>pushButton6</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+ <include location="local" impldecl="in implementation">configproblemreporter.ui.h</include>
+</includes>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+ <slot>accept()</slot>
+ <slot>bgParserCheckbox_toggled( bool b )</slot>
+ <slot access="protected">setDelayLabel( int delay )</slot>
+ <slot>addSpecialHeader()</slot>
+ <slot>removeSpecialHeader()</slot>
+ <slot>moveUpSpecialHeader()</slot>
+ <slot>moveDownSpecialHeader()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/java/configproblemreporter.ui.h b/languages/java/configproblemreporter.ui.h
new file mode 100644
index 00000000..f68a0c80
--- /dev/null
+++ b/languages/java/configproblemreporter.ui.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+#include <kconfig.h>
+#include <kapplication.h>
+#include <klocale.h>
+
+void ConfigureProblemReporter::init()
+{
+ KConfig* config = kapp->config();
+ config->setGroup( "General Options" );
+ bgParserCheckbox->setChecked( config->readBoolEntry("EnableJavaBgParser", true) );
+ delaySlider->setEnabled( bgParserCheckbox->isChecked() );
+ delaySlider->setValue( config->readNumEntry("BgParserDelay", 500) );
+ setDelayLabel( delaySlider->value() );
+}
+
+void ConfigureProblemReporter::destroy()
+{
+}
+
+void ConfigureProblemReporter::accept()
+{
+ KConfig* config = kapp->config();
+ config->setGroup( "General Options" );
+ config->writeEntry( "EnableJavaBgParser", bgParserCheckbox->isChecked() );
+ if( bgParserCheckbox->isChecked() )
+ config->writeEntry( "BgParserDelay", delaySlider->value() );
+ config->sync();
+}
+
+
+void ConfigureProblemReporter::bgParserCheckbox_toggled( bool b )
+{
+ delaySlider->setEnabled( b );
+ if ( b == TRUE )
+ delayLabel->show();
+ else
+ delayLabel->hide();
+}
+
+
+void ConfigureProblemReporter::setDelayLabel( int delay )
+{
+ delayLabel->setText( i18n( "delay: %1 msec" ).arg( delay ) );
+}
+
+
+void ConfigureProblemReporter::addSpecialHeader()
+{
+
+}
+
+
+void ConfigureProblemReporter::removeSpecialHeader()
+{
+
+}
+
+
+void ConfigureProblemReporter::moveUpSpecialHeader()
+{
+
+}
+
+
+void ConfigureProblemReporter::moveDownSpecialHeader()
+{
+
+}
diff --git a/languages/java/doc/Makefile.am b/languages/java/doc/Makefile.am
new file mode 100644
index 00000000..adb0f24f
--- /dev/null
+++ b/languages/java/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = sw.toc java_bugs_gcc.toc java_bugs_sun.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA =
+
diff --git a/languages/java/doc/java_bugs_gcc.toc b/languages/java/doc/java_bugs_gcc.toc
new file mode 100644
index 00000000..8162d1e1
--- /dev/null
+++ b/languages/java/doc/java_bugs_gcc.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Java bugs (GCC)</title>
+<base href="http://gcc.gnu.org/bugzilla/"/>
+<tocsect1 name="Query" url="query.cgi">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/java/doc/java_bugs_sun.toc b/languages/java/doc/java_bugs_sun.toc
new file mode 100644
index 00000000..779f2a32
--- /dev/null
+++ b/languages/java/doc/java_bugs_sun.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Java bugs (Sun)</title>
+<base href="http://developer.java.sun.com/developer/bugParade/"/>
+<tocsect1 name="Query" url="index.jshtml">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/java/doc/sw.toc b/languages/java/doc/sw.toc
new file mode 100644
index 00000000..da6356d2
--- /dev/null
+++ b/languages/java/doc/sw.toc
@@ -0,0 +1,146 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>SuperWaba 3.4.1 API</title>
+<base href="http://www.superwaba.com.br/doc/"/>
+<tocsect1 name="java.lang" url="java/lang/package-summary.html">
+ <tocsect2 name="Class" url="java/lang/Class.html"/>
+ <tocsect2 name="Math" url="java/lang/Math.html"/>
+ <tocsect2 name="Object" url="java/lang/Object.html"/>
+ <tocsect2 name="String" url="java/lang/String.html"/>
+ <tocsect2 name="StringBuffer" url="java/lang/StringBuffer.html"/>
+ <tocsect2 name="Throwable" url="java/lang/Throwable.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.palm.io.builtin" url="superwaba/ext/palm/io/builtin/package-summary.html">
+ <tocsect2 name="Address" url="superwaba/ext/palm/io/builtin/Address.html"/>
+ <tocsect2 name="Datebook" url="superwaba/ext/palm/io/builtin/Datebook.html"/>
+ <tocsect2 name="Mail" url="superwaba/ext/palm/io/builtin/Mail.html"/>
+ <tocsect2 name="Memo" url="superwaba/ext/palm/io/builtin/Memo.html"/>
+ <tocsect2 name="ToDo" url="superwaba/ext/palm/io/builtin/ToDo.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.palm.io.scanner" url="superwaba/ext/palm/io/scanner/package-summary.html">
+ <tocsect2 name="ScanEvent" url="superwaba/ext/palm/io/scanner/ScanEvent.html"/>
+ <tocsect2 name="Scan" url="superwaba/ext/palm/io/scanner/Scan.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.game" url="superwaba/ext/xplat/game/package-summary.html">
+ <tocsect2 name="AnimatedButton" url="superwaba/ext/xplat/game/AnimatedButton.html"/>
+ <tocsect2 name="AnimatedSprite" url="superwaba/ext/xplat/game/AnimatedSprite.html"/>
+ <tocsect2 name="Animation" url="superwaba/ext/xplat/game/Animation.html"/>
+ <tocsect2 name="AnimationEvent" url="superwaba/ext/xplat/game/AnimationEvent.html"/>
+ <tocsect2 name="GameEngine" url="superwaba/ext/xplat/game/GameEngine.html"/>
+ <tocsect2 name="HighScoreEntry" url="superwaba/ext/xplat/game/HightScoreEntry.html"/>
+ <tocsect2 name="HighScores" url="superwaba/ext/xplat/game/HighScores.html"/>
+ <tocsect2 name="Options" url="superwaba/ext/xplat/game/Options.html"/>
+ <tocsect2 name="Sprite" url="superwaba/ext/xplat/game/Sprite.html"/>
+ <tocsect2 name="TextRenderer" url="superwaba/ext/xplat/game/TextRenderer.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.io" url="superwaba/ext/xplat/io/package-summary.html">
+ <tocsect2 name="Storable" url="superwaba/ext/xplat/io/Storable.html"/>
+ <tocsect2 name="DataStream" url="superwaba/ext/xplat/io/DataStream.html"/>
+ <tocsect2 name="SerialPDB" url="superwaba/ext/xplat/io/SerialPDB.html"/>
+ <tocsect2 name="ObjectCatalog" url="superwaba/ext/xplat/io/ObjectCatalog.html"/>
+ <tocsect2 name="SerialPDBServer" url="superwaba/ext/xplat/io/SerialPDBServer.html"/>
+ <tocsect2 name="SerialSocketServer" url="superwaba/ext/xplat/io/SerialSocketServer.html"/>
+ <tocsect2 name="SerialSocket" url="superwaba/ext/xplat/io/SerialSocket.html"/>
+ <tocsect2 name="BufferStream" url="superwaba/ext/xplat/io/BufferStream.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.io.gps" url="superwaba/ext/xplat.io.gps/package-summary.html">
+ <tocsect2 name="GPS" url="superwaba/ext/xplat/io/gps/GPS.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.io.gps.garmin" url="superwaba/ext/xplat/io/gps/garmin/package-summary.html">
+ <tocsect2 name="Waypoint" url="superwaba/ext/xplat/io/gps/garmin/Waypoint.html"/>
+ <tocsect2 name="Route" url="superwaba/ext/xplat/io/gps/garmin/Route.html"/>
+ <tocsect2 name="Packet" url="superwaba/ext/xplat/io/gps/garmin/Packet.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.sql" url="superwaba/ext/.xplat/sql/package-summary.html">
+ <tocsect2 name="BatchUpdateException" url="superwaba/ext/xplat/sql/BatchUpdateException.html"/>
+ <tocsect2 name="Connection" url="superwaba/ext/xplat/sql/Connection.html"/>
+ <tocsect2 name="ResultSet" url="superwaba/ext/xplat/sql/ResultSet.html"/>
+ <tocsect2 name="SQLWarning" url="superwaba/ext/xplat/sql/SQLWarning.html"/>
+ <tocsect2 name="Driver" url="superwaba/ext/xplat/sql/Driver.html"/>
+ <tocsect2 name="Timestamp" url="superwaba/ext/xplat/sql/Timestamp.html"/>
+ <tocsect2 name="Blob" url="superwaba/ext/xplat/sql/Blob.html"/>
+ <tocsect2 name="DriverPropertyInfo" url="superwaba/ext/xplat/sql/DriverPropertyInfo.html"/>
+ <tocsect2 name="Ref" url="superwaba/ext/xplat/sql/Ref.html"/>
+ <tocsect2 name="Statement" url="superwaba/ext/xplat/sql/Statement.html"/>
+ <tocsect2 name="Types" url="superwaba/ext/xplat/sql/Types.html"/>
+ <tocsect2 name="PreparedStatement" url="superwaba/ext/xplat/sql/PreparedStatement.htm"/>l
+ <tocsect2 name="SQLException" url="superwaba/ext/xplat/sql/SQLException.html"/>
+ <tocsect2 name="c" url="superwaba/ext/xplat/sql/c.html"/>
+ <tocsect2 name="DataTruncation" url="superwaba/ext/xplat/sql/DatabaseMetaData.html"/>
+ <tocsect2 name="Time" url="superwaba/ext/xplat/sql/Time.html"/>
+ <tocsect2 name="ResultSetMetaData" url="superwaba/ext/xplat/sql/ResultSetMetaData.html"/>
+ <tocsect2 name="ParameterMetaData" url="superwaba/ext/xplat/sql/ParameterMetaData.html"/>
+ <tocsect2 name="DriverManager" url="superwaba/ext/xplat/sql/DriverManager.html"/>
+ <tocsect2 name="Date" url="superwaba/ext/xplat/sql/Date.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.sql.db2e" url="superwaba/ext/.xplat/sql/db2e/package-summary.html">
+ <tocsect2 name="Driver" url="superwaba/ext/xplat/sql/db2e/wdbc/Driver.html"/>
+ <tocsect2 name="BoundDate" url="superwaba/ext/xplat/sql/db2e/BoundDate.html"/>
+ <tocsect2 name="BoundTimestamp" url="superwaba/ext/xplat/sql/db2e/BoundTimestamp.html"/>
+ <tocsect2 name="c" url="superwaba/ext/xplat/sql/db2e/c.html"/>
+ <tocsect2 name="BoundInt" url="superwaba/ext/xplat/sql/db2e/BoundInt.html"/>
+ <tocsect2 name="DB2Exception" url="superwaba/ext/xplat/sql/db2e/DB2Exception.html"/>
+ <tocsect2 name="BoundBlob" url="superwaba/ext/xplat/sql/db2e/BoundBlob.html"/>
+ <tocsect2 name="Db2e" url="superwaba/ext/xplat/sql/db2e/Db2e.html"/>
+ <tocsect2 name="BoundString" url="superwaba/ext/xplat/sql/db2e/BoundString.html"/>
+ <tocsect2 name="BoundTime" url="superwaba/ext/xplat/sql/db2e/BoundTime.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.sql.db2e.wdbc" url="superwaba/ext/xplat/sql/db2e/wdbc/package-summary.html">
+ <tocsect2 name="Db2eConnection" url="superwaba/ext/xplat/sql/db2e/wdbc/Db2eConnection.html"/>
+ <tocsect2 name="Db2eMetaData" url="superwaba/ext/xplat/sql/db2e/wdbc/Db2eMetaData.html"/>
+ <tocsect2 name="Db2eStatement" url="superwaba/ext/xplat/sql/db2e/wdbc/Db2eStatement.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.ui" url="superwaba/ext/xplat/ui/package-summary.html">
+ <tocsect2 name="MultiEditMenu" url="superwaba/ext/xplat/ui/MultiEditMenu.html"/>
+ <tocsect2 name="ChoicesDialog" url="superwaba/ext/xplat/ui/ChoicesDialog.html"/>
+ <tocsect2 name="Grid" url="superwaba/ext/xplat/ui/Grid.html"/>
+ <tocsect2 name="ProgressBar" url="superwaba/ext/xplat/ui/ProgressBar.html"/>
+ <tocsect2 name="JustifiedContainer" url="superwaba/ext/xplat/ui/JustifiedContainer.html"/>
+ <tocsect2 name="BigNumber" url="superwaba/ext/xplat/ui/BigNumber.html"/>
+ <tocsect2 name="MultiEdit" url="superwaba/ext/xplat/ui/MultiEdit.html"/>
+ <tocsect2 name="SpinList" url="superwaba/ext/xplat/ui/SpinList.html"/>
+ <tocsect2 name="GridModel" url="superwaba/ext/xplat/ui/GridModel.html"/>
+ <tocsect2 name="GridContainer" url="superwaba/ext/xplat/ui/GridContainer.html"/>
+ <tocsect2 name="ColorList" url="superwaba/ext/xplat/ui/ColorList.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.util" url="superwaba/ext/xplat/util/package-summary.html">
+ <tocsect2 name="Compression" url="superwaba/ext/xplat/util/Compression.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.util.crypto" url="superwaba/ext/xplat/util/crypto/package-summary.html">
+ <tocsect2 name="MD5" url="superwaba/ext/xplat/util/crypto/MD5.html"/>
+ <tocsect2 name="BlowfishECB" url="superwaba/ext/xplat/util/crypto/BlowfishECB.html"/>
+ <tocsect2 name="SHA1" url="superwaba/ext/xplat/util/crypto/SHA1.html"/>
+ <tocsect2 name="BinConverter" url="superwaba/ext/xplat/util/crypto/BinConverter.html"/>
+ <tocsect2 name="TEA" url="superwaba/ext/xplat/util/crypto/TEA.html"/>
+ <tocsect2 name="BlowfishCBC" url="superwaba/ext/xplat/util/crypto/BlowfishCBC.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.util.datergf" url="superwaba/ext/xplat/util/datergf/package-summary.html">
+ <tocsect2 name="DateTime" url="superwaba/ext/xplat/util/datergf/DateTime.html"/>
+ <tocsect2 name="DTC" url="superwaba/ext/xplat/util/datergf/DTC.html"/>
+ <tocsect2 name="Calendar" url="superwaba/ext/xplat/util/datergf/Calendar.html"/>
+ <tocsect2 name="Time" url="superwaba/ext/xplat/util/datergf/Time.html"/>
+ <tocsect2 name="Date" url="superwaba/ext/xplat/util/datergf/Date.html"/>
+ <tocsect2 name="DateFormat" url="superwaba/ext/xplat/util/datergf/DateFormat.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.util.xml" url="superwaba/ext/xplat/util/xml/package-summary.html">
+ <tocsect2 name="XmlListener" url="superwaba/ext/xplat/util/xml/XmlListener.html"/>
+ <tocsect2 name="LiteParser" url="superwaba/ext/xplat/util/xml/LiteParser.html"/>
+ <tocsect2 name="HttpLiteParser" url="superwaba/ext/xplat/util/xml/HttpLiteParser.html"/>
+ <tocsect2 name="StreamBuffer" url="superwaba/ext/xplat/util/xml/StreamBuffer.html"/>
+ <tocsect2 name="HttpListener" url="superwaba/ext/xplat/util/xml/HttpListener.html"/>
+ <tocsect2 name="XmlLiteParser" url="superwaba/ext/xplat/util/xml/XmlLiteParser.html"/>
+ <tocsect2 name="HttpXmlListener" url="superwaba/ext/xplat/util/xml/HttpXmlListener.html"/>
+ <tocsect2 name="HttpXmlLiteParser" url="superwaba/ext/xplat/util/xml/HttpXmlLiteParser.html"/>
+ <tocsect2 name="ParserException" url="superwaba/ext/xplat/util/xml/ParserException.html"/>
+</tocsect1>
+<tocsect1 name="superwaba.ext.xplat.util.props" url="superwaba/ext/xplat/util/props/package-summary.html">
+ <tocsect2 name="Properties.Value" url="superwaba/ext/xplat/util/props/Properties.Value.html"/>
+ <tocsect2 name="Properties" url="superwaba/ext/xplat/util/props/Properties.html"/>
+ <tocsect2 name="Properties.Double" url="superwaba/ext/xplat/util/props/Properties.Double.html"/>
+ <tocsect2 name="Properties.Long" url="superwaba/ext/xplat/util/props/Properties.Long.html"/>
+ <tocsect2 name="Properties.Str" url="superwaba/ext/xplat/util/props/Properties.Str.html"/>
+ <tocsect2 name="Properties.Int" url="superwaba/ext/xplat/util/props/Properties.Int.html"/>
+ <tocsect2 name="Properties.Boolean" url="superwaba/ext/xplat/util/props/Properties.Boolean.html"/>
+</tocsect1>
+</kdeveloptoc>
+
diff --git a/languages/java/driver.cpp b/languages/java/driver.cpp
new file mode 100644
index 00000000..f5bb6bfc
--- /dev/null
+++ b/languages/java/driver.cpp
@@ -0,0 +1,227 @@
+/* This file is part of KDevelop
+ Copyright (C) 2002,2003 Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include "JavaAST.hpp"
+#include "JavaLexer.hpp"
+#include "JavaRecognizer.hpp"
+
+#include <kdebug.h>
+#include <stdlib.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+
+#include <string>
+#include <sstream>
+
+class DefaultSourceProvider: public SourceProvider
+{
+public:
+ DefaultSourceProvider() {}
+
+ virtual QString contents( const QString& fileName )
+ {
+ QString source;
+
+ QFile f( fileName );
+ if( f.open(IO_ReadOnly) ){
+ QTextStream s( &f );
+ source = s.read();
+ f.close();
+ }
+ return source;
+ }
+
+ virtual bool isModified( const QString& fileName )
+ {
+ Q_UNUSED( fileName );
+ return true;
+ }
+
+private:
+ DefaultSourceProvider( const DefaultSourceProvider& source );
+ void operator = ( const DefaultSourceProvider& source );
+};
+
+
+Driver::Driver()
+ : lexer( 0 )
+{
+ m_sourceProvider = new DefaultSourceProvider();
+}
+
+Driver::~Driver()
+{
+ reset();
+ delete( m_sourceProvider );
+}
+
+SourceProvider* Driver::sourceProvider()
+{
+ return m_sourceProvider;
+}
+
+void Driver::setSourceProvider( SourceProvider* sourceProvider )
+{
+ if( m_sourceProvider )
+ delete( m_sourceProvider );
+ m_sourceProvider = sourceProvider;
+}
+
+void Driver::reset( )
+{
+ m_problems.clear();
+ m_includePaths.clear();
+
+ while( m_parsedUnits.size() ){
+ RefJavaAST unit = *m_parsedUnits.begin();
+ m_parsedUnits.remove( m_parsedUnits.begin() );
+ delete( unit );
+ }
+}
+
+void Driver::remove( const QString & fileName )
+{
+ m_problems.remove( fileName );
+
+ QMap<QString, RefJavaAST>::Iterator it = m_parsedUnits.find( fileName );
+ if( it != m_parsedUnits.end() ){
+ RefJavaAST unit = *it;
+ m_parsedUnits.remove( it );
+ delete( unit );
+ }
+}
+
+RefJavaAST Driver::takeTranslationUnit( const QString& fileName )
+{
+ QMap<QString, RefJavaAST>::Iterator it = m_parsedUnits.find( fileName );
+ RefJavaAST unit( *it );
+ //m_parsedUnits.remove( it );
+ m_parsedUnits[ fileName] = 0;
+ return unit;
+}
+
+RefJavaAST Driver::translationUnit( const QString& fileName ) const
+{
+ QMap<QString, RefJavaAST>::ConstIterator it = m_parsedUnits.find( fileName );
+ return it != m_parsedUnits.end() ? *it : RefJavaAST();
+}
+
+void Driver::addProblem( const QString & fileName, const Problem & problem )
+{
+ findOrInsertProblemList( fileName ).append( problem );
+}
+
+QValueList < Problem >& Driver::findOrInsertProblemList( const QString & fileName )
+{
+ QMap<QString, QValueList<Problem> >::Iterator it = m_problems.find( fileName );
+ if( it != m_problems.end() )
+ return it.data();
+
+ QValueList<Problem> l;
+ m_problems.insert( fileName, l );
+ return m_problems[ fileName ];
+}
+
+QValueList < Problem > Driver::problems( const QString & fileName ) const
+{
+ QMap<QString, QValueList<Problem> >::ConstIterator it = m_problems.find( fileName );
+ if( it != m_problems.end() )
+ return it.data();
+ return QValueList<Problem>();
+}
+
+void Driver::parseFile( const QString& fileName, bool onlyPreProcess, bool force )
+{
+ QFileInfo fileInfo( fileName );
+ QString absFilePath = fileInfo.absFilePath();
+
+ QMap<QString, RefJavaAST>::Iterator it = m_parsedUnits.find( absFilePath );
+
+ if( force && it != m_parsedUnits.end() ){
+ takeTranslationUnit( absFilePath );
+ } else if( it != m_parsedUnits.end() && *it != 0 ){
+ // file already processed
+ return;
+ }
+
+ m_problems.remove( fileName );
+
+ m_currentFileName = fileName;
+
+ std::string source( sourceProvider()->contents(fileName).utf8() );
+ std::istringstream in( source.c_str() );
+
+ JavaLexer lex( in );
+ lex.setDriver( this );
+ lexer = &lex;
+ setupLexer( &lex );
+
+
+ /// @todo lex.setSource( sourceProvider()->contents(fileName) );
+
+ RefJavaAST translationUnit;
+ if( !onlyPreProcess ){
+ JavaRecognizer parser( lex );
+ parser.setDriver( this );
+ setupParser( &parser );
+
+
+ try{
+ // make an ast factory
+ ANTLR_USE_NAMESPACE(antlr)JavaASTFactory ast_factory;
+ // initialize and put it in the parser...
+ parser.initializeASTFactory (ast_factory);
+ parser.setASTFactory (&ast_factory);
+
+ parser.compilationUnit();
+
+ RefJavaAST translationUnit = RefJavaAST( parser.getAST() );
+ m_parsedUnits.insert( fileName, translationUnit );
+
+ } catch( ANTLR_USE_NAMESPACE(antlr)ANTLRException& ex ){}
+
+ }
+
+ m_currentFileName = QString::null;
+ lexer = 0;
+
+ fileParsed( fileName );
+}
+
+void Driver::setupLexer( JavaLexer * // lexer
+ )
+{
+}
+
+void Driver::setupParser( JavaRecognizer * parser )
+{
+ Q_UNUSED( parser );
+}
+
+void Driver::addIncludePath( const QString &path )
+{
+ if( !path.stripWhiteSpace().isEmpty() )
+ m_includePaths << path;
+}
+
+void Driver::fileParsed( const QString & fileName )
+{
+ Q_UNUSED( fileName );
+}
diff --git a/languages/java/driver.h b/languages/java/driver.h
new file mode 100644
index 00000000..c830875e
--- /dev/null
+++ b/languages/java/driver.h
@@ -0,0 +1,139 @@
+/* This file is part of KDevelop
+ Copyright (C) 2002,2003 Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef DRIVER_H
+#define DRIVER_H
+
+#include "JavaAST.hpp"
+
+#include <qpair.h>
+#include <qvaluestack.h>
+#include <qstringlist.h>
+#include <qmap.h>
+
+class JavaLexer;
+class JavaRecognizer;
+
+class Problem
+{
+public:
+ enum
+ {
+ Level_Error = 0,
+ Level_Warning,
+ Level_Todo,
+ Level_Fixme
+ };
+
+public:
+ Problem() {}
+ Problem( const Problem& source )
+ : m_text( source.m_text ), m_line( source.m_line ),
+ m_column( source.m_column ), m_level( source.m_level ) {}
+ Problem( const QString& text, int line, int column, int level=Level_Error )
+ : m_text( text ), m_line( line ), m_column( column ), m_level(level) {}
+
+ Problem& operator = ( const Problem& source )
+ {
+ m_text = source.m_text;
+ m_line = source.m_line;
+ m_column = source.m_column;
+ m_level = source.m_level;
+ return( *this );
+ }
+
+ bool operator == ( const Problem& p ) const
+ {
+ return m_text == p.m_text && m_line == p.m_line && m_column == p.m_column && m_level == p.m_level;
+ }
+
+ QString text() const { return m_text; }
+ int line() const { return m_line; }
+ int column() const { return m_column; }
+ int level() const { return m_level; }
+
+private:
+ QString m_text;
+ int m_line;
+ int m_column;
+ int m_level;
+};
+
+class SourceProvider
+{
+public:
+ SourceProvider() {}
+ virtual ~SourceProvider() {}
+
+ virtual QString contents( const QString& fileName ) = 0;
+ virtual bool isModified( const QString& fileName ) = 0;
+
+private:
+ SourceProvider( const SourceProvider& source );
+ void operator = ( const SourceProvider& source );
+};
+
+class Driver
+{
+public:
+ Driver();
+ virtual ~Driver();
+
+ SourceProvider* sourceProvider();
+ void setSourceProvider( SourceProvider* sourceProvider );
+
+ virtual void reset();
+
+ virtual void parseFile( const QString& fileName, bool onlyPreProcesss=false, bool force=false );
+ virtual void fileParsed( const QString& fileName );
+ virtual void remove( const QString& fileName );
+
+ virtual void addProblem( const QString& fileName, const Problem& problem );
+
+ QString currentFileName() const { return m_currentFileName; }
+ RefJavaAST takeTranslationUnit( const QString& fileName );
+ RefJavaAST translationUnit( const QString& fileName ) const;
+ QValueList<Problem> problems( const QString& fileName ) const;
+
+ QStringList includePaths() const { return m_includePaths; }
+ virtual void addIncludePath( const QString &path );
+
+ const QMap<QString, RefJavaAST> &parsedUnits() const { return m_parsedUnits; }
+
+protected:
+ virtual void setupLexer( JavaLexer* lexer );
+ virtual void setupParser( JavaRecognizer* parser );
+
+private:
+ QValueList<Problem>& findOrInsertProblemList( const QString& fileName );
+
+private:
+ QString m_currentFileName;
+ QMap< QString, QValueList<Problem> > m_problems;
+ QMap< QString, RefJavaAST > m_parsedUnits;
+ QStringList m_includePaths;
+ JavaLexer *lexer;
+ SourceProvider* m_sourceProvider;
+
+private:
+ Driver( const Driver& source );
+ void operator = ( const Driver& source );
+};
+
+#endif
diff --git a/languages/java/file_templates/Makefile.am b/languages/java/file_templates/Makefile.am
new file mode 100644
index 00000000..dc3b82a9
--- /dev/null
+++ b/languages/java/file_templates/Makefile.am
@@ -0,0 +1,4 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = java
+
+
diff --git a/languages/java/file_templates/java b/languages/java/file_templates/java
new file mode 100644
index 00000000..f490b79c
--- /dev/null
+++ b/languages/java/file_templates/java
@@ -0,0 +1,6 @@
+/*
+ * Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ *
+ * Copyright: See COPYING file that comes with this distribution
+ *
+*/
diff --git a/languages/java/java.g b/languages/java/java.g
new file mode 100644
index 00000000..1f825ec5
--- /dev/null
+++ b/languages/java/java.g
@@ -0,0 +1,1318 @@
+
+header "pre_include_hpp" {
+ #include "driver.h"
+ #include "JavaAST.hpp"
+
+ #include <qlistview.h>
+ #include <kdebug.h>
+
+ #define SET_POSITION(ast,t)\
+ { \
+ RefJavaAST(ast)->setLine( t->getLine() );\
+ RefJavaAST(ast)->setColumn( t->getColumn() ); \
+ }
+}
+
+options {
+ language="Cpp";
+}
+
+/** Java 1.3 Recognizer
+ *
+ * Run 'java Main [-showtree] directory-full-of-java-files'
+ *
+ * [The -showtree option pops up a Swing frame that shows
+ * the AST constructed from the parser.]
+ *
+ * Run 'java Main <directory full of java files>'
+ *
+ * Contributing authors:
+ * John Mitchell johnm@non.net
+ * Terence Parr parrt@magelang.com
+ * John Lilley jlilley@empathy.com
+ * Scott Stanchfield thetick@magelang.com
+ * Markus Mohnen mohnen@informatik.rwth-aachen.de
+ * Peter Williams pete.williams@sun.com
+ * Allan Jacobs Allan.Jacobs@eng.sun.com
+ * Steve Messick messick@redhills.com
+ * John Pybus john@pybus.org
+ *
+ * Version 1.00 December 9, 1997 -- initial release
+ * Version 1.01 December 10, 1997
+ * fixed bug in octal def (0..7 not 0..8)
+ * Version 1.10 August 1998 (parrt)
+ * added tree construction
+ * fixed definition of WS,comments for mac,pc,unix newlines
+ * added unary plus
+ * Version 1.11 (Nov 20, 1998)
+ * Added "shutup" option to turn off last ambig warning.
+ * Fixed inner class def to allow named class defs as statements
+ * synchronized requires compound not simple statement
+ * add [] after builtInType DOT class in primaryExpression
+ * "const" is reserved but not valid..removed from modifiers
+ * Version 1.12 (Feb 2, 1999)
+ * Changed LITERAL_xxx to xxx in tree grammar.
+ * Updated java.g to use tokens {...} now for 2.6.0 (new feature).
+ *
+ * Version 1.13 (Apr 23, 1999)
+ * Didn't have (stat)? for else clause in tree parser.
+ * Didn't gen ASTs for interface extends. Updated tree parser too.
+ * Updated to 2.6.0.
+ * Version 1.14 (Jun 20, 1999)
+ * Allowed final/abstract on local classes.
+ * Removed local interfaces from methods
+ * Put instanceof precedence where it belongs...in relationalExpr
+ * It also had expr not type as arg; fixed it.
+ * Missing ! on SEMI in classBlock
+ * fixed: (expr) + "string" was parsed incorrectly (+ as unary plus).
+ * fixed: didn't like Object[].class in parser or tree parser
+ * Version 1.15 (Jun 26, 1999)
+ * Screwed up rule with instanceof in it. :( Fixed.
+ * Tree parser didn't like (expr).something; fixed.
+ * Allowed multiple inheritance in tree grammar. oops.
+ * Version 1.16 (August 22, 1999)
+ * Extending an interface built a wacky tree: had extra EXTENDS.
+ * Tree grammar didn't allow multiple superinterfaces.
+ * Tree grammar didn't allow empty var initializer: {}
+ * Version 1.17 (October 12, 1999)
+ * ESC lexer rule allowed 399 max not 377 max.
+ * java.tree.g didn't handle the expression of synchronized
+ * statements.
+ * Version 1.18 (August 12, 2001)
+ * Terence updated to Java 2 Version 1.3 by
+ * observing/combining work of Allan Jacobs and Steve
+ * Messick. Handles 1.3 src. Summary:
+ * o primary didn't include boolean.class kind of thing
+ * o constructor calls parsed explicitly now:
+ * see explicitConstructorInvocation
+ * o add strictfp modifier
+ * o missing objBlock after new expression in tree grammar
+ * o merged local class definition alternatives, moved after declaration
+ * o fixed problem with ClassName.super.field
+ * o reordered some alternatives to make things more efficient
+ * o long and double constants were not differentiated from int/float
+ * o whitespace rule was inefficient: matched only one char
+ * o add an examples directory with some nasty 1.3 cases
+ * o made Main.java use buffered IO and a Reader for Unicode support
+ * o supports UNICODE?
+ * Using Unicode charVocabulay makes code file big, but only
+ * in the bitsets at the end. I need to make ANTLR generate
+ * unicode bitsets more efficiently.
+ * Version 1.19 (April 25, 2002)
+ * Terence added in nice fixes by John Pybus concerning floating
+ * constants and problems with super() calls. John did a nice
+ * reorg of the primary/postfix expression stuff to read better
+ * and makes f.g.super() parse properly (it was METHOD_CALL not
+ * a SUPER_CTOR_CALL). Also:
+ *
+ * o "finally" clause was a root...made it a child of "try"
+ * o Added stuff for asserts too for Java 1.4, but *commented out*
+ * as it is not backward compatible.
+ *
+ * Version 1.20 (October 27, 2002)
+ *
+ * Terence ended up reorging John Pybus' stuff to
+ * remove some nondeterminisms and some syntactic predicates.
+ * Note that the grammar is stricter now; e.g., this(...) must
+ * be the first statement.
+ *
+ * Trinary ?: operator wasn't working as array name:
+ * (isBig ? bigDigits : digits)[i];
+ *
+ * Checked parser/tree parser on source for
+ * Resin-2.0.5, jive-2.1.1, jdk 1.3.1, Lucene, antlr 2.7.2a4,
+ * and the 110k-line jGuru server source.
+ *
+ * Version tracking now done with following ID:
+ *
+ * $Id$
+ *
+ * This grammar is in the PUBLIC DOMAIN
+ */
+class JavaRecognizer extends Parser;
+options {
+ k = 2; // two token lookahead
+ exportVocab=Java; // Call its vocabulary "Java"
+ codeGenMakeSwitchThreshold = 2; // Some optimizations
+ codeGenBitsetTestThreshold = 3;
+ defaultErrorHandler = true;
+ buildAST = true;
+ ASTLabelType = "RefJavaAST";
+}
+
+tokens {
+ BLOCK; MODIFIERS; OBJBLOCK; SLIST; CTOR_DEF; METHOD_DEF; VARIABLE_DEF;
+ INSTANCE_INIT; STATIC_INIT; TYPE; CLASS_DEF; INTERFACE_DEF;
+ PACKAGE_DEF; ARRAY_DECLARATOR; EXTENDS_CLAUSE; IMPLEMENTS_CLAUSE;
+ PARAMETERS; PARAMETER_DEF; LABELED_STAT; TYPECAST; INDEX_OP;
+ POST_INC; POST_DEC; METHOD_CALL; EXPR; ARRAY_INIT;
+ IMPORT; UNARY_MINUS; UNARY_PLUS; CASE_GROUP; ELIST; FOR_INIT; FOR_CONDITION;
+ FOR_ITERATOR; EMPTY_STAT; FINAL="final"; ABSTRACT="abstract";
+ STRICTFP="strictfp"; SUPER_CTOR_CALL; CTOR_CALL;
+}
+
+{
+private:
+ Driver* m_driver;
+
+public:
+ void setDriver( Driver* d ) { m_driver = d; }
+ void setFileName( const QString& fileName ) { m_driver->currentFileName() = fileName; }
+
+ void reportError( const ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(ex.getMessage().c_str()), ex.getLine(), ex.getColumn()) );
+ }
+
+ void reportError( const ANTLR_USE_NAMESPACE(std)string& errorMessage ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(errorMessage.c_str()), LT(1)->getLine(), LT(1)->getColumn()) );
+ }
+
+ void reportMessage( const ANTLR_USE_NAMESPACE(std)string& message ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(message.c_str()), LT(1)->getLine(), LT(1)->getColumn()) );
+ }
+}
+
+// Compilation Unit: In Java, this is a single file. This is the start
+// rule for this parser
+compilationUnit
+ : // A compilation unit starts with an optional package definition
+ ( packageDefinition
+ | /* nothing */
+ )
+
+ // Next we have a series of zero or more import statements
+ ( importDefinition )*
+
+ // Wrapping things up with any number of class or interface
+ // definitions
+ ( typeDefinition )*
+
+ EOF!
+ ;
+
+// Package statement: "package" followed by an identifier.
+packageDefinition
+ options {defaultErrorHandler = true;} // let ANTLR handle errors
+ : p:"package"^ {#p->setType(PACKAGE_DEF);} identifier SEMI!
+ ;
+
+// Import statement: import followed by a package or class name
+importDefinition
+ options {defaultErrorHandler = true;}
+ : i:"import"^ {#i->setType(IMPORT);} identifierStar SEMI!
+ ;
+
+// A type definition in a file is either a class or interface definition.
+typeDefinition
+ options {defaultErrorHandler = true;}
+ : m:modifiers!
+ ( classDefinition[#m]
+ | interfaceDefinition[#m]
+ )
+ | SEMI!
+ ;
+
+/** A declaration is the creation of a reference or primitive-type variable
+ * Create a separate Type/Var tree for each var in the var list.
+ */
+declaration!
+ : m:modifiers t:typeSpec[false] v:variableDefinitions[#m,#t]
+ {#declaration = #v;}
+ ;
+
+// A type specification is a type name with possible brackets afterwards
+// (which would make it an array type).
+typeSpec[bool addImagNode]
+ : classTypeSpec[addImagNode]
+ | builtInTypeSpec[addImagNode]
+ ;
+
+// A class type specification is a class type with possible brackets afterwards
+// (which would make it an array type).
+classTypeSpec[bool addImagNode]
+ : identifier (lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);} RBRACK!)*
+ {
+ if ( addImagNode ) {
+ #classTypeSpec = #(#[TYPE,"TYPE"], #classTypeSpec);
+ }
+ }
+ ;
+
+// A builtin type specification is a builtin type with possible brackets
+// afterwards (which would make it an array type).
+builtInTypeSpec[bool addImagNode]
+ : builtInType (lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);} RBRACK!)*
+ {
+ if ( addImagNode ) {
+ #builtInTypeSpec = #(#[TYPE,"TYPE"], #builtInTypeSpec);
+ }
+ }
+ ;
+
+// A type name. which is either a (possibly qualified) class name or
+// a primitive (builtin) type
+type
+ : identifier
+ | builtInType
+ ;
+
+// The primitive types.
+builtInType
+ : "void"
+ | "boolean"
+ | "byte"
+ | "char"
+ | "short"
+ | "int"
+ | "float"
+ | "long"
+ | "double"
+ ;
+
+// A (possibly-qualified) java identifier. We start with the first IDENT
+// and expand its name by adding dots and following IDENTS
+identifier
+ : IDENT ( DOT^ IDENT )*
+ ;
+
+identifierStar
+ : IDENT
+ ( DOT^ IDENT )*
+ ( DOT^ STAR )?
+ ;
+
+// A list of zero or more modifiers. We could have used (modifier)* in
+// place of a call to modifiers, but I thought it was a good idea to keep
+// this rule separate so they can easily be collected in a Vector if
+// someone so desires
+modifiers
+ : ( modifier )*
+ {#modifiers = #([MODIFIERS, "MODIFIERS"], #modifiers);}
+ ;
+
+// modifiers for Java classes, interfaces, class/instance vars and methods
+modifier
+ : "private"
+ | "public"
+ | "protected"
+ | "static"
+ | "transient"
+ | "final"
+ | "abstract"
+ | "native"
+ | "threadsafe"
+ | "synchronized"
+// | "const" // reserved word, but not valid
+ | "volatile"
+ | "strictfp"
+ ;
+
+// Definition of a Java class
+classDefinition![RefJavaAST modifiers]
+ : "class" IDENT
+ // it _might_ have a superclass...
+ sc:superClassClause
+ // it might implement some interfaces...
+ ic:implementsClause
+ // now parse the body of the class
+ cb:classBlock
+ {#classDefinition = #(#[CLASS_DEF,"CLASS_DEF"],
+ modifiers,IDENT,sc,ic,cb);}
+ ;
+
+superClassClause!
+ : ( "extends" id:identifier )?
+ {#superClassClause = #(#[EXTENDS_CLAUSE,"EXTENDS_CLAUSE"],id);}
+ ;
+
+// Definition of a Java Interface
+interfaceDefinition![RefJavaAST modifiers]
+ : "interface" IDENT
+ // it might extend some other interfaces
+ ie:interfaceExtends
+ // now parse the body of the interface (looks like a class...)
+ cb:classBlock
+ {#interfaceDefinition = #(#[INTERFACE_DEF,"INTERFACE_DEF"],
+ modifiers,IDENT,ie,cb);}
+ ;
+
+// This is the body of a class. You can have fields and extra semicolons,
+// That's about it (until you see what a field is...)
+classBlock
+ : LCURLY!
+ ( field | SEMI! )*
+ RCURLY!
+ {#classBlock = #([OBJBLOCK, "OBJBLOCK"], #classBlock);}
+ ;
+
+// An interface can extend several other interfaces...
+interfaceExtends
+ : (
+ e:"extends"!
+ identifier ( COMMA! identifier )*
+ )?
+ {#interfaceExtends = #(#[EXTENDS_CLAUSE,"EXTENDS_CLAUSE"],
+ #interfaceExtends);}
+ ;
+
+// A class can implement several interfaces...
+implementsClause
+ : (
+ i:"implements"! identifier ( COMMA! identifier )*
+ )?
+ {#implementsClause = #(#[IMPLEMENTS_CLAUSE,"IMPLEMENTS_CLAUSE"],
+ #implementsClause);}
+ ;
+
+// Now the various things that can be defined inside a class or interface...
+// Note that not all of these are really valid in an interface (constructors,
+// for example), and if this grammar were used for a compiler there would
+// need to be some semantic checks to make sure we're doing the right thing...
+field!
+ : // method, constructor, or variable declaration
+ mods:modifiers
+ ( h:ctorHead s:constructorBody // constructor
+ {#field = #(#[CTOR_DEF,"CTOR_DEF"], mods, h, s);}
+
+ | cd:classDefinition[#mods] // inner class
+ {#field = #cd;}
+
+ | id:interfaceDefinition[#mods] // inner interface
+ {#field = #id;}
+
+ | t:typeSpec[false] // method or variable declaration(s)
+ ( IDENT // the name of the method
+
+ // parse the formal parameter declarations.
+ LPAREN! param:parameterDeclarationList RPAREN!
+
+ rt:declaratorBrackets[#t]
+
+ // get the list of exceptions that this method is
+ // declared to throw
+ (tc:throwsClause)?
+
+ ( s2:compoundStatement | SEMI )
+ {#field = #(#[METHOD_DEF,"METHOD_DEF"],
+ mods,
+ #(#[TYPE,"TYPE"],rt),
+ IDENT,
+ param,
+ tc,
+ s2);}
+ | v:variableDefinitions[#mods,#t] SEMI
+// {#field = #(#[VARIABLE_DEF,"VARIABLE_DEF"], v);}
+ {#field = #v;}
+ )
+ )
+
+ // "static { ... }" class initializer
+ | "static" s3:compoundStatement
+ {#field = #(#[STATIC_INIT,"STATIC_INIT"], s3);}
+
+ // "{ ... }" instance initializer
+ | s4:compoundStatement
+ {#field = #(#[INSTANCE_INIT,"INSTANCE_INIT"], s4);}
+ ;
+
+constructorBody
+ : lc:LCURLY^ {#lc->setType(SLIST);}
+ ( options { greedy=true; } : explicitConstructorInvocation)?
+ (statement)*
+ RCURLY!
+ ;
+
+/** Catch obvious constructor calls, but not the expr.super(...) calls */
+explicitConstructorInvocation
+ : "this"! lp1:LPAREN^ argList RPAREN! SEMI!
+ {#lp1->setType(CTOR_CALL);}
+ | "super"! lp2:LPAREN^ argList RPAREN! SEMI!
+ {#lp2->setType(SUPER_CTOR_CALL);}
+ ;
+
+variableDefinitions[RefJavaAST mods, RefJavaAST t]
+ : variableDeclarator[(RefJavaAST)getASTFactory()->dupTree((antlr::RefAST)mods),
+ (RefJavaAST)getASTFactory()->dupTree((antlr::RefAST)t)]
+ ( COMMA!
+ variableDeclarator[(RefJavaAST)getASTFactory()->dupTree((antlr::RefAST)mods),
+ (RefJavaAST)getASTFactory()->dupTree((antlr::RefAST)t)]
+ )*
+ ;
+
+/** Declaration of a variable. This can be a class/instance variable,
+ * or a local variable in a method
+ * It can also include possible initialization.
+ */
+variableDeclarator![RefJavaAST mods, RefJavaAST t]
+ : id:IDENT d:declaratorBrackets[t] v:varInitializer
+ {#variableDeclarator = #(#[VARIABLE_DEF,"VARIABLE_DEF"], mods, #(#[TYPE,"TYPE"],d), id, v);}
+ ;
+
+declaratorBrackets[RefJavaAST typ]
+ : {#declaratorBrackets=typ;}
+ (lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);} RBRACK!)*
+ ;
+
+varInitializer
+ : ( ASSIGN^ initializer )?
+ ;
+
+// This is an initializer used to set up an array.
+arrayInitializer
+ : lc:LCURLY^ {#lc->setType(ARRAY_INIT);}
+ ( initializer
+ (
+ // CONFLICT: does a COMMA after an initializer start a new
+ // initializer or start the option ',' at end?
+ // ANTLR generates proper code by matching
+ // the comma as soon as possible.
+ options {
+ warnWhenFollowAmbig = false;
+ }
+ :
+ COMMA! initializer
+ )*
+ (COMMA!)?
+ )?
+ RCURLY!
+ ;
+
+// The two "things" that can initialize an array element are an expression
+// and another (nested) array initializer.
+initializer
+ : expression
+ | arrayInitializer
+ ;
+
+// This is the header of a method. It includes the name and parameters
+// for the method.
+// This also watches for a list of exception classes in a "throws" clause.
+ctorHead
+ : IDENT // the name of the method
+
+ // parse the formal parameter declarations.
+ LPAREN! parameterDeclarationList RPAREN!
+
+ // get the list of exceptions that this method is declared to throw
+ (throwsClause)?
+ ;
+
+// This is a list of exception classes that the method is declared to throw
+throwsClause
+ : "throws"^ identifier ( COMMA! identifier )*
+ ;
+
+// A list of formal parameters
+parameterDeclarationList
+ : ( parameterDeclaration ( COMMA! parameterDeclaration )* )?
+ {#parameterDeclarationList = #(#[PARAMETERS,"PARAMETERS"],
+ #parameterDeclarationList);}
+ ;
+
+// A formal parameter.
+parameterDeclaration!
+ : pm:parameterModifier t:typeSpec[false] id:IDENT
+ pd:declaratorBrackets[#t]
+ {#parameterDeclaration = #(#[PARAMETER_DEF,"PARAMETER_DEF"],
+ pm, #([TYPE,"TYPE"],pd), id);}
+ ;
+
+parameterModifier
+ : (f:"final")?
+ {#parameterModifier = #(#[MODIFIERS,"MODIFIERS"], f);}
+ ;
+
+// Compound statement. This is used in many contexts:
+// Inside a class definition prefixed with "static":
+// it is a class initializer
+// Inside a class definition without "static":
+// it is an instance initializer
+// As the body of a method
+// As a completely indepdent braced block of code inside a method
+// it starts a new scope for variable definitions
+
+compoundStatement
+ : lc:LCURLY^ {#lc->setType(SLIST);}
+ // include the (possibly-empty) list of statements
+ (statement)*
+ RCURLY!
+ ;
+
+statement
+ // A list of statements in curly braces -- start a new scope!
+ : compoundStatement
+
+ // declarations are ambiguous with "ID DOT" relative to expression
+ // statements. Must backtrack to be sure. Could use a semantic
+ // predicate to test symbol table to see what the type was coming
+ // up, but that's pretty hard without a symbol table ;)
+ | (declaration)=> declaration SEMI!
+
+ // An expression statement. This could be a method call,
+ // assignment statement, or any other expression evaluated for
+ // side-effects.
+ | expression SEMI!
+
+ // class definition
+ | m:modifiers! classDefinition[#m]
+
+ // Attach a label to the front of a statement
+ | IDENT c:COLON^ {#c->setType(LABELED_STAT);} statement
+
+ // If-else statement
+ | "if"^ LPAREN! expression RPAREN! statement
+ (
+ // CONFLICT: the old "dangling-else" problem...
+ // ANTLR generates proper code matching
+ // as soon as possible. Hush warning.
+ options {
+ warnWhenFollowAmbig = false;
+ }
+ :
+ "else"! statement
+ )?
+
+ // For statement
+ | "for"^
+ LPAREN!
+ forInit SEMI! // initializer
+ forCond SEMI! // condition test
+ forIter // updater
+ RPAREN!
+ statement // statement to loop over
+
+ // While statement
+ | "while"^ LPAREN! expression RPAREN! statement
+
+ // do-while statement
+ | "do"^ statement "while"! LPAREN! expression RPAREN! SEMI!
+
+ // get out of a loop (or switch)
+ | "break"^ (IDENT)? SEMI!
+
+ // do next iteration of a loop
+ | "continue"^ (IDENT)? SEMI!
+
+ // Return an expression
+ | "return"^ (expression)? SEMI!
+
+ // switch/case statement
+ | "switch"^ LPAREN! expression RPAREN! LCURLY!
+ ( casesGroup )*
+ RCURLY!
+
+ // exception try-catch block
+ | tryBlock
+
+ // throw an exception
+ | "throw"^ expression SEMI!
+
+ // synchronize a statement
+ | "synchronized"^ LPAREN! expression RPAREN! compoundStatement
+
+ // asserts (uncomment if you want 1.4 compatibility)
+ // | "assert"^ expression ( COLON! expression )? SEMI!
+
+ // empty statement
+ | s:SEMI {#s->setType(EMPTY_STAT);}
+ ;
+
+casesGroup
+ : ( // CONFLICT: to which case group do the statements bind?
+ // ANTLR generates proper code: it groups the
+ // many "case"/"default" labels together then
+ // follows them with the statements
+ options {
+ greedy = true;
+ }
+ :
+ aCase
+ )+
+ caseSList
+ {#casesGroup = #([CASE_GROUP, "CASE_GROUP"], #casesGroup);}
+ ;
+
+aCase
+ : ("case"^ expression | "default") COLON!
+ ;
+
+caseSList
+ : (statement)*
+ {#caseSList = #(#[SLIST,"SLIST"],#caseSList);}
+ ;
+
+// The initializer for a for loop
+forInit
+ // if it looks like a declaration, it is
+ : ( (declaration)=> declaration
+ // otherwise it could be an expression list...
+ | expressionList
+ )?
+ {#forInit = #(#[FOR_INIT,"FOR_INIT"],#forInit);}
+ ;
+
+forCond
+ : (expression)?
+ {#forCond = #(#[FOR_CONDITION,"FOR_CONDITION"],#forCond);}
+ ;
+
+forIter
+ : (expressionList)?
+ {#forIter = #(#[FOR_ITERATOR,"FOR_ITERATOR"],#forIter);}
+ ;
+
+// an exception handler try/catch block
+tryBlock
+ : "try"^ compoundStatement
+ (handler)*
+ ( finallyClause )?
+ ;
+
+finallyClause
+ : "finally"^ compoundStatement
+ ;
+
+// an exception handler
+handler
+ : "catch"^ LPAREN! parameterDeclaration RPAREN! compoundStatement
+ ;
+
+// expressions
+// Note that most of these expressions follow the pattern
+// thisLevelExpression :
+// nextHigherPrecedenceExpression
+// (OPERATOR nextHigherPrecedenceExpression)*
+// which is a standard recursive definition for a parsing an expression.
+// The operators in java have the following precedences:
+// lowest (13) = *= /= %= += -= <<= >>= >>>= &= ^= |=
+// (12) ?:
+// (11) ||
+// (10) &&
+// ( 9) |
+// ( 8) ^
+// ( 7) &
+// ( 6) == !=
+// ( 5) < <= > >=
+// ( 4) << >>
+// ( 3) +(binary) -(binary)
+// ( 2) * / %
+// ( 1) ++ -- +(unary) -(unary) ~ ! (type)
+// [] () (method call) . (dot -- identifier qualification)
+// new () (explicit parenthesis)
+//
+// the last two are not usually on a precedence chart; I put them in
+// to point out that new has a higher precedence than '.', so you
+// can validy use
+// new Frame().show()
+//
+// Note that the above precedence levels map to the rules below...
+// Once you have a precedence chart, writing the appropriate rules as below
+// is usually very straightfoward
+
+// the mother of all expressions
+expression
+ : assignmentExpression
+ {#expression = #(#[EXPR,"EXPR"],#expression);}
+ ;
+
+// This is a list of expressions.
+expressionList
+ : expression (COMMA! expression)*
+ {#expressionList = #(#[ELIST,"ELIST"], expressionList);}
+ ;
+
+// assignment expression (level 13)
+assignmentExpression
+ : conditionalExpression
+ ( ( ASSIGN^
+ | PLUS_ASSIGN^
+ | MINUS_ASSIGN^
+ | STAR_ASSIGN^
+ | DIV_ASSIGN^
+ | MOD_ASSIGN^
+ | SR_ASSIGN^
+ | BSR_ASSIGN^
+ | SL_ASSIGN^
+ | BAND_ASSIGN^
+ | BXOR_ASSIGN^
+ | BOR_ASSIGN^
+ )
+ assignmentExpression
+ )?
+ ;
+
+// conditional test (level 12)
+conditionalExpression
+ : logicalOrExpression
+ ( QUESTION^ assignmentExpression COLON! conditionalExpression )?
+ ;
+
+// logical or (||) (level 11)
+logicalOrExpression
+ : logicalAndExpression (LOR^ logicalAndExpression)*
+ ;
+
+// logical and (&&) (level 10)
+logicalAndExpression
+ : inclusiveOrExpression (LAND^ inclusiveOrExpression)*
+ ;
+
+// bitwise or non-short-circuiting or (|) (level 9)
+inclusiveOrExpression
+ : exclusiveOrExpression (BOR^ exclusiveOrExpression)*
+ ;
+
+// exclusive or (^) (level 8)
+exclusiveOrExpression
+ : andExpression (BXOR^ andExpression)*
+ ;
+
+// bitwise or non-short-circuiting and (&) (level 7)
+andExpression
+ : equalityExpression (BAND^ equalityExpression)*
+ ;
+
+// equality/inequality (==/!=) (level 6)
+equalityExpression
+ : relationalExpression ((NOT_EQUAL^ | EQUAL^) relationalExpression)*
+ ;
+
+// boolean relational expressions (level 5)
+relationalExpression
+ : shiftExpression
+ ( ( ( LT_^
+ | GT^
+ | LE^
+ | GE^
+ )
+ shiftExpression
+ )*
+ | "instanceof"^ typeSpec[true]
+ )
+ ;
+
+// bit shift expressions (level 4)
+shiftExpression
+ : additiveExpression ((SL^ | SR^ | BSR^) additiveExpression)*
+ ;
+
+// binary addition/subtraction (level 3)
+additiveExpression
+ : multiplicativeExpression ((PLUS^ | MINUS^) multiplicativeExpression)*
+ ;
+
+// multiplication/division/modulo (level 2)
+multiplicativeExpression
+ : unaryExpression ((STAR^ | DIV^ | MOD^ ) unaryExpression)*
+ ;
+
+unaryExpression
+ : INC^ unaryExpression
+ | DEC^ unaryExpression
+ | MINUS^ {#MINUS->setType(UNARY_MINUS);} unaryExpression
+ | PLUS^ {#PLUS->setType(UNARY_PLUS);} unaryExpression
+ | unaryExpressionNotPlusMinus
+ ;
+
+unaryExpressionNotPlusMinus
+ : BNOT^ unaryExpression
+ | LNOT^ unaryExpression
+
+ | ( // subrule allows option to shut off warnings
+ options {
+ // "(int" ambig with postfixExpr due to lack of sequence
+ // info in linear approximate LL(k). It's ok. Shut up.
+ generateAmbigWarnings=false;
+ }
+ : // If typecast is built in type, must be numeric operand
+ // Also, no reason to backtrack if type keyword like int, float...
+ lpb:LPAREN^ {#lpb->setType(TYPECAST);} builtInTypeSpec[true] RPAREN!
+ unaryExpression
+
+ // Have to backtrack to see if operator follows. If no operator
+ // follows, it's a typecast. No semantic checking needed to parse.
+ // if it _looks_ like a cast, it _is_ a cast; else it's a "(expr)"
+ | (LPAREN classTypeSpec[true] RPAREN unaryExpressionNotPlusMinus)=>
+ lp:LPAREN^ {#lp->setType(TYPECAST);} classTypeSpec[true] RPAREN!
+ unaryExpressionNotPlusMinus
+
+ | postfixExpression
+ )
+ ;
+
+// qualified names, array expressions, method invocation, post inc/dec
+postfixExpression
+ :
+ /*
+ "this"! lp1:LPAREN^ argList RPAREN!
+ {#lp1->setType(CTOR_CALL);}
+
+ | "super"! lp2:LPAREN^ argList RPAREN!
+ {#lp2->setType(SUPER_CTOR_CALL);}
+ |
+ */
+ primaryExpression
+
+ (
+ /*
+ options {
+ // the use of postfixExpression in SUPER_CTOR_CALL adds DOT
+ // to the lookahead set, and gives loads of false non-det
+ // warnings.
+ // shut them off.
+ generateAmbigWarnings=false;
+ }
+ : */
+ DOT^ IDENT
+ ( lp:LPAREN^ {#lp->setType(METHOD_CALL);}
+ argList
+ RPAREN!
+ )?
+ | DOT^ "this"
+
+ | DOT^ "super"
+ ( // (new Outer()).super() (create enclosing instance)
+ lp3:LPAREN^ argList RPAREN!
+ {#lp3->setType(SUPER_CTOR_CALL);}
+ | DOT^ IDENT
+ ( lps:LPAREN^ {#lps->setType(METHOD_CALL);}
+ argList
+ RPAREN!
+ )?
+ )
+ | DOT^ newExpression
+ | lb:LBRACK^ {#lb->setType(INDEX_OP);} expression RBRACK!
+ )*
+
+ ( // possibly add on a post-increment or post-decrement.
+ // allows INC/DEC on too much, but semantics can check
+ in:INC^ {#in->setType(POST_INC);}
+ | de:DEC^ {#de->setType(POST_DEC);}
+ )?
+ ;
+
+// the basic element of an expression
+primaryExpression
+ : identPrimary ( options {greedy=true;} : DOT^ "class" )?
+ | constant
+ | "true"
+ | "false"
+ | "null"
+ | newExpression
+ | "this"
+ | "super"
+ | LPAREN! assignmentExpression RPAREN!
+ // look for int.class and int[].class
+ | builtInType
+ ( lbt:LBRACK^ {#lbt->setType(ARRAY_DECLARATOR);} RBRACK! )*
+ DOT^ "class"
+ ;
+
+/** Match a, a.b.c refs, a.b.c(...) refs, a.b.c[], a.b.c[].class,
+ * and a.b.c.class refs. Also this(...) and super(...). Match
+ * this or super.
+ */
+identPrimary
+ : IDENT
+ (
+ options {
+ // .ident could match here or in postfixExpression.
+ // We do want to match here. Turn off warning.
+ greedy=true;
+ }
+ : DOT^ IDENT
+ )*
+ (
+ options {
+ // ARRAY_DECLARATOR here conflicts with INDEX_OP in
+ // postfixExpression on LBRACK RBRACK.
+ // We want to match [] here, so greedy. This overcomes
+ // limitation of linear approximate lookahead.
+ greedy=true;
+ }
+ : ( lp:LPAREN^ {#lp->setType(METHOD_CALL);} argList RPAREN! )
+ | ( options {greedy=true;} :
+ lbc:LBRACK^ {#lbc->setType(ARRAY_DECLARATOR);} RBRACK!
+ )+
+ )?
+ ;
+
+/** object instantiation.
+ * Trees are built as illustrated by the following input/tree pairs:
+ *
+ * new T()
+ *
+ * new
+ * |
+ * T -- ELIST
+ * |
+ * arg1 -- arg2 -- .. -- argn
+ *
+ * new int[]
+ *
+ * new
+ * |
+ * int -- ARRAY_DECLARATOR
+ *
+ * new int[] {1,2}
+ *
+ * new
+ * |
+ * int -- ARRAY_DECLARATOR -- ARRAY_INIT
+ * |
+ * EXPR -- EXPR
+ * | |
+ * 1 2
+ *
+ * new int[3]
+ * new
+ * |
+ * int -- ARRAY_DECLARATOR
+ * |
+ * EXPR
+ * |
+ * 3
+ *
+ * new int[1][2]
+ *
+ * new
+ * |
+ * int -- ARRAY_DECLARATOR
+ * |
+ * ARRAY_DECLARATOR -- EXPR
+ * | |
+ * EXPR 1
+ * |
+ * 2
+ *
+ */
+newExpression
+ : "new"^ type
+ ( LPAREN! argList RPAREN! (classBlock)?
+
+ //java 1.1
+ // Note: This will allow bad constructs like
+ // new int[4][][3] {exp,exp}.
+ // There needs to be a semantic check here...
+ // to make sure:
+ // a) [ expr ] and [ ] are not mixed
+ // b) [ expr ] and an init are not used together
+
+ | newArrayDeclarator (arrayInitializer)?
+ )
+ ;
+
+argList
+ : ( expressionList
+ | /*nothing*/
+ {#argList = #[ELIST,"ELIST"];}
+ )
+ ;
+
+newArrayDeclarator
+ : (
+ // CONFLICT:
+ // newExpression is a primaryExpression which can be
+ // followed by an array index reference. This is ok,
+ // as the generated code will stay in this loop as
+ // long as it sees an LBRACK (proper behavior)
+ options {
+ warnWhenFollowAmbig = false;
+ }
+ :
+ lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);}
+ (expression)?
+ RBRACK!
+ )+
+ ;
+
+constant
+ : NUM_INT
+ | CHAR_LITERAL
+ | STRING_LITERAL
+ | NUM_FLOAT
+ | NUM_LONG
+ | NUM_DOUBLE
+ ;
+
+//----------------------------------------------------------------------------
+// The Java scanner
+//----------------------------------------------------------------------------
+{
+#include <string>
+}
+class JavaLexer extends Lexer;
+
+options {
+ exportVocab=Java; // call the vocabulary "Java"
+ testLiterals=false; // don't automatically test for literals
+ defaultErrorHandler=false;
+ k=4; // four characters of lookahead
+// charVocabulary='\u0003'..'\uFFFF';
+ charVocabulary='\u0003'..'\u00FF';
+ // without inlining some bitset tests, couldn't do unicode;
+ // I need to make ANTLR generate smaller bitsets; see
+ // bottom of JavaLexer.java
+ codeGenBitsetTestThreshold=20;
+}
+{
+private:
+ Driver* m_driver;
+
+public:
+ void setDriver( Driver* d ) { m_driver = d; }
+ void setFileName( const QString& fileName ) { m_driver->currentFileName() = fileName; }
+
+ virtual void reportError( const ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(ex.getMessage().c_str()), ex.getLine(), ex.getColumn()) );
+ }
+
+ virtual void reportError( const ANTLR_USE_NAMESPACE(std)string& errorMessage ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(errorMessage.c_str()), getLine(), getColumn()) );
+ }
+
+ virtual void reportWarning( const ANTLR_USE_NAMESPACE(std)string& warnMessage ){
+ m_driver->addProblem( m_driver->currentFileName(), Problem( QString::fromLocal8Bit(warnMessage.c_str()), getLine(), getColumn()) );
+ }
+}
+
+// OPERATORS
+QUESTION : '?' ;
+LPAREN : '(' ;
+RPAREN : ')' ;
+LBRACK : '[' ;
+RBRACK : ']' ;
+LCURLY : '{' ;
+RCURLY : '}' ;
+COLON : ':' ;
+COMMA : ',' ;
+//DOT : '.' ;
+ASSIGN : '=' ;
+EQUAL : "==" ;
+LNOT : '!' ;
+BNOT : '~' ;
+NOT_EQUAL : "!=" ;
+DIV : '/' ;
+DIV_ASSIGN : "/=" ;
+PLUS : '+' ;
+PLUS_ASSIGN : "+=" ;
+INC : "++" ;
+MINUS : '-' ;
+MINUS_ASSIGN : "-=" ;
+DEC : "--" ;
+STAR : '*' ;
+STAR_ASSIGN : "*=" ;
+MOD : '%' ;
+MOD_ASSIGN : "%=" ;
+SR : ">>" ;
+SR_ASSIGN : ">>=" ;
+BSR : ">>>" ;
+BSR_ASSIGN : ">>>=" ;
+GE : ">=" ;
+GT : ">" ;
+SL : "<<" ;
+SL_ASSIGN : "<<=" ;
+LE : "<=" ;
+LT_ : '<' ;
+BXOR : '^' ;
+BXOR_ASSIGN : "^=" ;
+BOR : '|' ;
+BOR_ASSIGN : "|=" ;
+LOR : "||" ;
+BAND : '&' ;
+BAND_ASSIGN : "&=" ;
+LAND : "&&" ;
+SEMI : ';' ;
+
+// Whitespace -- ignored
+WS : ( ' '
+ | '\t'
+ | '\f'
+ // handle newlines
+ | ( options {generateAmbigWarnings=false;}
+ : "\r\n" // Evil DOS
+ | '\r' // Macintosh
+ | '\n' // Unix (the right way)
+ )
+ { newline(); }
+ )+
+ { $setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP); }
+ ;
+
+// Single-line comments
+SL_COMMENT
+ : "//"
+ (~('\n'|'\r'))* ('\n'|'\r'('\n')?)
+ {
+ $setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP);
+ newline();
+ }
+ ;
+
+// multiple-line comments
+ML_COMMENT
+ : "/*"
+ ( /* '\r' '\n' can be matched in one alternative or by matching
+ '\r' in one iteration and '\n' in another. I am trying to
+ handle any flavor of newline that comes in, but the language
+ that allows both "\r\n" and "\r" and "\n" to all be valid
+ newline is ambiguous. Consequently, the resulting grammar
+ must be ambiguous. I'm shutting this warning off.
+ */
+ options {
+ generateAmbigWarnings=false;
+ }
+ :
+ { LA(2)!='/' }? '*'
+ | '\r' '\n' {newline();}
+ | '\r' {newline();}
+ | '\n' {newline();}
+ | ~('*'|'\n'|'\r')
+ )*
+ "*/"
+ {$setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP);}
+ ;
+
+// character literals
+CHAR_LITERAL
+ : '\'' ( ESC | ~'\'' ) '\''
+ ;
+
+// string literals
+STRING_LITERAL
+ : '"' (ESC|~('"'|'\\'))* '"'
+ ;
+
+// escape sequence -- note that this is protected; it can only be called
+// from another lexer rule -- it will not ever directly return a token to
+// the parser
+// There are various ambiguities hushed in this rule. The optional
+// '0'...'9' digit matches should be matched here rather than letting
+// them go back to STRING_LITERAL to be matched. ANTLR does the
+// right thing by matching immediately; hence, it's ok to shut off
+// the FOLLOW ambig warnings.
+protected
+ESC
+ : '\\'
+ ( 'n'
+ | 'r'
+ | 't'
+ | 'b'
+ | 'f'
+ | '"'
+ | '\''
+ | '\\'
+ | ('u')+ HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
+ | '0'..'3'
+ (
+ options {
+ warnWhenFollowAmbig = false;
+ }
+ : '0'..'7'
+ (
+ options {
+ warnWhenFollowAmbig = false;
+ }
+ : '0'..'7'
+ )?
+ )?
+ | '4'..'7'
+ (
+ options {
+ warnWhenFollowAmbig = false;
+ }
+ : '0'..'7'
+ )?
+ )
+ ;
+
+// hexadecimal digit (again, note it's protected!)
+protected
+HEX_DIGIT
+ : ('0'..'9'|'A'..'F'|'a'..'f')
+ ;
+
+// a dummy rule to force vocabulary to be all characters (except special
+// ones that ANTLR uses internally (0 to 2)
+protected
+VOCAB
+ : '\3'..'\377'
+ ;
+
+// an identifier. Note that testLiterals is set to true! This means
+// that after we match the rule, we look in the literals table to see
+// if it's a literal or really an identifer
+IDENT
+ options {testLiterals=true;}
+ : ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'$')*
+ ;
+
+// a numeric literal
+NUM_INT
+ {
+ bool isDecimal = false;
+ ANTLR_USE_NAMESPACE(antlr)RefToken t = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ }
+ : '.' {_ttype = DOT;}
+ ( ('0'..'9')+ (EXPONENT)? (f1:FLOAT_SUFFIX {t=f1;})?
+ {
+ if ( t &&
+ (t->getText().find('f') != ANTLR_USE_NAMESPACE(std)string::npos ||
+ t->getText().find('F') != ANTLR_USE_NAMESPACE(std)string::npos ) ) {
+ _ttype = NUM_FLOAT;
+ }
+ else {
+ _ttype = NUM_DOUBLE; // assume double
+ }
+ }
+ )?
+
+ | ( '0' {isDecimal = true;} // special case for just '0'
+ ( ('x'|'X')
+ ( // hex
+ // the 'e'|'E' and float suffix stuff look
+ // like hex digits, hence the (...)+ doesn't
+ // know when to stop: ambig. ANTLR resolves
+ // it correctly by matching immediately. It
+ // is therefor ok to hush warning.
+ options {
+ warnWhenFollowAmbig=false;
+ }
+ : HEX_DIGIT
+ )+
+ | ('0'..'7')+ // octal
+ )?
+ | ('1'..'9') ('0'..'9')* {isDecimal=true;} // non-zero decimal
+ )
+ ( ('l'|'L') { _ttype = NUM_LONG; }
+
+ // only check to see if it's a float if looks like decimal so far
+ | {isDecimal}?
+ ( '.' ('0'..'9')* (EXPONENT)? (f2:FLOAT_SUFFIX {t=f2;})?
+ | EXPONENT (f3:FLOAT_SUFFIX {t=f3;})?
+ | f4:FLOAT_SUFFIX {t=f4;}
+ )
+ {
+ if ( t &&
+ (t->getText().find('f') != ANTLR_USE_NAMESPACE(std)string::npos ||
+ t->getText().find('F') != ANTLR_USE_NAMESPACE(std)string::npos ) ) {
+ _ttype = NUM_FLOAT;
+ }
+ else {
+ _ttype = NUM_DOUBLE; // assume double
+ }
+ }
+ )?
+ ;
+
+// a couple protected methods to assist in matching floating point numbers
+protected
+EXPONENT
+ : ('e'|'E') ('+'|'-')? ('0'..'9')+
+ ;
+
+protected
+FLOAT_SUFFIX
+ : 'f'|'F'|'d'|'D'
+ ;
+
diff --git a/languages/java/java.store.g b/languages/java/java.store.g
new file mode 100644
index 00000000..b69b7323
--- /dev/null
+++ b/languages/java/java.store.g
@@ -0,0 +1,521 @@
+// KDevelop support by Roberto Raggi (roberto@kdevelop.org)
+
+header "pre_include_hpp" {
+ #include <codemodel.h>
+ #include "JavaAST.hpp"
+
+ #include <qstring.h>
+ #include <qstringlist.h>
+ #include <qvaluestack.h>
+ #include <qfileinfo.h>
+}
+
+header "post_include_hpp" {
+ #include <codemodel.h>
+
+ #include <kdebug.h>
+}
+
+options {
+ language="Cpp";
+}
+
+/** Java 1.2 AST Recognizer Grammar
+ *
+ * Author:
+ * Terence Parr parrt@magelang.com
+ *
+ * Version tracking now done with following ID:
+ *
+ * $Id$
+ *
+ * This grammar is in the PUBLIC DOMAIN
+ *
+ * BUGS
+ */
+class JavaStoreWalker extends TreeParser;
+
+options {
+ importVocab=Java;
+ defaultErrorHandler = true;
+ ASTLabelType = "RefJavaAST";
+}
+{
+private:
+ QStringList m_currentScope;
+ CodeModel* m_model;
+ FileDom m_file;
+ QValueStack<ClassDom> m_currentClass;
+ int m_currentAccess;
+ int m_anon;
+ ANTLR_USE_NAMESPACE(antlr)JavaASTFactory ast_factory;
+
+public:
+ void setCodeModel( CodeModel* model )
+ {
+ m_model = model;
+ }
+
+ void setFile( FileDom file )
+ {
+ m_file = file;
+ }
+
+ void init()
+ {
+ m_currentScope.clear();
+ m_currentAccess = CodeModelItem::Public;
+ m_anon = 0;
+
+ initializeASTFactory (ast_factory);
+ setASTFactory (&ast_factory);
+ }
+}
+
+compilationUnit { QString package; QString imp; QStringList imports; }
+ : { init(); }
+ (package=packageDefinition)?
+ (imp=importDefinition { imports << imp; } )*
+ (typeDefinition)*
+ ;
+
+packageDefinition returns [ QString id ]
+ : #( PACKAGE_DEF id=identifier )
+ ;
+
+importDefinition returns [ QString id ]
+ : #( IMPORT id=identifierStar )
+ ;
+
+typeDefinition { QStringList bases; QString className; ClassDom klass; QStringList m;}
+ : #(CLASS_DEF m=modifiers IDENT
+ {
+ klass = m_model->create<ClassModel>();
+ QString name = QString::fromUtf8( #IDENT->getText().c_str(), #IDENT->getText().length() );
+ QStringList path = QStringList::split( ".", name );
+ className = path.back();
+
+ klass->setName( path.back() );
+ klass->setScope( m_currentScope );
+ klass->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() );
+ /// @todo klass->setEndPositon()
+
+ klass->setFileName( m_file->name() );
+ if( m_currentClass.top() )
+ m_currentClass.top()->addClass( klass );
+ else
+ m_file->addClass( klass );
+ }
+ bases=extendsClause
+ {
+ for( QStringList::Iterator it = bases.begin(); it != bases.end(); ++it )
+ klass->addBaseClass( *it );
+ }
+ implementsClause
+ {
+ m_currentClass.push( klass );
+ m_currentScope.push_back( className );
+ }
+ objBlock[klass]
+ {
+ m_currentClass.pop();
+ m_currentScope.pop_back();
+ }
+ )
+ | #(INTERFACE_DEF m=modifiers IDENT
+ {
+ klass = m_model->create<ClassModel>();
+ QString name = QString::fromUtf8( #IDENT->getText().c_str(), #IDENT->getText().length() );
+ QStringList path = QStringList::split( ".", name );
+ className = path.back();
+
+ klass->setName( path.back() );
+ klass->setScope( m_currentScope );
+ klass->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() );
+ /// @todo klass->setEndPositon()
+
+ klass->setFileName( m_file->name() );
+
+ if( m_currentClass.top() )
+ m_currentClass.top()->addClass( klass );
+ else
+ m_file->addClass( klass );
+ }
+ bases=extendsClause
+ {
+ m_currentClass.push( klass );
+ m_currentScope.push_back( className );
+ }
+ interfaceBlock[klass]
+ {
+ m_currentClass.pop();
+ m_currentScope.pop_back();
+ }
+ )
+ ;
+
+typeSpec returns [ QString tp ]
+ : #(TYPE tp=typeSpecArray)
+ ;
+
+typeSpecArray returns [ QString tp ]
+ : #( ARRAY_DECLARATOR tp=typeSpecArray ) { tp += "[]"; }
+ | tp=type
+ ;
+
+type returns [ QString tp ]
+ : tp=identifier
+ | b:builtInType { tp = #b->getText().c_str(); }
+ ;
+
+builtInType
+ : "void"
+ | "boolean"
+ | "byte"
+ | "char"
+ | "short"
+ | "int"
+ | "float"
+ | "long"
+ | "double"
+ ;
+
+modifiers returns [ QStringList l ]
+ : #( MODIFIERS (m:modifier { l << #m->getText().c_str(); } )* )
+ ;
+
+modifier
+ : "private"
+ | "public"
+ | "protected"
+ | "static"
+ | "transient"
+ | "final"
+ | "abstract"
+ | "native"
+ | "threadsafe"
+ | "synchronized"
+ | "const"
+ | "volatile"
+ ;
+
+extendsClause returns [ QStringList l ] { QString id; }
+ : #(EXTENDS_CLAUSE (id=identifier { l << id; } )* )
+ ;
+
+implementsClause returns [ QStringList l ] { QString id; }
+ : #(IMPLEMENTS_CLAUSE (id=identifier { l << id; } )* )
+ ;
+
+interfaceBlock [ ClassDom klass ] { FunctionDom meth; VariableDom attr; }
+ : #( OBJBLOCK
+ ( meth=methodDecl {
+ }
+
+ | attr=variableDef {
+ }
+ )*
+ )
+ ;
+
+objBlock [ ClassDom klass ] { FunctionDom meth; VariableDom attr; }
+ : #( OBJBLOCK
+ ( meth=ctorDef {
+ klass->addFunction( meth );
+ }
+ | meth=methodDef {
+ klass->addFunction( meth );
+ }
+ | attr=variableDef {
+ klass->addVariable( attr );
+ }
+ | typeDefinition
+ | #(STATIC_INIT slist)
+ | #(INSTANCE_INIT slist)
+ )*
+ )
+ ;
+
+ctorDef returns [ FunctionDom meth ] {
+ QStringList m;
+ meth = m_model->create<FunctionModel>();
+ meth->setFileName( m_file->name() );
+ }
+ : #(CTOR_DEF
+ m=modifiers methodHead[meth] slist
+ )
+ {
+ if( m.contains("public") )
+ meth->setAccess( CodeModelItem::Public );
+ else if( m.contains("protected") )
+ meth->setAccess( CodeModelItem::Protected );
+ else
+ meth->setAccess( CodeModelItem::Private );
+ }
+ ;
+
+methodDecl returns [ FunctionDom meth ] {
+ QStringList m;
+ QString tp;
+ meth = m_model->create<FunctionModel>();
+ meth->setFileName( m_file->name() );
+ }
+ : #(METHOD_DEF m=modifiers tp=typeSpec methodHead[meth])
+ {
+ meth->setResultType( tp );
+ if( m.contains("public") )
+ meth->setAccess( CodeModelItem::Public );
+ else if( m.contains("protected") )
+ meth->setAccess( CodeModelItem::Protected );
+ else
+ meth->setAccess( CodeModelItem::Private );
+ }
+ ;
+
+methodDef returns [ FunctionDom meth ] {
+ QStringList m;
+ QString tp;
+ meth = m_model->create<FunctionModel>();
+ meth->setFileName( m_file->name() );
+ }
+ : #(METHOD_DEF m=modifiers tp=typeSpec methodHead[meth] (slist)?)
+ {
+ meth->setResultType( tp );
+ if( m.contains("public") )
+ meth->setAccess( CodeModelItem::Public );
+ else if( m.contains("protected") )
+ meth->setAccess( CodeModelItem::Protected );
+ else
+ meth->setAccess( CodeModelItem::Private );
+ }
+ ;
+
+variableDef returns [ VariableDom attr ] {
+ QStringList m;
+ QString tp;
+ attr = m_model->create<VariableModel>();
+ attr->setFileName( m_file->name() );
+ }
+ : #(VARIABLE_DEF m=modifiers tp=typeSpec variableDeclarator[attr] varInitializer)
+ {
+ attr->setType( tp );
+ if( m.contains("public") )
+ attr->setAccess( CodeModelItem::Public );
+ else if( m.contains("protected") )
+ attr->setAccess( CodeModelItem::Protected );
+ else
+ attr->setAccess( CodeModelItem::Private );
+
+ attr->setStatic( m.contains("static") );
+ }
+ ;
+
+parameterDef returns [ ArgumentDom arg ] {
+ QString tp;
+ arg = m_model->create<ArgumentModel>();
+ }
+ : #(PARAMETER_DEF modifiers tp=typeSpec IDENT )
+ {
+ arg->setType( tp );
+ arg->setName( #IDENT->getText().c_str() );
+ }
+ ;
+
+objectinitializer
+ : #(INSTANCE_INIT slist)
+ ;
+
+variableDeclarator [ VariableDom attr ]
+ : IDENT {
+ attr->setName( #IDENT->getText().c_str() );
+ attr->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() );
+ }
+ | LBRACK variableDeclarator[attr]
+ ;
+
+varInitializer
+ : #(ASSIGN initializer)
+ |
+ ;
+
+initializer
+ : expression
+ | arrayInitializer
+ ;
+
+arrayInitializer
+ : #(ARRAY_INIT (initializer)*)
+ ;
+
+methodHead [ FunctionDom meth ] { ArgumentDom arg; }
+ : IDENT #( PARAMETERS (arg=parameterDef { meth->addArgument(arg); } )* ) (throwsClause)?
+ {
+ meth->setName( #IDENT->getText().c_str() );
+ meth->setScope( m_currentScope );
+ meth->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() );
+ }
+ ;
+
+throwsClause
+ : #( "throws" (identifier)* )
+ ;
+
+identifier returns [ QString id ]
+ : IDENT {
+ id = #IDENT->getText().c_str();
+ }
+ | #( DOT id=identifier IDENT ) {
+ id += QString(".") + #IDENT->getText().c_str();
+ }
+ ;
+
+identifierStar returns [ QString id ]
+ : IDENT {
+ id = #IDENT->getText().c_str();
+ }
+ | #( DOT id=identifier (STAR { id += QString(".") + #STAR->getText().c_str(); } |
+ IDENT { id += QString(".") + #IDENT->getText().c_str(); }) )
+ ;
+
+slist
+ : #( SLIST (stat)* )
+ ;
+
+stat: typeDefinition
+ | variableDef
+ | expression
+ | #(LABELED_STAT IDENT stat)
+ | #("if" expression stat (stat)? )
+ | #( "for"
+ #(FOR_INIT (variableDef | elist)?)
+ #(FOR_CONDITION (expression)?)
+ #(FOR_ITERATOR (elist)?)
+ stat
+ )
+ | #("while" expression stat)
+ | #("do" stat expression)
+ | #("break" (IDENT)? )
+ | #("continue" (IDENT)? )
+ | #("return" (expression)? )
+ | #("switch" expression (caseGroup)*)
+ | #("throw" expression)
+ | #("synchronized" expression stat)
+ | tryBlock
+ | slist // nested SLIST
+ | EMPTY_STAT
+ ;
+
+caseGroup
+ : #(CASE_GROUP (#("case" expression) | "default")+ slist)
+ ;
+
+tryBlock
+ : #( "try" slist (handler)* (#("finally" slist))? )
+ ;
+
+handler
+ : #( "catch" parameterDef slist )
+ ;
+
+elist
+ : #( ELIST (expression)* )
+ ;
+
+expression
+ : #(EXPR expr)
+ ;
+
+expr: #(QUESTION expr expr expr) // trinary operator
+ | #(ASSIGN expr expr) // binary operators...
+ | #(PLUS_ASSIGN expr expr)
+ | #(MINUS_ASSIGN expr expr)
+ | #(STAR_ASSIGN expr expr)
+ | #(DIV_ASSIGN expr expr)
+ | #(MOD_ASSIGN expr expr)
+ | #(SR_ASSIGN expr expr)
+ | #(BSR_ASSIGN expr expr)
+ | #(SL_ASSIGN expr expr)
+ | #(BAND_ASSIGN expr expr)
+ | #(BXOR_ASSIGN expr expr)
+ | #(BOR_ASSIGN expr expr)
+ | #(LOR expr expr)
+ | #(LAND expr expr)
+ | #(BOR expr expr)
+ | #(BXOR expr expr)
+ | #(BAND expr expr)
+ | #(NOT_EQUAL expr expr)
+ | #(EQUAL expr expr)
+ | #(LT_ expr expr)
+ | #(GT expr expr)
+ | #(LE expr expr)
+ | #(GE expr expr)
+ | #(SL expr expr)
+ | #(SR expr expr)
+ | #(BSR expr expr)
+ | #(PLUS expr expr)
+ | #(MINUS expr expr)
+ | #(DIV expr expr)
+ | #(MOD expr expr)
+ | #(STAR expr expr)
+ | #(INC expr)
+ | #(DEC expr)
+ | #(POST_INC expr)
+ | #(POST_DEC expr)
+ | #(BNOT expr)
+ | #(LNOT expr)
+ | #("instanceof" expr expr)
+ | #(UNARY_MINUS expr)
+ | #(UNARY_PLUS expr)
+ | primaryExpression
+ ;
+
+primaryExpression
+ : IDENT
+ | #( DOT
+ ( expr
+ ( IDENT
+ | arrayIndex
+ | "this"
+ | "class"
+ | #( "new" IDENT elist )
+ )
+ | #(ARRAY_DECLARATOR type)
+ | builtInType ("class")?
+ )
+ )
+ | arrayIndex
+ | #(METHOD_CALL primaryExpression elist)
+ | #(TYPECAST typeSpec expr)
+ | newExpression
+ | constant
+ | "super"
+ | "true"
+ | "false"
+ | "this"
+ | "null"
+ | typeSpec // type name used with instanceof
+ ;
+
+arrayIndex
+ : #(INDEX_OP primaryExpression expression)
+ ;
+
+constant
+ : NUM_INT
+ | CHAR_LITERAL
+ | STRING_LITERAL
+ | NUM_FLOAT
+ ;
+
+newExpression
+ : #( "new" type
+ ( newArrayDeclarator (arrayInitializer)?
+ | elist
+ )
+ )
+
+ ;
+
+newArrayDeclarator
+ : #( ARRAY_DECLARATOR (newArrayDeclarator)? (expression)? )
+ ;
diff --git a/languages/java/java.tree.g b/languages/java/java.tree.g
new file mode 100644
index 00000000..9fa94a95
--- /dev/null
+++ b/languages/java/java.tree.g
@@ -0,0 +1,331 @@
+options {
+ language="Cpp";
+}
+
+/** Java 1.3 AST Recognizer Grammar
+ *
+ * Author: (see java.g preamble)
+ *
+ * Version tracking now done with following ID:
+ *
+ * $Id$
+ *
+ * This grammar is in the PUBLIC DOMAIN
+ */
+
+class JavaTreeParser extends TreeParser;
+
+options {
+ importVocab = Java;
+}
+
+compilationUnit
+ : (packageDefinition)?
+ (importDefinition)*
+ (typeDefinition)*
+ ;
+
+packageDefinition
+ : #( PACKAGE_DEF identifier )
+ ;
+
+importDefinition
+ : #( IMPORT identifierStar )
+ ;
+
+typeDefinition
+ : #(CLASS_DEF modifiers IDENT extendsClause implementsClause objBlock )
+ | #(INTERFACE_DEF modifiers IDENT extendsClause interfaceBlock )
+ ;
+
+typeSpec
+ : #(TYPE typeSpecArray)
+ ;
+
+typeSpecArray
+ : #( ARRAY_DECLARATOR typeSpecArray )
+ | type
+ ;
+
+type: identifier
+ | builtInType
+ ;
+
+builtInType
+ : "void"
+ | "boolean"
+ | "byte"
+ | "char"
+ | "short"
+ | "int"
+ | "float"
+ | "long"
+ | "double"
+ ;
+
+modifiers
+ : #( MODIFIERS (modifier)* )
+ ;
+
+modifier
+ : "private"
+ | "public"
+ | "protected"
+ | "static"
+ | "transient"
+ | "final"
+ | "abstract"
+ | "native"
+ | "threadsafe"
+ | "synchronized"
+ | "const"
+ | "volatile"
+ | "strictfp"
+ ;
+
+extendsClause
+ : #(EXTENDS_CLAUSE (identifier)* )
+ ;
+
+implementsClause
+ : #(IMPLEMENTS_CLAUSE (identifier)* )
+ ;
+
+interfaceBlock
+ : #( OBJBLOCK
+ ( methodDecl
+ | variableDef
+ )*
+ )
+ ;
+
+objBlock
+ : #( OBJBLOCK
+ ( ctorDef
+ | methodDef
+ | variableDef
+ | typeDefinition
+ | #(STATIC_INIT slist)
+ | #(INSTANCE_INIT slist)
+ )*
+ )
+ ;
+
+ctorDef
+ : #(CTOR_DEF modifiers methodHead (slist)?)
+ ;
+
+methodDecl
+ : #(METHOD_DEF modifiers typeSpec methodHead)
+ ;
+
+methodDef
+ : #(METHOD_DEF modifiers typeSpec methodHead (slist)?)
+ ;
+
+variableDef
+ : #(VARIABLE_DEF modifiers typeSpec variableDeclarator varInitializer)
+ ;
+
+parameterDef
+ : #(PARAMETER_DEF modifiers typeSpec IDENT )
+ ;
+
+objectinitializer
+ : #(INSTANCE_INIT slist)
+ ;
+
+variableDeclarator
+ : IDENT
+ | LBRACK variableDeclarator
+ ;
+
+varInitializer
+ : #(ASSIGN initializer)
+ |
+ ;
+
+initializer
+ : expression
+ | arrayInitializer
+ ;
+
+arrayInitializer
+ : #(ARRAY_INIT (initializer)*)
+ ;
+
+methodHead
+ : IDENT #( PARAMETERS (parameterDef)* ) (throwsClause)?
+ ;
+
+throwsClause
+ : #( "throws" (identifier)* )
+ ;
+
+identifier
+ : IDENT
+ | #( DOT identifier IDENT )
+ ;
+
+identifierStar
+ : IDENT
+ | #( DOT identifier (STAR|IDENT) )
+ ;
+
+slist
+ : #( SLIST (stat)* )
+ ;
+
+stat: typeDefinition
+ | variableDef
+ | expression
+ | #(LABELED_STAT IDENT stat)
+ | #("if" expression stat (stat)? )
+ | #( "for"
+ #(FOR_INIT (variableDef | elist)?)
+ #(FOR_CONDITION (expression)?)
+ #(FOR_ITERATOR (elist)?)
+ stat
+ )
+ | #("while" expression stat)
+ | #("do" stat expression)
+ | #("break" (IDENT)? )
+ | #("continue" (IDENT)? )
+ | #("return" (expression)? )
+ | #("switch" expression (caseGroup)*)
+ | #("throw" expression)
+ | #("synchronized" expression stat)
+ | tryBlock
+ | slist // nested SLIST
+ // uncomment to make assert JDK 1.4 stuff work
+ // | #("assert" expression (expression)?)
+ | EMPTY_STAT
+ ;
+
+caseGroup
+ : #(CASE_GROUP (#("case" expression) | "default")+ slist)
+ ;
+
+tryBlock
+ : #( "try" slist (handler)* (#("finally" slist))? )
+ ;
+
+handler
+ : #( "catch" parameterDef slist )
+ ;
+
+elist
+ : #( ELIST (expression)* )
+ ;
+
+expression
+ : #(EXPR expr)
+ ;
+
+expr: #(QUESTION expr expr expr) // trinary operator
+ | #(ASSIGN expr expr) // binary operators...
+ | #(PLUS_ASSIGN expr expr)
+ | #(MINUS_ASSIGN expr expr)
+ | #(STAR_ASSIGN expr expr)
+ | #(DIV_ASSIGN expr expr)
+ | #(MOD_ASSIGN expr expr)
+ | #(SR_ASSIGN expr expr)
+ | #(BSR_ASSIGN expr expr)
+ | #(SL_ASSIGN expr expr)
+ | #(BAND_ASSIGN expr expr)
+ | #(BXOR_ASSIGN expr expr)
+ | #(BOR_ASSIGN expr expr)
+ | #(LOR expr expr)
+ | #(LAND expr expr)
+ | #(BOR expr expr)
+ | #(BXOR expr expr)
+ | #(BAND expr expr)
+ | #(NOT_EQUAL expr expr)
+ | #(EQUAL expr expr)
+ | #(LT_ expr expr)
+ | #(GT expr expr)
+ | #(LE expr expr)
+ | #(GE expr expr)
+ | #(SL expr expr)
+ | #(SR expr expr)
+ | #(BSR expr expr)
+ | #(PLUS expr expr)
+ | #(MINUS expr expr)
+ | #(DIV expr expr)
+ | #(MOD expr expr)
+ | #(STAR expr expr)
+ | #(INC expr)
+ | #(DEC expr)
+ | #(POST_INC expr)
+ | #(POST_DEC expr)
+ | #(BNOT expr)
+ | #(LNOT expr)
+ | #("instanceof" expr expr)
+ | #(UNARY_MINUS expr)
+ | #(UNARY_PLUS expr)
+ | primaryExpression
+ ;
+
+primaryExpression
+ : IDENT
+ | #( DOT
+ ( expr
+ ( IDENT
+ | arrayIndex
+ | "this"
+ | "class"
+ | #( "new" IDENT elist )
+ | "super"
+ )
+ | #(ARRAY_DECLARATOR typeSpecArray)
+ | builtInType ("class")?
+ )
+ )
+ | arrayIndex
+ | #(METHOD_CALL primaryExpression elist)
+ | ctorCall
+ | #(TYPECAST typeSpec expr)
+ | newExpression
+ | constant
+ | "super"
+ | "true"
+ | "false"
+ | "this"
+ | "null"
+ | typeSpec // type name used with instanceof
+ ;
+
+ctorCall
+ : #( CTOR_CALL elist )
+ | #( SUPER_CTOR_CALL
+ ( elist
+ | primaryExpression elist
+ )
+ )
+ ;
+
+arrayIndex
+ : #(INDEX_OP expr expression)
+ ;
+
+constant
+ : NUM_INT
+ | CHAR_LITERAL
+ | STRING_LITERAL
+ | NUM_FLOAT
+ | NUM_DOUBLE
+ | NUM_LONG
+ ;
+
+newExpression
+ : #( "new" type
+ ( newArrayDeclarator (arrayInitializer)?
+ | elist (objBlock)?
+ )
+ )
+
+ ;
+
+newArrayDeclarator
+ : #( ARRAY_DECLARATOR (newArrayDeclarator)? (expression)? )
+ ;
diff --git a/languages/java/javasupport_events.h b/languages/java/javasupport_events.h
new file mode 100644
index 00000000..c267b8e5
--- /dev/null
+++ b/languages/java/javasupport_events.h
@@ -0,0 +1,60 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __javasupport_events_h
+#define __javasupport_events_h
+
+#include "driver.h"
+#include "kdevdeepcopy.h"
+
+#include <qevent.h>
+#include <qvaluelist.h>
+
+#if QT_VERSION < 0x030100
+#include <kdevmutex.h>
+#else
+#include <qmutex.h>
+#endif
+
+enum
+{
+ Event_FileParsed = QEvent::User + 1000
+};
+
+class FileParsedEvent: public QCustomEvent
+{
+public:
+ FileParsedEvent( const QString& fileName, const QValueList<Problem>& problems )
+ : QCustomEvent(Event_FileParsed), m_fileName( deepCopy(fileName) )
+ {
+ // the members are deep copies
+ QValueListConstIterator<Problem> it = problems.begin();
+ while (it != problems.end()) {
+ Problem p = *it;
+ m_problems.append(Problem(deepCopy(p.text()), p.line(), p.column(), p.level()));
+ ++it;
+ }
+ }
+
+ QString fileName() const { return m_fileName; }
+ QValueList<Problem> problems() const { return m_problems; }
+
+private:
+ QString m_fileName;
+ QValueList<Problem> m_problems;
+
+private:
+ FileParsedEvent( const FileParsedEvent& source );
+ void operator = ( const FileParsedEvent& source );
+};
+
+
+#endif // __javasupport_events_h
diff --git a/languages/java/javasupport_utils.cpp b/languages/java/javasupport_utils.cpp
new file mode 100644
index 00000000..1fa28b81
--- /dev/null
+++ b/languages/java/javasupport_utils.cpp
@@ -0,0 +1,52 @@
+
+#include "javasupport_utils.h"
+#include <codemodel.h>
+
+static void typeNameList( QStringList& path, QStringList & lst, const CodeModel * model );
+static void typeNameList( QStringList& path, QStringList & lst, NamespaceDom ns );
+static void typeNameList( QStringList & path, QStringList & lst, ClassDom klass );
+
+QStringList typeNameList( const CodeModel* model )
+{
+ QStringList lst;
+ QStringList path;
+ typeNameList( path, lst, model );
+ return lst;
+}
+
+static void typeNameList( QStringList& path, QStringList & lst, const CodeModel * model )
+{
+ const FileList fileList = model->fileList();
+ for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it )
+ typeNameList( path, lst, model_cast<NamespaceDom>(*it) );
+}
+
+static void typeNameList( QStringList& path, QStringList & lst, NamespaceDom ns )
+{
+ if( !ns->isFile() )
+ path.push_back( ns->name() );
+
+ const NamespaceList namespaceList = ns->namespaceList();
+ for( NamespaceList::ConstIterator it=namespaceList.begin(); it!=namespaceList.end(); ++it )
+ typeNameList( path, lst, *it );
+
+ const ClassList classList = ns->classList();
+ for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
+ typeNameList( path, lst, *it );
+
+ if( !ns->isFile() )
+ path.pop_back();
+}
+
+static void typeNameList( QStringList & path, QStringList & lst, ClassDom klass )
+{
+ path.push_back( klass->name() );
+
+ lst << path.join( "::" );
+
+ const ClassList classList = klass->classList();
+ for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
+ typeNameList( path, lst, *it );
+ path.pop_back();
+}
+
diff --git a/languages/java/javasupport_utils.h b/languages/java/javasupport_utils.h
new file mode 100644
index 00000000..12d2fec0
--- /dev/null
+++ b/languages/java/javasupport_utils.h
@@ -0,0 +1,21 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __javasupport_utils_h
+#define __javasupport_utils_h
+
+#include <qstringlist.h>
+
+class CodeModel;
+
+QStringList typeNameList( const CodeModel* model );
+
+#endif // __javasupport_utils_h
diff --git a/languages/java/javasupportfactory.cpp b/languages/java/javasupportfactory.cpp
new file mode 100644
index 00000000..a453c84a
--- /dev/null
+++ b/languages/java/javasupportfactory.cpp
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * Copyright (C) 2000-2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include <kinstance.h>
+#include <kstandarddirs.h>
+#include <kdevplugininfo.h>
+#include "javasupportfactory.h"
+
+static const KDevPluginInfo data("kdevjavasupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevjavasupport, JavaSupportFactory )
+
+JavaSupportFactory::JavaSupportFactory()
+ : KDevGenericFactory<JavaSupportPart>( data )
+{
+}
+
+KInstance *JavaSupportFactory::createInstance()
+{
+ KInstance *instance = KDevGenericFactory<JavaSupportPart>::createInstance();
+ KStandardDirs *dirs = instance->dirs();
+ dirs->addResourceType( "newclasstemplates", KStandardDirs::kde_default("data") + "kdevjavasupport/newclass/" );
+ dirs->addResourceType( "pcs", KStandardDirs::kde_default( "data" ) + "kdevjavasupport/pcs/" );
+
+ return instance;
+}
+
+const KDevPluginInfo *JavaSupportFactory::info()
+{
+ return &data;
+}
+
diff --git a/languages/java/javasupportfactory.h b/languages/java/javasupportfactory.h
new file mode 100644
index 00000000..fc82d929
--- /dev/null
+++ b/languages/java/javasupportfactory.h
@@ -0,0 +1,31 @@
+/***************************************************************************
+ * Copyright (C) 2000-2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _JAVASUPPORTFACTORY_H_
+#define _JAVASUPPORTFACTORY_H_
+
+#include <kdevgenericfactory.h>
+#include "javasupportpart.h"
+
+class KDevPluginInfo;
+
+class JavaSupportFactory : public KDevGenericFactory<JavaSupportPart>
+{
+public:
+ JavaSupportFactory();
+
+ static const KDevPluginInfo *info();
+
+protected:
+ virtual KInstance *createInstance();
+};
+
+#endif
diff --git a/languages/java/javasupportpart.cpp b/languages/java/javasupportpart.cpp
new file mode 100644
index 00000000..c8122a47
--- /dev/null
+++ b/languages/java/javasupportpart.cpp
@@ -0,0 +1,908 @@
+/***************************************************************************
+ * Copyright (C) 1999 by Jonas Nordin *
+ * jonas.nordin@syncom.se *
+ * Copyright (C) 2000-2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * Copyright (C) 2002-2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "javasupportpart.h"
+#include "javasupport_events.h"
+#include "problemreporter.h"
+#include "backgroundparser.h"
+#include "KDevJavaSupportIface.h"
+#include "javasupportfactory.h"
+#include "catalog.h"
+#include "kdevdriver.h"
+#include "javasupport_utils.h"
+
+#include "JavaStoreWalker.hpp"
+#include "JavaAST.hpp"
+
+#include <qheader.h>
+#include <qdir.h>
+#include <qdom.h>
+#include <qfileinfo.h>
+#include <qguardedptr.h>
+#include <qpopupmenu.h>
+#include <qprogressdialog.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+#include <qstatusbar.h>
+#include <qprogressbar.h>
+#include <qregexp.h>
+#include <qlabel.h>
+#include <qvbox.h>
+#include <kmessagebox.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdialogbase.h>
+#include <kgenericfactory.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kstatusbar.h>
+#include <kconfig.h>
+#include <kdeversion.h>
+#include <kstandarddirs.h>
+#include <kiconloader.h>
+
+#include <ktexteditor/document.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/selectioninterface.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <ktexteditor/clipboardinterface.h>
+
+#include <ktexteditor/texthintinterface.h>
+
+#include <kdevcore.h>
+#include <kdevproject.h>
+#include <kdevmainwindow.h>
+#include <kdevpartcontroller.h>
+#include <kdevmakefrontend.h>
+#include <kdevcoderepository.h>
+
+#include <domutil.h>
+#include <urlutil.h>
+#include <config.h>
+
+enum { KDEV_DB_VERSION = 7 };
+enum { KDEV_PCS_VERSION = 8 };
+
+class JavaDriver: public KDevDriver
+{
+public:
+ JavaDriver( JavaSupportPart* javaSupport )
+ : KDevDriver( javaSupport )
+ {
+ }
+
+ void fileParsed( const QString& fileName )
+ {
+ //kdDebug(9013) << "-----> file " << fileName << " parsed!" << endl;
+ RefJavaAST ast = takeTranslationUnit( fileName );
+
+ if( javaSupport()->problemReporter() ){
+ javaSupport()->problemReporter()->removeAllProblems( fileName );
+
+ QValueList<Problem> pl = problems( fileName );
+ QValueList<Problem>::ConstIterator it = pl.begin();
+ while( it != pl.end() ){
+ const Problem& p = *it++;
+ javaSupport()->problemReporter()->reportProblem( fileName, p );
+ }
+ }
+
+ if( javaSupport()->codeModel()->hasFile(fileName) ){
+ FileDom file = javaSupport()->codeModel()->fileByName( fileName );
+ javaSupport()->removeWithReferences( fileName );
+ }
+
+ FileDom file = javaSupport()->codeModel()->create<FileModel>();
+ file->setName( fileName );
+ JavaStoreWalker walker;
+ walker.setFile( file );
+ walker.setCodeModel( javaSupport()->codeModel() );
+ walker.compilationUnit( ast );
+ javaSupport()->codeModel()->addFile( file );
+
+ remove( fileName );
+ }
+};
+
+JavaSupportPart::JavaSupportPart(QObject *parent, const char *name, const QStringList &/*args*/)
+ : KDevLanguageSupport(JavaSupportFactory::info(), parent, name ? name : "KDevJavaSupport"),
+ m_activeDocument( 0 ), m_activeView( 0 ), m_activeSelection( 0 ), m_activeEditor( 0 ),
+ m_activeViewCursor( 0 ), m_projectClosed( true ), m_valid( false )
+{
+ setInstance(JavaSupportFactory::instance());
+
+ m_driver = new JavaDriver( this );
+
+ setXMLFile( "kdevjavasupport.rc" );
+
+ m_catalogList.setAutoDelete( true );
+ setupCatalog();
+
+ m_backgroundParser = new BackgroundParser( this, &m_eventConsumed );
+ m_backgroundParser->start();
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+ connect( partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(activePartChanged(KParts::Part*)));
+ connect( partController(), SIGNAL(partRemoved(KParts::Part*)),
+ this, SLOT(partRemoved(KParts::Part*)));
+
+ m_problemReporter = new ProblemReporter( this, 0, "problemReporterWidget" );
+ m_problemReporter->setIcon( SmallIcon("info") );
+ mainWindow( )->embedOutputView( m_problemReporter, i18n("Problems"), i18n("Problem reporter"));
+
+ connect( core(), SIGNAL(configWidget(KDialogBase*)),
+ m_problemReporter, SLOT(configWidget(KDialogBase*)) );
+ connect( core(), SIGNAL(configWidget(KDialogBase*)),
+ this, SLOT(configWidget(KDialogBase*)) );
+
+ KAction *action;
+
+ action = new KAction(i18n("New Class..."), "classnew", 0,
+ this, SLOT(slotNewClass()),
+ actionCollection(), "project_newclass");
+ action->setToolTip( i18n("Generate a new class") );
+ action->setWhatsThis( i18n("<b>New Class</b>Generates a new class.<p>") );
+
+ // daniel
+ connect( core( ), SIGNAL( projectConfigWidget( KDialogBase* ) ), this,
+ SLOT( projectConfigWidget( KDialogBase* ) ) );
+
+ new KDevJavaSupportIface( this );
+ //(void) dcopClient();
+}
+
+
+JavaSupportPart::~JavaSupportPart()
+{
+ delete( m_driver );
+ m_driver = 0;
+
+ if( m_backgroundParser ){
+ m_backgroundParser->close();
+ m_backgroundParser->wait();
+ delete m_backgroundParser;
+ m_backgroundParser = 0;
+ }
+
+ codeRepository()->setMainCatalog( 0 );
+
+ QPtrListIterator<Catalog> it( m_catalogList );
+ while( Catalog* catalog = it.current() ){
+ ++it;
+ codeRepository()->unregisterCatalog( catalog );
+ }
+
+ mainWindow( )->removeView( m_problemReporter );
+
+ delete m_problemReporter;
+ m_problemReporter = 0;
+}
+
+void JavaSupportPart::customEvent( QCustomEvent* ev )
+{
+ //kdDebug(9013) << "JavaSupportPart::customEvent()" << endl;
+
+ if( ev->type() == int(Event_FileParsed) ){
+ FileParsedEvent* event = (FileParsedEvent*) ev;
+ QString fileName = event->fileName();
+
+ if( m_problemReporter ){
+ m_problemReporter->removeAllProblems( fileName );
+
+ bool hasErrors = false;
+ QValueList<Problem> problems = event->problems();
+ QValueList<Problem>::ConstIterator it = problems.begin();
+ while( it != problems.end() ){
+ const Problem& p = *it++;
+ if( p.level() == Problem::Level_Error )
+ hasErrors = true;
+
+ m_problemReporter->reportProblem( fileName, p );
+ }
+
+ m_backgroundParser->lock();
+ if( RefJavaAST ast = m_backgroundParser->translationUnit(fileName) ){
+
+ if( !hasErrors ){
+ if( codeModel()->hasFile(fileName) ){
+ FileDom file = codeModel()->fileByName( fileName );
+ removeWithReferences( fileName );
+ }
+
+ FileDom file = codeModel()->create<FileModel>();
+ file->setName( fileName );
+ JavaStoreWalker walker;
+ walker.setFile( file );
+ walker.setCodeModel( codeModel() );
+
+ walker.compilationUnit( ast );
+ codeModel()->addFile( file );
+
+ emit addedSourceInfo( fileName );
+ }
+ }
+ m_backgroundParser->unlock();
+ }
+ emit fileParsed( fileName );
+ }
+}
+
+void JavaSupportPart::projectConfigWidget( KDialogBase* /*dlg*/ )
+{
+}
+
+void JavaSupportPart::configWidget(KDialogBase */*dlg*/)
+{
+}
+
+void JavaSupportPart::activePartChanged(KParts::Part *part)
+{
+ kdDebug(9032) << "JavaSupportPart::activePartChanged()" << endl;
+
+ bool enabled = false;
+
+ m_activeDocument = dynamic_cast<KTextEditor::Document*>( part );
+ m_activeView = part ? dynamic_cast<KTextEditor::View*>( part->widget() ) : 0;
+ m_activeEditor = dynamic_cast<KTextEditor::EditInterface*>( part );
+ m_activeSelection = dynamic_cast<KTextEditor::SelectionInterface*>( part );
+ m_activeViewCursor = part ? dynamic_cast<KTextEditor::ViewCursorInterface*>( m_activeView ) : 0;
+
+ m_activeFileName = QString::null;
+
+ if (m_activeDocument) {
+ m_activeFileName = URLUtil::canonicalPath( m_activeDocument->url().path() );
+ QFileInfo fi( m_activeFileName );
+ QString ext = fi.extension();
+ if (fileExtensions().contains(ext))
+ enabled = true;
+ }
+
+ if( !part )
+ return;
+
+ if( !m_activeView )
+ return;
+
+#if 0
+ KTextEditor::TextHintInterface* textHintIface = dynamic_cast<KTextEditor::TextHintInterface*>( m_activeView );
+ if( !textHintIface )
+ return;
+
+ connect( view, SIGNAL(needTextHint(int,int,QString&)),
+ this, SLOT(slotNeedTextHint(int,int,QString&)) );
+
+ textHintIface->enableTextHints( 1000 );
+#endif
+}
+
+
+void JavaSupportPart::projectOpened( )
+{
+ kdDebug( 9013 ) << "projectOpened( )" << endl;
+
+ m_projectDirectory = URLUtil::canonicalPath( project()->projectDirectory() );
+
+ connect( project( ), SIGNAL( addedFilesToProject( const QStringList & ) ),
+ this, SLOT( addedFilesToProject( const QStringList & ) ) );
+ connect( project( ), SIGNAL( removedFilesFromProject( const QStringList &) ),
+ this, SLOT( removedFilesFromProject( const QStringList & ) ) );
+ connect( project( ), SIGNAL( changedFilesInProject( const QStringList & ) ),
+ this, SLOT( changedFilesInProject( const QStringList & ) ) );
+ connect( project(), SIGNAL(projectCompiled()),
+ this, SLOT(slotProjectCompiled()) );
+
+ m_timestamp.clear();
+
+ m_projectClosed = false;
+
+ QTimer::singleShot( 500, this, SLOT( initialParse( ) ) );
+}
+
+
+void JavaSupportPart::projectClosed( )
+{
+ kdDebug( 9013 ) << "projectClosed( )" << endl;
+
+ saveProjectSourceInfo();
+
+ if( m_backgroundParser )
+ m_backgroundParser->removeAllFiles();
+
+ m_projectClosed = true;
+}
+
+void JavaSupportPart::contextMenu(QPopupMenu */*popup*/, const Context *context)
+{
+ m_activeClass = 0;
+ m_activeFunction = 0;
+ m_activeVariable = 0;
+
+ if( context->hasType(Context::EditorContext) ){
+ // nothing!
+ } else if( context->hasType(Context::CodeModelItemContext) ){
+ const CodeModelItemContext* mcontext = static_cast<const CodeModelItemContext*>( context );
+
+ if( mcontext->item()->isClass() ){
+ m_activeClass = (ClassModel*) mcontext->item();
+ } else if( mcontext->item()->isFunction() ){
+ m_activeFunction = (FunctionModel*) mcontext->item();
+ }
+ }
+}
+
+void JavaSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ QStringList files = fileList;
+
+ for ( QStringList::ConstIterator it = files.begin(); it != files.end(); ++it )
+ {
+ QString path = URLUtil::canonicalPath( m_projectDirectory + "/" + (*it) );
+
+ maybeParse( path );
+ emit addedSourceInfo( path );
+ }
+}
+
+void JavaSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ for ( QStringList::ConstIterator it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString path = URLUtil::canonicalPath( m_projectDirectory + "/" + *it );
+
+ removeWithReferences( path );
+ m_backgroundParser->removeFile( path );
+ }
+}
+
+void JavaSupportPart::changedFilesInProject( const QStringList & fileList )
+{
+ QStringList files = fileList;
+
+ for ( QStringList::ConstIterator it = files.begin(); it != files.end(); ++it )
+ {
+ QString path = URLUtil::canonicalPath( m_projectDirectory + "/" + *it );
+
+ maybeParse( path );
+ emit addedSourceInfo( path );
+ }
+}
+
+void JavaSupportPart::savedFile(const KURL &fileName)
+{
+ Q_UNUSED( fileName.path() );
+
+#if 0 // not needed anymore
+ kdDebug(9013) << "savedFile(): " << fileName.mid ( m_projectDirectory.length() + 1 ) << endl;
+
+ QStringList projectFileList = project()->allFiles();
+ if (projectFileList.contains(fileName.mid ( m_projectDirectory.length() + 1 ))) {
+ maybeParse( fileName );
+ emit addedSourceInfo( fileName );
+ }
+#endif
+}
+
+QString JavaSupportPart::findSourceFile()
+{
+ QFileInfo fi( m_activeFileName );
+ QString path = fi.filePath();
+ QString ext = fi.extension();
+ QString base = path.left( path.length() - ext.length() );
+ QStringList candidates;
+
+ if (ext == "h" || ext == "H" || ext == "hh" || ext == "hxx" || ext == "hpp" || ext == "tlh") {
+ candidates << (base + "c");
+ candidates << (base + "cc");
+ candidates << (base + "java");
+ candidates << (base + "java");
+ candidates << (base + "cxx");
+ candidates << (base + "C");
+ candidates << (base + "m");
+ candidates << (base + "mm");
+ candidates << (base + "M");
+ candidates << (base + "inl");
+ }
+
+ QStringList::ConstIterator it;
+ for (it = candidates.begin(); it != candidates.end(); ++it) {
+ kdDebug(9013) << "Trying " << (*it) << endl;
+ if (QFileInfo(*it).exists()) {
+ return *it;
+ }
+ }
+
+ return m_activeFileName;
+}
+
+KDevLanguageSupport::Features JavaSupportPart::features()
+{
+ return Features( Classes | Functions | Variables );
+}
+
+QString JavaSupportPart::formatClassName(const QString &name)
+{
+ return name;
+}
+
+QString JavaSupportPart::unformatClassName(const QString &name)
+{
+ return name;
+}
+
+QStringList JavaSupportPart::fileExtensions() const
+{
+ return QStringList::split(",", "java");
+}
+
+void JavaSupportPart::slotNewClass()
+{
+}
+
+void JavaSupportPart::addMethod( ClassDom /*klass*/ )
+{
+}
+
+void JavaSupportPart::addAttribute( ClassDom /*klass*/ )
+{
+}
+
+void JavaSupportPart::initialParse( )
+{
+ // For debugging
+ if( !project( ) ){
+ // messagebox ?
+ kdDebug( 9013 ) << "No project" << endl;
+ return;
+ }
+
+ parseProject( );
+ emit updatedSourceInfo();
+ m_valid = true;
+ return;
+}
+
+#if QT_VERSION < 0x030100
+// Taken from qt-3.2/tools/qdatetime.java/QDateTime::toTime_t() and modified for normal function
+uint toTime_t(QDateTime t)
+{
+ tm brokenDown;
+ brokenDown.tm_sec = t.time().second();
+ brokenDown.tm_min = t.time().minute();
+ brokenDown.tm_hour = t.time().hour();
+ brokenDown.tm_mday = t.date().day();
+ brokenDown.tm_mon = t.date().month() - 1;
+ brokenDown.tm_year = t.date().year() - 1900;
+ brokenDown.tm_isdst = -1;
+ int secsSince1Jan1970UTC = (int) mktime( &brokenDown );
+ if ( secsSince1Jan1970UTC < -1 )
+ secsSince1Jan1970UTC = -1;
+ return (uint) secsSince1Jan1970UTC;
+}
+#endif
+
+bool
+JavaSupportPart::parseProject( )
+{
+ //QLabel* label = new QLabel( "", mainWindow( )->statusBar( ) );
+ //label->setMinimumWidth( 600 );
+ //mainWindow( )->statusBar( )->addWidget( label );
+ //label->show( );
+
+ mainWindow()->statusBar()->message( i18n("Updating...") );
+
+ kapp->processEvents( );
+ kapp->setOverrideCursor( waitCursor );
+
+ QStringList files = modifiedFileList();
+
+ QProgressBar* bar = new QProgressBar( files.count( ), mainWindow( )->statusBar( ) );
+ bar->setMinimumWidth( 120 );
+ bar->setCenterIndicator( true );
+ mainWindow( )->statusBar( )->addWidget( bar );
+ bar->show( );
+
+ QDir d( m_projectDirectory );
+
+ QDataStream stream;
+ QMap< QString, QPair<uint, uint> > pcs;
+
+ if( QFileInfo( project()->projectDirectory() + "/" +
+ project()->projectName().lower() + ".kdevelop.pcs" ).exists() )
+ {
+ d.rename(project()->projectName().lower() + ".kdevelop.pcs",
+ project()->projectName() + ".kdevelop.pcs");
+ }
+ QFile f(project()->projectDirectory() + "/" + project()->projectName() + ".kdevelop.pcs");
+ if( f.open(IO_ReadOnly) ){
+ stream.setDevice( &f );
+
+ QString sig;
+ int pcs_version = 0;
+ stream >> sig >> pcs_version;
+ if( sig == "PCS" && pcs_version == KDEV_PCS_VERSION ){
+
+ int numFiles = 0;
+ stream >> numFiles;
+
+ for( int i=0; i<numFiles; ++i ){
+ QString fn;
+ uint ts;
+ uint offset;
+
+ stream >> fn >> ts >> offset;
+ pcs[ fn ] = qMakePair( ts, offset );
+ }
+ }
+ }
+
+ int n = 0;
+ for( QStringList::Iterator it = files.begin( ); it != files.end( ); ++it ) {
+ bar->setProgress( n++ );
+ QFileInfo fileInfo( d, *it );
+
+ if( fileInfo.exists() && fileInfo.isFile() && fileInfo.isReadable() ){
+ QString absFilePath = URLUtil::canonicalPath( fileInfo.absFilePath() );
+ kdDebug(9013) << "parse file: " << absFilePath << endl;
+
+ if( (n%5) == 0 ){
+ kapp->processEvents();
+
+ if( m_projectClosed ){
+ delete( bar );
+ return false;
+ }
+ }
+
+ if( isValidSource(absFilePath) ){
+ QDateTime t = fileInfo.lastModified();
+ if( m_timestamp.contains(absFilePath) && m_timestamp[absFilePath] == t )
+ continue;
+
+#if QT_VERSION >= 0x030100
+ if( pcs.contains(absFilePath) && t.toTime_t() == pcs[absFilePath].first ){
+#else
+ if( pcs.contains(absFilePath) && toTime_t(t) == pcs[absFilePath].first ){
+#endif
+ stream.device()->at( pcs[absFilePath].second );
+ FileDom file = codeModel()->create<FileModel>();
+ file->read( stream );
+ codeModel()->addFile( file );
+ } else {
+ m_driver->parseFile( absFilePath );
+ }
+
+ m_timestamp[ absFilePath ] = t;
+ }
+ }
+
+ if( m_projectClosed ){
+ kdDebug(9013) << "ABORT" << endl;
+ kapp->restoreOverrideCursor( );
+ return false;
+ }
+ }
+
+ kdDebug( 9013 ) << "updating sourceinfo" << endl;
+ emit updatedSourceInfo();
+
+ mainWindow( )->statusBar( )->removeWidget( bar );
+ delete bar;
+ //mainWindow( )->statusBar( )->removeWidget( label );
+ //delete label;
+
+ kapp->restoreOverrideCursor( );
+ mainWindow( )->statusBar( )->message( i18n( "Done" ), 2000 );
+
+ return true;
+}
+
+void JavaSupportPart::maybeParse( const QString& fileName )
+{
+ if( !isValidSource(fileName) )
+ return;
+
+ QFileInfo fileInfo( fileName );
+ QString path = URLUtil::canonicalPath( fileName );
+ QDateTime t = fileInfo.lastModified();
+
+ if( !fileInfo.exists() ){
+ removeWithReferences( path );
+ return;
+ }
+
+ QMap<QString, QDateTime>::Iterator it = m_timestamp.find( path );
+ if( it != m_timestamp.end() && *it == t ){
+ return;
+ }
+
+ m_timestamp[ path ] = t;
+ m_driver->parseFile( path );
+}
+
+void JavaSupportPart::slotNeedTextHint( int /*line*/, int /*column*/, QString& /*textHint*/ )
+{
+}
+
+QStringList JavaSupportPart::subclassWidget(const QString& /*formName*/)
+{
+ QStringList newFileNames;
+ return newFileNames;
+}
+
+QStringList JavaSupportPart::updateWidget(const QString& /*formName*/, const QString& /*fileName*/)
+{
+ QStringList dummy;
+ return dummy;
+}
+
+void JavaSupportPart::partRemoved( KParts::Part* part )
+{
+ kdDebug(9032) << "JavaSupportPart::partRemoved()" << endl;
+
+ if( KTextEditor::Document* doc = dynamic_cast<KTextEditor::Document*>( part ) ){
+
+ QString fileName = doc->url().path();
+ if( fileName.isEmpty() )
+ return;
+
+ QString canonicalFileName = URLUtil::canonicalPath( fileName );
+ m_backgroundParser->removeFile( canonicalFileName );
+ m_backgroundParser->addFile( canonicalFileName, true );
+ }
+}
+
+void JavaSupportPart::slotProjectCompiled()
+{
+ kdDebug(9013) << "JavaSupportPart::slotProjectCompiled()" << endl;
+ parseProject();
+}
+
+QStringList JavaSupportPart::modifiedFileList()
+{
+ QStringList lst;
+
+ QStringList fileList = project()->allFiles();
+ QStringList::Iterator it = fileList.begin();
+ while( it != fileList.end() ){
+ QString fileName = *it;
+ ++it;
+
+ QFileInfo fileInfo( m_projectDirectory, fileName );
+
+ if( !fileExtensions().contains(fileInfo.extension()) )
+ continue;
+
+ QDateTime t = fileInfo.lastModified();
+ QString path = URLUtil::canonicalPath( fileInfo.absFilePath() );
+ QMap<QString, QDateTime>::Iterator dictIt = m_timestamp.find( path );
+ if( fileInfo.exists() && dictIt != m_timestamp.end() && *dictIt == t )
+ continue;
+
+ lst << fileName;
+ }
+
+ return lst;
+}
+
+KTextEditor::Document * JavaSupportPart::findDocument( const KURL & url )
+{
+ if( !partController()->parts() )
+ return 0;
+
+ QPtrList<KParts::Part> parts( *partController()->parts() );
+ QPtrListIterator<KParts::Part> it( parts );
+ while( KParts::Part* part = it.current() ){
+ KTextEditor::Document* doc = dynamic_cast<KTextEditor::Document*>( part );
+ if( doc && doc->url() == url )
+ return doc;
+ ++it;
+ }
+
+ return 0;
+}
+
+void JavaSupportPart::setupCatalog( )
+{
+ kdDebug(9013) << "JavaSupportPart::setupCatalog()" << endl;
+
+ QStringList indexList = QStringList() << "kind" << "name" << "scope" << "fileName";
+
+ KStandardDirs *dirs = JavaSupportFactory::instance()->dirs();
+ QStringList pcsList = dirs->findAllResources( "pcs", "*.db", false, true );
+ QStringList pcsIdxList = dirs->findAllResources( "pcs", "*.idx", false, true );
+
+ if( pcsList.size() && pcsVersion() < KDEV_DB_VERSION ){
+ QStringList l = pcsList + pcsIdxList;
+ int rtn = KMessageBox::questionYesNoList( 0, i18n("Persistent class store will be disabled: you have a wrong version of pcs installed.\nRemove old pcs files?"), l, i18n("Java Support"), KStdGuiItem::remove(), i18n("Keep Them") );
+ if( rtn == KMessageBox::Yes ){
+ QStringList::Iterator it = l.begin();
+ while( it != l.end() ){
+ QFile::remove( *it );
+ ++it;
+ }
+ // @todo regenerate the pcs list
+ pcsList.clear();
+ } else {
+ return;
+ }
+ }
+
+ QStringList::Iterator it = pcsList.begin();
+ while( it != pcsList.end() ){
+ Catalog* catalog = new Catalog();
+ catalog->open( *it );
+ ++it;
+
+ for( QStringList::Iterator idxIt=indexList.begin(); idxIt!=indexList.end(); ++idxIt )
+ catalog->addIndex( (*idxIt).utf8() );
+
+ m_catalogList.append( catalog );
+ codeRepository()->registerCatalog( catalog );
+ }
+
+ setPcsVersion( KDEV_DB_VERSION );
+}
+
+KMimeType::List JavaSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime;
+
+ mime = KMimeType::mimeType( "text/x-java" );
+ if( mime )
+ list << mime;
+
+ return list;
+}
+
+int JavaSupportPart::pcsVersion()
+{
+ KConfig* config = JavaSupportFactory::instance()->config();
+ KConfigGroupSaver cgs( config, "PCS" );
+ return config->readNumEntry( "Version", 0 );
+}
+
+void JavaSupportPart::setPcsVersion( int version )
+{
+ KConfig* config = JavaSupportFactory::instance()->config();
+ KConfigGroupSaver cgs( config, "PCS" );
+ config->writeEntry( "Version", version );
+ config->sync();
+}
+
+QString JavaSupportPart::formatTag( const Tag & /*inputTag*/ )
+{
+ return QString::null;
+}
+
+void JavaSupportPart::removeWithReferences( const QString & fileName )
+{
+ kdDebug(9013) << "remove with references: " << fileName << endl;
+ m_timestamp.remove( fileName );
+ if( !codeModel()->hasFile(fileName) )
+ return;
+
+ emit aboutToRemoveSourceInfo( fileName );
+
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+}
+
+bool JavaSupportPart::isValidSource( const QString& fileName ) const
+{
+ QFileInfo fileInfo( fileName );
+ return fileExtensions().contains( fileInfo.extension() ) && !QFile::exists(fileInfo.dirPath(true) + "/.kdev_ignore");
+}
+
+QString JavaSupportPart::formatModelItem( const CodeModelItem *item, bool shortDescription )
+{
+ if (item->isFunction())
+ {
+ const FunctionModel *model = static_cast<const FunctionModel*>(item);
+ QString function;
+ QString args;
+ ArgumentList argumentList = model->argumentList();
+ for (ArgumentList::const_iterator it = argumentList.begin(); it != argumentList.end(); ++it)
+ {
+ args.isEmpty() ? args += "" : args += ", " ;
+ args += formatModelItem((*it).data());
+ }
+ if( !shortDescription )
+ function += model->resultType() + " ";
+
+ function += model->name() + "(" + args + ")" +
+ (model->isAbstract() ? QString(" = 0") : QString("") );
+
+ return function;
+ }
+ else if (item->isVariable())
+ {
+ const VariableModel *model = static_cast<const VariableModel*>(item);
+ if( shortDescription )
+ return model->name();
+ return model->type() + " " + model->name();
+ }
+ else if (item->isArgument())
+ {
+ const ArgumentModel *model = static_cast<const ArgumentModel*>(item);
+ QString arg;
+ if( !shortDescription )
+ arg += model->type() + " ";
+ arg += model->name();
+ if( !shortDescription )
+ arg += model->defaultValue().isEmpty() ? QString("") : QString(" = ") + model->defaultValue();
+ return arg.stripWhiteSpace();
+ }
+ else
+ return KDevLanguageSupport::formatModelItem( item, shortDescription );
+}
+
+void JavaSupportPart::addClass( )
+{
+ slotNewClass();
+}
+
+void JavaSupportPart::saveProjectSourceInfo( )
+{
+ const FileList fileList = codeModel()->fileList();
+
+ if( !project() || fileList.isEmpty() )
+ return;
+
+ QFile f( project()->projectDirectory() + "/" +
+ project()->projectName() + ".kdevelop.pcs" );
+ if( !f.open( IO_WriteOnly ) )
+ return;
+
+ QDataStream stream( &f );
+ QMap<QString, uint> offsets;
+
+ QString pcs( "PCS" );
+ stream << pcs << KDEV_PCS_VERSION;
+
+ stream << int( fileList.size() );
+ for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it ){
+ const FileDom dom = (*it);
+#if QT_VERSION >= 0x030100
+ stream << dom->name() << m_timestamp[ dom->name() ].toTime_t();
+#else
+ stream << dom->name() << toTime_t(m_timestamp[ dom->name() ]);
+#endif
+ offsets.insert( dom->name(), stream.device()->at() );
+ stream << (uint)0; // dummy offset
+ }
+
+ for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it ){
+ const FileDom dom = (*it);
+ int offset = stream.device()->at();
+
+ dom->write( stream );
+
+ int end = stream.device()->at();
+
+ stream.device()->at( offsets[dom->name()] );
+ stream << offset;
+ stream.device()->at( end );
+ }
+}
+
+#include "javasupportpart.moc"
diff --git a/languages/java/javasupportpart.h b/languages/java/javasupportpart.h
new file mode 100644
index 00000000..e6280560
--- /dev/null
+++ b/languages/java/javasupportpart.h
@@ -0,0 +1,165 @@
+/***************************************************************************
+ * Copyright (C) 1999 by Jonas Nordin *
+ * jonas.nordin@syncom.se *
+ * Copyright (C) 2000-2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * Copyright (C) 2002-2003 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _JAVASUPPORTPART_H_
+#define _JAVASUPPORTPART_H_
+
+#include <kdevcore.h>
+#include <kdevlanguagesupport.h>
+
+#include <kdialogbase.h>
+#include <qguardedptr.h>
+#include <qstring.h>
+#include <qwaitcondition.h>
+#include <qdatetime.h>
+
+class Context;
+class ProblemReporter;
+class BackgroundParser;
+class Catalog;
+class QLabel;
+class QProgressBar;
+class QStringList;
+class QListViewItem;
+class KListView;
+class Driver;
+
+namespace KParts { class Part; }
+namespace KTextEditor
+{
+ class Document;
+ class View;
+ class EditInterface;
+ class SelectionInterface;
+ class ViewCursorInterface;
+}
+
+class JavaSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+ JavaSupportPart( QObject *parent, const char *name, const QStringList &args );
+ virtual ~JavaSupportPart();
+
+ bool isValid() const { return m_valid; }
+
+ ProblemReporter* problemReporter() { return m_problemReporter; }
+ BackgroundParser* backgroundParser() { return m_backgroundParser; }
+
+ const QPtrList<Catalog>& catalogList() { return m_catalogList; }
+
+ bool isValidSource( const QString& fileName ) const;
+ QStringList fileExtensions( ) const;
+
+ virtual void customEvent( QCustomEvent* ev );
+
+ virtual QStringList subclassWidget(const QString& formName);
+ virtual QStringList updateWidget(const QString& formName, const QString& fileName);
+
+ KTextEditor::Document* findDocument( const KURL& url );
+
+ static KConfig *config();
+
+ virtual QString formatTag( const Tag& tag );
+ virtual QString formatModelItem( const CodeModelItem *item, bool shortDescription=false );
+ virtual void addClass();
+
+signals:
+ void fileParsed( const QString& fileName );
+
+protected:
+ virtual KDevLanguageSupport::Features features();
+ virtual KMimeType::List mimeTypes();
+ virtual QString formatClassName(const QString &name);
+ virtual QString unformatClassName(const QString &name);
+ virtual void addMethod( ClassDom klass );
+ virtual void addAttribute( ClassDom klass );
+
+private slots:
+ void activePartChanged(KParts::Part *part);
+ void partRemoved( KParts::Part* part );
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void configWidget(KDialogBase *dlg);
+ void projectConfigWidget(KDialogBase *dlg);
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void changedFilesInProject( const QStringList & fileList );
+ void slotProjectCompiled();
+ void setupCatalog();
+
+ void slotNewClass();
+
+ void slotNeedTextHint( int, int, QString& );
+
+ /**
+ * loads, parses and creates both classstores needed
+ */
+ void initialParse( );
+
+ /**
+ * only parses the current project
+ */
+ bool parseProject( );
+
+private:
+
+ /**
+ * checks if a file has to be parsed
+ */
+ void maybeParse( const QString& fileName );
+ void removeWithReferences( const QString& fileName );
+
+ QStringList modifiedFileList();
+ QString findSourceFile();
+ int pcsVersion();
+ void setPcsVersion( int version );
+
+ void saveProjectSourceInfo();
+
+ QString m_contextFileName;
+
+ QGuardedPtr< ProblemReporter > m_problemReporter;
+ BackgroundParser* m_backgroundParser;
+
+ KTextEditor::Document* m_activeDocument;
+ KTextEditor::View* m_activeView;
+ KTextEditor::SelectionInterface* m_activeSelection;
+ KTextEditor::EditInterface* m_activeEditor;
+ KTextEditor::ViewCursorInterface* m_activeViewCursor;
+ QString m_activeFileName;
+
+ QWaitCondition m_eventConsumed;
+ bool m_projectClosed;
+
+ QMap<QString, QDateTime> m_timestamp;
+ bool m_valid;
+
+ QPtrList<Catalog> m_catalogList;
+ Driver* m_driver;
+ QString m_projectDirectory;
+
+ ClassDom m_activeClass;
+ FunctionDom m_activeFunction;
+ VariableDom m_activeVariable;
+
+ friend class KDevJavaSupportIface;
+ friend class JavaDriver;
+};
+
+#endif
diff --git a/languages/java/javatemplates b/languages/java/javatemplates
new file mode 100644
index 00000000..09373351
--- /dev/null
+++ b/languages/java/javatemplates
@@ -0,0 +1,3 @@
+<!DOCTYPE Templates>
+<Templates>
+</Templates>
diff --git a/languages/java/kdevdeepcopy.h b/languages/java/kdevdeepcopy.h
new file mode 100644
index 00000000..8e7d8fbe
--- /dev/null
+++ b/languages/java/kdevdeepcopy.h
@@ -0,0 +1,12 @@
+#ifndef KDEVDEEPCOPY_H
+#define KDEVDEEPCOPY_H
+
+#include <qstring.h>
+
+inline QString deepCopy( const QString& s )
+{
+ QCString str = s.utf8();
+ return QString::fromUtf8( str, str.length() );
+}
+
+#endif
diff --git a/languages/java/kdevdriver.cpp b/languages/java/kdevdriver.cpp
new file mode 100644
index 00000000..444217ff
--- /dev/null
+++ b/languages/java/kdevdriver.cpp
@@ -0,0 +1,44 @@
+
+#include "kdevdriver.h"
+#include "JavaLexer.hpp"
+#include <unistd.h>
+#include <qfileinfo.h>
+
+KDevDriver::KDevDriver( JavaSupportPart* javaSupport )
+ : m_javaSupport( javaSupport )
+{
+}
+
+JavaSupportPart* KDevDriver::javaSupport()
+{
+ return m_javaSupport;
+}
+
+void KDevDriver::setupProject()
+{
+ QMap<QString, bool> map;
+
+ {
+ QStringList fileList = m_javaSupport->project()->allFiles();
+ QStringList::ConstIterator it = fileList.begin();
+ while( it != fileList.end() ){
+ QFileInfo info( *it );
+ ++it;
+
+ map.insert( info.dirPath(true), true );
+ }
+ }
+
+ {
+ QMap<QString, bool>::Iterator it = map.begin();
+ while( it != map.end() ){
+ addIncludePath( it.key() );
+ ++it;
+ }
+ }
+}
+
+void KDevDriver::setupLexer( JavaLexer* lexer )
+{
+ Driver::setupLexer( lexer );
+}
diff --git a/languages/java/kdevdriver.h b/languages/java/kdevdriver.h
new file mode 100644
index 00000000..041129fa
--- /dev/null
+++ b/languages/java/kdevdriver.h
@@ -0,0 +1,30 @@
+
+#ifndef __kdevdriver_h
+#define __kdevdriver_h
+
+#include "javasupportpart.h"
+
+#include <kdevproject.h>
+#include <kdeversion.h>
+
+#include "driver.h"
+
+#include <cstdlib>
+#include <unistd.h>
+
+class KDevDriver: public Driver
+{
+public:
+ KDevDriver( JavaSupportPart* javaSupport );
+ JavaSupportPart* javaSupport();
+ void setupProject();
+
+protected:
+ void setupLexer( JavaLexer* lexer );
+
+private:
+ JavaSupportPart* m_javaSupport;
+};
+
+#endif
+
diff --git a/languages/java/kdevjavasupport.desktop b/languages/java/kdevjavasupport.desktop
new file mode 100644
index 00000000..053ecfce
--- /dev/null
+++ b/languages/java/kdevjavasupport.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Java Support
+Comment[ca]=Suport per a Java
+Comment[da]=Java understøttelse
+Comment[de]=Java-Unterstützung für KDevelop
+Comment[el]=ΥποστήÏιξη Java
+Comment[es]=Soporte para Java
+Comment[et]=Java toetus
+Comment[eu]=Java euskarria
+Comment[fa]=پشتیبانی جاوا
+Comment[fr]=Prise en charge de Java
+Comment[ga]=Tacaíocht Java
+Comment[gl]=Soporte para Java
+Comment[hi]=जावा समरà¥à¤¥à¤¨
+Comment[hu]=Java-támogatás
+Comment[is]=Java stuðningur
+Comment[it]=Supporto per Java
+Comment[ja]=Java サãƒãƒ¼ãƒˆ
+Comment[nds]=Java-Ünnerstütten för KDevelop
+Comment[ne]=जाभा समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor Java
+Comment[pl]=Obsługa Javy
+Comment[pt]=Suporte a Java
+Comment[pt_BR]=Suporte ao Java
+Comment[ru]=Поддержка Ñзыка Java
+Comment[sk]=Java podpora
+Comment[sl]=Podpora javi
+Comment[sr]=Подршка за Java-у
+Comment[sr@Latn]=Podrška za Java-u
+Comment[sv]=Java-stöd
+Comment[ta]=ஜாவா ஆதரவà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони Java
+Comment[tr]=Java DesteÄŸi
+Comment[zh_CN]=Java 支æŒ
+Comment[zh_TW]=Java 支æ´
+Name=KDevJavaSupport
+Name[da]=KDevelop Java-understøttelse
+Name[de]=Unterstützung für Java (KDevelop)
+Name[hi]=के-डेव-जावा-समरà¥à¤¥à¤¨
+Name[nds]=Java-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaJavy
+Name[sk]=KDev Java podpora
+Name[sv]=KDevelop Java-stöd
+Name[ta]=கெடெவ௠ஜாவா ஆதரவà¯
+Name[zh_TW]=KDevelop Java 支æ´
+GenericName=Java Support
+GenericName[ca]=Suport per a Java
+GenericName[da]=Java-understøttelse
+GenericName[de]=Unterstützung für Java
+GenericName[el]=ΥποστήÏιξη Java
+GenericName[es]=Soporte para Java
+GenericName[et]=Java toetus
+GenericName[eu]=Java euskarria
+GenericName[fa]=پشتیبانی جاوا
+GenericName[fr]=Prise en charge de JAVA
+GenericName[ga]=Tacaíocht Java
+GenericName[gl]=Soporte para Java
+GenericName[hi]=जावा समरà¥à¤¥à¤¨
+GenericName[hu]=Java-támogatás
+GenericName[it]=Supporto Java
+GenericName[ja]=Java サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för Java
+GenericName[ne]=जाभा समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor Java
+GenericName[pl]=Obsługa Javy
+GenericName[pt]=Suporte a Java
+GenericName[pt_BR]=Suporte ao Java
+GenericName[ru]=Поддержка Ñзыка Java
+GenericName[sk]=Java podpora
+GenericName[sl]=Podpora javi
+GenericName[sr]=Подршка за Java-у
+GenericName[sr@Latn]=Podrška za Java-u
+GenericName[sv]=Java-stöd
+GenericName[ta]=ஜாவா ஆதரவà¯
+GenericName[tg]=ÐÑ€Ó£ намудани забони Java
+GenericName[tr]=Java DesteÄŸi
+GenericName[zh_CN]=Java 支æŒ
+GenericName[zh_TW]=Java 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevjavasupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Java
+X-KDevelop-Args=Java
diff --git a/languages/java/kdevjavasupport.rc b/languages/java/kdevjavasupport.rc
new file mode 100644
index 00000000..e9b80d0d
--- /dev/null
+++ b/languages/java/kdevjavasupport.rc
@@ -0,0 +1,4 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevJavaSupport" version="4">
+</kpartgui>
+
diff --git a/languages/java/newclass_templates/Makefile.am b/languages/java/newclass_templates/Makefile.am
new file mode 100644
index 00000000..d24c99ef
--- /dev/null
+++ b/languages/java/newclass_templates/Makefile.am
@@ -0,0 +1,4 @@
+javasupportdatadir = ${kde_datadir}/kdevjavasupport
+newclassdir = ${javasupportdatadir}/newclass
+
+newclass_DATA = java_source
diff --git a/languages/java/newclass_templates/java_source b/languages/java/newclass_templates/java_source
new file mode 100644
index 00000000..eeeb1ea0
--- /dev/null
+++ b/languages/java/newclass_templates/java_source
@@ -0,0 +1,9 @@
+#include "$HEADER$"
+
+$NAMESPACEBEG$
+
+$CONSTRUCTORDEFINITIONS$
+
+$DEFINITIONS$
+
+$NAMESPACEEND$
diff --git a/languages/java/problemreporter.cpp b/languages/java/problemreporter.cpp
new file mode 100644
index 00000000..12955662
--- /dev/null
+++ b/languages/java/problemreporter.cpp
@@ -0,0 +1,299 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include "problemreporter.h"
+#include "javasupportpart.h"
+#include "configproblemreporter.h"
+#include "backgroundparser.h"
+
+#include <kdevpartcontroller.h>
+#include <kdevmainwindow.h>
+
+#include <kdeversion.h>
+#include <kparts/part.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/document.h>
+#include <ktexteditor/markinterface.h>
+
+#include <ktexteditor/markinterfaceextension.h>
+#include <ktexteditor/view.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstatusbar.h>
+#include <kurl.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kdialogbase.h>
+
+#include <kconfig.h>
+
+#include <qtimer.h>
+#include <qregexp.h>
+#include <qvbox.h>
+#include <qfileinfo.h>
+#include <qwhatsthis.h>
+#include <qgroupbox.h>
+
+
+class ProblemItem: public KListViewItem
+{
+public:
+ ProblemItem( QListView* parent, const QString& level, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : KListViewItem( parent, level, problem, file, line, column ) {}
+
+ ProblemItem( QListViewItem* parent, const QString& level, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : KListViewItem( parent, level, problem, file, line, column ) {}
+
+ int compare( QListViewItem* item, int column, bool ascending ) const {
+ if( column == 2 || column == 3 ){
+ int a = text( column ).toInt();
+ int b = item->text( column ).toInt();
+ if( a == b )
+ return 0;
+ return( a > b ? 1 : -1 );
+ }
+ return KListViewItem::compare( item, column, ascending );
+ }
+
+};
+
+ProblemReporter::ProblemReporter( JavaSupportPart* part, QWidget* parent, const char* name )
+ : KListView( parent, name ? name : "problemreporter" ),
+ m_javaSupport( part ),
+ m_document( 0 ),
+ m_markIface( 0 )
+{
+ QWhatsThis::add(this, i18n("<b>Problem reporter</b><p>This window shows various \"problems\" in your project. "
+ "It displays TODO entries, FIXME's and errors reported by a language parser. "
+ "To add a TODO or FIXME entry, just type<br>"
+ "<tt>//@todo my todo</tt><br>"
+ "<tt>//TODO: my todo</tt><br>"
+ "<tt>//FIXME fix this</tt>"));
+
+ addColumn( i18n("Level") );
+ addColumn( i18n("File") );
+ addColumn( i18n("Line") );
+ addColumn( i18n("Column") );
+ addColumn( i18n("Problem") );
+ setAllColumnsShowFocus( TRUE );
+
+ m_timer = new QTimer( this );
+
+ connect( part->partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part*)) );
+ connect( part->partController(), SIGNAL(partAdded(KParts::Part*)),
+ this, SLOT(slotPartAdded(KParts::Part*)) );
+ connect( part->partController(), SIGNAL(partRemoved(KParts::Part*)),
+ this, SLOT(slotPartRemoved(KParts::Part*)) );
+
+ connect( m_timer, SIGNAL(timeout()), this, SLOT(reparse()) );
+
+ connect( this, SIGNAL(executed(QListViewItem*)),
+ this, SLOT(slotSelected(QListViewItem*)) );
+
+ configure();
+}
+
+ProblemReporter::~ProblemReporter()
+{
+}
+
+void ProblemReporter::slotActivePartChanged( KParts::Part* part )
+{
+ if( !part )
+ return;
+
+ m_timer->stop();
+
+ if( m_document )
+ disconnect( m_document, 0, this, 0 );
+
+ m_document = dynamic_cast<KTextEditor::Document*>( part );
+ m_markIface = 0;
+
+ if( !m_document )
+ return;
+
+ m_fileName = m_document->url().path();
+
+ if( !m_javaSupport->isValidSource(m_fileName) )
+ return;
+
+ connect( m_document, SIGNAL(textChanged()), this, SLOT(slotTextChanged()) );
+ m_markIface = dynamic_cast<KTextEditor::MarkInterface*>( part );
+
+ if( !m_javaSupport->backgroundParser() )
+ return;
+
+ m_javaSupport->backgroundParser()->lock();
+ bool needReparse = false;
+ if( !m_javaSupport->backgroundParser()->translationUnit(m_fileName) )
+ needReparse = true;
+ m_javaSupport->backgroundParser()->unlock();
+
+ if( needReparse )
+ reparse();
+}
+
+void ProblemReporter::slotTextChanged()
+{
+ if( m_active )
+ m_timer->changeInterval( m_delay );
+}
+
+void ProblemReporter::removeAllProblems( const QString& filename )
+{
+ QListViewItem* current = firstChild();
+ while( current ){
+ QListViewItem* i = current;
+ current = current->nextSibling();
+
+ if( i->text(1) == filename )
+ delete( i );
+ }
+
+ if( m_document && m_markIface ){
+ QPtrList<KTextEditor::Mark> marks = m_markIface->marks();
+ QPtrListIterator<KTextEditor::Mark> it( marks );
+ while( it.current() ){
+ m_markIface->removeMark( it.current()->line, KTextEditor::MarkInterface::markType07 );
+ ++it;
+ }
+ }
+}
+
+void ProblemReporter::reparse()
+{
+ if( !m_javaSupport->isValid() )
+ return;
+
+ // @todo use the project database to decide which files to parse instead of this!
+ // ugly hack: do not parse non .java ending files
+ if ( !m_fileName.endsWith(".java") )
+ return;
+
+ m_timer->stop();
+
+ kdDebug(9013) << "ProblemReporter::reparse()" << endl;
+ m_javaSupport->backgroundParser()->addFile( m_fileName );
+ kdDebug(9013) << "---> file added " << m_fileName << endl;
+}
+
+void ProblemReporter::slotSelected( QListViewItem* item )
+{
+ KURL url( item->text(1) );
+ int line = item->text( 2 ).toInt();
+ // int column = item->text( 3 ).toInt();
+ m_javaSupport->partController()->editDocument( url, line-1 );
+// m_javaSupport->mainWindow()->lowerView( this );
+}
+
+void ProblemReporter::reportProblem( const QString& fileName, const Problem& p )
+{
+ int markType = levelToMarkType( p.level() );
+ if( markType != -1 && m_document && m_markIface && m_fileName == fileName ){
+ m_markIface->addMark( p.line(), markType );
+ }
+
+ QString msg = p.text();
+ msg = msg.replace( QRegExp("\n"), "" );
+
+ new ProblemItem( this,
+ levelToString( p.level() ),
+ fileName,
+ QString::number( p.line() + 1 ),
+ QString::number( p.column() + 1 ),
+ msg );
+}
+
+void ProblemReporter::configure()
+{
+ kdDebug(9013) << "ProblemReporter::configure()" << endl;
+ KConfig* config = kapp->config();
+ config->setGroup( "General Options" );
+ m_active = config->readBoolEntry( "EnableJavaBgParser", TRUE );
+ m_delay = config->readNumEntry( "BgParserDelay", 500 );
+}
+
+void ProblemReporter::configWidget( KDialogBase* dlg )
+{
+ QVBox *vbox = dlg->addVBoxPage(i18n("Java Parsing"));
+ ConfigureProblemReporter* w = new ConfigureProblemReporter( vbox );
+ //FIXME adymo: unused functionality
+ w->groupBox3->hide();
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ connect(dlg, SIGNAL(okClicked()), this, SLOT(configure()));
+}
+
+void ProblemReporter::slotPartAdded( KParts::Part* part )
+{
+ KTextEditor::MarkInterfaceExtension* iface = dynamic_cast<KTextEditor::MarkInterfaceExtension*>( part );
+
+ if( !iface )
+ return;
+
+ iface->setPixmap( KTextEditor::MarkInterface::markType07, SmallIcon("stop") );
+}
+
+void ProblemReporter::slotPartRemoved( KParts::Part* part )
+{
+ kdDebug(9013) << "ProblemReporter::slotPartRemoved()" << endl;
+ if( part == m_document ){
+ m_document = 0;
+ m_timer->stop();
+ }
+}
+
+QString ProblemReporter::levelToString( int level ) const
+{
+ switch( level )
+ {
+ case Problem::Level_Error:
+ return QString::fromLatin1( "Error" );
+ case Problem::Level_Warning:
+ return QString::fromLatin1( "Warning" );
+ case Problem::Level_Todo:
+ return QString::fromLatin1( "Todo" );
+ case Problem::Level_Fixme:
+ return QString::fromLatin1( "Fixme" );
+ default:
+ return QString::null;
+ }
+}
+
+int ProblemReporter::levelToMarkType( int level ) const
+{
+ switch( level )
+ {
+ case Problem::Level_Error:
+ return KTextEditor::MarkInterface::markType07;
+ case Problem::Level_Warning:
+ return -1;
+ case Problem::Level_Todo:
+ return -1;
+ case Problem::Level_Fixme:
+ return -1;
+ default:
+ return -1;
+ }
+}
+
+#include "problemreporter.moc"
diff --git a/languages/java/problemreporter.h b/languages/java/problemreporter.h
new file mode 100644
index 00000000..93835583
--- /dev/null
+++ b/languages/java/problemreporter.h
@@ -0,0 +1,74 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef PROBLEMSREPORTER_H
+#define PROBLEMSREPORTER_H
+
+#include <klistview.h>
+#include <qguardedptr.h>
+
+class JavaSupportPart;
+class QTimer;
+class KDialogBase;
+class Problem;
+
+namespace KParts{
+ class Part;
+}
+
+namespace KTextEditor{
+ class MarkInterface;
+ class Document;
+}
+
+class ProblemReporter: public KListView{
+ Q_OBJECT
+public:
+ ProblemReporter( JavaSupportPart* part, QWidget* parent=0, const char* name=0 );
+ virtual ~ProblemReporter();
+
+ void removeAllProblems( const QString& filename );
+ void reportProblem( const QString& fileName, const Problem& p );
+
+public slots:
+ void reparse();
+ void configure();
+ void configWidget( KDialogBase* );
+
+private slots:
+ void slotPartAdded( KParts::Part* );
+ void slotPartRemoved( KParts::Part* );
+ void slotActivePartChanged( KParts::Part* );
+ void slotTextChanged();
+ void slotSelected( QListViewItem* );
+
+private:
+ QString levelToString( int level ) const;
+ int levelToMarkType( int level ) const;
+
+private:
+ JavaSupportPart* m_javaSupport;
+ QGuardedPtr<KTextEditor::Document> m_document;
+ KTextEditor::MarkInterface* m_markIface;
+ QTimer* m_timer;
+ QString m_fileName;
+ int m_active;
+ int m_delay;
+};
+
+#endif
diff --git a/languages/kjssupport/Makefile.am b/languages/kjssupport/Makefile.am
new file mode 100644
index 00000000..d61fc67c
--- /dev/null
+++ b/languages/kjssupport/Makefile.am
@@ -0,0 +1,22 @@
+INCLUDES = -I$(kde_includes)/kdevelop $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevkjssupport.la
+libkdevkjssupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevkjssupport_la_LIBADD = -lkjsembed -lkdevelop
+libkdevkjssupport_la_SOURCES = kjssupport_part.cpp kjsproblems.cpp jscodecompletion.cpp subclassingdlg.cpp subclassingdlgbase.ui
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevkjssupport.desktop
+
+mimesrcdir = $(kde_mimedir)/text
+mimesrc_DATA = x-javascript-source.desktop
+
+EXTRA_DIST = $(mimesrc_DATA)
+
+rcdir = $(kde_datadir)/kdevkjssupport
+rc_DATA = kdevkjssupport.rc
+
+SUBDIRS = template subclassing_template
+noinst_HEADERS = kjsproblems.h
diff --git a/languages/kjssupport/jscodecompletion.cpp b/languages/kjssupport/jscodecompletion.cpp
new file mode 100644
index 00000000..8fd59f57
--- /dev/null
+++ b/languages/kjssupport/jscodecompletion.cpp
@@ -0,0 +1,174 @@
+//
+// C++ Implementation: jscodecompletion
+//
+// Description:
+//
+//
+// Author: ian reinhart geiser <geiseri@kde.org>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "jscodecompletion.h"
+#include <qwhatsthis.h>
+
+#include <qfileinfo.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <kapplication.h>
+#include <qregexp.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kprocess.h>
+#include <kdebug.h>
+#include <kaction.h>
+#include <kparts/part.h>
+#include <kdialogbase.h>
+
+
+#include <kdevelop/kdevcore.h>
+#include <kdevelop/kdevmainwindow.h>
+#include <kdevelop/kdevlanguagesupport.h>
+#include <kdevelop/kdevpartcontroller.h>
+#include <kdevelop/kdevproject.h>
+#include <kdevelop/kdevappfrontend.h>
+#include <kdevelop/domutil.h>
+#include <kdevelop/codemodel.h>
+
+JSCodeCompletion::JSCodeCompletion(QObject *parent, const char *name)
+ : QObject(parent, name)
+{
+ m_argWidgetShow = false;
+ m_completionBoxShow=false;
+}
+
+
+JSCodeCompletion::~JSCodeCompletion()
+{}
+
+void JSCodeCompletion::setActiveEditorPart( KParts::Part * part )
+{
+ if (!part || !part->widget())
+ return;
+
+ kdDebug() << "JSCodeCompletion::setActiveEditorPart" << endl;
+
+ // We need to think about this
+ // if(!(m_config->getCodeCompletion() || m_config->getCodeHinting())){
+ // return; // no help
+ // }
+
+ m_editInterface = dynamic_cast<KTextEditor::EditInterface*>(part);
+ if (!m_editInterface)
+ {
+ kdDebug() << "editor doesn't support the EditDocumentIface" << endl;
+ return;
+ }
+
+ m_cursorInterface = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget());
+ if (!m_cursorInterface)
+ {
+ kdDebug() << "editor does not support the ViewCursorInterface" << endl;
+ return;
+ }
+
+ m_codeInterface = dynamic_cast<KTextEditor::CodeCompletionInterface*>(part->widget());
+ if (!m_codeInterface)
+ { // no CodeCompletionDocument available
+ kdDebug() << "editor doesn't support the CodeCompletionDocumentIface" << endl;
+ return;
+ }
+
+ disconnect(part->widget(), 0, this, 0 ); // to make sure that it is't connected twice
+ connect(part->widget(), SIGNAL(cursorPositionChanged()),
+ this, SLOT(cursorPositionChanged()));
+ connect(part->widget(), SIGNAL(argHintHidden()), this, SLOT(argHintHidden()));
+ connect(part->widget(), SIGNAL(completionAborted()), this, SLOT(completionBoxAbort()));
+ connect(part->widget(), SIGNAL(completionDone()), this, SLOT(completionBoxHidden()));
+}
+
+QValueList< KTextEditor::CompletionEntry > JSCodeCompletion::getVars( const QString & startText )
+{
+ kdDebug() << "getVars for " << startText << endl;
+ QValueList<KTextEditor::CompletionEntry> varList;
+ /*
+ QValueList<QString>::ConstIterator it;
+ for (it = m_vars.begin(); it != m_vars.end(); ++it)
+ {
+ QString var = "$" + (*it);
+ kdDebug() << "Compair " << var << endl;
+ if( var.startsWith( startText ))
+ {
+ KTextEditor::CompletionEntry e;
+ e.text = var;
+ //e.postfix ="";
+ //e.prefix ="";
+ kdDebug() << "getVar: " << var << endl;
+ varList.append(e);
+ }
+ }
+ */
+ return varList;
+}
+
+void JSCodeCompletion::cursorPositionChanged( )
+{
+ uint line, col;
+ m_cursorInterface->cursorPositionReal(&line, &col);
+ kdDebug() << "JSCodeCompletion::cursorPositionChanged:" << line << ":" << col << endl;
+
+ QString lineStr = m_editInterface->textLine(line);
+ if(lineStr.isNull() || lineStr.isEmpty())
+ {
+ kdDebug() << "No Text..." << endl;
+ return; // nothing to do
+ }
+ // if(m_config->getCodeCompletion())
+ // {
+ QString restLine = lineStr.mid(col);
+ QString prevText = lineStr.mid(0,col);
+
+ if(restLine.left(1) != " " && restLine.left(1) != "\t" && !restLine.isNull())
+ {
+ kdDebug() << "no codecompletion because no empty character after cursor:" << restLine << ":" << endl;
+ return;
+ }
+
+ QRegExp prevReg("([\\d\\w]*)[.]$");
+
+ if (prevReg.search( prevText ) != -1 )
+ {
+ // We are in completion mode
+ QString startMatch = prevReg.cap(0);
+ kdDebug() << "Matching: " << startMatch << endl;
+ m_completionBoxShow=true;
+ m_codeInterface->showCompletionBox(getVars(startMatch),2);
+ }
+ else
+ {
+ kdDebug() << "no vars in: " << prevText << endl;
+ return;
+ }
+
+ // }
+
+
+}
+
+void JSCodeCompletion::completionBoxHidden( )
+{
+ kdDebug() << "Complete..." << endl;
+ m_completionBoxShow=false;
+}
+
+void JSCodeCompletion::completionBoxAbort( )
+{
+ kdDebug() << "aborted..." << endl;
+ m_completionBoxShow=false;
+
+}
+
+
+#include "jscodecompletion.moc"
diff --git a/languages/kjssupport/jscodecompletion.h b/languages/kjssupport/jscodecompletion.h
new file mode 100644
index 00000000..0cceb1e0
--- /dev/null
+++ b/languages/kjssupport/jscodecompletion.h
@@ -0,0 +1,53 @@
+//
+// C++ Interface: jscodecompletion
+//
+// Description:
+//
+//
+// Author: ian reinhart geiser <geiseri@kde.org>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef JSCODECOMPLETION_H
+#define JSCODECOMPLETION_H
+
+#include <qobject.h>
+#include <kdevelop/codemodel.h>
+#include <kdevelop/kdevplugin.h>
+#include <kdevelop/kdevlanguagesupport.h>
+
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <ktexteditor/codecompletioninterface.h>
+
+/**
+The code completion engine for Javascript.
+
+@author ian reinhart geiser
+*/
+class JSCodeCompletion : public QObject
+{
+ Q_OBJECT
+ public:
+ JSCodeCompletion(QObject *parent = 0, const char *name = 0);
+
+ ~JSCodeCompletion();
+ void setActiveEditorPart(KParts::Part* editorPart);
+ QValueList<KTextEditor::CompletionEntry> getVars(const QString& textHint);
+
+ public slots:
+ void cursorPositionChanged();
+ void completionBoxHidden();
+ void completionBoxAbort();
+
+ private:
+ bool m_argWidgetShow;
+ bool m_completionBoxShow;
+ KTextEditor::EditInterface *m_editInterface;
+ KTextEditor::CodeCompletionInterface *m_codeInterface;
+ KTextEditor::ViewCursorInterface *m_cursorInterface;
+
+};
+
+#endif
diff --git a/languages/kjssupport/kdevkjssupport.desktop b/languages/kjssupport/kdevkjssupport.desktop
new file mode 100644
index 00000000..d60863b8
--- /dev/null
+++ b/languages/kjssupport/kdevkjssupport.desktop
@@ -0,0 +1,54 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=kjsSupport
+Comment[da]=kjs-understøttelse
+Comment[et]=kjs toetus
+Comment[fa]=پشتیبانی kjs
+Comment[nds]=KDE-Ünnerstütten för JavaScript
+Comment[pl]=Obsługakjs
+Comment[sk]=kjs podpora
+Comment[sv]=Javaskript-stöd
+Comment[zh_TW]=kjs 支æ´
+Name=KDevkjsSupport
+Name[da]=KDevelop Bash-understøttelse
+Name[nds]=KJS-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługakjs
+Name[sk]=KDev kjs podpora
+Name[sv]=KDevelop Javaskript-stöd
+Name[zh_TW]=KDevelop kjs 支æ´
+GenericName=KDE JavaScript Support
+GenericName[ca]=Suport per a JavaScript per al KDE
+GenericName[da]=KDE JavaScript-understøttelse
+GenericName[de]=Unterstützung für KDE-JavaScript
+GenericName[el]=ΥποστήÏιξη KDE JavaScript
+GenericName[es]=Soporte para JavaScript de KDE
+GenericName[et]=KDE JavaScripti toetus
+GenericName[eu]=KDE JavaScript euskarria
+GenericName[fa]=پشتیبانی جاوااسکریپت KDE
+GenericName[fr]=Prise en charge du JavaScript pour KDE
+GenericName[ga]=Tacaíocht JavaScript KDE
+GenericName[gl]=Soporte para JavaScript de KDE
+GenericName[hu]=KDE Javascript-támogatás
+GenericName[it]=Supporto JavaScript di KDE
+GenericName[ja]=KDE JavaScript サãƒãƒ¼ãƒˆ
+GenericName[nds]=KDE-Ünnerstütten för JavaScript
+GenericName[ne]=केडीई जाभासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ समरà¥à¤¥à¤¨
+GenericName[nl]=KDE ondersteuning voor JavaScript
+GenericName[pl]=Obsługa JavaScriptu KDE
+GenericName[pt]=Suporte KDE a JavaScript
+GenericName[pt_BR]=Suporte ao JavaScript do KDE
+GenericName[ru]=Поддержка Ñзыка JavaScript
+GenericName[sk]=KDE JavaScript podpora
+GenericName[sl]=Podpora javascriptu v KDE
+GenericName[sr]=KDE-ова подршка за Javascript
+GenericName[sr@Latn]=KDE-ova podrška za Javascript
+GenericName[sv]=KDE Javaskript-stöd
+GenericName[tr]=KDE JavaScript DesteÄŸi
+GenericName[zh_CN]=KDE JavaScript 支æŒ
+GenericName[zh_TW]=KDE JavaScript 支æ´
+Icon=kdevelop
+ServiceTypes=KDevelop/LanguageSupport
+X-KDevelop-Language=Javascript
+X-KDE-Library=libkdevkjssupport
+X-KDevelop-Version=3
diff --git a/languages/kjssupport/kdevkjssupport.rc b/languages/kjssupport/kdevkjssupport.rc
new file mode 100644
index 00000000..e48fc863
--- /dev/null
+++ b/languages/kjssupport/kdevkjssupport.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevkjsSupport" version="1">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_execute" />
+ </Menu>
+</MenuBar>
+<ToolBar name="mainToolBar">
+ <Action name="build_execute" group="build_operations" />
+</ToolBar>
+</kpartgui>
diff --git a/languages/kjssupport/kjsproblems.cpp b/languages/kjssupport/kjsproblems.cpp
new file mode 100644
index 00000000..39084169
--- /dev/null
+++ b/languages/kjssupport/kjsproblems.cpp
@@ -0,0 +1,78 @@
+/*
+ Copyright (C) 2003 ian reinhart geiser <geiseri@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include "kjsproblems.h"
+#include "kjssupport_part.h"
+#include <kiconloader.h>
+
+class KJSProblemItem: public KListViewItem
+{
+ public:
+ KJSProblemItem( QListView* parent, const QString& level, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : KListViewItem( parent, level, problem, file, line, column )
+ {}
+
+ KJSProblemItem( QListViewItem* parent, const QString& level, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : KListViewItem( parent, level, problem, file, line, column )
+ {}
+
+ int compare( QListViewItem* item, int column, bool ascending ) const
+ {
+ if( column == 2 || column == 3 )
+ {
+ int a = text( column ).toInt();
+ int b = item->text( column ).toInt();
+ if( a == b )
+ return 0;
+ return( a > b ? 1 : -1 );
+ }
+ return KListViewItem::compare( item, column, ascending );
+ }
+
+};
+
+KJSProblems::KJSProblems(kjsSupportPart *part, QWidget *parent, const char *name) : KListView(parent,name), m_part(part)
+{
+ addColumn ("File");
+ addColumn ("Line #");
+ addColumn ("Problem:");
+ setIcon( SmallIcon("info") );
+}
+
+
+KJSProblems::~KJSProblems()
+{
+
+}
+
+void KJSProblems::clearItems()
+{
+ clear();
+ setIcon( SmallIcon("info") );
+}
+
+void KJSProblems::addLine(const QString &file, int lineNo, const QString &message)
+{
+ new QListViewItem( this, file, QString::number( lineNo ), message);
+ setIcon( SmallIcon("error") );
+}
+
+
+#include "kjsproblems.moc"
diff --git a/languages/kjssupport/kjsproblems.h b/languages/kjssupport/kjsproblems.h
new file mode 100644
index 00000000..d7d47c63
--- /dev/null
+++ b/languages/kjssupport/kjsproblems.h
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2003 ian reinhart geiser <geiseri@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef KJSPROBLEMS_H
+#define KJSPROBLEMS_H
+
+#include <klistview.h>
+class kjsSupportPart;
+
+/**
+@author ian reinhart geiser
+*/
+class KJSProblems : public KListView
+{
+Q_OBJECT
+public:
+
+ KJSProblems(kjsSupportPart *part, QWidget *parent = 0L, const char *name = 0L);
+ ~KJSProblems();
+
+ void clearItems();
+ void addLine(const QString &file, int lineNo, const QString &message);
+
+private:
+ kjsSupportPart *m_part;
+};
+
+#endif
diff --git a/languages/kjssupport/kjssupport_part.cpp b/languages/kjssupport/kjssupport_part.cpp
new file mode 100644
index 00000000..c4907991
--- /dev/null
+++ b/languages/kjssupport/kjssupport_part.cpp
@@ -0,0 +1,448 @@
+/*
+ Copyright (C) 2003 ian reinhart geiser <geiseri@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <qwhatsthis.h>
+#include <qtimer.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+#include <qpopupmenu.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+#include <kdevcore.h>
+#include <kdevpartcontroller.h>
+#include <kdevmainwindow.h>
+#include <domutil.h>
+#include <codemodel.h>
+#include <kparts/part.h>
+
+
+#include <kdevproject.h>
+#include <kaction.h>
+#include <kdebug.h>
+#include <kapplication.h>
+
+#include <kjsembed/kjsembedpart.h>
+#include <kjsembed/jsconsolewidget.h>
+
+#include <kdevplugininfo.h>
+
+#include "kjssupport_part.h"
+#include "kjsproblems.h"
+#include "jscodecompletion.h"
+#include "subclassingdlg.h"
+
+typedef KDevGenericFactory<kjsSupportPart> kjsSupportFactory;
+static const KDevPluginInfo data("kdevkjssupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevkjssupport, kjsSupportFactory( data ) );
+
+
+class typeProperty
+{
+ public:
+ QString type;
+ QString name;
+ int depth;
+};
+
+kjsSupportPart::kjsSupportPart(QObject *parent, const char *name, const QStringList& )
+: KDevLanguageSupport(&data, parent, name ? name : "kjsSupportPart" )
+{
+ setInstance(kjsSupportFactory::instance());
+ setXMLFile("kdevkjssupport.rc");
+
+
+ m_build = new KAction( i18n("&Run"), "exec",Key_F9,this, SLOT(slotRun()),actionCollection(), "build_execute" );
+ m_build->setStatusText( i18n("Test the active script.") );
+
+ kdDebug() << "Creating kjssupport Part" << endl;
+
+ connect( core(), SIGNAL(projectConfigWidget(KDialogBase*)),
+ this, SLOT(projectConfigWidget(KDialogBase*)) );
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const QString&)), this, SLOT(savedFile(const QString&)) );
+ connect(partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part *)));
+ connect(core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)));
+
+
+ // Building kjs interpreter.
+ m_js = new KJSEmbed::KJSEmbedPart();
+ mainWindow()->embedOutputView( m_js->view() , i18n("KJS Console"),i18n("KJS Embed Console") );
+
+ // get the problem reporter
+ m_problemReporter = new KJSProblems( this, 0, "problems" );
+ mainWindow( )->embedOutputView( m_problemReporter, i18n("Problems"), i18n("Problem reporter"));
+ m_cc = new JSCodeCompletion();
+ }
+
+
+kjsSupportPart::~kjsSupportPart()
+{
+ delete m_problemReporter;
+ delete m_cc;
+ delete m_build;
+ delete m_js;
+}
+
+KDevLanguageSupport::Features kjsSupportPart::features()
+{
+ return Features(Classes | Variables | Functions);
+}
+
+KMimeType::List kjsSupportPart::mimeTypes()
+{
+ KMimeType::List list;
+
+ KMimeType::Ptr mime = KMimeType::mimeType( "application/x-javascript" );
+ if( mime )
+ list << mime;
+
+ return list;
+}
+void kjsSupportPart::slotRun()
+{
+ // Execute the application here.
+
+ KParts::ReadOnlyPart * ro_part = dynamic_cast<KParts::ReadOnlyPart*>( partController()->activePart() );
+ if ( ro_part )
+ {
+ m_js->runFile( ro_part->url().path() );
+ }
+
+}
+
+void kjsSupportPart::projectConfigWidget(KDialogBase *dlg)
+{
+ Q_UNUSED( dlg );
+ // Create your config dialog here.
+}
+void kjsSupportPart::projectOpened()
+{
+ kdDebug(9014) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(0, this, SLOT(parse()));
+}
+void kjsSupportPart::projectClosed()
+{
+
+}
+void kjsSupportPart::savedFile(const QString &fileName)
+{
+
+
+ if (project()->allFiles().contains(fileName.mid ( project()->projectDirectory().length() + 1 )))
+ {
+ kdDebug(9014) << "parse file " << fileName << endl;
+ parse( fileName );
+ emit addedSourceInfo( fileName );
+ }
+}
+void kjsSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug(9014) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ kdDebug(9014) << "maybe parse " << project()->projectDirectory() + "/" + ( *it ) << endl;
+ parse( project()->projectDirectory() + "/" + (*it) );
+ }
+
+ emit updatedSourceInfo();
+}
+void kjsSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ if( codeModel()->hasFile(fileName) )
+ {
+ kdDebug(9014) << "removed " << fileName << endl;
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+ }
+
+}
+void kjsSupportPart::parse()
+{
+ kdDebug(9014) << "initialParse()" << endl;
+
+ if (project())
+ {
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ m_problemReporter->clear();
+
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it)
+ {
+ kdDebug(9014) << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+
+ parse( project()->projectDirectory() + "/" + (*it) );
+
+ }
+ emit updatedSourceInfo();
+ kapp->restoreOverrideCursor();
+ } else {
+ kdDebug(9014) << "No project" << endl;
+ }
+}
+void kjsSupportPart::slotActivePartChanged(KParts::Part *part)
+{
+ kdDebug() << "Changeing active part..." << endl;
+ m_cc->setActiveEditorPart(part);
+}
+
+/*!
+ \fn kjsSupportPart::parse(const QString &fileName)
+ */
+void kjsSupportPart::parse(const QString &fileName)
+{
+ QFileInfo fi(fileName);
+ if (fi.extension() == "js")
+ {
+ if( codeModel()->hasFile(fileName) )
+ {
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+
+ FileDom m_file = codeModel()->create<FileModel>();
+ m_file->setName( fileName );
+ m_file->setFileName( fileName );
+
+ QFile f(QFile::encodeName(fileName));
+ if (!f.open(IO_ReadOnly))
+ return;
+ QString rawline;
+ QString line;
+ uint lineNo = 0;
+ QTextStream stream(&f);
+ int depth = 0;
+ bool inFunction = false;
+ QString lastFunction = "";
+ int lastLineNo = 0;
+ ClassDom currentClass;
+
+ QRegExp varRx("var[\\s]([_a-zA-Z\\d]+)");
+ QRegExp classVarRx("this\\.([_a-zA-Z\\d]+)");
+ QRegExp classMethRx("this\\.([_a-zA-Z\\d]+)[\\s]*=[\\s]*function(\\([^){}\\n\\r]*\\))");
+ QRegExp methRx("function[\\s]+([_a-zA-Z\\d]+[\\s]*\\([^){}\\n\\r]*\\))");
+ QRegExp allocRx("([_\\d\\w]+)[\\s]*=[\\s]*new[\\s]*([_\\d\\w]+)");
+ QRegExp assnRx("var[\\s]+([_\\d\\w]+)[\\s]+[=][\\s]+([_\\d\\w]+)[;]");
+
+ while (!stream.atEnd())
+ {
+ rawline = stream.readLine();
+ line = rawline.stripWhiteSpace().local8Bit();
+ kdDebug() << "Trying line: " << line << endl;
+
+ if (methRx.search(line) != -1 && depth == 0)
+ {
+ if (lastFunction != "" )
+ addMethod(lastFunction, m_file, lastLineNo);
+ lastFunction = methRx.cap(1);
+ lastLineNo = lineNo;
+ }
+ else if(varRx.search(line) != -1 && depth == 0)
+ {
+ addAttribute(varRx.cap(1), m_file, lineNo);
+ }
+ else if(classMethRx.search(line) != -1 && depth > 0)
+ {
+ if ( lastFunction != "" )
+ {
+ currentClass = addClass(lastFunction, m_file, lastLineNo );
+ lastFunction = "";
+ }
+ addMethod(classMethRx.cap(1)+classMethRx.cap(2), currentClass, lineNo);
+ }
+ else if(classVarRx.search(line) != -1 && depth > 0)
+ {
+ if ( lastFunction != "" )
+ {
+ currentClass = addClass(lastFunction, m_file, lastLineNo );
+ lastFunction = "";
+ }
+ addAttribute(classVarRx.cap(1), currentClass, lineNo);
+ }
+
+ if( allocRx.search(line) != -1 )
+ {
+ QString varName = allocRx.cap(1);
+ QString varType = allocRx.cap(2);
+
+ typeProperty *type = new typeProperty();
+ type->depth = depth;
+ type->name = varName;
+ type->type = varType;
+
+ m_typeMap.insert(varName, type);
+ kdDebug() << "Adding " << varName << " of type " << varType << " at scope " << depth << endl;
+
+ }
+
+
+ kdDebug() << "Syntax check..." << endl;
+ KJS::UString jsLine( line.latin1() );
+ int lineNumber = 0;
+ KJS::UString errorMessage;
+
+ if ( !m_js->interpreter()->checkSyntax( jsLine, &lineNumber, &errorMessage ) )
+ {
+ kdDebug() << errorMessage.qstring() << " on line " << lineNo << endl;
+ m_problemReporter->addLine(m_file->fileName(), lineNo, errorMessage.qstring());
+ }
+
+ if( line.contains("{") )
+ ++depth;
+
+ if( line.contains("}") )
+ --depth;
+
+ ++lineNo;
+ }
+
+ if (lastFunction != "" )
+ addMethod(lastFunction, m_file, lastLineNo);
+
+ f.close();
+
+ kdDebug() << "Trying to add list..." << endl;
+
+ codeModel()->addFile( m_file );
+
+
+ }
+}
+
+ClassDom kjsSupportPart::addClass(const QString &name, FileDom file, uint lineNo)
+{
+ ClassDom clazz = codeModel()->create<ClassModel>();
+ clazz->setName(name);
+ clazz->setFileName(file->fileName());
+ clazz->setStartPosition(lineNo, 0);
+
+ if( !file->hasClass(clazz->name()) ){
+ kdDebug() << "Add global class " << clazz->name() << endl;
+ file->addClass( clazz );
+ }
+ return clazz;
+}
+
+void kjsSupportPart::addMethod(const QString &name, ClassDom clazz, uint lineNo)
+{
+ FunctionDom method = codeModel()->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName(clazz->fileName());
+ method->setStartPosition(lineNo, 0);
+
+ if( !clazz->hasFunction(method->name()) ){
+ kdDebug() << "Add class method " << method->name() << endl;
+ clazz->addFunction( method );
+ }
+}
+
+void kjsSupportPart::addAttribute(const QString &name, ClassDom clazz, uint lineNo)
+{
+ VariableDom var = codeModel()->create<VariableModel>();
+ var->setName(name);
+ var->setFileName(clazz->fileName());
+ var->setStartPosition( lineNo, 0 );
+ var->setType(i18n("Variable"));
+
+ if( !clazz->hasVariable(var->name()) ){
+ kdDebug() << "Add class attribute " << var->name() << endl;
+ clazz->addVariable(var);
+ }
+}
+
+void kjsSupportPart::addMethod(const QString &name, FileDom file, uint lineNo)
+{
+ FunctionDom method = codeModel()->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName(file->fileName());
+ method->setStartPosition(lineNo, 0);
+
+ if( !file->hasFunction(method->name()) ){
+ kdDebug() << "Add global method " << method->name() << endl;
+ file->addFunction( method );
+ }
+}
+
+void kjsSupportPart::addAttribute(const QString &name, FileDom file, uint lineNo)
+{
+ VariableDom var = codeModel()->create<VariableModel>();
+ var->setName(name);
+ var->setFileName(file->fileName());
+ var->setStartPosition( lineNo, 0 );
+ var->setType(i18n("Variable"));
+
+ if( !file->hasVariable(var->name()) ){
+ kdDebug() << "Add global attribute " << var->name() << endl;
+ file->addVariable(var);
+ }
+}
+
+void kjsSupportPart::contextMenu(QPopupMenu * popupMenu, const Context *context)
+{
+ kdDebug() << "1" << endl;
+ if (!context->hasType( Context::FileContext ))
+ return;
+
+ kdDebug() << "2" << endl;
+ const FileContext *fcontext = static_cast<const FileContext*>(context);
+ m_selectedUI = fcontext->fileName();
+ if (m_selectedUI.right(3).lower() == ".ui")
+ int id = popupMenu->insertItem(i18n("Implement Slots"),
+ this, SLOT(implementSlots()));
+ else
+ m_selectedUI = QString::null;
+}
+
+void kjsSupportPart::implementSlots()
+{
+ if (m_selectedUI.isEmpty())
+ return;
+
+ QStringList newFiles;
+ SubclassingDlg *sub = new SubclassingDlg(this, m_selectedUI, newFiles);
+ if (sub->exec())
+ project()->addFiles(newFiles);
+
+ delete sub;
+}
+
+#include "kjssupport_part.moc"
diff --git a/languages/kjssupport/kjssupport_part.h b/languages/kjssupport/kjssupport_part.h
new file mode 100644
index 00000000..67e35f07
--- /dev/null
+++ b/languages/kjssupport/kjssupport_part.h
@@ -0,0 +1,85 @@
+/*
+ Copyright (C) 2003 ian reinhart geiser <geiseri@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+
+#ifndef __KDEVPART_KJSSUPPORT_H__
+#define __KDEVPART_KJSSUPPORT_H__
+
+
+#include <kdevelop/kdevplugin.h>
+#include <kdevelop/codemodel.h>
+#include <kdevelop/kdevlanguagesupport.h>
+#include <kdialogbase.h>
+#include <qstringlist.h>
+#include <qdict.h>
+
+namespace KJSEmbed
+{
+class KJSEmbedPart;
+class KJSConsoleWidget;
+};
+
+class QPopupMenu;
+class KAction;
+class KJSProblems;
+class JSCodeCompletion;
+class Context;
+
+class typeProperty;
+
+
+class kjsSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+ public:
+ kjsSupportPart(QObject *parent, const char *name, const QStringList &);
+ ~kjsSupportPart();
+ protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+ private slots:
+ void slotRun();
+ void projectConfigWidget(KDialogBase *dlg);
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const QString &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void parse();
+ void slotActivePartChanged(KParts::Part *part);
+ void contextMenu(QPopupMenu *popupMenu, const Context *context);
+ void implementSlots();
+ private:
+ void parse(const QString &fileName);
+ void addAttribute(const QString &name, ClassDom clazz, uint lineNo);
+ void addMethod(const QString &name, ClassDom clazz, uint lineNo);
+ void addAttribute(const QString &name, FileDom file, uint lineNo);
+ void addMethod(const QString &name, FileDom file, uint lineNo);
+ ClassDom addClass(const QString &name, FileDom file, uint lineNo);
+ KAction *m_build;
+ KJSEmbed::KJSEmbedPart *m_js;
+ KJSProblems *m_problemReporter;
+ QDict<typeProperty> m_typeMap;
+ JSCodeCompletion *m_cc;
+
+ QString m_selectedUI;
+};
+
+
+#endif
diff --git a/languages/kjssupport/subclassing_template/Makefile.am b/languages/kjssupport/subclassing_template/Makefile.am
new file mode 100644
index 00000000..8c99d172
--- /dev/null
+++ b/languages/kjssupport/subclassing_template/Makefile.am
@@ -0,0 +1,3 @@
+kjssupportdatadir = ${kde_datadir}/kdevkjssupport
+subclassingdir = ${kjssupportdatadir}/subclassing
+subclassing_DATA = subclass_template.js
diff --git a/languages/kjssupport/subclassing_template/subclass_template.js b/languages/kjssupport/subclassing_template/subclass_template.js
new file mode 100644
index 00000000..568c5699
--- /dev/null
+++ b/languages/kjssupport/subclassing_template/subclass_template.js
@@ -0,0 +1,2 @@
+//Slot implementations and slot-signal connections for $BASEFILENAME$ form
+/*$SPECIALIZATION$*/
diff --git a/languages/kjssupport/subclassingdlg.cpp b/languages/kjssupport/subclassingdlg.cpp
new file mode 100644
index 00000000..be1ad83e
--- /dev/null
+++ b/languages/kjssupport/subclassingdlg.cpp
@@ -0,0 +1,461 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Jakob Simon-Gaarde *
+ * jsgaarde@tdcspace.dk *
+ * Copyright (C) 2003 by Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "subclassingdlg.h"
+#include "kjssupport_part.h"
+/*#include "backgroundparser.h"
+#include "store_walker.h"
+#include "cppsupportfactory.h"*/
+#include <kdevelop/kdevsourceformatter.h>
+#include <kdevelop/kdevproject.h>
+#include <kdevelop/filetemplate.h>
+#include <kdevelop/codemodel.h>
+
+#include <qradiobutton.h>
+#include <qstringlist.h>
+#include <qcheckbox.h>
+#include <qmessagebox.h>
+#include <kfiledialog.h>
+#include <klineedit.h>
+#include <qpushbutton.h>
+#include <domutil.h>
+#include <qdom.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <kconfig.h>
+
+
+#define WIDGET_CAPTION_NAME "widget/property|name=caption/string"
+#define WIDGET_CLASS_NAME "class"
+#define WIDGET_SLOTS "slots"
+#define WIDGET_FUNCTIONS "functions"
+
+// All widgets
+#define SLOT_ACCEPT SlotItem(m_slotView,"accept()","virtual","protected","void",false,true)
+#define SLOT_REJECT SlotItem(m_slotView,"reject()","virtual","protected","void",false,true)
+
+// Wizards
+#define SLOT_BACK SlotItem(m_slotView,"back()","virtual","protected","void",false,true)
+#define SLOT_NEXT SlotItem(m_slotView,"next()","virtual","protected","void",false,true)
+#define SLOT_HELP SlotItem(m_slotView,"help()","virtual","protected","void",false,true)
+
+
+SlotItem::SlotItem(QListView *parent,const QString &methodName,
+ const QString &specifier,
+ const QString &access, const QString &returnType,
+ bool isFunc,bool callBaseClass)
+: QCheckListItem(parent,methodName,QCheckListItem::CheckBox)
+{
+ setOn(true);
+ m_methodName = methodName;
+ m_access = access.isEmpty() ? (const QString) "public" : access;
+ m_specifier = specifier.isEmpty() ? (const QString) "virtual" : specifier;
+ m_returnType = returnType.isEmpty() ? (const QString) "void" : returnType;
+ m_isFunc = isFunc;
+ m_callBaseClass = callBaseClass;
+ setText(0,m_methodName);
+ setText(1,m_access);
+ setText(2,m_specifier);
+ setText(3,m_returnType);
+ setText(4,m_isFunc ? "Function" : "Slot");
+ if (m_access=="private" ||
+ m_specifier=="non virtual")
+ {
+ setOn(false);
+ setEnabled(false);
+ }
+ if (m_specifier=="pure virtual")
+ {
+ setOn(true);
+ setEnabled(false);
+ }
+ m_alreadyInSubclass = false;
+}
+
+void SlotItem::setAllreadyInSubclass()
+{
+ setOn(true);
+ setEnabled(false);
+ m_alreadyInSubclass = true;
+}
+
+
+SubclassingDlg::SubclassingDlg(kjsSupportPart* kjsSupport, const QString &formFile,QStringList &newFileNames,
+ QWidget* parent, const char* name,bool modal, WFlags fl)
+: SubclassingDlgBase(parent,name,modal,fl),
+m_newFileNames(newFileNames), m_kjsSupport( kjsSupport )
+//=================================================
+{
+ m_formFile = formFile;
+ readUiFile();
+ m_creatingNewSubclass = true;
+
+/* KConfig *config = kjsSupportFactory::instance()->config();
+ if (config)
+ {
+ config->setGroup("Subclassing");
+ reformatDefault_box->setChecked(config->readBoolEntry("Reformat Source", 0));
+ if (reformatDefault_box->isChecked())
+ reformat_box->setChecked(true);
+ }*/
+// m_btnOk->setEnabled(true);
+}
+
+
+/*SubclassingDlg::SubclassingDlg(kjsSupportPart* kjsSupport, const QString &formFile,const QString &filename,QStringList &dummy,
+ QWidget* parent, const char* name,bool modal, WFlags fl)
+: SubclassingDlgBase(parent,name,modal,fl),
+m_newFileNames(dummy), m_kjsSupport( kjsSupport )
+//=================================================
+{
+ m_formFile = formFile;
+ m_creatingNewSubclass = false;
+ m_filename = filename;
+
+ KConfig *config = kjsSupportFactory::instance()->config();
+ if (config)
+ {
+ config->setGroup("Subclassing");
+ reformatDefault_box->setChecked(config->readBoolEntry("Reformat Source", 0));
+ if (reformatDefault_box->isChecked())
+ reformat_box->setChecked(true);
+ }
+
+ QStringList pathsplit(QStringList::split('/',filename));
+
+ QString baseClass = readBaseClassName();
+ if (!kjsSupport->codeModel()->hasFile(filename+QString(".h")))
+ return;
+ ClassList myClasses = kjsSupport->codeModel()->fileByName(filename+QString(".h"))->classList();
+ for (ClassList::const_iterator classIt = myClasses.begin(); classIt != myClasses.end(); ++classIt)
+ {
+ kdDebug() << "base class " << baseClass << " class " << (*classIt)->name()
+ << " parents " << (*classIt)->baseClassList().join(",") << endl;
+ if ( (*classIt)->baseClassList().findIndex(baseClass) != -1 )
+ {
+ kdDebug() << "base class matched " << endl;
+ m_edClassName->setText((*classIt)->name());
+ m_edFileName->setText(pathsplit[pathsplit.count()-1]);
+
+ FunctionList functionList = (*classIt)->functionList();
+ for (FunctionList::const_iterator methodIt = functionList.begin();
+ methodIt != functionList.end(); ++methodIt)
+ {
+ m_parsedMethods << (*methodIt)->name() + "(";
+ }
+ }
+ }
+ readUiFile();
+ m_btnOk->setEnabled(true);
+}
+*/
+bool SubclassingDlg::alreadyInSubclass(const QString &method)
+{
+ for (uint i=0;i<m_parsedMethods.count();i++)
+ if (method.find(m_parsedMethods[i])==0)
+ return true;
+ return false;
+}
+
+void SubclassingDlg::readUiFile()
+{
+ QStringList splitPath = QStringList::split('/',m_formFile);
+ m_formName = QStringList::split('.',splitPath[splitPath.count()-1])[0]; // "somedlg.ui" = "somedlg"
+ splitPath.pop_back();
+ m_formPath = "/" + splitPath.join("/"); // join path to ui-file
+
+ m_btnOk->setEnabled(false);
+ QDomDocument doc;
+
+ DomUtil::openDOMFile(doc,m_formFile);
+ m_baseClassName = DomUtil::elementByPathExt(doc,WIDGET_CLASS_NAME).text();
+
+ m_baseCaption = DomUtil::elementByPathExt(doc,WIDGET_CAPTION_NAME).text();
+ setCaption(i18n("Create Subclass of ")+m_baseClassName);
+
+ // Special widget specific slots
+ SlotItem *newSlot;
+ m_qtBaseClassName = DomUtil::elementByPathExt(doc,"widget").attribute("class","QDialog");
+
+ if ( (m_qtBaseClassName=="QMainWindow") || (m_qtBaseClassName=="QWidget") )
+ m_canBeModal = false;
+ else
+ m_canBeModal = true;
+ if (m_qtBaseClassName != "QWidget")
+ {
+ newSlot = new SLOT_ACCEPT;
+ newSlot->setOn(false);
+ if (alreadyInSubclass("accept()"))
+ newSlot->setAllreadyInSubclass();
+ m_slotView->insertItem(newSlot);
+ m_slots << newSlot;
+
+ newSlot = new SLOT_REJECT;
+ newSlot->setOn(false);
+ if (alreadyInSubclass("reject()"))
+ newSlot->setAllreadyInSubclass();
+ m_slotView->insertItem(newSlot);
+ m_slots << newSlot;
+ }
+
+ if (m_qtBaseClassName == "QWizard")
+ {
+ newSlot = new SLOT_NEXT;
+ m_slotView->insertItem(newSlot);
+ if (alreadyInSubclass("next()"))
+ newSlot->setAllreadyInSubclass();
+ m_slots << newSlot;
+ newSlot = new SLOT_BACK;
+ m_slotView->insertItem(newSlot);
+ if (alreadyInSubclass("back()"))
+ newSlot->setAllreadyInSubclass();
+ m_slots << newSlot;
+ newSlot = new SLOT_HELP;
+ newSlot->setOn(false);
+ if (alreadyInSubclass("help()"))
+ newSlot->setAllreadyInSubclass();
+ m_slotView->insertItem(newSlot);
+ m_slots << newSlot;
+ }
+
+ QDomElement slotsElem = DomUtil::elementByPathExt(doc,WIDGET_SLOTS);
+ QDomNodeList slotnodes = slotsElem.childNodes();
+
+ for (unsigned int i=0; i<slotnodes.count();i++)
+ {
+ QDomElement slotelem = slotnodes.item(i).toElement();
+ newSlot = new SlotItem(m_slotView,slotelem.text(),
+ slotelem.attributeNode("specifier").value(),
+ slotelem.attributeNode("access").value(),
+ slotelem.attributeNode("returnType").value(),false);
+ m_slotView->insertItem(newSlot);
+ if (alreadyInSubclass(slotelem.text()))
+ newSlot->setAllreadyInSubclass();
+ m_slots << newSlot;
+ }
+
+ QDomElement funcsElem = DomUtil::elementByPathExt(doc,WIDGET_FUNCTIONS);
+ QDomNodeList funcnodes = funcsElem.childNodes();
+ SlotItem *newFunc;
+ for (unsigned int i=0; i<funcnodes.count();i++)
+ {
+ QDomElement funcelem = funcnodes.item(i).toElement();
+ newFunc = new SlotItem(m_slotView,funcelem.text(),
+ funcelem.attributeNode("specifier").value(),
+ funcelem.attributeNode("access").value(),
+ funcelem.attributeNode("returnType").value(),true);
+ m_slotView->insertItem(newFunc);
+ if (alreadyInSubclass(funcelem.text()))
+ newFunc->setAllreadyInSubclass();
+ m_slots << newFunc;
+ }
+
+ QDomElement connElem = DomUtil::elementByPathExt(doc,"connections");
+ QDomNodeList connnodes = connElem.childNodes();
+ for (unsigned int i=0; i<connnodes.count();i++)
+ {
+ QDomElement connelem = connnodes.item(i).toElement();
+ connections += "$NEWCLASS$.connect(";
+ if (connelem.namedItem("sender").toElement().text() == m_baseClassName)
+ connections += "this";
+ else
+ connections += "$NEWCLASS$.child('" + connelem.namedItem("sender").toElement().text() + "')";
+ connections += ", '" + connelem.namedItem("signal").toElement().text() + "', ";
+ if (connelem.namedItem("receiver").toElement().text() == m_baseClassName)
+ connections += "this";
+ else
+ connections += "$NEWCLASS$.child('" + connelem.namedItem("receiver").toElement().text() + "')";
+ connections += ", '" + connelem.namedItem("slot").toElement().text().remove("()") + "');\n";
+ }
+}
+
+SubclassingDlg::~SubclassingDlg()
+//===============================
+{
+}
+
+
+void SubclassingDlg::updateDlg()
+//==============================
+{
+}
+
+void SubclassingDlg::replace(QString &string, const QString& search, const QString& replace)
+//==========================================================================================
+{
+ int nextPos = string.find(search);
+ unsigned int searchLength = search.length();
+ while (nextPos>-1)
+ {
+ string = string.replace(nextPos,searchLength,replace);
+ nextPos = string.find(search,nextPos+replace.length());
+ }
+}
+
+bool SubclassingDlg::loadBuffer(QString &buffer, const QString& filename)
+//======================================================================
+{
+ // open file and buffer it
+ QFile dataFile(filename);
+ if (!dataFile.open(IO_ReadOnly))
+ return false;
+ char *temp = new char[dataFile.size()+1];
+ dataFile.readBlock(temp,dataFile.size());
+ temp[dataFile.size()]='\0';
+ buffer = temp;
+ delete [] temp;
+ dataFile.close();
+ return true;
+}
+
+bool SubclassingDlg::replaceKeywords(QString &buffer,bool canBeModal)
+//===================================================================
+{
+ replace(buffer,"$NEWFILENAMEUC$",m_edFileName->text().upper());
+ replace(buffer,"$BASEFILENAMELC$",m_formName.lower());
+ replace(buffer,"$BASEFILENAME$",m_formName);
+ replace(buffer,"$NEWCLASS$",m_edClassName->text());
+ replace(buffer,"$BASECLASS$",m_baseClassName);
+ replace(buffer,"$NEWFILENAMELC$",m_edFileName->text().lower());
+ if (canBeModal)
+ {
+ replace(buffer,"$CAN_BE_MODAL_H$",", bool modal = FALSE");
+ replace(buffer,"$CAN_BE_MODAL_CPP1$",", bool modal");
+ replace(buffer,"$CAN_BE_MODAL_CPP2$",", modal");
+ }
+ else
+ {
+ replace(buffer,"$CAN_BE_MODAL_H$","");
+ replace(buffer,"$CAN_BE_MODAL_CPP1$","");
+ replace(buffer,"$CAN_BE_MODAL_CPP2$","");
+ }
+
+ return true;
+}
+
+bool SubclassingDlg::saveBuffer(QString &buffer, const QString& filename)
+//=======================================================================
+{
+ // save buffer
+
+ QFile dataFile(filename);
+ if (!dataFile.open(IO_WriteOnly | IO_Truncate))
+ return false;
+ dataFile.writeBlock((buffer+"\n").ascii(),(buffer+"\n").length());
+ dataFile.close();
+ return true;
+}
+
+
+void SubclassingDlg::accept()
+//===========================
+{
+/* KConfig *config = kjsSupportFactory::instance()->config();
+ if (config)
+ {
+ config->setGroup("Subclassing");
+ config->writeEntry("Reformat Source", reformatDefault_box->isChecked());
+ }*/
+
+ unsigned int i;
+
+ // h - file
+
+ QString public_slot =
+ "/*$PUBLIC_SLOTS$*/\n ";
+
+ QString protected_slot =
+ "/*$PROTECTED_SLOTS$*/\n ";
+
+ QString public_func =
+ "/*$PUBLIC_FUNCTIONS$*/\n ";
+
+ QString protected_func =
+ "/*$PROTECTED_FUNCTIONS$*/\n ";
+
+ QString buffer;
+ if (m_creatingNewSubclass)
+ {
+ loadBuffer(buffer,::locate("data", "kdevkjssupport/subclassing/subclass_template.js"));
+ kdDebug() << "buffer: " << buffer << endl;
+ buffer = "var $NEWCLASS$ = Factory.loadui(\"$BASEFILENAME$.ui\", this);\n\n" + buffer;
+ buffer = FileTemplate::read(m_kjsSupport, "js") + buffer + connections;
+ kdDebug() << "buffer: " << buffer << endl;
+ QFileInfo fi(m_filename + ".js");
+ QString module = fi.baseName();
+ QString basefilename = fi.baseName(true);
+ buffer.replace(QRegExp("\\$MODULE\\$"),module);
+ buffer.replace(QRegExp("\\$FILENAME\\$"),basefilename);
+ }
+ else
+ loadBuffer(buffer,m_filename+".js");
+
+ // js - file
+
+ QString implementation =
+ "/*$SPECIALIZATION$*/\n"
+ "function $METHOD$\n"
+ "{\n"
+ "}\n";
+
+ replaceKeywords(buffer,m_canBeModal);
+ for (i=0; i<m_slots.count(); i++)
+ {
+ SlotItem *slitem = m_slots[i];
+ if (!slitem->isOn() ||
+ slitem->m_alreadyInSubclass)
+ continue;
+ QString impl = implementation;
+ replace(impl,"$RETURNTYPE$",slitem->m_returnType);
+ replace(impl,"$NEWCLASS$",m_edClassName->text());
+ replace(impl,"$METHOD$", slitem->m_methodName);
+ replace(impl,"$QTBASECLASS$", m_qtBaseClassName);
+ replace(buffer,"/*$SPECIALIZATION$*/",impl);
+ }
+ kdDebug() << buffer << endl;
+
+ if (reformat_box->isChecked())
+ buffer = m_kjsSupport->sourceFormatter()->formatSource(buffer);
+
+ if (m_creatingNewSubclass)
+ saveBuffer(buffer,m_formPath + "/" + m_edFileName->text()+".js");
+ else
+ saveBuffer(buffer,m_filename+".js");
+
+ if (m_creatingNewSubclass)
+ {
+ m_newFileNames.append(m_formPath + "/" + m_edFileName->text()+".js");
+ }
+ SubclassingDlgBase::accept();
+}
+
+void SubclassingDlg::onChangedClassName()
+//=======================================
+{
+ m_edFileName->setText(m_edClassName->text().lower());
+ if (m_edFileName->text().isEmpty() ||
+ m_edClassName->text().isEmpty())
+ m_btnOk->setEnabled(false);
+ else
+ m_btnOk->setEnabled(true);
+}
+
+QString SubclassingDlg::readBaseClassName( )
+{
+ QDomDocument doc;
+ DomUtil::openDOMFile(doc,m_formFile);
+ return DomUtil::elementByPathExt(doc,WIDGET_CLASS_NAME).text();
+}
diff --git a/languages/kjssupport/subclassingdlg.h b/languages/kjssupport/subclassingdlg.h
new file mode 100644
index 00000000..c727b648
--- /dev/null
+++ b/languages/kjssupport/subclassingdlg.h
@@ -0,0 +1,85 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Jakob Simon-Gaarde *
+ * jsgaarde@tdcspace.dk *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef SUBCLASSINGDLG_H
+#define SUBCLASSINGDLG_H
+
+#include <qlistview.h>
+
+#include "subclassingdlgbase.h"
+
+class QStringList;
+class QDomDocument;
+class kjsSupportPart;
+
+class SlotItem : public QCheckListItem
+{
+ public:
+ SlotItem(QListView *parent,const QString &text,
+ const QString &specifier, const QString &Access,
+ const QString &returnType,bool isFunc,
+ bool callBaseClass=false);
+ void setAllreadyInSubclass();
+ QString m_access;
+ QString m_methodName;
+ QString m_returnType;
+ QString m_specifier;
+ bool m_isFunc;
+ bool m_callBaseClass;
+ bool m_alreadyInSubclass;
+};
+
+
+class SubclassingDlg : public SubclassingDlgBase
+{
+public:
+ SubclassingDlg(kjsSupportPart* kjsSupport, const QString &formFile,QStringList &newFileNames,
+ QWidget* parent = 0, const char* name = 0,
+ bool modal = FALSE, WFlags fl = 0 );
+/* SubclassingDlg(CppSupportPart* kjsSupport, const QString &formFile,const QString &filename,QStringList &dummy,
+ QWidget* parent = 0, const char* name = 0,
+ bool modal = FALSE, WFlags fl = 0 );*/
+ ~SubclassingDlg();
+
+private:
+ void readUiFile();
+ QString readBaseClassName();
+ void updateDlg();
+ bool replaceKeywords(QString &buffer, bool canBeModal=true);
+ void replace(QString &string, const QString& search, const QString& replace);
+ bool saveBuffer(QString &buffer, const QString& filename);
+ bool loadBuffer(QString &buffer, const QString& filename);
+ bool alreadyInSubclass(const QString &method);
+ bool m_creatingNewSubclass;
+
+public slots:
+ virtual void accept();
+ virtual void onChangedClassName();
+
+protected:
+ QStringList &m_newFileNames;
+ QString m_filename;
+ QString m_formFile;
+ QString m_baseClassName;
+ QString m_qtBaseClassName;
+ QString m_baseCaption;
+ QString m_formName;
+ QString m_formPath;
+ QStringList m_parsedMethods;
+ bool m_canBeModal;
+ QValueList<SlotItem*> m_slots;
+ QValueList<SlotItem*> m_functions;
+ kjsSupportPart* m_kjsSupport;
+ QString connections;
+};
+
+#endif
+
diff --git a/languages/kjssupport/subclassingdlgbase.ui b/languages/kjssupport/subclassingdlgbase.ui
new file mode 100644
index 00000000..fea5ef6d
--- /dev/null
+++ b/languages/kjssupport/subclassingdlgbase.ui
@@ -0,0 +1,253 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>SubclassingDlgBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SubclassingDlgBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>588</width>
+ <height>493</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Implement Slots</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Properties</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>reformat_box</cstring>
+ </property>
+ <property name="text">
+ <string>Re&amp;format source</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="2">
+ <property name="name">
+ <cstring>reformatDefault_box</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Reformat source by &amp;default</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="3" column="0" rowspan="1" colspan="3">
+ <column>
+ <property name="text">
+ <string>Method</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Access</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Specifier</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Return Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_slotView</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Specialize following slots:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_slotView</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_edFileName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>F&amp;ile name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_edFileName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>C&amp;lass name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_edClassName</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_edClassName</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>m_btnOk</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;reate</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>m_btnCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>110</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_btnOk</sender>
+ <signal>clicked()</signal>
+ <receiver>SubclassingDlgBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>m_btnCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>SubclassingDlgBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>m_edClassName</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SubclassingDlgBase</receiver>
+ <slot>onChangedClassName()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>m_edClassName</tabstop>
+ <tabstop>m_edFileName</tabstop>
+ <tabstop>m_slotView</tabstop>
+ <tabstop>reformat_box</tabstop>
+ <tabstop>reformatDefault_box</tabstop>
+ <tabstop>m_btnOk</tabstop>
+ <tabstop>m_btnCancel</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot>onChangedClassName()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/kjssupport/template/Makefile.am b/languages/kjssupport/template/Makefile.am
new file mode 100644
index 00000000..3244188a
--- /dev/null
+++ b/languages/kjssupport/template/Makefile.am
@@ -0,0 +1,20 @@
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+commondatadir = ${appwizarddatadir}/template-common
+jshellodir = ${appwizarddatadir}/template-jshello
+templatedir = ${appwizarddatadir}/templates
+
+jshello_DATA = app.js app.kdevelop
+template_DATA = jshello
+
+DISTCLEANFILES = script.local
+EXTRA_DIST = script
+
+perl = perl
+
+script.local: ${srcdir}/script
+ cp ${srcdir}/script script.local ; \
+ perl -npi -e 's%^#\!.*$$%#!'${perl}' -I'${commondatadir}'%g;' script.local
+
+install-data-local: script.local
+ $(mkinstalldirs) $(DESTDIR)$(jshellodir)
+ $(INSTALL_DATA) script.local $(DESTDIR)$(jshellodir)/script
diff --git a/languages/kjssupport/template/app.js b/languages/kjssupport/template/app.js
new file mode 100644
index 00000000..aa564dd6
--- /dev/null
+++ b/languages/kjssupport/template/app.js
@@ -0,0 +1,18 @@
+#!/usr/bin/env kjscmd
+
+// Create main view
+var mw = new KMainWindow();
+var lv = new KListView( mw );
+mw.setCentralWidget(lv);
+
+lv.addColumn('One');
+lv.addColumn('Two');
+lv.addColumn('Three');
+
+lv.insertItem( 'Something', "Nothing", "Thing" );
+lv.insertItem( 'Something', "Nothing", "Thing" );
+lv.insertItem( 'Something', "Nothing", "Thing" );
+lv.insertItem( 'Something', "Nothing", "Thing" );
+
+mw.show();
+
diff --git a/languages/kjssupport/template/app.kdevelop b/languages/kjssupport/template/app.kdevelop
new file mode 100644
index 00000000..2bb39a0a
--- /dev/null
+++ b/languages/kjssupport/template/app.kdevelop
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>$AUTHOR$</author>
+ <email>$EMAIL$</email>
+ <version>$VERSION$</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Javascript</primarylanguage>
+ <keywords>
+ <keyword>Javascript</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevFileView</part>
+ <part>KDevdistpart</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <activedir>src</activedir>
+ <includepatterns>*.js</includepatterns>
+ <excludepatterns>*~</excludepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.js" name="Scripts" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>kde</toc>
+ <toc>gtk</toc>
+ <toc>gnustep</toc>
+ <toc>python</toc>
+ <toc>perl</toc>
+ <toc>php</toc>
+ </ignoretocs>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="js"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/kjssupport/template/jshello b/languages/kjssupport/template/jshello
new file mode 100644
index 00000000..8013b033
--- /dev/null
+++ b/languages/kjssupport/template/jshello
@@ -0,0 +1,6 @@
+# KDE Config File
+[General]
+Name=Simple KJSEmbed Script
+Category=Script
+Comment=This generates a simplistic 'Hello world' program in KJSEmbed
+FileTemplates=js,Javascript
diff --git a/languages/kjssupport/template/script b/languages/kjssupport/template/script
new file mode 100644
index 00000000..d3a808c5
--- /dev/null
+++ b/languages/kjssupport/template/script
@@ -0,0 +1,13 @@
+#!perl -I/usr/kde/3.1/share/apps/kdevappwizard/template-common
+
+use gideon;
+
+initGideon();
+
+print "Installing project file\n";
+installHTML( "${src}/template-jshello/app.kdevelop", "${dest}/${APPNAMELC}.kdevelop" );
+
+print "Installing application sources\n";
+install( "${src}/template-jshello/app.js", "${dest}/${APPNAMELC}.js" );
+
+print "Finished\n";
diff --git a/languages/kjssupport/x-javascript-source.desktop b/languages/kjssupport/x-javascript-source.desktop
new file mode 100644
index 00000000..5beeb52a
--- /dev/null
+++ b/languages/kjssupport/x-javascript-source.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+MimeType=dummy
+Hidden=true
+
diff --git a/languages/lib/Makefile.am b/languages/lib/Makefile.am
new file mode 100644
index 00000000..2bb7ebfa
--- /dev/null
+++ b/languages/lib/Makefile.am
@@ -0,0 +1,6 @@
+INCLUDES =
+METASOURCES = AUTO
+SUBDIRS = interfaces debugger designer_integration
+
+DOXYGEN_EMPTY = YES
+include ../../Doxyfile.am
diff --git a/languages/lib/debugger/Mainpage.dox b/languages/lib/debugger/Mainpage.dox
new file mode 100644
index 00000000..2e141fd3
--- /dev/null
+++ b/languages/lib/debugger/Mainpage.dox
@@ -0,0 +1,36 @@
+/**
+@mainpage The KDevelop %Debugger Support Library
+
+This library contains classes to implement debugger support for a programming language.
+
+<b>Link with</b>: -llang_debugger
+
+<b>Include path</b>: -I\$(kde_includes)/kdevelop/languages/debugger
+
+\section usingdebugger Where to use this library
+
+Each debugger support plugin must interact with an editor to set breakpoints,
+jump to execution points, etc. This kind of interaction is implemented in
+@ref Debugger class. Your debugger support plugin just need to create
+an instance of @ref Debugger class and connect its signals, for example:
+@code
+m_debugger = new Debugger( partController() );
+
+connect( m_debugger, SIGNAL(toggledBreakpoint(const QString &, int)),
+ debuggerBreakpointWidget, SLOT(slotToggleBreakpoint(const QString &, int)) );
+connect( m_debugger, SIGNAL(editedBreakpoint(const QString &, int)),
+ debuggerBreakpointWidget, SLOT(slotEditBreakpoint(const QString &, int)) );
+connect( m_debugger, SIGNAL(toggledBreakpointEnabled(const QString &, int)),
+ debuggerBreakpointWidget, SLOT(slotToggleBreakpointEnabled(const QString &, int)) );
+@endcode
+Then m_debugger instance can be used for example, to jump to the execution point:
+@code
+m_debugger->gotoExecutionPoint(fileUrl, lineNumber);
+@endcode
+or to set a breakpoint:
+@code
+m_debugger->setBreakpoint(fileName, lineNumber, id, enabled, pending);
+@endcode
+
+*/
+
diff --git a/languages/lib/debugger/Makefile.am b/languages/lib/debugger/Makefile.am
new file mode 100644
index 00000000..cdeee852
--- /dev/null
+++ b/languages/lib/debugger/Makefile.am
@@ -0,0 +1,13 @@
+INCLUDES = -I$(top_srcdir)/lib/interfaces $(all_includes)
+METASOURCES = AUTO
+lib_LTLIBRARIES = liblang_debugger.la
+liblang_debugger_la_LDFLAGS = $(all_libraries)
+liblang_debugger_la_LIBADD = $(LIB_QT) $(LIB_KDECORE) $(LIB_KPARTS) -lktexteditor
+liblang_debugger_la_SOURCES = kdevdebugger.cpp debugger.cpp
+langincludedirdir = $(includedir)/kdevelop/languages/debugger
+langincludedir_HEADERS = debugger.h kdevdebugger.h
+
+DOXYGEN_REFERENCES = dcop interfaces kdecore kdefx kdeui khtml kmdi kio kjs kparts kutils kdevinterfaces kdevutil
+DOXYGEN_PROJECTNAME = KDevelop Debugger Support Library
+DOXYGEN_DOCDIRPREFIX = kdevlang
+include ../../../Doxyfile.am
diff --git a/languages/lib/debugger/debugger.cpp b/languages/lib/debugger/debugger.cpp
new file mode 100644
index 00000000..92765efe
--- /dev/null
+++ b/languages/lib/debugger/debugger.cpp
@@ -0,0 +1,209 @@
+
+#include "debugger.h"
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <ktexteditor/document.h>
+
+// #include "editorproxy.h"
+#include <kdevpartcontroller.h>
+
+
+using namespace KTextEditor;
+
+Debugger *Debugger::s_instance = 0;
+
+Debugger::Debugger(KDevPartController *partController)
+ :m_partController(partController)
+{
+ connect( m_partController, SIGNAL(partAdded(KParts::Part*)),
+ this, SLOT(partAdded(KParts::Part*)) );
+}
+
+
+Debugger::~Debugger()
+{}
+
+
+// Debugger *Debugger::getInstance()
+// {
+// if (!s_instance)
+// s_instance = new Debugger;
+//
+// return s_instance;
+// }
+
+
+void Debugger::setBreakpoint(const QString &fileName, int lineNum, int id, bool enabled, bool pending)
+{
+ KParts::Part *part = m_partController->partForURL(KURL(fileName));
+ if( !part )
+ return;
+
+ MarkInterface *iface = dynamic_cast<MarkInterface*>(part);
+ if (!iface)
+ return;
+
+ // Temporarily disconnect so we don't get confused by receiving extra
+ // marksChanged signals
+ disconnect( part, SIGNAL(marksChanged()), this, SLOT(marksChanged()) );
+ iface->removeMark( lineNum, Breakpoint | ActiveBreakpoint | ReachedBreakpoint | DisabledBreakpoint );
+
+ BPItem bpItem(fileName, lineNum);
+ QValueList<BPItem>::Iterator it = BPList.find(bpItem);
+ if (it != BPList.end())
+ {
+// kdDebug(9012) << "Removing BP=" << fileName << ":" << lineNum << endl;
+ BPList.remove(it);
+ }
+
+ // An id of -1 means this breakpoint should be hidden from the user.
+ // I believe this functionality is not used presently.
+ if( id != -1 )
+ {
+ uint markType = Breakpoint;
+ if( !pending )
+ markType |= ActiveBreakpoint;
+ if( !enabled )
+ markType |= DisabledBreakpoint;
+ iface->addMark( lineNum, markType );
+// kdDebug(9012) << "Appending BP=" << fileName << ":" << lineNum << endl;
+ BPList.append(BPItem(fileName, lineNum));
+ }
+
+ connect( part, SIGNAL(marksChanged()), this, SLOT(marksChanged()) );
+}
+
+
+void Debugger::clearExecutionPoint()
+{
+ QPtrListIterator<KParts::Part> it(*m_partController->parts());
+ for ( ; it.current(); ++it)
+ {
+ MarkInterface *iface = dynamic_cast<MarkInterface*>(it.current());
+ if (!iface)
+ continue;
+
+ QPtrList<Mark> list = iface->marks();
+ QPtrListIterator<Mark> markIt(list);
+ for( ; markIt.current(); ++markIt )
+ {
+ Mark* mark = markIt.current();
+ if( mark->type & ExecutionPoint )
+ iface->removeMark( mark->line, ExecutionPoint );
+ }
+ }
+}
+
+
+void Debugger::gotoExecutionPoint(const KURL &url, int lineNum)
+{
+ clearExecutionPoint();
+
+ m_partController->editDocument(url, lineNum);
+
+ KParts::Part *part = m_partController->partForURL(url);
+ if( !part )
+ return;
+ MarkInterface *iface = dynamic_cast<MarkInterface*>(part);
+ if( !iface )
+ return;
+
+ iface->addMark( lineNum, ExecutionPoint );
+}
+
+void Debugger::marksChanged()
+{
+ if(sender()->inherits("KTextEditor::Document") )
+ {
+ KTextEditor::Document* doc = (KTextEditor::Document*) sender();
+ MarkInterface* iface = KTextEditor::markInterface( doc );
+
+ if (iface)
+ {
+ if( !m_partController->partForURL( doc->url() ) )
+ return; // Probably means the document is being closed.
+
+ KTextEditor::Mark *m;
+ QValueList<BPItem> oldBPList = BPList;
+ QPtrList<KTextEditor::Mark> newMarks = iface->marks();
+
+ // Compare the oldBPlist to the new list from the editor.
+ //
+ // If we don't have some of the old breakpoints in the new list
+ // then they have been moved by the user adding or removing source
+ // code. Remove these old breakpoints
+ //
+ // If we _can_ find these old breakpoints in the newlist then
+ // nothing has happened to them. We can just ignore these and to
+ // do that we must remove them from the new list.
+
+ bool bpchanged = false;
+
+ for (uint i = 0; i < oldBPList.count(); i++)
+ {
+ if (oldBPList[i].fileName() != doc->url().path())
+ continue;
+
+ bool found=false;
+ for (uint newIdx=0; newIdx < newMarks.count(); newIdx++)
+ {
+ m = newMarks.at(newIdx);
+ if ((m->type & Breakpoint) &&
+ m->line == oldBPList[i].lineNum() &&
+ doc->url().path() == oldBPList[i].fileName())
+ {
+ newMarks.remove(newIdx);
+ found=true;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ emit toggledBreakpoint( doc->url().path(), oldBPList[i].lineNum() );
+ bpchanged = true;
+ }
+ }
+
+ // Any breakpoints left in the new list are the _new_ position of
+ // the moved breakpoints. So add these as new breakpoints via
+ // toggling them.
+ for (uint i = 0; i < newMarks.count(); i++)
+ {
+ m = newMarks.at(i);
+ if (m->type & Breakpoint)
+ {
+ emit toggledBreakpoint( doc->url().path(), m->line );
+ bpchanged = true;
+ }
+ }
+
+ if ( bpchanged && m_partController->activePart() == doc )
+ {
+ //bring focus back to the editor
+ m_partController->activatePart( doc );
+ }
+ }
+ }
+}
+
+
+void Debugger::partAdded( KParts::Part* part )
+{
+ MarkInterfaceExtension *iface = dynamic_cast<MarkInterfaceExtension*>(part);
+ if( !iface )
+ return;
+
+ iface->setDescription((MarkInterface::MarkTypes)Breakpoint, i18n("Breakpoint"));
+ iface->setPixmap((MarkInterface::MarkTypes)Breakpoint, *inactiveBreakpointPixmap());
+ iface->setPixmap((MarkInterface::MarkTypes)ActiveBreakpoint, *activeBreakpointPixmap());
+ iface->setPixmap((MarkInterface::MarkTypes)ReachedBreakpoint, *reachedBreakpointPixmap());
+ iface->setPixmap((MarkInterface::MarkTypes)DisabledBreakpoint, *disabledBreakpointPixmap());
+ iface->setPixmap((MarkInterface::MarkTypes)ExecutionPoint, *executionPointPixmap());
+ iface->setMarksUserChangable( Bookmark | Breakpoint );
+
+ connect( part, SIGNAL(marksChanged()), this, SLOT(marksChanged()) );
+}
+
+#include "debugger.moc"
diff --git a/languages/lib/debugger/debugger.h b/languages/lib/debugger/debugger.h
new file mode 100644
index 00000000..ed545f28
--- /dev/null
+++ b/languages/lib/debugger/debugger.h
@@ -0,0 +1,132 @@
+#ifndef __DEBUGGER_H__
+#define __DEBUGGER_H__
+
+#include <qvaluelist.h>
+
+#include "kdevdebugger.h"
+
+#include <kparts/part.h>
+#include <ktexteditor/markinterface.h>
+
+#include <kdeversion.h>
+#include <ktexteditor/markinterfaceextension.h>
+
+class KDevPartController;
+
+/**
+* Describes a single breakpoint in the system
+*
+* This is used so that we can track the breakpoints and move them appropriately
+* as the user adds or removes lines of code before breakpoints.
+*/
+
+class BPItem
+{
+public:
+ /**
+ * default ctor - required from QValueList
+ */
+ BPItem() : m_fileName(""), m_lineNum(0)
+ {}
+
+ BPItem( const QString& fileName, const uint lineNum)
+ : m_fileName(fileName),
+ m_lineNum(lineNum)
+ {}
+
+ uint lineNum() const { return m_lineNum; }
+ QString fileName() const { return m_fileName; }
+
+ bool operator==( const BPItem& rhs ) const
+ {
+ return (m_fileName == rhs.m_fileName
+ && m_lineNum == rhs.m_lineNum);
+ }
+
+private:
+ QString m_fileName;
+ uint m_lineNum;
+};
+
+
+/**
+* Handles signals from the editor that relate to breakpoints and the execution
+* point of the debugger.
+* We may change, add or remove breakpoints in this class.
+*/
+class Debugger : public KDevDebugger
+{
+ Q_OBJECT
+
+public:
+
+ /**
+ */
+// static Debugger *getInstance();
+
+ /**
+ * Controls the breakpoint icon being displayed in the editor through the
+ * markinterface
+ *
+ * @param fileName The breakpoint is added or removed from this file
+ * @param lineNum ... at this line number
+ * @param id This is an internal id. which has a special number
+ * that prevents us changing the mark icon. (why?)
+ * @param enabled The breakpoint could be enabled, disabled
+ * @param pending pending or active. Each state has a different icon.
+ */
+ void setBreakpoint(const QString &fileName, int lineNum,
+ int id, bool enabled, bool pending);
+
+ /**
+ * Displays an icon in the file at the line that the debugger has stoped
+ * at.
+ * @param url The file the debugger has stopped at.
+ * @param lineNum The line number to display. Note: We may not know it.
+ */
+ void gotoExecutionPoint(const KURL &url, int lineNum=-1);
+
+ /**
+ * Remove the executution point being displayed.
+ */
+ void clearExecutionPoint();
+
+// protected:
+
+ Debugger(KDevPartController *partController);
+ ~Debugger();
+
+private slots:
+
+ /**
+ * Whenever a new part is added this slot gets triggered and we then
+ * look for a MarkInterfaceExtension part. When it is a
+ * MarkInterfaceExtension part we set the various pixmaps of the
+ * breakpoint icons.
+ */
+ void partAdded( KParts::Part* part );
+
+ /**
+ * Called by the TextEditor interface when the marks have changed position
+ * because the user has added or removed source.
+ * In here we figure out if we need to reset the breakpoints due to
+ * these source changes.
+ */
+ void marksChanged();
+
+private:
+ enum MarkType {
+ Bookmark = KTextEditor::MarkInterface::markType01,
+ Breakpoint = KTextEditor::MarkInterface::markType02,
+ ActiveBreakpoint = KTextEditor::MarkInterface::markType03,
+ ReachedBreakpoint = KTextEditor::MarkInterface::markType04,
+ DisabledBreakpoint = KTextEditor::MarkInterface::markType05,
+ ExecutionPoint = KTextEditor::MarkInterface::markType06
+ };
+
+ static Debugger *s_instance;
+ KDevPartController *m_partController;
+ QValueList<BPItem> BPList;
+};
+
+#endif
diff --git a/languages/lib/debugger/kdevdebugger.cpp b/languages/lib/debugger/kdevdebugger.cpp
new file mode 100644
index 00000000..01b4d4f7
--- /dev/null
+++ b/languages/lib/debugger/kdevdebugger.cpp
@@ -0,0 +1,182 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ Copyright (C) 2002 John Firebaugh <jfirebaugh@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+#include "kdevdebugger.h"
+
+KDevDebugger::KDevDebugger(QObject *parent, const char *name)
+ : QObject(parent, name)
+{
+}
+
+
+KDevDebugger::~KDevDebugger()
+{
+}
+
+const QPixmap* KDevDebugger::inactiveBreakpointPixmap()
+{
+ const char*breakpoint_gr_xpm[]={
+ "11 16 6 1",
+ "c c #c6c6c6",
+ "d c #2c2c2c",
+ "# c #000000",
+ ". c None",
+ "a c #ffffff",
+ "b c #555555",
+ "...........",
+ "...........",
+ "...#####...",
+ "..#aaaaa#..",
+ ".#abbbbbb#.",
+ "#abbbbbbbb#",
+ "#abcacacbd#",
+ "#abbbbbbbb#",
+ "#abcacacbd#",
+ "#abbbbbbbb#",
+ ".#bbbbbbb#.",
+ "..#bdbdb#..",
+ "...#####...",
+ "...........",
+ "...........",
+ "..........."};
+ static QPixmap pixmap( breakpoint_gr_xpm );
+ return &pixmap;
+}
+
+const QPixmap* KDevDebugger::activeBreakpointPixmap()
+{
+ const char* breakpoint_xpm[]={
+ "11 16 6 1",
+ "c c #c6c6c6",
+ ". c None",
+ "# c #000000",
+ "d c #840000",
+ "a c #ffffff",
+ "b c #ff0000",
+ "...........",
+ "...........",
+ "...#####...",
+ "..#aaaaa#..",
+ ".#abbbbbb#.",
+ "#abbbbbbbb#",
+ "#abcacacbd#",
+ "#abbbbbbbb#",
+ "#abcacacbd#",
+ "#abbbbbbbb#",
+ ".#bbbbbbb#.",
+ "..#bdbdb#..",
+ "...#####...",
+ "...........",
+ "...........",
+ "..........."};
+ static QPixmap pixmap( breakpoint_xpm );
+ return &pixmap;
+}
+
+const QPixmap* KDevDebugger::reachedBreakpointPixmap()
+{
+ const char*breakpoint_bl_xpm[]={
+ "11 16 7 1",
+ "a c #c0c0ff",
+ "# c #000000",
+ "c c #0000c0",
+ "e c #0000ff",
+ "b c #dcdcdc",
+ "d c #ffffff",
+ ". c None",
+ "...........",
+ "...........",
+ "...#####...",
+ "..#ababa#..",
+ ".#bcccccc#.",
+ "#acccccccc#",
+ "#bcadadace#",
+ "#acccccccc#",
+ "#bcadadace#",
+ "#acccccccc#",
+ ".#ccccccc#.",
+ "..#cecec#..",
+ "...#####...",
+ "...........",
+ "...........",
+ "..........."};
+ static QPixmap pixmap( breakpoint_bl_xpm );
+ return &pixmap;
+}
+
+const QPixmap* KDevDebugger::disabledBreakpointPixmap()
+{
+ const char*breakpoint_wh_xpm[]={
+ "11 16 7 1",
+ "a c #c0c0ff",
+ "# c #000000",
+ "c c #0000c0",
+ "e c #0000ff",
+ "b c #dcdcdc",
+ "d c #ffffff",
+ ". c None",
+ "...........",
+ "...........",
+ "...#####...",
+ "..#ddddd#..",
+ ".#ddddddd#.",
+ "#ddddddddd#",
+ "#ddddddddd#",
+ "#ddddddddd#",
+ "#ddddddddd#",
+ "#ddddddddd#",
+ ".#ddddddd#.",
+ "..#ddddd#..",
+ "...#####...",
+ "...........",
+ "...........",
+ "..........."};
+ static QPixmap pixmap( breakpoint_wh_xpm );
+ return &pixmap;
+}
+
+const QPixmap* KDevDebugger::executionPointPixmap()
+{
+ const char*exec_xpm[]={
+ "11 16 4 1",
+ "a c #00ff00",
+ "b c #000000",
+ ". c None",
+ "# c #00c000",
+ "...........",
+ "...........",
+ "...........",
+ "#a.........",
+ "#aaa.......",
+ "#aaaaa.....",
+ "#aaaaaaa...",
+ "#aaaaaaaaa.",
+ "#aaaaaaa#b.",
+ "#aaaaa#b...",
+ "#aaa#b.....",
+ "#a#b.......",
+ "#b.........",
+ "...........",
+ "...........",
+ "..........."};
+ static QPixmap pixmap( exec_xpm );
+ return &pixmap;
+}
+
+#include "kdevdebugger.moc"
diff --git a/languages/lib/debugger/kdevdebugger.h b/languages/lib/debugger/kdevdebugger.h
new file mode 100644
index 00000000..24bd2c7b
--- /dev/null
+++ b/languages/lib/debugger/kdevdebugger.h
@@ -0,0 +1,88 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ Copyright (C) 2002 John Firebaugh <jfirebaugh@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+#ifndef _KDEVDEBUGGER_H_
+#define _KDEVDEBUGGER_H_
+
+
+#include <qobject.h>
+#include <qpixmap.h>
+
+
+#include <kurl.h>
+
+/**
+* Base class to handle signals from the editor that relate to breakpoints
+* and the execution point of the debugger.
+*/
+class KDevDebugger : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ KDevDebugger(QObject *parent=0, const char *name=0);
+ ~KDevDebugger();
+
+ /**
+ * Sets a breakpoint in the editor document belong to fileName.
+ * If id==-1, the breakpoint is deleted.
+ */
+ virtual void setBreakpoint(const QString &fileName, int lineNum,
+ int id, bool enabled, bool pending) = 0;
+
+ /**
+ * Goes to a given location in a source file and marks the line.
+ * This is used by the debugger to mark the location where the
+ * the debugger has stopped.
+ */
+ virtual void gotoExecutionPoint(const KURL &url, int lineNum=0) = 0;
+
+ /**
+ * Clear the execution point. Usefull if debugging has ended.
+ */
+ virtual void clearExecutionPoint() = 0;
+
+ static const QPixmap* inactiveBreakpointPixmap();
+ static const QPixmap* activeBreakpointPixmap();
+ static const QPixmap* reachedBreakpointPixmap();
+ static const QPixmap* disabledBreakpointPixmap();
+ static const QPixmap* executionPointPixmap();
+
+signals:
+
+ /**
+ * The user has toggled a breakpoint.
+ */
+ void toggledBreakpoint(const QString &fileName, int lineNum);
+
+ /*
+ * The user wants to edit the properties of a breakpoint.
+ */
+ void editedBreakpoint(const QString &fileName, int lineNum);
+
+ /**
+ * The user wants to enable/disable a breakpoint.
+ */
+ void toggledBreakpointEnabled(const QString &fileName, int lineNum);
+
+};
+
+
+#endif
diff --git a/languages/lib/designer_integration/Mainpage.dox b/languages/lib/designer_integration/Mainpage.dox
new file mode 100644
index 00000000..1f2db949
--- /dev/null
+++ b/languages/lib/designer_integration/Mainpage.dox
@@ -0,0 +1,48 @@
+/**
+@mainpage The KDevelop Designer Integration Support Library
+
+This library contains base classes to implement GUI designer integration in language support plugins.
+
+<b>Link with</b>: -ldesignerintegration
+
+<b>Include path</b>: -I\$(kde_includes)/languages/designer_integration
+
+\section usingintegration Using designer integration support library
+Each language support which wants to use integrated designer, must reimplement
+@code
+virtual KDevDesignerIntegration *KDevLanguageSupport::designer(KInterfaceDesigner::DesignerType type)
+@endcode
+method and return designer integration object (@ref KDevLanguageSupport base class returns 0).
+
+Qt designer integration can be easily implemented by reusing @ref QtDesignerIntegration
+base class.
+
+For example, designer method of a language support could look like:
+@code
+KDevDesignerIntegration * MyLanguageSupportPart::designer(KInterfaceDesigner::DesignerType type)
+{
+ KDevDesignerIntegration *des = 0;
+ switch (type)
+ {
+ case KInterfaceDesigner::QtDesigner:
+ des = m_designers[type];
+ if (des == 0)
+ {
+ MyLanguageImplementationWidget *impl = new MyLanguageImplementationWidget(this);
+ des = new MyLanguageQtDesignerIntegration(this, impl);
+ m_designers[type] = des;
+ }
+ break;
+ }
+ return des;
+}
+return des;
+@endcode
+In the code above m_designers is a designer cache declared as:
+@code
+QMap<KInterfaceDesigner::DesignerType, KDevDesignerIntegration*> m_designers;
+@endcode
+MyLanguageImplementationWidget and MyLanguageQtDesignerIntegration classes are subclasses
+of @ref QtDesignerIntegration and @ref ImplementationWidget base classes.
+*/
+
diff --git a/languages/lib/designer_integration/Makefile.am b/languages/lib/designer_integration/Makefile.am
new file mode 100644
index 00000000..cab66420
--- /dev/null
+++ b/languages/lib/designer_integration/Makefile.am
@@ -0,0 +1,16 @@
+INCLUDES = -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+METASOURCES = AUTO
+libdesignerintegration_la_LDFLAGS = $(all_libraries)
+lib_LTLIBRARIES = libdesignerintegration.la
+libdesignerintegration_la_LIBADD = $(top_builddir)/lib/interfaces/libkdevinterfaces.la $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI)
+libdesignerintegration_la_SOURCES = implementationwidgetbase.ui \
+ implementationwidget.cpp qtdesignerintegration.cpp
+
+langincludedirdir = $(includedir)/kdevelop/languages/designer_integration
+langincludedir_HEADERS = qtdesignerintegration.h implementationwidget.h implementationwidgetbase.h
+
+DOXYGEN_REFERENCES = dcop interfaces kdecore kdefx kdeui khtml kmdi kio kjs kparts kutils kdevinterfaces kdevutil
+DOXYGEN_PROJECTNAME = KDevelop Designer Integration Support Library
+include ../../../Doxyfile.am
diff --git a/languages/lib/designer_integration/implementationwidget.cpp b/languages/lib/designer_integration/implementationwidget.cpp
new file mode 100644
index 00000000..7c561e7c
--- /dev/null
+++ b/languages/lib/designer_integration/implementationwidget.cpp
@@ -0,0 +1,158 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "implementationwidget.h"
+
+#include <qfileinfo.h>
+#include <qtextstream.h>
+#include <qfile.h>
+#include <qdir.h>
+#include <qregexp.h>
+#include <qdom.h>
+#include <qradiobutton.h>
+
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <klistview.h>
+
+#include <kdevproject.h>
+#include <domutil.h>
+#include <filetemplate.h>
+#include <kdevlanguagesupport.h>
+
+namespace ImplUtils{
+class ClassItem: public KListViewItem{
+public:
+ ClassItem(KListViewItem *parent, ClassDom dom)
+ :KListViewItem(parent, dom->name(), dom->fileName()), m_dom(dom) { setOpen(true); }
+ ClassItem(KListView *parent, ClassDom dom)
+ :KListViewItem(parent, dom->name(), dom->fileName()), m_dom(dom) { setOpen(true); }
+ ClassDom dom() const { return m_dom; }
+private:
+ ClassDom m_dom;
+};
+
+class NamespaceItem: public KListViewItem{
+public:
+ NamespaceItem(KListViewItem *parent, NamespaceDom dom)
+ :KListViewItem(parent, dom->name(), dom->fileName()), m_dom(dom) { setOpen(true); }
+ NamespaceItem(KListView *parent, NamespaceDom dom)
+ :KListViewItem(parent, dom->name(), dom->fileName()), m_dom(dom) { setOpen(true); }
+ NamespaceDom dom() const { return m_dom; }
+private:
+ NamespaceDom m_dom;
+};
+}
+
+ImplementationWidget::ImplementationWidget(KDevLanguageSupport *part, QWidget* parent, const char* name, bool modal)
+ :CreateImplemenationWidgetBase(parent, name, modal), m_part(part)
+{
+}
+
+void ImplementationWidget::init(const QString &formName)
+{
+ m_formName = formName;
+
+ classView->clear();
+ fileNameEdit->clear();
+ classNameEdit->clear();
+
+ QDomDocument doc;
+ DomUtil::openDOMFile(doc, m_formName);
+ m_baseClassName = DomUtil::elementByPathExt(doc, "class").text();
+ setCaption(i18n("Create or Select Implementation Class for: %1").arg(m_baseClassName));
+
+ KListViewItem *item = new KListViewItem(classView, i18n("Namespaces &amp;&amp; Classes"));
+ item->setOpen(true);
+ processNamespaces(m_part->codeModel()->globalNamespace(), item);
+}
+
+void ImplementationWidget::processNamespaces(NamespaceDom dom, KListViewItem *parent)
+{
+ const NamespaceList nslist = dom->namespaceList();
+ for (NamespaceList::const_iterator it = nslist.begin(); it != nslist.end(); ++it)
+ processNamespaces(*it, new ImplUtils::NamespaceItem(parent, *it));
+ const ClassList cllist = dom->classList();
+ for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
+ processClasses(*it, new ImplUtils::ClassItem(parent, *it));
+}
+
+void ImplementationWidget::processClasses(ClassDom dom, KListViewItem *parent)
+{
+ const ClassList cllist = dom->classList();
+ for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
+ processClasses(*it, new ImplUtils::ClassItem(parent, *it));
+}
+
+ImplementationWidget::~ImplementationWidget()
+{
+}
+
+/*$SPECIALIZATION$*/
+void ImplementationWidget::classNameChanged(const QString &text)
+{
+ fileNameEdit->setText(text.lower());
+}
+
+void ImplementationWidget::accept()
+{
+ if (createButton->isOn())
+ {
+ if (classNameEdit->text().isEmpty())
+ return;
+ if (!createClass())
+ return;
+ ClassList cllist = m_part->codeModel()->globalNamespace()->classByName(classNameEdit->text());
+ if (cllist.count() > 0)
+ m_selectedClass = cllist.first();
+ else
+ KMessageBox::error(0, i18n("Class was created but not found in class store."));
+ }
+ else if (useButton->isOn())
+ {
+ if (!classView->currentItem())
+ return;
+ ImplUtils::ClassItem *item = dynamic_cast<ImplUtils::ClassItem*>(classView->currentItem());
+ if (!item)
+ return;
+ m_selectedClass = item->dom();
+ }
+ QDialog::accept();
+}
+
+ClassDom ImplementationWidget::selectedClass()
+{
+ return m_selectedClass;
+}
+
+bool ImplementationWidget::createClass()
+{
+ m_part->project()->addFiles(createClassFiles());
+ return true;
+}
+
+int ImplementationWidget::exec(const QString &formName)
+{
+ init(formName);
+ return QDialog::exec();
+}
+
+#include "implementationwidget.moc"
+
diff --git a/languages/lib/designer_integration/implementationwidget.h b/languages/lib/designer_integration/implementationwidget.h
new file mode 100644
index 00000000..3200c877
--- /dev/null
+++ b/languages/lib/designer_integration/implementationwidget.h
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+
+#ifndef IMPLEMENTATIONWIDGET_H
+#define IMPLEMENTATIONWIDGET_H
+
+#include "implementationwidgetbase.h"
+
+#include <codemodel.h>
+
+class KListViewItem;
+class KDevLanguageSupport;
+
+/**
+Base class for implementation creation widgets.
+Contains language-independent implementation widget that can be used
+to create or select an implementation of a form in designer.
+
+Implementations could be subclasses or simple files with callbacks, etc.
+
+Subclasses of this class should reimplement only pure virtual functions in the common case.
+*/
+class ImplementationWidget : public CreateImplemenationWidgetBase
+{
+Q_OBJECT
+public:
+ ImplementationWidget(KDevLanguageSupport *part, QWidget* parent = 0, const char* name = 0, bool modal = false);
+ virtual ~ImplementationWidget();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ /**@returns The %DOM of selected (or created) class.*/
+ ClassDom selectedClass();
+
+ /**Executes implementation widget for a form @p formName.*/
+ int exec(const QString &formName);
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+ /**Sets up the dialog. No need to reimplement unless you want to restrict
+ the number of classes being displayed as possible implementation classes.*/
+ void init(const QString &formName);
+
+ void processNamespaces(NamespaceDom dom, KListViewItem *parent);
+ void processClasses(ClassDom dom, KListViewItem *parent);
+
+ /**Creates a class and adds it to a project. No need to reimplement.*/
+ bool createClass();
+
+ /**Reimplement to create actual files with the form implementation.
+ @return The list of absolute paths to a files created.*/
+ virtual QStringList createClassFiles() = 0;
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ virtual void classNameChanged(const QString &text);
+ virtual void accept();
+
+protected:
+ KDevLanguageSupport *m_part;
+ ClassDom m_selectedClass;
+ QString m_formName;
+ QString m_baseClassName;
+};
+
+#endif
+
diff --git a/languages/lib/designer_integration/implementationwidgetbase.ui b/languages/lib/designer_integration/implementationwidgetbase.ui
new file mode 100644
index 00000000..1a39d39e
--- /dev/null
+++ b/languages/lib/designer_integration/implementationwidgetbase.ui
@@ -0,0 +1,267 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>CreateImplemenationWidgetBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CreateImplemenationWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>518</width>
+ <height>353</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Create or Select Implementation Class</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup" row="0" column="0">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>createButton</cstring>
+ </property>
+ <property name="text">
+ <string>Create &amp;new class</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KListView" row="4" column="0">
+ <column>
+ <property name="text">
+ <string>Class Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>File</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>classView</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>classNameLabel</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;lass name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>classNameEdit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>classNameEdit</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QRadioButton" row="3" column="0">
+ <property name="name">
+ <cstring>useButton</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;existing class</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layout2_2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>fileNameLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;File name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fileNameEdit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>fileNameEdit</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>CreateImplemenationWidgetBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>CreateImplemenationWidgetBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>createButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>classNameLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>createButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>classNameEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>useButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>classView</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>createButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>fileNameLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>createButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>fileNameEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>classNameEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CreateImplemenationWidgetBase</receiver>
+ <slot>classNameChanged(const QString&amp;)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>createButton</tabstop>
+ <tabstop>classNameEdit</tabstop>
+ <tabstop>fileNameEdit</tabstop>
+ <tabstop>classView</tabstop>
+ <tabstop>okButton</tabstop>
+ <tabstop>cancelButton</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">classNameChanged(const QString &amp;)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/lib/designer_integration/qtdesignerintegration.cpp b/languages/lib/designer_integration/qtdesignerintegration.cpp
new file mode 100644
index 00000000..32dc16ca
--- /dev/null
+++ b/languages/lib/designer_integration/qtdesignerintegration.cpp
@@ -0,0 +1,195 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "qtdesignerintegration.h"
+
+#include <qpair.h>
+#include <qregexp.h>
+#include <qfileinfo.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+
+#include <rurl.h>
+#include <domutil.h>
+#include <kdevpartcontroller.h>
+#include <kdevcreatefile.h>
+#include <kdevlanguagesupport.h>
+#include <kdevproject.h>
+
+#include "codemodel_utils.h"
+#include "implementationwidget.h"
+
+QtDesignerIntegration::QtDesignerIntegration(KDevLanguageSupport *part, ImplementationWidget *impl, bool classHasDefinitions, const char* name)
+ :KDevDesignerIntegration(part, name), m_part(part), m_impl(impl),
+ m_classHasDefinitions(classHasDefinitions)
+{
+}
+
+QtDesignerIntegration::~QtDesignerIntegration()
+{
+ delete m_impl;
+}
+
+void QtDesignerIntegration::addFunction(const QString& formName, KInterfaceDesigner::Function function)
+{
+ kdDebug() << "QtDesignerIntegration::addFunction: form: " << formName << ", function: " << function.function << endl;
+
+ if (!m_implementations.contains(formName))
+ if (!selectImplementation(formName))
+ return;
+
+ ClassDom klass = m_implementations[formName];
+ if (!klass)
+ {
+ KMessageBox::error(0, i18n("Cannot find implementation class for form: %1").arg(formName));
+ return;
+ }
+
+ addFunctionToClass(function, klass);
+}
+
+void QtDesignerIntegration::editFunction(const QString& formName, KInterfaceDesigner::Function oldFunction, KInterfaceDesigner::Function function)
+{
+ kdDebug() << "QtDesignerIntegration::editFunction: form: " << formName
+ << ", old function: " << oldFunction.function
+ << ", function: " << function.function << endl;
+}
+
+void QtDesignerIntegration::removeFunction(const QString& formName, KInterfaceDesigner::Function function)
+{
+ kdDebug() << "QtDesignerIntegration::removeFunction: form: " << formName << ", function: " << function.function << endl;
+}
+
+bool QtDesignerIntegration::selectImplementation(const QString &formName)
+{
+ QFileInfo fi(formName);
+ if (!fi.exists())
+ return false;
+
+ if (m_impl->exec(formName))
+ {
+ m_implementations[formName] = m_impl->selectedClass();
+ return true;
+ }
+ return false;
+}
+
+void QtDesignerIntegration::loadSettings(QDomDocument dom, QString path)
+{
+ QDomElement el = DomUtil::elementByPath(dom, path + "/qtdesigner");
+ if (el.isNull())
+ return;
+ QDomNodeList impls = el.elementsByTagName("implementation");
+ for (uint i = 0; i < impls.count(); ++i)
+ {
+ QDomElement el = impls.item(i).toElement();
+ if (el.isNull())
+ continue;
+ QString implementationPath = Relative::File(m_part->project()->projectDirectory(),
+ el.attribute("implementationpath"), true).urlPath();
+ FileDom file = m_part->codeModel()->fileByName(implementationPath);
+ if (!file)
+ continue;
+ ClassList cllist = file->classByName(el.attribute("class"));
+ QString uiPath = Relative::File(m_part->project()->projectDirectory(),
+ el.attribute("path"), true).urlPath();
+ if (cllist.count() > 0)
+ m_implementations[uiPath] = cllist.first();
+ }
+}
+
+void QtDesignerIntegration::saveSettings(QDomDocument dom, QString path)
+{
+ kdDebug() << "QtDesignerIntegration::saveSettings" << endl;
+ QDomElement el = DomUtil::createElementByPath(dom, path + "/qtdesigner");
+ for (QMap<QString, ClassDom>::const_iterator it = m_implementations.begin();
+ it != m_implementations.end(); ++it)
+ {
+ QDomElement il = dom.createElement("implementation");
+ el.appendChild(il);
+ il.setAttribute("path",
+ Relative::File(m_part->project()->projectDirectory(), it.key()).rurl());
+ il.setAttribute("implementationpath",
+ Relative::File(m_part->project()->projectDirectory(), it.data()->fileName()).rurl());
+ il.setAttribute("class", it.data()->name());
+ }
+}
+
+void QtDesignerIntegration::openFunction(const QString &formName, const QString &functionName)
+{
+ kdDebug() << "QtDesignerIntegration::openFunction, formName = " << formName
+ << ", functionName = " << functionName << endl;
+ QString fn = functionName;
+ if (fn.find("(") > 0)
+ fn.remove(fn.find("("), fn.length());
+
+ if (!m_implementations[formName])
+ return;
+
+ int line = -1, col = -1;
+
+ QString impl = m_implementations[formName]->fileName();
+ processImplementationName(impl);
+
+ if (m_part->codeModel()->hasFile(impl))
+ {
+ if (m_classHasDefinitions)
+ {
+ FunctionDefinitionList list =
+ m_part->codeModel()->fileByName(impl)->functionDefinitionList();
+ for (FunctionDefinitionList::const_iterator it = list.begin(); it != list.end(); ++it)
+ {
+ if ((*it)->name() == fn)
+ (*it)->getStartPosition(&line, &col);
+ }
+ }
+ else
+ {
+ FunctionList list =
+ m_part->codeModel()->fileByName(impl)->functionList();
+ for (FunctionList::const_iterator it = list.begin(); it != list.end(); ++it)
+ {
+ if ((*it)->name() == fn)
+ (*it)->getStartPosition(&line, &col);
+ }
+ }
+ }
+
+ m_part->partController()->editDocument(KURL(impl), line, col);
+}
+
+void QtDesignerIntegration::processImplementationName(QString &// name
+ )
+{
+}
+
+void QtDesignerIntegration::openSource(const QString &formName)
+{
+ if (!m_implementations.contains(formName))
+ if (!selectImplementation(formName))
+ return;
+ QString impl = m_implementations[formName]->fileName();
+ processImplementationName(impl);
+ m_part->partController()->editDocument(KURL(impl), -1, -1);
+}
+
+#include "qtdesignerintegration.moc"
diff --git a/languages/lib/designer_integration/qtdesignerintegration.h b/languages/lib/designer_integration/qtdesignerintegration.h
new file mode 100644
index 00000000..fd8b512f
--- /dev/null
+++ b/languages/lib/designer_integration/qtdesignerintegration.h
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef QTDESIGNERINTEGRATION_H
+#define QTDESIGNERINTEGRATION_H
+
+#include <qmap.h>
+
+#include <codemodel.h>
+#include "kdevdesignerintegration.h"
+
+class KDevLanguageSupport;
+class ImplementationWidget;
+
+/**
+Qt Designer integration base class.
+Contains language-independent implementation part of a @ref KDevDesignerIntegration interface.
+Ready to use in KDevelop language support plugins.
+
+Subclasses of this class should reimplement only pure virtual functions in the common case.
+*/
+class QtDesignerIntegration : public KDevDesignerIntegration
+{
+Q_OBJECT
+public:
+ QtDesignerIntegration(KDevLanguageSupport *part, ImplementationWidget *impl,
+ bool classHasDefinitions, const char* name = 0);
+ virtual ~QtDesignerIntegration();
+
+public slots:
+ virtual void addFunction(const QString& formName, KInterfaceDesigner::Function function);
+ virtual void editFunction(const QString& formName, KInterfaceDesigner::Function oldFunction, KInterfaceDesigner::Function function);
+ virtual void removeFunction(const QString& formName, KInterfaceDesigner::Function function);
+
+ virtual void openFunction(const QString &formName, const QString &functionName);
+
+ virtual void openSource(const QString &formName);
+
+ virtual void saveSettings(QDomDocument dom, QString path);
+ virtual void loadSettings(QDomDocument dom, QString path);
+
+ bool selectImplementation(const QString &formName);
+
+protected:
+ /**Reimplement this to add a function to a class. This means you need to modify
+ the source file and add actual code of a function.*/
+ virtual void addFunctionToClass(KInterfaceDesigner::Function function, ClassDom klass) = 0;
+ /**Modifies name to be a name of a implementation file for languages that have
+ separate files for interface and implementation parts of a class. For example,
+ C++ language support plugin will do:
+ @code
+ name.replace(".h", ".cpp");
+ @endcode*/
+ virtual void processImplementationName(QString &name);
+
+ //Form file - derived class name
+ QMap<QString, ClassDom> m_implementations;
+
+ KDevLanguageSupport *m_part;
+ ImplementationWidget *m_impl;
+ bool m_classHasDefinitions;
+};
+
+#endif
diff --git a/languages/lib/interfaces/Mainpage.dox b/languages/lib/interfaces/Mainpage.dox
new file mode 100644
index 00000000..f31c4bfc
--- /dev/null
+++ b/languages/lib/interfaces/Mainpage.dox
@@ -0,0 +1,10 @@
+/**
+@mainpage The KDevelop Language Support Interfaces Library
+
+This library contains interfaces for KDevelop language support facilities.
+
+<b>Link with</b>: -llang_interfaces
+
+<b>Include path</b>: -I\$(kde_includes)/kdevelop/languages/interfaces
+*/
+
diff --git a/languages/lib/interfaces/Makefile.am b/languages/lib/interfaces/Makefile.am
new file mode 100644
index 00000000..2ccbac75
--- /dev/null
+++ b/languages/lib/interfaces/Makefile.am
@@ -0,0 +1,16 @@
+
+METASOURCES = AUTO
+langincludedirdir = $(includedir)/kdevelop/languages/interfaces
+lib_LTLIBRARIES = liblang_interfaces.la
+liblang_interfaces_la_LDFLAGS = $(all_libraries)
+liblang_interfaces_la_SOURCES = kdevpcsimporter.cpp
+liblang_interfaces_la_LIBADD = $(LIB_QT)
+langincludedir_HEADERS = kdevpcsimporter.h
+INCLUDES = $(all_includes)
+servicetypedir = $(kde_servicetypesdir)
+servicetype_DATA = kdeveloppcsimporter.desktop
+
+DOXYGEN_REFERENCES = dcop interfaces kdecore kdefx kdeui khtml kmdi kio kjs kparts kutils kdevinterfaces kdevutil
+DOXYGEN_PROJECTNAME = KDevelop Language Support Interfaces Library
+DOXYGEN_DOCDIRPREFIX = kdevlang
+include ../../../Doxyfile.am
diff --git a/languages/lib/interfaces/kdeveloppcsimporter.desktop b/languages/lib/interfaces/kdeveloppcsimporter.desktop
new file mode 100644
index 00000000..bbf0f490
--- /dev/null
+++ b/languages/lib/interfaces/kdeveloppcsimporter.desktop
@@ -0,0 +1,39 @@
+[Desktop Entry]
+Type=ServiceType
+X-KDE-ServiceType=KDevelop/PCSImporter
+X-KDE-Derived=KDevelop/Plugin
+Name=KDevelop PCS Importer
+Name[ca]=Importador PCS per a KDevelop
+Name[da]=KDevelop PCS importør
+Name[de]=PCS-Importierer (KDevelop)
+Name[el]=Εισαγωγέας PCS KDevelop
+Name[es]=Importación PCS de KDevelop
+Name[et]=KDevelopi PCS importija
+Name[eu]=KDevelop PCS inportatzailea
+Name[fa]=واردکنندۀ KDevelop PCS
+Name[fr]=Importation PCS pour KDevelop
+Name[ga]=Iompórtálaí PCS KDevelop
+Name[gl]=Importador PCS de KDevelop
+Name[hi]=के-डेवलप पीसीà¤à¤¸ आयातक
+Name[hu]=KDevelop PCS-importáló
+Name[ja]=KDevelop PCS インãƒãƒ¼ã‚¿
+Name[nds]=PCS-Import (KDevelop)
+Name[ne]=केडीई विकास PCS आयातकरà¥à¤¤à¤¾
+Name[nl]=KDevelop PCS importeren
+Name[pl]=KDevelop: import PCS
+Name[pt]=Importador de PCS do KDevelop
+Name[pt_BR]=Importador PCS para o KDevelop
+Name[ru]=Загрузчик в хранилище клаÑÑов
+Name[sk]=KDevelop PCS import
+Name[sl]=Uvažanje PCS za KDevelop
+Name[sr]=KDevelop-ов PCS увозник
+Name[sr@Latn]=KDevelop-ov PCS uvoznik
+Name[sv]=KDevelop PCS-import
+Name[ta]=KDevelop pcs à®à®±à¯à®±à¯à®®à®¤à®¿à®¯à®¾à®³à®°à¯
+Name[tg]=Пурборкунанда дар анбори Ñинфӣ
+Name[tr]=KDevelop PCS Aktarıcısı
+Name[zh_CN]=KDevelop PCS导入器
+Name[zh_TW]=KDevelop PCS 匯入器
+
+[PropertyDef::X-KDevelop-PCSImporter]
+Type=QString
diff --git a/languages/lib/interfaces/kdevpcsimporter.cpp b/languages/lib/interfaces/kdevpcsimporter.cpp
new file mode 100644
index 00000000..de8a8632
--- /dev/null
+++ b/languages/lib/interfaces/kdevpcsimporter.cpp
@@ -0,0 +1,36 @@
+/* This file is part of KDevelop
+ Copyright (C) 2003 Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include "kdevpcsimporter.h"
+#include "kdevpcsimporter.moc"
+
+KDevPCSImporter::KDevPCSImporter( QObject * parent, const char * name )
+ : QObject( parent, name )
+{
+}
+
+KDevPCSImporter::~ KDevPCSImporter( )
+{
+}
+
+QWidget * KDevPCSImporter::createSettingsPage( QWidget * /*parent*/, const char * /*name*/ )
+{
+ return 0;
+}
+
diff --git a/languages/lib/interfaces/kdevpcsimporter.h b/languages/lib/interfaces/kdevpcsimporter.h
new file mode 100644
index 00000000..8493b9e3
--- /dev/null
+++ b/languages/lib/interfaces/kdevpcsimporter.h
@@ -0,0 +1,49 @@
+/* This file is part of KDevelop
+ Copyright (C) 2003 Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef KDEVPCSIMPORTER_H
+#define KDEVPCSIMPORTER_H
+
+#include <qobject.h>
+#include <qstringlist.h>
+
+class QWidget;
+
+/**
+KDevelop persistent class store importer plugin.
+
+These plugins are used by language support plugins to fill symbol stores
+with symbol information from certain files. The purpose of the importer
+is to provide file selection wizard.
+*/
+class KDevPCSImporter: public QObject
+{
+ Q_OBJECT
+public:
+ KDevPCSImporter( QObject* parent=0, const char* name=0 );
+ virtual ~KDevPCSImporter();
+
+ virtual QString dbName() const = 0;
+ virtual QStringList includePaths() = 0;
+ virtual QStringList fileList() = 0;
+
+ virtual QWidget* createSettingsPage( QWidget* parent, const char* name=0 );
+};
+
+#endif // KDEVPCSIMPORTER_H
diff --git a/languages/pascal/Makefile.am b/languages/pascal/Makefile.am
new file mode 100644
index 00000000..5abaa01b
--- /dev/null
+++ b/languages/pascal/Makefile.am
@@ -0,0 +1,33 @@
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+
+INCLUDES = -I$(top_srcdir)/lib/antlr -I$(top_srcdir)/lib/catalog \
+ -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+SUBDIRS = file_templates app_templates compiler doc
+
+kde_module_LTLIBRARIES = libkdevpascalsupport.la
+libkdevpascalsupport_la_LDFLAGS = $(LEXLIB) $(all_libraries) $(KDE_PLUGIN)
+libkdevpascalsupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la $(top_builddir)/lib/antlr/src/libantlr.la $(top_builddir)/lib/catalog/libkdevcatalog.la
+
+libkdevpascalsupport_la_SOURCES = pascalsupport_part.cpp PascalLexer.cpp PascalParser.cpp PascalStoreWalker.cpp backgroundparser.cpp configproblemreporter.ui problemreporter.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevpascalsupport.desktop
+
+rcdir = $(kde_datadir)/kdevpascalsupport
+rc_DATA = kdevpascalsupport.rc
+
+genparser:
+ antlr pascal.g && antlr pascal.tree.g
+
+## The following rules assume that you have Java and ANTLR installed,
+#PascalLexer.hpp PascalLexer.cpp PascalParser.hpp PascalParser.cpp: pascal.g
+# antlr pascal.g
+
+#PascalStoreWalker.hpp PascalStoreWalker.cpp: pascal.tree.g
+# antlr pascal.tree.g
+
+templatedir = ${kde_datadir}/kdevabbrev/templates
+template_DATA = pascaltemplates
diff --git a/languages/pascal/PascalAST.hpp b/languages/pascal/PascalAST.hpp
new file mode 100644
index 00000000..3df4ea50
--- /dev/null
+++ b/languages/pascal/PascalAST.hpp
@@ -0,0 +1,51 @@
+#ifndef PASCALAST_HPP
+#define PASCALAST_HPP
+
+#include <antlr/CommonAST.hpp>
+
+class PascalAST;
+typedef antlr::ASTRefCount<PascalAST> RefPascalAST;
+
+class PascalAST : public antlr::CommonAST {
+public:
+ PascalAST()
+ : m_line(0), m_column(0) {}
+
+ ~PascalAST() {}
+
+ int getLine() const { return m_line; }
+ void setLine( int line ) { m_line = line; }
+
+ int getColumn() const { return m_column; }
+ void setColumn( int column ) { m_column = column; }
+
+ void initialize( antlr::RefToken t ) {
+ antlr::CommonAST::initialize(t);
+ m_line = t->getLine() - 1;
+ m_column = t->getColumn() - 1;
+ }
+
+ void initialize(int t,const ANTLR_USE_NAMESPACE(std)string& txt) {
+ setType(t);
+ setText(txt);
+ m_line = 0;
+ m_column = 0;
+ }
+
+ void addChild( RefPascalAST c ) {
+ antlr::RefAST n( c.get() );
+ antlr::BaseAST::addChild( n );
+ }
+
+ static antlr::RefAST factory( void ) {
+ RefPascalAST n(new PascalAST);
+ return n.get();
+ }
+
+private:
+ int m_line;
+ int m_column;
+};
+
+
+#endif
diff --git a/languages/pascal/PascalLexer.cpp b/languages/pascal/PascalLexer.cpp
new file mode 100644
index 00000000..28f532f8
--- /dev/null
+++ b/languages/pascal/PascalLexer.cpp
@@ -0,0 +1,1309 @@
+/* $ANTLR 2.7.7 (20061129): "pascal.g" -> "PascalLexer.cpp"$ */
+#include "PascalLexer.hpp"
+#include <antlr/CharBuffer.hpp>
+#include <antlr/TokenStreamException.hpp>
+#include <antlr/TokenStreamIOException.hpp>
+#include <antlr/TokenStreamRecognitionException.hpp>
+#include <antlr/CharStreamException.hpp>
+#include <antlr/CharStreamIOException.hpp>
+#include <antlr/NoViableAltForCharException.hpp>
+
+#line 1 "pascal.g"
+#line 13 "PascalLexer.cpp"
+PascalLexer::PascalLexer(ANTLR_USE_NAMESPACE(std)istream& in)
+ : ANTLR_USE_NAMESPACE(antlr)CharScanner(new ANTLR_USE_NAMESPACE(antlr)CharBuffer(in),false)
+{
+ initLiterals();
+}
+
+PascalLexer::PascalLexer(ANTLR_USE_NAMESPACE(antlr)InputBuffer& ib)
+ : ANTLR_USE_NAMESPACE(antlr)CharScanner(ib,false)
+{
+ initLiterals();
+}
+
+PascalLexer::PascalLexer(const ANTLR_USE_NAMESPACE(antlr)LexerSharedInputState& state)
+ : ANTLR_USE_NAMESPACE(antlr)CharScanner(state,false)
+{
+ initLiterals();
+}
+
+void PascalLexer::initLiterals()
+{
+ literals["until"] = 146;
+ literals["xor"] = 123;
+ literals["abstract"] = 99;
+ literals["shortint"] = 69;
+ literals["with"] = 150;
+ literals["packed"] = 91;
+ literals["inherited"] = 172;
+ literals["break"] = 168;
+ literals["smallint"] = 70;
+ literals["safecall"] = 64;
+ literals["constructor"] = 102;
+ literals["continue"] = 169;
+ literals["uses"] = 30;
+ literals["for"] = 147;
+ literals["else"] = 142;
+ literals["is"] = 119;
+ literals["of"] = 51;
+ literals["and"] = 128;
+ literals["integer"] = 68;
+ literals["byte"] = 73;
+ literals["nil"] = 161;
+ literals["begin"] = 34;
+ literals["interface"] = 32;
+ literals["as"] = 165;
+ literals["div"] = 126;
+ literals["write"] = 110;
+ literals["qword"] = 76;
+ literals["procedure"] = 47;
+ literals["shl"] = 129;
+ literals["var"] = 45;
+ literals["private"] = 100;
+ literals["function"] = 49;
+ literals["unit"] = 31;
+ literals["downto"] = 149;
+ literals["name"] = 29;
+ literals["resourcestring"] = 42;
+ literals["register"] = 57;
+ literals["popstack"] = 61;
+ literals["label"] = 40;
+ literals["try"] = 155;
+ literals["raise"] = 154;
+ literals["not"] = 131;
+ literals["record"] = 92;
+ literals["forward"] = 48;
+ literals["in"] = 118;
+ literals["except"] = 156;
+ literals["file"] = 95;
+ literals["operator"] = 153;
+ literals["pascal"] = 58;
+ literals["finalization"] = 39;
+ literals["cdecl"] = 59;
+ literals["extended"] = 86;
+ literals["external"] = 52;
+ literals["destructor"] = 103;
+ literals["real"] = 83;
+ literals["virtual"] = 98;
+ literals["chr"] = 160;
+ literals["near"] = 65;
+ literals["object"] = 97;
+ literals["public"] = 53;
+ literals["repeat"] = 145;
+ literals["library"] = 23;
+ literals["false"] = 133;
+ literals["longint"] = 71;
+ literals["saveregisters"] = 62;
+ literals["to"] = 148;
+ literals["asm"] = 166;
+ literals["case"] = 93;
+ literals["export"] = 56;
+ literals["true"] = 132;
+ literals["do"] = 144;
+ literals["stdcall"] = 60;
+ literals["program"] = 35;
+ literals["absolute"] = 164;
+ literals["override"] = 105;
+ literals["then"] = 141;
+ literals["set"] = 94;
+ literals["protected"] = 101;
+ literals["or"] = 122;
+ literals["word"] = 74;
+ literals["finally"] = 157;
+ literals["char"] = 80;
+ literals["if"] = 140;
+ literals["far"] = 66;
+ literals["const"] = 41;
+ literals["index"] = 28;
+ literals["assembler"] = 167;
+ literals["cardinal"] = 75;
+ literals["string"] = 88;
+ literals["dispose"] = 170;
+ literals["read"] = 109;
+ literals["default"] = 111;
+ literals["new"] = 173;
+ literals["array"] = 50;
+ literals["self"] = 174;
+ literals["end"] = 25;
+ literals["single"] = 84;
+ literals["property"] = 108;
+ literals["mod"] = 127;
+ literals["goto"] = 139;
+ literals["on"] = 158;
+ literals["comp"] = 87;
+ literals["initialization"] = 38;
+ literals["class"] = 104;
+ literals["int64"] = 72;
+ literals["published"] = 107;
+ literals["nodefault"] = 112;
+ literals["inline"] = 63;
+ literals["while"] = 143;
+ literals["boolean"] = 77;
+ literals["type"] = 44;
+ literals["double"] = 85;
+ literals["implementation"] = 33;
+ literals["exports"] = 26;
+ literals["alias"] = 54;
+ literals["exit"] = 171;
+ literals["shr"] = 130;
+}
+
+ANTLR_USE_NAMESPACE(antlr)RefToken PascalLexer::nextToken()
+{
+ ANTLR_USE_NAMESPACE(antlr)RefToken theRetToken;
+ for (;;) {
+ ANTLR_USE_NAMESPACE(antlr)RefToken theRetToken;
+ int _ttype = ANTLR_USE_NAMESPACE(antlr)Token::INVALID_TYPE;
+ resetText();
+ try { // for lexical and char stream error handling
+ switch ( LA(1)) {
+ case 0x2c /* ',' */ :
+ {
+ mCOMMA(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x3b /* ';' */ :
+ {
+ mSEMI(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x3d /* '=' */ :
+ {
+ mEQUAL(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x29 /* ')' */ :
+ {
+ mRPAREN(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x5b /* '[' */ :
+ {
+ mLBRACK(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x5d /* ']' */ :
+ {
+ mRBRACK(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x5e /* '^' */ :
+ {
+ mPOINTER(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x40 /* '@' */ :
+ {
+ mAT(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x7d /* '}' */ :
+ {
+ mRCURLY(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x9 /* '\t' */ :
+ case 0xa /* '\n' */ :
+ case 0xc /* '\14' */ :
+ case 0xd /* '\r' */ :
+ case 0x20 /* ' ' */ :
+ {
+ mWS(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ case 0x67 /* 'g' */ :
+ case 0x68 /* 'h' */ :
+ case 0x69 /* 'i' */ :
+ case 0x6a /* 'j' */ :
+ case 0x6b /* 'k' */ :
+ case 0x6c /* 'l' */ :
+ case 0x6d /* 'm' */ :
+ case 0x6e /* 'n' */ :
+ case 0x6f /* 'o' */ :
+ case 0x70 /* 'p' */ :
+ case 0x71 /* 'q' */ :
+ case 0x72 /* 'r' */ :
+ case 0x73 /* 's' */ :
+ case 0x74 /* 't' */ :
+ case 0x75 /* 'u' */ :
+ case 0x76 /* 'v' */ :
+ case 0x77 /* 'w' */ :
+ case 0x78 /* 'x' */ :
+ case 0x79 /* 'y' */ :
+ case 0x7a /* 'z' */ :
+ {
+ mIDENT(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x27 /* '\'' */ :
+ {
+ mSTRING_LITERAL(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ mNUM_INT(true);
+ theRetToken=_returnToken;
+ break;
+ }
+ default:
+ if ((LA(1) == 0x3a /* ':' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mASSIGN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3e /* '>' */ )) {
+ mNOT_EQUAL(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mLE(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mGE(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x28 /* '(' */ ) && (LA(2) == 0x2e /* '.' */ )) {
+ mLBRACK2(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2e /* '.' */ ) && (LA(2) == 0x29 /* ')' */ )) {
+ mRBRACK2(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2b /* '+' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mPLUSEQ(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2d /* '-' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mMINUSEQ(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2a /* '*' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mSTAREQ(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2f /* '/' */ ) && (LA(2) == 0x3d /* '=' */ )) {
+ mSLASHQE(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x28 /* '(' */ ) && (LA(2) == 0x2a /* '*' */ )) {
+ mCOMMENT_1(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x7b /* '{' */ ) && ((LA(2) >= 0x0 /* '\0' */ && LA(2) <= 0xff))) {
+ mCOMMENT_2(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2f /* '/' */ ) && (LA(2) == 0x2f /* '/' */ )) {
+ mCOMMENT_3(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2b /* '+' */ ) && (true)) {
+ mPLUS(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2d /* '-' */ ) && (true)) {
+ mMINUS(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2a /* '*' */ ) && (true)) {
+ mSTAR(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2f /* '/' */ ) && (true)) {
+ mSLASH(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3a /* ':' */ ) && (true)) {
+ mCOLON(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3c /* '<' */ ) && (true)) {
+ mLTH(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x3e /* '>' */ ) && (true)) {
+ mGT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x28 /* '(' */ ) && (true)) {
+ mLPAREN(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x2e /* '.' */ ) && (true)) {
+ mDOT(true);
+ theRetToken=_returnToken;
+ }
+ else if ((LA(1) == 0x7b /* '{' */ ) && (true)) {
+ mLCURLY(true);
+ theRetToken=_returnToken;
+ }
+ else {
+ if (LA(1)==EOF_CHAR)
+ {
+ uponEOF();
+ _returnToken = makeToken(ANTLR_USE_NAMESPACE(antlr)Token::EOF_TYPE);
+ }
+ else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+ }
+ if ( !_returnToken )
+ goto tryAgain; // found SKIP token
+
+ _ttype = _returnToken->getType();
+ _returnToken->setType(_ttype);
+ return _returnToken;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& e) {
+ throw ANTLR_USE_NAMESPACE(antlr)TokenStreamRecognitionException(e);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)CharStreamIOException& csie) {
+ throw ANTLR_USE_NAMESPACE(antlr)TokenStreamIOException(csie.io);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)CharStreamException& cse) {
+ throw ANTLR_USE_NAMESPACE(antlr)TokenStreamException(cse.getMessage());
+ }
+tryAgain:;
+ }
+}
+
+void PascalLexer::mPLUS(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = PLUS;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('+' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mMINUS(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = MINUS;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('-' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mSTAR(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = STAR;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('*' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mSLASH(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SLASH;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('/' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mASSIGN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = ASSIGN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(":=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mCOMMA(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COMMA;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(',' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mSEMI(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SEMI;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(';' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mCOLON(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COLON;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(':' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mEQUAL(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = EQUAL;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('=' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mNOT_EQUAL(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = NOT_EQUAL;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("<>");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mLTH(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LTH;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('<' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mLE(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LE;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("<=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mGE(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = GE;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(">=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mGT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = GT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('>' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mLPAREN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LPAREN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('(' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mRPAREN(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = RPAREN;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(')' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mLBRACK(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LBRACK;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('[' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mLBRACK2(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LBRACK2;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("(.");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mRBRACK(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = RBRACK;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(']' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mRBRACK2(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = RBRACK2;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match(".)");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mPOINTER(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = POINTER;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('^' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mAT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = AT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('@' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mDOT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = DOT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('.' /* charlit */ );
+ {
+ if ((LA(1) == 0x2e /* '.' */ )) {
+ match('.' /* charlit */ );
+#line 1124 "pascal.g"
+ _ttype = DOTDOT;
+#line 719 "PascalLexer.cpp"
+ }
+ else {
+ }
+
+ }
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mLCURLY(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = LCURLY;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("{");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mRCURLY(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = RCURLY;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("}");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mPLUSEQ(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = PLUSEQ;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("+=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mMINUSEQ(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = MINUSEQ;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("-=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mSTAREQ(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = STAREQ;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("*=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mSLASHQE(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = SLASHQE;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("/=");
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mWS(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = WS;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ switch ( LA(1)) {
+ case 0x20 /* ' ' */ :
+ {
+ match(' ' /* charlit */ );
+ break;
+ }
+ case 0x9 /* '\t' */ :
+ {
+ match('\t' /* charlit */ );
+ break;
+ }
+ case 0xc /* '\14' */ :
+ {
+ match('\14' /* charlit */ );
+ break;
+ }
+ case 0xa /* '\n' */ :
+ case 0xd /* '\r' */ :
+ {
+ {
+ if ((LA(1) == 0xd /* '\r' */ ) && (LA(2) == 0xa /* '\n' */ )) {
+ match("\r\n");
+ }
+ else if ((LA(1) == 0xd /* '\r' */ ) && (true)) {
+ match('\r' /* charlit */ );
+ }
+ else if ((LA(1) == 0xa /* '\n' */ )) {
+ match('\n' /* charlit */ );
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+
+ }
+#line 1142 "pascal.g"
+ newline();
+#line 859 "PascalLexer.cpp"
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+#line 1144 "pascal.g"
+ _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP;
+#line 870 "PascalLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mCOMMENT_1(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COMMENT_1;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("(*");
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == 0xd /* '\r' */ ) && (LA(2) == 0xa /* '\n' */ ) && ((LA(3) >= 0x0 /* '\0' */ && LA(3) <= 0xff)) && ((LA(4) >= 0x0 /* '\0' */ && LA(4) <= 0xff))) {
+ match('\r' /* charlit */ );
+ match('\n' /* charlit */ );
+#line 1152 "pascal.g"
+ newline();
+#line 892 "PascalLexer.cpp"
+ }
+ else if (((LA(1) == 0x2a /* '*' */ ) && ((LA(2) >= 0x0 /* '\0' */ && LA(2) <= 0xff)) && ((LA(3) >= 0x0 /* '\0' */ && LA(3) <= 0xff)))&&( LA(2) != ')' )) {
+ match('*' /* charlit */ );
+ }
+ else if ((LA(1) == 0xd /* '\r' */ ) && ((LA(2) >= 0x0 /* '\0' */ && LA(2) <= 0xff)) && ((LA(3) >= 0x0 /* '\0' */ && LA(3) <= 0xff)) && (true)) {
+ match('\r' /* charlit */ );
+#line 1153 "pascal.g"
+ newline();
+#line 901 "PascalLexer.cpp"
+ }
+ else if ((LA(1) == 0xa /* '\n' */ )) {
+ match('\n' /* charlit */ );
+#line 1154 "pascal.g"
+ newline();
+#line 907 "PascalLexer.cpp"
+ }
+ else if ((_tokenSet_0.member(LA(1)))) {
+ {
+ match(_tokenSet_0);
+ }
+ }
+ else {
+ goto _loop427;
+ }
+
+ }
+ _loop427:;
+ } // ( ... )*
+ match("*)");
+#line 1158 "pascal.g"
+ _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP;
+#line 924 "PascalLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mCOMMENT_2(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COMMENT_2;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('{' /* charlit */ );
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == 0xd /* '\r' */ ) && (LA(2) == 0xa /* '\n' */ ) && ((LA(3) >= 0x0 /* '\0' */ && LA(3) <= 0xff)) && (true)) {
+ match('\r' /* charlit */ );
+ match('\n' /* charlit */ );
+#line 1164 "pascal.g"
+ newline();
+#line 946 "PascalLexer.cpp"
+ }
+ else if ((LA(1) == 0xd /* '\r' */ ) && ((LA(2) >= 0x0 /* '\0' */ && LA(2) <= 0xff)) && (true) && (true)) {
+ match('\r' /* charlit */ );
+#line 1165 "pascal.g"
+ newline();
+#line 952 "PascalLexer.cpp"
+ }
+ else if ((LA(1) == 0xa /* '\n' */ )) {
+ match('\n' /* charlit */ );
+#line 1166 "pascal.g"
+ newline();
+#line 958 "PascalLexer.cpp"
+ }
+ else if ((_tokenSet_1.member(LA(1)))) {
+ {
+ match(_tokenSet_1);
+ }
+ }
+ else {
+ goto _loop431;
+ }
+
+ }
+ _loop431:;
+ } // ( ... )*
+ match('}' /* charlit */ );
+#line 1170 "pascal.g"
+ _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP;
+#line 975 "PascalLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mCOMMENT_3(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = COMMENT_3;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match("//");
+ { // ( ... )*
+ for (;;) {
+ if ((_tokenSet_2.member(LA(1)))) {
+ matchNot('\n' /* charlit */ );
+ }
+ else {
+ goto _loop434;
+ }
+
+ }
+ _loop434:;
+ } // ( ... )*
+ match('\n' /* charlit */ );
+#line 1175 "pascal.g"
+ _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP;
+#line 1005 "PascalLexer.cpp"
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mIDENT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = IDENT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ matchRange('a','z');
+ }
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case 0x61 /* 'a' */ :
+ case 0x62 /* 'b' */ :
+ case 0x63 /* 'c' */ :
+ case 0x64 /* 'd' */ :
+ case 0x65 /* 'e' */ :
+ case 0x66 /* 'f' */ :
+ case 0x67 /* 'g' */ :
+ case 0x68 /* 'h' */ :
+ case 0x69 /* 'i' */ :
+ case 0x6a /* 'j' */ :
+ case 0x6b /* 'k' */ :
+ case 0x6c /* 'l' */ :
+ case 0x6d /* 'm' */ :
+ case 0x6e /* 'n' */ :
+ case 0x6f /* 'o' */ :
+ case 0x70 /* 'p' */ :
+ case 0x71 /* 'q' */ :
+ case 0x72 /* 'r' */ :
+ case 0x73 /* 's' */ :
+ case 0x74 /* 't' */ :
+ case 0x75 /* 'u' */ :
+ case 0x76 /* 'v' */ :
+ case 0x77 /* 'w' */ :
+ case 0x78 /* 'x' */ :
+ case 0x79 /* 'y' */ :
+ case 0x7a /* 'z' */ :
+ {
+ matchRange('a','z');
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ matchRange('0','9');
+ break;
+ }
+ case 0x5f /* '_' */ :
+ {
+ match('_' /* charlit */ );
+ break;
+ }
+ default:
+ {
+ goto _loop438;
+ }
+ }
+ }
+ _loop438:;
+ } // ( ... )*
+ _ttype = testLiteralsTable(_ttype);
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mSTRING_LITERAL(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = STRING_LITERAL;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ match('\'' /* charlit */ );
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == 0x27 /* '\'' */ ) && (LA(2) == 0x27 /* '\'' */ )) {
+ match("\'\'");
+ }
+ else if ((_tokenSet_3.member(LA(1)))) {
+ {
+ match(_tokenSet_3);
+ }
+ }
+ else {
+ goto _loop442;
+ }
+
+ }
+ _loop442:;
+ } // ( ... )*
+ match('\'' /* charlit */ );
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+/** a numeric literal. Form is (from Wirth)
+ * digits
+ * digits . digits
+ * digits . digits exponent
+ * digits exponent
+ */
+void PascalLexer::mNUM_INT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = NUM_INT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ { // ( ... )+
+ int _cnt445=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ matchRange('0','9');
+ }
+ else {
+ if ( _cnt445>=1 ) { goto _loop445; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt445++;
+ }
+ _loop445:;
+ } // ( ... )+
+ {
+ if ((LA(1) == 0x65 /* 'e' */ )) {
+ mEXPONENT(false);
+#line 1204 "pascal.g"
+ _ttype = NUM_REAL;
+#line 1153 "PascalLexer.cpp"
+ }
+ else {
+ {
+ if (((LA(1) == 0x2e /* '.' */ ))&&((LA(2)!='.')&&(LA(2)!=')'))) {
+ match('.' /* charlit */ );
+#line 1201 "pascal.g"
+ _ttype = NUM_REAL;
+#line 1161 "PascalLexer.cpp"
+ { // ( ... )+
+ int _cnt449=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ matchRange('0','9');
+ }
+ else {
+ if ( _cnt449>=1 ) { goto _loop449; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt449++;
+ }
+ _loop449:;
+ } // ( ... )+
+ {
+ if ((LA(1) == 0x65 /* 'e' */ )) {
+ mEXPONENT(false);
+ }
+ else {
+ }
+
+ }
+ }
+ else {
+ }
+
+ }
+ }
+
+ }
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+void PascalLexer::mEXPONENT(bool _createToken) {
+ int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length();
+ _ttype = EXPONENT;
+ ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex;
+
+ {
+ match('e' /* charlit */ );
+ }
+ {
+ switch ( LA(1)) {
+ case 0x2b /* '+' */ :
+ {
+ match('+' /* charlit */ );
+ break;
+ }
+ case 0x2d /* '-' */ :
+ {
+ match('-' /* charlit */ );
+ break;
+ }
+ case 0x30 /* '0' */ :
+ case 0x31 /* '1' */ :
+ case 0x32 /* '2' */ :
+ case 0x33 /* '3' */ :
+ case 0x34 /* '4' */ :
+ case 0x35 /* '5' */ :
+ case 0x36 /* '6' */ :
+ case 0x37 /* '7' */ :
+ case 0x38 /* '8' */ :
+ case 0x39 /* '9' */ :
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ { // ( ... )+
+ int _cnt455=0;
+ for (;;) {
+ if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
+ matchRange('0','9');
+ }
+ else {
+ if ( _cnt455>=1 ) { goto _loop455; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt455++;
+ }
+ _loop455:;
+ } // ( ... )+
+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
+ _token = makeToken(_ttype);
+ _token->setText(text.substr(_begin, text.length()-_begin));
+ }
+ _returnToken = _token;
+ _saveIndex=0;
+}
+
+
+const unsigned long PascalLexer::_tokenSet_0_data_[] = { 4294958079UL, 4294966271UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12
+// 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f !
+// \" # $ % & \' ( ) + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C
+// D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a b c d
+// e f g h i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81 0x82
+// 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90
+// 0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c 0x9d 0x9e
+// 0x9f 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab 0xac
+// 0xad 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9 0xba
+// 0xbb 0xbc 0xbd
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalLexer::_tokenSet_0(_tokenSet_0_data_,16);
+const unsigned long PascalLexer::_tokenSet_1_data_[] = { 4294958079UL, 4294967295UL, 4294967295UL, 3758096383UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12
+// 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f !
+// \" # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B
+// C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a b c
+// d e f g h i j k l m n o p q r s t u v w x y z { | ~ 0x7f 0x80 0x81 0x82
+// 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90
+// 0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c 0x9d 0x9e
+// 0x9f 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab 0xac
+// 0xad 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9 0xba
+// 0xbb 0xbc 0xbd
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalLexer::_tokenSet_1(_tokenSet_1_data_,16);
+const unsigned long PascalLexer::_tokenSet_2_data_[] = { 4294966271UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xd 0xe 0xf 0x10 0x11
+// 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f
+// ! \" # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @
+// A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a
+// b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80
+// 0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e
+// 0x8f 0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c
+// 0x9d 0x9e 0x9f 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa
+// 0xab 0xac 0xad 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8
+// 0xb9 0xba 0xbb 0xbc 0xbd
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalLexer::_tokenSet_2(_tokenSet_2_data_,16);
+const unsigned long PascalLexer::_tokenSet_3_data_[] = { 4294967295UL, 4294967167UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10
+// 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e
+// 0x1f ! \" # $ % & ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+// @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ `
+// a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80
+// 0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e
+// 0x8f 0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c
+// 0x9d 0x9e 0x9f 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa
+// 0xab 0xac 0xad 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8
+// 0xb9 0xba 0xbb 0xbc 0xbd
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalLexer::_tokenSet_3(_tokenSet_3_data_,16);
+
diff --git a/languages/pascal/PascalLexer.hpp b/languages/pascal/PascalLexer.hpp
new file mode 100644
index 00000000..f63ac84d
--- /dev/null
+++ b/languages/pascal/PascalLexer.hpp
@@ -0,0 +1,121 @@
+#ifndef INC_PascalLexer_hpp_
+#define INC_PascalLexer_hpp_
+
+#line 29 "pascal.g"
+
+ #include "problemreporter.h"
+ #include "PascalAST.hpp"
+
+ #include <qlistview.h>
+ #include <kdebug.h>
+
+ #define SET_POSITION(ast,t)\
+ { \
+ RefPascalAST(ast)->setLine( t->getLine() );\
+ RefPascalAST(ast)->setColumn( t->getColumn() ); \
+ }
+
+#line 19 "PascalLexer.hpp"
+#include <antlr/config.hpp>
+/* $ANTLR 2.7.7 (20061129): "pascal.g" -> "PascalLexer.hpp"$ */
+#include <antlr/CommonToken.hpp>
+#include <antlr/InputBuffer.hpp>
+#include <antlr/BitSet.hpp>
+#include "PascalTokenTypes.hpp"
+#include <antlr/CharScanner.hpp>
+class CUSTOM_API PascalLexer : public ANTLR_USE_NAMESPACE(antlr)CharScanner, public PascalTokenTypes
+{
+#line 1067 "pascal.g"
+
+private:
+ ProblemReporter* m_problemReporter;
+ unsigned int m_numberOfErrors;
+
+public:
+ void resetErrors() { m_numberOfErrors = 0; }
+ unsigned int numberOfErrors() const { return m_numberOfErrors; }
+ void setProblemReporter( ProblemReporter* r ) { m_problemReporter = r; }
+
+ virtual void reportError( const ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex ){
+ m_problemReporter->reportError( ex.getMessage().c_str(),
+ ex.getFilename().c_str(),
+ ex.getLine(),
+ ex.getColumn() );
+ ++m_numberOfErrors;
+ }
+
+ virtual void reportError( const ANTLR_USE_NAMESPACE(std)string& errorMessage ){
+ m_problemReporter->reportError( errorMessage.c_str(),
+ getFilename().c_str(),
+ getLine(), getColumn() );
+ ++m_numberOfErrors;
+ }
+
+ virtual void reportWarning( const ANTLR_USE_NAMESPACE(std)string& warnMessage ){
+ m_problemReporter->reportWarning( warnMessage.c_str(),
+ getFilename().c_str(),
+ getLine(), getColumn() );
+ }
+#line 30 "PascalLexer.hpp"
+private:
+ void initLiterals();
+public:
+ bool getCaseSensitiveLiterals() const
+ {
+ return false;
+ }
+public:
+ PascalLexer(ANTLR_USE_NAMESPACE(std)istream& in);
+ PascalLexer(ANTLR_USE_NAMESPACE(antlr)InputBuffer& ib);
+ PascalLexer(const ANTLR_USE_NAMESPACE(antlr)LexerSharedInputState& state);
+ ANTLR_USE_NAMESPACE(antlr)RefToken nextToken();
+ public: void mPLUS(bool _createToken);
+ public: void mMINUS(bool _createToken);
+ public: void mSTAR(bool _createToken);
+ public: void mSLASH(bool _createToken);
+ public: void mASSIGN(bool _createToken);
+ public: void mCOMMA(bool _createToken);
+ public: void mSEMI(bool _createToken);
+ public: void mCOLON(bool _createToken);
+ public: void mEQUAL(bool _createToken);
+ public: void mNOT_EQUAL(bool _createToken);
+ public: void mLTH(bool _createToken);
+ public: void mLE(bool _createToken);
+ public: void mGE(bool _createToken);
+ public: void mGT(bool _createToken);
+ public: void mLPAREN(bool _createToken);
+ public: void mRPAREN(bool _createToken);
+ public: void mLBRACK(bool _createToken);
+ public: void mLBRACK2(bool _createToken);
+ public: void mRBRACK(bool _createToken);
+ public: void mRBRACK2(bool _createToken);
+ public: void mPOINTER(bool _createToken);
+ public: void mAT(bool _createToken);
+ public: void mDOT(bool _createToken);
+ public: void mLCURLY(bool _createToken);
+ public: void mRCURLY(bool _createToken);
+ public: void mPLUSEQ(bool _createToken);
+ public: void mMINUSEQ(bool _createToken);
+ public: void mSTAREQ(bool _createToken);
+ public: void mSLASHQE(bool _createToken);
+ public: void mWS(bool _createToken);
+ public: void mCOMMENT_1(bool _createToken);
+ public: void mCOMMENT_2(bool _createToken);
+ public: void mCOMMENT_3(bool _createToken);
+ public: void mIDENT(bool _createToken);
+ public: void mSTRING_LITERAL(bool _createToken);
+ public: void mNUM_INT(bool _createToken);
+ protected: void mEXPONENT(bool _createToken);
+private:
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+ static const unsigned long _tokenSet_2_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2;
+ static const unsigned long _tokenSet_3_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3;
+};
+
+#endif /*INC_PascalLexer_hpp_*/
diff --git a/languages/pascal/PascalParser.cpp b/languages/pascal/PascalParser.cpp
new file mode 100644
index 00000000..172f4a49
--- /dev/null
+++ b/languages/pascal/PascalParser.cpp
@@ -0,0 +1,9744 @@
+/* $ANTLR 2.7.7 (20061129): "pascal.g" -> "PascalParser.cpp"$ */
+#include "PascalParser.hpp"
+#include <antlr/NoViableAltException.hpp>
+#include <antlr/SemanticException.hpp>
+#include <antlr/ASTFactory.hpp>
+#line 1 "pascal.g"
+#line 8 "PascalParser.cpp"
+PascalParser::PascalParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf, int k)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(tokenBuf,k)
+{
+}
+
+PascalParser::PascalParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(tokenBuf,2)
+{
+}
+
+PascalParser::PascalParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer, int k)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(lexer,k)
+{
+}
+
+PascalParser::PascalParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(lexer,2)
+{
+}
+
+PascalParser::PascalParser(const ANTLR_USE_NAMESPACE(antlr)ParserSharedInputState& state)
+: ANTLR_USE_NAMESPACE(antlr)LLkParser(state,2)
+{
+}
+
+void PascalParser::compilationUnit() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST compilationUnit_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case PROGRAM:
+ {
+ program();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ compilationUnit_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case LIBRARY:
+ {
+ library();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ compilationUnit_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case UNIT:
+ {
+ unit();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ compilationUnit_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_0);
+ } else {
+ throw;
+ }
+ }
+ returnAST = compilationUnit_AST;
+}
+
+void PascalParser::program() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST program_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ programHeading();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case USES:
+ {
+ usesClause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case BEGIN:
+ case LABEL:
+ case CONST:
+ case RESOURCESTRING:
+ case TYPE:
+ case VAR:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ block();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(DOT);
+ program_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_0);
+ } else {
+ throw;
+ }
+ }
+ returnAST = program_AST;
+}
+
+void PascalParser::library() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST library_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp2_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp2_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp2_AST));
+ }
+ match(LIBRARY);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ {
+ switch ( LA(1)) {
+ case USES:
+ {
+ usesClause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case EXPORTS:
+ case BEGIN:
+ case LABEL:
+ case CONST:
+ case RESOURCESTRING:
+ case TYPE:
+ case VAR:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ libraryBlock();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ exportsClause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(END);
+ match(DOT);
+ library_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_0);
+ } else {
+ throw;
+ }
+ }
+ returnAST = library_AST;
+}
+
+void PascalParser::unit() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST unit_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp6_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp6_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp6_AST));
+ }
+ match(UNIT);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ interfacePart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ implementationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case INITIALIZATION:
+ {
+ {
+ initializationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case FINALIZATION:
+ {
+ finalizationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ break;
+ }
+ case BEGIN:
+ {
+ realizationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(END);
+ unit_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_0);
+ } else {
+ throw;
+ }
+ }
+ returnAST = unit_AST;
+}
+
+void PascalParser::programHeading() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST programHeading_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp9_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp9_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp9_AST));
+ }
+ match(PROGRAM);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ match(LPAREN);
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ programHeading_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_1);
+ } else {
+ throw;
+ }
+ }
+ returnAST = programHeading_AST;
+}
+
+void PascalParser::usesClause() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST usesClause_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp13_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp13_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp13_AST));
+ }
+ match(USES);
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ usesClause_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_2);
+ } else {
+ throw;
+ }
+ }
+ returnAST = usesClause_AST;
+}
+
+void PascalParser::block() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST block_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ declarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ statementPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ block_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_3);
+ } else {
+ throw;
+ }
+ }
+ returnAST = block_AST;
+}
+
+void PascalParser::identifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST identifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp15_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp15_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp15_AST));
+ }
+ match(IDENT);
+ identifier_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_4);
+ } else {
+ throw;
+ }
+ }
+ returnAST = identifier_AST;
+}
+
+void PascalParser::libraryBlock() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST libraryBlock_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ declarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case BEGIN:
+ {
+ statementPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case EXPORTS:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ libraryBlock_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_5);
+ } else {
+ throw;
+ }
+ }
+ returnAST = libraryBlock_AST;
+}
+
+void PascalParser::exportsClause() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST exportsClause_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp16_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp16_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp16_AST));
+ }
+ match(EXPORTS);
+ exportsList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ exportsClause_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = exportsClause_AST;
+}
+
+void PascalParser::declarationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST declarationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case LABEL:
+ {
+ labelDeclarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case CONST:
+ {
+ constantDeclarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RESOURCESTRING:
+ {
+ resourcestringDeclarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case TYPE:
+ {
+ typeDeclarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case VAR:
+ {
+ variableDeclarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ procedureAndFunctionDeclarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop41;
+ }
+ }
+ }
+ _loop41:;
+ } // ( ... )*
+ declarationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_7);
+ } else {
+ throw;
+ }
+ }
+ returnAST = declarationPart_AST;
+}
+
+void PascalParser::statementPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST statementPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ compoundStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ statementPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_3);
+ } else {
+ throw;
+ }
+ }
+ returnAST = statementPart_AST;
+}
+
+void PascalParser::exportsList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST exportsList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ exportsEntry();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ exportsEntry();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop11;
+ }
+
+ }
+ _loop11:;
+ } // ( ... )*
+ {
+ switch ( LA(1)) {
+ case SEMI:
+ {
+ match(SEMI);
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ exportsList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = exportsList_AST;
+}
+
+void PascalParser::exportsEntry() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST exportsEntry_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_index:
+ {
+ RefPascalAST tmp19_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp19_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp19_AST));
+ }
+ match(LITERAL_index);
+ integerConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case END:
+ case COMMA:
+ case LITERAL_name:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_name:
+ {
+ RefPascalAST tmp20_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp20_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp20_AST));
+ }
+ match(LITERAL_name);
+ stringConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case END:
+ case COMMA:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ exportsEntry_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_8);
+ } else {
+ throw;
+ }
+ }
+ returnAST = exportsEntry_AST;
+}
+
+void PascalParser::integerConstant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST integerConstant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefPascalAST s_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefPascalAST n_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case NUM_INT:
+ {
+ unsignedInteger();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ integerConstant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PLUS:
+ case MINUS:
+ {
+ sign();
+ if (inputState->guessing==0) {
+ s_AST = returnAST;
+ }
+ unsignedInteger();
+ if (inputState->guessing==0) {
+ n_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ integerConstant_AST = RefPascalAST(currentAST.root);
+#line 880 "pascal.g"
+ integerConstant_AST=RefPascalAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(n_AST))));
+#line 780 "PascalParser.cpp"
+ currentAST.root = integerConstant_AST;
+ if ( integerConstant_AST!=RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ integerConstant_AST->getFirstChild() != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = integerConstant_AST->getFirstChild();
+ else
+ currentAST.child = integerConstant_AST;
+ currentAST.advanceChildToEnd();
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_9);
+ } else {
+ throw;
+ }
+ }
+ returnAST = integerConstant_AST;
+}
+
+void PascalParser::stringConstant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST stringConstant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case STRING_LITERAL:
+ {
+ string();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ stringConstant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CHR:
+ {
+ constantChr();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ stringConstant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_10);
+ } else {
+ throw;
+ }
+ }
+ returnAST = stringConstant_AST;
+}
+
+void PascalParser::identifierList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST identifierList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop378;
+ }
+
+ }
+ _loop378:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ identifierList_AST = RefPascalAST(currentAST.root);
+#line 867 "pascal.g"
+ identifierList_AST = RefPascalAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(IDLIST)))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(identifierList_AST))));
+#line 880 "PascalParser.cpp"
+ currentAST.root = identifierList_AST;
+ if ( identifierList_AST!=RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ identifierList_AST->getFirstChild() != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = identifierList_AST->getFirstChild();
+ else
+ currentAST.child = identifierList_AST;
+ currentAST.advanceChildToEnd();
+ }
+ identifierList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_11);
+ } else {
+ throw;
+ }
+ }
+ returnAST = identifierList_AST;
+}
+
+void PascalParser::interfacePart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST interfacePart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp22_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp22_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp22_AST));
+ }
+ match(INTERFACE);
+ {
+ switch ( LA(1)) {
+ case USES:
+ {
+ usesClause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IMPLEMENTATION:
+ case CONST:
+ case TYPE:
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case CONST:
+ {
+ constantDeclarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case TYPE:
+ {
+ typeDeclarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ procedureHeadersPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ goto _loop24;
+ }
+ }
+ }
+ _loop24:;
+ } // ( ... )*
+ interfacePart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_12);
+ } else {
+ throw;
+ }
+ }
+ returnAST = interfacePart_AST;
+}
+
+void PascalParser::implementationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST implementationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp23_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp23_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp23_AST));
+ }
+ match(IMPLEMENTATION);
+ {
+ switch ( LA(1)) {
+ case USES:
+ {
+ usesClause();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ case BEGIN:
+ case INITIALIZATION:
+ case LABEL:
+ case CONST:
+ case RESOURCESTRING:
+ case TYPE:
+ case VAR:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ declarationPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ implementationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_13);
+ } else {
+ throw;
+ }
+ }
+ returnAST = implementationPart_AST;
+}
+
+void PascalParser::initializationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST initializationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp24_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp24_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp24_AST));
+ }
+ match(INITIALIZATION);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop34;
+ }
+
+ }
+ _loop34:;
+ } // ( ... )*
+ initializationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_14);
+ } else {
+ throw;
+ }
+ }
+ returnAST = initializationPart_AST;
+}
+
+void PascalParser::finalizationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST finalizationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp26_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp26_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp26_AST));
+ }
+ match(FINALIZATION);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop37;
+ }
+
+ }
+ _loop37:;
+ } // ( ... )*
+ finalizationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = finalizationPart_AST;
+}
+
+void PascalParser::realizationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST realizationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp28_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp28_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp28_AST));
+ }
+ match(BEGIN);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop29;
+ }
+
+ }
+ _loop29:;
+ } // ( ... )*
+ realizationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = realizationPart_AST;
+}
+
+void PascalParser::constantDeclarationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST constantDeclarationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp30_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp30_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp30_AST));
+ }
+ match(CONST);
+ { // ( ... )+
+ int _cnt47=0;
+ for (;;) {
+ if ((LA(1) == IDENT) && (LA(2) == EQUAL)) {
+ constantDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == COLON)) {
+ typedConstantDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ if ( _cnt47>=1 ) { goto _loop47; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt47++;
+ }
+ _loop47:;
+ } // ( ... )+
+ constantDeclarationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_2);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constantDeclarationPart_AST;
+}
+
+void PascalParser::typeDeclarationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST typeDeclarationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp31_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp31_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp31_AST));
+ }
+ match(TYPE);
+ { // ( ... )+
+ int _cnt54=0;
+ for (;;) {
+ if ((LA(1) == IDENT)) {
+ typeDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ if ( _cnt54>=1 ) { goto _loop54; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt54++;
+ }
+ _loop54:;
+ } // ( ... )+
+ typeDeclarationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_2);
+ } else {
+ throw;
+ }
+ }
+ returnAST = typeDeclarationPart_AST;
+}
+
+void PascalParser::procedureHeadersPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST procedureHeadersPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case PROCEDURE:
+ {
+ procedureHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ procedureHeadersPart_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case FUNCTION:
+ {
+ functionHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ procedureHeadersPart_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_15);
+ } else {
+ throw;
+ }
+ }
+ returnAST = procedureHeadersPart_AST;
+}
+
+void PascalParser::statement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST statement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case NUM_INT:
+ {
+ label();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ break;
+ }
+ case BEGIN:
+ case CASE:
+ case GOTO:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ case RAISE:
+ case TRY:
+ case IDENT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case GOTO:
+ case RAISE:
+ case IDENT:
+ {
+ simpleStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case BEGIN:
+ case CASE:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ case TRY:
+ {
+ structuredStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ statement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = statement_AST;
+}
+
+void PascalParser::labelDeclarationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST labelDeclarationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp33_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp33_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp33_AST));
+ }
+ match(LABEL);
+ label();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ label();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop44;
+ }
+
+ }
+ _loop44:;
+ } // ( ... )*
+ match(SEMI);
+ labelDeclarationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_17);
+ } else {
+ throw;
+ }
+ }
+ returnAST = labelDeclarationPart_AST;
+}
+
+void PascalParser::resourcestringDeclarationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST resourcestringDeclarationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp36_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp36_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp36_AST));
+ }
+ match(RESOURCESTRING);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == IDENT)) {
+ stringConstantDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop50;
+ }
+
+ }
+ _loop50:;
+ } // ( ... )*
+ resourcestringDeclarationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_17);
+ } else {
+ throw;
+ }
+ }
+ returnAST = resourcestringDeclarationPart_AST;
+}
+
+void PascalParser::variableDeclarationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST variableDeclarationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp37_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp37_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp37_AST));
+ }
+ match(VAR);
+ variableDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI) && (LA(2) == IDENT)) {
+ match(SEMI);
+ variableDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop57;
+ }
+
+ }
+ _loop57:;
+ } // ( ... )*
+ match(SEMI);
+ variableDeclarationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_17);
+ } else {
+ throw;
+ }
+ }
+ returnAST = variableDeclarationPart_AST;
+}
+
+void PascalParser::procedureAndFunctionDeclarationPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST procedureAndFunctionDeclarationPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ procedureAndFunctionDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ procedureAndFunctionDeclarationPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_17);
+ } else {
+ throw;
+ }
+ }
+ returnAST = procedureAndFunctionDeclarationPart_AST;
+}
+
+void PascalParser::label() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST label_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ unsignedInteger();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ label_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_18);
+ } else {
+ throw;
+ }
+ }
+ returnAST = label_AST;
+}
+
+void PascalParser::constantDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST constantDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(EQUAL);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ constantDeclaration_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_19);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constantDeclaration_AST;
+}
+
+void PascalParser::typedConstantDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST typedConstantDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(EQUAL);
+ typedConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ typedConstantDeclaration_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_19);
+ } else {
+ throw;
+ }
+ }
+ returnAST = typedConstantDeclaration_AST;
+}
+
+void PascalParser::stringConstantDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST stringConstantDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(EQUAL);
+ string();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ stringConstantDeclaration_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_20);
+ } else {
+ throw;
+ }
+ }
+ returnAST = stringConstantDeclaration_AST;
+}
+
+void PascalParser::string() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST string_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp46_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp46_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp46_AST));
+ }
+ match(STRING_LITERAL);
+ string_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_21);
+ } else {
+ throw;
+ }
+ }
+ returnAST = string_AST;
+}
+
+void PascalParser::typeDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST typeDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(EQUAL);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ typeDeclaration_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_19);
+ } else {
+ throw;
+ }
+ }
+ returnAST = typeDeclaration_AST;
+}
+
+void PascalParser::variableDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST variableDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)RefToken c = ANTLR_USE_NAMESPACE(antlr)nullToken;
+ RefPascalAST c_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ c = LT(1);
+ if ( inputState->guessing == 0 ) {
+ c_AST = astFactory->create(c);
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(c_AST));
+ }
+ match(COLON);
+ if ( inputState->guessing==0 ) {
+#line 246 "pascal.g"
+ c_AST->setType(VARDECL);
+#line 1741 "PascalParser.cpp"
+ }
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ variableDeclaration_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_22);
+ } else {
+ throw;
+ }
+ }
+ returnAST = variableDeclaration_AST;
+}
+
+void PascalParser::type() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST type_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case INTEGER:
+ case SHORTINT:
+ case SMALLINT:
+ case LONGINT:
+ case INT64:
+ case BYTE:
+ case WORD:
+ case CARDINAL:
+ case QWORD:
+ case BOOLEAN:
+ case BYTEBOOL:
+ case LONGBOOL:
+ case CHAR:
+ case REAL:
+ case SINGLE:
+ case DOUBLE:
+ case EXTENDED:
+ case COMP:
+ {
+ simpleType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case NUM_INT:
+ case PLUS:
+ case MINUS:
+ case STRING_LITERAL:
+ case CHR:
+ case NUM_REAL:
+ case IDENT:
+ {
+ subrangeTypeOrTypeIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case LPAREN:
+ {
+ enumeratedType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case STRING:
+ {
+ stringType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case ARRAY:
+ case PACKED:
+ case RECORD:
+ case SET:
+ case FILE:
+ case OBJECT:
+ case CLASS:
+ {
+ structuredType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case POINTER:
+ {
+ pointerType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ proceduralType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ type_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = type_AST;
+}
+
+void PascalParser::procedureAndFunctionDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST procedureAndFunctionDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case PROCEDURE:
+ {
+ procedureDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ procedureAndFunctionDeclaration_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case FUNCTION:
+ {
+ functionDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ procedureAndFunctionDeclaration_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CONSTRUCTOR:
+ {
+ constructorDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ procedureAndFunctionDeclaration_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case DESTRUCTOR:
+ {
+ destructorDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ procedureAndFunctionDeclaration_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_17);
+ } else {
+ throw;
+ }
+ }
+ returnAST = procedureAndFunctionDeclaration_AST;
+}
+
+void PascalParser::procedureDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST procedureDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ procedureHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subroutineBlock();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ procedureDeclaration_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_17);
+ } else {
+ throw;
+ }
+ }
+ returnAST = procedureDeclaration_AST;
+}
+
+void PascalParser::functionDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST functionDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ functionHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subroutineBlock();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ functionDeclaration_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_17);
+ } else {
+ throw;
+ }
+ }
+ returnAST = functionDeclaration_AST;
+}
+
+void PascalParser::constructorDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST constructorDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ constructorHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ subroutineBlock();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ constructorDeclaration_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_17);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constructorDeclaration_AST;
+}
+
+void PascalParser::destructorDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST destructorDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ destructorHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ subroutineBlock();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ destructorDeclaration_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_17);
+ } else {
+ throw;
+ }
+ }
+ returnAST = destructorDeclaration_AST;
+}
+
+void PascalParser::compoundStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST compoundStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if ((LA(1) == BEGIN) && (LA(2) == END)) {
+ match(BEGIN);
+ match(END);
+ compoundStatement_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == BEGIN) && (LA(2) == SEMI)) {
+ match(BEGIN);
+ { // ( ... )+
+ int _cnt312=0;
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ }
+ else {
+ if ( _cnt312>=1 ) { goto _loop312; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt312++;
+ }
+ _loop312:;
+ } // ( ... )+
+ match(END);
+ compoundStatement_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == BEGIN) && (_tokenSet_24.member(LA(2)))) {
+ match(BEGIN);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ {
+ switch ( LA(1)) {
+ case BEGIN:
+ case NUM_INT:
+ case CASE:
+ case GOTO:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ case RAISE:
+ case TRY:
+ case IDENT:
+ {
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else {
+ goto _loop315;
+ }
+
+ }
+ _loop315:;
+ } // ( ... )*
+ match(END);
+ compoundStatement_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_25);
+ } else {
+ throw;
+ }
+ }
+ returnAST = compoundStatement_AST;
+}
+
+void PascalParser::procedureHeader() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST procedureHeader_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp61_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp61_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp61_AST));
+ }
+ match(PROCEDURE);
+ {
+ if ((LA(1) == IDENT) && (LA(2) == SEMI || LA(2) == LPAREN)) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == COLON)) {
+ qualifiedMethodIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ formalParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= PUBLIC && LA(1) <= FAR))) {
+ modifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ }
+ else {
+ goto _loop68;
+ }
+
+ }
+ _loop68:;
+ } // ( ... )*
+ procedureHeader_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_26);
+ } else {
+ throw;
+ }
+ }
+ returnAST = procedureHeader_AST;
+}
+
+void PascalParser::subroutineBlock() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST subroutineBlock_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case BEGIN:
+ case LABEL:
+ case CONST:
+ case RESOURCESTRING:
+ case TYPE:
+ case VAR:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ block();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subroutineBlock_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case EXTERNAL:
+ {
+ externalDirective();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subroutineBlock_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case FORWARD:
+ {
+ match(FORWARD);
+ subroutineBlock_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_27);
+ } else {
+ throw;
+ }
+ }
+ returnAST = subroutineBlock_AST;
+}
+
+void PascalParser::functionHeader() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST functionHeader_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ bool synPredMatched74 = false;
+ if (((LA(1) == FUNCTION) && (LA(2) == IDENT))) {
+ int _m74 = mark();
+ synPredMatched74 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(FUNCTION);
+ identifier();
+ match(COLON);
+ type();
+ match(SEMI);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched74 = false;
+ }
+ rewind(_m74);
+ inputState->guessing--;
+ }
+ if ( synPredMatched74 ) {
+ RefPascalAST tmp65_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp65_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp65_AST));
+ }
+ match(FUNCTION);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= PUBLIC && LA(1) <= FAR))) {
+ modifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ }
+ else {
+ goto _loop76;
+ }
+
+ }
+ _loop76:;
+ } // ( ... )*
+ functionHeader_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ bool synPredMatched78 = false;
+ if (((LA(1) == FUNCTION) && (LA(2) == IDENT))) {
+ int _m78 = mark();
+ synPredMatched78 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(FUNCTION);
+ identifier();
+ match(COLON);
+ match(COLON);
+ identifier();
+ match(COLON);
+ type();
+ match(SEMI);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched78 = false;
+ }
+ rewind(_m78);
+ inputState->guessing--;
+ }
+ if ( synPredMatched78 ) {
+ RefPascalAST tmp69_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp69_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp69_AST));
+ }
+ match(FUNCTION);
+ qualifiedMethodIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= PUBLIC && LA(1) <= FAR))) {
+ modifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ }
+ else {
+ goto _loop80;
+ }
+
+ }
+ _loop80:;
+ } // ( ... )*
+ functionHeader_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ bool synPredMatched82 = false;
+ if (((LA(1) == FUNCTION) && (LA(2) == IDENT))) {
+ int _m82 = mark();
+ synPredMatched82 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(FUNCTION);
+ identifier();
+ match(COLON);
+ match(COLON);
+ identifier();
+ match(LPAREN);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched82 = false;
+ }
+ rewind(_m82);
+ inputState->guessing--;
+ }
+ if ( synPredMatched82 ) {
+ RefPascalAST tmp73_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp73_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp73_AST));
+ }
+ match(FUNCTION);
+ qualifiedMethodIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formalParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= PUBLIC && LA(1) <= FAR))) {
+ modifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ }
+ else {
+ goto _loop84;
+ }
+
+ }
+ _loop84:;
+ } // ( ... )*
+ functionHeader_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == FUNCTION) && (LA(2) == IDENT)) {
+ RefPascalAST tmp77_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp77_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp77_AST));
+ }
+ match(FUNCTION);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ formalParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= PUBLIC && LA(1) <= FAR))) {
+ modifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ }
+ else {
+ goto _loop86;
+ }
+
+ }
+ _loop86:;
+ } // ( ... )*
+ functionHeader_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }}
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_26);
+ } else {
+ throw;
+ }
+ }
+ returnAST = functionHeader_AST;
+}
+
+void PascalParser::qualifiedMethodIdentifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST qualifiedMethodIdentifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ match(COLON);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ qualifiedMethodIdentifier_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_28);
+ } else {
+ throw;
+ }
+ }
+ returnAST = qualifiedMethodIdentifier_AST;
+}
+
+void PascalParser::formalParameterList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST formalParameterList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LPAREN);
+ parameterDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ parameterDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop96;
+ }
+
+ }
+ _loop96:;
+ } // ( ... )*
+ match(RPAREN);
+ formalParameterList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_29);
+ } else {
+ throw;
+ }
+ }
+ returnAST = formalParameterList_AST;
+}
+
+void PascalParser::modifiers() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST modifiers_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case PUBLIC:
+ {
+ match(PUBLIC);
+ modifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case ALIAS:
+ {
+ {
+ match(ALIAS);
+ stringConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ modifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case INTERRUPT:
+ {
+ match(INTERRUPT);
+ modifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case REGISTER:
+ case PASCAL:
+ case CDECL:
+ case STDCALL:
+ case POPSTACK:
+ case SAVEREGISTERS:
+ case INLINE:
+ case SAFECALL:
+ case NEAR:
+ case FAR:
+ {
+ callModifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ modifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case EXPORT:
+ {
+ match(EXPORT);
+ modifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_22);
+ } else {
+ throw;
+ }
+ }
+ returnAST = modifiers_AST;
+}
+
+void PascalParser::externalDirective() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST externalDirective_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp90_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp90_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp90_AST));
+ }
+ match(EXTERNAL);
+ {
+ switch ( LA(1)) {
+ case STRING_LITERAL:
+ case CHR:
+ {
+ stringConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_name:
+ {
+ {
+ RefPascalAST tmp91_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp91_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp91_AST));
+ }
+ match(LITERAL_name);
+ stringConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ break;
+ }
+ case LITERAL_index:
+ {
+ {
+ RefPascalAST tmp92_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp92_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp92_AST));
+ }
+ match(LITERAL_index);
+ integerConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ break;
+ }
+ case ANTLR_USE_NAMESPACE(antlr)Token::EOF_TYPE:
+ case SEMI:
+ case END:
+ case EXPORTS:
+ case BEGIN:
+ case INITIALIZATION:
+ case LABEL:
+ case CONST:
+ case RESOURCESTRING:
+ case TYPE:
+ case VAR:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case ANTLR_USE_NAMESPACE(antlr)Token::EOF_TYPE:
+ case SEMI:
+ case END:
+ case EXPORTS:
+ case BEGIN:
+ case INITIALIZATION:
+ case LABEL:
+ case CONST:
+ case RESOURCESTRING:
+ case TYPE:
+ case VAR:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ externalDirective_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_27);
+ } else {
+ throw;
+ }
+ }
+ returnAST = externalDirective_AST;
+}
+
+void PascalParser::functionHeaderEnding() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST functionHeaderEnding_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case COLON:
+ {
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= PUBLIC && LA(1) <= FAR))) {
+ modifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ }
+ else {
+ goto _loop91;
+ }
+
+ }
+ _loop91:;
+ } // ( ... )*
+ functionHeaderEnding_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case LPAREN:
+ {
+ formalParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= PUBLIC && LA(1) <= FAR))) {
+ modifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ }
+ else {
+ goto _loop93;
+ }
+
+ }
+ _loop93:;
+ } // ( ... )*
+ functionHeaderEnding_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_0);
+ } else {
+ throw;
+ }
+ }
+ returnAST = functionHeaderEnding_AST;
+}
+
+void PascalParser::parameterDeclaration() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST parameterDeclaration_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ valueParameter();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ parameterDeclaration_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case VAR:
+ {
+ variableParameter();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ parameterDeclaration_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CONST:
+ {
+ constantParameter();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ parameterDeclaration_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_30);
+ } else {
+ throw;
+ }
+ }
+ returnAST = parameterDeclaration_AST;
+}
+
+void PascalParser::valueParameter() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST valueParameter_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ bool synPredMatched100 = false;
+ if (((LA(1) == IDENT) && (LA(2) == COMMA || LA(2) == COLON))) {
+ int _m100 = mark();
+ synPredMatched100 = true;
+ inputState->guessing++;
+ try {
+ {
+ identifierList();
+ match(COLON);
+ match(ARRAY);
+ match(OF);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched100 = false;
+ }
+ rewind(_m100);
+ inputState->guessing--;
+ }
+ if ( synPredMatched100 ) {
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ match(ARRAY);
+ match(OF);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ valueParameter_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == COMMA || LA(2) == COLON)) {
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ valueParameter_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_30);
+ } else {
+ throw;
+ }
+ }
+ returnAST = valueParameter_AST;
+}
+
+void PascalParser::variableParameter() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST variableParameter_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp103_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp103_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp103_AST));
+ }
+ match(VAR);
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case COLON:
+ {
+ untypedParameterPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case RPAREN:
+ case RBRACK:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ variableParameter_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_30);
+ } else {
+ throw;
+ }
+ }
+ returnAST = variableParameter_AST;
+}
+
+void PascalParser::constantParameter() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST constantParameter_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp104_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp104_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp104_AST));
+ }
+ match(CONST);
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case COLON:
+ {
+ untypedParameterPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case RPAREN:
+ case RBRACK:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ constantParameter_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_30);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constantParameter_AST;
+}
+
+void PascalParser::untypedParameterPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST untypedParameterPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ bool synPredMatched105 = false;
+ if (((LA(1) == COLON) && (LA(2) == ARRAY))) {
+ int _m105 = mark();
+ synPredMatched105 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(COLON);
+ match(ARRAY);
+ match(OF);
+ type();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched105 = false;
+ }
+ rewind(_m105);
+ inputState->guessing--;
+ }
+ if ( synPredMatched105 ) {
+ match(COLON);
+ match(ARRAY);
+ match(OF);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ untypedParameterPart_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == COLON) && (_tokenSet_31.member(LA(2)))) {
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ untypedParameterPart_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_30);
+ } else {
+ throw;
+ }
+ }
+ returnAST = untypedParameterPart_AST;
+}
+
+void PascalParser::callModifiers() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST callModifiers_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case REGISTER:
+ {
+ match(REGISTER);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PASCAL:
+ {
+ match(PASCAL);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CDECL:
+ {
+ match(CDECL);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case STDCALL:
+ {
+ match(STDCALL);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case POPSTACK:
+ {
+ match(POPSTACK);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case SAVEREGISTERS:
+ {
+ match(SAVEREGISTERS);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case INLINE:
+ {
+ match(INLINE);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case SAFECALL:
+ {
+ match(SAFECALL);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case NEAR:
+ {
+ match(NEAR);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case FAR:
+ {
+ match(FAR);
+ callModifiers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = callModifiers_AST;
+}
+
+void PascalParser::expression() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST expression_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ simpleExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case EQUAL:
+ case LE:
+ case GE:
+ case LTH:
+ case GT:
+ case NOT_EQUAL:
+ case IN:
+ case IS:
+ {
+ expressionSign();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ simpleExpression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case DOT:
+ case SEMI:
+ case END:
+ case COMMA:
+ case RPAREN:
+ case FINALIZATION:
+ case OF:
+ case DOTDOT:
+ case RBRACK:
+ case THEN:
+ case ELSE:
+ case DO:
+ case UNTIL:
+ case TO:
+ case DOWNTO:
+ case RBRACK2:
+ case EXCEPT:
+ case FINALLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ expression_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_32);
+ } else {
+ throw;
+ }
+ }
+ returnAST = expression_AST;
+}
+
+void PascalParser::typedConstant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST typedConstant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ bool synPredMatched120 = false;
+ if (((_tokenSet_33.member(LA(1))) && (_tokenSet_34.member(LA(2))))) {
+ int _m120 = mark();
+ synPredMatched120 = true;
+ inputState->guessing++;
+ try {
+ {
+ constant();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched120 = false;
+ }
+ rewind(_m120);
+ inputState->guessing--;
+ }
+ if ( synPredMatched120 ) {
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ typedConstant_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ bool synPredMatched122 = false;
+ if (((LA(1) == LPAREN) && (LA(2) == IDENT))) {
+ int _m122 = mark();
+ synPredMatched122 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(LPAREN);
+ identifier();
+ match(COLON);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched122 = false;
+ }
+ rewind(_m122);
+ inputState->guessing--;
+ }
+ if ( synPredMatched122 ) {
+ recordConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ typedConstant_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ bool synPredMatched124 = false;
+ if (((LA(1) == LPAREN) && (_tokenSet_35.member(LA(2))))) {
+ int _m124 = mark();
+ synPredMatched124 = true;
+ inputState->guessing++;
+ try {
+ {
+ arrayConstant();
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched124 = false;
+ }
+ rewind(_m124);
+ inputState->guessing--;
+ }
+ if ( synPredMatched124 ) {
+ arrayConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ typedConstant_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((_tokenSet_36.member(LA(1))) && (_tokenSet_37.member(LA(2)))) {
+ proceduralConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ typedConstant_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }}
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_22);
+ } else {
+ throw;
+ }
+ }
+ returnAST = typedConstant_AST;
+}
+
+void PascalParser::constant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST constant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefPascalAST s_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefPascalAST n_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefPascalAST s2_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ RefPascalAST id_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case NUM_INT:
+ case NUM_REAL:
+ {
+ unsignedNumber();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ constant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case IDENT:
+ {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ constant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case STRING_LITERAL:
+ {
+ string();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ constant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CHR:
+ {
+ constantChr();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ constant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ if ((LA(1) == PLUS || LA(1) == MINUS) && (LA(2) == NUM_INT || LA(2) == NUM_REAL)) {
+ sign();
+ if (inputState->guessing==0) {
+ s_AST = returnAST;
+ }
+ unsignedNumber();
+ if (inputState->guessing==0) {
+ n_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ constant_AST = RefPascalAST(currentAST.root);
+#line 901 "pascal.g"
+ constant_AST=RefPascalAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(s_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(n_AST))));
+#line 3461 "PascalParser.cpp"
+ currentAST.root = constant_AST;
+ if ( constant_AST!=RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ constant_AST->getFirstChild() != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = constant_AST->getFirstChild();
+ else
+ currentAST.child = constant_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ else if ((LA(1) == PLUS || LA(1) == MINUS) && (LA(2) == IDENT)) {
+ sign();
+ if (inputState->guessing==0) {
+ s2_AST = returnAST;
+ }
+ identifier();
+ if (inputState->guessing==0) {
+ id_AST = returnAST;
+ }
+ if ( inputState->guessing==0 ) {
+ constant_AST = RefPascalAST(currentAST.root);
+#line 903 "pascal.g"
+ constant_AST=RefPascalAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(s2_AST))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(id_AST))));
+#line 3484 "PascalParser.cpp"
+ currentAST.root = constant_AST;
+ if ( constant_AST!=RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ constant_AST->getFirstChild() != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = constant_AST->getFirstChild();
+ else
+ currentAST.child = constant_AST;
+ currentAST.advanceChildToEnd();
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_38);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constant_AST;
+}
+
+void PascalParser::recordConstant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST recordConstant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LPAREN);
+ {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ }
+ else {
+ goto _loop134;
+ }
+
+ }
+ _loop134:;
+ } // ( ... )*
+ match(RPAREN);
+ recordConstant_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_22);
+ } else {
+ throw;
+ }
+ }
+ returnAST = recordConstant_AST;
+}
+
+void PascalParser::arrayConstant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST arrayConstant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LPAREN);
+ {
+ switch ( LA(1)) {
+ case NUM_INT:
+ case PLUS:
+ case MINUS:
+ case STRING_LITERAL:
+ case CHR:
+ case NUM_REAL:
+ case IDENT:
+ {
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case LPAREN:
+ {
+ arrayConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ {
+ switch ( LA(1)) {
+ case NUM_INT:
+ case PLUS:
+ case MINUS:
+ case STRING_LITERAL:
+ case CHR:
+ case NUM_REAL:
+ case IDENT:
+ {
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case LPAREN:
+ {
+ arrayConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else {
+ goto _loop129;
+ }
+
+ }
+ _loop129:;
+ } // ( ... )*
+ match(RPAREN);
+ arrayConstant_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_39);
+ } else {
+ throw;
+ }
+ }
+ returnAST = arrayConstant_AST;
+}
+
+void PascalParser::proceduralConstant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST proceduralConstant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ proceduralConstant_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_22);
+ } else {
+ throw;
+ }
+ }
+ returnAST = proceduralConstant_AST;
+}
+
+void PascalParser::addressConstant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST addressConstant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp127_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp127_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp127_AST));
+ }
+ match(NUM_INT);
+ addressConstant_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = addressConstant_AST;
+}
+
+void PascalParser::simpleType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST simpleType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case INTEGER:
+ case SHORTINT:
+ case SMALLINT:
+ case LONGINT:
+ case INT64:
+ case BYTE:
+ case WORD:
+ case CARDINAL:
+ case QWORD:
+ case BOOLEAN:
+ case BYTEBOOL:
+ case LONGBOOL:
+ case CHAR:
+ {
+ ordinalType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ simpleType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case REAL:
+ case SINGLE:
+ case DOUBLE:
+ case EXTENDED:
+ case COMP:
+ {
+ realType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ simpleType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = simpleType_AST;
+}
+
+void PascalParser::subrangeTypeOrTypeIdentifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST subrangeTypeOrTypeIdentifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case DOTDOT:
+ {
+ match(DOTDOT);
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case RPAREN:
+ case EQUAL:
+ case RBRACK:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ subrangeTypeOrTypeIdentifier_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = subrangeTypeOrTypeIdentifier_AST;
+}
+
+void PascalParser::enumeratedType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST enumeratedType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ bool synPredMatched147 = false;
+ if (((LA(1) == LPAREN) && (LA(2) == IDENT))) {
+ int _m147 = mark();
+ synPredMatched147 = true;
+ inputState->guessing++;
+ try {
+ {
+ match(LPAREN);
+ identifier();
+ match(ASSIGN);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched147 = false;
+ }
+ rewind(_m147);
+ inputState->guessing--;
+ }
+ if ( synPredMatched147 ) {
+ match(LPAREN);
+ assignedEnumList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ enumeratedType_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == LPAREN) && (LA(2) == IDENT)) {
+ match(LPAREN);
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ enumeratedType_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_40);
+ } else {
+ throw;
+ }
+ }
+ returnAST = enumeratedType_AST;
+}
+
+void PascalParser::stringType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST stringType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp133_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp133_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp133_AST));
+ }
+ match(STRING);
+ {
+ switch ( LA(1)) {
+ case LBRACK:
+ {
+ match(LBRACK);
+ unsignedInteger();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RBRACK);
+ break;
+ }
+ case SEMI:
+ case RPAREN:
+ case EQUAL:
+ case RBRACK:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ stringType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = stringType_AST;
+}
+
+void PascalParser::structuredType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST structuredType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case PACKED:
+ {
+ match(PACKED);
+ break;
+ }
+ case ARRAY:
+ case RECORD:
+ case SET:
+ case FILE:
+ case OBJECT:
+ case CLASS:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case ARRAY:
+ {
+ arrayType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RECORD:
+ {
+ recordType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case OBJECT:
+ {
+ objectType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case CLASS:
+ {
+ classType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SET:
+ {
+ setType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case FILE:
+ {
+ fileType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ structuredType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = structuredType_AST;
+}
+
+void PascalParser::pointerType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST pointerType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp137_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp137_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp137_AST));
+ }
+ match(POINTER);
+ typeIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ pointerType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = pointerType_AST;
+}
+
+void PascalParser::proceduralType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST proceduralType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ bool synPredMatched185 = false;
+ if (((LA(1) == PROCEDURE || LA(1) == FUNCTION) && (LA(2) == IDENT))) {
+ int _m185 = mark();
+ synPredMatched185 = true;
+ inputState->guessing++;
+ try {
+ {
+ proceduralTypePart1();
+ match(SEMI);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched185 = false;
+ }
+ rewind(_m185);
+ inputState->guessing--;
+ }
+ if ( synPredMatched185 ) {
+ proceduralTypePart1();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ callModifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ proceduralType_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == PROCEDURE || LA(1) == FUNCTION) && (LA(2) == IDENT)) {
+ proceduralTypePart1();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ proceduralType_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = proceduralType_AST;
+}
+
+void PascalParser::ordinalType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST ordinalType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case INTEGER:
+ {
+ match(INTEGER);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case SHORTINT:
+ {
+ match(SHORTINT);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case SMALLINT:
+ {
+ match(SMALLINT);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case LONGINT:
+ {
+ match(LONGINT);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case INT64:
+ {
+ match(INT64);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case BYTE:
+ {
+ match(BYTE);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case WORD:
+ {
+ match(WORD);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CARDINAL:
+ {
+ match(CARDINAL);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case QWORD:
+ {
+ match(QWORD);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case BOOLEAN:
+ {
+ match(BOOLEAN);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case BYTEBOOL:
+ {
+ match(BYTEBOOL);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case LONGBOOL:
+ {
+ match(LONGBOOL);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CHAR:
+ {
+ match(CHAR);
+ ordinalType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_40);
+ } else {
+ throw;
+ }
+ }
+ returnAST = ordinalType_AST;
+}
+
+void PascalParser::realType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST realType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case REAL:
+ {
+ match(REAL);
+ realType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case SINGLE:
+ {
+ match(SINGLE);
+ realType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case DOUBLE:
+ {
+ match(DOUBLE);
+ realType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case EXTENDED:
+ {
+ match(EXTENDED);
+ realType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case COMP:
+ {
+ match(COMP);
+ realType_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = realType_AST;
+}
+
+void PascalParser::typeIdentifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST typeIdentifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ typeIdentifier_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_41);
+ } else {
+ throw;
+ }
+ }
+ returnAST = typeIdentifier_AST;
+}
+
+void PascalParser::subrangeType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST subrangeType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(DOTDOT);
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ subrangeType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_0);
+ } else {
+ throw;
+ }
+ }
+ returnAST = subrangeType_AST;
+}
+
+void PascalParser::assignedEnumList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST assignedEnumList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(ASSIGN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(ASSIGN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ }
+ else {
+ goto _loop152;
+ }
+
+ }
+ _loop152:;
+ } // ( ... )*
+ assignedEnumList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_42);
+ } else {
+ throw;
+ }
+ }
+ returnAST = assignedEnumList_AST;
+}
+
+void PascalParser::unsignedInteger() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST unsignedInteger_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp161_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp161_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp161_AST));
+ }
+ match(NUM_INT);
+ unsignedInteger_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_43);
+ } else {
+ throw;
+ }
+ }
+ returnAST = unsignedInteger_AST;
+}
+
+void PascalParser::arrayType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST arrayType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp162_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp162_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp162_AST));
+ }
+ match(ARRAY);
+ match(LBRACK);
+ arrayIndexType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ arrayIndexType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop161;
+ }
+
+ }
+ _loop161:;
+ } // ( ... )*
+ match(RBRACK);
+ match(OF);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ arrayType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = arrayType_AST;
+}
+
+void PascalParser::recordType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST recordType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp167_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp167_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp167_AST));
+ }
+ match(RECORD);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == CASE || LA(1) == IDENT)) {
+ fieldList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop168;
+ }
+
+ }
+ _loop168:;
+ } // ( ... )*
+ match(END);
+ recordType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = recordType_AST;
+}
+
+void PascalParser::objectType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST objectType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp169_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp169_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp169_AST));
+ }
+ match(OBJECT);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ heritage();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case PUBLIC:
+ case PRIVATE:
+ case PROTECTED:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case IDENT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case IDENT:
+ {
+ componentList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PUBLIC:
+ case PRIVATE:
+ case PROTECTED:
+ {
+ objectVisibilitySpecifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(END);
+ objectType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = objectType_AST;
+}
+
+void PascalParser::classType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST classType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp171_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp171_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp171_AST));
+ }
+ match(CLASS);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ heritage();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case PUBLIC:
+ case PRIVATE:
+ case PROTECTED:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PUBLISHED:
+ case PROPERTY:
+ case IDENT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ case IDENT:
+ {
+ classComponentList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PUBLIC:
+ case PRIVATE:
+ case PROTECTED:
+ case PUBLISHED:
+ {
+ classVisibilitySpecifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(END);
+ classType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = classType_AST;
+}
+
+void PascalParser::setType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST setType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp173_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp173_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp173_AST));
+ }
+ match(SET);
+ match(OF);
+ ordinalType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ setType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = setType_AST;
+}
+
+void PascalParser::fileType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST fileType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp175_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp175_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp175_AST));
+ }
+ match(FILE);
+ match(OF);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ fileType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = fileType_AST;
+}
+
+void PascalParser::arrayIndexType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST arrayIndexType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if (((LA(1) >= INTEGER && LA(1) <= CHAR))) {
+ ordinalType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ arrayIndexType_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ bool synPredMatched164 = false;
+ if (((_tokenSet_36.member(LA(1))) && (_tokenSet_44.member(LA(2))))) {
+ int _m164 = mark();
+ synPredMatched164 = true;
+ inputState->guessing++;
+ try {
+ {
+ expression();
+ match(DOTDOT);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched164 = false;
+ }
+ rewind(_m164);
+ inputState->guessing--;
+ }
+ if ( synPredMatched164 ) {
+ arraySubrangeType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ arrayIndexType_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == LPAREN) && (LA(2) == IDENT)) {
+ enumeratedType();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ arrayIndexType_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_45);
+ } else {
+ throw;
+ }
+ }
+ returnAST = arrayIndexType_AST;
+}
+
+void PascalParser::arraySubrangeType() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST arraySubrangeType_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(DOTDOT);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ arraySubrangeType_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_45);
+ } else {
+ throw;
+ }
+ }
+ returnAST = arraySubrangeType_AST;
+}
+
+void PascalParser::fieldList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST fieldList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ fixedField();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ fieldList_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CASE:
+ {
+ variantPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ fieldList_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_46);
+ } else {
+ throw;
+ }
+ }
+ returnAST = fieldList_AST;
+}
+
+void PascalParser::fixedField() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST fixedField_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ fixedField_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_46);
+ } else {
+ throw;
+ }
+ }
+ returnAST = fixedField_AST;
+}
+
+void PascalParser::variantPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST variantPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp180_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp180_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp180_AST));
+ }
+ match(CASE);
+ {
+ if ((LA(1) == IDENT) && (LA(2) == COLON)) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == OF)) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(OF);
+ variant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ variant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop174;
+ }
+
+ }
+ _loop174:;
+ } // ( ... )*
+ variantPart_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_46);
+ } else {
+ throw;
+ }
+ }
+ returnAST = variantPart_AST;
+}
+
+void PascalParser::variant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST variant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ { // ( ... )+
+ int _cnt177=0;
+ for (;;) {
+ if ((_tokenSet_33.member(LA(1)))) {
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COMMA);
+ }
+ else {
+ if ( _cnt177>=1 ) { goto _loop177; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt177++;
+ }
+ _loop177:;
+ } // ( ... )+
+ match(COLON);
+ match(LPAREN);
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == CASE || LA(1) == IDENT)) {
+ fieldList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop179;
+ }
+
+ }
+ _loop179:;
+ } // ( ... )*
+ match(RPAREN);
+ variant_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_47);
+ } else {
+ throw;
+ }
+ }
+ returnAST = variant_AST;
+}
+
+void PascalParser::proceduralTypePart1() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST proceduralTypePart1_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case FUNCTION:
+ {
+ functionHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PROCEDURE:
+ {
+ procedureHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case OF:
+ {
+ match(OF);
+ match(OBJECT);
+ break;
+ }
+ case SEMI:
+ case RPAREN:
+ case EQUAL:
+ case RBRACK:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ proceduralTypePart1_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_23);
+ } else {
+ throw;
+ }
+ }
+ returnAST = proceduralTypePart1_AST;
+}
+
+void PascalParser::heritage() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST heritage_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LPAREN);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ heritage_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_48);
+ } else {
+ throw;
+ }
+ }
+ returnAST = heritage_AST;
+}
+
+void PascalParser::componentList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST componentList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ { // ( ... )+
+ int _cnt196=0;
+ for (;;) {
+ if ((LA(1) == IDENT)) {
+ fieldDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ if ( _cnt196>=1 ) { goto _loop196; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt196++;
+ }
+ _loop196:;
+ } // ( ... )+
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ { // ( ... )+
+ int _cnt199=0;
+ for (;;) {
+ if ((_tokenSet_49.member(LA(1)))) {
+ methodDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ if ( _cnt199>=1 ) { goto _loop199; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt199++;
+ }
+ _loop199:;
+ } // ( ... )+
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ componentList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = componentList_AST;
+}
+
+void PascalParser::objectVisibilitySpecifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST objectVisibilitySpecifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case PRIVATE:
+ {
+ match(PRIVATE);
+ objectVisibilitySpecifier_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PROTECTED:
+ {
+ match(PROTECTED);
+ objectVisibilitySpecifier_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PUBLIC:
+ {
+ match(PUBLIC);
+ objectVisibilitySpecifier_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = objectVisibilitySpecifier_AST;
+}
+
+void PascalParser::fieldDefinition() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST fieldDefinition_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifierList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ fieldDefinition_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_50);
+ } else {
+ throw;
+ }
+ }
+ returnAST = fieldDefinition_AST;
+}
+
+void PascalParser::methodDefinition() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST methodDefinition_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case FUNCTION:
+ {
+ functionHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PROCEDURE:
+ {
+ procedureHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case CONSTRUCTOR:
+ {
+ constructorHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case DESTRUCTOR:
+ {
+ destructorHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ methodDirectives();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ methodDefinition_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_51);
+ } else {
+ throw;
+ }
+ }
+ returnAST = methodDefinition_AST;
+}
+
+void PascalParser::constructorHeader() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST constructorHeader_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp198_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp198_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp198_AST));
+ }
+ match(CONSTRUCTOR);
+ {
+ if ((LA(1) == IDENT) && (LA(2) == LPAREN)) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == COLON)) {
+ qualifiedMethodIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ formalParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ constructorHeader_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_22);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constructorHeader_AST;
+}
+
+void PascalParser::destructorHeader() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST destructorHeader_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp199_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp199_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp199_AST));
+ }
+ match(DESTRUCTOR);
+ {
+ if ((LA(1) == IDENT) && (LA(2) == LPAREN)) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == COLON)) {
+ qualifiedMethodIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ formalParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ destructorHeader_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_22);
+ } else {
+ throw;
+ }
+ }
+ returnAST = destructorHeader_AST;
+}
+
+void PascalParser::methodDirectives() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST methodDirectives_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case VIRTUAL:
+ {
+ match(VIRTUAL);
+ match(SEMI);
+ {
+ switch ( LA(1)) {
+ case ABSTRACT:
+ {
+ match(ABSTRACT);
+ match(SEMI);
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case REGISTER:
+ case PASCAL:
+ case CDECL:
+ case STDCALL:
+ case POPSTACK:
+ case SAVEREGISTERS:
+ case INLINE:
+ case SAFECALL:
+ case NEAR:
+ case FAR:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case REGISTER:
+ case PASCAL:
+ case CDECL:
+ case STDCALL:
+ case POPSTACK:
+ case SAVEREGISTERS:
+ case INLINE:
+ case SAFECALL:
+ case NEAR:
+ case FAR:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case REGISTER:
+ case PASCAL:
+ case CDECL:
+ case STDCALL:
+ case POPSTACK:
+ case SAVEREGISTERS:
+ case INLINE:
+ case SAFECALL:
+ case NEAR:
+ case FAR:
+ {
+ callModifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ methodDirectives_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_51);
+ } else {
+ throw;
+ }
+ }
+ returnAST = methodDirectives_AST;
+}
+
+void PascalParser::classComponentList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST classComponentList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ { // ( ... )+
+ int _cnt220=0;
+ for (;;) {
+ if ((LA(1) == IDENT)) {
+ fieldDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ if ( _cnt220>=1 ) { goto _loop220; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt220++;
+ }
+ _loop220:;
+ } // ( ... )+
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ {
+ { // ( ... )+
+ int _cnt224=0;
+ for (;;) {
+ if ((_tokenSet_52.member(LA(1)))) {
+ {
+ switch ( LA(1)) {
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ {
+ classMethodDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PROPERTY:
+ {
+ propertyDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else {
+ if ( _cnt224>=1 ) { goto _loop224; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
+ }
+
+ _cnt224++;
+ }
+ _loop224:;
+ } // ( ... )+
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ classComponentList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = classComponentList_AST;
+}
+
+void PascalParser::classVisibilitySpecifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST classVisibilitySpecifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case PRIVATE:
+ {
+ match(PRIVATE);
+ classVisibilitySpecifier_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PROTECTED:
+ {
+ match(PROTECTED);
+ classVisibilitySpecifier_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PUBLIC:
+ {
+ match(PUBLIC);
+ classVisibilitySpecifier_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PUBLISHED:
+ {
+ match(PUBLISHED);
+ classVisibilitySpecifier_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = classVisibilitySpecifier_AST;
+}
+
+void PascalParser::classMethodDefinition() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST classMethodDefinition_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case PROCEDURE:
+ case FUNCTION:
+ case CLASS:
+ {
+ {
+ {
+ switch ( LA(1)) {
+ case CLASS:
+ {
+ match(CLASS);
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case FUNCTION:
+ {
+ functionHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PROCEDURE:
+ {
+ procedureHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ break;
+ }
+ case CONSTRUCTOR:
+ {
+ constructorHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case DESTRUCTOR:
+ {
+ destructorHeader();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(SEMI);
+ classMethodDirectives();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ classMethodDefinition_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_53);
+ } else {
+ throw;
+ }
+ }
+ returnAST = classMethodDefinition_AST;
+}
+
+void PascalParser::propertyDefinition() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST propertyDefinition_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp211_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp211_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp211_AST));
+ }
+ match(PROPERTY);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case COLON:
+ case LBRACK:
+ {
+ propertyInterface();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ case LITERAL_read:
+ case LITERAL_write:
+ case DEFAULT:
+ case LITERAL_nodefault:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ propertySpecifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ propertyDefinition_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_53);
+ } else {
+ throw;
+ }
+ }
+ returnAST = propertyDefinition_AST;
+}
+
+void PascalParser::classMethodDirectives() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST classMethodDirectives_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case VIRTUAL:
+ case OVERRIDE:
+ case MESSAGE:
+ {
+ directiveVariants();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case REGISTER:
+ case PASCAL:
+ case CDECL:
+ case STDCALL:
+ case POPSTACK:
+ case SAVEREGISTERS:
+ case INLINE:
+ case SAFECALL:
+ case NEAR:
+ case FAR:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case REGISTER:
+ case PASCAL:
+ case CDECL:
+ case STDCALL:
+ case POPSTACK:
+ case SAVEREGISTERS:
+ case INLINE:
+ case SAFECALL:
+ case NEAR:
+ case FAR:
+ {
+ callModifiers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ classMethodDirectives_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_53);
+ } else {
+ throw;
+ }
+ }
+ returnAST = classMethodDirectives_AST;
+}
+
+void PascalParser::directiveVariants() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST directiveVariants_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case VIRTUAL:
+ {
+ {
+ match(VIRTUAL);
+ {
+ switch ( LA(1)) {
+ case ABSTRACT:
+ {
+ match(ABSTRACT);
+ match(SEMI);
+ break;
+ }
+ case SEMI:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ directiveVariants_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case OVERRIDE:
+ {
+ match(OVERRIDE);
+ directiveVariants_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case MESSAGE:
+ {
+ {
+ match(MESSAGE);
+ {
+ switch ( LA(1)) {
+ case NUM_INT:
+ case PLUS:
+ case MINUS:
+ {
+ integerConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case STRING_LITERAL:
+ case CHR:
+ {
+ stringConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ directiveVariants_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_22);
+ } else {
+ throw;
+ }
+ }
+ returnAST = directiveVariants_AST;
+}
+
+void PascalParser::propertyInterface() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST propertyInterface_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LBRACK:
+ {
+ propertyParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case COLON:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(COLON);
+ typeIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_index:
+ {
+ RefPascalAST tmp220_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp220_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp220_AST));
+ }
+ match(LITERAL_index);
+ integerConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ case LITERAL_read:
+ case LITERAL_write:
+ case DEFAULT:
+ case LITERAL_nodefault:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ propertyInterface_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_54);
+ } else {
+ throw;
+ }
+ }
+ returnAST = propertyInterface_AST;
+}
+
+void PascalParser::propertySpecifiers() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST propertySpecifiers_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case LITERAL_read:
+ {
+ readSpecifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ case LITERAL_write:
+ case DEFAULT:
+ case LITERAL_nodefault:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case LITERAL_write:
+ {
+ writeSpecifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ case DEFAULT:
+ case LITERAL_nodefault:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ {
+ switch ( LA(1)) {
+ case DEFAULT:
+ case LITERAL_nodefault:
+ {
+ defaultSpecifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ propertySpecifiers_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_53);
+ } else {
+ throw;
+ }
+ }
+ returnAST = propertySpecifiers_AST;
+}
+
+void PascalParser::propertyParameterList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST propertyParameterList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LBRACK);
+ parameterDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ parameterDeclaration();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop246;
+ }
+
+ }
+ _loop246:;
+ } // ( ... )*
+ match(RBRACK);
+ propertyParameterList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_55);
+ } else {
+ throw;
+ }
+ }
+ returnAST = propertyParameterList_AST;
+}
+
+void PascalParser::readSpecifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST readSpecifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp224_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp224_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp224_AST));
+ }
+ match(LITERAL_read);
+ fieldOrMethod();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ readSpecifier_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_56);
+ } else {
+ throw;
+ }
+ }
+ returnAST = readSpecifier_AST;
+}
+
+void PascalParser::writeSpecifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST writeSpecifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp225_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp225_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp225_AST));
+ }
+ match(LITERAL_write);
+ fieldOrMethod();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ writeSpecifier_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_57);
+ } else {
+ throw;
+ }
+ }
+ returnAST = writeSpecifier_AST;
+}
+
+void PascalParser::defaultSpecifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST defaultSpecifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case DEFAULT:
+ {
+ {
+ RefPascalAST tmp226_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp226_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp226_AST));
+ }
+ match(DEFAULT);
+ {
+ switch ( LA(1)) {
+ case NUM_INT:
+ case PLUS:
+ case MINUS:
+ case STRING_LITERAL:
+ case CHR:
+ case NUM_REAL:
+ case IDENT:
+ {
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ case PROCEDURE:
+ case FUNCTION:
+ case CONSTRUCTOR:
+ case DESTRUCTOR:
+ case CLASS:
+ case PROPERTY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ defaultSpecifier_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case LITERAL_nodefault:
+ {
+ RefPascalAST tmp227_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp227_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp227_AST));
+ }
+ match(LITERAL_nodefault);
+ defaultSpecifier_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_53);
+ } else {
+ throw;
+ }
+ }
+ returnAST = defaultSpecifier_AST;
+}
+
+void PascalParser::fieldOrMethod() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST fieldOrMethod_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ fieldOrMethod_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_56);
+ } else {
+ throw;
+ }
+ }
+ returnAST = fieldOrMethod_AST;
+}
+
+void PascalParser::simpleExpression() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST simpleExpression_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ term();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= PLUS && LA(1) <= XOR))) {
+ {
+ switch ( LA(1)) {
+ case PLUS:
+ {
+ match(PLUS);
+ break;
+ }
+ case MINUS:
+ {
+ match(MINUS);
+ break;
+ }
+ case OR:
+ {
+ match(OR);
+ break;
+ }
+ case XOR:
+ {
+ match(XOR);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ term();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop263;
+ }
+
+ }
+ _loop263:;
+ } // ( ... )*
+ simpleExpression_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_58);
+ } else {
+ throw;
+ }
+ }
+ returnAST = simpleExpression_AST;
+}
+
+void PascalParser::expressionSign() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST expressionSign_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case LE:
+ {
+ match(LE);
+ expressionSign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case GE:
+ {
+ match(GE);
+ expressionSign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case LTH:
+ {
+ match(LTH);
+ expressionSign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case GT:
+ {
+ match(GT);
+ expressionSign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case NOT_EQUAL:
+ {
+ match(NOT_EQUAL);
+ expressionSign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case IN:
+ {
+ match(IN);
+ expressionSign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case IS:
+ {
+ match(IS);
+ expressionSign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case EQUAL:
+ {
+ match(EQUAL);
+ expressionSign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_36);
+ } else {
+ throw;
+ }
+ }
+ returnAST = expressionSign_AST;
+}
+
+void PascalParser::term() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST term_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ factor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if (((LA(1) >= STAR && LA(1) <= SHR))) {
+ {
+ switch ( LA(1)) {
+ case STAR:
+ {
+ match(STAR);
+ break;
+ }
+ case SLASH:
+ {
+ match(SLASH);
+ break;
+ }
+ case DIV:
+ {
+ match(DIV);
+ break;
+ }
+ case MOD:
+ {
+ match(MOD);
+ break;
+ }
+ case AND:
+ {
+ match(AND);
+ break;
+ }
+ case SHL:
+ {
+ match(SHL);
+ break;
+ }
+ case SHR:
+ {
+ match(SHR);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ factor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop267;
+ }
+
+ }
+ _loop267:;
+ } // ( ... )*
+ term_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_59);
+ } else {
+ throw;
+ }
+ }
+ returnAST = term_AST;
+}
+
+void PascalParser::factor() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST factor_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ {
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ }
+ factor_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case NUM_INT:
+ case STRING_LITERAL:
+ case CHR:
+ case NIL:
+ case NUM_REAL:
+ {
+ unsignedConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ factor_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case NOT:
+ {
+ {
+ match(NOT);
+ factor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ factor_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PLUS:
+ case MINUS:
+ {
+ {
+ {
+ switch ( LA(1)) {
+ case PLUS:
+ {
+ match(PLUS);
+ break;
+ }
+ case MINUS:
+ {
+ match(MINUS);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ factor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ factor_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case LBRACK:
+ {
+ setConstructor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ factor_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case AT:
+ {
+ addressFactor();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ factor_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case TRUE:
+ {
+ RefPascalAST tmp252_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp252_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp252_AST));
+ }
+ match(TRUE);
+ factor_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case FALSE:
+ {
+ RefPascalAST tmp253_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp253_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp253_AST));
+ }
+ match(FALSE);
+ factor_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ if ((LA(1) == IDENT) && (_tokenSet_60.member(LA(2)))) {
+ identifierOrValueTypecastOrFunctionCall();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ factor_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == LBRACK)) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(LBRACK);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop274;
+ }
+
+ }
+ _loop274:;
+ } // ( ... )*
+ match(RBRACK);
+ factor_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_61);
+ } else {
+ throw;
+ }
+ }
+ returnAST = factor_AST;
+}
+
+void PascalParser::identifierOrValueTypecastOrFunctionCall() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST identifierOrValueTypecastOrFunctionCall_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ bool synPredMatched277 = false;
+ if (((LA(1) == IDENT) && (LA(2) == LPAREN))) {
+ int _m277 = mark();
+ synPredMatched277 = true;
+ inputState->guessing++;
+ try {
+ {
+ identifier();
+ match(LPAREN);
+ expression();
+ match(COMMA);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched277 = false;
+ }
+ rewind(_m277);
+ inputState->guessing--;
+ }
+ if ( synPredMatched277 ) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(LPAREN);
+ expressions();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ identifierOrValueTypecastOrFunctionCall_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ bool synPredMatched279 = false;
+ if (((LA(1) == IDENT) && (LA(2) == LPAREN))) {
+ int _m279 = mark();
+ synPredMatched279 = true;
+ inputState->guessing++;
+ try {
+ {
+ identifier();
+ match(LPAREN);
+ expression();
+ match(RPAREN);
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
+ synPredMatched279 = false;
+ }
+ rewind(_m279);
+ inputState->guessing--;
+ }
+ if ( synPredMatched279 ) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ identifierOrValueTypecastOrFunctionCall_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == IDENT) && (_tokenSet_61.member(LA(2)))) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ identifierOrValueTypecastOrFunctionCall_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_61);
+ } else {
+ throw;
+ }
+ }
+ returnAST = identifierOrValueTypecastOrFunctionCall_AST;
+}
+
+void PascalParser::unsignedConstant() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST unsignedConstant_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case NUM_INT:
+ case NUM_REAL:
+ {
+ unsignedNumber();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unsignedConstant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CHR:
+ {
+ constantChr();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unsignedConstant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case STRING_LITERAL:
+ {
+ string();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unsignedConstant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case NIL:
+ {
+ match(NIL);
+ unsignedConstant_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_61);
+ } else {
+ throw;
+ }
+ }
+ returnAST = unsignedConstant_AST;
+}
+
+void PascalParser::setConstructor() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST setConstructor_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LBRACK);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ case NUM_INT:
+ case LBRACK:
+ case PLUS:
+ case MINUS:
+ case NOT:
+ case TRUE:
+ case FALSE:
+ case AT:
+ case STRING_LITERAL:
+ case CHR:
+ case NIL:
+ case NUM_REAL:
+ case IDENT:
+ {
+ setGroup();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ setGroup();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop290;
+ }
+
+ }
+ _loop290:;
+ } // ( ... )*
+ break;
+ }
+ case RBRACK:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(RBRACK);
+ setConstructor_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_61);
+ } else {
+ throw;
+ }
+ }
+ returnAST = setConstructor_AST;
+}
+
+void PascalParser::addressFactor() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST addressFactor_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(AT);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ addressFactor_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_61);
+ } else {
+ throw;
+ }
+ }
+ returnAST = addressFactor_AST;
+}
+
+void PascalParser::expressions() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST expressions_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop286;
+ }
+
+ }
+ _loop286:;
+ } // ( ... )*
+ expressions_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_42);
+ } else {
+ throw;
+ }
+ }
+ returnAST = expressions_AST;
+}
+
+void PascalParser::functionCall() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST functionCall_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ actualParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case END:
+ case FINALIZATION:
+ case AT:
+ case ELSE:
+ case UNTIL:
+ case EXCEPT:
+ case FINALLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ functionCall_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_62);
+ } else {
+ throw;
+ }
+ }
+ returnAST = functionCall_AST;
+}
+
+void PascalParser::actualParameterList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST actualParameterList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(LPAREN);
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ case NUM_INT:
+ case LBRACK:
+ case PLUS:
+ case MINUS:
+ case NOT:
+ case TRUE:
+ case FALSE:
+ case AT:
+ case STRING_LITERAL:
+ case CHR:
+ case NIL:
+ case NUM_REAL:
+ case IDENT:
+ {
+ expressions();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case RPAREN:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(RPAREN);
+ actualParameterList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_62);
+ } else {
+ throw;
+ }
+ }
+ returnAST = actualParameterList_AST;
+}
+
+void PascalParser::setGroup() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST setGroup_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case DOT:
+ {
+ match(DOT);
+ match(DOT);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case COMMA:
+ case RBRACK:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ setGroup_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_45);
+ } else {
+ throw;
+ }
+ }
+ returnAST = setGroup_AST;
+}
+
+void PascalParser::valueTypecast() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST valueTypecast_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ typeIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(LPAREN);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ valueTypecast_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_0);
+ } else {
+ throw;
+ }
+ }
+ returnAST = valueTypecast_AST;
+}
+
+void PascalParser::simpleStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST simpleStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case GOTO:
+ {
+ gotoStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ simpleStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case RAISE:
+ {
+ raiseStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ simpleStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ if ((LA(1) == IDENT) && (_tokenSet_63.member(LA(2)))) {
+ assignmentStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ simpleStatement_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == IDENT) && (_tokenSet_64.member(LA(2)))) {
+ procedureStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ simpleStatement_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = simpleStatement_AST;
+}
+
+void PascalParser::structuredStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST structuredStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case BEGIN:
+ {
+ compoundStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ structuredStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ {
+ repetitiveStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ structuredStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CASE:
+ case IF:
+ {
+ conditionalStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ structuredStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case TRY:
+ {
+ exceptionStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ structuredStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case WITH:
+ {
+ withStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ structuredStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = structuredStatement_AST;
+}
+
+void PascalParser::assignmentStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST assignmentStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifierOrArrayIdentifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ assignmentOperator();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ assignmentStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = assignmentStatement_AST;
+}
+
+void PascalParser::procedureStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST procedureStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case LPAREN:
+ {
+ actualParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case END:
+ case FINALIZATION:
+ case ELSE:
+ case UNTIL:
+ case EXCEPT:
+ case FINALLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ procedureStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = procedureStatement_AST;
+}
+
+void PascalParser::gotoStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST gotoStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(GOTO);
+ label();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ gotoStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = gotoStatement_AST;
+}
+
+void PascalParser::raiseStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST raiseStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp274_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp274_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp274_AST));
+ }
+ match(RAISE);
+ {
+ switch ( LA(1)) {
+ case IDENT:
+ {
+ functionCall();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case AT:
+ {
+ match(AT);
+ addressConstant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case END:
+ case FINALIZATION:
+ case ELSE:
+ case UNTIL:
+ case EXCEPT:
+ case FINALLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ break;
+ }
+ case SEMI:
+ case END:
+ case FINALIZATION:
+ case ELSE:
+ case UNTIL:
+ case EXCEPT:
+ case FINALLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ raiseStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = raiseStatement_AST;
+}
+
+void PascalParser::identifierOrArrayIdentifier() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST identifierOrArrayIdentifier_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ if ((LA(1) == IDENT) && (_tokenSet_65.member(LA(2)))) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ identifierOrArrayIdentifier_AST = RefPascalAST(currentAST.root);
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == LBRACK)) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(LBRACK);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop302;
+ }
+
+ }
+ _loop302:;
+ } // ( ... )*
+ match(RBRACK);
+ identifierOrArrayIdentifier_AST = RefPascalAST(currentAST.root);
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_65);
+ } else {
+ throw;
+ }
+ }
+ returnAST = identifierOrArrayIdentifier_AST;
+}
+
+void PascalParser::assignmentOperator() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST assignmentOperator_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case ASSIGN:
+ {
+ match(ASSIGN);
+ assignmentOperator_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case PLUSEQ:
+ {
+ RefPascalAST tmp280_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp280_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp280_AST));
+ }
+ match(PLUSEQ);
+ assignmentOperator_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case MINUSEQ:
+ {
+ RefPascalAST tmp281_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp281_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp281_AST));
+ }
+ match(MINUSEQ);
+ assignmentOperator_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case STAREQ:
+ {
+ RefPascalAST tmp282_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp282_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp282_AST));
+ }
+ match(STAREQ);
+ assignmentOperator_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case SLASHQE:
+ {
+ RefPascalAST tmp283_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp283_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp283_AST));
+ }
+ match(SLASHQE);
+ assignmentOperator_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_36);
+ } else {
+ throw;
+ }
+ }
+ returnAST = assignmentOperator_AST;
+}
+
+void PascalParser::repetitiveStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST repetitiveStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case FOR:
+ {
+ forStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ repetitiveStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case REPEAT:
+ {
+ repeatStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ repetitiveStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case WHILE:
+ {
+ whileStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ repetitiveStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = repetitiveStatement_AST;
+}
+
+void PascalParser::conditionalStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST conditionalStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case IF:
+ {
+ ifStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ conditionalStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case CASE:
+ {
+ caseStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ conditionalStatement_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = conditionalStatement_AST;
+}
+
+void PascalParser::exceptionStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST exceptionStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ tryStatement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ exceptionStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = exceptionStatement_AST;
+}
+
+void PascalParser::withStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST withStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp284_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp284_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp284_AST));
+ }
+ match(WITH);
+ recordVariableList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(DO);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ withStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = withStatement_AST;
+}
+
+void PascalParser::ifStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST ifStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp286_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp286_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp286_AST));
+ }
+ match(IF);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(THEN);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ if ((LA(1) == ELSE) && (_tokenSet_24.member(LA(2)))) {
+ match(ELSE);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else if ((_tokenSet_16.member(LA(1))) && (_tokenSet_66.member(LA(2)))) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ ifStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = ifStatement_AST;
+}
+
+void PascalParser::caseStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST caseStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp289_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp289_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp289_AST));
+ }
+ match(CASE);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(OF);
+ caseListElement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI) && (_tokenSet_33.member(LA(2)))) {
+ match(SEMI);
+ caseListElement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop320;
+ }
+
+ }
+ _loop320:;
+ } // ( ... )*
+ {
+ switch ( LA(1)) {
+ case SEMI:
+ {
+ match(SEMI);
+ match(ELSE);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop323;
+ }
+
+ }
+ _loop323:;
+ } // ( ... )*
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(END);
+ caseStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = caseStatement_AST;
+}
+
+void PascalParser::forStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST forStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp296_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp296_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp296_AST));
+ }
+ match(FOR);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(ASSIGN);
+ forList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(DO);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ forStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = forStatement_AST;
+}
+
+void PascalParser::repeatStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST repeatStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp299_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp299_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp299_AST));
+ }
+ match(REPEAT);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ {
+ switch ( LA(1)) {
+ case BEGIN:
+ case NUM_INT:
+ case CASE:
+ case GOTO:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ case RAISE:
+ case TRY:
+ case IDENT:
+ {
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case SEMI:
+ case UNTIL:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ }
+ else {
+ goto _loop332;
+ }
+
+ }
+ _loop332:;
+ } // ( ... )*
+ match(UNTIL);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ repeatStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = repeatStatement_AST;
+}
+
+void PascalParser::whileStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST whileStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp302_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp302_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp302_AST));
+ }
+ match(WHILE);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(DO);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ whileStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = whileStatement_AST;
+}
+
+void PascalParser::caseListElement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST caseListElement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ constList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ RefPascalAST tmp304_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp304_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp304_AST));
+ }
+ match(COLON);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ caseListElement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_67);
+ } else {
+ throw;
+ }
+ }
+ returnAST = caseListElement_AST;
+}
+
+void PascalParser::constList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST constList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ constant();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop327;
+ }
+
+ }
+ _loop327:;
+ } // ( ... )*
+ if ( inputState->guessing==0 ) {
+ constList_AST = RefPascalAST(currentAST.root);
+#line 746 "pascal.g"
+ constList_AST = RefPascalAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->create(CONSTLIST)))->add(ANTLR_USE_NAMESPACE(antlr)RefAST(constList_AST))));
+#line 8219 "PascalParser.cpp"
+ currentAST.root = constList_AST;
+ if ( constList_AST!=RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) &&
+ constList_AST->getFirstChild() != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ currentAST.child = constList_AST->getFirstChild();
+ else
+ currentAST.child = constList_AST;
+ currentAST.advanceChildToEnd();
+ }
+ constList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_55);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constList_AST;
+}
+
+void PascalParser::forList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST forList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ initialValue();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ {
+ switch ( LA(1)) {
+ case TO:
+ {
+ RefPascalAST tmp306_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp306_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp306_AST));
+ }
+ match(TO);
+ break;
+ }
+ case DOWNTO:
+ {
+ RefPascalAST tmp307_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp307_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp307_AST));
+ }
+ match(DOWNTO);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ finalValue();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ forList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_68);
+ } else {
+ throw;
+ }
+ }
+ returnAST = forList_AST;
+}
+
+void PascalParser::initialValue() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST initialValue_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ initialValue_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_69);
+ } else {
+ throw;
+ }
+ }
+ returnAST = initialValue_AST;
+}
+
+void PascalParser::finalValue() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST finalValue_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ finalValue_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_68);
+ } else {
+ throw;
+ }
+ }
+ returnAST = finalValue_AST;
+}
+
+void PascalParser::recordVariableList() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST recordVariableList_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ variable();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ variable();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop341;
+ }
+
+ }
+ _loop341:;
+ } // ( ... )*
+ recordVariableList_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_68);
+ } else {
+ throw;
+ }
+ }
+ returnAST = recordVariableList_AST;
+}
+
+/** A variable is an id with a suffix and can look like:
+ * id
+ * id[expr,...]
+ * id.id
+ * id.id[expr,...]
+ * id^
+ * id^.id
+ * id^.id[expr,...]
+ * ...
+ *
+ * LL has a really hard time with this construct as it's naturally
+ * left-recursive. We have to turn into a simple loop rather than
+ * recursive loop, hence, the suffixes. I keep in the same rule
+ * for easy tree construction.
+ */
+void PascalParser::variable() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST variable_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case AT:
+ {
+ RefPascalAST tmp309_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp309_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp309_AST));
+ }
+ match(AT);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case IDENT:
+ {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ { // ( ... )*
+ for (;;) {
+ switch ( LA(1)) {
+ case LBRACK:
+ {
+ RefPascalAST tmp310_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp310_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp310_AST));
+ }
+ match(LBRACK);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop346;
+ }
+
+ }
+ _loop346:;
+ } // ( ... )*
+ match(RBRACK);
+ break;
+ }
+ case LBRACK2:
+ {
+ RefPascalAST tmp313_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp313_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp313_AST));
+ }
+ match(LBRACK2);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == COMMA)) {
+ match(COMMA);
+ expression();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop348;
+ }
+
+ }
+ _loop348:;
+ } // ( ... )*
+ match(RBRACK2);
+ break;
+ }
+ case DOT:
+ {
+ RefPascalAST tmp316_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp316_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp316_AST));
+ }
+ match(DOT);
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case POINTER:
+ {
+ RefPascalAST tmp317_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp317_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp317_AST));
+ }
+ match(POINTER);
+ break;
+ }
+ default:
+ {
+ goto _loop349;
+ }
+ }
+ }
+ _loop349:;
+ } // ( ... )*
+ variable_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_70);
+ } else {
+ throw;
+ }
+ }
+ returnAST = variable_AST;
+}
+
+void PascalParser::operatorDefinition() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST operatorDefinition_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp318_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp318_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp318_AST));
+ }
+ match(OPERATOR);
+ {
+ switch ( LA(1)) {
+ case ASSIGN:
+ {
+ assignmentOperatorDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case PLUS:
+ case MINUS:
+ case STAR:
+ case SLASH:
+ {
+ arithmeticOperatorDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case EQUAL:
+ case LE:
+ case GE:
+ case LTH:
+ case GT:
+ {
+ comparisonOperatorDefinition();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ type();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(SEMI);
+ subroutineBlock();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ operatorDefinition_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_0);
+ } else {
+ throw;
+ }
+ }
+ returnAST = operatorDefinition_AST;
+}
+
+void PascalParser::assignmentOperatorDefinition() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST assignmentOperatorDefinition_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(ASSIGN);
+ match(LPAREN);
+ valueParameter();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ assignmentOperatorDefinition_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_71);
+ } else {
+ throw;
+ }
+ }
+ returnAST = assignmentOperatorDefinition_AST;
+}
+
+void PascalParser::arithmeticOperatorDefinition() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST arithmeticOperatorDefinition_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case PLUS:
+ {
+ match(PLUS);
+ break;
+ }
+ case MINUS:
+ {
+ match(MINUS);
+ break;
+ }
+ case SLASH:
+ {
+ match(SLASH);
+ break;
+ }
+ default:
+ if ((LA(1) == STAR) && (LA(2) == LPAREN)) {
+ match(STAR);
+ }
+ else if ((LA(1) == STAR) && (LA(2) == STAR)) {
+ {
+ match(STAR);
+ match(STAR);
+ }
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(LPAREN);
+ formalParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ arithmeticOperatorDefinition_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_71);
+ } else {
+ throw;
+ }
+ }
+ returnAST = arithmeticOperatorDefinition_AST;
+}
+
+void PascalParser::comparisonOperatorDefinition() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST comparisonOperatorDefinition_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ {
+ switch ( LA(1)) {
+ case EQUAL:
+ {
+ match(EQUAL);
+ break;
+ }
+ case LE:
+ {
+ match(LE);
+ break;
+ }
+ case GE:
+ {
+ match(GE);
+ break;
+ }
+ case GT:
+ {
+ match(GT);
+ break;
+ }
+ case LTH:
+ {
+ match(LTH);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ match(LPAREN);
+ formalParameterList();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ comparisonOperatorDefinition_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_71);
+ } else {
+ throw;
+ }
+ }
+ returnAST = comparisonOperatorDefinition_AST;
+}
+
+void PascalParser::tryStatement() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST tryStatement_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp339_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp339_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp339_AST));
+ }
+ match(TRY);
+ {
+ switch ( LA(1)) {
+ case BEGIN:
+ case NUM_INT:
+ case CASE:
+ case GOTO:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ case RAISE:
+ case TRY:
+ case IDENT:
+ {
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case EXCEPT:
+ case FINALLY:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ exceptOrFinallyPart();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(END);
+ tryStatement_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_16);
+ } else {
+ throw;
+ }
+ }
+ returnAST = tryStatement_AST;
+}
+
+void PascalParser::statements() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST statements_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop369;
+ }
+
+ }
+ _loop369:;
+ } // ( ... )*
+ statements_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_72);
+ } else {
+ throw;
+ }
+ }
+ returnAST = statements_AST;
+}
+
+void PascalParser::exceptOrFinallyPart() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST exceptOrFinallyPart_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case EXCEPT:
+ {
+ match(EXCEPT);
+ {
+ switch ( LA(1)) {
+ case BEGIN:
+ case NUM_INT:
+ case CASE:
+ case GOTO:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ case RAISE:
+ case TRY:
+ case ON:
+ case IDENT:
+ {
+ exceptionHandlers();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ exceptOrFinallyPart_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case FINALLY:
+ {
+ match(FINALLY);
+ {
+ switch ( LA(1)) {
+ case BEGIN:
+ case NUM_INT:
+ case CASE:
+ case GOTO:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ case RAISE:
+ case TRY:
+ case IDENT:
+ {
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ exceptOrFinallyPart_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = exceptOrFinallyPart_AST;
+}
+
+void PascalParser::exceptionHandlers() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST exceptionHandlers_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case BEGIN:
+ case NUM_INT:
+ case CASE:
+ case GOTO:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ case RAISE:
+ case TRY:
+ case IDENT:
+ {
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ exceptionHandlers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case ON:
+ {
+ exceptionHandler();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ { // ( ... )*
+ for (;;) {
+ if ((LA(1) == SEMI)) {
+ match(SEMI);
+ exceptionHandler();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ }
+ else {
+ goto _loop372;
+ }
+
+ }
+ _loop372:;
+ } // ( ... )*
+ {
+ switch ( LA(1)) {
+ case ELSE:
+ {
+ match(ELSE);
+ statements();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ break;
+ }
+ case END:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ exceptionHandlers_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_6);
+ } else {
+ throw;
+ }
+ }
+ returnAST = exceptionHandlers_AST;
+}
+
+void PascalParser::exceptionHandler() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST exceptionHandler_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ match(ON);
+ {
+ if ((LA(1) == IDENT) && (LA(2) == COLON)) {
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(COLON);
+ }
+ else if ((LA(1) == IDENT) && (LA(2) == DO)) {
+ }
+ else {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+
+ }
+ identifier();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(DO);
+ statement();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ exceptionHandler_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_73);
+ } else {
+ throw;
+ }
+ }
+ returnAST = exceptionHandler_AST;
+}
+
+void PascalParser::sign() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST sign_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case PLUS:
+ {
+ RefPascalAST tmp349_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp349_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp349_AST));
+ }
+ match(PLUS);
+ sign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case MINUS:
+ {
+ RefPascalAST tmp350_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp350_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp350_AST));
+ }
+ match(MINUS);
+ sign_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_74);
+ } else {
+ throw;
+ }
+ }
+ returnAST = sign_AST;
+}
+
+void PascalParser::constantChr() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST constantChr_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp351_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp351_AST = astFactory->create(LT(1));
+ astFactory->makeASTRoot(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp351_AST));
+ }
+ match(CHR);
+ match(LPAREN);
+ unsignedInteger();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ match(RPAREN);
+ constantChr_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_75);
+ } else {
+ throw;
+ }
+ }
+ returnAST = constantChr_AST;
+}
+
+void PascalParser::unsignedNumber() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST unsignedNumber_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ switch ( LA(1)) {
+ case NUM_INT:
+ {
+ unsignedInteger();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unsignedNumber_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ case NUM_REAL:
+ {
+ unsignedReal();
+ if (inputState->guessing==0) {
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST));
+ }
+ unsignedNumber_AST = RefPascalAST(currentAST.root);
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_76);
+ } else {
+ throw;
+ }
+ }
+ returnAST = unsignedNumber_AST;
+}
+
+void PascalParser::unsignedReal() {
+ returnAST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST;
+ RefPascalAST unsignedReal_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+
+ try { // for error handling
+ RefPascalAST tmp354_AST = RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST);
+ if ( inputState->guessing == 0 ) {
+ tmp354_AST = astFactory->create(LT(1));
+ astFactory->addASTChild(currentAST, ANTLR_USE_NAMESPACE(antlr)RefAST(tmp354_AST));
+ }
+ match(NUM_REAL);
+ unsignedReal_AST = RefPascalAST(currentAST.root);
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ if( inputState->guessing == 0 ) {
+ reportError(ex);
+ recover(ex,_tokenSet_76);
+ } else {
+ throw;
+ }
+ }
+ returnAST = unsignedReal_AST;
+}
+
+void PascalParser::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory )
+{
+ factory.setMaxNodeType(189);
+}
+const char* PascalParser::tokenNames[] = {
+ "<0>",
+ "EOF",
+ "<2>",
+ "NULL_TREE_LOOKAHEAD",
+ "BLOCK",
+ "IDLIST",
+ "ELIST",
+ "FUNC_CALL",
+ "PROC_CALL",
+ "SCALARTYPE",
+ "TYPELIST",
+ "VARIANT_TAG",
+ "VARIANT_TAG_NO_ID",
+ "VARIANT_CASE",
+ "CONSTLIST",
+ "FIELDLIST",
+ "ARGDECLS",
+ "VARDECL",
+ "ARGDECL",
+ "ARGLIST",
+ "TYPEDECL",
+ "FIELD",
+ "DOT",
+ "\"library\"",
+ "SEMI",
+ "\"end\"",
+ "\"exports\"",
+ "COMMA",
+ "\"index\"",
+ "\"name\"",
+ "\"uses\"",
+ "\"unit\"",
+ "\"interface\"",
+ "\"implementation\"",
+ "\"begin\"",
+ "\"program\"",
+ "LPAREN",
+ "RPAREN",
+ "\"initialization\"",
+ "\"finalization\"",
+ "\"label\"",
+ "\"const\"",
+ "\"resourcestring\"",
+ "EQUAL",
+ "\"type\"",
+ "\"var\"",
+ "COLON",
+ "\"procedure\"",
+ "\"forward\"",
+ "\"function\"",
+ "\"array\"",
+ "\"of\"",
+ "\"external\"",
+ "\"public\"",
+ "\"alias\"",
+ "INTERRUPT",
+ "\"export\"",
+ "\"register\"",
+ "\"pascal\"",
+ "\"cdecl\"",
+ "\"stdcall\"",
+ "\"popstack\"",
+ "\"saveregisters\"",
+ "\"inline\"",
+ "\"safecall\"",
+ "\"near\"",
+ "\"far\"",
+ "NUM_INT",
+ "\"integer\"",
+ "\"shortint\"",
+ "\"smallint\"",
+ "\"longint\"",
+ "\"int64\"",
+ "\"byte\"",
+ "\"word\"",
+ "\"cardinal\"",
+ "\"qword\"",
+ "\"boolean\"",
+ "BYTEBOOL",
+ "LONGBOOL",
+ "\"char\"",
+ "DOTDOT",
+ "ASSIGN",
+ "\"real\"",
+ "\"single\"",
+ "\"double\"",
+ "\"extended\"",
+ "\"comp\"",
+ "\"string\"",
+ "LBRACK",
+ "RBRACK",
+ "\"packed\"",
+ "\"record\"",
+ "\"case\"",
+ "\"set\"",
+ "\"file\"",
+ "POINTER",
+ "\"object\"",
+ "\"virtual\"",
+ "\"abstract\"",
+ "\"private\"",
+ "\"protected\"",
+ "\"constructor\"",
+ "\"destructor\"",
+ "\"class\"",
+ "\"override\"",
+ "MESSAGE",
+ "\"published\"",
+ "\"property\"",
+ "\"read\"",
+ "\"write\"",
+ "\"default\"",
+ "\"nodefault\"",
+ "LE",
+ "GE",
+ "LTH",
+ "GT",
+ "NOT_EQUAL",
+ "\"in\"",
+ "\"is\"",
+ "PLUS",
+ "MINUS",
+ "\"or\"",
+ "\"xor\"",
+ "STAR",
+ "SLASH",
+ "\"div\"",
+ "\"mod\"",
+ "\"and\"",
+ "\"shl\"",
+ "\"shr\"",
+ "\"not\"",
+ "\"true\"",
+ "\"false\"",
+ "AT",
+ "PLUSEQ",
+ "MINUSEQ",
+ "STAREQ",
+ "SLASHQE",
+ "\"goto\"",
+ "\"if\"",
+ "\"then\"",
+ "\"else\"",
+ "\"while\"",
+ "\"do\"",
+ "\"repeat\"",
+ "\"until\"",
+ "\"for\"",
+ "\"to\"",
+ "\"downto\"",
+ "\"with\"",
+ "LBRACK2",
+ "RBRACK2",
+ "\"operator\"",
+ "\"raise\"",
+ "\"try\"",
+ "\"except\"",
+ "\"finally\"",
+ "\"on\"",
+ "STRING_LITERAL",
+ "\"chr\"",
+ "\"nil\"",
+ "NUM_REAL",
+ "IDENT",
+ "\"absolute\"",
+ "\"as\"",
+ "\"asm\"",
+ "\"assembler\"",
+ "\"break\"",
+ "\"continue\"",
+ "\"dispose\"",
+ "\"exit\"",
+ "\"inherited\"",
+ "\"new\"",
+ "\"self\"",
+ "METHOD",
+ "ADDSUBOR",
+ "ASSIGNEQUAL",
+ "SIGN",
+ "FUNC",
+ "NODE_NOT_EMIT",
+ "MYASTVAR",
+ "LF",
+ "LCURLY",
+ "RCURLY",
+ "WS",
+ "COMMENT_1",
+ "COMMENT_2",
+ "COMMENT_3",
+ "EXPONENT",
+ 0
+};
+
+const unsigned long PascalParser::_tokenSet_0_data_[] = { 2UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_0(_tokenSet_0_data_,6);
+const unsigned long PascalParser::_tokenSet_1_data_[] = { 1073741824UL, 177924UL, 0UL, 192UL, 0UL, 0UL, 0UL, 0UL };
+// "uses" "begin" "label" "const" "resourcestring" "type" "var" "procedure"
+// "function" "constructor" "destructor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_1(_tokenSet_1_data_,8);
+const unsigned long PascalParser::_tokenSet_2_data_[] = { 100663296UL, 177990UL, 0UL, 192UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "exports" "implementation" "begin" "initialization" "label" "const"
+// "resourcestring" "type" "var" "procedure" "function" "constructor" "destructor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_2(_tokenSet_2_data_,8);
+const unsigned long PascalParser::_tokenSet_3_data_[] = { 121634818UL, 177988UL, 0UL, 192UL, 0UL, 0UL, 0UL, 0UL };
+// EOF DOT SEMI "end" "exports" "begin" "initialization" "label" "const"
+// "resourcestring" "type" "var" "procedure" "function" "constructor" "destructor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_3(_tokenSet_3_data_,8);
+const unsigned long PascalParser::_tokenSet_4_data_[] = { 994050050UL, 706736UL, 101056512UL, 4294963649UL, 833972167UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF DOT SEMI "end" COMMA "index" "name" LPAREN RPAREN "finalization"
+// EQUAL COLON "procedure" "function" "of" DOTDOT ASSIGN LBRACK RBRACK
+// POINTER "constructor" "destructor" "class" "property" "read" "write"
+// "default" "nodefault" LE GE LTH GT NOT_EQUAL "in" "is" PLUS MINUS "or"
+// "xor" STAR SLASH "div" "mod" "and" "shl" "shr" AT PLUSEQ MINUSEQ STAREQ
+// SLASHQE "then" "else" "do" "until" "to" "downto" LBRACK2 RBRACK2 "except"
+// "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_4(_tokenSet_4_data_,12);
+const unsigned long PascalParser::_tokenSet_5_data_[] = { 67108864UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "exports"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_5(_tokenSet_5_data_,6);
+const unsigned long PascalParser::_tokenSet_6_data_[] = { 33554432UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "end"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_6(_tokenSet_6_data_,6);
+const unsigned long PascalParser::_tokenSet_7_data_[] = { 100663296UL, 68UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "exports" "begin" "initialization"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_7(_tokenSet_7_data_,6);
+const unsigned long PascalParser::_tokenSet_8_data_[] = { 184549376UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "end" COMMA
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_8(_tokenSet_8_data_,6);
+const unsigned long PascalParser::_tokenSet_9_data_[] = { 788529154UL, 177988UL, 0UL, 127424UL, 0UL, 0UL, 0UL, 0UL };
+// EOF SEMI "end" "exports" COMMA "name" "begin" "initialization" "label"
+// "const" "resourcestring" "type" "var" "procedure" "function" "constructor"
+// "destructor" "class" "property" "read" "write" "default" "nodefault"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_9(_tokenSet_9_data_,8);
+const unsigned long PascalParser::_tokenSet_10_data_[] = { 1056964610UL, 177988UL, 0UL, 192UL, 0UL, 0UL, 0UL, 0UL };
+// EOF SEMI "end" "exports" COMMA "index" "name" "begin" "initialization"
+// "label" "const" "resourcestring" "type" "var" "procedure" "function"
+// "constructor" "destructor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_10(_tokenSet_10_data_,8);
+const unsigned long PascalParser::_tokenSet_11_data_[] = { 16777216UL, 16416UL, 67108864UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RPAREN COLON RBRACK
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_11(_tokenSet_11_data_,8);
+const unsigned long PascalParser::_tokenSet_12_data_[] = { 0UL, 2UL, 0UL, 0UL, 0UL, 0UL };
+// "implementation"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_12(_tokenSet_12_data_,6);
+const unsigned long PascalParser::_tokenSet_13_data_[] = { 33554432UL, 68UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "begin" "initialization"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_13(_tokenSet_13_data_,6);
+const unsigned long PascalParser::_tokenSet_14_data_[] = { 33554432UL, 128UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "finalization"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_14(_tokenSet_14_data_,6);
+const unsigned long PascalParser::_tokenSet_15_data_[] = { 0UL, 168450UL, 0UL, 0UL, 0UL, 0UL };
+// "implementation" "const" "type" "procedure" "function"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_15(_tokenSet_15_data_,6);
+const unsigned long PascalParser::_tokenSet_16_data_[] = { 50331648UL, 128UL, 0UL, 0UL, 805584896UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "end" "finalization" "else" "until" "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_16(_tokenSet_16_data_,12);
+const unsigned long PascalParser::_tokenSet_17_data_[] = { 100663296UL, 177988UL, 0UL, 192UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "exports" "begin" "initialization" "label" "const" "resourcestring"
+// "type" "var" "procedure" "function" "constructor" "destructor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_17(_tokenSet_17_data_,8);
+const unsigned long PascalParser::_tokenSet_18_data_[] = { 184549376UL, 16512UL, 0UL, 0UL, 805584896UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "end" COMMA "finalization" COLON "else" "until" "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_18(_tokenSet_18_data_,12);
+const unsigned long PascalParser::_tokenSet_19_data_[] = { 100663296UL, 177990UL, 0UL, 192UL, 0UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "exports" "implementation" "begin" "initialization" "label" "const"
+// "resourcestring" "type" "var" "procedure" "function" "constructor" "destructor"
+// IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_19(_tokenSet_19_data_,12);
+const unsigned long PascalParser::_tokenSet_20_data_[] = { 100663296UL, 177988UL, 0UL, 192UL, 0UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "exports" "begin" "initialization" "label" "const" "resourcestring"
+// "type" "var" "procedure" "function" "constructor" "destructor" IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_20(_tokenSet_20_data_,12);
+const unsigned long PascalParser::_tokenSet_21_data_[] = { 1061158914UL, 720868UL, 67239936UL, 4294840768UL, 825581575UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF DOT SEMI "end" "exports" COMMA "index" "name" "begin" RPAREN "initialization"
+// "finalization" "label" "const" "resourcestring" EQUAL "type" "var" COLON
+// "procedure" "function" "of" DOTDOT RBRACK "constructor" "destructor"
+// "class" "property" LE GE LTH GT NOT_EQUAL "in" "is" PLUS MINUS "or"
+// "xor" STAR SLASH "div" "mod" "and" "shl" "shr" "then" "else" "do" "until"
+// "to" "downto" RBRACK2 "except" "finally" IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_21(_tokenSet_21_data_,12);
+const unsigned long PascalParser::_tokenSet_22_data_[] = { 16777216UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_22(_tokenSet_22_data_,6);
+const unsigned long PascalParser::_tokenSet_23_data_[] = { 16777216UL, 2080UL, 67108864UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RPAREN EQUAL RBRACK
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_23(_tokenSet_23_data_,8);
+const unsigned long PascalParser::_tokenSet_24_data_[] = { 0UL, 4UL, 536870920UL, 0UL, 206215168UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "begin" NUM_INT "case" "goto" "if" "while" "repeat" "for" "with" "raise"
+// "try" IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_24(_tokenSet_24_data_,12);
+const unsigned long PascalParser::_tokenSet_25_data_[] = { 121634818UL, 178116UL, 0UL, 192UL, 805584896UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF DOT SEMI "end" "exports" "begin" "initialization" "finalization"
+// "label" "const" "resourcestring" "type" "var" "procedure" "function"
+// "constructor" "destructor" "else" "until" "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_25(_tokenSet_25_data_,12);
+const unsigned long PascalParser::_tokenSet_26_data_[] = { 16777216UL, 1818406UL, 67108864UL, 192UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "implementation" "begin" RPAREN "label" "const" "resourcestring"
+// EQUAL "type" "var" "procedure" "forward" "function" "of" "external"
+// RBRACK "constructor" "destructor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_26(_tokenSet_26_data_,8);
+const unsigned long PascalParser::_tokenSet_27_data_[] = { 117440514UL, 177988UL, 0UL, 192UL, 0UL, 0UL, 0UL, 0UL };
+// EOF SEMI "end" "exports" "begin" "initialization" "label" "const" "resourcestring"
+// "type" "var" "procedure" "function" "constructor" "destructor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_27(_tokenSet_27_data_,8);
+const unsigned long PascalParser::_tokenSet_28_data_[] = { 16777216UL, 16400UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LPAREN COLON
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_28(_tokenSet_28_data_,6);
+const unsigned long PascalParser::_tokenSet_29_data_[] = { 16777216UL, 16416UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RPAREN COLON
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_29(_tokenSet_29_data_,6);
+const unsigned long PascalParser::_tokenSet_30_data_[] = { 16777216UL, 32UL, 67108864UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI RPAREN RBRACK
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_30(_tokenSet_30_data_,8);
+const unsigned long PascalParser::_tokenSet_31_data_[] = { 0UL, 426000UL, 3657039864UL, 50331907UL, 2147483648UL, 13UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LPAREN "procedure" "function" "array" NUM_INT "integer" "shortint" "smallint"
+// "longint" "int64" "byte" "word" "cardinal" "qword" "boolean" BYTEBOOL
+// LONGBOOL "char" "real" "single" "double" "extended" "comp" "string"
+// "packed" "record" "set" "file" POINTER "object" "class" PLUS MINUS STRING_LITERAL
+// "chr" NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_31(_tokenSet_31_data_,12);
+const unsigned long PascalParser::_tokenSet_32_data_[] = { 188743680UL, 524448UL, 67239936UL, 0UL, 825581568UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// DOT SEMI "end" COMMA RPAREN "finalization" "of" DOTDOT RBRACK "then"
+// "else" "do" "until" "to" "downto" RBRACK2 "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_32(_tokenSet_32_data_,12);
+const unsigned long PascalParser::_tokenSet_33_data_[] = { 0UL, 0UL, 8UL, 50331648UL, 2147483648UL, 13UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// NUM_INT PLUS MINUS STRING_LITERAL "chr" NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_33(_tokenSet_33_data_,12);
+const unsigned long PascalParser::_tokenSet_34_data_[] = { 16777216UL, 16UL, 8UL, 0UL, 0UL, 12UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LPAREN NUM_INT NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_34(_tokenSet_34_data_,12);
+const unsigned long PascalParser::_tokenSet_35_data_[] = { 0UL, 16UL, 8UL, 50331648UL, 2147483648UL, 13UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LPAREN NUM_INT PLUS MINUS STRING_LITERAL "chr" NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_35(_tokenSet_35_data_,12);
+const unsigned long PascalParser::_tokenSet_36_data_[] = { 0UL, 16UL, 33554440UL, 50331648UL, 2147483768UL, 15UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LPAREN NUM_INT LBRACK PLUS MINUS "not" "true" "false" AT STRING_LITERAL
+// "chr" "nil" NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_36(_tokenSet_36_data_,12);
+const unsigned long PascalParser::_tokenSet_37_data_[] = { 16777216UL, 2064UL, 100663304UL, 4294836224UL, 2147483775UL, 15UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI LPAREN EQUAL NUM_INT LBRACK RBRACK LE GE LTH GT NOT_EQUAL "in"
+// "is" PLUS MINUS "or" "xor" STAR SLASH "div" "mod" "and" "shl" "shr"
+// "not" "true" "false" AT STRING_LITERAL "chr" "nil" NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_37(_tokenSet_37_data_,12);
+const unsigned long PascalParser::_tokenSet_38_data_[] = { 184549378UL, 182304UL, 67239936UL, 4544UL, 0UL, 0UL, 0UL, 0UL };
+// EOF SEMI "end" COMMA RPAREN EQUAL COLON "procedure" "function" DOTDOT
+// RBRACK "constructor" "destructor" "class" "property"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_38(_tokenSet_38_data_,8);
+const unsigned long PascalParser::_tokenSet_39_data_[] = { 150994944UL, 32UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI COMMA RPAREN
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_39(_tokenSet_39_data_,6);
+const unsigned long PascalParser::_tokenSet_40_data_[] = { 150994944UL, 2080UL, 67108864UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI COMMA RPAREN EQUAL RBRACK
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_40(_tokenSet_40_data_,8);
+const unsigned long PascalParser::_tokenSet_41_data_[] = { 318767104UL, 165936UL, 67108864UL, 127424UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "end" "index" LPAREN RPAREN EQUAL "procedure" "function" RBRACK
+// "constructor" "destructor" "class" "property" "read" "write" "default"
+// "nodefault"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_41(_tokenSet_41_data_,8);
+const unsigned long PascalParser::_tokenSet_42_data_[] = { 0UL, 32UL, 0UL, 0UL, 0UL, 0UL };
+// RPAREN
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_42(_tokenSet_42_data_,6);
+const unsigned long PascalParser::_tokenSet_43_data_[] = { 792723458UL, 720868UL, 67239936UL, 4294963648UL, 825581575UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF DOT SEMI "end" "exports" COMMA "name" "begin" RPAREN "initialization"
+// "finalization" "label" "const" "resourcestring" EQUAL "type" "var" COLON
+// "procedure" "function" "of" DOTDOT RBRACK "constructor" "destructor"
+// "class" "property" "read" "write" "default" "nodefault" LE GE LTH GT
+// NOT_EQUAL "in" "is" PLUS MINUS "or" "xor" STAR SLASH "div" "mod" "and"
+// "shl" "shr" "then" "else" "do" "until" "to" "downto" RBRACK2 "except"
+// "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_43(_tokenSet_43_data_,12);
+const unsigned long PascalParser::_tokenSet_44_data_[] = { 0UL, 2064UL, 100794376UL, 4294836224UL, 2147483775UL, 15UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// LPAREN EQUAL NUM_INT DOTDOT LBRACK RBRACK LE GE LTH GT NOT_EQUAL "in"
+// "is" PLUS MINUS "or" "xor" STAR SLASH "div" "mod" "and" "shl" "shr"
+// "not" "true" "false" AT STRING_LITERAL "chr" "nil" NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_44(_tokenSet_44_data_,12);
+const unsigned long PascalParser::_tokenSet_45_data_[] = { 134217728UL, 0UL, 67108864UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// COMMA RBRACK
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_45(_tokenSet_45_data_,8);
+const unsigned long PascalParser::_tokenSet_46_data_[] = { 33554432UL, 32UL, 536870912UL, 0UL, 0UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "end" RPAREN "case" IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_46(_tokenSet_46_data_,12);
+const unsigned long PascalParser::_tokenSet_47_data_[] = { 50331648UL, 32UL, 536870912UL, 0UL, 0UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "end" RPAREN "case" IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_47(_tokenSet_47_data_,12);
+const unsigned long PascalParser::_tokenSet_48_data_[] = { 33554432UL, 2260992UL, 0UL, 6640UL, 0UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "procedure" "function" "public" "private" "protected" "constructor"
+// "destructor" "class" "published" "property" IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_48(_tokenSet_48_data_,12);
+const unsigned long PascalParser::_tokenSet_49_data_[] = { 0UL, 163840UL, 0UL, 192UL, 0UL, 0UL, 0UL, 0UL };
+// "procedure" "function" "constructor" "destructor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_49(_tokenSet_49_data_,8);
+const unsigned long PascalParser::_tokenSet_50_data_[] = { 33554432UL, 163840UL, 0UL, 4544UL, 0UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "procedure" "function" "constructor" "destructor" "class" "property"
+// IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_50(_tokenSet_50_data_,12);
+const unsigned long PascalParser::_tokenSet_51_data_[] = { 33554432UL, 163840UL, 0UL, 192UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "procedure" "function" "constructor" "destructor"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_51(_tokenSet_51_data_,8);
+const unsigned long PascalParser::_tokenSet_52_data_[] = { 0UL, 163840UL, 0UL, 4544UL, 0UL, 0UL, 0UL, 0UL };
+// "procedure" "function" "constructor" "destructor" "class" "property"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_52(_tokenSet_52_data_,8);
+const unsigned long PascalParser::_tokenSet_53_data_[] = { 33554432UL, 163840UL, 0UL, 4544UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "procedure" "function" "constructor" "destructor" "class" "property"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_53(_tokenSet_53_data_,8);
+const unsigned long PascalParser::_tokenSet_54_data_[] = { 33554432UL, 163840UL, 0UL, 127424UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "procedure" "function" "constructor" "destructor" "class" "property"
+// "read" "write" "default" "nodefault"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_54(_tokenSet_54_data_,8);
+const unsigned long PascalParser::_tokenSet_55_data_[] = { 0UL, 16384UL, 0UL, 0UL, 0UL, 0UL };
+// COLON
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_55(_tokenSet_55_data_,6);
+const unsigned long PascalParser::_tokenSet_56_data_[] = { 33554432UL, 163840UL, 0UL, 119232UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "procedure" "function" "constructor" "destructor" "class" "property"
+// "write" "default" "nodefault"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_56(_tokenSet_56_data_,8);
+const unsigned long PascalParser::_tokenSet_57_data_[] = { 33554432UL, 163840UL, 0UL, 102848UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "procedure" "function" "constructor" "destructor" "class" "property"
+// "default" "nodefault"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_57(_tokenSet_57_data_,8);
+const unsigned long PascalParser::_tokenSet_58_data_[] = { 188743680UL, 526496UL, 67239936UL, 16646144UL, 825581568UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// DOT SEMI "end" COMMA RPAREN "finalization" EQUAL "of" DOTDOT RBRACK
+// LE GE LTH GT NOT_EQUAL "in" "is" "then" "else" "do" "until" "to" "downto"
+// RBRACK2 "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_58(_tokenSet_58_data_,12);
+const unsigned long PascalParser::_tokenSet_59_data_[] = { 188743680UL, 526496UL, 67239936UL, 268304384UL, 825581568UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// DOT SEMI "end" COMMA RPAREN "finalization" EQUAL "of" DOTDOT RBRACK
+// LE GE LTH GT NOT_EQUAL "in" "is" PLUS MINUS "or" "xor" "then" "else"
+// "do" "until" "to" "downto" RBRACK2 "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_59(_tokenSet_59_data_,12);
+const unsigned long PascalParser::_tokenSet_60_data_[] = { 188743680UL, 526512UL, 67239936UL, 4294836224UL, 825581575UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// DOT SEMI "end" COMMA LPAREN RPAREN "finalization" EQUAL "of" DOTDOT
+// RBRACK LE GE LTH GT NOT_EQUAL "in" "is" PLUS MINUS "or" "xor" STAR SLASH
+// "div" "mod" "and" "shl" "shr" "then" "else" "do" "until" "to" "downto"
+// RBRACK2 "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_60(_tokenSet_60_data_,12);
+const unsigned long PascalParser::_tokenSet_61_data_[] = { 188743680UL, 526496UL, 67239936UL, 4294836224UL, 825581575UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// DOT SEMI "end" COMMA RPAREN "finalization" EQUAL "of" DOTDOT RBRACK
+// LE GE LTH GT NOT_EQUAL "in" "is" PLUS MINUS "or" "xor" STAR SLASH "div"
+// "mod" "and" "shl" "shr" "then" "else" "do" "until" "to" "downto" RBRACK2
+// "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_61(_tokenSet_61_data_,12);
+const unsigned long PascalParser::_tokenSet_62_data_[] = { 50331648UL, 128UL, 0UL, 0UL, 805584960UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "end" "finalization" AT "else" "until" "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_62(_tokenSet_62_data_,12);
+const unsigned long PascalParser::_tokenSet_63_data_[] = { 0UL, 0UL, 33816576UL, 0UL, 1920UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// ASSIGN LBRACK PLUSEQ MINUSEQ STAREQ SLASHQE
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_63(_tokenSet_63_data_,12);
+const unsigned long PascalParser::_tokenSet_64_data_[] = { 50331648UL, 144UL, 0UL, 0UL, 805584896UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "end" LPAREN "finalization" "else" "until" "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_64(_tokenSet_64_data_,12);
+const unsigned long PascalParser::_tokenSet_65_data_[] = { 0UL, 0UL, 262144UL, 0UL, 1920UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// ASSIGN PLUSEQ MINUSEQ STAREQ SLASHQE
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_65(_tokenSet_65_data_,12);
+const unsigned long PascalParser::_tokenSet_66_data_[] = { 121634818UL, 178132UL, 570425352UL, 50331840UL, 4233025656UL, 15UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF DOT SEMI "end" "exports" "begin" LPAREN "initialization" "finalization"
+// "label" "const" "resourcestring" "type" "var" "procedure" "function"
+// NUM_INT LBRACK "case" "constructor" "destructor" PLUS MINUS "not" "true"
+// "false" AT "goto" "if" "else" "while" "repeat" "until" "for" "with"
+// "raise" "try" "except" "finally" "on" STRING_LITERAL "chr" "nil" NUM_REAL
+// IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_66(_tokenSet_66_data_,12);
+const unsigned long PascalParser::_tokenSet_67_data_[] = { 50331648UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "end"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_67(_tokenSet_67_data_,6);
+const unsigned long PascalParser::_tokenSet_68_data_[] = { 0UL, 0UL, 0UL, 0UL, 65536UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "do"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_68(_tokenSet_68_data_,12);
+const unsigned long PascalParser::_tokenSet_69_data_[] = { 0UL, 0UL, 0UL, 0UL, 3145728UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "to" "downto"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_69(_tokenSet_69_data_,12);
+const unsigned long PascalParser::_tokenSet_70_data_[] = { 134217728UL, 0UL, 0UL, 0UL, 65536UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// COMMA "do"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_70(_tokenSet_70_data_,12);
+const unsigned long PascalParser::_tokenSet_71_data_[] = { 0UL, 0UL, 0UL, 0UL, 0UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_71(_tokenSet_71_data_,12);
+const unsigned long PascalParser::_tokenSet_72_data_[] = { 33554432UL, 0UL, 0UL, 0UL, 805306368UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// "end" "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_72(_tokenSet_72_data_,12);
+const unsigned long PascalParser::_tokenSet_73_data_[] = { 50331648UL, 0UL, 0UL, 0UL, 16384UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SEMI "end" "else"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_73(_tokenSet_73_data_,12);
+const unsigned long PascalParser::_tokenSet_74_data_[] = { 0UL, 0UL, 8UL, 0UL, 0UL, 12UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// NUM_INT NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_74(_tokenSet_74_data_,12);
+const unsigned long PascalParser::_tokenSet_75_data_[] = { 1061158914UL, 720868UL, 67239936UL, 4294840768UL, 825581575UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF DOT SEMI "end" "exports" COMMA "index" "name" "begin" RPAREN "initialization"
+// "finalization" "label" "const" "resourcestring" EQUAL "type" "var" COLON
+// "procedure" "function" "of" DOTDOT RBRACK "constructor" "destructor"
+// "class" "property" LE GE LTH GT NOT_EQUAL "in" "is" PLUS MINUS "or"
+// "xor" STAR SLASH "div" "mod" "and" "shl" "shr" "then" "else" "do" "until"
+// "to" "downto" RBRACK2 "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_75(_tokenSet_75_data_,12);
+const unsigned long PascalParser::_tokenSet_76_data_[] = { 188743682UL, 706720UL, 67239936UL, 4294840768UL, 825581575UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// EOF DOT SEMI "end" COMMA RPAREN "finalization" EQUAL COLON "procedure"
+// "function" "of" DOTDOT RBRACK "constructor" "destructor" "class" "property"
+// LE GE LTH GT NOT_EQUAL "in" "is" PLUS MINUS "or" "xor" STAR SLASH "div"
+// "mod" "and" "shl" "shr" "then" "else" "do" "until" "to" "downto" RBRACK2
+// "except" "finally"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalParser::_tokenSet_76(_tokenSet_76_data_,12);
+
+
diff --git a/languages/pascal/PascalParser.hpp b/languages/pascal/PascalParser.hpp
new file mode 100644
index 00000000..d37d76c5
--- /dev/null
+++ b/languages/pascal/PascalParser.hpp
@@ -0,0 +1,422 @@
+#ifndef INC_PascalParser_hpp_
+#define INC_PascalParser_hpp_
+
+#line 29 "pascal.g"
+
+ #include "problemreporter.h"
+ #include "PascalAST.hpp"
+
+ #include <qlistview.h>
+ #include <kdebug.h>
+
+ #define SET_POSITION(ast,t)\
+ { \
+ RefPascalAST(ast)->setLine( t->getLine() );\
+ RefPascalAST(ast)->setColumn( t->getColumn() ); \
+ }
+
+#line 19 "PascalParser.hpp"
+#include <antlr/config.hpp>
+/* $ANTLR 2.7.7 (20061129): "pascal.g" -> "PascalParser.hpp"$ */
+#include <antlr/TokenStream.hpp>
+#include <antlr/TokenBuffer.hpp>
+#include "PascalTokenTypes.hpp"
+#include <antlr/LLkParser.hpp>
+
+class CUSTOM_API PascalParser : public ANTLR_USE_NAMESPACE(antlr)LLkParser, public PascalTokenTypes
+{
+#line 90 "pascal.g"
+
+private:
+ unsigned int m_numberOfErrors;
+ ProblemReporter* m_problemReporter;
+
+public:
+ void resetErrors() { m_numberOfErrors = 0; }
+ unsigned int numberOfErrors() const { return m_numberOfErrors; }
+ void setProblemReporter( ProblemReporter* r ) { m_problemReporter = r; }
+
+ void reportError( const ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex ){
+ m_problemReporter->reportError( ex.getMessage().c_str(),
+ ex.getFilename().c_str(),
+ ex.getLine(),
+ ex.getColumn() );
+ ++m_numberOfErrors;
+ }
+
+ void reportError( const ANTLR_USE_NAMESPACE(std)string& errorMessage ){
+ m_problemReporter->reportError( errorMessage.c_str(),
+ getFilename().c_str(),
+ LT(1)->getLine(),
+ LT(1)->getColumn() );
+ ++m_numberOfErrors;
+ }
+
+ void reportMessage( const ANTLR_USE_NAMESPACE(std)string& message ){
+ m_problemReporter->reportMessage( message.c_str(),
+ getFilename().c_str(),
+ LT(1)->getLine(),
+ LT(1)->getColumn() );
+ }
+#line 30 "PascalParser.hpp"
+public:
+ void initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory );
+protected:
+ PascalParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf, int k);
+public:
+ PascalParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf);
+protected:
+ PascalParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer, int k);
+public:
+ PascalParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer);
+ PascalParser(const ANTLR_USE_NAMESPACE(antlr)ParserSharedInputState& state);
+ int getNumTokens() const
+ {
+ return PascalParser::NUM_TOKENS;
+ }
+ const char* getTokenName( int type ) const
+ {
+ if( type > getNumTokens() ) return 0;
+ return PascalParser::tokenNames[type];
+ }
+ const char* const* getTokenNames() const
+ {
+ return PascalParser::tokenNames;
+ }
+ public: void compilationUnit();
+ public: void program();
+ public: void library();
+ public: void unit();
+ public: void programHeading();
+ public: void usesClause();
+ public: void block();
+ public: void identifier();
+ public: void libraryBlock();
+ public: void exportsClause();
+ public: void declarationPart();
+ public: void statementPart();
+ public: void exportsList();
+ public: void exportsEntry();
+ public: void integerConstant();
+ public: void stringConstant();
+ public: void identifierList();
+ public: void interfacePart();
+ public: void implementationPart();
+ public: void initializationPart();
+ public: void finalizationPart();
+ public: void realizationPart();
+ public: void constantDeclarationPart();
+ public: void typeDeclarationPart();
+ public: void procedureHeadersPart();
+ public: void statement();
+ public: void labelDeclarationPart();
+ public: void resourcestringDeclarationPart();
+ public: void variableDeclarationPart();
+ public: void procedureAndFunctionDeclarationPart();
+ public: void label();
+ public: void constantDeclaration();
+ public: void typedConstantDeclaration();
+ public: void stringConstantDeclaration();
+ public: void string();
+ public: void typeDeclaration();
+ public: void variableDeclaration();
+ public: void type();
+ public: void procedureAndFunctionDeclaration();
+ public: void procedureDeclaration();
+ public: void functionDeclaration();
+ public: void constructorDeclaration();
+ public: void destructorDeclaration();
+ public: void compoundStatement();
+ public: void procedureHeader();
+ public: void subroutineBlock();
+ public: void functionHeader();
+ public: void qualifiedMethodIdentifier();
+ public: void formalParameterList();
+ public: void modifiers();
+ public: void externalDirective();
+ public: void functionHeaderEnding();
+ public: void parameterDeclaration();
+ public: void valueParameter();
+ public: void variableParameter();
+ public: void constantParameter();
+ public: void untypedParameterPart();
+ public: void callModifiers();
+ public: void expression();
+ public: void typedConstant();
+ public: void constant();
+ public: void recordConstant();
+ public: void arrayConstant();
+ public: void proceduralConstant();
+ public: void addressConstant();
+ public: void simpleType();
+ public: void subrangeTypeOrTypeIdentifier();
+ public: void enumeratedType();
+ public: void stringType();
+ public: void structuredType();
+ public: void pointerType();
+ public: void proceduralType();
+ public: void ordinalType();
+ public: void realType();
+ public: void typeIdentifier();
+ public: void subrangeType();
+ public: void assignedEnumList();
+ public: void unsignedInteger();
+ public: void arrayType();
+ public: void recordType();
+ public: void objectType();
+ public: void classType();
+ public: void setType();
+ public: void fileType();
+ public: void arrayIndexType();
+ public: void arraySubrangeType();
+ public: void fieldList();
+ public: void fixedField();
+ public: void variantPart();
+ public: void variant();
+ public: void proceduralTypePart1();
+ public: void heritage();
+ public: void componentList();
+ public: void objectVisibilitySpecifier();
+ public: void fieldDefinition();
+ public: void methodDefinition();
+ public: void constructorHeader();
+ public: void destructorHeader();
+ public: void methodDirectives();
+ public: void classComponentList();
+ public: void classVisibilitySpecifier();
+ public: void classMethodDefinition();
+ public: void propertyDefinition();
+ public: void classMethodDirectives();
+ public: void directiveVariants();
+ public: void propertyInterface();
+ public: void propertySpecifiers();
+ public: void propertyParameterList();
+ public: void readSpecifier();
+ public: void writeSpecifier();
+ public: void defaultSpecifier();
+ public: void fieldOrMethod();
+ public: void simpleExpression();
+ public: void expressionSign();
+ public: void term();
+ public: void factor();
+ public: void identifierOrValueTypecastOrFunctionCall();
+ public: void unsignedConstant();
+ public: void setConstructor();
+ public: void addressFactor();
+ public: void expressions();
+ public: void functionCall();
+ public: void actualParameterList();
+ public: void setGroup();
+ public: void valueTypecast();
+ public: void simpleStatement();
+ public: void structuredStatement();
+ public: void assignmentStatement();
+ public: void procedureStatement();
+ public: void gotoStatement();
+ public: void raiseStatement();
+ public: void identifierOrArrayIdentifier();
+ public: void assignmentOperator();
+ public: void repetitiveStatement();
+ public: void conditionalStatement();
+ public: void exceptionStatement();
+ public: void withStatement();
+ public: void ifStatement();
+ public: void caseStatement();
+ public: void forStatement();
+ public: void repeatStatement();
+ public: void whileStatement();
+ public: void caseListElement();
+ public: void constList();
+ public: void forList();
+ public: void initialValue();
+ public: void finalValue();
+ public: void recordVariableList();
+ public: void variable();
+ public: void operatorDefinition();
+ public: void assignmentOperatorDefinition();
+ public: void arithmeticOperatorDefinition();
+ public: void comparisonOperatorDefinition();
+ public: void tryStatement();
+ public: void statements();
+ public: void exceptOrFinallyPart();
+ public: void exceptionHandlers();
+ public: void exceptionHandler();
+ public: void sign();
+ public: void constantChr();
+ public: void unsignedNumber();
+ public: void unsignedReal();
+public:
+ ANTLR_USE_NAMESPACE(antlr)RefAST getAST()
+ {
+ return ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST);
+ }
+
+protected:
+ RefPascalAST returnAST;
+private:
+ static const char* tokenNames[];
+#ifndef NO_STATIC_CONSTS
+ static const int NUM_TOKENS = 190;
+#else
+ enum {
+ NUM_TOKENS = 190
+ };
+#endif
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+ static const unsigned long _tokenSet_2_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2;
+ static const unsigned long _tokenSet_3_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3;
+ static const unsigned long _tokenSet_4_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_4;
+ static const unsigned long _tokenSet_5_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_5;
+ static const unsigned long _tokenSet_6_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_6;
+ static const unsigned long _tokenSet_7_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_7;
+ static const unsigned long _tokenSet_8_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_8;
+ static const unsigned long _tokenSet_9_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_9;
+ static const unsigned long _tokenSet_10_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_10;
+ static const unsigned long _tokenSet_11_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_11;
+ static const unsigned long _tokenSet_12_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_12;
+ static const unsigned long _tokenSet_13_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_13;
+ static const unsigned long _tokenSet_14_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_14;
+ static const unsigned long _tokenSet_15_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_15;
+ static const unsigned long _tokenSet_16_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_16;
+ static const unsigned long _tokenSet_17_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_17;
+ static const unsigned long _tokenSet_18_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_18;
+ static const unsigned long _tokenSet_19_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_19;
+ static const unsigned long _tokenSet_20_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_20;
+ static const unsigned long _tokenSet_21_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_21;
+ static const unsigned long _tokenSet_22_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_22;
+ static const unsigned long _tokenSet_23_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_23;
+ static const unsigned long _tokenSet_24_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_24;
+ static const unsigned long _tokenSet_25_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_25;
+ static const unsigned long _tokenSet_26_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_26;
+ static const unsigned long _tokenSet_27_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_27;
+ static const unsigned long _tokenSet_28_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_28;
+ static const unsigned long _tokenSet_29_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_29;
+ static const unsigned long _tokenSet_30_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_30;
+ static const unsigned long _tokenSet_31_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_31;
+ static const unsigned long _tokenSet_32_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_32;
+ static const unsigned long _tokenSet_33_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_33;
+ static const unsigned long _tokenSet_34_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_34;
+ static const unsigned long _tokenSet_35_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_35;
+ static const unsigned long _tokenSet_36_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_36;
+ static const unsigned long _tokenSet_37_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_37;
+ static const unsigned long _tokenSet_38_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_38;
+ static const unsigned long _tokenSet_39_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_39;
+ static const unsigned long _tokenSet_40_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_40;
+ static const unsigned long _tokenSet_41_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_41;
+ static const unsigned long _tokenSet_42_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_42;
+ static const unsigned long _tokenSet_43_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_43;
+ static const unsigned long _tokenSet_44_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_44;
+ static const unsigned long _tokenSet_45_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_45;
+ static const unsigned long _tokenSet_46_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_46;
+ static const unsigned long _tokenSet_47_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_47;
+ static const unsigned long _tokenSet_48_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_48;
+ static const unsigned long _tokenSet_49_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_49;
+ static const unsigned long _tokenSet_50_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_50;
+ static const unsigned long _tokenSet_51_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_51;
+ static const unsigned long _tokenSet_52_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_52;
+ static const unsigned long _tokenSet_53_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_53;
+ static const unsigned long _tokenSet_54_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_54;
+ static const unsigned long _tokenSet_55_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_55;
+ static const unsigned long _tokenSet_56_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_56;
+ static const unsigned long _tokenSet_57_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_57;
+ static const unsigned long _tokenSet_58_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_58;
+ static const unsigned long _tokenSet_59_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_59;
+ static const unsigned long _tokenSet_60_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_60;
+ static const unsigned long _tokenSet_61_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_61;
+ static const unsigned long _tokenSet_62_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_62;
+ static const unsigned long _tokenSet_63_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_63;
+ static const unsigned long _tokenSet_64_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_64;
+ static const unsigned long _tokenSet_65_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_65;
+ static const unsigned long _tokenSet_66_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_66;
+ static const unsigned long _tokenSet_67_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_67;
+ static const unsigned long _tokenSet_68_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_68;
+ static const unsigned long _tokenSet_69_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_69;
+ static const unsigned long _tokenSet_70_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_70;
+ static const unsigned long _tokenSet_71_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_71;
+ static const unsigned long _tokenSet_72_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_72;
+ static const unsigned long _tokenSet_73_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_73;
+ static const unsigned long _tokenSet_74_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_74;
+ static const unsigned long _tokenSet_75_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_75;
+ static const unsigned long _tokenSet_76_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_76;
+};
+
+#endif /*INC_PascalParser_hpp_*/
diff --git a/languages/pascal/PascalStoreWalker.cpp b/languages/pascal/PascalStoreWalker.cpp
new file mode 100644
index 00000000..96c69fe4
--- /dev/null
+++ b/languages/pascal/PascalStoreWalker.cpp
@@ -0,0 +1,3409 @@
+/* $ANTLR 2.7.7 (20061129): "pascal.tree.g" -> "PascalStoreWalker.cpp"$ */
+#include "PascalStoreWalker.hpp"
+#include <antlr/Token.hpp>
+#include <antlr/AST.hpp>
+#include <antlr/NoViableAltException.hpp>
+#include <antlr/MismatchedTokenException.hpp>
+#include <antlr/SemanticException.hpp>
+#include <antlr/BitSet.hpp>
+#line 1 "pascal.tree.g"
+#line 11 "PascalStoreWalker.cpp"
+PascalStoreWalker::PascalStoreWalker()
+ : ANTLR_USE_NAMESPACE(antlr)TreeParser() {
+}
+
+void PascalStoreWalker::program(RefPascalAST _t) {
+ RefPascalAST program_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ programHeading(_t);
+ _t = _retTree;
+ block(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::programHeading(RefPascalAST _t) {
+ RefPascalAST programHeading_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROGRAM:
+ {
+ RefPascalAST __t3 = _t;
+ RefPascalAST tmp1_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROGRAM);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp2_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ identifierList(_t);
+ _t = _retTree;
+ _t = __t3;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case UNIT:
+ {
+ RefPascalAST __t4 = _t;
+ RefPascalAST tmp3_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),UNIT);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp4_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ _t = __t4;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::block(RefPascalAST _t) {
+ RefPascalAST block_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LABEL:
+ {
+ labelDeclarationPart(_t);
+ _t = _retTree;
+ break;
+ }
+ case CONST:
+ {
+ constantDefinitionPart(_t);
+ _t = _retTree;
+ break;
+ }
+ case TYPE:
+ {
+ typeDefinitionPart(_t);
+ _t = _retTree;
+ break;
+ }
+ case VAR:
+ {
+ variableDeclarationPart(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ procedureAndFunctionDeclarationPart(_t);
+ _t = _retTree;
+ break;
+ }
+ case USES:
+ {
+ usesUnitsPart(_t);
+ _t = _retTree;
+ break;
+ }
+ case IMPLEMENTATION:
+ {
+ RefPascalAST tmp5_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IMPLEMENTATION);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ goto _loop8;
+ }
+ }
+ }
+ _loop8:;
+ } // ( ... )*
+ compoundStatement(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::identifierList(RefPascalAST _t) {
+ RefPascalAST identifierList_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t104 = _t;
+ RefPascalAST tmp6_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDLIST);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt106=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == IDENT)) {
+ RefPascalAST tmp7_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ }
+ else {
+ if ( _cnt106>=1 ) { goto _loop106; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt106++;
+ }
+ _loop106:;
+ } // ( ... )+
+ _t = __t104;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::identifier(RefPascalAST _t) {
+ RefPascalAST identifier_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST tmp8_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::labelDeclarationPart(RefPascalAST _t) {
+ RefPascalAST labelDeclarationPart_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t12 = _t;
+ RefPascalAST tmp9_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LABEL);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt14=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == NUM_INT)) {
+ label(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt14>=1 ) { goto _loop14; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt14++;
+ }
+ _loop14:;
+ } // ( ... )+
+ _t = __t12;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::constantDefinitionPart(RefPascalAST _t) {
+ RefPascalAST constantDefinitionPart_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t17 = _t;
+ RefPascalAST tmp10_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CONST);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt19=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == EQUAL)) {
+ constantDefinition(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt19>=1 ) { goto _loop19; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt19++;
+ }
+ _loop19:;
+ } // ( ... )+
+ _t = __t17;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::typeDefinitionPart(RefPascalAST _t) {
+ RefPascalAST typeDefinitionPart_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t31 = _t;
+ RefPascalAST tmp11_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TYPE);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt33=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == TYPEDECL)) {
+ typeDefinition(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt33>=1 ) { goto _loop33; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt33++;
+ }
+ _loop33:;
+ } // ( ... )+
+ _t = __t31;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+/** Yields a list of VARDECL-rooted subtrees with VAR at the overall root */
+void PascalStoreWalker::variableDeclarationPart(RefPascalAST _t) {
+ RefPascalAST variableDeclarationPart_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t83 = _t;
+ RefPascalAST tmp12_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VAR);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt85=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == VARDECL)) {
+ variableDeclaration(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt85>=1 ) { goto _loop85; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt85++;
+ }
+ _loop85:;
+ } // ( ... )+
+ _t = __t83;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::procedureAndFunctionDeclarationPart(RefPascalAST _t) {
+ RefPascalAST procedureAndFunctionDeclarationPart_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ procedureOrFunctionDeclaration(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::usesUnitsPart(RefPascalAST _t) {
+ RefPascalAST usesUnitsPart_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t10 = _t;
+ RefPascalAST tmp13_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),USES);
+ _t = _t->getFirstChild();
+ identifierList(_t);
+ _t = _retTree;
+ _t = __t10;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::compoundStatement(RefPascalAST _t) {
+ RefPascalAST compoundStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ statements(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::label(RefPascalAST _t) {
+ RefPascalAST label_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST tmp14_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_INT);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::constantDefinition(RefPascalAST _t) {
+ RefPascalAST constantDefinition_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t21 = _t;
+ RefPascalAST tmp15_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EQUAL);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp16_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ constant(_t);
+ _t = _retTree;
+ _t = __t21;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::constant(RefPascalAST _t) {
+ RefPascalAST constant_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NUM_INT:
+ {
+ RefPascalAST tmp17_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_INT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUM_REAL:
+ {
+ RefPascalAST tmp18_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_REAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PLUS:
+ {
+ RefPascalAST __t23 = _t;
+ RefPascalAST tmp19_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PLUS);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NUM_INT:
+ {
+ RefPascalAST tmp20_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_INT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUM_REAL:
+ {
+ RefPascalAST tmp21_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_REAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENT:
+ {
+ RefPascalAST tmp22_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t23;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MINUS:
+ {
+ RefPascalAST __t25 = _t;
+ RefPascalAST tmp23_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MINUS);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NUM_INT:
+ {
+ RefPascalAST tmp24_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_INT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUM_REAL:
+ {
+ RefPascalAST tmp25_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_REAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENT:
+ {
+ RefPascalAST tmp26_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t25;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENT:
+ {
+ RefPascalAST tmp27_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case STRING_LITERAL:
+ {
+ RefPascalAST tmp28_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STRING_LITERAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHR:
+ {
+ RefPascalAST __t27 = _t;
+ RefPascalAST tmp29_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHR);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NUM_INT:
+ {
+ RefPascalAST tmp30_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_INT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUM_REAL:
+ {
+ RefPascalAST tmp31_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_REAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t27;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::string(RefPascalAST _t) {
+ RefPascalAST string_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST tmp32_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STRING_LITERAL);
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::typeDefinition(RefPascalAST _t) {
+ RefPascalAST typeDefinition_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t35 = _t;
+ RefPascalAST tmp33_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TYPEDECL);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp34_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case SCALARTYPE:
+ case ARRAY:
+ case INTEGER:
+ case BOOLEAN:
+ case CHAR:
+ case DOTDOT:
+ case REAL:
+ case STRING:
+ case PACKED:
+ case RECORD:
+ case SET:
+ case FILE:
+ case POINTER:
+ case IDENT:
+ {
+ type(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION:
+ {
+ RefPascalAST __t37 = _t;
+ RefPascalAST tmp35_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNCTION);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARGDECLS:
+ {
+ formalParameterList(_t);
+ _t = _retTree;
+ break;
+ }
+ case INTEGER:
+ case BOOLEAN:
+ case CHAR:
+ case REAL:
+ case STRING:
+ case IDENT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ resultType(_t);
+ _t = _retTree;
+ _t = __t37;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROCEDURE:
+ {
+ RefPascalAST __t39 = _t;
+ RefPascalAST tmp36_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROCEDURE);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARGDECLS:
+ {
+ formalParameterList(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t39;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t35;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::type(RefPascalAST _t) {
+ RefPascalAST type_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case SCALARTYPE:
+ {
+ RefPascalAST __t42 = _t;
+ RefPascalAST tmp37_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SCALARTYPE);
+ _t = _t->getFirstChild();
+ identifierList(_t);
+ _t = _retTree;
+ _t = __t42;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOTDOT:
+ {
+ RefPascalAST __t43 = _t;
+ RefPascalAST tmp38_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOTDOT);
+ _t = _t->getFirstChild();
+ constant(_t);
+ _t = _retTree;
+ constant(_t);
+ _t = _retTree;
+ _t = __t43;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INTEGER:
+ case BOOLEAN:
+ case CHAR:
+ case REAL:
+ case STRING:
+ case IDENT:
+ {
+ typeIdentifier(_t);
+ _t = _retTree;
+ break;
+ }
+ case ARRAY:
+ case PACKED:
+ case RECORD:
+ case SET:
+ case FILE:
+ {
+ structuredType(_t);
+ _t = _retTree;
+ break;
+ }
+ case POINTER:
+ {
+ RefPascalAST __t44 = _t;
+ RefPascalAST tmp39_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),POINTER);
+ _t = _t->getFirstChild();
+ typeIdentifier(_t);
+ _t = _retTree;
+ _t = __t44;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::formalParameterList(RefPascalAST _t) {
+ RefPascalAST formalParameterList_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t94 = _t;
+ RefPascalAST tmp40_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARGDECLS);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt96=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_0.member(_t->getType()))) {
+ formalParameterSection(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt96>=1 ) { goto _loop96; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt96++;
+ }
+ _loop96:;
+ } // ( ... )+
+ _t = __t94;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::resultType(RefPascalAST _t) {
+ RefPascalAST resultType_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ typeIdentifier(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::typeIdentifier(RefPascalAST _t) {
+ RefPascalAST typeIdentifier_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ {
+ RefPascalAST tmp41_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHAR:
+ {
+ RefPascalAST tmp42_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHAR);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BOOLEAN:
+ {
+ RefPascalAST tmp43_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BOOLEAN);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case INTEGER:
+ {
+ RefPascalAST tmp44_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INTEGER);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case REAL:
+ {
+ RefPascalAST tmp45_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),REAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case STRING:
+ {
+ RefPascalAST __t46 = _t;
+ RefPascalAST tmp46_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STRING);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IDENT:
+ {
+ RefPascalAST tmp47_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUM_INT:
+ {
+ RefPascalAST tmp48_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_INT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUM_REAL:
+ {
+ RefPascalAST tmp49_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_REAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t46;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::structuredType(RefPascalAST _t) {
+ RefPascalAST structuredType_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PACKED:
+ {
+ RefPascalAST __t49 = _t;
+ RefPascalAST tmp50_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PACKED);
+ _t = _t->getFirstChild();
+ unpackedStructuredType(_t);
+ _t = _retTree;
+ _t = __t49;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case ARRAY:
+ case RECORD:
+ case SET:
+ case FILE:
+ {
+ unpackedStructuredType(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::unpackedStructuredType(RefPascalAST _t) {
+ RefPascalAST unpackedStructuredType_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARRAY:
+ {
+ arrayType(_t);
+ _t = _retTree;
+ break;
+ }
+ case RECORD:
+ {
+ recordType(_t);
+ _t = _retTree;
+ break;
+ }
+ case SET:
+ {
+ setType(_t);
+ _t = _retTree;
+ break;
+ }
+ case FILE:
+ {
+ fileType(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+/** Note here that the syntactic diff between brackets disappears.
+ * If the brackets mean different things semantically, we need
+ * two different alternatives here.
+ */
+void PascalStoreWalker::arrayType(RefPascalAST _t) {
+ RefPascalAST arrayType_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t52 = _t;
+ RefPascalAST tmp51_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARRAY);
+ _t = _t->getFirstChild();
+ typeList(_t);
+ _t = _retTree;
+ type(_t);
+ _t = _retTree;
+ _t = __t52;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::recordType(RefPascalAST _t) {
+ RefPascalAST recordType_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t58 = _t;
+ RefPascalAST tmp52_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),RECORD);
+ _t = _t->getFirstChild();
+ fieldList(_t);
+ _t = _retTree;
+ _t = __t58;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::setType(RefPascalAST _t) {
+ RefPascalAST setType_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t78 = _t;
+ RefPascalAST tmp53_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SET);
+ _t = _t->getFirstChild();
+ type(_t);
+ _t = _retTree;
+ _t = __t78;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::fileType(RefPascalAST _t) {
+ RefPascalAST fileType_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t80 = _t;
+ RefPascalAST tmp54_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FILE);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case SCALARTYPE:
+ case ARRAY:
+ case INTEGER:
+ case BOOLEAN:
+ case CHAR:
+ case DOTDOT:
+ case REAL:
+ case STRING:
+ case PACKED:
+ case RECORD:
+ case SET:
+ case FILE:
+ case POINTER:
+ case IDENT:
+ {
+ type(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t80;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::typeList(RefPascalAST _t) {
+ RefPascalAST typeList_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t54 = _t;
+ RefPascalAST tmp55_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TYPELIST);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt56=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_1.member(_t->getType()))) {
+ type(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt56>=1 ) { goto _loop56; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt56++;
+ }
+ _loop56:;
+ } // ( ... )+
+ _t = __t54;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::fieldList(RefPascalAST _t) {
+ RefPascalAST fieldList_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t60 = _t;
+ RefPascalAST tmp56_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FIELDLIST);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case FIELD:
+ {
+ fixedPart(_t);
+ _t = _retTree;
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case CASE:
+ {
+ variantPart(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ break;
+ }
+ case CASE:
+ {
+ variantPart(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t60;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::fixedPart(RefPascalAST _t) {
+ RefPascalAST fixedPart_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ { // ( ... )+
+ int _cnt65=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == FIELD)) {
+ recordSection(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt65>=1 ) { goto _loop65; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt65++;
+ }
+ _loop65:;
+ } // ( ... )+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::variantPart(RefPascalAST _t) {
+ RefPascalAST variantPart_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t69 = _t;
+ RefPascalAST tmp57_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CASE);
+ _t = _t->getFirstChild();
+ tag(_t);
+ _t = _retTree;
+ { // ( ... )+
+ int _cnt71=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == VARIANT_CASE)) {
+ variant(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt71>=1 ) { goto _loop71; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt71++;
+ }
+ _loop71:;
+ } // ( ... )+
+ _t = __t69;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::recordSection(RefPascalAST _t) {
+ RefPascalAST recordSection_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t67 = _t;
+ RefPascalAST tmp58_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FIELD);
+ _t = _t->getFirstChild();
+ identifierList(_t);
+ _t = _retTree;
+ type(_t);
+ _t = _retTree;
+ _t = __t67;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::tag(RefPascalAST _t) {
+ RefPascalAST tag_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case VARIANT_TAG:
+ {
+ RefPascalAST __t73 = _t;
+ RefPascalAST tmp59_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VARIANT_TAG);
+ _t = _t->getFirstChild();
+ identifier(_t);
+ _t = _retTree;
+ typeIdentifier(_t);
+ _t = _retTree;
+ _t = __t73;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case VARIANT_TAG_NO_ID:
+ {
+ RefPascalAST __t74 = _t;
+ RefPascalAST tmp60_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VARIANT_TAG_NO_ID);
+ _t = _t->getFirstChild();
+ typeIdentifier(_t);
+ _t = _retTree;
+ _t = __t74;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::variant(RefPascalAST _t) {
+ RefPascalAST variant_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t76 = _t;
+ RefPascalAST tmp61_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VARIANT_CASE);
+ _t = _t->getFirstChild();
+ constList(_t);
+ _t = _retTree;
+ fieldList(_t);
+ _t = _retTree;
+ _t = __t76;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::constList(RefPascalAST _t) {
+ RefPascalAST constList_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t108 = _t;
+ RefPascalAST tmp62_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CONSTLIST);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt110=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_2.member(_t->getType()))) {
+ constant(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt110>=1 ) { goto _loop110; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt110++;
+ }
+ _loop110:;
+ } // ( ... )+
+ _t = __t108;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::variableDeclaration(RefPascalAST _t) {
+ RefPascalAST variableDeclaration_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t87 = _t;
+ RefPascalAST tmp63_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VARDECL);
+ _t = _t->getFirstChild();
+ identifierList(_t);
+ _t = _retTree;
+ type(_t);
+ _t = _retTree;
+ _t = __t87;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::procedureOrFunctionDeclaration(RefPascalAST _t) {
+ RefPascalAST procedureOrFunctionDeclaration_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROCEDURE:
+ {
+ procedureDeclaration(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNCTION:
+ {
+ functionDeclaration(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::procedureDeclaration(RefPascalAST _t) {
+ RefPascalAST procedureDeclaration_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t91 = _t;
+ RefPascalAST tmp64_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROCEDURE);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp65_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARGDECLS:
+ {
+ formalParameterList(_t);
+ _t = _retTree;
+ break;
+ }
+ case BLOCK:
+ case USES:
+ case IMPLEMENTATION:
+ case LABEL:
+ case CONST:
+ case TYPE:
+ case VAR:
+ case PROCEDURE:
+ case FUNCTION:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ block(_t);
+ _t = _retTree;
+ _t = __t91;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::functionDeclaration(RefPascalAST _t) {
+ RefPascalAST functionDeclaration_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t112 = _t;
+ RefPascalAST tmp66_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNCTION);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp67_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARGDECLS:
+ {
+ formalParameterList(_t);
+ _t = _retTree;
+ break;
+ }
+ case INTEGER:
+ case BOOLEAN:
+ case CHAR:
+ case REAL:
+ case STRING:
+ case IDENT:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ resultType(_t);
+ _t = _retTree;
+ block(_t);
+ _t = _retTree;
+ _t = __t112;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::formalParameterSection(RefPascalAST _t) {
+ RefPascalAST formalParameterSection_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARGDECL:
+ {
+ parameterGroup(_t);
+ _t = _retTree;
+ break;
+ }
+ case VAR:
+ {
+ RefPascalAST __t98 = _t;
+ RefPascalAST tmp68_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),VAR);
+ _t = _t->getFirstChild();
+ parameterGroup(_t);
+ _t = _retTree;
+ _t = __t98;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNCTION:
+ {
+ RefPascalAST __t99 = _t;
+ RefPascalAST tmp69_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNCTION);
+ _t = _t->getFirstChild();
+ parameterGroup(_t);
+ _t = _retTree;
+ _t = __t99;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PROCEDURE:
+ {
+ RefPascalAST __t100 = _t;
+ RefPascalAST tmp70_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROCEDURE);
+ _t = _t->getFirstChild();
+ parameterGroup(_t);
+ _t = _retTree;
+ _t = __t100;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::parameterGroup(RefPascalAST _t) {
+ RefPascalAST parameterGroup_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t102 = _t;
+ RefPascalAST tmp71_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARGDECL);
+ _t = _t->getFirstChild();
+ identifierList(_t);
+ _t = _retTree;
+ typeIdentifier(_t);
+ _t = _retTree;
+ _t = __t102;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::statement(RefPascalAST _t) {
+ RefPascalAST statement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case COLON:
+ {
+ RefPascalAST __t116 = _t;
+ RefPascalAST tmp72_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),COLON);
+ _t = _t->getFirstChild();
+ label(_t);
+ _t = _retTree;
+ unlabelledStatement(_t);
+ _t = _retTree;
+ _t = __t116;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case BLOCK:
+ case PROC_CALL:
+ case ASSIGN:
+ case CASE:
+ case GOTO:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ {
+ unlabelledStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::unlabelledStatement(RefPascalAST _t) {
+ RefPascalAST unlabelledStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case PROC_CALL:
+ case ASSIGN:
+ case GOTO:
+ {
+ simpleStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ case BLOCK:
+ case CASE:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ {
+ structuredStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::simpleStatement(RefPascalAST _t) {
+ RefPascalAST simpleStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ASSIGN:
+ {
+ assignmentStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ case PROC_CALL:
+ {
+ procedureStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ case GOTO:
+ {
+ gotoStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::structuredStatement(RefPascalAST _t) {
+ RefPascalAST structuredStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BLOCK:
+ {
+ compoundStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ case CASE:
+ case IF:
+ {
+ conditionalStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ {
+ repetetiveStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ case WITH:
+ {
+ withStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::assignmentStatement(RefPascalAST _t) {
+ RefPascalAST assignmentStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t120 = _t;
+ RefPascalAST tmp73_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ASSIGN);
+ _t = _t->getFirstChild();
+ variable(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t120;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::procedureStatement(RefPascalAST _t) {
+ RefPascalAST procedureStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t166 = _t;
+ RefPascalAST tmp74_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROC_CALL);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp75_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARGLIST:
+ {
+ parameterList(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t166;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::gotoStatement(RefPascalAST _t) {
+ RefPascalAST gotoStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t170 = _t;
+ RefPascalAST tmp76_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GOTO);
+ _t = _t->getFirstChild();
+ label(_t);
+ _t = _retTree;
+ _t = __t170;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+/** A variable is an id with a suffix and can look like:
+ * id
+ * id[expr,...]
+ * id.id
+ * id.id[expr,...]
+ * id^
+ * id^.id
+ * id^.id[expr,...]
+ * ...
+ *
+ * LL has a really hard time with this construct as it's naturally
+ * left-recursive. We have to turn into a simple loop rather than
+ * recursive loop, hence, the suffixes. I keep in the same rule
+ * for easy tree construction.
+ */
+void PascalStoreWalker::variable(RefPascalAST _t) {
+ RefPascalAST variable_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case LBRACK:
+ {
+ RefPascalAST __t122 = _t;
+ RefPascalAST tmp77_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LBRACK);
+ _t = _t->getFirstChild();
+ variable(_t);
+ _t = _retTree;
+ { // ( ... )+
+ int _cnt124=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_3.member(_t->getType()))) {
+ expression(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt124>=1 ) { goto _loop124; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt124++;
+ }
+ _loop124:;
+ } // ( ... )+
+ _t = __t122;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LBRACK2:
+ {
+ RefPascalAST __t125 = _t;
+ RefPascalAST tmp78_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LBRACK2);
+ _t = _t->getFirstChild();
+ variable(_t);
+ _t = _retTree;
+ { // ( ... )+
+ int _cnt127=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_3.member(_t->getType()))) {
+ expression(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt127>=1 ) { goto _loop127; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt127++;
+ }
+ _loop127:;
+ } // ( ... )+
+ _t = __t125;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ {
+ RefPascalAST __t128 = _t;
+ RefPascalAST tmp79_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOT);
+ _t = _t->getFirstChild();
+ variable(_t);
+ _t = _retTree;
+ RefPascalAST tmp80_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ _t = __t128;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case POINTER:
+ {
+ RefPascalAST __t129 = _t;
+ RefPascalAST tmp81_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),POINTER);
+ _t = _t->getFirstChild();
+ variable(_t);
+ _t = _retTree;
+ _t = __t129;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case AT:
+ {
+ RefPascalAST __t130 = _t;
+ RefPascalAST tmp82_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),AT);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp83_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ _t = __t130;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IDENT:
+ {
+ RefPascalAST tmp84_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::expression(RefPascalAST _t) {
+ RefPascalAST expression_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case EQUAL:
+ {
+ RefPascalAST __t132 = _t;
+ RefPascalAST tmp85_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),EQUAL);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t132;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NOT_EQUAL:
+ {
+ RefPascalAST __t133 = _t;
+ RefPascalAST tmp86_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NOT_EQUAL);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t133;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LTH:
+ {
+ RefPascalAST __t134 = _t;
+ RefPascalAST tmp87_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LTH);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t134;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case LE:
+ {
+ RefPascalAST __t135 = _t;
+ RefPascalAST tmp88_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LE);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t135;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GE:
+ {
+ RefPascalAST __t136 = _t;
+ RefPascalAST tmp89_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GE);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t136;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case GT:
+ {
+ RefPascalAST __t137 = _t;
+ RefPascalAST tmp90_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),GT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t137;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case IN:
+ {
+ RefPascalAST __t138 = _t;
+ RefPascalAST tmp91_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IN);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t138;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case PLUS:
+ {
+ RefPascalAST __t139 = _t;
+ RefPascalAST tmp92_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PLUS);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case FUNC_CALL:
+ case DOT:
+ case EQUAL:
+ case NUM_INT:
+ case LBRACK:
+ case SET:
+ case POINTER:
+ case LE:
+ case GE:
+ case LTH:
+ case GT:
+ case NOT_EQUAL:
+ case IN:
+ case PLUS:
+ case MINUS:
+ case OR:
+ case STAR:
+ case SLASH:
+ case DIV:
+ case MOD:
+ case AND:
+ case NOT:
+ case AT:
+ case LBRACK2:
+ case STRING_LITERAL:
+ case CHR:
+ case NIL:
+ case NUM_REAL:
+ case IDENT:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t139;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MINUS:
+ {
+ RefPascalAST __t141 = _t;
+ RefPascalAST tmp93_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MINUS);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case FUNC_CALL:
+ case DOT:
+ case EQUAL:
+ case NUM_INT:
+ case LBRACK:
+ case SET:
+ case POINTER:
+ case LE:
+ case GE:
+ case LTH:
+ case GT:
+ case NOT_EQUAL:
+ case IN:
+ case PLUS:
+ case MINUS:
+ case OR:
+ case STAR:
+ case SLASH:
+ case DIV:
+ case MOD:
+ case AND:
+ case NOT:
+ case AT:
+ case LBRACK2:
+ case STRING_LITERAL:
+ case CHR:
+ case NIL:
+ case NUM_REAL:
+ case IDENT:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t141;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case OR:
+ {
+ RefPascalAST __t143 = _t;
+ RefPascalAST tmp94_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),OR);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t143;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case STAR:
+ {
+ RefPascalAST __t144 = _t;
+ RefPascalAST tmp95_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STAR);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t144;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case SLASH:
+ {
+ RefPascalAST __t145 = _t;
+ RefPascalAST tmp96_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SLASH);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t145;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DIV:
+ {
+ RefPascalAST __t146 = _t;
+ RefPascalAST tmp97_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DIV);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t146;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case MOD:
+ {
+ RefPascalAST __t147 = _t;
+ RefPascalAST tmp98_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),MOD);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t147;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case AND:
+ {
+ RefPascalAST __t148 = _t;
+ RefPascalAST tmp99_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),AND);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t148;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NOT:
+ {
+ RefPascalAST __t149 = _t;
+ RefPascalAST tmp100_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NOT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ _t = __t149;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOT:
+ case LBRACK:
+ case POINTER:
+ case AT:
+ case LBRACK2:
+ case IDENT:
+ {
+ variable(_t);
+ _t = _retTree;
+ break;
+ }
+ case FUNC_CALL:
+ {
+ functionDesignator(_t);
+ _t = _retTree;
+ break;
+ }
+ case SET:
+ {
+ set(_t);
+ _t = _retTree;
+ break;
+ }
+ case NUM_INT:
+ {
+ RefPascalAST tmp101_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_INT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUM_REAL:
+ {
+ RefPascalAST tmp102_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_REAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case CHR:
+ {
+ RefPascalAST __t150 = _t;
+ RefPascalAST tmp103_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHR);
+ _t = _t->getFirstChild();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case NUM_INT:
+ {
+ RefPascalAST tmp104_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_INT);
+ _t = _t->getNextSibling();
+ break;
+ }
+ case NUM_REAL:
+ {
+ RefPascalAST tmp105_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NUM_REAL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t150;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case STRING_LITERAL:
+ {
+ string(_t);
+ _t = _retTree;
+ break;
+ }
+ case NIL:
+ {
+ RefPascalAST tmp106_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),NIL);
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::functionDesignator(RefPascalAST _t) {
+ RefPascalAST functionDesignator_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t153 = _t;
+ RefPascalAST tmp107_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FUNC_CALL);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp108_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case ARGLIST:
+ {
+ parameterList(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t153;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::set(RefPascalAST _t) {
+ RefPascalAST set_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t160 = _t;
+ RefPascalAST tmp109_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),SET);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_4.member(_t->getType()))) {
+ element(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop162;
+ }
+
+ }
+ _loop162:;
+ } // ( ... )*
+ _t = __t160;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::parameterList(RefPascalAST _t) {
+ RefPascalAST parameterList_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t156 = _t;
+ RefPascalAST tmp110_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ARGLIST);
+ _t = _t->getFirstChild();
+ { // ( ... )+
+ int _cnt158=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_3.member(_t->getType()))) {
+ actualParameter(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt158>=1 ) { goto _loop158; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt158++;
+ }
+ _loop158:;
+ } // ( ... )+
+ _t = __t156;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::actualParameter(RefPascalAST _t) {
+ RefPascalAST actualParameter_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ expression(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::element(RefPascalAST _t) {
+ RefPascalAST element_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case DOTDOT:
+ {
+ RefPascalAST __t164 = _t;
+ RefPascalAST tmp111_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOTDOT);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t164;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case FUNC_CALL:
+ case DOT:
+ case EQUAL:
+ case NUM_INT:
+ case LBRACK:
+ case SET:
+ case POINTER:
+ case LE:
+ case GE:
+ case LTH:
+ case GT:
+ case NOT_EQUAL:
+ case IN:
+ case PLUS:
+ case MINUS:
+ case OR:
+ case STAR:
+ case SLASH:
+ case DIV:
+ case MOD:
+ case AND:
+ case NOT:
+ case AT:
+ case LBRACK2:
+ case STRING_LITERAL:
+ case CHR:
+ case NIL:
+ case NUM_REAL:
+ case IDENT:
+ {
+ expression(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::conditionalStatement(RefPascalAST _t) {
+ RefPascalAST conditionalStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case IF:
+ {
+ ifStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ case CASE:
+ {
+ caseStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::repetetiveStatement(RefPascalAST _t) {
+ RefPascalAST repetetiveStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case WHILE:
+ {
+ whileStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ case REPEAT:
+ {
+ repeatStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ case FOR:
+ {
+ forStatement(_t);
+ _t = _retTree;
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::withStatement(RefPascalAST _t) {
+ RefPascalAST withStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t201 = _t;
+ RefPascalAST tmp112_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),WITH);
+ _t = _t->getFirstChild();
+ recordVariableList(_t);
+ _t = _retTree;
+ statement(_t);
+ _t = _retTree;
+ _t = __t201;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::statements(RefPascalAST _t) {
+ RefPascalAST statements_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t174 = _t;
+ RefPascalAST tmp113_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BLOCK);
+ _t = _t->getFirstChild();
+ { // ( ... )*
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_5.member(_t->getType()))) {
+ statement(_t);
+ _t = _retTree;
+ }
+ else {
+ goto _loop176;
+ }
+
+ }
+ _loop176:;
+ } // ( ... )*
+ _t = __t174;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::ifStatement(RefPascalAST _t) {
+ RefPascalAST ifStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t179 = _t;
+ RefPascalAST tmp114_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IF);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ statement(_t);
+ _t = _retTree;
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BLOCK:
+ case PROC_CALL:
+ case COLON:
+ case ASSIGN:
+ case CASE:
+ case GOTO:
+ case IF:
+ case WHILE:
+ case REPEAT:
+ case FOR:
+ case WITH:
+ {
+ statement(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t179;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::caseStatement(RefPascalAST _t) {
+ RefPascalAST caseStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t182 = _t;
+ RefPascalAST tmp115_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CASE);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ { // ( ... )+
+ int _cnt184=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_t->getType() == COLON)) {
+ caseListElement(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt184>=1 ) { goto _loop184; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt184++;
+ }
+ _loop184:;
+ } // ( ... )+
+ {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case BLOCK:
+ {
+ statements(_t);
+ _t = _retTree;
+ break;
+ }
+ case 3:
+ {
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ _t = __t182;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::caseListElement(RefPascalAST _t) {
+ RefPascalAST caseListElement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t187 = _t;
+ RefPascalAST tmp116_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),COLON);
+ _t = _t->getFirstChild();
+ constList(_t);
+ _t = _retTree;
+ statement(_t);
+ _t = _retTree;
+ _t = __t187;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::whileStatement(RefPascalAST _t) {
+ RefPascalAST whileStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t190 = _t;
+ RefPascalAST tmp117_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),WHILE);
+ _t = _t->getFirstChild();
+ expression(_t);
+ _t = _retTree;
+ statement(_t);
+ _t = _retTree;
+ _t = __t190;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::repeatStatement(RefPascalAST _t) {
+ RefPascalAST repeatStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t192 = _t;
+ RefPascalAST tmp118_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),REPEAT);
+ _t = _t->getFirstChild();
+ statements(_t);
+ _t = _retTree;
+ expression(_t);
+ _t = _retTree;
+ _t = __t192;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::forStatement(RefPascalAST _t) {
+ RefPascalAST forStatement_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ RefPascalAST __t194 = _t;
+ RefPascalAST tmp119_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),FOR);
+ _t = _t->getFirstChild();
+ RefPascalAST tmp120_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
+ _t = _t->getNextSibling();
+ forList(_t);
+ _t = _retTree;
+ statement(_t);
+ _t = _retTree;
+ _t = __t194;
+ _t = _t->getNextSibling();
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::forList(RefPascalAST _t) {
+ RefPascalAST forList_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ switch ( _t->getType()) {
+ case TO:
+ {
+ RefPascalAST __t196 = _t;
+ RefPascalAST tmp121_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),TO);
+ _t = _t->getFirstChild();
+ initialValue(_t);
+ _t = _retTree;
+ finalValue(_t);
+ _t = _retTree;
+ _t = __t196;
+ _t = _t->getNextSibling();
+ break;
+ }
+ case DOWNTO:
+ {
+ RefPascalAST __t197 = _t;
+ RefPascalAST tmp122_AST_in = _t;
+ match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOWNTO);
+ _t = _t->getFirstChild();
+ initialValue(_t);
+ _t = _retTree;
+ finalValue(_t);
+ _t = _retTree;
+ _t = __t197;
+ _t = _t->getNextSibling();
+ break;
+ }
+ default:
+ {
+ throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
+ }
+ }
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::initialValue(RefPascalAST _t) {
+ RefPascalAST initialValue_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ expression(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::finalValue(RefPascalAST _t) {
+ RefPascalAST finalValue_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ expression(_t);
+ _t = _retTree;
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::recordVariableList(RefPascalAST _t) {
+ RefPascalAST recordVariableList_AST_in = (_t == RefPascalAST(ASTNULL)) ? RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
+
+ try { // for error handling
+ { // ( ... )+
+ int _cnt204=0;
+ for (;;) {
+ if (_t == RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = ASTNULL;
+ if ((_tokenSet_6.member(_t->getType()))) {
+ variable(_t);
+ _t = _retTree;
+ }
+ else {
+ if ( _cnt204>=1 ) { goto _loop204; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));}
+ }
+
+ _cnt204++;
+ }
+ _loop204:;
+ } // ( ... )+
+ }
+ catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
+ reportError(ex);
+ if ( _t != RefPascalAST(ANTLR_USE_NAMESPACE(antlr)nullAST) )
+ _t = _t->getNextSibling();
+ }
+ _retTree = _t;
+}
+
+void PascalStoreWalker::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& )
+{
+}
+const char* PascalStoreWalker::tokenNames[] = {
+ "<0>",
+ "EOF",
+ "<2>",
+ "NULL_TREE_LOOKAHEAD",
+ "BLOCK",
+ "IDLIST",
+ "ELIST",
+ "FUNC_CALL",
+ "PROC_CALL",
+ "SCALARTYPE",
+ "TYPELIST",
+ "VARIANT_TAG",
+ "VARIANT_TAG_NO_ID",
+ "VARIANT_CASE",
+ "CONSTLIST",
+ "FIELDLIST",
+ "ARGDECLS",
+ "VARDECL",
+ "ARGDECL",
+ "ARGLIST",
+ "TYPEDECL",
+ "FIELD",
+ "DOT",
+ "\"library\"",
+ "SEMI",
+ "\"end\"",
+ "\"exports\"",
+ "COMMA",
+ "\"index\"",
+ "\"name\"",
+ "\"uses\"",
+ "\"unit\"",
+ "\"interface\"",
+ "\"implementation\"",
+ "\"begin\"",
+ "\"program\"",
+ "LPAREN",
+ "RPAREN",
+ "\"initialization\"",
+ "\"finalization\"",
+ "\"label\"",
+ "\"const\"",
+ "\"resourcestring\"",
+ "EQUAL",
+ "\"type\"",
+ "\"var\"",
+ "COLON",
+ "\"procedure\"",
+ "\"forward\"",
+ "\"function\"",
+ "\"array\"",
+ "\"of\"",
+ "\"external\"",
+ "\"public\"",
+ "\"alias\"",
+ "INTERRUPT",
+ "\"export\"",
+ "\"register\"",
+ "\"pascal\"",
+ "\"cdecl\"",
+ "\"stdcall\"",
+ "\"popstack\"",
+ "\"saveregisters\"",
+ "\"inline\"",
+ "\"safecall\"",
+ "\"near\"",
+ "\"far\"",
+ "NUM_INT",
+ "\"integer\"",
+ "\"shortint\"",
+ "\"smallint\"",
+ "\"longint\"",
+ "\"int64\"",
+ "\"byte\"",
+ "\"word\"",
+ "\"cardinal\"",
+ "\"qword\"",
+ "\"boolean\"",
+ "BYTEBOOL",
+ "LONGBOOL",
+ "\"char\"",
+ "DOTDOT",
+ "ASSIGN",
+ "\"real\"",
+ "\"single\"",
+ "\"double\"",
+ "\"extended\"",
+ "\"comp\"",
+ "\"string\"",
+ "LBRACK",
+ "RBRACK",
+ "\"packed\"",
+ "\"record\"",
+ "\"case\"",
+ "\"set\"",
+ "\"file\"",
+ "POINTER",
+ "\"object\"",
+ "\"virtual\"",
+ "\"abstract\"",
+ "\"private\"",
+ "\"protected\"",
+ "\"constructor\"",
+ "\"destructor\"",
+ "\"class\"",
+ "\"override\"",
+ "MESSAGE",
+ "\"published\"",
+ "\"property\"",
+ "\"read\"",
+ "\"write\"",
+ "\"default\"",
+ "\"nodefault\"",
+ "LE",
+ "GE",
+ "LTH",
+ "GT",
+ "NOT_EQUAL",
+ "\"in\"",
+ "\"is\"",
+ "PLUS",
+ "MINUS",
+ "\"or\"",
+ "\"xor\"",
+ "STAR",
+ "SLASH",
+ "\"div\"",
+ "\"mod\"",
+ "\"and\"",
+ "\"shl\"",
+ "\"shr\"",
+ "\"not\"",
+ "\"true\"",
+ "\"false\"",
+ "AT",
+ "PLUSEQ",
+ "MINUSEQ",
+ "STAREQ",
+ "SLASHQE",
+ "\"goto\"",
+ "\"if\"",
+ "\"then\"",
+ "\"else\"",
+ "\"while\"",
+ "\"do\"",
+ "\"repeat\"",
+ "\"until\"",
+ "\"for\"",
+ "\"to\"",
+ "\"downto\"",
+ "\"with\"",
+ "LBRACK2",
+ "RBRACK2",
+ "\"operator\"",
+ "\"raise\"",
+ "\"try\"",
+ "\"except\"",
+ "\"finally\"",
+ "\"on\"",
+ "STRING_LITERAL",
+ "\"chr\"",
+ "\"nil\"",
+ "NUM_REAL",
+ "IDENT",
+ "\"absolute\"",
+ "\"as\"",
+ "\"asm\"",
+ "\"assembler\"",
+ "\"break\"",
+ "\"continue\"",
+ "\"dispose\"",
+ "\"exit\"",
+ "\"inherited\"",
+ "\"new\"",
+ "\"self\"",
+ "METHOD",
+ "ADDSUBOR",
+ "ASSIGNEQUAL",
+ "SIGN",
+ "FUNC",
+ "NODE_NOT_EMIT",
+ "MYASTVAR",
+ "LF",
+ "LCURLY",
+ "RCURLY",
+ "WS",
+ "COMMENT_1",
+ "COMMENT_2",
+ "COMMENT_3",
+ "EXPONENT",
+ 0
+};
+
+const unsigned long PascalStoreWalker::_tokenSet_0_data_[] = { 262144UL, 172032UL, 0UL, 0UL, 0UL, 0UL };
+// ARGDECL "var" "procedure" "function"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalStoreWalker::_tokenSet_0(_tokenSet_0_data_,6);
+const unsigned long PascalStoreWalker::_tokenSet_1_data_[] = { 512UL, 262144UL, 3641384976UL, 1UL, 0UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// SCALARTYPE "array" "integer" "boolean" "char" DOTDOT "real" "string"
+// "packed" "record" "set" "file" POINTER IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalStoreWalker::_tokenSet_1(_tokenSet_1_data_,12);
+const unsigned long PascalStoreWalker::_tokenSet_2_data_[] = { 0UL, 0UL, 8UL, 50331648UL, 2147483648UL, 13UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// NUM_INT PLUS MINUS STRING_LITERAL "chr" NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalStoreWalker::_tokenSet_2(_tokenSet_2_data_,12);
+const unsigned long PascalStoreWalker::_tokenSet_3_data_[] = { 4194432UL, 2048UL, 1107296264UL, 4152229889UL, 2155872329UL, 15UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// FUNC_CALL DOT EQUAL NUM_INT LBRACK "set" POINTER LE GE LTH GT NOT_EQUAL
+// "in" PLUS MINUS "or" STAR SLASH "div" "mod" "and" "not" AT LBRACK2 STRING_LITERAL
+// "chr" "nil" NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalStoreWalker::_tokenSet_3(_tokenSet_3_data_,12);
+const unsigned long PascalStoreWalker::_tokenSet_4_data_[] = { 4194432UL, 2048UL, 1107427336UL, 4152229889UL, 2155872329UL, 15UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// FUNC_CALL DOT EQUAL NUM_INT DOTDOT LBRACK "set" POINTER LE GE LTH GT
+// NOT_EQUAL "in" PLUS MINUS "or" STAR SLASH "div" "mod" "and" "not" AT
+// LBRACK2 STRING_LITERAL "chr" "nil" NUM_REAL IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalStoreWalker::_tokenSet_4(_tokenSet_4_data_,12);
+const unsigned long PascalStoreWalker::_tokenSet_5_data_[] = { 272UL, 16384UL, 537133056UL, 0UL, 4888576UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// BLOCK PROC_CALL COLON ASSIGN "case" "goto" "if" "while" "repeat" "for"
+// "with"
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalStoreWalker::_tokenSet_5(_tokenSet_5_data_,12);
+const unsigned long PascalStoreWalker::_tokenSet_6_data_[] = { 4194304UL, 0UL, 33554432UL, 1UL, 8388672UL, 8UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
+// DOT LBRACK POINTER AT LBRACK2 IDENT
+const ANTLR_USE_NAMESPACE(antlr)BitSet PascalStoreWalker::_tokenSet_6(_tokenSet_6_data_,12);
+
+
diff --git a/languages/pascal/PascalStoreWalker.hpp b/languages/pascal/PascalStoreWalker.hpp
new file mode 100644
index 00000000..bc354743
--- /dev/null
+++ b/languages/pascal/PascalStoreWalker.hpp
@@ -0,0 +1,172 @@
+#ifndef INC_PascalStoreWalker_hpp_
+#define INC_PascalStoreWalker_hpp_
+
+#line 20 "pascal.tree.g"
+
+ #include <codemodel.h>
+ #include "PascalAST.hpp"
+
+ #include <qstring.h>
+ #include <qstringlist.h>
+ #include <qfileinfo.h>
+
+#line 14 "PascalStoreWalker.hpp"
+#include <antlr/config.hpp>
+#include "PascalStoreWalkerTokenTypes.hpp"
+/* $ANTLR 2.7.7 (20061129): "pascal.tree.g" -> "PascalStoreWalker.hpp"$ */
+#include <antlr/TreeParser.hpp>
+
+#line 29 "pascal.tree.g"
+
+ #include <codemodel.h>
+ #include <kdebug.h>
+
+#line 25 "PascalStoreWalker.hpp"
+class CUSTOM_API PascalStoreWalker : public ANTLR_USE_NAMESPACE(antlr)TreeParser, public PascalStoreWalkerTokenTypes
+{
+#line 47 "pascal.tree.g"
+
+private:
+ QString m_fileName;
+ QStringList m_currentScope;
+ int m_currentAccess;
+ int m_anon;
+ CodeModel* m_model;
+
+public:
+ void setCodeModel( CodeModel* model ) { m_model = model; }
+ CodeModel* codeModel() { return m_model; }
+ const CodeModel* codeModel() const { return m_model; }
+
+ QString fileName() const { return m_fileName; }
+ void setFileName( const QString& fileName ) { m_fileName = fileName; }
+
+ void init(){
+ m_currentScope.clear();
+ m_currentAccess = CodeModelItem::Public;
+ m_anon = 0;
+ }
+
+ void wipeout() { m_model->wipeout(); }
+#line 29 "PascalStoreWalker.hpp"
+public:
+ PascalStoreWalker();
+ static void initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory );
+ int getNumTokens() const
+ {
+ return PascalStoreWalker::NUM_TOKENS;
+ }
+ const char* getTokenName( int type ) const
+ {
+ if( type > getNumTokens() ) return 0;
+ return PascalStoreWalker::tokenNames[type];
+ }
+ const char* const* getTokenNames() const
+ {
+ return PascalStoreWalker::tokenNames;
+ }
+ public: void program(RefPascalAST _t);
+ public: void programHeading(RefPascalAST _t);
+ public: void block(RefPascalAST _t);
+ public: void identifierList(RefPascalAST _t);
+ public: void identifier(RefPascalAST _t);
+ public: void labelDeclarationPart(RefPascalAST _t);
+ public: void constantDefinitionPart(RefPascalAST _t);
+ public: void typeDefinitionPart(RefPascalAST _t);
+ public: void variableDeclarationPart(RefPascalAST _t);
+ public: void procedureAndFunctionDeclarationPart(RefPascalAST _t);
+ public: void usesUnitsPart(RefPascalAST _t);
+ public: void compoundStatement(RefPascalAST _t);
+ public: void label(RefPascalAST _t);
+ public: void constantDefinition(RefPascalAST _t);
+ public: void constant(RefPascalAST _t);
+ public: void string(RefPascalAST _t);
+ public: void typeDefinition(RefPascalAST _t);
+ public: void type(RefPascalAST _t);
+ public: void formalParameterList(RefPascalAST _t);
+ public: void resultType(RefPascalAST _t);
+ public: void typeIdentifier(RefPascalAST _t);
+ public: void structuredType(RefPascalAST _t);
+ public: void unpackedStructuredType(RefPascalAST _t);
+ public: void arrayType(RefPascalAST _t);
+ public: void recordType(RefPascalAST _t);
+ public: void setType(RefPascalAST _t);
+ public: void fileType(RefPascalAST _t);
+ public: void typeList(RefPascalAST _t);
+ public: void fieldList(RefPascalAST _t);
+ public: void fixedPart(RefPascalAST _t);
+ public: void variantPart(RefPascalAST _t);
+ public: void recordSection(RefPascalAST _t);
+ public: void tag(RefPascalAST _t);
+ public: void variant(RefPascalAST _t);
+ public: void constList(RefPascalAST _t);
+ public: void variableDeclaration(RefPascalAST _t);
+ public: void procedureOrFunctionDeclaration(RefPascalAST _t);
+ public: void procedureDeclaration(RefPascalAST _t);
+ public: void functionDeclaration(RefPascalAST _t);
+ public: void formalParameterSection(RefPascalAST _t);
+ public: void parameterGroup(RefPascalAST _t);
+ public: void statement(RefPascalAST _t);
+ public: void unlabelledStatement(RefPascalAST _t);
+ public: void simpleStatement(RefPascalAST _t);
+ public: void structuredStatement(RefPascalAST _t);
+ public: void assignmentStatement(RefPascalAST _t);
+ public: void procedureStatement(RefPascalAST _t);
+ public: void gotoStatement(RefPascalAST _t);
+ public: void variable(RefPascalAST _t);
+ public: void expression(RefPascalAST _t);
+ public: void functionDesignator(RefPascalAST _t);
+ public: void set(RefPascalAST _t);
+ public: void parameterList(RefPascalAST _t);
+ public: void actualParameter(RefPascalAST _t);
+ public: void element(RefPascalAST _t);
+ public: void conditionalStatement(RefPascalAST _t);
+ public: void repetetiveStatement(RefPascalAST _t);
+ public: void withStatement(RefPascalAST _t);
+ public: void statements(RefPascalAST _t);
+ public: void ifStatement(RefPascalAST _t);
+ public: void caseStatement(RefPascalAST _t);
+ public: void caseListElement(RefPascalAST _t);
+ public: void whileStatement(RefPascalAST _t);
+ public: void repeatStatement(RefPascalAST _t);
+ public: void forStatement(RefPascalAST _t);
+ public: void forList(RefPascalAST _t);
+ public: void initialValue(RefPascalAST _t);
+ public: void finalValue(RefPascalAST _t);
+ public: void recordVariableList(RefPascalAST _t);
+public:
+ ANTLR_USE_NAMESPACE(antlr)RefAST getAST()
+ {
+ return ANTLR_USE_NAMESPACE(antlr)RefAST(returnAST);
+ }
+
+protected:
+ RefPascalAST returnAST;
+ RefPascalAST _retTree;
+private:
+ static const char* tokenNames[];
+#ifndef NO_STATIC_CONSTS
+ static const int NUM_TOKENS = 190;
+#else
+ enum {
+ NUM_TOKENS = 190
+ };
+#endif
+
+ static const unsigned long _tokenSet_0_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0;
+ static const unsigned long _tokenSet_1_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1;
+ static const unsigned long _tokenSet_2_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2;
+ static const unsigned long _tokenSet_3_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3;
+ static const unsigned long _tokenSet_4_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_4;
+ static const unsigned long _tokenSet_5_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_5;
+ static const unsigned long _tokenSet_6_data_[];
+ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_6;
+};
+
+#endif /*INC_PascalStoreWalker_hpp_*/
diff --git a/languages/pascal/PascalStoreWalkerTokenTypes.hpp b/languages/pascal/PascalStoreWalkerTokenTypes.hpp
new file mode 100644
index 00000000..0f4142f5
--- /dev/null
+++ b/languages/pascal/PascalStoreWalkerTokenTypes.hpp
@@ -0,0 +1,206 @@
+#ifndef INC_PascalStoreWalkerTokenTypes_hpp_
+#define INC_PascalStoreWalkerTokenTypes_hpp_
+
+/* $ANTLR 2.7.7 (20061129): "pascal.tree.g" -> "PascalStoreWalkerTokenTypes.hpp"$ */
+
+#ifndef CUSTOM_API
+# define CUSTOM_API
+#endif
+
+#ifdef __cplusplus
+struct CUSTOM_API PascalStoreWalkerTokenTypes {
+#endif
+ enum {
+ EOF_ = 1,
+ BLOCK = 4,
+ IDLIST = 5,
+ ELIST = 6,
+ FUNC_CALL = 7,
+ PROC_CALL = 8,
+ SCALARTYPE = 9,
+ TYPELIST = 10,
+ VARIANT_TAG = 11,
+ VARIANT_TAG_NO_ID = 12,
+ VARIANT_CASE = 13,
+ CONSTLIST = 14,
+ FIELDLIST = 15,
+ ARGDECLS = 16,
+ VARDECL = 17,
+ ARGDECL = 18,
+ ARGLIST = 19,
+ TYPEDECL = 20,
+ FIELD = 21,
+ DOT = 22,
+ LIBRARY = 23,
+ SEMI = 24,
+ END = 25,
+ EXPORTS = 26,
+ COMMA = 27,
+ LITERAL_index = 28,
+ LITERAL_name = 29,
+ USES = 30,
+ UNIT = 31,
+ INTERFACE = 32,
+ IMPLEMENTATION = 33,
+ BEGIN = 34,
+ PROGRAM = 35,
+ LPAREN = 36,
+ RPAREN = 37,
+ INITIALIZATION = 38,
+ FINALIZATION = 39,
+ LABEL = 40,
+ CONST = 41,
+ RESOURCESTRING = 42,
+ EQUAL = 43,
+ TYPE = 44,
+ VAR = 45,
+ COLON = 46,
+ PROCEDURE = 47,
+ FORWARD = 48,
+ FUNCTION = 49,
+ ARRAY = 50,
+ OF = 51,
+ EXTERNAL = 52,
+ PUBLIC = 53,
+ ALIAS = 54,
+ INTERRUPT = 55,
+ EXPORT = 56,
+ REGISTER = 57,
+ PASCAL = 58,
+ CDECL = 59,
+ STDCALL = 60,
+ POPSTACK = 61,
+ SAVEREGISTERS = 62,
+ INLINE = 63,
+ SAFECALL = 64,
+ NEAR = 65,
+ FAR = 66,
+ NUM_INT = 67,
+ INTEGER = 68,
+ SHORTINT = 69,
+ SMALLINT = 70,
+ LONGINT = 71,
+ INT64 = 72,
+ BYTE = 73,
+ WORD = 74,
+ CARDINAL = 75,
+ QWORD = 76,
+ BOOLEAN = 77,
+ BYTEBOOL = 78,
+ LONGBOOL = 79,
+ CHAR = 80,
+ DOTDOT = 81,
+ ASSIGN = 82,
+ REAL = 83,
+ SINGLE = 84,
+ DOUBLE = 85,
+ EXTENDED = 86,
+ COMP = 87,
+ STRING = 88,
+ LBRACK = 89,
+ RBRACK = 90,
+ PACKED = 91,
+ RECORD = 92,
+ CASE = 93,
+ SET = 94,
+ FILE = 95,
+ POINTER = 96,
+ OBJECT = 97,
+ VIRTUAL = 98,
+ ABSTRACT = 99,
+ PRIVATE = 100,
+ PROTECTED = 101,
+ CONSTRUCTOR = 102,
+ DESTRUCTOR = 103,
+ CLASS = 104,
+ OVERRIDE = 105,
+ MESSAGE = 106,
+ PUBLISHED = 107,
+ PROPERTY = 108,
+ LITERAL_read = 109,
+ LITERAL_write = 110,
+ DEFAULT = 111,
+ LITERAL_nodefault = 112,
+ LE = 113,
+ GE = 114,
+ LTH = 115,
+ GT = 116,
+ NOT_EQUAL = 117,
+ IN = 118,
+ IS = 119,
+ PLUS = 120,
+ MINUS = 121,
+ OR = 122,
+ XOR = 123,
+ STAR = 124,
+ SLASH = 125,
+ DIV = 126,
+ MOD = 127,
+ AND = 128,
+ SHL = 129,
+ SHR = 130,
+ NOT = 131,
+ TRUE = 132,
+ FALSE = 133,
+ AT = 134,
+ PLUSEQ = 135,
+ MINUSEQ = 136,
+ STAREQ = 137,
+ SLASHQE = 138,
+ GOTO = 139,
+ IF = 140,
+ THEN = 141,
+ ELSE = 142,
+ WHILE = 143,
+ DO = 144,
+ REPEAT = 145,
+ UNTIL = 146,
+ FOR = 147,
+ TO = 148,
+ DOWNTO = 149,
+ WITH = 150,
+ LBRACK2 = 151,
+ RBRACK2 = 152,
+ OPERATOR = 153,
+ RAISE = 154,
+ TRY = 155,
+ EXCEPT = 156,
+ FINALLY = 157,
+ ON = 158,
+ STRING_LITERAL = 159,
+ CHR = 160,
+ NIL = 161,
+ NUM_REAL = 162,
+ IDENT = 163,
+ ABSOLUTE = 164,
+ AS = 165,
+ ASM = 166,
+ ASSEMBLER = 167,
+ BREAK = 168,
+ CONTINUE = 169,
+ DISPOSE = 170,
+ EXIT = 171,
+ INHERITED = 172,
+ NEW = 173,
+ SELF = 174,
+ METHOD = 175,
+ ADDSUBOR = 176,
+ ASSIGNEQUAL = 177,
+ SIGN = 178,
+ FUNC = 179,
+ NODE_NOT_EMIT = 180,
+ MYASTVAR = 181,
+ LF = 182,
+ LCURLY = 183,
+ RCURLY = 184,
+ WS = 185,
+ COMMENT_1 = 186,
+ COMMENT_2 = 187,
+ COMMENT_3 = 188,
+ EXPONENT = 189,
+ NULL_TREE_LOOKAHEAD = 3
+ };
+#ifdef __cplusplus
+};
+#endif
+#endif /*INC_PascalStoreWalkerTokenTypes_hpp_*/
diff --git a/languages/pascal/PascalStoreWalkerTokenTypes.txt b/languages/pascal/PascalStoreWalkerTokenTypes.txt
new file mode 100644
index 00000000..8d347fc1
--- /dev/null
+++ b/languages/pascal/PascalStoreWalkerTokenTypes.txt
@@ -0,0 +1,188 @@
+// $ANTLR 2.7.7 (20061129): pascal.tree.g -> PascalStoreWalkerTokenTypes.txt$
+PascalStoreWalker // output token vocab name
+BLOCK=4
+IDLIST=5
+ELIST=6
+FUNC_CALL=7
+PROC_CALL=8
+SCALARTYPE=9
+TYPELIST=10
+VARIANT_TAG=11
+VARIANT_TAG_NO_ID=12
+VARIANT_CASE=13
+CONSTLIST=14
+FIELDLIST=15
+ARGDECLS=16
+VARDECL=17
+ARGDECL=18
+ARGLIST=19
+TYPEDECL=20
+FIELD=21
+DOT=22
+LIBRARY="library"=23
+SEMI=24
+END="end"=25
+EXPORTS="exports"=26
+COMMA=27
+LITERAL_index="index"=28
+LITERAL_name="name"=29
+USES="uses"=30
+UNIT="unit"=31
+INTERFACE="interface"=32
+IMPLEMENTATION="implementation"=33
+BEGIN="begin"=34
+PROGRAM="program"=35
+LPAREN=36
+RPAREN=37
+INITIALIZATION="initialization"=38
+FINALIZATION="finalization"=39
+LABEL="label"=40
+CONST="const"=41
+RESOURCESTRING="resourcestring"=42
+EQUAL=43
+TYPE="type"=44
+VAR="var"=45
+COLON=46
+PROCEDURE="procedure"=47
+FORWARD="forward"=48
+FUNCTION="function"=49
+ARRAY="array"=50
+OF="of"=51
+EXTERNAL="external"=52
+PUBLIC="public"=53
+ALIAS="alias"=54
+INTERRUPT=55
+EXPORT="export"=56
+REGISTER="register"=57
+PASCAL="pascal"=58
+CDECL="cdecl"=59
+STDCALL="stdcall"=60
+POPSTACK="popstack"=61
+SAVEREGISTERS="saveregisters"=62
+INLINE="inline"=63
+SAFECALL="safecall"=64
+NEAR="near"=65
+FAR="far"=66
+NUM_INT=67
+INTEGER="integer"=68
+SHORTINT="shortint"=69
+SMALLINT="smallint"=70
+LONGINT="longint"=71
+INT64="int64"=72
+BYTE="byte"=73
+WORD="word"=74
+CARDINAL="cardinal"=75
+QWORD="qword"=76
+BOOLEAN="boolean"=77
+BYTEBOOL=78
+LONGBOOL=79
+CHAR="char"=80
+DOTDOT=81
+ASSIGN=82
+REAL="real"=83
+SINGLE="single"=84
+DOUBLE="double"=85
+EXTENDED="extended"=86
+COMP="comp"=87
+STRING="string"=88
+LBRACK=89
+RBRACK=90
+PACKED="packed"=91
+RECORD="record"=92
+CASE="case"=93
+SET="set"=94
+FILE="file"=95
+POINTER=96
+OBJECT="object"=97
+VIRTUAL="virtual"=98
+ABSTRACT="abstract"=99
+PRIVATE="private"=100
+PROTECTED="protected"=101
+CONSTRUCTOR="constructor"=102
+DESTRUCTOR="destructor"=103
+CLASS="class"=104
+OVERRIDE="override"=105
+MESSAGE=106
+PUBLISHED="published"=107
+PROPERTY="property"=108
+LITERAL_read="read"=109
+LITERAL_write="write"=110
+DEFAULT="default"=111
+LITERAL_nodefault="nodefault"=112
+LE=113
+GE=114
+LTH=115
+GT=116
+NOT_EQUAL=117
+IN="in"=118
+IS="is"=119
+PLUS=120
+MINUS=121
+OR="or"=122
+XOR="xor"=123
+STAR=124
+SLASH=125
+DIV="div"=126
+MOD="mod"=127
+AND="and"=128
+SHL="shl"=129
+SHR="shr"=130
+NOT="not"=131
+TRUE="true"=132
+FALSE="false"=133
+AT=134
+PLUSEQ=135
+MINUSEQ=136
+STAREQ=137
+SLASHQE=138
+GOTO="goto"=139
+IF="if"=140
+THEN="then"=141
+ELSE="else"=142
+WHILE="while"=143
+DO="do"=144
+REPEAT="repeat"=145
+UNTIL="until"=146
+FOR="for"=147
+TO="to"=148
+DOWNTO="downto"=149
+WITH="with"=150
+LBRACK2=151
+RBRACK2=152
+OPERATOR="operator"=153
+RAISE="raise"=154
+TRY="try"=155
+EXCEPT="except"=156
+FINALLY="finally"=157
+ON="on"=158
+STRING_LITERAL=159
+CHR="chr"=160
+NIL="nil"=161
+NUM_REAL=162
+IDENT=163
+ABSOLUTE="absolute"=164
+AS="as"=165
+ASM="asm"=166
+ASSEMBLER="assembler"=167
+BREAK="break"=168
+CONTINUE="continue"=169
+DISPOSE="dispose"=170
+EXIT="exit"=171
+INHERITED="inherited"=172
+NEW="new"=173
+SELF="self"=174
+METHOD=175
+ADDSUBOR=176
+ASSIGNEQUAL=177
+SIGN=178
+FUNC=179
+NODE_NOT_EMIT=180
+MYASTVAR=181
+LF=182
+LCURLY=183
+RCURLY=184
+WS=185
+COMMENT_1=186
+COMMENT_2=187
+COMMENT_3=188
+EXPONENT=189
diff --git a/languages/pascal/PascalTokenTypes.hpp b/languages/pascal/PascalTokenTypes.hpp
new file mode 100644
index 00000000..3e613221
--- /dev/null
+++ b/languages/pascal/PascalTokenTypes.hpp
@@ -0,0 +1,206 @@
+#ifndef INC_PascalTokenTypes_hpp_
+#define INC_PascalTokenTypes_hpp_
+
+/* $ANTLR 2.7.7 (20061129): "pascal.g" -> "PascalTokenTypes.hpp"$ */
+
+#ifndef CUSTOM_API
+# define CUSTOM_API
+#endif
+
+#ifdef __cplusplus
+struct CUSTOM_API PascalTokenTypes {
+#endif
+ enum {
+ EOF_ = 1,
+ BLOCK = 4,
+ IDLIST = 5,
+ ELIST = 6,
+ FUNC_CALL = 7,
+ PROC_CALL = 8,
+ SCALARTYPE = 9,
+ TYPELIST = 10,
+ VARIANT_TAG = 11,
+ VARIANT_TAG_NO_ID = 12,
+ VARIANT_CASE = 13,
+ CONSTLIST = 14,
+ FIELDLIST = 15,
+ ARGDECLS = 16,
+ VARDECL = 17,
+ ARGDECL = 18,
+ ARGLIST = 19,
+ TYPEDECL = 20,
+ FIELD = 21,
+ DOT = 22,
+ LIBRARY = 23,
+ SEMI = 24,
+ END = 25,
+ EXPORTS = 26,
+ COMMA = 27,
+ LITERAL_index = 28,
+ LITERAL_name = 29,
+ USES = 30,
+ UNIT = 31,
+ INTERFACE = 32,
+ IMPLEMENTATION = 33,
+ BEGIN = 34,
+ PROGRAM = 35,
+ LPAREN = 36,
+ RPAREN = 37,
+ INITIALIZATION = 38,
+ FINALIZATION = 39,
+ LABEL = 40,
+ CONST = 41,
+ RESOURCESTRING = 42,
+ EQUAL = 43,
+ TYPE = 44,
+ VAR = 45,
+ COLON = 46,
+ PROCEDURE = 47,
+ FORWARD = 48,
+ FUNCTION = 49,
+ ARRAY = 50,
+ OF = 51,
+ EXTERNAL = 52,
+ PUBLIC = 53,
+ ALIAS = 54,
+ INTERRUPT = 55,
+ EXPORT = 56,
+ REGISTER = 57,
+ PASCAL = 58,
+ CDECL = 59,
+ STDCALL = 60,
+ POPSTACK = 61,
+ SAVEREGISTERS = 62,
+ INLINE = 63,
+ SAFECALL = 64,
+ NEAR = 65,
+ FAR = 66,
+ NUM_INT = 67,
+ INTEGER = 68,
+ SHORTINT = 69,
+ SMALLINT = 70,
+ LONGINT = 71,
+ INT64 = 72,
+ BYTE = 73,
+ WORD = 74,
+ CARDINAL = 75,
+ QWORD = 76,
+ BOOLEAN = 77,
+ BYTEBOOL = 78,
+ LONGBOOL = 79,
+ CHAR = 80,
+ DOTDOT = 81,
+ ASSIGN = 82,
+ REAL = 83,
+ SINGLE = 84,
+ DOUBLE = 85,
+ EXTENDED = 86,
+ COMP = 87,
+ STRING = 88,
+ LBRACK = 89,
+ RBRACK = 90,
+ PACKED = 91,
+ RECORD = 92,
+ CASE = 93,
+ SET = 94,
+ FILE = 95,
+ POINTER = 96,
+ OBJECT = 97,
+ VIRTUAL = 98,
+ ABSTRACT = 99,
+ PRIVATE = 100,
+ PROTECTED = 101,
+ CONSTRUCTOR = 102,
+ DESTRUCTOR = 103,
+ CLASS = 104,
+ OVERRIDE = 105,
+ MESSAGE = 106,
+ PUBLISHED = 107,
+ PROPERTY = 108,
+ LITERAL_read = 109,
+ LITERAL_write = 110,
+ DEFAULT = 111,
+ LITERAL_nodefault = 112,
+ LE = 113,
+ GE = 114,
+ LTH = 115,
+ GT = 116,
+ NOT_EQUAL = 117,
+ IN = 118,
+ IS = 119,
+ PLUS = 120,
+ MINUS = 121,
+ OR = 122,
+ XOR = 123,
+ STAR = 124,
+ SLASH = 125,
+ DIV = 126,
+ MOD = 127,
+ AND = 128,
+ SHL = 129,
+ SHR = 130,
+ NOT = 131,
+ TRUE = 132,
+ FALSE = 133,
+ AT = 134,
+ PLUSEQ = 135,
+ MINUSEQ = 136,
+ STAREQ = 137,
+ SLASHQE = 138,
+ GOTO = 139,
+ IF = 140,
+ THEN = 141,
+ ELSE = 142,
+ WHILE = 143,
+ DO = 144,
+ REPEAT = 145,
+ UNTIL = 146,
+ FOR = 147,
+ TO = 148,
+ DOWNTO = 149,
+ WITH = 150,
+ LBRACK2 = 151,
+ RBRACK2 = 152,
+ OPERATOR = 153,
+ RAISE = 154,
+ TRY = 155,
+ EXCEPT = 156,
+ FINALLY = 157,
+ ON = 158,
+ STRING_LITERAL = 159,
+ CHR = 160,
+ NIL = 161,
+ NUM_REAL = 162,
+ IDENT = 163,
+ ABSOLUTE = 164,
+ AS = 165,
+ ASM = 166,
+ ASSEMBLER = 167,
+ BREAK = 168,
+ CONTINUE = 169,
+ DISPOSE = 170,
+ EXIT = 171,
+ INHERITED = 172,
+ NEW = 173,
+ SELF = 174,
+ METHOD = 175,
+ ADDSUBOR = 176,
+ ASSIGNEQUAL = 177,
+ SIGN = 178,
+ FUNC = 179,
+ NODE_NOT_EMIT = 180,
+ MYASTVAR = 181,
+ LF = 182,
+ LCURLY = 183,
+ RCURLY = 184,
+ WS = 185,
+ COMMENT_1 = 186,
+ COMMENT_2 = 187,
+ COMMENT_3 = 188,
+ EXPONENT = 189,
+ NULL_TREE_LOOKAHEAD = 3
+ };
+#ifdef __cplusplus
+};
+#endif
+#endif /*INC_PascalTokenTypes_hpp_*/
diff --git a/languages/pascal/PascalTokenTypes.txt b/languages/pascal/PascalTokenTypes.txt
new file mode 100644
index 00000000..063a729a
--- /dev/null
+++ b/languages/pascal/PascalTokenTypes.txt
@@ -0,0 +1,188 @@
+// $ANTLR 2.7.7 (20061129): pascal.g -> PascalTokenTypes.txt$
+Pascal // output token vocab name
+BLOCK=4
+IDLIST=5
+ELIST=6
+FUNC_CALL=7
+PROC_CALL=8
+SCALARTYPE=9
+TYPELIST=10
+VARIANT_TAG=11
+VARIANT_TAG_NO_ID=12
+VARIANT_CASE=13
+CONSTLIST=14
+FIELDLIST=15
+ARGDECLS=16
+VARDECL=17
+ARGDECL=18
+ARGLIST=19
+TYPEDECL=20
+FIELD=21
+DOT=22
+LIBRARY="library"=23
+SEMI=24
+END="end"=25
+EXPORTS="exports"=26
+COMMA=27
+LITERAL_index="index"=28
+LITERAL_name="name"=29
+USES="uses"=30
+UNIT="unit"=31
+INTERFACE="interface"=32
+IMPLEMENTATION="implementation"=33
+BEGIN="begin"=34
+PROGRAM="program"=35
+LPAREN=36
+RPAREN=37
+INITIALIZATION="initialization"=38
+FINALIZATION="finalization"=39
+LABEL="label"=40
+CONST="const"=41
+RESOURCESTRING="resourcestring"=42
+EQUAL=43
+TYPE="type"=44
+VAR="var"=45
+COLON=46
+PROCEDURE="procedure"=47
+FORWARD="forward"=48
+FUNCTION="function"=49
+ARRAY="array"=50
+OF="of"=51
+EXTERNAL="external"=52
+PUBLIC="public"=53
+ALIAS="alias"=54
+INTERRUPT=55
+EXPORT="export"=56
+REGISTER="register"=57
+PASCAL="pascal"=58
+CDECL="cdecl"=59
+STDCALL="stdcall"=60
+POPSTACK="popstack"=61
+SAVEREGISTERS="saveregisters"=62
+INLINE="inline"=63
+SAFECALL="safecall"=64
+NEAR="near"=65
+FAR="far"=66
+NUM_INT=67
+INTEGER="integer"=68
+SHORTINT="shortint"=69
+SMALLINT="smallint"=70
+LONGINT="longint"=71
+INT64="int64"=72
+BYTE="byte"=73
+WORD="word"=74
+CARDINAL="cardinal"=75
+QWORD="qword"=76
+BOOLEAN="boolean"=77
+BYTEBOOL=78
+LONGBOOL=79
+CHAR="char"=80
+DOTDOT=81
+ASSIGN=82
+REAL="real"=83
+SINGLE="single"=84
+DOUBLE="double"=85
+EXTENDED="extended"=86
+COMP="comp"=87
+STRING="string"=88
+LBRACK=89
+RBRACK=90
+PACKED="packed"=91
+RECORD="record"=92
+CASE="case"=93
+SET="set"=94
+FILE="file"=95
+POINTER=96
+OBJECT="object"=97
+VIRTUAL="virtual"=98
+ABSTRACT="abstract"=99
+PRIVATE="private"=100
+PROTECTED="protected"=101
+CONSTRUCTOR="constructor"=102
+DESTRUCTOR="destructor"=103
+CLASS="class"=104
+OVERRIDE="override"=105
+MESSAGE=106
+PUBLISHED="published"=107
+PROPERTY="property"=108
+LITERAL_read="read"=109
+LITERAL_write="write"=110
+DEFAULT="default"=111
+LITERAL_nodefault="nodefault"=112
+LE=113
+GE=114
+LTH=115
+GT=116
+NOT_EQUAL=117
+IN="in"=118
+IS="is"=119
+PLUS=120
+MINUS=121
+OR="or"=122
+XOR="xor"=123
+STAR=124
+SLASH=125
+DIV="div"=126
+MOD="mod"=127
+AND="and"=128
+SHL="shl"=129
+SHR="shr"=130
+NOT="not"=131
+TRUE="true"=132
+FALSE="false"=133
+AT=134
+PLUSEQ=135
+MINUSEQ=136
+STAREQ=137
+SLASHQE=138
+GOTO="goto"=139
+IF="if"=140
+THEN="then"=141
+ELSE="else"=142
+WHILE="while"=143
+DO="do"=144
+REPEAT="repeat"=145
+UNTIL="until"=146
+FOR="for"=147
+TO="to"=148
+DOWNTO="downto"=149
+WITH="with"=150
+LBRACK2=151
+RBRACK2=152
+OPERATOR="operator"=153
+RAISE="raise"=154
+TRY="try"=155
+EXCEPT="except"=156
+FINALLY="finally"=157
+ON="on"=158
+STRING_LITERAL=159
+CHR="chr"=160
+NIL="nil"=161
+NUM_REAL=162
+IDENT=163
+ABSOLUTE="absolute"=164
+AS="as"=165
+ASM="asm"=166
+ASSEMBLER="assembler"=167
+BREAK="break"=168
+CONTINUE="continue"=169
+DISPOSE="dispose"=170
+EXIT="exit"=171
+INHERITED="inherited"=172
+NEW="new"=173
+SELF="self"=174
+METHOD=175
+ADDSUBOR=176
+ASSIGNEQUAL=177
+SIGN=178
+FUNC=179
+NODE_NOT_EMIT=180
+MYASTVAR=181
+LF=182
+LCURLY=183
+RCURLY=184
+WS=185
+COMMENT_1=186
+COMMENT_2=187
+COMMENT_3=188
+EXPONENT=189
diff --git a/languages/pascal/README.dox b/languages/pascal/README.dox
new file mode 100644
index 00000000..52ef50b1
--- /dev/null
+++ b/languages/pascal/README.dox
@@ -0,0 +1,26 @@
+/** \class PascalSupportPart
+This is Pascal language support plugin.
+
+Pascal support provides good fpc and dcc compiler support by compiler plugins.
+Nearly all command line switches for those compilers can be configured in Project Options.
+Language parser exists but it isn't perfect yet.
+
+In order to generate the parser by hand, antlr v2.7.2 is required.
+There are parser compilation errors with some gcc versions. To avoid
+them, replace file antlr/CppCodeGenerator.java in the antlr source code tree
+with the one from <a href="ftp://fara.cs.uni-potsdam.de/incoming/CppCodeGenerator.java.gz">ftp://fara.cs.uni-potsdam.de/incoming/CppCodeGenerar.java.gz</a>.
+
+\authors <a href="mailto:cloudtemple AT mksat.net">Alexander Dymo</a>
+
+\maintainer <a href="mailto:cloudtemple AT mksat.net">Alexander Dymo</a>
+
+\feature Pascal language support
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug Language parser can sometimes treat correct lines as errors. Please send sample code to maintainer if you have this problem.
+
+\faq <b>Why KDevelop does not provide GNU pascal compiler plugin?</b> If you need GNU pascal compiler plugin, please write about it to maintainer and prepare to help testing it.
+\faq <b>Compiler plugin lacks option X.</b> Write about it to maintaner or send a patch. Adding compiler options is easy task. Just look at languages/pascal/compiler directory.
+
+
+*/
diff --git a/languages/pascal/app_templates/Makefile.am b/languages/pascal/app_templates/Makefile.am
new file mode 100644
index 00000000..9fd47804
--- /dev/null
+++ b/languages/pascal/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = pascalhello fpcgtk fpchello fpcsharedlib
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/CompiledLanguageIDE/PascalIDE
+profiles_DATA = pascal.appwizard
diff --git a/languages/pascal/app_templates/fpcgtk/.kdev_ignore b/languages/pascal/app_templates/fpcgtk/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/pascal/app_templates/fpcgtk/.kdev_ignore
diff --git a/languages/pascal/app_templates/fpcgtk/Makefile.am b/languages/pascal/app_templates/fpcgtk/Makefile.am
new file mode 100644
index 00000000..252cbf27
--- /dev/null
+++ b/languages/pascal/app_templates/fpcgtk/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = main.pp app.kdevelop
+templateName = fpcgtk
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/pascal/app_templates/fpcgtk/app.kdevelop b/languages/pascal/app_templates/fpcgtk/app.kdevelop
new file mode 100644
index 00000000..995d340b
--- /dev/null
+++ b/languages/pascal/app_templates/fpcgtk/app.kdevelop
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevPascalProject</projectmanagement>
+ <primarylanguage>Pascal</primarylanguage>
+ <keywords>
+ <keyword>Pascal</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevpascalproject>
+ <general>
+ <useconfiguration>default</useconfiguration>
+ </general>
+ <configurations>
+ <default>
+ <mainsource>src/%{APPNAMELC}.pp</mainsource>
+ <compiler>kdevfpcoptions</compiler>
+ <compileroptions>-vr</compileroptions>
+ <compilerexec>fpc</compilerexec>
+ </default>
+ </configurations>
+ <run>
+ <terminal>false</terminal>
+ </run>
+ </kdevpascalproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="pp"/>
+ <type ext="pas"/>
+ <type ext="dpr"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/pascal/app_templates/fpcgtk/fpcgtk b/languages/pascal/app_templates/fpcgtk/fpcgtk
new file mode 100644
index 00000000..374f1bc9
--- /dev/null
+++ b/languages/pascal/app_templates/fpcgtk/fpcgtk
@@ -0,0 +1,9 @@
+# KDE Config File
+[General]
+Name=GTK+ application
+Name[fr]=Une application GTK+
+Category=Pascal/Free Pascal
+Comment=Generates a GTK+ based GUI application in Pascal
+Comment[fr]=Génère une application basée sur la bibliothéque GTK+ dans le language PASCAL.
+FileTemplates=pp-program,PStyle,pp-unit,PStyle
+ShowFilesAfterGeneration=src/APPNAMELC.pp
diff --git a/languages/pascal/app_templates/fpcgtk/fpcgtk.kdevtemplate b/languages/pascal/app_templates/fpcgtk/fpcgtk.kdevtemplate
new file mode 100644
index 00000000..56696aa1
--- /dev/null
+++ b/languages/pascal/app_templates/fpcgtk/fpcgtk.kdevtemplate
@@ -0,0 +1,114 @@
+# KDE Config File
+[General]
+Name=GTK+ application
+Name[ca]=Aplicació GTK+
+Name[da]=GTK+ program
+Name[de]=GTK+-Anwendung
+Name[el]=ΕφαÏμογή GTK+
+Name[es]=Aplicación GTK+
+Name[et]=GTK+ rakendus
+Name[eu]=GTK+ aplikazioa
+Name[fa]=کاربرد GTK+
+Name[fr]=Application GTK+
+Name[ga]=Feidhmchlár GTK+
+Name[gl]=Aplicación GTK+
+Name[hu]=GTK+-alapú alkalmazás
+Name[it]=Applicazione GTK+
+Name[ja]=GTK+ アプリケーション
+Name[nds]=GTK+-Programm
+Name[ne]=GTK+ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=GTK+-toepassing
+Name[pl]=Program GTK+
+Name[pt]=Aplicação do GTK+
+Name[pt_BR]=Aplicativo GTK+
+Name[ru]=Приложение GTK+
+Name[sk]=GTK+ aplikácia
+Name[sr]=GTK+ програм
+Name[sr@Latn]=GTK+ program
+Name[sv]=GTK+ program
+Name[tr]=GTK+ Uygulaması
+Name[zh_CN]=GTK+ 应用程åº
+Name[zh_TW]=GTK+ 應用程å¼
+Category=Pascal/Free Pascal
+Comment=Generates a GTK+ based GUI application in Pascal
+Comment[ca]=Genera una aplicació IGU en Pascal basada en GTK+
+Comment[da]=Genererer et GTK+ baseret GUI program i Pascal
+Comment[de]=Erstellt eine auf GTK+ basierende GUI-Anwendung in Pascal
+Comment[el]=ΔημιουÏγεί μια γÏαφική εφαÏμογή βασισμένη στο GTK+ σε Pascal
+Comment[es]=Genera una aplicación gráfica en Pascal basada en GTK+
+Comment[et]=Graafilise rakenduse loomine GTK+ põhjal Pascalis
+Comment[eu]=GTK+-en oinarritutako GUI aplikazio bat sortzen du Pascal-en
+Comment[fa]=یک کاربرد ونک بر مبنای GTK+ در پاسکال تولید می‌کند
+Comment[fr]=Génère une application avec interface graphique basée sur GTK+ en Pascal
+Comment[ga]=Cruthaigh feidhmchlár grafach i Pascal, bunaithe ar GTK+
+Comment[gl]=Xera unha aplicación GUI baseada en GTK+ en Pascal
+Comment[hu]=Létrehoz egy GTK+-alapú grafikus felületű alkalmazást Pascalban
+Comment[it]=Genera un'applicazione GUI basata su GTK+ in Pascal
+Comment[ja]=GTK+ ベース㮠GUI アプリケーションを Pascal ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt en op GTK+ opbuut Böversietprogramm in Pascal op
+Comment[ne]= GTK+ आधारित जी यू आई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पासà¥à¤•à¤²à¤®à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een GKT+-gebaseerde GUI-toepassing in Pascal
+Comment[pl]=Generuje program z graficznym interfejsem użytkownika używający GTK+ w Pascalu
+Comment[pt]=Gera uma aplicação gráfica, baseada em GTK+, em Pascal
+Comment[pt_BR]=Gera uma aplicação gráfica, baseada em GTK+, em Pascal
+Comment[ru]=Создание Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ GTK+ на Pascal
+Comment[sk]=Vygeneruje GTK+ GUI aplikáciu v Pascal
+Comment[sr]=Прави GUI програм на оÑнову GTK+ у Pascal-у
+Comment[sr@Latn]=Pravi GUI program na osnovu GTK+ u Pascal-u
+Comment[sv]=Skapar ett GTK+ baserat program med grafiskt användargränssnitt i Pascal
+Comment[zh_CN]=生æˆä¸€ä¸ª Pascal 语言的 GTK+ GUI 应用程åº
+Comment[zh_TW]=產生一個 Pascal 語言,以GTK+ 為基礎的使用者介é¢æ‡‰ç”¨ç¨‹å¼
+FileTemplates=pp-program,PStyle,pp-unit,PStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.pp
+Archive=fpcgtk.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE2]
+Type=install
+Source=%{src}/main.pp
+Dest=%{dest}/src/%{APPNAMELC}.pp
+
+[MSG]
+Type=message
+Comment=A GTK+ application written in pascal was created in %{dest}
+Comment[ca]=Una aplicació GTK+ escrita en Pascal ha estat creada en %{dest}
+Comment[da]=Et GTK+ program skrevet i pascal blev oprettet i %{dest}
+Comment[de]=Eine in Pascal geschriebene GTK+-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή GTK+ γÏαμμένη σε pascal δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación GTK+ escrita en Pascal ha sido creada en %{dest}
+Comment[et]=GTK+ rakendus Pascalis loodi asukohta %{dest}
+Comment[eu]=Pascal-en idatzitako GTK+ aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد GTK+ نوشته‌شده در پاسکال در %{dest} ایجاد شد
+Comment[fr]=Une application GTK+ écrite en Pascal a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár GTK+, scríofa i pascal, i %{dest}
+Comment[gl]=Creouse unha aplicación GTK+ escrita en pascal en %{dest}
+Comment[hu]=Létrejött egy egyszerű, Pascal nyelvű, GTK+-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione GTK+ scritta in Pascal in %{dest}
+Comment[ja]=Pascal ã§æ›¸ã‹ã‚ŒãŸ GTK+ アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Pascal-Programm för GTK+ opstellt
+Comment[ne]=पासà¥à¤•à¤²à¤®à¤¾ लेखिà¤à¤•à¥‹ GTK+ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een GTK+-toepassing geschreven in Pascal is aangemaakt in %{dest}
+Comment[pl]=Program GTK+ napisany w Pascalu został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação GTK+, escrita em Pascal, em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação GTK+, escrita em Pascal, em %{dest}
+Comment[ru]=Приложение GTK+ на Pascal Ñоздано в %{dest}
+Comment[sk]=GTK+ aplikácia v Pascal bola vytvorená v %{dest}
+Comment[sr]=GTK+ програм у Pascal-у направљен је у %{dest}
+Comment[sr@Latn]=GTK+ program u Pascal-u napravljen je u %{dest}
+Comment[sv]=Ett GTK+ program skrivet i Pascal skapades i %{dest}
+Comment[tr]=Pascal'da yazılmış bir GTK+ uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了 Pascal 语言的 GTK+ 应用程åº
+Comment[zh_TW]=一個 Pascal çš„ GTK+ 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/pascal/app_templates/fpcgtk/fpcgtk.png b/languages/pascal/app_templates/fpcgtk/fpcgtk.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/pascal/app_templates/fpcgtk/fpcgtk.png
Binary files differ
diff --git a/languages/pascal/app_templates/fpcgtk/main.pp b/languages/pascal/app_templates/fpcgtk/main.pp
new file mode 100644
index 00000000..4ac4a3b4
--- /dev/null
+++ b/languages/pascal/app_templates/fpcgtk/main.pp
@@ -0,0 +1,84 @@
+program %{APPNAMELC};
+
+{$mode objfpc}
+
+uses
+ glib,gdk,gtk;
+
+procedure hello(widget : pGtkWidget ; data: pgpointer ); cdecl;
+begin
+ writeln('Hello World');
+end;
+
+function delete_event (widget : pGtkWidget ; event: pGdkEvent; data: pgpointer ): integer; cdecl;
+begin
+ writeln('Delete Event Occurred');
+ delete_event := ord(true);
+end;
+
+procedure destroy(widget : pGtkWidget ; data: pgpointer ); cdecl;
+begin
+ gtk_main_quit();
+end;
+
+var
+ window, button : pGtkWidget;//GtkWidget is the storage type for widgets
+
+
+begin
+ // This is called in all GTK applications. Arguments are parsed
+ // from the command line and are returned to the application.
+ gtk_init (@argc, @argv);
+
+ // create a new window
+ window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ // When the window is given the "delete_event" signal (this is given
+ // by the window manager, usually by the 'close' option, or on the
+ // titlebar), we ask it to call the delete_event () function
+ // as defined above. The data passed to the callback
+ // function is NULL and is ignored in the callback function.
+ gtk_signal_connect (pGTKOBJECT (window), 'delete_event',
+ GTK_SIGNAL_FUNC (@delete_event), NIL);
+
+
+ // Here we connect the "destroy" event to a signal handler.
+ // This event occurs when we call gtk_widget_destroy() on the window,
+ // or if we return 'FALSE' in the "delete_event" callback.
+ gtk_signal_connect (pGTKOBJECT (window), 'destroy',
+ GTK_SIGNAL_FUNC (@destroy), NULL);
+
+ // Sets the border width of the window.
+ gtk_container_set_border_width (GTK_CONTAINER (window), 10);
+
+ // Creates a new button with the label "Hello World".
+ button := gtk_button_new_with_label ('Hello_World');
+
+ // When the button receives the "clicked" signal, it will call the
+ // function hello() passing it NULL as its argument. The hello()
+ // function is defined above. */
+ gtk_signal_connect (pGTKOBJECT (button), 'clicked',
+ GTK_SIGNAL_FUNC (@hello), NULL);
+
+ // This will cause the window to be destroyed by calling
+ // gtk_widget_destroy(window) when "clicked". Again, the destroy
+ // signal could come from here, or the window manager
+ gtk_signal_connect_object (pGTKOBJECT (button), 'clicked',
+ GTK_SIGNAL_FUNC (@gtk_widget_destroy),
+ pGTKOBJECT(window));
+
+ // This packs the button into the window (a gtk container).
+ gtk_container_add (GTK_CONTAINER (window), button);
+
+ // The final step is to display this newly created widget.
+ gtk_widget_show (button);
+
+ // and the window
+ gtk_widget_show (window);
+
+ // All GTK applications must have a gtk_main(). Control ends here
+ // and waits for an event to occur (like a key press or
+ // mouse event).
+ gtk_main ();
+
+end.
diff --git a/languages/pascal/app_templates/fpchello/.kdev_ignore b/languages/pascal/app_templates/fpchello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/pascal/app_templates/fpchello/.kdev_ignore
diff --git a/languages/pascal/app_templates/fpchello/Makefile.am b/languages/pascal/app_templates/fpchello/Makefile.am
new file mode 100644
index 00000000..e09141dc
--- /dev/null
+++ b/languages/pascal/app_templates/fpchello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = main.pp app.kdevelop
+templateName = fpchello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/pascal/app_templates/fpchello/app.kdevelop b/languages/pascal/app_templates/fpchello/app.kdevelop
new file mode 100644
index 00000000..f0a07582
--- /dev/null
+++ b/languages/pascal/app_templates/fpchello/app.kdevelop
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevPascalProject</projectmanagement>
+ <primarylanguage>Pascal</primarylanguage>
+ <keywords>
+ <keyword>Pascal</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevpascalproject>
+ <general>
+ <useconfiguration>default</useconfiguration>
+ </general>
+ <configurations>
+ <default>
+ <mainsource>src/%{APPNAMELC}.pp</mainsource>
+ <compiler>kdevfpcoptions</compiler>
+ <compileroptions>-vr</compileroptions>
+ <compilerexec>fpc</compilerexec>
+ </default>
+ </configurations>
+ <run>
+ <terminal>true</terminal>
+ </run>
+ </kdevpascalproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="pp"/>
+ <type ext="pas"/>
+ <type ext="dpr"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/pascal/app_templates/fpchello/fpchello b/languages/pascal/app_templates/fpchello/fpchello
new file mode 100644
index 00000000..b5a0acbf
--- /dev/null
+++ b/languages/pascal/app_templates/fpchello/fpchello
@@ -0,0 +1,9 @@
+# KDE Config File
+[General]
+Name=Simple program
+Name[fr]=Un simple programme de test
+Category=Pascal/Free Pascal
+Comment=Generates a simple program in Pascal
+Comment[fr]=Génère un simple programme de test dans le language PASCAL.
+FileTemplates=pp-program,PStyle,pp-unit,PStyle
+ShowFilesAfterGeneration=src/APPNAMELC.pp
diff --git a/languages/pascal/app_templates/fpchello/fpchello.kdevtemplate b/languages/pascal/app_templates/fpchello/fpchello.kdevtemplate
new file mode 100644
index 00000000..44fa8bc1
--- /dev/null
+++ b/languages/pascal/app_templates/fpchello/fpchello.kdevtemplate
@@ -0,0 +1,115 @@
+# KDE Config File
+[General]
+Name=Simple program
+Name[ca]=Simple programa
+Name[da]=Simpelt program
+Name[de]=Einfaches Programm
+Name[el]=Απλό Ï€ÏόγÏαμμα
+Name[es]=Programa sencillo
+Name[et]=Lihtne programm
+Name[eu]=Programa sinplea
+Name[fa]=برنامۀ ساده
+Name[fr]=Programme simple
+Name[ga]=Ríomhchlár simplí
+Name[gl]=Programa sinxelo
+Name[hu]=Egyszerű program
+Name[it]=Semplice programma
+Name[ja]=ç°¡å˜ãªãƒ—ログラム
+Name[nds]=Eenfach Programm
+Name[ne]=साधारण कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Eenvoudig programma
+Name[pl]=Prosty program
+Name[pt]=Programa simples
+Name[pt_BR]=Programa simples
+Name[ru]=ПроÑтое приложение
+Name[sk]=Jednoduchý prohram
+Name[sr]=ЈедноÑтаван програм
+Name[sr@Latn]=Jednostavan program
+Name[sv]=Enkelt program
+Name[tr]=Basit program
+Name[zh_CN]=简å•ç¨‹åº
+Name[zh_TW]=簡單程å¼
+Category=Pascal/Free Pascal
+Comment=Generates a simple program in Pascal
+Comment[ca]=Genera un simple programa en Pascal
+Comment[da]=Genererer et simpelt program i Pascal
+Comment[de]=Erstellt ein einfaches Programm in Pascal
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα σε Pascal
+Comment[es]=Genera un sencillo programa en Pascal
+Comment[et]=Lihtsa programmi loomine Pascalis
+Comment[eu]=Pascal-en idatzitako programa sinple bat
+Comment[fa]=یک برنامۀ ساده در پاسکال تولید می‌کند
+Comment[fr]=Génère un programme simple en Pascal
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí i Pascal
+Comment[gl]=Xera un programa sinxelo en Pascal
+Comment[hu]=Létrehoz egy egyszerű programot Pascalban
+Comment[it]=Genera un semplice programma in Pascal
+Comment[ja]=ç°¡å˜ãªãƒ—ログラムを Pascal ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach Pascal-Programm op
+Comment[ne]=पासà¥à¤•à¤²à¤®à¤¾ साधारण कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudig programma in Pascal
+Comment[pl]=Generuje prosty program w Pascalu
+Comment[pt]=Gera um programa simples em Pascal
+Comment[pt_BR]=Gera um programa simples em Pascal
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° Pascal
+Comment[sk]=Vygeneruje jednoduchý program v Pascal
+Comment[sr]=Прави једноÑтаван програм у Pascal-у
+Comment[sr@Latn]=Pravi jednostavan program u Pascal-u
+Comment[sv]=Skapar ett enkelt program i Pascal
+Comment[tr]=Pascal'da basit bir program yaratır
+Comment[zh_CN]=生æˆä¸€ä¸ªç®€å•çš„ Pascal 语言程åº
+Comment[zh_TW]=產生一個 Pascal 的簡單程å¼
+FileTemplates=pp-program,PStyle,pp-unit,PStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.pp
+Archive=fpchello.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE2]
+Type=install
+Source=%{src}/main.pp
+Dest=%{dest}/src/%{APPNAMELC}.pp
+
+[MSG]
+Type=message
+Comment=A simple pascal program was created in %{dest}
+Comment[ca]=Un simple programa en Pascal ha estat creat en %{dest}
+Comment[da]=Et simpelt pascal program blev oprettet i %{dest}
+Comment[de]=Ein einfaches Programm in Pascal wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό Ï€ÏόγÏαμμα pascal δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo programa en Pascal ha sido creado en %{dest}
+Comment[et]=Lihtne Pascali programm loodi asukohta %{dest}
+Comment[eu]=Pascal-en oinarritutako programa sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامۀ سادۀ پاسکال در %{dest} ایجاد شد
+Comment[fr]=Un programme Pascal simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh ríomhchlár simplí pascal i %{dest}
+Comment[gl]=Creouse un programa sinxelo en pascal en %{dest}
+Comment[hu]=Létrejött egy egyszerű Pascal-program itt: %{dest}
+Comment[it]=È stato creato un semplice programma Pascal in %{dest}
+Comment[ja]=ç°¡å˜ãª Pascal プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach Pascal-Programm opstellt
+Comment[ne]=साधारण पासà¥à¤•à¤² कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig Pascal-programma is aangemaakt in %{dest}
+Comment[pl]=Prosty program w Pascalu został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples em Pascal em %{dest}
+Comment[pt_BR]=Foi criado um programa simples em Pascal em %{dest}
+Comment[ru]=ПроÑтое приложение на Pascal Ñоздано в %{dest}
+Comment[sk]=Jednoduchý program v Pascal bol vytvorený v %{dest}
+Comment[sr]=ЈедноÑтаван pascal програм направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan pascal program napravljen je u %{dest}
+Comment[sv]=Ett enkelt Pascal-program skapades i %{dest}
+Comment[tr]=Pascal'da basit bir program %{dest} içinde yaratıldı
+Comment[zh_CN]=在 %{dest} 创建了一个简å•çš„ Pascal 程åº
+Comment[zh_TW]=一個簡單的 Pascal 程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/pascal/app_templates/fpchello/fpchello.png b/languages/pascal/app_templates/fpchello/fpchello.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/pascal/app_templates/fpchello/fpchello.png
Binary files differ
diff --git a/languages/pascal/app_templates/fpchello/main.pp b/languages/pascal/app_templates/fpchello/main.pp
new file mode 100644
index 00000000..932c3c0b
--- /dev/null
+++ b/languages/pascal/app_templates/fpchello/main.pp
@@ -0,0 +1,5 @@
+program main;
+
+begin
+ WriteLn('Hello World');
+end.
diff --git a/languages/pascal/app_templates/fpcsharedlib/.kdev_ignore b/languages/pascal/app_templates/fpcsharedlib/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/pascal/app_templates/fpcsharedlib/.kdev_ignore
diff --git a/languages/pascal/app_templates/fpcsharedlib/Makefile.am b/languages/pascal/app_templates/fpcsharedlib/Makefile.am
new file mode 100644
index 00000000..6a7f1a85
--- /dev/null
+++ b/languages/pascal/app_templates/fpcsharedlib/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = main.pp app.kdevelop
+templateName = fpcsharedlib
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/pascal/app_templates/fpcsharedlib/app.kdevelop b/languages/pascal/app_templates/fpcsharedlib/app.kdevelop
new file mode 100644
index 00000000..bdf974e9
--- /dev/null
+++ b/languages/pascal/app_templates/fpcsharedlib/app.kdevelop
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevPascalProject</projectmanagement>
+ <primarylanguage>Pascal</primarylanguage>
+ <keywords>
+ <keyword>Pascal</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevpascalproject>
+ <general>
+ <useconfiguration>default</useconfiguration>
+ </general>
+ <configurations>
+ <default>
+ <mainsource>src/%{APPNAMELC}.pp</mainsource>
+ <compiler>kdevfpcoptions</compiler>
+ <compileroptions>-vr</compileroptions>
+ <compilerexec>fpc</compilerexec>
+ </default>
+ </configurations>
+ <run>
+ <terminal>true</terminal>
+ </run>
+ </kdevpascalproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="pp"/>
+ <type ext="pas"/>
+ <type ext="dpr"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/pascal/app_templates/fpcsharedlib/fpcsharedlib b/languages/pascal/app_templates/fpcsharedlib/fpcsharedlib
new file mode 100644
index 00000000..51a294f9
--- /dev/null
+++ b/languages/pascal/app_templates/fpcsharedlib/fpcsharedlib
@@ -0,0 +1,9 @@
+# KDE Config File
+[General]
+Name=Shared library
+Name[fr]=Une bibliothéque partagée
+Category=Pascal/Free Pascal
+Comment=Generates a shared library in Pascal
+Comment[fr]=Génère une bibliothéque partagée dans le language PASCAL.
+FileTemplates=pp-program,PStyle,pp-unit,PStyle
+ShowFilesAfterGeneration=src/APPNAMELC.pp
diff --git a/languages/pascal/app_templates/fpcsharedlib/fpcsharedlib.kdevtemplate b/languages/pascal/app_templates/fpcsharedlib/fpcsharedlib.kdevtemplate
new file mode 100644
index 00000000..3e4eb4fe
--- /dev/null
+++ b/languages/pascal/app_templates/fpcsharedlib/fpcsharedlib.kdevtemplate
@@ -0,0 +1,115 @@
+# KDE Config File
+[General]
+Name=Shared library
+Name[ca]=Biblioteca compartida
+Name[da]=Delt bibliotek
+Name[de]=Shared Library
+Name[el]=ΚοινόχÏηστη βιβλιοθήκη
+Name[es]=Biblioteca compartida
+Name[et]=Jagatud teek
+Name[eu]=Liburutegi partekatua
+Name[fa]=کتابخانۀ مشترک
+Name[fr]=Bibliothèque partagée
+Name[ga]=Comhleabharlann
+Name[gl]=Biblioteca compartida
+Name[hu]=Osztott programkönyvtár
+Name[it]=Libreria condivisa
+Name[ja]=共有ライブラリ
+Name[nds]=Deelt Bibliotheek
+Name[ne]=साà¤à¥‡à¤¦à¤¾à¤° लाइबà¥à¤°à¥‡à¤°à¥€
+Name[nl]=Gedeelde bibliotheek
+Name[pl]=Biblioteka dzielona
+Name[pt]=Biblioteca dinâmica
+Name[pt_BR]=Biblioteca compartilhada
+Name[ru]=РазделÑÐµÐ¼Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ°
+Name[sk]=Zdieľaná knižnica
+Name[sr]=Дељена библиотека
+Name[sr@Latn]=Deljena biblioteka
+Name[sv]=Delat bibliotek
+Name[tr]=Paylaşılan Kütüphane
+Name[zh_CN]=共享库
+Name[zh_TW]=共享函å¼åº«
+Category=Pascal/Free Pascal
+Comment=Generates a shared library in Pascal
+Comment[ca]=Genera una biblioteca compartida en Pascal
+Comment[da]=Genererer et delt bibliotek i Pascal
+Comment[de]=Erstellt eine Shared Library in Pascal
+Comment[el]=ΔημιουÏγία μιας κοινόχÏηστης βιβλιοθήκης σε Pascal
+Comment[es]=Genera una biblioteca compartida en Pascal
+Comment[et]=Jagatud teegi loomine Pascalis
+Comment[eu]=Pascal-en idatzitako liburutegi partekatu bat sortzen du
+Comment[fa]=یک کتابخانۀ مشترک در پاسکال تولید می‌کند
+Comment[fr]=Génère une bibliothèque partagée en Pascal
+Comment[ga]=Cruthaíonn sé seo comhleabharlann i Pascal
+Comment[gl]=Xera unha biblioteca compartida en Pascal
+Comment[hu]=Létrehoz egy osztott programkönyvtárt Pascalban
+Comment[it]=Genera una libreria condivisa in Pascal
+Comment[ja]=共有ライブラリを Pascal ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt en deelt Bibliotheek in Pascal op
+Comment[ne]=साà¤à¥‡à¤¦à¤¾à¤° लाइबà¥à¤°à¥‡à¤°à¥€à¤²à¤¾à¤ˆ पासà¥à¤•à¤²à¤®à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een gedeelde bibliotheek in Pascal
+Comment[pl]=Generuje bibliotekÄ™ dzielonÄ… w Pascalu
+Comment[pt]=Gera uma biblioteca dinâmica em Pascal
+Comment[pt_BR]=Gera uma biblioteca dinâmica em Pascal
+Comment[ru]=Создание разделÑемой библиотеки на Pascal
+Comment[sk]=Vygeneruje zdieľanú knižnicu v Pascal
+Comment[sr]=Прави дељену библиотеку у Pascal-у
+Comment[sr@Latn]=Pravi deljenu biblioteku u Pascal-u
+Comment[sv]=Skapar ett delat bibliotek i Pascal
+Comment[tr]=Pascal'da bir paylaşılan kütüphane yaratır
+Comment[zh_CN]=ç”Ÿæˆ Pascal 语言的共享库
+Comment[zh_TW]=產生一個 Pascal 的共享函å¼åº«
+FileTemplates=pp-program,PStyle,pp-unit,PStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.pp
+Archive=fpcsharedlib.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE2]
+Type=install
+Source=%{src}/main.pp
+Dest=%{dest}/src/%{APPNAMELC}.pp
+
+[MSG]
+Type=message
+Comment=A shared library project written in pascal was created in %{dest}
+Comment[ca]=Una biblioteca compartida escrita en Pascal ha estat creada en %{dest}
+Comment[da]=Et delt biblioteksprojekt skrevet i pascal blev oprettet i %{dest}
+Comment[de]=Ein Projekt für eine in Pascal geschriebene Shared Library wurde in %{dest} erstellt.
+Comment[el]=Ένα έÏγο κοινόχÏηστης βιβλιοθήκης γÏαμμένο σε pascal δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un proyecto de biblioteca compartida escrito en Pascal ha sido creado en %{dest}
+Comment[et]=Jagatud teegi projekt Pascalis loodi asukohta %{dest}
+Comment[eu]=Pascal-en idatzitako liburutegi partekatu bat sortu da hemen: %{dest}
+Comment[fa]=یک پروژۀ کتابخانۀ مشترک نوشته‌شده در پاسکال در %{dest} ایجاد شد
+Comment[fr]=Un projet de bibliothèque partagée écrit en Pascal a été créé dans %{dest}
+Comment[ga]=Cruthaíodh tionscadal comhleabharlainne, scríofa i pascal, i %{dest}
+Comment[gl]=Creouse un proxecto de biblioteca compartida en pascan en %{dest}
+Comment[hu]=Létrejött egy Pascal nyelvű projekt osztott programkönyvtár készítéséhez itt: %{dest}
+Comment[it]=È stato creato un progetto di libreria condivisa scritto in Pascal in %{dest}
+Comment[ja]=Pascal ã§æ›¸ã‹ã‚ŒãŸå…±æœ‰ãƒ©ã‚¤ãƒ–ラリプロジェクトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Projekt för en in Pascal schreven deelt Bibliotheek opstellt
+Comment[ne]=पासà¥à¤•à¤²à¤®à¤¾ लेखिà¤à¤•à¥‹ साà¤à¥‡à¤¦à¤¾à¤° लाइबà¥à¤°à¥‡à¤°à¥€ परियोजना %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een gedeelde bibliotheek geschreven in Pascal is aangemaakt in %{dest}
+Comment[pl]=Projekt biblioteki dzielonej napisanej w Pascalu został utworzony w %{dest}
+Comment[pt]=Foi criado o projecto de uma biblioteca dinâmica em Pascal em %{dest}
+Comment[pt_BR]=Foi criado o projecto de uma biblioteca dinâmica em Pascal em %{dest}
+Comment[ru]=РазделÑÐµÐ¼Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° на Pascal Ñоздана в %{dest}
+Comment[sk]=Zdieľaná knižnica v Pascal bola vytvorená v %{dest}
+Comment[sr]=Пројекат дељене библиотеке у Pascal-у направљен је у %{dest}
+Comment[sr@Latn]=Projekat deljene biblioteke u Pascal-u napravljen je u %{dest}
+Comment[sv]=Ett projekt med delat bibliotek skrivet i Pascal skapades i %{dest}
+Comment[tr]=Pascal'da bir paylaşılan kütüphane projesi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个 Pascal 语言的共享库工程
+Comment[zh_TW]=一個 Pascal 的共享函å¼åº«å°ˆæ¡ˆå·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/pascal/app_templates/fpcsharedlib/fpcsharedlib.png b/languages/pascal/app_templates/fpcsharedlib/fpcsharedlib.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/pascal/app_templates/fpcsharedlib/fpcsharedlib.png
Binary files differ
diff --git a/languages/pascal/app_templates/fpcsharedlib/main.pp b/languages/pascal/app_templates/fpcsharedlib/main.pp
new file mode 100644
index 00000000..c02e1472
--- /dev/null
+++ b/languages/pascal/app_templates/fpcsharedlib/main.pp
@@ -0,0 +1,11 @@
+library %{APPNAMELC};
+
+function %{APPNAMELC}_test: integer; cdecl; export;
+begin
+ %{APPNAMELC}_test := 0;
+end;
+
+exports
+ %{APPNAMELC}_test;
+
+end.
diff --git a/languages/pascal/app_templates/pascal.appwizard b/languages/pascal/app_templates/pascal.appwizard
new file mode 100644
index 00000000..766cc0ba
--- /dev/null
+++ b/languages/pascal/app_templates/pascal.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=pascalhello,fpcgtk,fpchello,fpcsharedlib
diff --git a/languages/pascal/app_templates/pascalhello/.kdev_ignore b/languages/pascal/app_templates/pascalhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/pascal/app_templates/pascalhello/.kdev_ignore
diff --git a/languages/pascal/app_templates/pascalhello/Makefile.am b/languages/pascal/app_templates/pascalhello/Makefile.am
new file mode 100644
index 00000000..02924e72
--- /dev/null
+++ b/languages/pascal/app_templates/pascalhello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = main.pp app.kdevelop
+templateName = pascalhello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/pascal/app_templates/pascalhello/app.kdevelop b/languages/pascal/app_templates/pascalhello/app.kdevelop
new file mode 100644
index 00000000..fcb75f33
--- /dev/null
+++ b/languages/pascal/app_templates/pascalhello/app.kdevelop
@@ -0,0 +1,83 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevPascalProject</projectmanagement>
+ <primarylanguage>Pascal</primarylanguage>
+ <keywords>
+ <keyword>Pascal</keyword>
+ <keyword>Code</keyword>
+ </keywords>
+ </general>
+ <kdevpascalproject>
+ <general>
+ <useconfiguration>default</useconfiguration>
+ </general>
+ <configurations>
+ <default>
+ <mainsource>src/%{APPNAMELC}.pp</mainsource>
+ </default>
+ </configurations>
+ <run>
+ <terminal>true</terminal>
+ </run>
+ </kdevpascalproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="pp"/>
+ <type ext="pas"/>
+ <type ext="dpr"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/pascal/app_templates/pascalhello/main.pp b/languages/pascal/app_templates/pascalhello/main.pp
new file mode 100644
index 00000000..932c3c0b
--- /dev/null
+++ b/languages/pascal/app_templates/pascalhello/main.pp
@@ -0,0 +1,5 @@
+program main;
+
+begin
+ WriteLn('Hello World');
+end.
diff --git a/languages/pascal/app_templates/pascalhello/pascalhello b/languages/pascal/app_templates/pascalhello/pascalhello
new file mode 100644
index 00000000..7482fb78
--- /dev/null
+++ b/languages/pascal/app_templates/pascalhello/pascalhello
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=Simple Hello world program
+Name[fr]=Un simple programme de test « Hello world »
+Icon=pascalhello.png
+Category=Pascal
+Comment=Generates a simple Hello world program in Pascal
+Comment[fr]=Génère un simple programme de test du type « Hello world » dans le language PASCAL.
+FileTemplates=pp-program,PStyle,pp-unit,PStyle
+ShowFilesAfterGeneration=src/APPNAMELC.pp
diff --git a/languages/pascal/app_templates/pascalhello/pascalhello.kdevtemplate b/languages/pascal/app_templates/pascalhello/pascalhello.kdevtemplate
new file mode 100644
index 00000000..13c9df69
--- /dev/null
+++ b/languages/pascal/app_templates/pascalhello/pascalhello.kdevtemplate
@@ -0,0 +1,116 @@
+# KDE Config File
+[General]
+Name=Simple Hello world program
+Name[ca]=Simple programa Hello world
+Name[da]=Simpelt Goddag verden program
+Name[de]=Ein einfaches "Hello World"-Programm
+Name[el]=Απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε
+Name[es]=Programa «Hola mundo» sencillo
+Name[et]=Lihtne "Tere, maailm" programm
+Name[eu]="Kaixo mundua" programa sinplea
+Name[fa]=برنامۀ سادۀ Hello world
+Name[fr]=Programme « Bonjour monde » simple
+Name[ga]=Ríomhchlár simplí "Hello World"
+Name[gl]=Programa sinxelo Ola mundo
+Name[hu]=Egyszerű Hello world program
+Name[it]=Semplice programma di "Hello world"
+Name[ja]=ç°¡å˜ãª Hello world プログラム
+Name[ms]=Program Hello World mudah
+Name[nds]=En eenfach "Moin Welt"-Programm
+Name[ne]=साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®
+Name[nl]=Eenvoudig 'Hello World' programma
+Name[pl]=Prosty program witaj świecie
+Name[pt]=Programa simples Olá Mundo
+Name[pt_BR]=Programa simples Olá Mundo
+Name[ru]=ПроÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Hello world
+Name[sk]=Jednoduchý "Ahoj svet" program
+Name[sl]=Preprost program Hello world
+Name[sr]=ЈедноÑтаван „Здраво Ñвете“ програм
+Name[sr@Latn]=Jednostavan „Zdravo svete“ program
+Name[sv]=Enkelt Hello world-program
+Name[tr]=Basit Merhaba dünya programı
+Name[zh_CN]=简å•çš„ Hello world 程åº
+Name[zh_TW]=簡單的 Hello world 程å¼
+Icon=pascalhello.png
+Category=Pascal
+Comment=Generates a simple Hello world program in Pascal
+Comment[ca]=Genera un simple programa de Hello world en Pascal
+Comment[da]=Genererer et simpelt Goddag verden program i Pascal
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in Pascal
+Comment[el]=ΔημιουÏγεί ένα απλό Ï€ÏόγÏαμμα Γεια σου Κόσμε σε Pascal
+Comment[es]=Genera un programa «Hola mundo» sencillo en Pascal
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine Pascalis
+Comment[eu]=Pascal-en idatzitako "Kaixo mundua" programa sinple bat sortzen du
+Comment[fa]=یک برنامۀ سادۀ Hello world در پاسکال تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en Pascal
+Comment[gl]=Xera un programa sinxelo Ola mundo en Pascal
+Comment[hu]=Létrehoz egy egyszerű Hello world programot Pascalban
+Comment[it]=Genera un semplice programma di "Hello world" in Pascal
+Comment[ja]=ç°¡å˜ãª Hello world プログラムを Pascal ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Stellt in Pascal en eenfach "Moin Welt"-Programm op
+Comment[ne]=साधारण हेलà¥à¤²à¥‹ वोलà¥à¤¡ कारà¥à¤¯à¤•à¥à¤°à¤®à¤²à¤¾à¤ˆ पासà¥à¤•à¤²à¤®à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvudig Hello World-programma in Pascal
+Comment[pl]=Generuje prosty program "Witaj świecie" w Pascalu
+Comment[pt]=Gera um programa simples Olá Mundo em Pascal
+Comment[pt_BR]=Gera um programa simples Olá Mundo em Pascal
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Hello world на Pascal
+Comment[sk]=Vygeneruje jednoduchý Ahoj svet program v Pascal
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ у Pascal-у
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ u Pascal-u
+Comment[sv]=Skapar ett enkelt Hello world-program i Pascal
+Comment[tr]=Pascal'da basit bir Merhaba Dünya programı yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ªç®€å•çš„ Pascal 语言 Hello world 程åº
+Comment[zh_TW]=產生一個簡單的 Pascal Hello world 程å¼
+FileTemplates=pp-program,PStyle,pp-unit,PStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.pp
+Archive=pascalhello.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir1]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE2]
+Type=install
+Source=%{src}/main.pp
+Dest=%{dest}/src/%{APPNAMELC}.pp
+
+[MSG]
+Type=message
+Comment=A simple 'hello world' program in Pascal was created in %{dest}
+Comment[ca]=Un simple programa de 'hello world' en Pascal ha estat creat en %{dest}
+Comment[da]=Et simpelt 'goddag verden' program i Pascal blev oprettet i %{dest}
+Comment[de]=Ein einfaches "Hello world"-Programm in Pascal wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό Ï€ÏόγÏαμμα 'Γεια σου κόσμε' σε Pascal δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo programa «Hola mundo» en Pascal ha sido creado en %{dest}
+Comment[et]=Lihtne "Tere, maailm" programm Pascalis loodi asukohta %{dest}
+Comment[eu]=Pascal-en idatzitako "Kaixo mundua" programa sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک برنامۀ سادۀ «hello world» در پاسکال در %{dest} ایجاد شد
+Comment[fr]=Un programme « Bonjour monde » simple en Pascal a été créé dans %{dest}
+Comment[gl]=Creouse un programa sinxelo en Pascal 'ola mundo' en %{dest}
+Comment[hu]=Létrejött egy egyszerű Hello world Pascal-program itt: %{dest}
+Comment[it]=È stato creato un semplice programma Pascal di "hello world" in %{dest}
+Comment[ja]=Pascal ã§æ›¸ã‹ã‚ŒãŸç°¡å˜ãª hello world プログラムを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach "Moin Welt"-Programm in Pascal opstellt
+Comment[ne]=पासà¥à¤•à¤²à¤®à¤¾ साधारण 'हेलà¥à¤²à¥‹ वोलà¥à¤¡' कारà¥à¤¯à¤•à¥à¤°à¤® %{dest} सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig Hello World-programma geschreven in Pascal is aangemaakt in %{dest}
+Comment[pl]=Prosty program "Witaj świecie" w Pascalu został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples 'olá mundo' em Pascal em %{dest}
+Comment[pt_BR]=Foi criado um programa simples 'olá mundo' em Pascal em %{dest}
+Comment[ru]=ПроÑтое приложение 'hello world' на Pascal Ñоздано в %{dest}
+Comment[sk]=Jednoduchý Ahoj svet program v Pascal bol vytvorený v %{dest}
+Comment[sr]=ЈедноÑтаван „Здраво Ñвете“ програм у Pascal-у направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan „Zdravo svete“ program u Pascal-u napravljen je u %{dest}
+Comment[sv]=Ett enkelt 'Hello world'-program i Pascal skapades i %{dest}
+Comment[tr]=Pascal'da basit bir "Merhaba Dünya" uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简å•çš„“Hello worldâ€ç¨‹åº
+Comment[zh_TW]=一個簡單的 Pascal Hello world 程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/pascal/app_templates/pascalhello/pascalhello.png b/languages/pascal/app_templates/pascalhello/pascalhello.png
new file mode 100644
index 00000000..888d4f13
--- /dev/null
+++ b/languages/pascal/app_templates/pascalhello/pascalhello.png
Binary files differ
diff --git a/languages/pascal/backgroundparser.cpp b/languages/pascal/backgroundparser.cpp
new file mode 100644
index 00000000..a61c9774
--- /dev/null
+++ b/languages/pascal/backgroundparser.cpp
@@ -0,0 +1,95 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include <sstream>
+
+#include "backgroundparser.h"
+#include "problemreporter.h"
+#include "PascalLexer.hpp"
+#include "PascalParser.hpp"
+#include "PascalAST.hpp"
+#include <kdebug.h>
+#include <qfile.h>
+#include <antlr/ASTFactory.hpp>
+
+BackgroundParser::BackgroundParser( ProblemReporter* reporter,
+ const QString& source,
+ const QString& filename )
+ : m_reporter( reporter ),
+ m_source( source.unicode(), source.length() ),
+ m_fileName( filename )
+{
+}
+
+BackgroundParser::~BackgroundParser()
+{
+}
+
+void BackgroundParser::run()
+{
+ kdDebug() << "11" << endl;
+
+ QCString _fn = QFile::encodeName(m_fileName);
+ std::string fn( _fn.data() );
+
+ QCString text = m_source.utf8();
+ std::istringstream stream( text.data() );
+
+ kdDebug() << "12" << endl;
+
+ PascalLexer lexer( stream );
+ lexer.setFilename( fn );
+ lexer.setProblemReporter( m_reporter );
+
+ kdDebug() << "13" << endl;
+
+ PascalParser parser( lexer );
+ parser.setFilename( fn );
+ parser.setProblemReporter( m_reporter );
+
+ antlr::ASTFactory my_factory( "PascalAST", PascalAST::factory );
+ parser.initializeASTFactory(my_factory);
+ parser.setASTFactory( &my_factory );
+
+ kdDebug() << "14" << endl;
+
+ try{
+
+ kdDebug() << "15" << endl;
+
+ lexer.resetErrors();
+ parser.resetErrors();
+
+ kdDebug() << "16" << endl;
+
+ parser.compilationUnit();
+
+ kdDebug() << "17" << endl;
+
+ int errors = lexer.numberOfErrors() + parser.numberOfErrors();
+
+ kdDebug() << "18" << endl;
+ } catch( antlr::ANTLRException& ex ){
+
+ kdDebug() << "19" << endl;
+
+ kdDebug() << "*exception*: " << ex.toString().c_str() << endl;
+ m_reporter->reportError( ex.getMessage().c_str(),
+ m_fileName,
+ lexer.getLine(),
+ lexer.getColumn() );
+ }
+
+ kdDebug(9013) << "FINISHED!!" << endl;
+}
+
+
+
diff --git a/languages/pascal/backgroundparser.h b/languages/pascal/backgroundparser.h
new file mode 100644
index 00000000..7118c7f2
--- /dev/null
+++ b/languages/pascal/backgroundparser.h
@@ -0,0 +1,35 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Roberto Raggi *
+ * roberto@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef BACKGROUNDPARSER_H
+#define BACKGROUNDPARSER_H
+
+#include <qthread.h>
+#include <qstring.h>
+
+class ProblemReporter;
+
+class BackgroundParser: public QThread{
+public:
+ BackgroundParser( ProblemReporter* reporter,
+ const QString& source,
+ const QString& filename );
+ virtual ~BackgroundParser();
+
+ virtual void run();
+
+private:
+ ProblemReporter* m_reporter;
+ QString m_source;
+ QString m_fileName;
+};
+
+#endif
diff --git a/languages/pascal/compiler/Makefile.am b/languages/pascal/compiler/Makefile.am
new file mode 100644
index 00000000..c9f7528b
--- /dev/null
+++ b/languages/pascal/compiler/Makefile.am
@@ -0,0 +1,6 @@
+# This is the collection of plugins. In contrast to the parts
+# directory, these are 'transient' in a sense and don't
+# share the complete KDevComponent interface.
+
+SUBDIRS = dccoptions fpcoptions
+
diff --git a/languages/pascal/compiler/dccoptions/Makefile.am b/languages/pascal/compiler/dccoptions/Makefile.am
new file mode 100644
index 00000000..61dd304c
--- /dev/null
+++ b/languages/pascal/compiler/dccoptions/Makefile.am
@@ -0,0 +1,16 @@
+# Here resides the gcc option dialog plugin.
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/extras \
+ -I$(top_srcdir)/lib/widgets $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevdccoptions.la
+libkdevdccoptions_la_LDFLAGS = -module $(all_libraries) $(KDE_PLUGIN)
+libkdevdccoptions_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/lib/widgets/libkdevwidgets.la $(top_builddir)/lib/interfaces/extras/libkdevextras.la $(LIB_KHTML)
+
+libkdevdccoptions_la_SOURCES = dccoptionsplugin.cpp optiontabs.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevdccoptions.desktop
diff --git a/languages/pascal/compiler/dccoptions/dccoptionsplugin.cpp b/languages/pascal/compiler/dccoptions/dccoptionsplugin.cpp
new file mode 100644
index 00000000..a65ca9d6
--- /dev/null
+++ b/languages/pascal/compiler/dccoptions/dccoptionsplugin.cpp
@@ -0,0 +1,114 @@
+/***************************************************************************
+ * Copyright (C) 2003 Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include <qvbox.h>
+#include <qdialog.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+
+#include "dccoptionsplugin.h"
+
+#include "optiontabs.h"
+
+K_EXPORT_COMPONENT_FACTORY( libkdevdccoptions, KGenericFactory<DccOptionsPlugin>( "kdevdccoptions" ) )
+
+DccOptionsPlugin::DccOptionsPlugin(QObject *parent, const char *name, const QStringList/* &args*/)
+ : KDevCompilerOptions(parent, name)
+{
+}
+
+DccOptionsPlugin::~DccOptionsPlugin()
+{
+}
+
+QString DccOptionsPlugin::exec(QWidget *parent, const QString &flags)
+{
+ DccOptionsDialog *dlg = new DccOptionsDialog(parent, "dcc options dialog");
+ QString newFlags = flags;
+ dlg->setFlags(flags);
+ if(dlg->exec() == QDialog::Accepted)
+ newFlags = dlg->flags();
+ delete dlg;
+ return newFlags;
+}
+
+
+DccOptionsDialog::DccOptionsDialog( QWidget * parent, const char * name )
+ : KDialogBase(Tabbed, i18n("Delphi Compiler Options"), Ok|Cancel, Ok, parent, name, true)
+{
+ QVBox *vbox;
+
+ vbox = addVBoxPage(i18n("General"));
+ general = new GeneralTab(vbox, "general tab");
+
+ vbox = addVBoxPage(i18n("Locations I"));
+ locations = new LocationsTab(vbox, "locations tab");
+
+ vbox = addVBoxPage(i18n("Locations II"));
+ locations2 = new Locations2Tab(vbox, "locations2 tab");
+
+ vbox = addVBoxPage(i18n("Code Generation"));
+ codegen = new CodegenTab(vbox, "codegen tab");
+
+ vbox = addVBoxPage(i18n("Debug && Optimization"));
+ debug_optim = new DebugOptimTab(vbox, "debug and optim tab");
+
+ vbox = addVBoxPage(i18n("Linker"));
+ linker = new LinkerTab(vbox, "linker tab");
+}
+
+DccOptionsDialog::~DccOptionsDialog( )
+{
+}
+
+void DccOptionsDialog::setFlags( const QString & flags )
+{
+ QStringList flaglist = QStringList::split(" ", flags);
+
+ general->readFlags(&flaglist);
+ codegen->readFlags(&flaglist);
+ debug_optim->readFlags(&flaglist);
+ locations->readFlags(&flaglist);
+ locations2->readFlags(&flaglist);
+ linker->readFlags(&flaglist);
+
+ unrecognizedFlags = flaglist;
+}
+
+QString DccOptionsDialog::flags( ) const
+{
+ QStringList flaglist;
+
+ general->writeFlags(&flaglist);
+ locations->writeFlags(&flaglist);
+ locations2->writeFlags(&flaglist);
+ codegen->writeFlags(&flaglist);
+ debug_optim->writeFlags(&flaglist);
+ linker->writeFlags(&flaglist);
+
+ QString flags;
+ QStringList::ConstIterator li;
+ for (li = flaglist.begin(); li != flaglist.end(); ++li) {
+ flags += (*li);
+ flags += " ";
+ }
+
+ for (li = unrecognizedFlags.begin(); li != unrecognizedFlags.end(); ++li) {
+ flags += (*li);
+ flags += " ";
+ }
+
+ flags.truncate(flags.length()-1);
+ return flags;
+}
+
+#include "dccoptionsplugin.moc"
diff --git a/languages/pascal/compiler/dccoptions/dccoptionsplugin.h b/languages/pascal/compiler/dccoptions/dccoptionsplugin.h
new file mode 100644
index 00000000..35f34532
--- /dev/null
+++ b/languages/pascal/compiler/dccoptions/dccoptionsplugin.h
@@ -0,0 +1,56 @@
+/***************************************************************************
+ * Copyright (C) 2003 Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef DCCOPTIONSPLUGIN_H
+#define DCCOPTIONSPLUGIN_H
+
+#include <kdialogbase.h>
+
+#include "kdevcompileroptions.h"
+
+class DccOptionsPlugin : public KDevCompilerOptions
+{
+ Q_OBJECT
+
+public:
+ DccOptionsPlugin( QObject *parent, const char *name, const QStringList/* &args */);
+ ~DccOptionsPlugin();
+
+ virtual QString exec(QWidget *parent, const QString &flags);
+};
+
+class GeneralTab;
+class LinkerTab;
+class LocationsTab;
+class Locations2Tab;
+class CodegenTab;
+class DebugOptimTab;
+
+class DccOptionsDialog : public KDialogBase
+{
+public:
+ DccOptionsDialog( QWidget *parent=0, const char *name=0 );
+ ~DccOptionsDialog();
+
+ void setFlags(const QString &flags);
+ QString flags() const;
+
+private:
+ GeneralTab *general;
+ LinkerTab *linker;
+ LocationsTab *locations;
+ Locations2Tab *locations2;
+ CodegenTab *codegen;
+ DebugOptimTab *debug_optim;
+ QStringList unrecognizedFlags;
+};
+
+
+#endif
diff --git a/languages/pascal/compiler/dccoptions/kdevdccoptions.desktop b/languages/pascal/compiler/dccoptions/kdevdccoptions.desktop
new file mode 100644
index 00000000..8a577bb7
--- /dev/null
+++ b/languages/pascal/compiler/dccoptions/kdevdccoptions.desktop
@@ -0,0 +1,54 @@
+[Desktop Entry]
+Type=Service
+Exec=dcc
+Comment=Borland Delphi Compiler
+Comment[br]=Dastumer Delphi Borland
+Comment[ca]=Compilador Delphi de Borland
+Comment[da]=Borland Delphi oversætter
+Comment[el]=Μεταγλωττιστής Borland Delphi
+Comment[es]=Compilador de Delphi de Borland
+Comment[et]=Borland Delphi kompilaator
+Comment[eu]=Borland Delphi konpiladorea
+Comment[fa]=مترجم برلند دلÙÛŒ
+Comment[fr]=Compilateur Delphi de Borland
+Comment[ga]=Tiomsaitheoir Borland Delphi
+Comment[gl]=Compilador Borland Delphi
+Comment[hi]=बोरलैंड डेलà¥à¤«à¤¼à¥€ कमà¥à¤ªà¤¾à¤¯à¤²à¤°
+Comment[hu]=Borland Delphi fordítóprogram
+Comment[is]=Borland Delphi þýðandi
+Comment[it]=Compilatore per Borland Delphi
+Comment[ja]=Borland Delphi コンパイラ
+Comment[nds]=Borland Delphi-Kompilerer
+Comment[ne]=बोरलà¥à¤¯à¤¾à¤¨à¥à¤¡ डेलà¥à¤ªà¥€ कमà¥à¤ªà¤¾à¤‡à¤²à¤°
+Comment[nl]=Borland Delphi-compiler
+Comment[pl]=Kompilator Borland Delphi
+Comment[pt]=Compilador de Borland Delphi
+Comment[pt_BR]=Compilador Delphi da Borland Delphi
+Comment[ru]=КомпилÑтор Borland Delphi
+Comment[sk]=Borland Delphi kompilátor
+Comment[sl]=Prevajalnik za Borland Delphi
+Comment[sr]=Borland-ов преводилац Delphi-ја
+Comment[sr@Latn]=Borland-ov prevodilac Delphi-ja
+Comment[sv]=Borland Delphi kompilator
+Comment[ta]=பொரà¯à®²à®¾à®©à¯à®Ÿà¯ டெலà¯à®ªà®¿ தொகà¯à®ªà¯à®ªà®¿
+Comment[tg]=Талфифгари Borland Delphi
+Comment[tr]=Borland Delphi Derleyicisi
+Comment[zh_CN]=Borland Delphi 编译器
+Comment[zh_TW]=Borland Delphi 編譯器
+Name=DccOptions
+Name[da]=Delphi oversætter indstillinger
+Name[de]=Delphi-Einstellungen (KDevelop)
+Name[hi]=डीसीसी-विकलà¥à¤ª
+Name[nds]=Delphi-Optschonen (KDevelop)
+Name[pl]=Opcje Dcc
+Name[sk]=Dcc možnosti
+Name[sl]=Možnosti Dcc
+Name[sv]=Alternativ för dcc
+Name[ta]=Dccவிரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯
+Name[tg]=DccИнтихобҳо
+Name[zh_TW]=Dcc é¸é …
+ServiceTypes=KDevelop/CompilerOptions
+X-KDE-Library=libkdevdccoptions
+X-KDevelop-Version=5
+X-KDevelop-Language=Pascal
+X-KDevelop-Args=dcc
diff --git a/languages/pascal/compiler/dccoptions/optiontabs.cpp b/languages/pascal/compiler/dccoptions/optiontabs.cpp
new file mode 100644
index 00000000..97622606
--- /dev/null
+++ b/languages/pascal/compiler/dccoptions/optiontabs.cpp
@@ -0,0 +1,399 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ ***************************************************************************/
+#include <kdialog.h>
+#include <klocale.h>
+
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qvbuttongroup.h>
+#include <qapplication.h>
+#include <qpushbutton.h>
+
+#include "flagboxes.h"
+
+#include "optiontabs.h"
+
+LinkerTab::LinkerTab( QWidget * parent, const char * name )
+ : QWidget(parent, name), radioController(new FlagRadioButtonController()),
+ pathController(new FlagPathEditController()),
+ editController(new FlagEditController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ QVButtonGroup *map_group = new QVButtonGroup(i18n("Map File"), this);
+ QRadioButton *m_defaultMap = new QRadioButton(i18n("Off"), map_group);
+ m_defaultMap->setChecked(true);
+ new FlagRadioButton(map_group, radioController,
+ "-GS", i18n("Segments"));
+ new FlagRadioButton(map_group, radioController,
+ "-GP", i18n("Publics"));
+ new FlagRadioButton(map_group, radioController,
+ "-GD", i18n("Detailed"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ new FlagPathEdit(this, "", pathController,
+ "--dynamicloader=", i18n("Default dynamic loader:"), KFile::File);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ new FlagSpinEdit(this, 0, 2147483647, 1024, 1048576, editController,
+ "-$M", i18n("Reserved address space:"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ layout->addStretch();
+}
+
+LinkerTab::~LinkerTab( )
+{
+ delete radioController;
+ delete pathController;
+ delete editController;
+}
+
+void LinkerTab::readFlags( QStringList * str )
+{
+ pathController->readFlags(str);
+ radioController->readFlags(str);
+ editController->readFlags(str);
+}
+
+void LinkerTab::writeFlags( QStringList * str )
+{
+ pathController->writeFlags(str);
+ radioController->writeFlags(str);
+ editController->writeFlags(str);
+}
+
+
+
+LocationsTab::LocationsTab( QWidget * parent, const char * name )
+ :QWidget(parent, name), pathController(new FlagPathEditController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ new FlagPathEdit(this, ":", pathController,
+ "-I", i18n("Include search path (delimited by \":\"):"));
+ new FlagPathEdit(this, ":", pathController,
+ "-R", i18n("Resource search path (delimited by \":\"):"));
+ new FlagPathEdit(this, ":", pathController,
+ "-U", i18n("Unit search path (delimited by \":\"):"));
+ new FlagPathEdit(this, ":", pathController,
+ "-O", i18n("Object search path (delimited by \":\"):"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addStretch();
+}
+
+LocationsTab::~LocationsTab( )
+{
+ delete pathController;
+}
+
+void LocationsTab::readFlags( QStringList * str )
+{
+ pathController->readFlags(str);
+}
+
+void LocationsTab::writeFlags( QStringList * str )
+{
+ pathController->writeFlags(str);
+}
+
+
+
+Locations2Tab::Locations2Tab( QWidget * parent, const char * name )
+ :QWidget(parent, name), pathController(new FlagPathEditController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ new FlagPathEdit(this, "", pathController,
+ "-E", i18n("Executable output directory:"));
+ new FlagPathEdit(this, "", pathController,
+ "-N", i18n("Unit output directory:"));
+ new FlagPathEdit(this, "", pathController,
+ "-LE", i18n("Package directory:"));
+ new FlagPathEdit(this, "", pathController,
+ "-LN", i18n("Package source code directory:"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addStretch();
+}
+
+Locations2Tab::~Locations2Tab( )
+{
+ delete pathController;
+}
+
+void Locations2Tab::readFlags( QStringList * str )
+{
+ pathController->readFlags(str);
+}
+
+void Locations2Tab::writeFlags( QStringList * str )
+{
+ pathController->writeFlags(str);
+}
+
+
+
+GeneralTab::GeneralTab( QWidget * parent, const char * name )
+ :QWidget(parent, name), controller(new FlagCheckBoxController()),
+ editController(new FlagEditController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ QVButtonGroup *build_group = new QVButtonGroup(i18n("Build"), this);
+ new FlagCheckBox(build_group, controller,
+ "-B", i18n("Build all units"));
+ new FlagCheckBox(build_group, controller,
+ "-M", i18n("Make modified units"));
+ new FlagCheckBox(build_group, controller,
+ "-Q", i18n("Quiet compile"));
+ new FlagCheckBox(build_group, controller,
+ "-Z", i18n("Disable implicit package compilation"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addSpacing(10);
+
+ new FlagListEdit(this, ":", editController, "-D", i18n("Conditional defines (delimited by \":\"):"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ new FlagListEdit(this, ":", editController, "-A", i18n("Unit aliases in form unit=alias (delimited by \":\"):"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addSpacing(10);
+
+ QVButtonGroup *message_group = new QVButtonGroup(i18n("Messages"), this);
+ new FlagCheckBox(message_group, controller,
+ "-H", i18n("Output hint messages"));
+ new FlagCheckBox(message_group, controller,
+ "-W", i18n("Output warning messages"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addSpacing(10);
+ QVButtonGroup *package_group = new QVButtonGroup(i18n("Packages"), this);
+ new FlagListEdit(package_group, ":", editController, "-LU", i18n("Build with packages (delimited by \":\"):"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addStretch();
+}
+
+GeneralTab::~GeneralTab( )
+{
+ delete controller;
+ delete editController;
+}
+
+void GeneralTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ editController->readFlags(str);
+}
+
+void GeneralTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ editController->writeFlags(str);
+}
+
+
+
+CodegenTab::CodegenTab( QWidget * parent, const char * name )
+ :QWidget(parent, name), controller(new FlagCheckBoxController()),
+ listController(new FlagEditController()),
+ radioController(new FlagRadioButtonController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+// layout->setAutoAdd(true);
+
+ QGridLayout *layout2 = new QGridLayout(layout, 2, 2, KDialog::spacingHint());
+
+ QVButtonGroup *align_group = new QVButtonGroup(i18n("Code Alignment && Stack Frames"), this);
+ QRadioButton *align_def = new QRadioButton(i18n("Default (-$A8)"), align_group);
+ align_def->setChecked(true);
+ new FlagRadioButton(align_group, radioController,
+ "'-$A1'", i18n("Never align"));
+ new FlagRadioButton(align_group, radioController,
+ "'-$A2'", i18n("On word boundaries"));
+ new FlagRadioButton(align_group, radioController,
+ "'-$A4'", i18n("On double word boundaries"));
+ new FlagRadioButton(align_group, radioController,
+ "'-$A8'", i18n("On quad word boundaries"));
+ new FlagCheckBox(align_group, controller,
+ "'-$W+'", i18n("Generate stack frames"), "'-$W-'");
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout2->addWidget(align_group, 0, 0);
+
+ QVButtonGroup *enum_group = new QVButtonGroup(i18n("Enumeration Size"), this);
+ QRadioButton *enum_def = new QRadioButton(i18n("Default (-$Z1)"), enum_group);
+ enum_def->setChecked(true);
+ new FlagRadioButton(enum_group, radioController,
+ "'-$Z1'", i18n("Unsigned byte (256 values)"));
+ new FlagRadioButton(enum_group, radioController,
+ "'-$Z2'", i18n("Unsigned word (64K values)"));
+ new FlagRadioButton(enum_group, radioController,
+ "'-$Z4'", i18n("Unsigned double word (4096M values)"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout2->addWidget(enum_group, 0, 1);
+
+ QVButtonGroup *compile_group = new QVButtonGroup(i18n("Compile Time Checks"), this);
+ new FlagCheckBox(compile_group, controller,
+ "'-$C+'", i18n("Assertions"), "'-$C-'", "'-$C+'");
+ new FlagCheckBox(compile_group, controller,
+ "'-$B+'", i18n("Complete boolean evaluation"), "'-$B-'");
+ new FlagCheckBox(compile_group, controller,
+ "'-$X+'", i18n("Extended syntax"), "'-$X-'", "'-$X+'");
+ new FlagCheckBox(compile_group, controller,
+ "'-$H+'", i18n("Long strings"), "'-$H-'", "'-$H+'");
+ new FlagCheckBox(compile_group, controller,
+ "'-$P+'", i18n("Open string parameters"), "'-$P-'", "'-$P+'");
+ new FlagCheckBox(compile_group, controller,
+ "'-$T+'", i18n("Type-checked pointers"), "'-$T-'");
+ new FlagCheckBox(compile_group, controller,
+ "'-$V+'", i18n("Var-string checking"), "'-$V-'", "'-$V+'");
+ new FlagCheckBox(compile_group, controller,
+ "'-$J+'", i18n("Writable typed constants"), "'-$J-'");
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout2->addWidget(compile_group, 1, 0);
+
+ QVButtonGroup *run_group = new QVButtonGroup(i18n("Run Time Checks"), this);
+ new FlagCheckBox(run_group, controller,
+ "'-$M+'", i18n("Runtime type information"), "'-$M-'");
+ new FlagCheckBox(run_group, controller,
+ "'-$G+'", i18n("Imported data references"), "'-$G-'", "'-$G+'");
+ new FlagCheckBox(run_group, controller,
+ "'-$I+'", i18n("Input/Output checking"), "'-$I-'", "'-$I+'");
+ new FlagCheckBox(run_group, controller,
+ "'-$Q+'", i18n("Overflow checking"), "'-$Q-'");
+ new FlagCheckBox(run_group, controller,
+ "'-$R+'", i18n("Range checking"), "'-$R-'");
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout2->addWidget(run_group, 1, 1);
+
+ layout->addStretch();
+}
+
+CodegenTab::~CodegenTab( )
+{
+ delete controller;
+ delete listController;
+ delete radioController;
+}
+
+void CodegenTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ listController->readFlags(str);
+ radioController->readFlags(str);
+}
+
+void CodegenTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ listController->writeFlags(str);
+ radioController->writeFlags(str);
+}
+
+
+
+DebugOptimTab::DebugOptimTab( QWidget * parent, const char * name )
+ : QWidget(parent, name), controller(new FlagCheckBoxController()),
+ radioController(new FlagRadioButtonController)
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+// layout->setAutoAdd(true);
+
+ QVButtonGroup *optim_group = new QVButtonGroup(i18n("Optimization"), this);
+ new FlagCheckBox(optim_group, controller,
+ "'-$O+'", i18n("Enable optimizations"), "'-$O-'", "'-$O+'");
+ layout->addWidget(optim_group);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ QBoxLayout *layout2 = new QHBoxLayout(layout, KDialog::spacingHint());
+
+ QVButtonGroup *debug_group = new QVButtonGroup(i18n("Debugging"), this);
+ new FlagCheckBox(debug_group, controller,
+ "'-$D+'", i18n("Debug information"), "'-$D-'", "'-$D+'");
+ new FlagCheckBox(debug_group, controller,
+ "'-$L+'", i18n("Local symbol information"), "'-$L-'", "'-$L+'");
+ gdb = new FlagCheckBox(debug_group, controller,
+ "-V", i18n("Debug information for GDB"));
+ namespacedb = new FlagCheckBox(debug_group, controller,
+ "-VN", i18n("Namespace debug info"));
+ symboldb = new FlagCheckBox(debug_group, controller,
+ "-VR", i18n("Write symbol info in an .rsm file"));
+ layout2->addWidget(debug_group);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ QVButtonGroup *debug_add = new QVButtonGroup(i18n("Symbol Reference Information"), this);
+ QRadioButton *m_default = new QRadioButton(i18n("Default (-$YD)"), debug_add);
+ m_default->setChecked(true);
+ new FlagRadioButton(debug_add, radioController,
+ "'-$Y-'", i18n("No information"));
+ new FlagRadioButton(debug_add, radioController,
+ "'-$YD'", i18n("Definition information"));
+ new FlagRadioButton(debug_add, radioController,
+ "'-$Y+'", i18n("Full reference information"));
+ layout2->addWidget(debug_add);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ QHBoxLayout *layout3 = new QHBoxLayout(layout, KDialog::spacingHint());
+ QPushButton *release = new QPushButton(i18n("Release"), this);
+ QPushButton *debug = new QPushButton(i18n("Debug"), this);
+ layout3->addWidget(release);
+ layout3->addWidget(debug);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ connect(release, SIGNAL(clicked()), this, SLOT(setReleaseOptions()));
+ connect(debug, SIGNAL(clicked()), this, SLOT(setDebugOptions()));
+
+ layout->addStretch();
+}
+
+ DebugOptimTab::~ DebugOptimTab( )
+{
+ delete controller;
+ delete radioController;
+}
+
+void DebugOptimTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ radioController->readFlags(str);
+}
+
+void DebugOptimTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ radioController->writeFlags(str);
+}
+
+void DebugOptimTab::setReleaseOptions()
+{
+ QStringList sl = QStringList::split(",", "'-$O+','-$Y-','-$D-','-$L-'");
+ readFlags(&sl);
+ gdb->setChecked(false);
+ namespacedb->setChecked(false);
+ symboldb->setChecked(false);
+}
+
+void DebugOptimTab::setDebugOptions()
+{
+ QStringList sl = QStringList::split(",", "'-$O-','-$Y+','-$D+','-$L+',-V,-VN");
+ readFlags(&sl);
+}
+
+#include "optiontabs.moc"
diff --git a/languages/pascal/compiler/dccoptions/optiontabs.h b/languages/pascal/compiler/dccoptions/optiontabs.h
new file mode 100644
index 00000000..048684a5
--- /dev/null
+++ b/languages/pascal/compiler/dccoptions/optiontabs.h
@@ -0,0 +1,116 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifndef OPTIONTABS_H
+#define OPTIONTABS_H
+
+#include <qwidget.h>
+
+class FlagRadioButtonController;
+class FlagPathEditController;
+class FlagCheckBoxController;
+class FlagEditController;
+class QRadioButton;
+class FlagRadioButton;
+class FlagCheckBox;
+
+class LinkerTab : public QWidget
+{
+public:
+ LinkerTab( QWidget *parent=0, const char *name=0 );
+ ~LinkerTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagRadioButtonController *radioController;
+ FlagPathEditController *pathController;
+ FlagEditController *editController;
+};
+
+class LocationsTab : public QWidget
+{
+public:
+ LocationsTab( QWidget *parent=0, const char *name=0 );
+ ~LocationsTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagPathEditController *pathController;
+};
+
+class Locations2Tab : public QWidget
+{
+public:
+ Locations2Tab( QWidget *parent=0, const char *name=0 );
+ ~Locations2Tab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagPathEditController *pathController;
+};
+
+class GeneralTab: public QWidget
+{
+public:
+ GeneralTab( QWidget *parent=0, const char *name=0 );
+ ~GeneralTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagEditController *editController;
+};
+
+class CodegenTab : public QWidget
+{
+public:
+ CodegenTab( QWidget *parent=0, const char *name=0 );
+ ~CodegenTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagEditController *listController;
+ FlagRadioButtonController *radioController;
+};
+
+class DebugOptimTab : public QWidget
+{
+ Q_OBJECT
+public:
+ DebugOptimTab( QWidget *parent=0, const char *name=0 );
+ ~DebugOptimTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagRadioButtonController *radioController;
+
+ FlagCheckBox *gdb;
+ FlagCheckBox *namespacedb;
+ FlagCheckBox *symboldb;
+
+private slots:
+ void setReleaseOptions();
+ void setDebugOptions();
+};
+
+#endif
diff --git a/languages/pascal/compiler/fpcoptions/Makefile.am b/languages/pascal/compiler/fpcoptions/Makefile.am
new file mode 100644
index 00000000..2868bd01
--- /dev/null
+++ b/languages/pascal/compiler/fpcoptions/Makefile.am
@@ -0,0 +1,20 @@
+# Here resides the gcc option dialog plugin.
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/extras \
+ -I$(top_srcdir)/lib/widgets $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevfpcoptions.la
+libkdevfpcoptions_la_LDFLAGS = -module $(all_libraries) $(KDE_PLUGIN)
+libkdevfpcoptions_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/lib/widgets/libkdevwidgets.la $(top_builddir)/lib/interfaces/extras/libkdevextras.la $(LIB_KHTML)
+
+libkdevfpcoptions_la_SOURCES = fpcoptionsplugin.cpp optiontabs.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevfpcoptions.desktop
+
+
+
+
diff --git a/languages/pascal/compiler/fpcoptions/fpcoptionsplugin.cpp b/languages/pascal/compiler/fpcoptions/fpcoptionsplugin.cpp
new file mode 100644
index 00000000..6fd73e5f
--- /dev/null
+++ b/languages/pascal/compiler/fpcoptions/fpcoptionsplugin.cpp
@@ -0,0 +1,126 @@
+/***************************************************************************
+ * Copyright (C) 2003 Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include <qvbox.h>
+
+#include <klocale.h>
+#include <kgenericfactory.h>
+
+#include "optiontabs.h"
+#include "fpcoptionsplugin.h"
+
+K_EXPORT_COMPONENT_FACTORY( libkdevfpcoptions, KGenericFactory<FpcOptionsPlugin>( "kdevfpcoptions" ) )
+
+FpcOptionsPlugin::FpcOptionsPlugin(QObject *parent, const char *name, const QStringList& /*args*/)
+ : KDevCompilerOptions(parent, name)
+{
+}
+
+FpcOptionsPlugin::~FpcOptionsPlugin()
+{
+}
+
+QString FpcOptionsPlugin::exec(QWidget *parent, const QString &flags)
+{
+ FpcOptionsDialog *dlg = new FpcOptionsDialog(parent, "fpc options dialog");
+ QString newFlags = flags;
+ dlg->setFlags(flags);
+ if (dlg->exec() == QDialog::Accepted)
+ newFlags = dlg->flags();
+ delete dlg;
+ return newFlags;
+}
+
+
+
+FpcOptionsDialog::FpcOptionsDialog( QWidget *parent, const char *name )
+ : KDialogBase(Tabbed, i18n("Free Pascal Compiler Options"), Ok|Cancel, Ok, parent, name, true)
+{
+ QVBox *vbox;
+
+ vbox = addVBoxPage(i18n("Language"));
+ language = new LanguageTab(vbox, "language tab");
+
+ vbox = addVBoxPage(i18n("Locations I"));
+ directories = new FilesAndDirectoriesTab(vbox, "directories tab");
+
+ vbox = addVBoxPage(i18n("Locations II"));
+ directories2 = new FilesAndDirectoriesTab2(vbox, "directories2 tab");
+
+ vbox = addVBoxPage(i18n("Debug && Optimization"));
+ debug_optim = new DebugOptimTab(vbox, "debug_optim tab");
+
+ vbox = addVBoxPage(i18n("Code Generation"));
+ codegen = new CodegenTab(vbox, "codegen tab");
+
+ vbox = addVBoxPage(i18n("Assembler"));
+ assembler = new AssemblerTab(vbox, "assembler tab");
+
+ vbox = addVBoxPage(i18n("Linker"));
+ linker = new LinkerTab(vbox, "linker tab");
+
+ vbox = addVBoxPage(i18n("Feedback"));
+ feedback = new FeedbackTab(vbox, "feedback tab");
+
+ vbox = addVBoxPage(i18n("Miscellaneous"));
+ misc = new MiscTab(vbox, "miscellaneous tab");
+}
+
+FpcOptionsDialog::~FpcOptionsDialog()
+{
+}
+
+void FpcOptionsDialog::setFlags(const QString &flags)
+{
+ QStringList flaglist = QStringList::split(" ", flags);
+
+ feedback->readFlags(&flaglist);
+ language->readFlags(&flaglist);
+ assembler->readFlags(&flaglist);
+ linker->readFlags(&flaglist);
+ codegen->readFlags(&flaglist);
+ debug_optim->readFlags(&flaglist);
+ directories->readFlags(&flaglist);
+ directories2->readFlags(&flaglist);
+ misc->readFlags(&flaglist);
+ unrecognizedFlags = flaglist;
+}
+
+QString FpcOptionsDialog::flags() const
+{
+ QStringList flaglist;
+
+ language->writeFlags(&flaglist);
+ directories->writeFlags(&flaglist);
+ directories2->writeFlags(&flaglist);
+ debug_optim->writeFlags(&flaglist);
+ codegen->writeFlags(&flaglist);
+ assembler->writeFlags(&flaglist);
+ linker->writeFlags(&flaglist);
+ feedback->writeFlags(&flaglist);
+ misc->writeFlags(&flaglist);
+
+ QString flags;
+ QStringList::ConstIterator li;
+ for (li = flaglist.begin(); li != flaglist.end(); ++li) {
+ flags += (*li);
+ flags += " ";
+ }
+
+ for (li = unrecognizedFlags.begin(); li != unrecognizedFlags.end(); ++li) {
+ flags += (*li);
+ flags += " ";
+ }
+
+ flags.truncate(flags.length()-1);
+ return flags;
+}
+
+#include "fpcoptionsplugin.moc"
diff --git a/languages/pascal/compiler/fpcoptions/fpcoptionsplugin.h b/languages/pascal/compiler/fpcoptions/fpcoptionsplugin.h
new file mode 100644
index 00000000..f6b15fff
--- /dev/null
+++ b/languages/pascal/compiler/fpcoptions/fpcoptionsplugin.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+ * Copyright (C) 2003 Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef DCCOPTIONSPLUGIN_H
+#define DCCOPTIONSPLUGIN_H
+
+#include <kdialogbase.h>
+
+#include "kdevcompileroptions.h"
+
+class FpcOptionsPlugin : public KDevCompilerOptions
+{
+ Q_OBJECT
+
+public:
+ FpcOptionsPlugin( QObject *parent, const char *name, const QStringList &args );
+ ~FpcOptionsPlugin();
+
+ virtual QString exec(QWidget *parent, const QString &flags);
+};
+
+
+class FeedbackTab;
+class FilesAndDirectoriesTab;
+class LanguageTab;
+class CodegenTab;
+
+class FpcOptionsDialog : public KDialogBase
+{
+public:
+ FpcOptionsDialog( QWidget *parent=0, const char *name=0 );
+ ~FpcOptionsDialog();
+
+ void setFlags(const QString &flags);
+ QString flags() const;
+
+private:
+/* GeneralTab *general;
+ OptimizationTab *optimization;
+ G77Tab *g77;
+ Warnings1Tab *warnings1;
+ Warnings2Tab *warnings2;*/
+
+ FeedbackTab *feedback;
+ FilesAndDirectoriesTab *directories;
+ FilesAndDirectoriesTab2 *directories2;
+ DebugOptimTab *debug_optim;
+ LanguageTab *language;
+ CodegenTab *codegen;
+ AssemblerTab *assembler;
+ LinkerTab *linker;
+ MiscTab *misc;
+ QStringList unrecognizedFlags;
+};
+
+#endif
diff --git a/languages/pascal/compiler/fpcoptions/kdevfpcoptions.desktop b/languages/pascal/compiler/fpcoptions/kdevfpcoptions.desktop
new file mode 100644
index 00000000..246cf08b
--- /dev/null
+++ b/languages/pascal/compiler/fpcoptions/kdevfpcoptions.desktop
@@ -0,0 +1,55 @@
+[Desktop Entry]
+Type=Service
+Exec=fpc
+Comment=Free Pascal Compiler
+Comment[br]=Dastumer Pascal dieub
+Comment[ca]=Compilador Free Pascal
+Comment[da]=Free Pascal oversætter
+Comment[el]=Μεταγλωττιστής Free Pascal
+Comment[es]=Compilador Free Pascal
+Comment[et]=Free Pascal kompilaator
+Comment[eu]=Free Pascal konpiladorea
+Comment[fa]=مترجم آزاد پاسکال
+Comment[fr]=Compilateur Free Pascal
+Comment[ga]=Tiomsaitheoir Saor Pascal
+Comment[gl]=Compilador Free Pascal
+Comment[hi]=फà¥à¤°à¥€ पॉसà¥à¤•à¤² कमà¥à¤ªà¤¾à¤¯à¤²à¤°
+Comment[hu]=Szabad forráskódú Pascal fordítóprogram
+Comment[is]=Frjáls Pascal þýðandi
+Comment[it]=Compilatore per Free Pascal
+Comment[ja]=Free Pascal コンパイラ
+Comment[nds]=Free Pascal-Kompilerer
+Comment[ne]=सà¥à¤µà¤¤à¤¨à¥à¤¤à¥à¤° पासà¥à¤•à¤² कमà¥à¤ªà¤¾à¤‡à¤²à¤°
+Comment[nl]=Free Pascal-compiler
+Comment[pt]=Compilador Free Pascal
+Comment[pt_BR]=Compilador Free Pascal
+Comment[ru]=КомпилÑтор Free Pascal
+Comment[sk]=Voľný Pascal kompilátor
+Comment[sl]=Prevajalnik za Free Pascal
+Comment[sr]=Слободни преводилац Pascal-а
+Comment[sr@Latn]=Slobodni prevodilac Pascal-a
+Comment[sv]=Fri Pascal-kompilator
+Comment[ta]=இலவச பாஸà¯à®•à®²à¯ தொகà¯à®ªà¯à®ªà®¿
+Comment[tg]=Талфифгари Free Pascal
+Comment[tr]=Serbest Pascal Derleyicisi
+Comment[zh_CN]=Free Pascal 编译器
+Comment[zh_TW]=Free Pascal 編譯器
+Name=FpcOptions
+Name[da]=Free Pascal oversætter indstillinger
+Name[de]=Fpc-Einstellungen (KDevelop)
+Name[hi]=à¤à¤«à¤ªà¥€à¤¸à¥€-विकलà¥à¤ª
+Name[nds]=Fpc-Optschonen (KDevelop)
+Name[pl]=Opcje Fpc
+Name[sk]=Fpc možnosti
+Name[sl]=Možnosti Fpc
+Name[sv]=Alternativ för fpc
+Name[ta]=Fpcவிரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯
+Name[tg]=FpcИнтихобҳо
+Name[zh_TW]=Fpc é¸é …
+ServiceTypes=KDevelop/CompilerOptions
+X-KDE-Library=libkdevfpcoptions
+X-KDevelop-Version=5
+X-KDevelop-Language=Pascal
+X-KDevelop-Args=fpc
+X-KDevelop-Default=true
+
diff --git a/languages/pascal/compiler/fpcoptions/optiontabs.cpp b/languages/pascal/compiler/fpcoptions/optiontabs.cpp
new file mode 100644
index 00000000..2579cb3c
--- /dev/null
+++ b/languages/pascal/compiler/fpcoptions/optiontabs.cpp
@@ -0,0 +1,657 @@
+/***************************************************************************
+ * Copyright (C) 2003 Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include <kdialog.h>
+#include <klocale.h>
+
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qvbuttongroup.h>
+#include <qapplication.h>
+#include <qframe.h>
+#include <qpushbutton.h>
+
+#include "flagboxes.h"
+
+#include "optiontabs.h"
+
+FeedbackTab::FeedbackTab(QWidget *parent, const char *name)
+ : QWidget(parent, name), controller(new FlagCheckBoxController(QStringList::split(",","-v")))
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ QVButtonGroup *output_group = new QVButtonGroup(i18n("Output"), this);
+ new FlagCheckBox(output_group, controller,
+ "-vr", i18n("Format errors like GCC does"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ QVButtonGroup *verbose_group = new QVButtonGroup(i18n("Verbose"), this);
+ new FlagCheckBox(verbose_group, controller,
+ "-va", i18n("Write all possible info"));
+ new FlagCheckBox(verbose_group, controller,
+ "-v0", i18n("Write no messages"));
+ new FlagCheckBox(verbose_group, controller,
+ "-ve", i18n("Show only errors"));
+ new FlagCheckBox(verbose_group, controller,
+ "-vi", i18n("Show some general information"));
+ new FlagCheckBox(verbose_group, controller,
+ "-vw", i18n("Issue warnings"));
+ new FlagCheckBox(verbose_group, controller,
+ "-vn", i18n("Issue notes"));
+ new FlagCheckBox(verbose_group, controller,
+ "-vh", i18n("Issue hints"));
+ new FlagCheckBox(verbose_group, controller,
+ "-vd", i18n("Write other debugging info"));
+
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ QVButtonGroup *other_group = new QVButtonGroup(i18n("Other Information"), this);
+ new FlagCheckBox(other_group, controller,
+ "-vl", i18n("Show line numbers when processing files"));
+ new FlagCheckBox(other_group, controller,
+ "-vu", i18n("Print information on loaded units"));
+ new FlagCheckBox(other_group, controller,
+ "-vt", i18n("Print the names of loaded files"));
+ new FlagCheckBox(other_group, controller,
+ "-vm", i18n("Write which macros are defined"));
+ new FlagCheckBox(other_group, controller,
+ "-vc", i18n("Warn when processing a conditional"));
+ new FlagCheckBox(other_group, controller,
+ "-vp", i18n("Print the names of procedures and functions"));
+ new FlagCheckBox(other_group, controller,
+ "-vb", i18n("Show all procedure declarations if an overloaded function error occurs"));
+
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addStretch();
+}
+
+FeedbackTab::~FeedbackTab()
+{
+ delete controller;
+}
+
+void FeedbackTab::readFlags(QStringList *list)
+{
+ controller->readFlags(list);
+}
+
+void FeedbackTab::writeFlags(QStringList *list)
+{
+ controller->writeFlags(list);
+}
+
+
+
+FilesAndDirectoriesTab::FilesAndDirectoriesTab( QWidget * parent, const char * name )
+ :QWidget(parent, name), controller(new FlagCheckBoxController()),
+ pathController(new FlagPathEditController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ new FlagPathEdit(this, ":", pathController,
+ "-Fu", i18n("Unit search path (delimited by \":\"):"));
+ new FlagPathEdit(this, ":", pathController,
+ "-Fi", i18n("Include file search path (delimited by \":\"):"));
+ new FlagPathEdit(this, ":", pathController,
+ "-Fo", i18n("Object file search path (delimited by \":\"):"));
+ new FlagPathEdit(this, ":", pathController,
+ "-Fl", i18n("Library search path (delimited by \":\"):"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addStretch();
+}
+
+FilesAndDirectoriesTab::~FilesAndDirectoriesTab( )
+{
+ delete controller;
+ delete pathController;
+}
+
+void FilesAndDirectoriesTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ pathController->readFlags(str);
+}
+
+void FilesAndDirectoriesTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ pathController->writeFlags(str);
+}
+
+FilesAndDirectoriesTab2::FilesAndDirectoriesTab2( QWidget * parent, const char * name )
+ :QWidget(parent, name), controller(new FlagCheckBoxController()),
+ pathController(new FlagPathEditController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ new FlagPathEdit(this, "", pathController,
+ "-FE", i18n("Write executables and units in:"));
+ new FlagPathEdit(this, "", pathController,
+ "-FU", i18n("Write units in:"));
+ new FlagPathEdit(this, "", pathController,
+ "-o", i18n("Executable name:"), KFile::File);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(20);
+
+ new FlagPathEdit(this, "", pathController,
+ "-e", i18n("Location of as and ld programs:"));
+ new FlagPathEdit(this, "", pathController,
+ "-FL", i18n("Dynamic linker executable:"), KFile::File);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(20);
+
+ new FlagPathEdit(this, "", pathController,
+ "-Fr", i18n("Compiler messages file:"), KFile::File);
+ new FlagPathEdit(this, "", pathController,
+ "-Fe", i18n("Write compiler messages to file:"), KFile::File);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addStretch();
+}
+
+FilesAndDirectoriesTab2::~FilesAndDirectoriesTab2( )
+{
+ delete controller;
+ delete pathController;
+}
+
+void FilesAndDirectoriesTab2::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ pathController->readFlags(str);
+}
+
+void FilesAndDirectoriesTab2::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ pathController->writeFlags(str);
+}
+
+
+LanguageTab::LanguageTab( QWidget * parent, const char * name )
+ : QWidget(parent, name), controller(new FlagCheckBoxController(QStringList::split(",","-v")))
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ QVButtonGroup *compat_group = new QVButtonGroup(i18n("Pascal Compatibility"), this);
+ new FlagCheckBox(compat_group, controller,
+ "-S2", i18n("Switch on Delphi 2 extensions"));
+ new FlagCheckBox(compat_group, controller,
+ "-Sd", i18n("Strict Delphi compatibility mode"));
+ new FlagCheckBox(compat_group, controller,
+ "-So", i18n("Borland TP 7.0 compatibility mode"));
+ new FlagCheckBox(compat_group, controller,
+ "-Sp", i18n("GNU Pascal compatibility mode"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ QVButtonGroup *ccompat_group = new QVButtonGroup(i18n("C/C++ Compatibility"), this);
+ new FlagCheckBox(ccompat_group, controller,
+ "-Sc", i18n("Support C style operators *=, +=, /=, -="));
+ new FlagCheckBox(ccompat_group, controller,
+ "-Si", i18n("Support C++ style INLINE"));
+ new FlagCheckBox(ccompat_group, controller,
+ "-Sm", i18n("Support C style macros"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ QVButtonGroup *lang_group = new QVButtonGroup(i18n("Language"), this);
+ new FlagCheckBox(lang_group, controller,
+ "-Sg", i18n("Support the label and goto commands"));
+ new FlagCheckBox(lang_group, controller,
+ "-Sh", i18n("Use ansistrings by default for strings"));
+ new FlagCheckBox(lang_group, controller,
+ "-Ss", i18n("Require the name of constructors to be init\n and the name of destructors to be done"));
+ new FlagCheckBox(lang_group, controller,
+ "-St", i18n("Allow the static keyword in objects"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addStretch();
+}
+
+ LanguageTab::~ LanguageTab( )
+{
+ delete controller;
+}
+
+void LanguageTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+}
+
+void LanguageTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+}
+
+AssemblerTab::AssemblerTab( QWidget * parent, const char * name )
+ : QWidget(parent, name), controller(new FlagCheckBoxController()),
+ asmController(new FlagRadioButtonController)
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+// layout->setAutoAdd(true);
+
+ QBoxLayout *layout2 = new QHBoxLayout(layout, KDialog::spacingHint());
+
+ QVButtonGroup *info_group = new QVButtonGroup(i18n("Assembler Info"), this);
+ new FlagCheckBox(info_group, controller,
+ "-a", i18n("Do not delete assembler files"));
+ new FlagCheckBox(info_group, controller,
+ "-al", i18n("List source"));
+ new FlagCheckBox(info_group, controller,
+ "-ar", i18n("List register allocation and release info"));
+ new FlagCheckBox(info_group, controller,
+ "-at", i18n("List temporary allocations and deallocations"));
+ layout2->addWidget(info_group);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ //layout->addSpacing(10);
+
+ QVButtonGroup *asmkind_group = new QVButtonGroup(i18n("Assembler Reader"), this);
+ QRadioButton *m_defaultkind = new QRadioButton(i18n("Use default reader"), asmkind_group);
+ m_defaultkind->setChecked(true);
+ new FlagRadioButton(asmkind_group, asmController,
+ "-Ratt", i18n("AT&T style assembler"));
+ new FlagRadioButton(asmkind_group, asmController,
+ "-Rintel", i18n("Intel style assembler"));
+ new FlagRadioButton(asmkind_group, asmController,
+ "-Rdirect", i18n("Direct assembler"));
+ layout2->addWidget(asmkind_group);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+
+ QVButtonGroup *asm_group = new QVButtonGroup(i18n("Assembler Output"), this);
+ new FlagCheckBox(asm_group, controller,
+ "-P", i18n("Use pipes instead of files when assembling"));
+ QRadioButton *m_default = new QRadioButton(i18n("Use default output"), asm_group);
+ m_default->setChecked(true);
+ new FlagRadioButton(asm_group, asmController,
+ "-Aas", i18n("Use GNU as"));
+ new FlagRadioButton(asm_group, asmController,
+ "-Aasout", i18n("Use GNU asaout"));
+ new FlagRadioButton(asm_group, asmController,
+ "-Anasmcoff", i18n("Use NASM coff"));
+ new FlagRadioButton(asm_group, asmController,
+ "-Anasmelf", i18n("Use NASM elf"));
+ new FlagRadioButton(asm_group, asmController,
+ "-Anasmobj", i18n("Use NASM obj"));
+ new FlagRadioButton(asm_group, asmController,
+ "-Amasm", i18n("Use MASM"));
+ new FlagRadioButton(asm_group, asmController,
+ "-Atasm", i18n("Use TASM"));
+ new FlagRadioButton(asm_group, asmController,
+ "-Acoff", i18n("Use coff"));
+ new FlagRadioButton(asm_group, asmController,
+ "-Apecoff", i18n("Use pecoff"));
+ layout->addWidget(asm_group);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addStretch();
+}
+
+ AssemblerTab::~ AssemblerTab( )
+{
+ delete controller;
+ delete asmController;
+}
+
+void AssemblerTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ asmController->readFlags(str);
+}
+
+void AssemblerTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ asmController->writeFlags(str);
+}
+
+
+
+DebugOptimTab::DebugOptimTab( QWidget * parent, const char * name )
+ : QWidget(parent, name), controller(new FlagCheckBoxController()),
+ optimController(new FlagRadioButtonController)
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+// layout->setAutoAdd(true);
+
+ QBoxLayout *layout2 = new QHBoxLayout(layout, KDialog::spacingHint());
+
+ QBoxLayout *layout3 = new QVBoxLayout(layout2, KDialog::spacingHint());
+
+ QVButtonGroup *debug_group = new QVButtonGroup(i18n("Debugging"), this);
+ new FlagCheckBox(debug_group, controller,
+ "-g", i18n("Generate information for GDB"), "-!g");
+ new FlagCheckBox(debug_group, controller,
+ "-gd", i18n("Generate information for DBX"), "-!gd");
+ new FlagCheckBox(debug_group, controller,
+ "-gl", i18n("Use lineinfo unit"), "-!gl");
+ new FlagCheckBox(debug_group, controller,
+ "-gh", i18n("Use heaptrc unit"), "-!gh");
+ new FlagCheckBox(debug_group, controller,
+ "-gc", i18n("Generate checks for pointers"), "-!gc");
+ layout3->addWidget(debug_group);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout3->addSpacing(10);
+
+ QVButtonGroup *profile_group = new QVButtonGroup(i18n("Profiling"), this);
+ new FlagCheckBox(profile_group, controller,
+ "-pg", i18n("Generate profiler code for gprof"), "-!pg");
+ layout3->addWidget(profile_group);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout3->addSpacing(10);
+
+ QBoxLayout *layout4 = new QVBoxLayout(layout2, KDialog::spacingHint());
+
+ QVButtonGroup *optim_group1 = new QVButtonGroup(i18n("General Optimization"), this);
+ m_default = new QRadioButton(i18n("Default"), optim_group1);
+ m_default->setChecked(true);
+ new FlagRadioButton(optim_group1, optimController,
+ "-Og", i18n("Generate smaller code"));
+ optim1 = new FlagRadioButton(optim_group1, optimController,
+ "-OG", i18n("Generate faster code"));
+ layout4->addWidget(optim_group1);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout4->addSpacing(10);
+
+ QVButtonGroup *optim_group2 = new QVButtonGroup(i18n("Optimization Levels"), this);
+ m_default2 = new QRadioButton(i18n("Default"), optim_group2);
+ m_default2->setChecked(true);
+ new FlagRadioButton(optim_group2, optimController,
+ "-O1", i18n("Level 1"));
+ new FlagRadioButton(optim_group2, optimController,
+ "-O2", i18n("Level 2"));
+ optim2 = new FlagRadioButton(optim_group2, optimController,
+ "-O3", i18n("Level 3"));
+ layout4->addWidget(optim_group2);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout4->addSpacing(10);
+
+ QHBoxLayout *layout5 = new QHBoxLayout(layout, KDialog::spacingHint());
+
+ QVButtonGroup *optim_group3 = new QVButtonGroup(i18n("Architecture"), this);
+ m_default3 = new QRadioButton(i18n("Default"), optim_group3);
+ m_default3->setChecked(true);
+ new FlagRadioButton(optim_group3, optimController,
+ "-Op1", i18n("386/486"));
+ new FlagRadioButton(optim_group3, optimController,
+ "-Op2", i18n("Pentium/PentiumMMX"));
+ new FlagRadioButton(optim_group3, optimController,
+ "-Op2", i18n("PentiumPro/PII/Cyrix 6x86/K6"));
+ layout5->addWidget(optim_group3);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ QVButtonGroup *optim_group4 = new QVButtonGroup(i18n("Another Optimization"), this);
+ new FlagCheckBox(optim_group4, controller,
+ "-Or", i18n("Use register variables"), "-!Or");
+ new FlagCheckBox(optim_group4, controller,
+ "-Ou", i18n("Uncertain optimizations"), "-!Ou");
+ layout5->addWidget(optim_group4);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ QHBoxLayout *layout6 = new QHBoxLayout(layout, KDialog::spacingHint());
+ QPushButton *release = new QPushButton(i18n("Release"), this);
+ QPushButton *debug = new QPushButton(i18n("Debug"), this);
+ layout6->addWidget(release);
+ layout6->addWidget(debug);
+ connect(release, SIGNAL(clicked()), this, SLOT(setReleaseOptions()));
+ connect(debug, SIGNAL(clicked()), this, SLOT(setDebugOptions()));
+
+ layout->addStretch();
+}
+
+ DebugOptimTab::~ DebugOptimTab( )
+{
+ delete controller;
+ delete optimController;
+}
+
+void DebugOptimTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ optimController->readFlags(str);
+}
+
+void DebugOptimTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ optimController->writeFlags(str);
+}
+
+void DebugOptimTab::setReleaseOptions()
+{
+ m_default->setChecked(true);
+ m_default2->setChecked(true);
+// m_default3->setChecked(true);
+ QStringList sl = QStringList::split(",", "-!g,-!gd,-!gl,-!gh,-!gc,-!pg,-!Ou,-!Or");
+ readFlags(&sl);
+ optim1->setChecked(true);
+ optim2->setChecked(true);
+}
+
+void DebugOptimTab::setDebugOptions()
+{
+ QStringList sl = QStringList::split(",", "-g,-gl,-gh,-gc");
+ readFlags(&sl);
+ m_default->setChecked(true);
+ m_default2->setChecked(true);
+// m_default3->setChecked(true);
+}
+
+CodegenTab::CodegenTab( QWidget * parent, const char * name )
+ : QWidget(parent, name), controller(new FlagCheckBoxController()),
+ listController(new FlagEditController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ QVButtonGroup *compile_group = new QVButtonGroup(i18n("Compile Time Checks"), this);
+ new FlagCheckBox(compile_group, controller,
+ "-Sa", i18n("Include assert statements in compiled code"));
+ new FlagCheckBox(compile_group, controller,
+ "-Un", i18n("Do not check the unit name for being the same as the file name"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ QVButtonGroup *run_group = new QVButtonGroup(i18n("Run Time Checks"), this);
+ new FlagCheckBox(run_group, controller,
+ "-Cr", i18n("Range checking"));
+ new FlagCheckBox(run_group, controller,
+ "-Ct", i18n("Stack checking"));
+ new FlagCheckBox(run_group, controller,
+ "-Ci", i18n("Input/Output checking"));
+ new FlagCheckBox(run_group, controller,
+ "-Co", i18n("Integer overflow checking"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ new FlagListEdit(this, ":", listController, "-d", i18n("Conditional defines (delimited by \":\"):"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ new FlagListEdit(this, ":", listController, "-u", i18n("Undefine conditional defines (delimited by \":\"):"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ new FlagSpinEdit(this, 1024, 67107840, 1, 131072, listController,
+ "-Cs", i18n("Stack size:"));
+ new FlagSpinEdit(this, 1024, 67107840, 1, 2097152, listController,
+ "-Ch", i18n("Heap size:"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addStretch();
+}
+
+CodegenTab::~ CodegenTab( )
+{
+ delete controller;
+ delete listController;
+}
+
+void CodegenTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ listController->readFlags(str);
+}
+
+void CodegenTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ listController->writeFlags(str);
+}
+
+LinkerTab::LinkerTab( QWidget * parent, const char * name )
+ : QWidget(parent, name), controller(new FlagCheckBoxController()),
+ listController(new FlagEditController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+
+ QBoxLayout *layout2 = new QHBoxLayout(layout, KDialog::spacingHint());
+
+ QVButtonGroup *link_group = new QVButtonGroup(i18n("Linking Stage"), this);
+ new FlagCheckBox(link_group, controller,
+ "-CD", i18n("Create dynamic library"));
+ new FlagCheckBox(link_group, controller,
+ "-CX", i18n("Create smartlinked units"));
+ new FlagCheckBox(link_group, controller,
+ "-Ur", i18n("Generate release units"));
+ new FlagCheckBox(link_group, controller,
+ "-Cn", i18n("Omit the linking stage"));
+ new FlagCheckBox(link_group, controller,
+ "-s", i18n("Create assembling and linking script"));
+ layout2->addWidget(link_group);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ QVButtonGroup *exec_group = new QVButtonGroup(i18n("Executable Generation"), this);
+ new FlagCheckBox(exec_group, controller,
+ "-Xs", i18n("Strip the symbols from the executable"));
+ new FlagCheckBox(exec_group, controller,
+ "-XS", i18n("Link with static units"));
+ new FlagCheckBox(exec_group, controller,
+ "-XX", i18n("Link with smartlinked units"));
+ new FlagCheckBox(exec_group, controller,
+ "-XD", i18n("Link with dynamic libraries"));
+ new FlagCheckBox(exec_group, controller,
+ "-Xc", i18n("Link with the C library"));
+ layout2->addWidget(exec_group);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ FlagListEdit *led = new FlagListEdit(this, ":", listController, "-k", i18n("Options passed to the linker (delimited by \":\"):"));
+ layout->addWidget(led);
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ layout->addStretch();
+}
+
+LinkerTab::~LinkerTab( )
+{
+ delete controller;
+ delete listController;
+}
+
+void LinkerTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ listController->readFlags(str);
+}
+
+void LinkerTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ listController->writeFlags(str);
+}
+
+MiscTab::MiscTab( QWidget * parent, const char * name )
+ : QWidget(parent, name), controller(new FlagCheckBoxController()),
+ radioController(new FlagRadioButtonController()),
+ pathController(new FlagPathEditController()),
+ editController(new FlagEditController())
+{
+ QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ layout->setAutoAdd(true);
+
+ new FlagCheckBox(this, controller,
+ "-B", i18n("Recompile all used units"));
+ new FlagCheckBox(this, controller,
+ "-n", i18n("Do not read default configuration file"));
+ new FlagPathEdit(this, "", pathController,
+ "@", i18n("Compiler configuration file:"), KFile::File);
+ new FlagSpinEdit(this, 1, 1000, 1, 50, editController,
+ "-Se", i18n("Stop after the error:"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ QVButtonGroup *browser_group = new QVButtonGroup(i18n("Browser Info"), this);
+ QRadioButton *m_defaultBrowser = new QRadioButton(i18n("No browser info"), browser_group);
+ m_defaultBrowser->setChecked(true);
+ new FlagRadioButton(browser_group, radioController,
+ "-b", i18n("Global browser info"));
+ new FlagRadioButton(browser_group, radioController,
+ "-bl", i18n("Global and local browser info"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ QVButtonGroup *target_group = new QVButtonGroup(i18n("Target OS"), this);
+ QRadioButton *m_defaultTarget = new QRadioButton(i18n("Default"), target_group);
+ m_defaultTarget->setChecked(true);
+ new FlagRadioButton(target_group, radioController,
+ "-TGO32V1", i18n("DOS and version 1 of the DJ DELORIE extender"));
+ new FlagRadioButton(target_group, radioController,
+ "-TGO32V2", i18n("DOS and version 2 of the DJ DELORIE extender"));
+ new FlagRadioButton(target_group, radioController,
+ "-TLINUX", i18n("Linux"));
+ new FlagRadioButton(target_group, radioController,
+ "-TOS2", i18n("OS/2 (2.x) using the EMX extender"));
+ new FlagRadioButton(target_group, radioController,
+ "-TWIN32", i18n("WINDOWS 32 bit"));
+ new FlagRadioButton(target_group, radioController,
+ "-TSUNOS", i18n("SunOS/Solaris"));
+ new FlagRadioButton(target_group, radioController,
+ "-TBEOS", i18n("BeOS"));
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+ layout->addSpacing(10);
+
+ layout->addStretch();
+}
+
+MiscTab::~ MiscTab( )
+{
+ delete controller;
+ delete pathController;
+ delete radioController;
+ delete editController;
+}
+
+void MiscTab::readFlags( QStringList * str )
+{
+ controller->readFlags(str);
+ radioController->readFlags(str);
+ pathController->readFlags(str);
+ editController->readFlags(str);
+}
+
+void MiscTab::writeFlags( QStringList * str )
+{
+ controller->writeFlags(str);
+ radioController->writeFlags(str);
+ pathController->writeFlags(str);
+ editController->writeFlags(str);
+}
+
+#include "optiontabs.moc"
diff --git a/languages/pascal/compiler/fpcoptions/optiontabs.h b/languages/pascal/compiler/fpcoptions/optiontabs.h
new file mode 100644
index 00000000..56109ae2
--- /dev/null
+++ b/languages/pascal/compiler/fpcoptions/optiontabs.h
@@ -0,0 +1,161 @@
+/***************************************************************************
+ * Copyright (C) 2003 Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef OPTIONTABS_H
+#define OPTIONTABS_H
+
+#include <qwidget.h>
+
+class QSpinBox;
+class QRadioButton;
+class FlagRadioButton;
+class FlagCheckBoxController;
+class FlagRadioButtonController;
+class FlagPathEditController;
+class FlagEditController;
+
+class FeedbackTab : public QWidget
+{
+public:
+ FeedbackTab( QWidget *parent=0, const char *name=0 );
+ ~FeedbackTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+};
+
+class FilesAndDirectoriesTab: public QWidget
+{
+public:
+ FilesAndDirectoriesTab( QWidget *parent = 0, const char *name = 0);
+ ~FilesAndDirectoriesTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagPathEditController *pathController;
+};
+
+class FilesAndDirectoriesTab2: public QWidget
+{
+public:
+ FilesAndDirectoriesTab2( QWidget *parent = 0, const char *name = 0);
+ ~FilesAndDirectoriesTab2();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagPathEditController *pathController;
+};
+
+class LanguageTab : public QWidget
+{
+public:
+ LanguageTab( QWidget *parent=0, const char *name=0 );
+ ~LanguageTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+};
+
+class AssemblerTab : public QWidget
+{
+public:
+ AssemblerTab( QWidget *parent=0, const char *name=0 );
+ ~AssemblerTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagRadioButtonController *asmController;
+};
+
+class DebugOptimTab : public QWidget
+{
+ Q_OBJECT
+public:
+ DebugOptimTab( QWidget *parent=0, const char *name=0 );
+ ~DebugOptimTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagRadioButtonController *optimController;
+
+ QRadioButton *m_default;
+ QRadioButton *m_default2;
+ QRadioButton *m_default3;
+ FlagRadioButton *optim1;
+ FlagRadioButton *optim2;
+
+private slots:
+ void setReleaseOptions();
+ void setDebugOptions();
+};
+
+class CodegenTab : public QWidget
+{
+public:
+ CodegenTab( QWidget *parent=0, const char *name=0 );
+ ~CodegenTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagEditController *listController;
+};
+
+class LinkerTab : public QWidget
+{
+public:
+ LinkerTab( QWidget *parent=0, const char *name=0 );
+ ~LinkerTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagEditController *listController;
+};
+
+class MiscTab : public QWidget
+{
+public:
+ MiscTab( QWidget *parent=0, const char *name=0 );
+ ~MiscTab();
+
+ void readFlags(QStringList *str);
+ void writeFlags(QStringList *str);
+
+private:
+ FlagCheckBoxController *controller;
+ FlagRadioButtonController *radioController;
+ FlagPathEditController *pathController;
+ FlagEditController *editController;
+};
+
+#endif
diff --git a/languages/pascal/configproblemreporter.ui b/languages/pascal/configproblemreporter.ui
new file mode 100644
index 00000000..a215f7a8
--- /dev/null
+++ b/languages/pascal/configproblemreporter.ui
@@ -0,0 +1,88 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ConfigureProblemReporter</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ConfigureProblemReporter</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>390</width>
+ <height>306</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>bgParserCheckbox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Enable background parsing</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>delaySlider</cstring>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="lineStep">
+ <number>250</number>
+ </property>
+ <property name="pageStep">
+ <number>500</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>NoMarks</enum>
+ </property>
+ <property name="tickInterval">
+ <number>250</number>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>101</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>bgParserCheckbox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>ConfigureProblemReporter</receiver>
+ <slot>bgParserCheckbox_toggled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+ <slot>accept()</slot>
+ <slot>bgParserCheckbox_toggled( bool b )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/pascal/doc/Makefile.am b/languages/pascal/doc/Makefile.am
new file mode 100644
index 00000000..a7829d08
--- /dev/null
+++ b/languages/pascal/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = pascal_bugs_fp.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA =
+
diff --git a/languages/pascal/doc/pascal_bugs_fp.toc b/languages/pascal/doc/pascal_bugs_fp.toc
new file mode 100644
index 00000000..60be2ec5
--- /dev/null
+++ b/languages/pascal/doc/pascal_bugs_fp.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Pascal bugs (fp)</title>
+<base href="http://www.freepascal.org/"/>
+<tocsect1 name="Query" url="bugs.html">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/pascal/file_templates/Makefile.am b/languages/pascal/file_templates/Makefile.am
new file mode 100644
index 00000000..94891c97
--- /dev/null
+++ b/languages/pascal/file_templates/Makefile.am
@@ -0,0 +1,2 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = dpr pas-program pas-unit pp-program pp-unit
diff --git a/languages/pascal/file_templates/dpr b/languages/pascal/file_templates/dpr
new file mode 100644
index 00000000..3f271522
--- /dev/null
+++ b/languages/pascal/file_templates/dpr
@@ -0,0 +1,12 @@
+{
+ Pascal program: $MODULE$
+
+ Description:
+ Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ Copyright: See COPYING file that comes with this distribution
+}
+program $MODULE$;
+
+begin
+
+end.
diff --git a/languages/pascal/file_templates/pas-program b/languages/pascal/file_templates/pas-program
new file mode 100644
index 00000000..3f271522
--- /dev/null
+++ b/languages/pascal/file_templates/pas-program
@@ -0,0 +1,12 @@
+{
+ Pascal program: $MODULE$
+
+ Description:
+ Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ Copyright: See COPYING file that comes with this distribution
+}
+program $MODULE$;
+
+begin
+
+end.
diff --git a/languages/pascal/file_templates/pas-unit b/languages/pascal/file_templates/pas-unit
new file mode 100644
index 00000000..98b52e50
--- /dev/null
+++ b/languages/pascal/file_templates/pas-unit
@@ -0,0 +1,19 @@
+{
+ Pascal unit: $MODULE$
+
+ Description:
+ Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ Copyright: See COPYING file that comes with this distribution
+}
+
+unit $MODULE$;
+
+interface
+
+implementation
+
+initialization
+
+finalization
+
+end.
diff --git a/languages/pascal/file_templates/pp-program b/languages/pascal/file_templates/pp-program
new file mode 100644
index 00000000..3f271522
--- /dev/null
+++ b/languages/pascal/file_templates/pp-program
@@ -0,0 +1,12 @@
+{
+ Pascal program: $MODULE$
+
+ Description:
+ Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ Copyright: See COPYING file that comes with this distribution
+}
+program $MODULE$;
+
+begin
+
+end.
diff --git a/languages/pascal/file_templates/pp-unit b/languages/pascal/file_templates/pp-unit
new file mode 100644
index 00000000..98b52e50
--- /dev/null
+++ b/languages/pascal/file_templates/pp-unit
@@ -0,0 +1,19 @@
+{
+ Pascal unit: $MODULE$
+
+ Description:
+ Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+ Copyright: See COPYING file that comes with this distribution
+}
+
+unit $MODULE$;
+
+interface
+
+implementation
+
+initialization
+
+finalization
+
+end.
diff --git a/languages/pascal/kdevpascalsupport.desktop b/languages/pascal/kdevpascalsupport.desktop
new file mode 100644
index 00000000..e560b8da
--- /dev/null
+++ b/languages/pascal/kdevpascalsupport.desktop
@@ -0,0 +1,84 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Pascal Language Support
+Comment[ca]=Suport per al llenguatge Pascal
+Comment[da]=Pascal sprogunderstøttelse
+Comment[de]=Pascal-Unterstützung für KDevelop
+Comment[el]=ΥποστήÏιξη γλώσσας Pascal
+Comment[es]=Soporte para el lenguaje Pascal
+Comment[et]=Pascali keele toetus
+Comment[eu]=Pascal lenguaiaren euskarria
+Comment[fa]=پشتیبانی زبان پاسکال
+Comment[fr]=Prise en charge du langage Pascal
+Comment[ga]=Tacaíocht Pascal
+Comment[gl]=Soporte para linguaxe Pascal
+Comment[hi]=पासà¥à¤•à¤² भाषा समरà¥à¤¥à¤¨
+Comment[hu]=Támogatás a Pascal nyelv használatához
+Comment[is]=Stuðningur við Pascal forritunarmálið
+Comment[it]=Supporto per il linguaggio Pascal
+Comment[ja]=Pascal 言語サãƒãƒ¼ãƒˆ
+Comment[nds]=Ünnerstütten för de Spraak Pascal
+Comment[ne]=पासà¥à¤•à¤² भाषा समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor Pascal
+Comment[pl]=Obsługa języka Pascal
+Comment[pt]=Suporte da Linguagem Pascal
+Comment[pt_BR]=Suporte à Linguagem Pascal
+Comment[ru]=Поддержка Ñзыка Pascal
+Comment[sk]=Podpora jazyka Pascal
+Comment[sl]=Podpora jeziku pascal
+Comment[sr]=Језичка подршка за Pascal
+Comment[sr@Latn]=JeziÄka podrÅ¡ka za Pascal
+Comment[sv]=Stöd för språket Pascal
+Comment[ta]=பாஸà¯à®•à®²à¯ மொழி ஆதரவà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони Pascal Language
+Comment[tr]=Pascal Dil DesteÄŸi
+Comment[zh_CN]=Pascal 语言支æŒ
+Comment[zh_TW]=Pascal 語言支æ´
+Name=KDevPascalSupport
+Name[da]=KDevelop Pascal-understøttelse
+Name[de]=Sprachunterstützung für Pascal (KDevelop)
+Name[hi]=के-डेव-पॉसà¥à¤•à¤²-समरà¥à¤¥à¤¨
+Name[nds]=Pascal-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaPascala
+Name[sk]=KDev Pascal podpora
+Name[sv]=KDevelop Pascal-stöd
+Name[ta]=கெடெவ௠பாஸà¯à®•à®²à¯ ஆதரவà¯
+Name[zh_TW]=KDevelop Pascal 支æ´
+GenericName=Pascal Language Support
+GenericName[ca]=Suport per al llenguatge Pascal
+GenericName[da]=Pascal sprogunderstøttelse
+GenericName[de]=Sprachunterstützung für Pascal
+GenericName[el]=ΥποστήÏιξη γλώσσας Pascal
+GenericName[es]=Soporte para el lenguaje Pascal
+GenericName[et]=Pascali keele toetus
+GenericName[eu]=Pascal lenguaiaren euskarria
+GenericName[fa]=پشتیبانی زبان پاسکال
+GenericName[fr]=Prise en charge du langage PASCAL
+GenericName[ga]=Tacaíocht Pascal
+GenericName[gl]=Soporte para linguaxe Pascal
+GenericName[hi]=पासà¥à¤•à¤² भाषा समरà¥à¤¥à¤¨
+GenericName[hu]=Pascal-támogatás
+GenericName[it]=Supporto per il linguaggio Pascal
+GenericName[ja]=Pascal 言語サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för de Spraak Pascal
+GenericName[ne]=पासà¥à¤•à¤² भाषा समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor Pascal
+GenericName[pl]=Obsługa języka Pascal
+GenericName[pt]=Suporte à Linguagem Pascal
+GenericName[pt_BR]=Suporte à Linguagem Pascal
+GenericName[ru]=Поддержка Ñзыка Pascal
+GenericName[sk]=Podpora jazyka Pascal
+GenericName[sl]=Podpora jezicu pascal
+GenericName[sr]=Језичка подршка за Pascal
+GenericName[sr@Latn]=JeziÄka podrÅ¡ka za Pascal
+GenericName[sv]=Stöd för språket Pascal
+GenericName[ta]=பாஸà¯à®•à®²à¯ மொழி ஆதரவà¯
+GenericName[tg]=ÐÑ€Ó£ намудани забони Pascal
+GenericName[tr]=Pascal Dil DesteÄŸi
+GenericName[zh_CN]=Pascal 语言支æŒ
+GenericName[zh_TW]=Pascal 語言支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevpascalsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Pascal
diff --git a/languages/pascal/kdevpascalsupport.rc b/languages/pascal/kdevpascalsupport.rc
new file mode 100644
index 00000000..4335b2a6
--- /dev/null
+++ b/languages/pascal/kdevpascalsupport.rc
@@ -0,0 +1,3 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="KDevPascalSupport" version="2">
+</kpartplugin>
diff --git a/languages/pascal/pascal.g b/languages/pascal/pascal.g
new file mode 100644
index 00000000..fde5dcb8
--- /dev/null
+++ b/languages/pascal/pascal.g
@@ -0,0 +1,1212 @@
+//
+//
+// Pascal Grammar
+//
+// Adapted from,
+// Pascal User Manual And Report (Second Edition-1978)
+// Kathleen Jensen - Niklaus Wirth
+//
+// By
+//
+// Hakki Dogusan dogusanh@tr-net.net.tr
+//
+// Then significantly enhanced by Piet Schoutteten
+// with some guidance by Terence Parr. Piet added tree
+// construction, and some tree walkers.
+//
+//
+// Turbo Pascal, Free Pascal and Delphi pascal extensions
+// by Alexander Dymo <cloudtemple@mksat.net>
+//
+//
+// Adapted from,
+// Free Pascal: Reference Guide 1.9 April 2002
+//
+//
+// KDevelop 3.0 support by Alexander Dymo <cloudtemple@mksat.net>
+//
+
+header "pre_include_hpp" {
+ #include "problemreporter.h"
+ #include "PascalAST.hpp"
+
+ #include <qlistview.h>
+ #include <kdebug.h>
+
+ #define SET_POSITION(ast,t)\
+ { \
+ RefPascalAST(ast)->setLine( t->getLine() );\
+ RefPascalAST(ast)->setColumn( t->getColumn() ); \
+ }
+}
+
+options {
+ language="Cpp";
+}
+
+class PascalParser extends Parser;
+options {
+ k = 2; // two token lookahead
+ exportVocab=Pascal; // Call its vocabulary "Pascal"
+ codeGenMakeSwitchThreshold = 2; // Some optimizations
+ codeGenBitsetTestThreshold = 3;
+ defaultErrorHandler = true; // Generate parser error handlers
+ buildAST = true;
+ ASTLabelType = "RefPascalAST";
+}
+
+/* Define imaginary tokens used to organize tree
+ *
+ * One of the principles here is that any time you have a list of
+ * stuff, you usually want to treat it like one thing (a list) a some
+ * point in the grammar. You want trees to have a fixed number of children
+ * as much as possible. For example, the definition of a procedure should
+ * be something like #(PROCEDURE ID #(ARGDECLS ARG1 ARG2...)) not
+ * #(PROCEDURE ID ARG1 ARG2 ... ) since this is harder to parse and
+ * harder to manipulate. Same is true for statement lists (BLOCK) etc...
+ */
+tokens {
+ BLOCK; // list of statements
+ IDLIST; // list of identifiers; e.g., #(PROGRAM #(IDLIST ID ID...))
+ ELIST; // expression list for proc args etc...
+ FUNC_CALL;
+ PROC_CALL;
+ SCALARTYPE; // IDLIST that is really a scalar type like (Mon,Tue,Wed)
+ TYPELIST; // list of types such as for array declarations
+ VARIANT_TAG;// for CASEs in a RECORD
+ VARIANT_TAG_NO_ID;// for CASEs in a RECORD (no id, just a type)
+ VARIANT_CASE;// a case of the variant
+ CONSTLIST; // List of constants
+ FIELDLIST; // list of fields in a record
+ ARGDECLS; // overall group of declarations of args for proc/func.
+ VARDECL; // declaration of a variable
+ ARGDECL; // declaration of a parameter
+ ARGLIST; // list of actual arguments (expressions)
+ TYPEDECL; // declaration of a type
+ FIELD; // the root a RECORD field
+}
+
+// Define some methods and variables to use in the generated parser.
+{
+private:
+ unsigned int m_numberOfErrors;
+ ProblemReporter* m_problemReporter;
+
+public:
+ void resetErrors() { m_numberOfErrors = 0; }
+ unsigned int numberOfErrors() const { return m_numberOfErrors; }
+ void setProblemReporter( ProblemReporter* r ) { m_problemReporter = r; }
+
+ void reportError( const ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex ){
+ m_problemReporter->reportError( ex.getMessage().c_str(),
+ ex.getFilename().c_str(),
+ ex.getLine(),
+ ex.getColumn() );
+ ++m_numberOfErrors;
+ }
+
+ void reportError( const ANTLR_USE_NAMESPACE(std)string& errorMessage ){
+ m_problemReporter->reportError( errorMessage.c_str(),
+ getFilename().c_str(),
+ LT(1)->getLine(),
+ LT(1)->getColumn() );
+ ++m_numberOfErrors;
+ }
+
+ void reportMessage( const ANTLR_USE_NAMESPACE(std)string& message ){
+ m_problemReporter->reportMessage( message.c_str(),
+ getFilename().c_str(),
+ LT(1)->getLine(),
+ LT(1)->getColumn() );
+ }
+}
+
+compilationUnit
+ : program
+ | library
+ | unit
+ ;
+
+program
+ : programHeading
+ (usesClause)?
+ block
+ DOT!
+ ;
+
+library
+ : LIBRARY^ identifier SEMI!
+ (usesClause)?
+ libraryBlock
+ exportsClause
+ END! DOT!
+ ;
+
+libraryBlock
+ : declarationPart (statementPart)?
+ ;
+
+exportsClause
+ : EXPORTS^
+ exportsList
+ ;
+
+exportsList
+ : exportsEntry ( COMMA! exportsEntry )* (SEMI!)?
+ ;
+
+exportsEntry
+ : identifier ("index" integerConstant)? ("name" stringConstant)?
+ ;
+
+usesClause
+ : USES^ identifierList SEMI!
+ ;
+
+unit
+ : UNIT^ identifier SEMI!
+ interfacePart
+ implementationPart
+ ( (initializationPart (finalizationPart)?) | realizationPart )?
+ END!
+ ;
+
+interfacePart
+ : INTERFACE^
+ (usesClause)?
+ ( constantDeclarationPart
+ | typeDeclarationPart
+ | procedureHeadersPart
+ )*
+ ;
+
+implementationPart
+ : IMPLEMENTATION^
+ (usesClause)?
+ declarationPart
+ ;
+
+realizationPart
+ : BEGIN^ statement ( SEMI! statement )*
+ ;
+
+programHeading
+ : PROGRAM^ identifier (LPAREN! identifierList RPAREN!)? SEMI!
+ ;
+
+initializationPart
+ : INITIALIZATION^
+ statement ( SEMI! statement )*
+ ;
+
+finalizationPart
+ : FINALIZATION^
+ statement ( SEMI! statement )*
+ ;
+
+block
+ : declarationPart statementPart
+ ;
+
+declarationPart
+ : (labelDeclarationPart
+ | constantDeclarationPart
+ | resourcestringDeclarationPart
+ | typeDeclarationPart
+ | variableDeclarationPart
+ | procedureAndFunctionDeclarationPart
+ )*
+ ;
+
+labelDeclarationPart
+ : LABEL^ label ( COMMA! label )* SEMI!
+ ;
+
+constantDeclarationPart
+ : CONST^ ( constantDeclaration | typedConstantDeclaration )+
+ ;
+
+resourcestringDeclarationPart
+ : RESOURCESTRING^ ( stringConstantDeclaration )*
+ ;
+
+stringConstantDeclaration
+ : identifier EQUAL! string
+ ;
+
+typeDeclarationPart
+ : TYPE^ ( typeDeclaration )+
+ ;
+
+variableDeclarationPart
+ : VAR^ variableDeclaration ( SEMI! variableDeclaration )* SEMI!
+ ;
+
+variableDeclaration
+ : identifierList c:COLON^ {#c->setType(VARDECL);} type
+ ;
+
+procedureAndFunctionDeclarationPart
+ : procedureAndFunctionDeclaration
+ ;
+
+procedureAndFunctionDeclaration
+ : procedureDeclaration
+ | functionDeclaration
+ | constructorDeclaration
+ | destructorDeclaration
+ ;
+
+statementPart
+ : compoundStatement
+ ;
+
+procedureDeclaration
+ : procedureHeader subroutineBlock SEMI!
+ ;
+
+procedureHeadersPart
+ : procedureHeader | functionHeader // ) SEMI! ( callModifiers SEMI! )
+ ;
+
+procedureHeader
+ : PROCEDURE^ ( identifier | qualifiedMethodIdentifier )
+ (formalParameterList)? SEMI! (modifiers SEMI!)*
+ ;
+
+qualifiedMethodIdentifier
+ : identifier COLON! COLON! identifier
+ ;
+
+subroutineBlock
+ : block
+ | externalDirective
+// | asmBlock
+ | FORWARD!
+ ;
+
+functionDeclaration
+ : functionHeader subroutineBlock SEMI!
+ ;
+
+functionHeader
+ : (FUNCTION^ identifier COLON! type SEMI!)=> FUNCTION^ identifier COLON! type SEMI! (modifiers SEMI!)*
+ | (FUNCTION^ identifier COLON! COLON! identifier COLON! type SEMI!)=> FUNCTION^ qualifiedMethodIdentifier COLON! type SEMI! (modifiers SEMI!)*
+ | (FUNCTION^ identifier COLON! COLON! identifier LPAREN!)=> FUNCTION^ qualifiedMethodIdentifier formalParameterList COLON! type SEMI! (modifiers SEMI!)*
+ | FUNCTION^ identifier formalParameterList COLON! type SEMI! (modifiers SEMI!)*
+ ;
+
+functionHeaderEnding
+ : (COLON! type SEMI!)=> COLON! type SEMI! (modifiers SEMI!)*
+ | formalParameterList COLON! type SEMI! (modifiers SEMI!)*
+ ;
+
+formalParameterList
+ : LPAREN! parameterDeclaration ( SEMI! parameterDeclaration )* RPAREN!
+ ;
+
+parameterDeclaration
+ : valueParameter
+ | variableParameter
+ | constantParameter
+ ;
+
+valueParameter
+ : (identifierList COLON! ARRAY! OF!)=> identifierList COLON! ARRAY! OF! type
+ | identifierList COLON! type
+ ;
+
+variableParameter
+ : VAR identifierList ( untypedParameterPart )?
+ ;
+
+untypedParameterPart
+ : (COLON! ARRAY! OF! type)=> COLON! ARRAY! OF! type
+ | COLON! type
+ ;
+
+constantParameter
+ : CONST identifierList ( untypedParameterPart )?
+ ;
+
+externalDirective
+ : EXTERNAL^ ( stringConstant ( ("name" stringConstant) | ("index" integerConstant) )? )?
+ ;
+
+/*asmBlock
+ : ASSEMBLER^ SEMI! declarationPart asmStatement
+ ;
+*/
+modifiers
+ : PUBLIC! | (ALIAS! stringConstant) | INTERRUPT! | callModifiers | EXPORT!
+ ;
+
+callModifiers
+ : REGISTER! | PASCAL! | CDECL! | STDCALL! | POPSTACK! | SAVEREGISTERS! | INLINE! | SAFECALL! | NEAR! | FAR!
+ ;
+
+constantDeclaration
+// : ( identifier EQUAL! expression SEMI! ) ( identifier EQUAL! expression SEMI! )*
+ : identifier EQUAL! expression SEMI!
+ ;
+
+typedConstantDeclaration
+// : ( identifier COLON! type EQUAL! typedConstant SEMI! )+
+ : identifier COLON! type EQUAL! typedConstant SEMI!
+ ;
+
+//FIXME: is there a better way to handle this instead of simply forcing the rules
+typedConstant
+ : (constant)=> constant
+// | addressConstant
+ | (LPAREN! identifier COLON!)=> recordConstant
+ | (arrayConstant)=> arrayConstant
+ | proceduralConstant
+ ;
+
+arrayConstant
+ : LPAREN! ( constant | arrayConstant ) ( COMMA! ( constant | arrayConstant ) )* RPAREN!
+ ;
+
+recordConstant
+ : LPAREN! ( identifier COLON! constant ) ( SEMI! ( identifier COLON! constant ) )* RPAREN!
+ ;
+
+addressConstant
+ : NUM_INT
+ ;
+
+proceduralConstant
+ : expression
+ ;
+
+typeDeclaration
+ : identifier EQUAL! type SEMI!
+ ;
+
+type
+// : simpleType | subrangeType | enumeratedType | stringType | structuredType | pointerType | proceduralType | typeIdentifier
+ : simpleType | subrangeTypeOrTypeIdentifier | enumeratedType | stringType | structuredType | pointerType | proceduralType
+ ;
+
+simpleType
+ : ordinalType | realType
+ ;
+
+ordinalType
+ : INTEGER! | SHORTINT! | SMALLINT! | LONGINT! | INT64! | BYTE! | WORD! | CARDINAL! | QWORD!
+ | BOOLEAN! | BYTEBOOL! | LONGBOOL! | CHAR!
+ ;
+
+subrangeTypeOrTypeIdentifier
+ : constant (DOTDOT! constant)?
+ ;
+
+typeIdentifier
+ : identifier
+ ;
+
+subrangeType
+ : constant DOTDOT! constant
+ ;
+
+enumeratedType
+ : (LPAREN! identifier ASSIGN!)=> LPAREN! assignedEnumList RPAREN!
+ | LPAREN! identifierList RPAREN!
+ ;
+
+assignedEnumList
+ : (identifier ASSIGN! expression) ( COMMA! (identifier ASSIGN! expression) )*
+ ;
+
+realType
+ : REAL! | SINGLE! | DOUBLE! | EXTENDED! | COMP!
+ ;
+
+stringType
+ : STRING^ ( LBRACK! unsignedInteger RBRACK! )?
+ ;
+
+structuredType
+ : (PACKED!)? ( arrayType | recordType | objectType | classType | setType | fileType )
+ ;
+
+arrayType
+ : ARRAY^ LBRACK! arrayIndexType ( COMMA! arrayIndexType )* RBRACK! OF! type
+ ;
+
+arrayIndexType
+ : ordinalType
+ | (expression DOTDOT!)=> arraySubrangeType
+ | enumeratedType
+ ;
+
+arraySubrangeType
+ : expression DOTDOT! expression
+ ;
+
+recordType
+ : RECORD^ (fieldList)* END!
+ ;
+
+fieldList
+ : fixedField | variantPart
+ ;
+
+fixedField
+ : identifierList COLON! type SEMI!
+ ;
+
+variantPart
+ : CASE^ (identifier COLON!)? identifier OF! variant ( SEMI! variant )*
+ ;
+
+variant
+ : (constant COMMA!)+ COLON! LPAREN! (fieldList)* RPAREN!
+ ;
+
+setType
+ : SET^ OF! ordinalType
+ ;
+
+fileType
+ : FILE^ OF! type
+ ;
+
+pointerType
+ : POINTER^ typeIdentifier
+ ;
+
+proceduralType
+ : (proceduralTypePart1 SEMI!)=> proceduralTypePart1 SEMI! callModifiers
+ | proceduralTypePart1
+ ;
+
+proceduralTypePart1
+ : ( functionHeader | procedureHeader ) (OF! OBJECT!)?
+ ;
+
+objectType
+ : OBJECT^ (heritage)? (componentList | objectVisibilitySpecifier ) END!
+ ;
+
+heritage
+ : LPAREN! identifier RPAREN!
+ ;
+
+componentList
+ : ( (fieldDefinition)+ )? ( (methodDefinition)+ )?
+ ;
+
+fieldDefinition
+ : identifierList COLON! type SEMI!
+ ;
+
+methodDefinition
+ : ( functionHeader | procedureHeader | constructorHeader | destructorHeader ) SEMI! methodDirectives
+ ;
+
+methodDirectives
+ : ( VIRTUAL! SEMI! (ABSTRACT! SEMI!)? )? (callModifiers SEMI!)?
+ ;
+
+objectVisibilitySpecifier
+ : PRIVATE! | PROTECTED! | PUBLIC!
+ ;
+
+constructorDeclaration
+ : constructorHeader SEMI! subroutineBlock
+ ;
+
+destructorDeclaration
+ : destructorHeader SEMI! subroutineBlock
+ ;
+
+constructorHeader
+ : CONSTRUCTOR^ ( identifier | qualifiedMethodIdentifier ) formalParameterList
+ ;
+
+destructorHeader
+ : DESTRUCTOR^ ( identifier | qualifiedMethodIdentifier ) formalParameterList
+ ;
+
+classType
+ : CLASS^ (heritage)? (classComponentList | classVisibilitySpecifier ) END!
+ ;
+
+classComponentList
+ : ( (fieldDefinition)+ )? ( ( (classMethodDefinition | propertyDefinition) )+ )?
+ ;
+
+classMethodDefinition
+ : ( ( (CLASS!)? (functionHeader | procedureHeader) ) | constructorHeader | destructorHeader ) SEMI! classMethodDirectives
+ ;
+
+classMethodDirectives
+ : ( directiveVariants SEMI! )? (callModifiers SEMI!)?
+ ;
+
+directiveVariants
+ : ( VIRTUAL! (ABSTRACT! SEMI!)? )
+ | OVERRIDE!
+ | (MESSAGE! (integerConstant | stringConstant))
+ ;
+
+classVisibilitySpecifier
+ : PRIVATE! | PROTECTED! | PUBLIC! | PUBLISHED!
+ ;
+
+propertyDefinition
+ : PROPERTY^ identifier (propertyInterface)? propertySpecifiers
+ ;
+
+propertyInterface
+ : (propertyParameterList)? COLON! typeIdentifier ("index" integerConstant)?
+ ;
+
+propertyParameterList
+ : LBRACK! parameterDeclaration (SEMI! parameterDeclaration)* RBRACK!
+ ;
+
+propertySpecifiers
+ : (readSpecifier)? (writeSpecifier)? (defaultSpecifier)?
+ ;
+
+readSpecifier
+ : "read" fieldOrMethod
+ ;
+
+writeSpecifier
+ : "write" fieldOrMethod
+ ;
+
+defaultSpecifier
+ : ( DEFAULT (constant)? )
+ | "nodefault"
+ ;
+
+fieldOrMethod
+ : identifier
+ ;
+
+expression
+ : simpleExpression ( expressionSign simpleExpression )?
+ ;
+
+expressionSign
+// : STAR! | LE! | GE! | LTH! | GT! | NOT_EQUAL! | IN! | IS!
+ : LE! | GE! | LTH! | GT! | NOT_EQUAL! | IN! | IS! | EQUAL!
+ ;
+
+simpleExpression
+ : term ( ( PLUS! | MINUS! | OR! | XOR! ) term )*
+ ;
+
+term
+ : factor ( (STAR! | SLASH! | DIV! | MOD! | AND! | SHL! | SHR!) factor )*
+ ;
+
+//TODO: distinguish between identifiers, typecasts and function calls -> semantic predicate
+factor
+ : ( LPAREN! expression RPAREN! )
+// | (qualifiedMethodIdentifier2 LBRACK!)=> qualifiedMethodIdentifier2 LBRACK! arrayIndexType ( COMMA! arrayIndexType )* RBRACK!
+ | identifierOrValueTypecastOrFunctionCall
+// | identifier
+// | functionCall
+ | unsignedConstant
+ | ( NOT! factor )
+ | ( (PLUS! | MINUS!) factor )
+ | setConstructor
+// | valueTypecast
+ | addressFactor
+ | TRUE
+ | FALSE
+ | identifier LBRACK! expression ( COMMA! expression )* RBRACK!
+ ;
+
+//FIXME: is this correct?
+identifierOrValueTypecastOrFunctionCall
+ : (identifier LPAREN! expression COMMA!)=> identifier LPAREN! expressions RPAREN!
+ | (identifier LPAREN! expression RPAREN!)=> identifier LPAREN! expression RPAREN!
+// | (qualifiedMethodIdentifier2 LPAREN! expression COMMA!)=> qualifiedMethodIdentifier2 LPAREN! expressions RPAREN!
+// | (identifier DOT)=> qualifiedMethodIdentifier2
+ | identifier
+ ;
+
+/*qualifiedMethodIdentifier2
+ : identifier DOT identifier
+ ;
+*/
+//( functionIdentifier | methodDesignator | qualifiedMethodDesignator | variableReference )
+functionCall
+ : identifier (actualParameterList)?
+ ;
+
+actualParameterList
+ : LPAREN! ( expressions )? RPAREN!
+ ;
+
+expressions
+ : expression ( COMMA! expression )*
+ ;
+
+setConstructor
+ : LBRACK! ( setGroup ( COMMA! setGroup )* )? RBRACK!
+ ;
+
+setGroup
+ : expression ( DOT! DOT! expression )?
+ ;
+
+valueTypecast
+ : typeIdentifier LPAREN! expression RPAREN!
+ ;
+
+//( variableReference | procedureIdentifier | functionIdentifier | qualifiedMethodIdentifier )
+addressFactor
+ : AT! identifier
+ ;
+
+statement
+// : (label COLON!)? (simpleStatement | structuredStatement | asmStatement)
+ : (label COLON!)? (simpleStatement | structuredStatement)
+ ;
+
+simpleStatement
+ : assignmentStatement | procedureStatement | gotoStatement | raiseStatement
+ ;
+
+assignmentStatement
+ : identifierOrArrayIdentifier assignmentOperator expression
+ ;
+
+identifierOrArrayIdentifier
+ : identifier
+// | (qualifiedMethodIdentifier LBRACK!)=> qualifiedMethodIdentifier LBRACK! arrayIndexType ( COMMA! arrayIndexType )* RBRACK!
+// | qualifiedMethodIdentifier
+ | identifier LBRACK! expression ( COMMA! expression )* RBRACK!
+ ;
+
+assignmentOperator
+ : ASSIGN! | PLUSEQ | MINUSEQ | STAREQ | SLASHQE
+ ;
+
+procedureStatement
+ : identifier (actualParameterList)?
+ ;
+
+gotoStatement
+ : GOTO! label
+ ;
+
+structuredStatement
+ : compoundStatement | repetitiveStatement | conditionalStatement | exceptionStatement | withStatement
+ ;
+
+conditionalStatement
+ : ifStatement | caseStatement
+ ;
+
+repetitiveStatement
+ : forStatement | repeatStatement | whileStatement
+ ;
+
+compoundStatement
+ : BEGIN! END!
+ | BEGIN! (SEMI!)+ END!
+ | BEGIN! statement (SEMI! (statement)?)* END!
+ ;
+
+ifStatement
+ : IF^ expression THEN! statement
+ (
+ // CONFLICT: the old "dangling-else" problem...
+ // ANTLR generates proper code matching
+ // as soon as possible. Hush warning.
+ options {
+ generateAmbigWarnings=false;
+ }
+ : ELSE! statement
+ )?
+ ;
+
+caseStatement
+ : CASE^ expression OF!
+ caseListElement ( SEMI! caseListElement )*
+ ( SEMI! ELSE! statement ( SEMI! statement )* )?
+ END!
+ ;
+
+caseListElement
+ : constList COLON^ statement
+ ;
+
+constList
+ : constant ( COMMA! constant )*
+ {#constList = #([CONSTLIST],#constList);}
+ ;
+
+whileStatement
+ : WHILE^ expression DO! statement
+ ;
+
+repeatStatement
+ : REPEAT^ statement ( SEMI! (statement)? )* UNTIL! expression
+ ;
+
+forStatement
+ : FOR^ identifier ASSIGN! forList DO! statement
+ ;
+
+forList
+ : initialValue (TO^ | DOWNTO^) finalValue
+ ;
+
+initialValue
+ : expression
+ ;
+
+finalValue
+ : expression
+ ;
+
+withStatement
+ : WITH^ recordVariableList DO! statement
+ ;
+
+recordVariableList
+ : variable ( COMMA! variable )*
+ ;
+
+/** A variable is an id with a suffix and can look like:
+ * id
+ * id[expr,...]
+ * id.id
+ * id.id[expr,...]
+ * id^
+ * id^.id
+ * id^.id[expr,...]
+ * ...
+ *
+ * LL has a really hard time with this construct as it's naturally
+ * left-recursive. We have to turn into a simple loop rather than
+ * recursive loop, hence, the suffixes. I keep in the same rule
+ * for easy tree construction.
+ */
+variable
+ : ( AT^ identifier // AT is root of identifier; then other op becomes root
+ | identifier
+ )
+ ( LBRACK^ expression ( COMMA! expression)* RBRACK!
+ | LBRACK2^ expression ( COMMA! expression)* RBRACK2!
+ | DOT^ identifier
+ | POINTER^
+ )*
+ ;
+
+/*asmStatement
+ : ASM^ assemblerCode END! (registerList)?
+ ;
+
+registerList
+ : LBRACK! stringConstant ( COMMA! stringConstant )*
+ ;
+
+assemblerCode
+ : (.)*
+ ;
+*/
+operatorDefinition
+ : OPERATOR^ ( assignmentOperatorDefinition | arithmeticOperatorDefinition | comparisonOperatorDefinition )
+ identifier COLON! type SEMI! subroutineBlock
+ ;
+
+assignmentOperatorDefinition
+ : ASSIGN! LPAREN! valueParameter RPAREN!
+ ;
+
+arithmeticOperatorDefinition
+ : ( PLUS! | MINUS! | STAR! | SLASH! | (STAR! STAR!) ) LPAREN! formalParameterList RPAREN!
+ ;
+
+comparisonOperatorDefinition
+ : ( EQUAL! | LE! | GE! | GT! | LTH! ) LPAREN! formalParameterList RPAREN!
+ ;
+
+raiseStatement
+ : RAISE^ ( functionCall (AT! addressConstant)? )?
+ ;
+
+exceptionStatement
+ : tryStatement
+ ;
+
+tryStatement
+ : TRY^ (statements)? exceptOrFinallyPart END!
+ ;
+
+exceptOrFinallyPart
+ : EXCEPT! (exceptionHandlers)?
+ | FINALLY! (statements)?
+ ;
+
+statements
+ : statement ( SEMI! statement )*
+ ;
+
+exceptionHandlers
+ : statements | exceptionHandler ( SEMI! exceptionHandler )* ( ELSE! statements )?
+ ;
+
+exceptionHandler
+ : ON! (identifier COLON!)? identifier DO! statement
+ ;
+
+identifierList
+ : identifier ( COMMA! identifier )*
+ {#identifierList = #(#[IDLIST],#identifierList);}
+ ;
+
+label
+ : unsignedInteger
+ ;
+
+unsignedInteger
+ : NUM_INT
+ ;
+
+integerConstant
+ : unsignedInteger
+ |! s:sign n:unsignedInteger { #integerConstant=#(s,n); }
+ ;
+
+stringConstant
+ : string | constantChr
+ ;
+
+sign
+ : PLUS | MINUS
+ ;
+
+string
+ : STRING_LITERAL
+ ;
+
+constantChr
+ : CHR^ LPAREN! unsignedInteger RPAREN!
+ ;
+
+constant
+ : unsignedNumber
+ |! s:sign n:unsignedNumber { #constant=#(s,n); }
+ | identifier
+ |! s2:sign id:identifier { #constant=#(s2,id); }
+ | string
+ | constantChr
+ ;
+
+unsignedConstant
+ : unsignedNumber | constantChr | string | NIL!
+ ;
+
+unsignedNumber
+ : unsignedInteger
+ | unsignedReal
+ ;
+
+unsignedReal
+ : NUM_REAL
+ ;
+
+identifier
+ : IDENT
+ ;
+
+
+//----------------------------------------------------------------------------
+// The Pascal scanner
+//----------------------------------------------------------------------------
+class PascalLexer extends Lexer;
+
+options {
+ charVocabulary = '\0'..'\377';
+ exportVocab = Pascal; // call the vocabulary "Pascal"
+ testLiterals = false; // don't automatically test for literals
+ k = 4; // four characters of lookahead
+ caseSensitive = false;
+ caseSensitiveLiterals = false;
+ defaultErrorHandler=false;
+}
+
+tokens {
+ ABSOLUTE = "absolute" ;
+ ABSTRACT = "abstract" ;
+ ALIAS = "alias" ;
+ AND = "and" ;
+ ARRAY = "array" ;
+ AS = "as" ;
+ ASM = "asm" ;
+ ASSEMBLER = "assembler" ;
+ BEGIN = "begin" ;
+ BREAK = "break" ;
+ BOOLEAN = "boolean" ;
+ BYTE = "byte" ;
+ CARDINAL = "cardinal" ;
+ CASE = "case" ;
+ CDECL = "cdecl" ;
+ CHAR = "char" ;
+ CHR = "chr" ;
+ CLASS = "class" ;
+ COMP = "comp" ;
+ CONST = "const" ;
+ CONSTRUCTOR = "constructor" ;
+ CONTINUE = "continue" ;
+ DEFAULT = "default" ;
+ DESTRUCTOR = "destructor" ;
+ DISPOSE = "dispose" ;
+ DIV = "div" ;
+ DO = "do" ;
+ DOUBLE = "double" ;
+ DOWNTO = "downto" ;
+ ELSE = "else" ;
+ END = "end" ;
+ EXCEPT = "except" ;
+ EXPORT = "export" ;
+ EXPORTS = "exports" ;
+ EXTENDED = "extended" ;
+ EXTERNAL = "external" ;
+ EXIT = "exit" ;
+ FALSE = "false" ;
+ FILE = "file" ;
+ FINALLY = "finally" ;
+ FAR = "far" ;
+ FOR = "for" ;
+ FORWARD = "forward" ;
+ FUNCTION = "function" ;
+ GOTO = "goto" ;
+ IF = "if" ;
+ IN = "in" ;
+// INDEX = "index" ;
+ IS = "is" ;
+ INHERITED = "inherited" ;
+ INLINE = "inline" ;
+ INT64 = "int64" ;
+ INTEGER = "integer" ;
+ LABEL = "label" ;
+ LIBRARY = "library" ;
+ LONGINT = "longint" ;
+ MOD = "mod" ;
+// NAME = "name" ;
+ NEAR = "near" ;
+ NEW = "new" ;
+ NIL = "nil" ;
+ NOT = "not" ;
+ OBJECT = "object" ;
+ OF = "of" ;
+ ON = "on" ;
+ OPERATOR = "operator" ;
+ OR = "or" ;
+ OVERRIDE = "override" ;
+ PACKED = "packed" ;
+ PASCAL = "pascal" ;
+ POPSTACK = "popstack" ;
+ PRIVATE = "private" ;
+ PROCEDURE = "procedure" ;
+ PROTECTED = "protected" ;
+ PROGRAM = "program" ;
+ PROPERTY = "property" ;
+ PUBLIC = "public" ;
+ PUBLISHED = "published" ;
+ QWORD = "qword" ;
+ RAISE = "raise" ;
+ REAL = "real" ;
+ RECORD = "record" ;
+ REGISTER = "register" ;
+ REPEAT = "repeat" ;
+ SAFECALL = "safecall" ;
+ SAVEREGISTERS = "saveregisters" ;
+ SELF = "self" ;
+ SET = "set" ;
+ SHORTINT = "shortint" ;
+ SHR = "shr" ;
+ SHL = "shl" ;
+ SINGLE = "single" ;
+ SMALLINT = "smallint" ;
+ STDCALL = "stdcall" ;
+ THEN = "then" ;
+ TO = "to" ;
+ TRUE = "true" ;
+ TRY = "try" ;
+ TYPE = "type" ;
+ UNTIL = "until" ;
+ VAR = "var" ;
+ VIRTUAL = "virtual" ;
+ WHILE = "while" ;
+ WITH = "with" ;
+ WORD = "word" ;
+ XOR = "xor" ;
+ METHOD ;
+ ADDSUBOR ;
+ ASSIGNEQUAL ;
+ SIGN ;
+ FUNC ;
+ NODE_NOT_EMIT ;
+ MYASTVAR ;
+ LF ;
+ UNIT = "unit" ;
+ INTERFACE = "interface" ;
+ USES = "uses" ;
+ STRING = "string" ;
+ IMPLEMENTATION = "implementation" ;
+ FINALIZATION = "finalization" ;
+ INITIALIZATION = "initialization" ;
+ RESOURCESTRING = "resourcestring" ;
+//pspsps ???
+}
+
+{
+private:
+ ProblemReporter* m_problemReporter;
+ unsigned int m_numberOfErrors;
+
+public:
+ void resetErrors() { m_numberOfErrors = 0; }
+ unsigned int numberOfErrors() const { return m_numberOfErrors; }
+ void setProblemReporter( ProblemReporter* r ) { m_problemReporter = r; }
+
+ virtual void reportError( const ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex ){
+ m_problemReporter->reportError( ex.getMessage().c_str(),
+ ex.getFilename().c_str(),
+ ex.getLine(),
+ ex.getColumn() );
+ ++m_numberOfErrors;
+ }
+
+ virtual void reportError( const ANTLR_USE_NAMESPACE(std)string& errorMessage ){
+ m_problemReporter->reportError( errorMessage.c_str(),
+ getFilename().c_str(),
+ getLine(), getColumn() );
+ ++m_numberOfErrors;
+ }
+
+ virtual void reportWarning( const ANTLR_USE_NAMESPACE(std)string& warnMessage ){
+ m_problemReporter->reportWarning( warnMessage.c_str(),
+ getFilename().c_str(),
+ getLine(), getColumn() );
+ }
+}
+
+//----------------------------------------------------------------------------
+// OPERATORS
+//----------------------------------------------------------------------------
+PLUS : '+' ;
+MINUS : '-' ;
+STAR : '*' ;
+SLASH : '/' ;
+ASSIGN : ":=" ;
+COMMA : ',' ;
+SEMI : ';' ;
+COLON : ':' ;
+EQUAL : '=' ;
+NOT_EQUAL : "<>" ;
+LTH : '<' ;
+LE : "<=" ;
+GE : ">=" ;
+GT : '>' ;
+LPAREN : '(' ;
+RPAREN : ')' ;
+LBRACK : '[' ; // line_tab[line]
+LBRACK2 : "(." ; // line_tab(.line.)
+RBRACK : ']' ;
+RBRACK2 : ".)" ;
+POINTER : '^' ;
+AT : '@' ;
+DOT : '.' ('.' {$setType(DOTDOT);})? ;
+LCURLY : "{" ;
+RCURLY : "}" ;
+PLUSEQ : "+=" ;
+MINUSEQ : "-=" ;
+STAREQ : "*=" ;
+SLASHQE : "/=" ;
+
+
+// Whitespace -- ignored
+WS : ( ' '
+ | '\t'
+ | '\f'
+ // handle newlines
+ | ( "\r\n" // Evil DOS
+ | '\r' // Macintosh
+ | '\n' // Unix (the right way)
+ )
+ { newline(); }
+ )
+ { _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP; }
+ ;
+
+
+COMMENT_1
+ : "(*"
+ ( options { generateAmbigWarnings=false; }
+ : { LA(2) != ')' }? '*'
+ | '\r' '\n' {newline();}
+ | '\r' {newline();}
+ | '\n' {newline();}
+ | ~('*' | '\n' | '\r')
+ )*
+ "*)"
+ {$setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP);}
+ ;
+
+COMMENT_2
+ : '{'
+ ( options {generateAmbigWarnings=false;}
+ : '\r' '\n' {newline();}
+ | '\r' {newline();}
+ | '\n' {newline();}
+ | ~('}' | '\n' | '\r')
+ )*
+ '}'
+ {$setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP);}
+ ;
+
+COMMENT_3
+ : "//" (~'\n')* '\n'
+ {$setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP);}
+ ;
+
+// an identifier. Note that testLiterals is set to true! This means
+// that after we match the rule, we look in the literals table to see
+// if it's a literal or really an identifer
+IDENT
+ options {testLiterals=true;}
+ : ('a'..'z') ('a'..'z'|'0'..'9'|'_')* //pspsps
+ ;
+
+// string literals
+STRING_LITERAL
+ : '\'' ("\'\'" | ~('\''))* '\'' //pspsps * in stead of + because of e.g. ''
+ ;
+
+/** a numeric literal. Form is (from Wirth)
+ * digits
+ * digits . digits
+ * digits . digits exponent
+ * digits exponent
+ */
+NUM_INT
+ : ('0'..'9')+ // everything starts with a digit sequence
+ ( ( {(LA(2)!='.')&&(LA(2)!=')')}? // force k=2; avoid ".."
+//PSPSPS example ARRAY (.1..99.) OF char; // after .. thinks it's a NUM_REAL
+ '.' {$setType(NUM_REAL);} // dot means we are float
+ ('0'..'9')+ (EXPONENT)?
+ )?
+ | EXPONENT {$setType(NUM_REAL);} // 'E' means we are float
+ )
+ ;
+
+// a couple protected methods to assist in matching floating point numbers
+protected
+EXPONENT
+ : ('e') ('+'|'-')? ('0'..'9')+
+ ;
diff --git a/languages/pascal/pascal.tree.g b/languages/pascal/pascal.tree.g
new file mode 100644
index 00000000..c597afb8
--- /dev/null
+++ b/languages/pascal/pascal.tree.g
@@ -0,0 +1,468 @@
+//
+// Pascal Tree Super Grammar (symtab.g derives from this)
+//
+// Adapted from,
+// Pascal User Manual And Report (Second Edition-1978)
+// Kathleen Jensen - Niklaus Wirth
+//
+// By
+//
+// Hakki Dogusan dogusanh@tr-net.net.tr
+//
+// Then significantly enhanced by Piet Schoutteten
+// with some guidance by Terence Parr. Piet added tree
+// construction, and some tree walkers.
+//
+//
+// Adopted to KDevelop by Alexander Dymo <cloudtemple@mksat.net>
+//
+
+header "pre_include_hpp" {
+ #include <codemodel.h>
+ #include "PascalAST.hpp"
+
+ #include <qstring.h>
+ #include <qstringlist.h>
+ #include <qfileinfo.h>
+}
+
+header "post_include_hpp" {
+ #include <codemodel.h>
+ #include <kdebug.h>
+}
+
+options {
+ language="Cpp";
+}
+
+
+class PascalStoreWalker extends TreeParser;
+
+options {
+ importVocab = Pascal;
+ defaultErrorHandler = true;
+ ASTLabelType = "RefPascalAST";
+}
+
+{
+private:
+ QString m_fileName;
+ QStringList m_currentScope;
+ int m_currentAccess;
+ int m_anon;
+ CodeModel* m_model;
+
+public:
+ void setCodeModel( CodeModel* model ) { m_model = model; }
+ CodeModel* codeModel() { return m_model; }
+ const CodeModel* codeModel() const { return m_model; }
+
+ QString fileName() const { return m_fileName; }
+ void setFileName( const QString& fileName ) { m_fileName = fileName; }
+
+ void init(){
+ m_currentScope.clear();
+ m_currentAccess = CodeModelItem::Public;
+ m_anon = 0;
+ }
+
+ void wipeout() { m_model->wipeout(); }
+}
+
+program
+ : programHeading
+ block
+ ;
+
+programHeading
+ : #(PROGRAM IDENT identifierList)
+ | #(UNIT IDENT)
+ ;
+
+identifier
+ : IDENT
+ ;
+
+block
+ : ( labelDeclarationPart
+ | constantDefinitionPart
+ | typeDefinitionPart
+ | variableDeclarationPart
+ | procedureAndFunctionDeclarationPart
+ | usesUnitsPart
+ | IMPLEMENTATION
+ )*
+ compoundStatement
+ ;
+
+usesUnitsPart
+ : #(USES identifierList)
+ ;
+
+labelDeclarationPart
+ : #(LABEL ( label )+)
+ ;
+
+label
+ : NUM_INT
+ ;
+
+constantDefinitionPart
+ : #(CONST ( constantDefinition )+ )
+ ;
+
+constantDefinition
+ : #(EQUAL IDENT constant)
+ ;
+
+constant
+ : NUM_INT
+ | NUM_REAL
+ | #( PLUS
+ ( NUM_INT
+ | NUM_REAL
+ | IDENT
+ )
+ )
+ | #( MINUS
+ ( NUM_INT
+ | NUM_REAL
+ | IDENT
+ )
+ )
+ | IDENT
+ | STRING_LITERAL
+ | #(CHR (NUM_INT|NUM_REAL))
+ ;
+
+string
+ : STRING_LITERAL
+ ;
+
+typeDefinitionPart
+ : #(TYPE ( typeDefinition )+)
+ ;
+
+typeDefinition
+ : #(TYPEDECL IDENT
+ ( type
+ | #(FUNCTION (formalParameterList)? resultType)
+ | #(PROCEDURE (formalParameterList)?)
+ )
+ )
+ ;
+
+type
+ : #(SCALARTYPE identifierList)
+ | #(DOTDOT constant constant)
+ | typeIdentifier
+ | structuredType
+ | #(POINTER typeIdentifier)
+ ;
+
+typeIdentifier
+ : IDENT
+ | CHAR
+ | BOOLEAN
+ | INTEGER
+ | REAL
+ | #( STRING
+ ( IDENT
+ | NUM_INT
+ | NUM_REAL
+ |
+ )
+ )
+ ;
+
+structuredType
+ : #(PACKED unpackedStructuredType)
+ | unpackedStructuredType
+ ;
+
+unpackedStructuredType
+ : arrayType
+ | recordType
+ | setType
+ | fileType
+ ;
+
+/** Note here that the syntactic diff between brackets disappears.
+ * If the brackets mean different things semantically, we need
+ * two different alternatives here.
+ */
+arrayType
+ : #(ARRAY typeList type)
+ ;
+
+typeList
+ : #( TYPELIST ( type )+ )
+ ;
+
+recordType
+ : #(RECORD fieldList)
+ ;
+
+fieldList
+ : #( FIELDLIST
+ ( fixedPart ( variantPart )?
+ | variantPart
+ )
+ )
+ ;
+
+fixedPart
+ : ( recordSection )+
+ ;
+
+recordSection
+ : #(FIELD identifierList type)
+ ;
+
+variantPart
+ : #( CASE tag ( variant )+ )
+ ;
+
+tag
+ : #(VARIANT_TAG identifier typeIdentifier)
+ | #(VARIANT_TAG_NO_ID typeIdentifier)
+ ;
+
+variant
+ : #(VARIANT_CASE constList fieldList)
+ ;
+
+setType
+ : #(SET type)
+ ;
+
+fileType
+ : #(FILE (type)?)
+ ;
+
+/** Yields a list of VARDECL-rooted subtrees with VAR at the overall root */
+variableDeclarationPart
+ : #( VAR ( variableDeclaration )+ )
+ ;
+
+variableDeclaration
+ : #(VARDECL identifierList type)
+ ;
+
+procedureAndFunctionDeclarationPart
+ : procedureOrFunctionDeclaration
+ ;
+
+procedureOrFunctionDeclaration
+ : procedureDeclaration
+ | functionDeclaration
+ ;
+
+procedureDeclaration
+ : #(PROCEDURE IDENT (formalParameterList)? block )
+ ;
+
+formalParameterList
+ : #(ARGDECLS ( formalParameterSection )+)
+ ;
+
+formalParameterSection
+ : parameterGroup
+ | #(VAR parameterGroup)
+ | #(FUNCTION parameterGroup)
+ | #(PROCEDURE parameterGroup)
+ ;
+
+parameterGroup
+ : #(ARGDECL identifierList typeIdentifier)
+ ;
+
+identifierList
+ : #(IDLIST (IDENT)+)
+ ;
+
+constList
+ : #(CONSTLIST ( constant )+)
+ ;
+
+functionDeclaration
+ : #(FUNCTION IDENT (formalParameterList)? resultType block)
+ ;
+
+resultType
+ : typeIdentifier
+ ;
+
+statement
+ : #(COLON label unlabelledStatement)
+ | unlabelledStatement
+ ;
+
+unlabelledStatement
+ : simpleStatement
+ | structuredStatement
+ ;
+
+simpleStatement
+ : assignmentStatement
+ | procedureStatement
+ | gotoStatement
+ ;
+
+assignmentStatement
+ : #(ASSIGN variable expression)
+ ;
+
+/** A variable is an id with a suffix and can look like:
+ * id
+ * id[expr,...]
+ * id.id
+ * id.id[expr,...]
+ * id^
+ * id^.id
+ * id^.id[expr,...]
+ * ...
+ *
+ * LL has a really hard time with this construct as it's naturally
+ * left-recursive. We have to turn into a simple loop rather than
+ * recursive loop, hence, the suffixes. I keep in the same rule
+ * for easy tree construction.
+ */
+variable
+ : #(LBRACK variable (expression)+)
+ | #(LBRACK2 variable (expression)+)
+ | #(DOT variable IDENT)
+ | #(POINTER variable)
+ | #(AT IDENT)
+ | IDENT
+ ;
+
+expression
+ : #(EQUAL expression expression)
+ | #(NOT_EQUAL expression expression)
+ | #(LTH expression expression)
+ | #(LE expression expression)
+ | #(GE expression expression)
+ | #(GT expression expression)
+ | #(IN expression expression)
+ | #(PLUS expression (expression)?)
+ | #(MINUS expression (expression)?)
+ | #(OR expression expression)
+ | #(STAR expression expression)
+ | #(SLASH expression expression)
+ | #(DIV expression expression)
+ | #(MOD expression expression)
+ | #(AND expression expression)
+ | #(NOT expression)
+ | variable
+ | functionDesignator
+ | set
+ | NUM_INT
+ | NUM_REAL
+ | #(CHR (NUM_INT|NUM_REAL))
+ | string
+ | NIL
+ ;
+
+functionDesignator
+ : #(FUNC_CALL IDENT (parameterList)?)
+ ;
+
+parameterList
+ : #( ARGLIST (actualParameter)+ )
+ ;
+
+set
+ : #(SET (element)*)
+ ;
+
+element
+ : #(DOTDOT expression expression)
+ | expression
+ ;
+
+procedureStatement
+ : #(PROC_CALL IDENT ( parameterList )?)
+ ;
+
+actualParameter
+ : expression
+ ;
+
+gotoStatement
+ : #(GOTO label)
+ ;
+
+structuredStatement
+ : compoundStatement
+ | conditionalStatement
+ | repetetiveStatement
+ | withStatement
+ ;
+
+compoundStatement
+ : statements
+ ;
+
+statements
+ : #(BLOCK (statement)*)
+ ;
+
+conditionalStatement
+ : ifStatement
+ | caseStatement
+ ;
+
+ifStatement
+ : #(IF expression statement (statement)?)
+ ;
+
+caseStatement //pspsps ???
+ : #(CASE expression
+ ( caseListElement )+
+ ( statements )?
+ )
+ ;
+
+caseListElement
+ : #(COLON constList statement)
+ ;
+
+repetetiveStatement
+ : whileStatement
+ | repeatStatement
+ | forStatement
+ ;
+
+whileStatement
+ : #(WHILE expression statement)
+ ;
+
+repeatStatement
+ : #(REPEAT statements expression)
+ ;
+
+forStatement
+ : #(FOR IDENT forList statement)
+ ;
+
+forList
+ : #(TO initialValue finalValue)
+ | #(DOWNTO initialValue finalValue)
+ ;
+
+initialValue
+ : expression
+ ;
+
+finalValue
+ : expression
+ ;
+
+withStatement
+ : #(WITH recordVariableList statement)
+ ;
+
+recordVariableList
+ : ( variable )+
+ ;
diff --git a/languages/pascal/pascalsupport_part.cpp b/languages/pascal/pascalsupport_part.cpp
new file mode 100644
index 00000000..0c5f96f2
--- /dev/null
+++ b/languages/pascal/pascalsupport_part.cpp
@@ -0,0 +1,323 @@
+/***************************************************************************
+ * Copyright (C) 2003 Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ ***************************************************************************/
+#include <fstream>
+
+#include <qdir.h>
+#include <qtimer.h>
+#include <qwhatsthis.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kdevgenericfactory.h>
+#include <kdebug.h>
+#include <kapplication.h>
+#include <kstatusbar.h>
+
+#include <antlr/ASTFactory.hpp>
+
+#include "catalog.h"
+#include <kdevcore.h>
+#include <kdevmainwindow.h>
+#include <kdevpartcontroller.h>
+#include <kdevproject.h>
+#include <kdevplugininfo.h>
+
+#include "pascalsupport_part.h"
+#include "problemreporter.h"
+#include "PascalLexer.hpp"
+#include "PascalParser.hpp"
+#include "PascalStoreWalker.hpp"
+
+struct PascalSupportPartData{
+ ProblemReporter* problemReporter;
+
+ PascalSupportPartData()
+ : problemReporter( 0 )
+ {}
+};
+
+typedef KDevGenericFactory<PascalSupportPart> PascalSupportFactory;
+static const KDevPluginInfo data("kdevpascalsupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevpascalsupport, PascalSupportFactory( data ) )
+
+PascalSupportPart::PascalSupportPart(QObject *parent, const char *name, const QStringList &)
+ : KDevLanguageSupport(&data, parent, name ? name : "KDevPascalSupport" ),
+ d( new PascalSupportPartData() )
+{
+ setInstance(PascalSupportFactory::instance());
+ setXMLFile("kdevpascalsupport.rc");
+
+ d->problemReporter = new ProblemReporter( this );
+ connect( core(), SIGNAL(configWidget(KDialogBase*)),
+ d->problemReporter, SLOT(configWidget(KDialogBase*)) );
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+ connect( core(), SIGNAL(configWidget(KDialogBase*)),
+ this, SLOT(configWidget(KDialogBase*)) );
+ connect( core( ), SIGNAL( projectConfigWidget( KDialogBase* ) ), this,
+ SLOT( projectConfigWidget( KDialogBase* ) ) );
+
+ mainWindow()->embedOutputView( d->problemReporter, i18n("Problems"), i18n("problem reporter") );
+ QWhatsThis::add(d->problemReporter, i18n("<b>Problem reporter</b><p>This window shows various \"problems\" in your project. "
+ "It displays errors reported by a language parser."));
+}
+
+PascalSupportPart::~PascalSupportPart()
+{
+ mainWindow()->removeView( d->problemReporter );
+ delete( d->problemReporter );
+
+ delete( d );
+}
+
+PascalSupportPart::Features PascalSupportPart::features()
+{
+ return Features(Classes | Structs | Functions | Variables | Declarations);
+}
+
+void PascalSupportPart::projectOpened()
+{
+ connect(project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)));
+ connect(project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)));
+ connect(project(), SIGNAL(projectCompiled()),
+ this, SLOT(slotProjectCompiled()) );
+
+ m_projectFileList = project()->allFiles();
+ m_projectClosed = false;
+
+ QTimer::singleShot(0, this, SLOT(initialParse()));
+}
+
+void PascalSupportPart::projectClosed()
+{
+ m_projectClosed = true;
+}
+
+void PascalSupportPart::configWidget(KDialogBase *dlg)
+{
+ Q_UNUSED( dlg );
+ return;
+}
+
+void PascalSupportPart::projectConfigWidget(KDialogBase *dlg)
+{
+ Q_UNUSED( dlg );
+ return;
+}
+
+void PascalSupportPart::contextMenu(QPopupMenu *popup, const Context *context)
+{
+ Q_UNUSED( popup );
+ Q_UNUSED( context );
+ return;
+}
+
+void PascalSupportPart::savedFile(const KURL &fileName)
+{
+ maybeParse(fileName.path());
+ emit updatedSourceInfo();
+}
+
+void PascalSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ for (QStringList::ConstIterator it = fileList.begin(); it != fileList.end() ;++it)
+ {
+ QString fn = project()->projectDirectory() + "/" + *it;
+ maybeParse( fn );
+ kapp->processEvents( 500 );
+ emit addedSourceInfo(fn);
+ }
+}
+
+void PascalSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ for (QStringList::ConstIterator it = fileList.begin(); it != fileList.end() ;++it)
+ {
+ QString fn = project()->projectDirectory() + "/" + *it;
+
+ emit aboutToRemoveSourceInfo(fn);
+ codeModel()->removeFile( codeModel()->fileByName(fn) );
+ }
+}
+
+void PascalSupportPart::slotProjectCompiled()
+{
+ return;
+}
+
+void PascalSupportPart::initialParse( )
+{
+ kdDebug(9013) << "------------------------------------------> initialParse()" << endl;
+
+ if (project())
+ {
+ kapp->setOverrideCursor(waitCursor);
+
+ /// @todo Progress indicator!
+
+ QStringList files = project()->allFiles();
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it){
+ QString fn = project()->projectDirectory() + "/" + *it;
+ maybeParse( fn );
+ kapp->processEvents( 500 );
+ }
+
+ emit updatedSourceInfo();
+
+ kapp->restoreOverrideCursor();
+ mainWindow()->statusBar()->message( i18n("Found 1 problem", "Found %n problems", d->problemReporter->childCount()) );
+ }
+}
+
+void PascalSupportPart::maybeParse( const QString & fileName )
+{
+ kdDebug(9013) << "Maybe parse: " << fileName << endl;
+
+ KMimeType::Ptr mime = KMimeType::findByURL( KURL( fileName ) );
+ if( !mime || mime->name() != "text/x-pascal" )
+ return;
+
+ mainWindow()->statusBar()->message( i18n("Parsing file: %1").arg(fileName) );
+ parse( fileName );
+}
+
+void PascalSupportPart::parse( const QString & fileName )
+{
+ kdDebug(9013) << "PascalSupportPart::parse() -- " << fileName << endl;
+
+ std::ifstream stream( QFile::encodeName( fileName ).data() );
+ QCString _fn = fileName.utf8();
+ std::string fn( _fn.data() );
+
+ PascalLexer lexer( stream );
+ lexer.setFilename( fn );
+ lexer.setProblemReporter( d->problemReporter );
+
+ PascalParser parser( lexer );
+ parser.setFilename( fn );
+ parser.setProblemReporter( d->problemReporter );
+
+ try{
+ antlr::ASTFactory my_factory( "PascalAST", PascalAST::factory );
+ parser.initializeASTFactory(my_factory);
+ parser.setASTFactory( &my_factory );
+
+ lexer.resetErrors();
+ parser.resetErrors();
+
+ parser.compilationUnit();
+ int errors = lexer.numberOfErrors() + parser.numberOfErrors();
+ RefPascalAST ast = RefPascalAST( parser.getAST() );
+
+ if( errors == 0 && ast != antlr::nullAST ){
+ kdDebug(9013) << "-------------------> start StoreWalker" << endl;
+/* PascalStoreWalker walker;
+ walker.setFileName( fileName );
+ walker.setCodeModel( codeModel() );
+ walker.compilationUnit( ast );*/
+ }
+
+ } catch( antlr::ANTLRException& ex ){
+ kdDebug() << "*exception*: " << ex.toString().c_str() << endl;
+ d->problemReporter->reportError( ex.getMessage().c_str(),
+ fileName,
+ lexer.getLine(),
+ lexer.getColumn() );
+ }
+}
+
+KMimeType::List PascalSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "text/x-pascal" );
+ if( mime )
+ list << mime;
+ return list;
+}
+
+QString PascalSupportPart::formatTag( const Tag & inputTag )
+{
+ Tag tag = inputTag;
+
+ switch( tag.kind() )
+ {
+ case Tag::Kind_Namespace:
+ return QString::fromLatin1("unit ") + tag.name();
+
+ case Tag::Kind_Class:
+ return QString::fromLatin1("class ") + tag.name();
+
+ case Tag::Kind_Function:
+ case Tag::Kind_FunctionDeclaration:
+ {
+ return tag.name() + "()";
+ }
+ break;
+
+ case Tag::Kind_Variable:
+ case Tag::Kind_VariableDeclaration:
+ {
+ return QString::fromLatin1("var ") + tag.name();
+ }
+ break;
+ }
+ return tag.name();
+}
+
+QString PascalSupportPart::formatModelItem( const CodeModelItem * item, bool shortDescription )
+{
+ if (item->isFunction() || item->isFunctionDefinition() )
+ {
+ const FunctionModel *model = static_cast<const FunctionModel*>(item);
+ QString function;
+ QString args;
+ ArgumentList argumentList = model->argumentList();
+ for (ArgumentList::const_iterator it = argumentList.begin(); it != argumentList.end(); ++it)
+ {
+ args.isEmpty() ? args += "" : args += ", " ;
+ args += formatModelItem((*it).data());
+ }
+
+ function += model->name() + "(" + args + ")";
+
+ if( !shortDescription )
+ function += (model->isVirtual() ? QString("virtual; ") : QString("") ) + model->resultType() + " ";
+
+ return function;
+ }
+ else if (item->isVariable())
+ {
+ const VariableModel *model = static_cast<const VariableModel*>(item);
+ if( shortDescription )
+ return model->name();
+ return model->name() + ": " + model->type();
+ }
+ else if (item->isArgument())
+ {
+ const ArgumentModel *model = static_cast<const ArgumentModel*>(item);
+ QString arg;
+ arg += model->name();
+ arg += ": " + model->type();
+ if( !shortDescription )
+ arg += model->defaultValue().isEmpty() ? QString("") : QString(" = ") + model->defaultValue();
+ return arg.stripWhiteSpace();
+ }
+ else
+ return KDevLanguageSupport::formatModelItem( item, shortDescription );
+}
+
+#include "pascalsupport_part.moc"
diff --git a/languages/pascal/pascalsupport_part.h b/languages/pascal/pascalsupport_part.h
new file mode 100644
index 00000000..4319d1f9
--- /dev/null
+++ b/languages/pascal/pascalsupport_part.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * Copyright (C) 2003 Alexander Dymo *
+ * cloudtemple@mksat.net *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifndef __KDEVPART_PASCALSUPPORT_H__
+#define __KDEVPART_PASCALSUPPORT_H__
+
+#include <qguardedptr.h>
+#include "kdevlanguagesupport.h"
+
+class PascalSupportWidget;
+class KDialogBase;
+class QPopupMenu;
+class Context;
+class PascalSupportPartData;
+
+class PascalSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+public:
+ PascalSupportPart(QObject *parent, const char *name, const QStringList &);
+ ~PascalSupportPart();
+
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+ virtual QString formatTag( const Tag& tag );
+ virtual QString formatModelItem( const CodeModelItem *item, bool shortDescription=false );
+
+private slots:
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void configWidget(KDialogBase *dlg);
+ void projectConfigWidget(KDialogBase *dlg);
+ void contextMenu(QPopupMenu *popup, const Context *context);
+
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void slotProjectCompiled();
+
+ void initialParse();
+
+private:
+ void maybeParse(const QString &fileName);
+ void parse(const QString &fileName);
+
+ QGuardedPtr<PascalSupportWidget> m_widget;
+
+ bool m_projectClosed;
+ QStringList m_projectFileList;
+
+ PascalSupportPartData* d;
+
+};
+
+#endif
diff --git a/languages/pascal/pascaltemplates b/languages/pascal/pascaltemplates
new file mode 100644
index 00000000..771f7cca
--- /dev/null
+++ b/languages/pascal/pascaltemplates
@@ -0,0 +1,30 @@
+<!DOCTYPE Templates>
+<Templates>
+ <Template code="if ( | ) then
+begin
+end
+else
+begin
+end;" name="ife" description="if else" suffixes="Pascal (p,pp,pas,dpr)"/>
+ <Template code="while ( | ) do
+begin
+end;" name="whileb" description="while statement" suffixes="Pascal (p,pp,pas,dpr)"/>
+ <Template code="private|" name="pr" description="private" suffixes="Pascal (p,pp,pas,dpr)"/>
+ <Template code="public|" name="pu" description="public" suffixes="Pascal (p,pp,pas,dpr)"/>
+ <Template code="case ( | ) of
+end;" name="caseb" description="case statement" suffixes="Pascal (p,pp,pas,dpr)"/>
+ <Template code="protected|" name="pro" description="protected" suffixes="Pascal (p,pp,pas,dpr)"/>
+ <Template code="for | := to do
+begin
+end;" name="forb" description="for statement" suffixes="Pascal (p,pp,pas,dpr)"/>
+ <Template code="|= class()
+public
+private
+protected
+end;" name="classd" description="class declaration" suffixes="Pascal (p,pp,pas,dpr)"/>
+ <Template code="|= record
+end;" name="recordd" description="record declaration" suffixes="Pascal (p,pp,pas,dpr)"/>
+ <Template code="if ( | ) then
+begin
+end;" name="ifb" description="if statement" suffixes="Pascal (p,pp,pas,dpr)"/>
+</Templates>
diff --git a/languages/pascal/problemreporter.cpp b/languages/pascal/problemreporter.cpp
new file mode 100644
index 00000000..7a0a6d0d
--- /dev/null
+++ b/languages/pascal/problemreporter.cpp
@@ -0,0 +1,289 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include "problemreporter.h"
+#include "pascalsupport_part.h"
+#include "kdevpartcontroller.h"
+#include "kdevmainwindow.h"
+#include "configproblemreporter.h"
+#include "backgroundparser.h"
+
+#include <kdeversion.h>
+#include <kparts/part.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/document.h>
+#include <ktexteditor/markinterface.h>
+
+#include <ktexteditor/markinterfaceextension.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstatusbar.h>
+#include <kurl.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+
+#include <kconfig.h>
+
+#include <qtimer.h>
+#include <qregexp.h>
+#include <qvbox.h>
+#include <kdialogbase.h>
+
+
+class ProblemItem: public QListViewItem{
+public:
+ ProblemItem( QListView* parent, const QString& level, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : QListViewItem( parent, level, problem, file, line, column ) {}
+
+ ProblemItem( QListViewItem* parent, const QString& level, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : QListViewItem( parent, level, problem, file, line, column ) {}
+
+ int compare( QListViewItem* item, int column, bool ascending ) const {
+ if( column == 3 || column == 4 ){
+ int a = text( column ).toInt();
+ int b = item->text( column ).toInt();
+ if( a == b )
+ return 0;
+ return( a > b ? -1 : 1 );
+ }
+ return QListViewItem::compare( item, column, ascending );
+ }
+
+};
+
+ProblemReporter::ProblemReporter( PascalSupportPart* part, QWidget* parent, const char* name )
+ : QListView( parent, name ),
+ m_pascalSupport( part ),
+ m_editor( 0 ),
+ m_document( 0 ),
+ m_markIface( 0 ),
+ m_bgParser( 0 )
+{
+ addColumn( i18n("Level") );
+ addColumn( i18n("Problem") );
+ addColumn( i18n("File") );
+ addColumn( i18n("Line") );
+ //addColumn( i18n("Column") );
+ setAllColumnsShowFocus( TRUE );
+
+ m_timer = new QTimer( this );
+
+ connect( part->partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part*)) );
+ connect( part->partController(), SIGNAL(partAdded(KParts::Part*)),
+ this, SLOT(slotPartAdded(KParts::Part*)) );
+ connect( part->partController(), SIGNAL(partRemoved(KParts::Part*)),
+ this, SLOT(slotPartRemoved(KParts::Part*)) );
+
+ connect( m_timer, SIGNAL(timeout()), this, SLOT(reparse()) );
+
+ connect( this, SIGNAL(doubleClicked(QListViewItem*)),
+ this, SLOT(slotSelected(QListViewItem*)) );
+ connect( this, SIGNAL(returnPressed(QListViewItem*)),
+ this, SLOT(slotSelected(QListViewItem*)) );
+
+ configure();
+}
+
+ProblemReporter::~ProblemReporter()
+{
+ if( m_bgParser ) {
+ m_bgParser->wait();
+ }
+
+ delete( m_bgParser );
+ m_bgParser = 0;
+}
+
+void ProblemReporter::slotActivePartChanged( KParts::Part* part )
+{
+ if( !part )
+ return;
+
+ if( m_editor )
+ reparse();
+
+ m_document = dynamic_cast<KTextEditor::Document*>( part );
+ if( m_document ){
+ m_filename = m_document->url().path();
+ }
+
+ m_editor = dynamic_cast<KTextEditor::EditInterface*>( part );
+ if( m_editor )
+ connect( m_document, SIGNAL(textChanged()), this, SLOT(slotTextChanged()) );
+
+ m_markIface = dynamic_cast<KTextEditor::MarkInterface*>( part );
+
+ m_timer->changeInterval( m_delay );
+}
+
+void ProblemReporter::slotTextChanged()
+{
+ if( m_active )
+ m_timer->changeInterval( m_delay );
+}
+
+void ProblemReporter::reparse()
+{
+ kdDebug(9007) << "ProblemReporter::reparse()" << endl;
+
+ kdDebug() << "1" << endl;
+
+ if( !m_editor )
+ return;
+
+ kdDebug() << "2" << endl;
+
+ m_timer->stop();
+
+ kdDebug() << "3" << endl;
+
+ if( m_bgParser ) {
+ if( m_bgParser->running() ) {
+ m_timer->changeInterval( m_delay );
+ return;
+ }
+
+ delete( m_bgParser );
+ m_bgParser = 0;
+ }
+
+ kdDebug() << "4" << endl;
+
+ QListViewItem* current = firstChild();
+ while( current ){
+ QListViewItem* i = current;
+ current = current->nextSibling();
+
+ if( i->text(2) == m_filename )
+ delete( i );
+ }
+
+ kdDebug() << "5" << endl;
+
+ if( m_markIface ){
+ QPtrList<KTextEditor::Mark> marks = m_markIface->marks();
+ QPtrListIterator<KTextEditor::Mark> it( marks );
+ while( it.current() ){
+ m_markIface->removeMark( it.current()->line, KTextEditor::MarkInterface::markType07 );
+ ++it;
+ }
+ }
+
+ kdDebug() << "6" << endl;
+
+ m_bgParser = new BackgroundParser( this, m_editor->text(), m_filename );
+
+ kdDebug() << "7" << endl;
+
+ m_bgParser->start();
+
+ kdDebug() << "8" << endl;
+}
+
+void ProblemReporter::slotSelected( QListViewItem* item )
+{
+ KURL url( item->text(2) );
+ int line = item->text( 3 ).toInt();
+ // int column = item->text( 4 ).toInt();
+ m_pascalSupport->partController()->editDocument( url, line-1 );
+}
+
+void ProblemReporter::reportError( QString message,
+ QString filename,
+ int line, int column )
+{
+ if( m_markIface ){
+ m_markIface->addMark( line-1, KTextEditor::MarkInterface::markType07 );
+ }
+
+ new ProblemItem( this,
+ "error",
+ message.replace( QRegExp("\n"), "" ),
+ filename,
+ QString::number( line ),
+ QString::number( column ) );
+}
+
+void ProblemReporter::reportWarning( QString message,
+ QString filename,
+ int line, int column )
+{
+ new ProblemItem( this,
+ "warning",
+ message.replace( QRegExp("\n"), "" ),
+ filename,
+ QString::number( line ),
+ QString::number( column ) );
+}
+
+void ProblemReporter::reportMessage( QString message,
+ QString filename,
+ int line, int column )
+{
+ new QListViewItem( this,
+ "message",
+ message.replace( QRegExp("\n"), "" ),
+ filename,
+ QString::number( line ),
+ QString::number( column ) );
+}
+
+void ProblemReporter::configure()
+{
+ kdDebug(9007) << "ProblemReporter::configure()" << endl;
+ KConfig* config = kapp->config();
+ config->setGroup( "General Options" );
+ m_active = config->readBoolEntry( "EnablePascalBgParser", TRUE );
+ m_delay = config->readNumEntry( "BgParserDelay", 500 );
+}
+
+void ProblemReporter::configWidget( KDialogBase* dlg )
+{
+ /// \FIXME adymo: use problem reporter configuration
+ Q_UNUSED(dlg);
+/* QVBox *vbox = dlg->addVBoxPage(i18n("Pascal Parsing"));
+ ConfigureProblemReporter* w = new ConfigureProblemReporter( vbox );
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ connect(dlg, SIGNAL(okClicked()), this, SLOT(configure()));*/
+}
+
+void ProblemReporter::slotPartAdded( KParts::Part* part )
+{
+ KTextEditor::MarkInterfaceExtension* iface = dynamic_cast<KTextEditor::MarkInterfaceExtension*>( part );
+
+ if( !iface )
+ return;
+
+ iface->setPixmap( KTextEditor::MarkInterface::markType07, SmallIcon("stop") );
+}
+
+void ProblemReporter::slotPartRemoved( KParts::Part* part )
+{
+ kdDebug(9007) << "ProblemReporter::slotPartRemoved()" << endl;
+ if( part == m_document ){
+ m_document = 0;
+ m_editor = 0;
+ m_timer->stop();
+ }
+}
+
+#include "problemreporter.moc"
diff --git a/languages/pascal/problemreporter.h b/languages/pascal/problemreporter.h
new file mode 100644
index 00000000..3fa3ee28
--- /dev/null
+++ b/languages/pascal/problemreporter.h
@@ -0,0 +1,78 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef PROBLEMSREPORTER_H
+#define PROBLEMSREPORTER_H
+
+#include <qlistview.h>
+
+class PascalSupportPart;
+class QTimer;
+class KDialogBase;
+class BackgroundParser;
+
+namespace KParts{
+ class Part;
+}
+
+namespace KTextEditor{
+ class EditInterface;
+ class MarkInterface;
+ class Document;
+}
+
+class ProblemReporter: public QListView{
+ Q_OBJECT
+public:
+ ProblemReporter( PascalSupportPart* part, QWidget* parent=0, const char* name=0 );
+ virtual ~ProblemReporter();
+
+ virtual void reportError( QString message, QString filename,
+ int line, int column );
+
+ virtual void reportWarning( QString message, QString filename,
+ int line, int column );
+
+ virtual void reportMessage( QString message, QString filename,
+ int line, int column );
+
+public slots:
+ void reparse();
+ void configure();
+ void configWidget( KDialogBase* );
+
+private slots:
+ void slotPartAdded( KParts::Part* );
+ void slotPartRemoved( KParts::Part* );
+ void slotActivePartChanged( KParts::Part* );
+ void slotTextChanged();
+ void slotSelected( QListViewItem* );
+
+private:
+ PascalSupportPart* m_pascalSupport;
+ KTextEditor::EditInterface* m_editor;
+ KTextEditor::Document* m_document;
+ KTextEditor::MarkInterface* m_markIface;
+ QTimer* m_timer;
+ QString m_filename;
+ int m_active;
+ int m_delay;
+ BackgroundParser* m_bgParser;
+};
+
+#endif
diff --git a/languages/perl/Makefile.am b/languages/perl/Makefile.am
new file mode 100644
index 00000000..2354c124
--- /dev/null
+++ b/languages/perl/Makefile.am
@@ -0,0 +1,25 @@
+# Here resides the Perl support part.
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+SUBDIRS = app_templates file_templates doc
+
+
+kde_module_LTLIBRARIES = libkdevperlsupport.la kio_perldoc.la
+libkdevperlsupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevperlsupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la
+
+libkdevperlsupport_la_SOURCES = perlparser.cpp perlsupportpart.cpp perlconfigwidget.cpp perlconfigwidgetbase.ui
+
+kio_perldoc_la_SOURCES = perldoc.cpp
+kio_perldoc_la_LIBADD = $(LIB_KIO)
+kio_perldoc_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevperlsupport.desktop perldoc.protocol
+
+rcdir = $(kde_datadir)/kdevperlsupport
+rc_DATA = kdevperlsupport.rc
diff --git a/languages/perl/README.dox b/languages/perl/README.dox
new file mode 100644
index 00000000..f8608a41
--- /dev/null
+++ b/languages/perl/README.dox
@@ -0,0 +1,46 @@
+/** \class PerlSupportPart
+This is perl language support plugin.
+
+Put a more detailed description of your part in these lines. It can span
+over several lines. You can even use some html commands in these lines like:
+<code>This is code</code>, html links <a href="http://somelocation">link text</a>,
+and images.
+
+\authors <a href="mailto:bernd AT kdevelop.org">Bernd Gehrmann</a>
+\authors <a href="mailto:willems.luc AT pandora.be">Luc Willems</a>
+
+\maintainer <a href="mailto:willems.luc AT pandora.be">Luc Willems</a>
+
+\feature perl programming language support
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/perl/app_templates/Makefile.am b/languages/perl/app_templates/Makefile.am
new file mode 100644
index 00000000..c284be59
--- /dev/null
+++ b/languages/perl/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = perlhello
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/ScriptingLanguageIDE/PerlIDE
+profiles_DATA = perl.appwizard
diff --git a/languages/perl/app_templates/perl.appwizard b/languages/perl/app_templates/perl.appwizard
new file mode 100644
index 00000000..44c9faf9
--- /dev/null
+++ b/languages/perl/app_templates/perl.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=perlhello
diff --git a/languages/perl/app_templates/perlhello/.kdev_ignore b/languages/perl/app_templates/perlhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/.kdev_ignore
diff --git a/languages/perl/app_templates/perlhello/Makefile.am b/languages/perl/app_templates/perlhello/Makefile.am
new file mode 100644
index 00000000..1c1d7b33
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.pl app.kdevelop
+templateName = perlhello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/perl/app_templates/perlhello/app.kdevelop b/languages/perl/app_templates/perlhello/app.kdevelop
new file mode 100644
index 00000000..c781322d
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/app.kdevelop
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Perl</primarylanguage>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ </general>
+ <kdevscriptproject>
+ <run>
+ <mainprogram>./%{APPNAMELC}.pl</mainprogram>
+ </run>
+ <general>
+ <includepatterns>*.pl,*.pm</includepatterns>
+ <excludepatterns>*~</excludepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="" />
+ <type ext="pl" />
+ <type ext="pm" />
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/perl/app_templates/perlhello/app.pl b/languages/perl/app_templates/perlhello/app.pl
new file mode 100755
index 00000000..bd6bbf6a
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/app.pl
@@ -0,0 +1,43 @@
+#!/usr/bin/perl -w
+#
+use strict;
+use warnings;
+
+
+#program version
+my $VERSION="%{VERSION}";
+
+#For CVS , use following line
+#my $VERSION=sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+sub do_something {
+ my $text=shift;
+ print "$text\n";
+}
+
+&do_something("Hello World");
+print "That's all folks for version $VERSION \n";
+
+__END__
+
+=head1 NAME
+
+%{APPNAME} - short description of your program
+
+=head1 SYNOPSIS
+
+ how to use your program
+
+=head1 DESCRIPTION
+
+ long description of your program
+
+=head1 SEE ALSO
+
+ need to know things before somebody uses your program
+
+=head1 AUTHOR
+
+ %{AUTHOR}
+
+=cut
diff --git a/languages/perl/app_templates/perlhello/perlhello b/languages/perl/app_templates/perlhello/perlhello
new file mode 100644
index 00000000..1f015e1b
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/perlhello
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=Simple Perl script
+Name[fr]=Un simple script de test « Hello world »
+Icon=camel.png
+Category=Perl
+Comment=This generates a simplistic 'Hello world' program in Perl (http://www.perl.org)
+Comment[fr]=Génère un simple script de test du type « Hello world » dans le language PERL (http://www.perl.org).
+FileTemplates=perl,ShellStyle
+ShowFilesAfterGeneration=APPNAMELC.pl
diff --git a/languages/perl/app_templates/perlhello/perlhello.kdevtemplate b/languages/perl/app_templates/perlhello/perlhello.kdevtemplate
new file mode 100644
index 00000000..ead7b5b8
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/perlhello.kdevtemplate
@@ -0,0 +1,108 @@
+# KDE Config File
+[General]
+Name=Simple Perl script
+Name[ca]=Simple script en Perl
+Name[da]=Simpelt Perl script
+Name[de]=Einfaches Perl-Skript
+Name[el]=Απλό σενάÏιο Perl
+Name[es]=Guión sencillo en Perl
+Name[et]=Lihtne Perli skript
+Name[eu]=Perl script sinplea
+Name[fa]=دست‌نوشتۀ سادۀ پرل
+Name[fr]=Script Perl simple
+Name[ga]=Script shimplí Perl
+Name[gl]=Script sinxelo en Perl
+Name[hu]=Egyszerű Perl-szkript
+Name[it]=Semplice script Perl
+Name[ja]=ç°¡å˜ãª Perl スクリプト
+Name[nds]=Eenfach Perl-Skript
+Name[ne]=साधारण परà¥à¤² सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ
+Name[nl]=Eenvoudig Perl-script
+Name[pl]=Prosty skrypt w Perlu
+Name[pt]=Programa simples em Perl
+Name[pt_BR]=Programa simples em Perl
+Name[ru]=ПроÑтой Ñкрипт Perl
+Name[sk]=Jednoduchý Perl skript
+Name[sr]=ЈедноÑтавна Perl Ñкрипта
+Name[sr@Latn]=Jednostavna Perl skripta
+Name[sv]=Enkelt Perl-skript
+Name[tr]=Basit Perl betiÄŸi
+Name[zh_CN]=ç®€å• Perl 脚本
+Name[zh_TW]=簡單的 Perl 文稿
+Icon=camel.png
+Category=Perl
+Comment=This generates a simplistic 'Hello world' program in Perl (http://www.perl.org)
+Comment[ca]=Genera un simple programa de 'Hello world' en Perl (http://www.perl.org)
+Comment[da]=Dette genererer et simplistisk 'Goddag verden' program i Perl (http://www.perl.org)
+Comment[de]=Hiermit wird ein einfaches "Hello World"-Programm in Perl erstellt (http://www.perl.org).
+Comment[el]=Αυτό δημιουÏγεί ένα απλό Ï€ÏόγÏαμμα 'Γεια σου κόσμε' σε Perl (http://www.perl.org)
+Comment[es]=Genera un programa «Hola mundo» sencillo en Perl (http://www.perl.org)
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine Perlis (http://www.perl.org)
+Comment[eu]=Honek "Kaixo mundua" Perl-en (http://www.perl.org) idatzitako programa sinple bat sortzen du.
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در پرل (http://www.perl.org) تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en Perl (http://www.perl.org)
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí "Hello world" i Perl (http://www.perl.org/)
+Comment[gl]=Isto xera un programa sinxelo en Perl 'Ola mundo'(http://www.perl.org)
+Comment[hu]=Létrehoz egy egyszerű 'Hello world' programot Perlben (http://www.perl.org)
+Comment[it]=Genera un semplice programma di "Hello world" in Perl (http://www.perl.org)
+Comment[ja]=Perl ã§æ›¸ã‹ã‚ŒãŸç°¡å˜ãª Hello world プログラムを作æˆã—ã¾ã™
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm in Perl op.(http://www.perl.org).
+Comment[ne]=यसले परà¥à¤²à¤®à¤¾ साधारण 'हेलà¥à¤²à¥‹ वोलà¥à¤¡' कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› (http://www.perl.org)
+Comment[nl]=Dit genereert een eenvoudig Hello World-programma in Perl (http://www.perl.org)
+Comment[pl]=Generuje prosty skrypt "Witaj świecie" w Perlu (http://www.perl.org)
+Comment[pt]=Isto gera um programa simples 'Olá mundo' em Perl (http://www.perl.org)
+Comment[pt_BR]=Isto gera um programa simples 'Olá mundo' em Perl (http://www.perl.org)
+Comment[ru]=Создание проÑтой программы 'Hello world' на Perl (http://www.perl.org)
+Comment[sk]=Vygeneruje jednoduchý Ahoj svet program v Perl (http://www.perl.org)
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм у Perl-у (http://www.perl.org)
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program u Perl-u (http://www.perl.org)
+Comment[sv]=Detta skapar ett förenklat 'Hello world'-program i Perl (http://www.perl.org)
+Comment[tr]=Bu, Perl'de basit bir "Merhaba Dünya" programı yaratır (http://www.perl.org)
+Comment[zh_CN]=这将生æˆä¸€ä¸ªç®€å•çš„ Perl 语言“Hello worldâ€ç¨‹åº
+Comment[zh_TW]=產生一個簡單的 Perl (http://www.perl.org) çš„ Hello world 程å¼
+FileTemplates=perl,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.pl
+Archive=perlhello.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.pl
+Dest=%{dest}/%{APPNAMELC}.pl
+
+[MSG]
+Type=message
+Comment=A simple Perl script was created in %{dest}
+Comment[ca]=Un simple script en Perl ha estat creat en %{dest}
+Comment[da]=Et simpelt Perl script blev oprettet i %{dest}
+Comment[de]=Ein einfaches Perl-Skript wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό σενάÏιο Perl δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo guión en Perl ha sido creado en %{dest}
+Comment[et]=Lihtne Perli skript loodi asukohta %{dest}
+Comment[eu]=Perl script sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک دست‌نوشتۀ سادۀ پرل در %{dest} ایجاد شد
+Comment[fr]=Un script Perl simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh script shimplí Perl i %{dest}
+Comment[gl]=Creouse un script sinxelo en Perl en %{dest}
+Comment[hu]=Létrejött egy egyszerű Perl-szkript itt: %{dest}
+Comment[it]=È stato creato un semplice script Perl in %{dest}
+Comment[ja]=ç°¡å˜ãª Perl スクリプトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach Perl-Skript opstellt.
+Comment[ne]=साधारण परà¥à¤² सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig Perl-script is aangemaakt in %{dest}
+Comment[pl]=Prosty skrypt w Perlu został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples em Perl em %{dest}
+Comment[pt_BR]=Foi criado um programa simples em Perl em %{dest}
+Comment[ru]=ПроÑтой Ñкрипт Perl Ñоздан в %{dest}
+Comment[sk]=Jednoduchý Perl skript bol vytvorený v %{dest}
+Comment[sr]=ЈедноÑтавна Perl Ñкрипта направљена је у %{dest}
+Comment[sr@Latn]=Jednostavna Perl skripta napravljena je u %{dest}
+Comment[sv]=Ett enkelt Perl-skript skapades i %{dest}
+Comment[tr]=Basit Perl betiği %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简å•çš„ Perl 脚本
+Comment[zh_TW]=一個簡單的 Perl 文稿已建立於 %{dest}
diff --git a/languages/perl/app_templates/perlhello/perlhello.png b/languages/perl/app_templates/perlhello/perlhello.png
new file mode 100644
index 00000000..78e0532a
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/perlhello.png
Binary files differ
diff --git a/languages/perl/doc/Makefile.am b/languages/perl/doc/Makefile.am
new file mode 100644
index 00000000..dae5d699
--- /dev/null
+++ b/languages/perl/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = perl.toc perl_bugs.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA =
+
diff --git a/languages/perl/doc/perl.toc b/languages/perl/doc/perl.toc
new file mode 100644
index 00000000..84cb8145
--- /dev/null
+++ b/languages/perl/doc/perl.toc
@@ -0,0 +1,54 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Perl</title>
+<tocsect1 name="Data structures" url="man:perldata"/>
+<tocsect1 name="Syntax" url="man:perlsyn"/>
+<tocsect1 name="Operators and Precedence" url="man:perlop"/>
+<tocsect1 name="Regular Expressions" url="man:perlre"/>
+<tocsect1 name="Execution and Options" url="man:perlrun"/>
+<tocsect1 name="Builtin Functions" url="man:perlfunc"/>
+<tocsect1 name="open() Tutorial" url="man:perlopentut"/>
+<tocsect1 name="Predefined Variables" url="man:perlvar"/>
+<tocsect1 name="Subroutines" url="man:perlsub"/>
+<tocsect1 name="Modules: how they work" url="man:perlmod"/>
+<tocsect1 name="Modules: how to write and use" url="man:perlmodlib"/>
+<tocsect1 name="Modules: how to install from CPAN" url="man:perlmodinstall"/>
+<tocsect1 name="Formats" url="man:perlform"/>
+<tocsect1 name="Unicode Support" url="man:perlunicode"/>
+<tocsect1 name="Locale Support" url="man:perllocale"/>
+<tocsect1 name="References Introduction" url="man:perlreftut"/>
+<tocsect1 name="References, the rest of the story" url="man:perlref"/>
+<tocsect1 name="Data Structures: introduction" url="man:perldsc"/>
+<tocsect1 name="Data Structures: arrrays of arrays" url="man:perllol"/>
+<tocsect1 name="OO tutorial 1" url="man:perlboot"/>
+<tocsect1 name="OO tutorial 2" url="man:perltoot"/>
+<tocsect1 name="OO tutorial 3" url="man:perltootc"/>
+<tocsect1 name="Objects" url="man:perlobj"/>
+<tocsect1 name="Objects hidden behind simple variables" url="man:perltie"/>
+<tocsect1 name="OO tricks and examples" url="man:perlbot"/>
+<tocsect1 name="Interprocess Communication" url="man:perlipc"/>
+<tocsect1 name="fork() Information" url="man:perlfork"/>
+<tocsect1 name="Threads Tutorial" url="man:perlthrtut"/>
+<tocsect1 name="Warnings and their Control" url="man:perllexwarn"/>
+<tocsect1 name="Source Filters" url="man:perlfilter"/>
+<tocsect1 name="DBM Filters" url="man:perldbmfilter"/>
+<tocsect1 name="Compiler Suite Introduction" url="man:perlcompile"/>
+<tocsect1 name="Debugging" url="man:perldebug"/>
+<tocsect1 name="Diagnostic Messages" url="man:perldiag"/>
+<tocsect1 name="Number semantics" url="man:perlnumber"/>
+<tocsect1 name="Security" url="man:perlsec"/>
+<tocsect1 name="Traps for the Unwary" url="man:perltrap"/>
+<tocsect1 name="Portability Guide" url="man:perlport"/>
+<tocsect1 name="Style Guide" url="man:perlstyle"/>
+<tocsect1 name="POD" url="man:perlpod"/>
+<tocsect1 name="Embed Perl in C" url="man:perlembed"/>
+<tocsect1 name="Internal IO abstraction interface" url="man:perlapio"/>
+<tocsect1 name="Debugging guts and tips" url="man:perldebguts"/>
+<tocsect1 name="XS API" url="man:perlxs"/>
+<tocsect1 name="XS Tutorial" url="man:perlxstut"/>
+<tocsect1 name="Internal Functions" url="man:perlguts"/>
+<tocsect1 name="Calling conventions from C" url="man:perlcall"/>
+<tocsect1 name="API listing" url="man:perlapi"/>
+<tocsect1 name="Internal functions" url="man:perlintern"/>
+</kdeveloptoc>
+
diff --git a/languages/perl/doc/perl_bugs.toc b/languages/perl/doc/perl_bugs.toc
new file mode 100644
index 00000000..126b35f3
--- /dev/null
+++ b/languages/perl/doc/perl_bugs.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Perl bugs</title>
+<base href="http://www.nntp.perl.org/"/>
+<tocsect1 name="Query" url="group">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/perl/file_templates/Makefile.am b/languages/perl/file_templates/Makefile.am
new file mode 100644
index 00000000..f1f8457d
--- /dev/null
+++ b/languages/perl/file_templates/Makefile.am
@@ -0,0 +1,4 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = pl pm
+
+
diff --git a/languages/perl/file_templates/pl b/languages/perl/file_templates/pl
new file mode 100644
index 00000000..bacfcdda
--- /dev/null
+++ b/languages/perl/file_templates/pl
@@ -0,0 +1,43 @@
+#!/usr/bin/perl -w
+#
+use strict;
+use warnings;
+
+
+#program version
+my $VERSION="$VERSION$";
+
+#For CVS , use following line
+#my $VERSION=sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+sub do_something {
+ my $text=shift;
+ print "$text\n";
+}
+
+&do_something("Hello World");
+print "That's all folks for version $VERSION \n";
+
+__END__
+
+=head1 NAME
+
+Script name - short discription of your program
+
+=head1 SYNOPSIS
+
+ how to us your program
+
+=head1 DESCRIPTION
+
+ long description of your program
+
+=head1 SEE ALSO
+
+ need to know things before somebody uses your program
+
+=head1 AUTHOR
+
+ $AUTHOR$
+
+=cut
diff --git a/languages/perl/file_templates/pm b/languages/perl/file_templates/pm
new file mode 100644
index 00000000..c0e33a1d
--- /dev/null
+++ b/languages/perl/file_templates/pm
@@ -0,0 +1,68 @@
+package $MODULE$;
+
+use strict;
+
+require Exporter;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+
+# set the version for version checking
+$VERSION = $VERSION$;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&hello);
+%EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+
+# your exported package globals go here,
+# as well as any optionally exported functions
+@EXPORT_OK = qw($Var1 %Hashit &func3);
+
+use vars qw($Var1 %Hashit);
+# non-exported package globals go here
+use vars qw(@more $stuff);
+
+# initialize package globals, first exported ones
+$Var1 = '';
+%Hashit = ();
+
+# then the others (which are still accessible as $Some::Module::stuff)
+$stuff = '';
+@more = ();
+
+
+# file-private lexicals go here
+my $priv_var = '';
+my %secret_hash = ();
+
+
+sub hello {
+ print "hello world\n";
+}
+
+
+END { } # module clean-up code here (global destructor)
+
+1;
+
+__END__
+
+=head1 NAME
+
+ModuleName - short discription of your program
+
+=head1 SYNOPSIS
+
+ how to us your module
+
+=head1 DESCRIPTION
+
+ long description of your module
+
+=head1 SEE ALSO
+
+ need to know things before somebody uses your program
+
+=head1 AUTHOR
+
+ $AUTHOR$
+
+=cut
diff --git a/languages/perl/kdevperlsupport.desktop b/languages/perl/kdevperlsupport.desktop
new file mode 100644
index 00000000..66cfc907
--- /dev/null
+++ b/languages/perl/kdevperlsupport.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Perl Support
+Comment[ca]=Suport per a Perl
+Comment[da]=Perl-understøttelse
+Comment[de]=Perl-Unterstützung für KDevelop
+Comment[el]=ΥποστήÏιξη Perl
+Comment[es]=Soporte para Perl
+Comment[et]=Perli toetus
+Comment[eu]=Perl euskarria
+Comment[fa]=پشتیبانی پرل
+Comment[fr]=Prise en charge du langage Perl
+Comment[ga]=Tacaíocht Perl
+Comment[gl]=Soporte para Perl
+Comment[hi]=परà¥à¤² समरà¥à¤¥à¤¨
+Comment[hu]=Perl-támogatás
+Comment[is]=Perl stuðningur
+Comment[it]=Supporto Perl
+Comment[ja]=Perl サãƒãƒ¼ãƒˆ
+Comment[nds]=Ünnerstütten för Perl
+Comment[ne]=परà¥à¤² समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor Perl
+Comment[pl]=Obsługa Perla
+Comment[pt]=Suporte a Perl
+Comment[pt_BR]=Suporte ao Perl
+Comment[ru]=Поддержка Ñзыка Perl
+Comment[sk]=Perl podpora
+Comment[sl]=Podpora za perl
+Comment[sr]=Подршка за Perl
+Comment[sr@Latn]=Podrška za Perl
+Comment[sv]=Perl-stöd
+Comment[ta]=பெரà¯à®²à¯ ஆதரவà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони Perl
+Comment[tr]=Perl DesteÄŸi
+Comment[zh_CN]=Perl 支æŒ
+Comment[zh_TW]=Perl 支æ´
+Name=KDevPerlSupport
+Name[da]=KDevelop Perl-understøttelse
+Name[de]=Unterstützung für Perl (KDevelop)
+Name[hi]=के-डेव-परà¥à¤²-समरà¥à¤¥à¤¨
+Name[nds]=Perl-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaPerla
+Name[sk]=KDev Perl podpora
+Name[sv]=KDevelop Perl-stöd
+Name[ta]=கெடெவ௠பெரà¯à®²à¯ ஆதரவà¯
+Name[zh_TW]=KDevelop Perl 支æ´
+GenericName=Perl Support
+GenericName[ca]=Suport per a Perl
+GenericName[da]=Perl-understøttelse
+GenericName[de]=Unterstützung für Perl
+GenericName[el]=ΥποστήÏιξη Perl
+GenericName[es]=Soporte para Perl
+GenericName[et]=Perli toetus
+GenericName[eu]=Perl euskarria
+GenericName[fa]=پشتیبانی پرل
+GenericName[fr]=Prise en charge du langage PERL
+GenericName[ga]=Tacaíocht Perl
+GenericName[gl]=Soporte para Perl
+GenericName[hi]=परà¥à¤² समरà¥à¤¥à¤¨
+GenericName[hu]=Perl-támogatás
+GenericName[it]=Supporto per Perl
+GenericName[ja]=Perl サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för Perl
+GenericName[ne]=परà¥à¤² समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor Perl
+GenericName[pl]=Obsługa Perla
+GenericName[pt]=Suporte a Perl
+GenericName[pt_BR]=Suporte ao Perl
+GenericName[ru]=Поддержка Ñзыка Perl
+GenericName[sk]=Perl podpora
+GenericName[sl]=Podpora za perl
+GenericName[sr]=Подршка за Perl
+GenericName[sr@Latn]=Podrška za Perl
+GenericName[sv]=Perl-stöd
+GenericName[ta]=பெரà¯à®²à¯ ஆதரவà¯
+GenericName[tg]=ÐÑ€Ó£ намудани забони Perl
+GenericName[tr]=Perl DesteÄŸi
+GenericName[zh_CN]=Perl 支æŒ
+GenericName[zh_TW]=Perl 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevperlsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Perl
+
diff --git a/languages/perl/kdevperlsupport.rc b/languages/perl/kdevperlsupport.rc
new file mode 100644
index 00000000..9f5f4ee9
--- /dev/null
+++ b/languages/perl/kdevperlsupport.rc
@@ -0,0 +1,14 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevPerlSupport" version="1">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_exec" />
+ <Action name="build_runinterpreter" />
+ <Action name="build_execstring" />
+ </Menu>
+ <Menu name="help">
+ <Action name="help_perldocfunction"/>
+ <Action name="help_perldocfaq"/>
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/perl/perlconfigwidget.cpp b/languages/perl/perlconfigwidget.cpp
new file mode 100644
index 00000000..475ed8af
--- /dev/null
+++ b/languages/perl/perlconfigwidget.cpp
@@ -0,0 +1,38 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "perlconfigwidget.h"
+
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include "domutil.h"
+
+
+PerlConfigWidget::PerlConfigWidget(QDomDocument &projectDom,
+ QWidget *parent, const char *name)
+ : PerlConfigWidgetBase(parent, name), dom(projectDom)
+{
+ interpreter_edit->setText(DomUtil::readEntry(dom, "/kdevperlsupport/run/interpreter"));
+ terminal_box->setChecked(DomUtil::readBoolEntry(dom, "/kdevperlsupport/run/terminal"));
+}
+
+
+PerlConfigWidget::~PerlConfigWidget()
+{}
+
+
+void PerlConfigWidget::accept()
+{
+ DomUtil::writeEntry(dom, "/kdevperlsupport/run/interpreter", interpreter_edit->text());
+ DomUtil::writeBoolEntry(dom, "/kdevperlsupport/run/terminal", terminal_box->isChecked());
+}
+
+#include "perlconfigwidget.moc"
diff --git a/languages/perl/perlconfigwidget.h b/languages/perl/perlconfigwidget.h
new file mode 100644
index 00000000..07364a40
--- /dev/null
+++ b/languages/perl/perlconfigwidget.h
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PERLCONFIGWIDGET_H_
+#define _PERLCONFIGWIDGET_H_
+
+#include "perlconfigwidgetbase.h"
+#include <qdom.h>
+
+
+class PerlConfigWidget : public PerlConfigWidgetBase
+{
+ Q_OBJECT
+
+public:
+ PerlConfigWidget( QDomDocument &projectDom, QWidget *parent=0, const char *name=0 );
+ ~PerlConfigWidget();
+
+public slots:
+ void accept();
+
+private:
+ QDomDocument &dom;
+};
+
+#endif
diff --git a/languages/perl/perlconfigwidgetbase.ui b/languages/perl/perlconfigwidgetbase.ui
new file mode 100644
index 00000000..8becd0f4
--- /dev/null
+++ b/languages/perl/perlconfigwidgetbase.ui
@@ -0,0 +1,101 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PerlConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>perl_config_widget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Perl</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>interpreter_label</cstring>
+ </property>
+ <property name="text">
+ <string>Perl &amp;interpreter:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>interpreter_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>interpreter_edit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>terminal_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Execute programs in a terminal</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/perl/perldoc.cpp b/languages/perl/perldoc.cpp
new file mode 100644
index 00000000..cbb4d18f
--- /dev/null
+++ b/languages/perl/perldoc.cpp
@@ -0,0 +1,133 @@
+#include "perldoc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <qtextstream.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kinstance.h>
+#include <kprocess.h>
+#include <kdeversion.h>
+#include <kglobal.h>
+
+using namespace KIO;
+
+
+PerldocProtocol::PerldocProtocol(const QCString &pool, const QCString &app)
+ : SlaveBase("perldoc", pool, app)
+{}
+
+
+PerldocProtocol::~PerldocProtocol()
+{}
+
+
+void PerldocProtocol::get(const KURL& url)
+{
+ QStringList l = QStringList::split('/', url.path());
+
+ mimeType("text/html");
+
+ bool plain = false;
+ QString cmd = "perldoc ";
+ if (l[0] == "functions") {
+ plain = true;
+ cmd += "-t -f ";
+ cmd += KProcess::quote(l[1]);
+ } else if (l[0] == "faq") {
+ cmd += "-u -q ";
+ cmd += KProcess::quote(l[1]);
+ cmd += " | pod2html";
+ } else {
+ QCString errstr(i18n("The only existing directories are functions and faq.").local8Bit());
+ data(errstr);
+ finished();
+ return;
+ }
+
+ kdDebug() << "Command: " << cmd << endl;
+
+ if (plain)
+ data(QCString("<blockquote>"));
+
+ FILE *fd = popen(cmd.local8Bit().data(), "r");
+ char buffer[4090];
+ QByteArray array;
+
+ while (!feof(fd)) {
+ int n = fread(buffer, 1, 2048, fd);
+ if (n == -1) {
+ pclose(fd);
+ return;
+ }
+ array.setRawData(buffer, n);
+ data(array);
+ array.resetRawData(buffer, n);
+ }
+
+ pclose(fd);
+
+ if (plain)
+ data(QCString("</blockquote>"));
+
+ finished();
+}
+
+
+void PerldocProtocol::mimetype(const KURL &url)
+{
+ QStringList l = QStringList::split('/', url.path());
+ mimeType((l[0] == "faq")? "text/html" : "text/plain");
+ finished();
+}
+
+
+QCString PerldocProtocol::errorMessage()
+{
+ return QCString( "<html><body bgcolor=\"#FFFFFF\">" + i18n("Error in perldoc").local8Bit() + "</body></html>" );
+}
+
+
+void PerldocProtocol::stat(const KURL &/*url*/)
+{
+ UDSAtom uds_atom;
+ uds_atom.m_uds = KIO::UDS_FILE_TYPE;
+ uds_atom.m_long = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
+
+ UDSEntry uds_entry;
+ uds_entry.append(uds_atom);
+
+ statEntry(uds_entry);
+ finished();
+}
+
+
+void PerldocProtocol::listDir(const KURL &url)
+{
+ error( KIO::ERR_CANNOT_ENTER_DIRECTORY, url.path() );
+}
+
+
+extern "C" {
+
+ int kdemain(int argc, char **argv)
+ {
+ KInstance instance( "kio_perldoc" );
+ KGlobal::locale()->setMainCatalogue("kdevelop");
+
+ if (argc != 4) {
+ fprintf(stderr, "Usage: kio_perldoc protocol domain-socket1 domain-socket2\n");
+ exit(-1);
+ }
+
+ PerldocProtocol slave(argv[2], argv[3]);
+ slave.dispatchLoop();
+
+ return 0;
+ }
+
+}
diff --git a/languages/perl/perldoc.h b/languages/perl/perldoc.h
new file mode 100644
index 00000000..00cced89
--- /dev/null
+++ b/languages/perl/perldoc.h
@@ -0,0 +1,25 @@
+#ifndef _PERLDOC_H_
+#define _PERLDOC_H_
+
+#include <qobject.h>
+#include <kio/slavebase.h>
+
+
+class PerldocProtocol : public KIO::SlaveBase
+{
+public:
+ PerldocProtocol(const QCString &pool, const QCString &app);
+ virtual ~PerldocProtocol();
+
+ virtual void get(const KURL& url);
+ virtual void stat(const KURL& url);
+ virtual void mimetype(const KURL& url);
+ virtual void listDir(const KURL& url);
+
+protected:
+ void decodeURL(const KURL &url);
+ void decodePath(QString path);
+ QCString errorMessage();
+};
+
+#endif
diff --git a/languages/perl/perldoc.protocol b/languages/perl/perldoc.protocol
new file mode 100644
index 00000000..031ca931
--- /dev/null
+++ b/languages/perl/perldoc.protocol
@@ -0,0 +1,9 @@
+[Protocol]
+exec=kio_perldoc
+protocol=perldoc
+input=none
+output=filesystem
+reading=true
+listing=Name
+determineMimetypeFromExtension=false
+Icon=help
diff --git a/languages/perl/perlparser.cpp b/languages/perl/perlparser.cpp
new file mode 100644
index 00000000..a6a5a834
--- /dev/null
+++ b/languages/perl/perlparser.cpp
@@ -0,0 +1,494 @@
+/***************************************************************************
+ perlparser.cpp - description
+ -------------------
+ begin : Sun Nov 2 2003
+ copyright : (C) 2003 by luc
+ email : willems.luc(at)pandora.be
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "perlparser.h"
+
+#include <kdebug.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <qfileinfo.h>
+
+perlparser::perlparser(KDevCore* core,CodeModel* model, QString interpreter) {
+ m_core = core;
+ m_model = model;
+ m_interpreter=interpreter;
+ //get INC paths for current installed perl
+ getPerlINC();
+
+}
+
+perlparser::~perlparser(){
+}
+
+const QStringList perlparser::UseFiles()
+{
+ return m_usefiles;
+}
+
+void perlparser::initialParse() {
+ m_usefiles.clear();
+}
+
+void perlparser::parse(const QString &fileName){
+ QFile f(fileName);
+ if (!f.open(IO_ReadOnly))
+ return;
+ QTextStream stream(&f);
+ QStringList list;
+ QString rawline;
+ while (!stream.eof()) {
+ rawline = stream.readLine();
+ list.append(rawline.stripWhiteSpace().local8Bit());
+ }
+ f.close();
+ kdDebug(9016) << "parsing " << fileName << endl;
+
+ m_file = m_model->create<FileModel>();
+ m_file->setName(fileName );
+ this->parseLines(&list,fileName);
+ m_model->addFile( m_file );
+}
+
+void perlparser::parseLines(QStringList* lines,const QString &fileName)
+{
+ QRegExp packagere("^[ \t]*package[ \t]+([+A-Za-z0-9_:]*).*\\;");
+ QRegExp basere("^[ \t]*use[ \t]+base[ \t]*\\(\'*\"*([A-Za-z0-9_:]*)");
+ QRegExp libre("^[ \t]*use[ \t]+lib[ \t]*\\(\'*\"*([A-Za-z0-9_:]*)");
+ QRegExp usere("^[ \t]*use[ \t]+([+A-Za-z0-9_:]*).*\\;");
+ QRegExp isare("^[ \t]*@ISA[ \t=qw\\(\'\"]*([A-Za-z0-9_: ]*)");
+ QRegExp globalre("^[ \t]*our[ \t]+\\(*([ \t,$%@*+A-Za-z0-9_]*)\\)*.*");
+ QRegExp myre("^[ \t]*my[ \t]+\\(*([ \t,$%@*+A-Za-z0-9_]*)\\)*.*");
+ QRegExp subre("^[ \t]*sub[ \t]+([A-Za-z0-9_]+)([A-Za-z0-9_]|([ \t]*[{])?)$");
+ QRegExp blessre("bless[ \t]*[\\( ]*([,$%@*+A-Za-z0-9_]*).*;");
+ QRegExp namere("^[ \t]*([$%@*])([A-Za-z0-9_]*).*$");
+ QRegExp privatere("^_([A-Za-z0-9_]*)");
+ QRegExp startpod("^=[a-z0-9]+ [a-z0-9]*");
+ QRegExp cutpod("^=cut");
+
+ QString line;
+
+ //clear all "last" know things
+ m_lastsub="";
+ m_lastattr="";
+ m_inpackage = false;
+ m_inscript = false;
+ m_inclass=false;
+
+ m_lastscript=0;
+ m_lastpackage=0;
+ m_lastclass=0;
+
+ int lineNo = -1;
+
+ bool inpod = false;
+ bool endpod = false;
+
+ //check if we are parsing a script or module
+ QFileInfo fi(fileName);
+ bool inscript =(fi.extension() == "pl");
+ kdDebug(9016) << "inscript : " << inscript << "," << fi.extension() << endl;
+
+ if (inscript) {
+ addScript(fileName,lineNo,fi.fileName());
+ }
+
+ for ( QStringList::Iterator it = lines->begin(); it != lines->end(); ++it ) {
+ ++lineNo;
+ line = (*it).local8Bit();
+ //empty line ?
+ if (line.isEmpty()) { continue;}
+ //some POD checking , quick and dirty but it seams to work
+ if(inpod && endpod) { inpod=false; endpod=false;}
+ //are we in pod documentation ?
+ if (startpod.search(line)>=0) {inpod=true; continue;}
+ //are we in pod documentation ?
+ if (inpod) { endpod=( cutpod.search(line)>=0 ); continue; }
+
+
+ //sub matching
+ if (subre.search(line)>=0){
+ QString subname=subre.cap(1);
+ kdDebug(9016) << "subre match [" << subname << "]" << endl;
+ bool prive = privatere.search(subname) >= 0;
+ kdDebug(9016) << "prive match [" << prive << "]" << endl;
+ if (m_inscript) { addScriptSub(fileName,lineNo,subname,prive);}
+ else {
+ if (m_inclass) { addClassMethod(fileName,lineNo,subname,prive);}
+ else { addPackageSub(fileName,lineNo,subname,prive);}
+ }
+ continue;
+ } //sub
+
+ //our matching
+ if (globalre.search(line)>=0) {
+ //splitup multible ours
+ QString varlist=globalre.cap(1);
+ kdDebug(9016) << "globalre match [" << varlist <<"]" << endl;
+ QStringList vars=QStringList::split(",",varlist);
+ for ( QStringList::Iterator it = vars.begin(); it != vars.end(); ++it ) {
+ if (namere.search(*it)>=0) {
+ QString var = namere.cap(2);
+ kdDebug(9016) << "namere match [" << var << "]" << endl;
+ if (m_lastpackage) { addAttributetoPackage(fileName,lineNo,var); }
+ else { addAttributetoScript(fileName,lineNo,var); }
+ }
+ }
+ continue;
+ } //globalre
+
+
+ //bless matching
+ if ((blessre.search(line)>=0) && (!m_inscript)) {
+ kdDebug(9016) << "blessre match []" << endl;
+ addClass(fileName,lineNo);
+ addConstructor(fileName,lineNo,m_lastsub);
+ continue;
+ } //bless
+
+ //base matching
+ if ((basere.search(line)>=0) && (!m_inscript)) {
+ QString parent = basere.cap(1);
+ //create child & parent classes
+ kdDebug(9016) << "basere match [" << parent << "]" << endl;
+ addClass(fileName,lineNo);
+ addParentClass(parent);
+ continue;
+ } else {
+ if (libre.search(line)>=0) {
+ QString path = libre.cap(1);
+ //add lib to INC path list
+ kdDebug(9016) << "libre match [" << path << "]" << endl;
+ m_INClist.append(path);
+ continue;
+ } else {
+ if (usere.search(line)>=0) {
+ //add lib to use list for later parsing
+ QString lib = usere.cap(1);
+ kdDebug(9016) << "usere match [" << lib << "]" << endl;
+ addUseLib(lib);
+ continue;
+ } \
+ }
+ } //base
+
+ if ((isare.search(line)>=0) && (!m_inscript)) {
+ QString parent = isare.cap(1);
+ //create child & parent classes
+ kdDebug(9016) << "isare match [" << parent << "]" << endl;
+ addClass(fileName,lineNo);
+ addParentClass(parent);
+ continue;
+ } //isa
+
+ if ((packagere.search(line)>=0) && (!m_inscript)) {
+ QString package=packagere.cap(1);
+ kdDebug(9016) << "packagere match [" << package << "]" << endl;
+ addPackage(fileName,lineNo,package);
+ continue;
+ }//package
+
+ } // for lines loop
+}
+
+void perlparser::addPackage(const QString& fileName ,int lineNr , const QString& name)
+{
+ kdDebug(9016) << "AddPackage [" << name << "]" << endl;
+ NamespaceDom package = m_model->create<NamespaceModel>();
+
+ package->setName(name);
+ package->setFileName(fileName );
+ package->setStartPosition(lineNr, 0 );
+ package->setScope(name);
+
+ if (!m_file->hasNamespace(name)) {
+ m_file->addNamespace(package);
+ m_lastpackage=package;
+ } else {
+ kdDebug(9016) << "addPackage [" << name << " exist]" << endl;
+ }
+
+ //clear all "last" know things
+ m_lastpackagename=name;
+ m_lastsub="";
+ m_lastattr="";
+ m_inpackage=true;
+ m_inscript = false;
+ m_inclass=false;
+
+ m_lastclass=0;
+ m_lastscript=0;
+
+}
+
+void perlparser::addScript(const QString& fileName ,int lineNr ,const QString& name)
+{
+ kdDebug(9016) << "addScript [" << name << "]" << endl;
+
+ //map name of script under /scripts
+ //m_file->setName("/Scripts/"+name);
+
+ kdDebug(9016) << "addScript [" << name << "]" << endl;
+ NamespaceDom script = m_model->create<NamespaceModel>();
+
+ script->setName(name);
+ script->setFileName(fileName );
+ script->setStartPosition(lineNr, 0 );
+ script->setScope(name);
+
+ if (!m_file->hasNamespace(name)) {
+ m_file->addNamespace(script);
+ m_lastscript=script;
+ } else {
+ kdDebug(9016) << "addScript [" << name << " exist]" << endl;
+ }
+
+ //clear all "last" know things
+ m_lastsub="";
+ m_lastattr="";
+ m_inpackage = false;
+ m_inscript = true;
+ m_inclass=false;
+
+ m_lastscriptname=name;
+ m_lastpackage=0;
+ m_lastclass=0;
+
+}
+
+void perlparser::addAttributetoPackage(const QString& fileName ,int lineNr ,const QString& name)
+{
+ kdDebug(9016) << "addAttributetoPackage [" << name << "]" << endl;
+ VariableDom var = m_model->create<VariableModel>();
+ var->setName(name);
+ var->setFileName( fileName );
+ var->setStartPosition( lineNr, 0 );
+ if (m_lastpackage) {
+ if (!m_lastpackage->hasVariable(var->name()))
+ m_lastpackage->addVariable(var);
+ } else {
+ kdDebug(9016) << "addAttributetoPackge[ no m_file]" << endl;
+ }
+
+ m_lastattr=name;
+}
+
+void perlparser::addAttributetoScript(const QString& fileName ,int lineNr ,const QString& name)
+{
+ kdDebug(9016) << "addAttributetoScript [" << name << "]" << endl;
+ VariableDom var = m_model->create<VariableModel>();
+ var->setName(name);
+ var->setFileName( fileName );
+ var->setStartPosition( lineNr, 0 );
+ if (m_lastscript) {
+ if (!m_lastscript->hasVariable(var->name()))
+ m_lastscript->addVariable(var);
+ } else {
+ kdDebug(9016) << "addAttributeScript[ no m_file]" << endl;
+ }
+}
+
+void perlparser::addClass(const QString& fileName ,int lineNr)
+{
+ kdDebug(9016) << "addClass [ " << m_lastpackagename << " ]" << endl;
+ if (m_lastpackage->hasClass(m_lastpackagename)) {
+ kdDebug(9016) << "Class already defined" << endl;
+ } else {
+ kdDebug(9016) << "new Class" << endl;
+ ClassDom lastClass = m_model->create<ClassModel>();
+ lastClass->setName(m_lastpackagename);
+ lastClass->setFileName(fileName);
+ lastClass->setStartPosition(lineNr, 0);
+ m_lastpackage->addClass(lastClass);
+ m_lastclass=lastClass;
+ m_inclass=true;
+ }
+}
+
+void perlparser::addConstructor(const QString& fileName ,int lineNr ,const QString& name)
+{
+ kdDebug(9016) << "set Constructor["<< name << "]" << endl;
+
+ FunctionDom method;
+
+ if (m_lastpackage->hasFunction(name)) {
+ //remove last sub frompackage scope
+ method = m_lastpackage->functionByName(name)[0];
+ method->getStartPosition(&lineNr,0);
+ m_lastpackage->removeFunction(method);
+ }
+ method = m_lastclass->functionByName(name)[0];
+ if (!method) {
+ kdDebug(9016) << "add new Constructor["<< name << ", " << lineNr << "]" << endl;
+ method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ m_lastclass->addFunction(method);
+ }
+ method->setStatic(true);
+ //update class position
+ m_lastclass->setStartPosition(lineNr,0);
+}
+
+void perlparser::addGlobalSub(const QString& fileName ,int lineNr ,const QString& name ,bool privatesub)
+{
+ kdDebug(9016) << "addGlobalSub[ " << name << "]" << endl;
+
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ method->setStatic(true);
+ if (privatesub)
+ method->setAccess(CodeModelItem::Private);
+ if (m_lastpackage) {
+ if (!m_lastpackage->hasFunction(method->name()))
+ m_lastpackage->addFunction(method);
+ } else {
+ kdDebug(9016) << "addGlobalsub[ no m_lastpackage]" << endl;
+ }
+
+ //also add seperate to namespace
+ addPackageSub(fileName,lineNr,name,privatesub);
+ m_lastsub=name;
+}
+
+void perlparser::addScriptSub(const QString& fileName ,int lineNr ,const QString& name ,bool privatesub)
+
+{
+ kdDebug(9016) << "addScriptSub[ " << name << "]" << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ if (privatesub)
+ method->setAccess(CodeModelItem::Private);
+ if(m_lastscript) {
+ m_lastscript->addFunction(method);
+ } else {
+ }
+
+ m_lastsub=name;
+}
+
+void perlparser::addClassMethod(const QString& fileName ,int lineNr ,const QString& name ,bool privatesub)
+{
+ kdDebug(9016) << "addClassMethod[ " << name << "]" << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ method->setVirtual(true);
+ if (privatesub)
+ method->setAccess(CodeModelItem::Private);
+ if (m_lastclass) {
+ if (!m_lastclass->hasFunction(method->name()))
+ m_lastclass->addFunction(method);
+ } else {
+ kdDebug(9016) << "addClassmethod[ no m_lastclass]" << endl;
+ }
+
+// addPackageSub(fileName,lineNr,name,privatesub);
+ m_lastsub=name;
+}
+
+void perlparser::addPackageSub(const QString& fileName ,int lineNr ,const QString& name ,bool privatesub)
+{
+ kdDebug(9016) << "addPackageSub[ " << name << "]" << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ if (privatesub)
+ method->setAccess(CodeModelItem::Private);
+ if (m_lastpackage) {
+ if (!m_lastpackage->hasFunction(method->name()))
+ m_lastpackage->addFunction(method);
+ } else {
+ kdDebug(9016) << "addPackageSub[ no m_file]" << endl;
+ }
+ m_lastsub=name;
+}
+
+void perlparser::addParentClass(const QString& parent)
+{
+ kdDebug(9016) << "addParentClass[ " << parent << "]" << endl;
+ if (m_lastclass) {
+ m_lastclass->addBaseClass(parent);
+ } else {
+ kdDebug(9016) << "addParentClass[ no m_lastclass]" << endl;
+ }
+}
+
+void perlparser::addUseLib(const QString& lib)
+{
+ if (!m_model->hasFile(lib)) {
+ if (m_usefiles.findIndex(lib) == -1) {
+ //only add if not already parsed or in the list
+ kdDebug(9016) << "add lib for later parsing [" << lib << "]" << endl;
+ m_usefiles.append(lib);
+ }
+ }
+}
+
+void perlparser::getPerlINC() {
+
+
+ m_INClist.clear();
+
+ QString cmd = "/usr/bin/perl -e\" print join('|',@INC);\"";
+ QString result;
+
+ FILE *fd = popen(cmd.local8Bit().data(), "r");
+ char buffer[4090];
+ QByteArray array;
+
+ while (!feof(fd)) {
+ int n = fread(buffer, 1, 2048, fd);
+ if (n == -1) {
+ pclose(fd);
+ return;
+ }
+ array.setRawData(buffer, n);
+ result=QString::QString(array);
+ array.resetRawData(buffer, n);
+ }
+ pclose(fd);
+ //get INC list so we can use it to parse "use" modules
+ m_INClist = QStringList::split(QString("|"),result);
+ kdDebug(9016) << "INC " << m_INClist.size() << " "<< result << endl;
+}
+
+QString perlparser::findLib( const QString& lib)
+{
+ QString result;
+
+ QString file=lib;
+ file.replace( QRegExp("::"), QString("/"));
+
+ //find the correct path by using the INC list
+ QStringList::Iterator inc = m_INClist.begin();
+ while((inc != m_INClist.end()) && (result.isEmpty()) ) {
+ QFileInfo fi((*inc) + "/" + file + ".pm");
+ if ( fi.exists() ) {
+ result = (*inc) + "/" + file + ".pm";
+ }
+ ++inc;
+ }
+ return result;
+}
+
diff --git a/languages/perl/perlparser.h b/languages/perl/perlparser.h
new file mode 100644
index 00000000..01ded7d8
--- /dev/null
+++ b/languages/perl/perlparser.h
@@ -0,0 +1,87 @@
+/***************************************************************************
+ perlparser.h - description
+ -------------------
+ begin : Sun Nov 2 2003
+ copyright : (C) 2003 by luc
+ email : luc@lieve
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef PERLPARSER_H
+#define PERLPARSER_H
+
+#include "kdevlanguagesupport.h"
+#include <codemodel.h>
+
+
+/**perl source to classview parser
+ *@author luc
+ */
+
+class perlparser {
+ public:
+ perlparser(KDevCore* core,CodeModel* model, QString interpreter);
+ perlparser();
+ ~perlparser();
+
+ void initialParse();
+ void parse(const QString &fileName);
+ void parseLines(QStringList* lines,const QString& fileName);
+ const QStringList UseFiles();
+ QString findLib( const QString& lib);
+
+ private:
+ //global functions to add to ClassStore
+ void addPackage(const QString& fileName ,int lineNr , const QString& name);
+ void addAttributetoScript(const QString& fileName ,int lineNr ,const QString& name);
+ void addAttributetoPackage(const QString& fileName ,int lineNr ,const QString& name);
+ void addClass(const QString& fileName ,int lineNr );
+ void addConstructor(const QString& fileName ,int lineNr ,const QString& methodname);
+ void addGlobalSub(const QString& fileName ,int lineNr , const QString& name, bool privatesub);
+ void addScriptSub(const QString& fileName ,int lineNr , const QString& name, bool privatesub);
+ void addClassMethod(const QString& fileName ,int lineNr , const QString& name , bool privatesub);
+ void addPackageSub(const QString& fileName ,int lineNr , const QString& name, bool privatesub);
+ void addParentClass(const QString& parent);
+ void addScript(const QString& fileName ,int lineNr , const QString& name);
+ void addUseLib(const QString& lib);
+ void getPerlINC();
+
+ bool m_inpackage;
+ bool m_inscript;
+ bool m_inclass;
+
+ QString m_lastsub;
+ QString m_lastparentclass;
+ QString m_lastattr;
+ QString m_lastpackagename;
+ QString m_lastscriptname;
+
+ NamespaceDom m_lastscript;
+ NamespaceDom m_lastpackage;
+ ClassDom m_lastclass;
+
+ //CodeModel
+ CodeModel* m_model;
+ KDevCore* m_core;
+ FileDom m_file;
+
+ //this willhav a list of INC paths
+ QStringList m_INClist;
+ //this will get a list off all files "use" in the perl files
+ //and need additional parsing to include the classes in the classview
+ QStringList m_usefiles;
+
+ QString m_interpreter;
+
+
+};
+
+#endif
diff --git a/languages/perl/perlsupportpart.cpp b/languages/perl/perlsupportpart.cpp
new file mode 100644
index 00000000..4305644e
--- /dev/null
+++ b/languages/perl/perlsupportpart.cpp
@@ -0,0 +1,330 @@
+/***************************************************************************
+ * Copyright (C) 2001-2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "perlsupportpart.h"
+
+#include <qfileinfo.h>
+#include <qpopupmenu.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdevgenericfactory.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <qregexp.h>
+#include <codemodel.h>
+#include <qprogressbar.h>
+#include <kstatusbar.h>
+#include "kdevmainwindow.h"
+
+#include <kprocess.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevpartcontroller.h"
+#include "kdevplugininfo.h"
+#include "kdevappfrontend.h"
+//#include "classstore.h"
+//#include "parsedclass.h"
+//#include "parsedmethod.h"
+//#include "parsedscript.h"
+#include "domutil.h"
+//#include "programmingbycontract.h"
+
+typedef KDevGenericFactory<PerlSupportPart> PerlSupportFactory;
+static const KDevPluginInfo data("kdevperlsupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevperlsupport, PerlSupportFactory( data ) )
+
+PerlSupportPart::PerlSupportPart(QObject *parent, const char *name, const QStringList &)
+ : KDevLanguageSupport(&data, parent, name ? name : "PerlSupportPart")
+{
+ setInstance(PerlSupportFactory::instance());
+
+ setXMLFile("kdevperlsupport.rc");
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+
+ KAction *action;
+
+ action = new KAction( i18n("Execute Main Program"), "exec", 0,
+ this, SLOT(slotExecute()),
+ actionCollection(), "build_exec" );
+ action->setToolTip( i18n("Runs the Perl program") );
+
+ action = new KAction( i18n("Execute String..."), "exec", 0,
+ this, SLOT(slotExecuteString()),
+ actionCollection(), "build_execstring" );
+ action->setToolTip( i18n("Executes a string as Perl code") );
+
+ action = new KAction( i18n("Start Perl Interpreter"), "exec", 0,
+ this, SLOT(slotStartInterpreter()),
+ actionCollection(), "build_runinterpreter" );
+ action->setToolTip( i18n("Starts the Perl interpreter without a program") );
+
+ action = new KAction( i18n("Find Perl Function Documentation..."), 0,
+ this, SLOT(slotPerldocFunction()),
+ actionCollection(), "help_perldocfunction" );
+ action->setToolTip( i18n("Show the documentation page of a Perl function") );
+
+ action = new KAction( i18n("Find Perl FAQ Entry..."), 0,
+ this, SLOT(slotPerldocFAQ()),
+ actionCollection(), "help_perldocfaq" );
+ action->setToolTip( i18n("Show the FAQ entry for a keyword") );
+
+ //perl parser for codemodel
+ m_parser = new perlparser(core(),codeModel(),interpreter());
+}
+
+
+PerlSupportPart::~PerlSupportPart()
+{
+ if (project())
+ projectClosed();
+
+ delete m_parser;
+ m_parser=0;
+}
+
+
+void PerlSupportPart::projectOpened()
+{
+ kdDebug(9007) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(0, this, SLOT(initialParse()));
+}
+
+
+void PerlSupportPart::projectClosed()
+{
+}
+
+void PerlSupportPart::maybeParse(const QString fileName)
+{
+ QFileInfo fi(fileName);
+ QString path = fi.filePath();
+ QString extension = fi.extension();
+ if (extension == "pl" || extension == "pm") {
+ kdDebug(9016) << "maybe " << fileName << endl;
+ removeWithReference(fileName);
+ m_parser->parse(fileName);
+ emit addedSourceInfo( fileName);
+ }
+}
+
+void PerlSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug(9016) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ maybeParse(project()->projectDirectory() + "/" + ( *it ));
+ }
+}
+
+
+void PerlSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug(9016) << "removedFilesFromProject()" << endl;
+ QStringList::ConstIterator it;
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ removeWithReference(fileName);
+ }
+ emit updatedSourceInfo();
+}
+
+
+void PerlSupportPart::savedFile(const KURL &fileName)
+{
+ Q_UNUSED( fileName.path() );
+#if 0 // not needed anymore
+ kdDebug(9016) << "savedFile()" << endl;
+
+ if (project()->allFiles().contains(fileName.mid ( project()->projectDirectory().length() + 1 ))) {
+ maybeParse(fileName);
+ emit updatedSourceInfo();
+ }
+#endif
+}
+
+
+KDevLanguageSupport::Features PerlSupportPart::features()
+{
+ return KDevLanguageSupport::Features(Classes | Functions | Variables | Namespaces | /*Scripts | */NewClass | AddMethod | AddAttribute /*| NewScript*/);
+// return Functions;
+}
+
+QString PerlSupportPart::interpreter()
+{
+ QString prog = DomUtil::readEntry(*projectDom(), "/kdevperlsupport/run/interpreter");
+ if (prog.isEmpty())
+ prog = "perl";
+
+ return prog;
+}
+
+
+void PerlSupportPart::startApplication(const QString &program)
+{
+ bool inTerminal = DomUtil::readBoolEntry(*projectDom(), "/kdevperlsupport/run/terminal");
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), program, inTerminal);
+}
+
+
+void PerlSupportPart::slotExecute()
+{
+ QString program = project()->mainProgram();
+ QString cmd = interpreter() + " " + program;
+ startApplication(cmd);
+}
+
+
+void PerlSupportPart::slotStartInterpreter()
+{
+ startApplication(interpreter());
+}
+
+
+void PerlSupportPart::slotExecuteString()
+{
+ bool ok;
+ QString cmd = KInputDialog::getText(i18n("String to Execute"), i18n("String to execute:"), QString::null, &ok, 0);
+ if (ok) {
+ cmd.prepend("'");
+ cmd.append("'");
+ startApplication(cmd);
+ }
+}
+
+
+void PerlSupportPart::slotPerldocFunction()
+{
+ bool ok;
+ QString key = KInputDialog::getText(i18n("Show Perl Documentation"), i18n("Show Perl documentation for function:"), "", &ok, 0);
+ if (ok && !key.isEmpty()) {
+ QString url = "perldoc:functions/";
+ url += key;
+ partController()->showDocument(KURL(url));
+ }
+}
+
+
+void PerlSupportPart::slotPerldocFAQ()
+{
+ bool ok;
+ QString key = KInputDialog::getText(i18n("Show FAQ Entry"), i18n("Show FAQ entry for keyword:"), "", &ok, 0);
+ if (ok && !key.isEmpty()) {
+ QString url = "perldoc:faq/";
+ url += key;
+ partController()->showDocument(KURL(url));
+ }
+}
+KMimeType::List PerlSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "application/x-perl" );
+ if( mime )
+ list << mime;
+ return list;
+}
+
+void PerlSupportPart::initialParse()
+{
+ kdDebug(9016) << "initialParse()" << endl;
+
+ if (project()) {
+ //copy from cpp support : give user some feedback
+ mainWindow()->statusBar()->message( i18n("Updating...") );
+ kapp->processEvents( );
+
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ m_parser->initialParse();
+
+ //progress bar
+ QProgressBar* bar = new QProgressBar( files.count( ), mainWindow( )->statusBar( ) );
+ bar->setMinimumWidth( 120 );
+ bar->setCenterIndicator( true );
+ mainWindow( )->statusBar( )->addWidget( bar );
+ bar->show( );
+ int n = 0;
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it) {
+// kdDebug(9016) << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+ maybeParse(project()->projectDirectory() + "/" + *it);
+ //update progress bar
+ bar->setProgress( n++ );
+ if( (n%5) == 0 )
+ kapp->processEvents();
+ }
+ parseUseFiles();
+ emit updatedSourceInfo();
+
+ //remove progressbar
+ mainWindow( )->statusBar( )->removeWidget( bar );
+ delete bar;
+ kapp->restoreOverrideCursor();
+ mainWindow()->statusBar()->message( i18n("Done") );
+
+ } else {
+ kdDebug(9016) << "No project" << endl;
+ }
+}
+
+void PerlSupportPart::removeWithReference( const QString & fileName )
+{
+ kdDebug(9016) << "remove with references: " << fileName << endl;
+ //m_timestamp.remove( fileName );
+ if( !codeModel()->hasFile(fileName) )
+ return;
+
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+}
+
+void PerlSupportPart::parseUseFiles()
+{
+ kdDebug(9016) << "parse addional libs" << endl;
+ return;
+ QString filename;
+ QStringList m_usefiles = m_parser->UseFiles();
+
+ //parse addional use files
+ for (QStringList::Iterator it = m_usefiles.begin(); it != m_usefiles.end() ;++it)
+ {
+ filename = m_parser->findLib(*it);
+ //if something found , parse it
+ if (!filename.isEmpty()) {
+ //kdDebug(9016) << "found " << filename << endl;
+ maybeParse(filename);
+ }
+ }
+}
+
+#include "perlsupportpart.moc"
diff --git a/languages/perl/perlsupportpart.h b/languages/perl/perlsupportpart.h
new file mode 100644
index 00000000..91765a47
--- /dev/null
+++ b/languages/perl/perlsupportpart.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ * Copyright (C) 2001-2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PERLSUPPORTPART_H_
+#define _PERLSUPPORTPART_H_
+
+#include "kdevlanguagesupport.h"
+#include <codemodel.h>
+#include "perlparser.h"
+
+class PerlSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+ PerlSupportPart( QObject *parent, const char *name, const QStringList & );
+ ~PerlSupportPart();
+
+protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+private slots:
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void slotExecute();
+ void slotExecuteString();
+ void slotStartInterpreter();
+
+ // Internal
+ void initialParse();
+ void slotPerldocFunction();
+ void slotPerldocFAQ();
+
+private:
+ QString interpreter();
+ void startApplication(const QString &program);
+ void maybeParse(const QString fileName);
+ void parse(const QString &fileName);
+ void parseLines(QStringList* lines,const QString& fileName);
+ void removeWithReference( const QString & fileName );
+ void parseUseFiles();
+ //Perl Parser
+ perlparser* m_parser;
+
+};
+
+#endif
diff --git a/languages/php/Makefile.am b/languages/php/Makefile.am
new file mode 100644
index 00000000..ac053aaf
--- /dev/null
+++ b/languages/php/Makefile.am
@@ -0,0 +1,24 @@
+# Here resides the PHP support part.
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ -I$(top_srcdir)/lib/widgets $(all_includes)
+SUBDIRS = data app_templates file_templates doc
+
+
+kde_module_LTLIBRARIES = libkdevphpsupport.la
+libkdevphpsupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevphpsupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la $(top_builddir)/lib/widgets/libkdevwidgets.la $(LIB_KHTML)
+
+libkdevphpsupport_la_SOURCES = phpsupportpart.cpp phpconfigwidgetbase.ui phpconfigwidget.cpp phpinfodlg.ui phphtmlview.cpp phperrorview.cpp phpconfigdata.cpp phpcodecompletion.cpp phpparser.cpp phpnewclassdlgbase.ui phpnewclassdlg.cpp phpfile.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevphpsupport.desktop
+
+rcdir = $(kde_datadir)/kdevphpsupport
+rc_DATA = kdevphpsupport.rc
+
+templatedir = ${kde_datadir}/kdevabbrev/templates
+template_DATA = phptemplates
diff --git a/languages/php/README.dox b/languages/php/README.dox
new file mode 100644
index 00000000..14e69997
--- /dev/null
+++ b/languages/php/README.dox
@@ -0,0 +1,32 @@
+/** \class PHPSupportPart
+This is PHP language support plugin.
+
+Support for the <a href="http://www.php.net">PHP Language</a>, you can
+develop php script for web or php script for shell.
+
+It's support checking of your script with problems report and also parse
+all include files from your script.
+
+\authors <a href="mailto:smeier AT kdevelop.org">Sandy Meier</a>
+\authors <a href="mailto:n.escuder AT intra-links.com">Escuder Nicolas</a>
+
+\maintainer <a href="mailto:smeier AT kdevelop.org">Sandy Meier</a>
+\maintainer <a href="mailto:n.escuder AT intra-links.com">Escuder Nicolas</a>
+
+\feature PHP language support
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug bugs in <a href="http://bugs.kde.org/buglist.cgi?product=kdevelop&component=php+support&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=Bug+Number">php support component at Bugzilla database</a>
+
+\requirement PHP Cli Version or WebServer with php
+
+\todo extended classtools (new class,new function...) based on filetemplates
+\todo debugger and profiler support dbg (http://dd.cron.ru/dbg)
+\todo html form support (dialogs for generating html code, tables...)
+\todo support for phpdoc
+\todo documentation viewer for php (maybe plugins for the current docviewer) (tf)
+\todo integrated filemanager with ftp client (maybe a konqueror part)
+\todo code template factory (contains useful php code snippet like array_display,trace,validator)
+\todo new functions list from php 5 documentation
+
+*/
diff --git a/languages/php/app_templates/Makefile.am b/languages/php/app_templates/Makefile.am
new file mode 100644
index 00000000..12fdee76
--- /dev/null
+++ b/languages/php/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = phphello
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/ScriptingLanguageIDE/PHPIDE
+profiles_DATA = php.appwizard
diff --git a/languages/php/app_templates/php.appwizard b/languages/php/app_templates/php.appwizard
new file mode 100644
index 00000000..5cddaac5
--- /dev/null
+++ b/languages/php/app_templates/php.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=phphello
diff --git a/languages/php/app_templates/phphello/.kdev_ignore b/languages/php/app_templates/phphello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/php/app_templates/phphello/.kdev_ignore
diff --git a/languages/php/app_templates/phphello/Makefile.am b/languages/php/app_templates/phphello/Makefile.am
new file mode 100644
index 00000000..12d29f1b
--- /dev/null
+++ b/languages/php/app_templates/phphello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.php app.kdevelop
+templateName = phphello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/php/app_templates/phphello/app.kdevelop b/languages/php/app_templates/phphello/app.kdevelop
new file mode 100644
index 00000000..c8844e1e
--- /dev/null
+++ b/languages/php/app_templates/phphello/app.kdevelop
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>PHP</primarylanguage>
+ <keywords>
+ <keyword>PHP</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ </ignoreparts>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <activedir></activedir>
+ <includepatterns>*.php,*.phps,*.php3,*.inc</includepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+<kdevphpsupport>
+ <codeHelp>
+ <codeCompletion>true</codeCompletion>
+ <codeHinting>true</codeHinting>
+ <realtimeParsing>true</realtimeParsing>
+ </codeHelp>
+</kdevphpsupport>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="php"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.php;*.phps;*.php3" name="PHP files" />
+ <group pattern="*.inc" name="Include files" />
+ </groups>
+ </kdevfileview>
+</kdevelop>
diff --git a/languages/php/app_templates/phphello/app.php b/languages/php/app_templates/phphello/app.php
new file mode 100644
index 00000000..c6a62b4f
--- /dev/null
+++ b/languages/php/app_templates/phphello/app.php
@@ -0,0 +1,28 @@
+<?php
+
+%{PHP_TEMPLATE}
+
+printHeader();
+echo "<h1>Hello World!</h1>\n";
+printFooter();
+
+function printHeader(){
+ echo <<<EOF
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+ <meta name="description" content="" />
+ <meta name="author" content="%{AUTHOR}" />
+ <meta name="keywords" content="" />
+ <title>%{APPNAME}</title>
+</head>
+<body>
+
+EOF;
+}
+
+function printFooter(){
+ echo "</body>\n</html>";
+}
+
+?>
diff --git a/languages/php/app_templates/phphello/phphello b/languages/php/app_templates/phphello/phphello
new file mode 100644
index 00000000..f9f1a69f
--- /dev/null
+++ b/languages/php/app_templates/phphello/phphello
@@ -0,0 +1,25 @@
+# KDE Config File
+[General]
+Name=Simple PHP script
+Name[fr]=Un simple script de test « Hello world »
+Category=PHP
+Comment=This generates a simplistic 'Hello world' program in PHP (http://www.php.net)
+Comment[fr]=Génère un simple script de test du type « Hello world » dans le language PHP (http://www.php.net).
+DefaultDestinatonDir=HOMEDIR/public_html
+FileTemplates=php,CPPStyle
+ShowFilesAfterGeneration=%{APPNAMELC}.php
+Archive=phphello.tar.gz
+
+[PROJECT]
+Type=install
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[APP.PHP]
+Type=install
+Source=%{src}/app.php
+Dest=%{dest}/%{APPNAMELC}.php
+
+[MGS]
+Type=message
+Comment=A simple PHP project was created in %{dest}.
diff --git a/languages/php/app_templates/phphello/phphello.kdevtemplate b/languages/php/app_templates/phphello/phphello.kdevtemplate
new file mode 100644
index 00000000..8d52f490
--- /dev/null
+++ b/languages/php/app_templates/phphello/phphello.kdevtemplate
@@ -0,0 +1,108 @@
+# KDE Config File
+[General]
+Name=Simple PHP script
+Name[ca]=Simple script en PHP
+Name[da]=Simpelt PHP script
+Name[de]=Einfaches PHP-Skript
+Name[el]=Απλό σενάÏιο PHP
+Name[es]=Guión sencillo en PHP
+Name[et]=Lihtne PHP skript
+Name[eu]=PHP script sinplea
+Name[fa]=دست‌نوشتۀ سادۀ پی‌اچ‌پی
+Name[fr]=Script PHP simple
+Name[ga]=Script Simplí PHP
+Name[gl]=Script sinxelo en PHP
+Name[hu]=Egyszerű PHP-szkript
+Name[it]=Semplice script PHP
+Name[ja]=ç°¡å˜ãª PHP スクリプト
+Name[nds]=Eenfach PHP-Skript
+Name[ne]=साधारण पी à¤à¤š पी सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ
+Name[nl]=Eenvoudig PHP-script
+Name[pl]=Prosty skrypt w PHP
+Name[pt]=Programa simples em PHP
+Name[pt_BR]=Programa simples em PHP
+Name[ru]=ПроÑтой Ñкрипт PHP
+Name[sk]=Jednoduchý PHP skript
+Name[sr]=ЈедноÑтавна PHP Ñкрипта
+Name[sr@Latn]=Jednostavna PHP skripta
+Name[sv]=Enkelt PHP-skript
+Name[tr]=Basit PHP betiÄŸi
+Name[zh_CN]=ç®€å• PHP 脚本
+Name[zh_TW]=簡單的 PHP 文稿
+Category=PHP
+Comment=This generates a simplistic 'Hello world' program in PHP (http://www.php.net)
+Comment[ca]=Genera un simple programa de 'Hello world' en PHP (http://www.php.net)
+Comment[da]=Dette genererer et simplistisk 'Goddag verden' program i PHP (http://www.php.net)
+Comment[de]=Hiermit wird ein einfaches "Hello World"-Programm in PHP erstellt (http://www.php.net).
+Comment[el]=Αυτό δημιουÏγεί ένα Ï€ÏόγÏαμμα 'Γεια σου κόσμε' σε PHP (http://www.php.net)
+Comment[es]=Genera un programa «Hola mundo» sencillo en PHP (http://www.php.net)
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine PHP-s (http://www.php.net)
+Comment[eu]=Honek PHP-n (http://www.php.net) idatzitako "Kaixo mundua" programa sinple bat sortzen du
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در پی‌اچ‌پی ( http://www.php.net)تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en PHP (http://www.php.net)
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí "Hello world" i PHP (http://www.php.net/)
+Comment[gl]=Isto xera un programa sinxelo en PHP 'Ola mundo'(http://www.php.net)
+Comment[hu]=Létrehoz egy egyszerű 'Hello world' programot PHP-ban (http://www.php.net)
+Comment[it]=Genera un semplice programma di "Hello world" in PHP (http://www.php.net)
+Comment[ja]=PHP ã§æ›¸ã‹ã‚ŒãŸç°¡å˜ãª Hello world プログラムを作æˆã—ã¾ã™
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm in PHP op. (http://www.php.net)
+Comment[ne]=यसले पी à¤à¤š पी मा साधारण 'हेलà¥à¤²à¥‹ वोलà¥à¤¡' कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›(http://www.php.net)
+Comment[nl]=Dit genereert een eenvoudig 'Hello World'-programma in PHP (http://www.php.net)
+Comment[pl]=Generuje prosty program "Witaj świecie" w PHP (http://www.php.net)
+Comment[pt]=Isto gera uma programa simples 'Olá Mundo' em PHP (http://www.php.net)
+Comment[pt_BR]=Isto gera uma programa simples 'Olá Mundo' em PHP (http://www.php.net)
+Comment[ru]=Создание проÑтой программы 'Hello world' на PHP (http://www.php.net)
+Comment[sk]=Vygeneruje jednoduchý Ahoj svet program v PHP (http://www.php.net)
+Comment[sr]=Ово прави једноÑтаван „Здраво Ñвете“ програм у PHP-у (http://www.php.net)
+Comment[sr@Latn]=Ovo pravi jednostavan „Zdravo svete“ program u PHP-u (http://www.php.net)
+Comment[sv]=Detta skapar ett förenklat 'Hello world'-program i PHP (http://www.php.net)
+Comment[tr]=Bu PHP'de basit bir "Merhaba Dünya "programı yaratır (http://www.php.net)
+Comment[zh_CN]=这将生æˆä¸€ä¸ªç®€å•çš„ PHP 语言“Hello worldâ€ç¨‹åº
+Comment[zh_TW]=產生一個 PHP(http://www.php.net)的 Hello world 程å¼
+DefaultDestinatonDir=HOMEDIR/public_html
+FileTemplates=php,CPPStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.php
+Archive=phphello.tar.gz
+
+[PROJECT]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[APP.PHP]
+Type=install
+Source=%{src}/app.php
+Dest=%{dest}/%{APPNAMELC}.php
+
+[MGS]
+Type=message
+Comment=A simple PHP project was created in %{dest}.
+Comment[ca]=Un simple projecte en PHP ha estat creat en %{dest}.
+Comment[da]=Et simpelt PHP projekt blev oprettet i %{dest}.
+Comment[de]=Ein einfaches PHP-Projekt wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό έÏγο PHP δημιουÏγήθηκε στο %{dest}.
+Comment[es]=Un sencillo proyecto en PHP ha sido creado en %{dest}.
+Comment[et]=Lihtne PHP projekt loodi asukohta %{dest}.
+Comment[eu]=PHP-n idatzitako programa sinple bat sortu da hemen: %{dest}.
+Comment[fa]=یک پروژۀ سادۀ پی‌اچ‌پی در %{dest} ایجاد شد.
+Comment[fr]=Un projet PHP simple a été créé dans %{dest}.
+Comment[ga]=Cruthaíodh tionscadal simplí PHP i %{dest}
+Comment[gl]=Creouse un proxecto sinxelo en PHP en %{dest}
+Comment[hu]=Létrejött egy egyszerű PHP-alapú projekt itt: %{dest}.
+Comment[it]=È stato creato un semplice progetto PHP in %{dest}.
+Comment[ja]=ç°¡å˜ãª PHP プロジェクトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach PHP-Projekt opstellt.
+Comment[ne]=साधारण PHP परियोजना %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig PHP-project is aangemaakt in %{dest}.
+Comment[pl]=Prosty projekt w PHP został utworzony w %{dest}.
+Comment[pt]=Foi criado um projecto simples em PHP em %{dest}.
+Comment[pt_BR]=Foi criado um projecto simples em PHP em %{dest}.
+Comment[ru]=ПроÑтой Ñкрипт PHP Ñоздан в %{dest}.
+Comment[sk]=Jednoduchý PHP projekt bol vytvorený v %{dest}.
+Comment[sr]=ЈедноÑтаван PHP пројекат направљен је у %{dest}.
+Comment[sr@Latn]=Jednostavan PHP projekat napravljen je u %{dest}.
+Comment[sv]=Ett enkelt PHP-projekt skapades i %{dest}.
+Comment[tr]=Basit bir PHP projesi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简å•çš„ PHP 工程。
+Comment[zh_TW]=一個簡單的 PHP 專案已建立於 %{dest}
diff --git a/languages/php/app_templates/phphello/phphello.png b/languages/php/app_templates/phphello/phphello.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/php/app_templates/phphello/phphello.png
Binary files differ
diff --git a/languages/php/data/Makefile.am b/languages/php/data/Makefile.am
new file mode 100644
index 00000000..e54b0415
--- /dev/null
+++ b/languages/php/data/Makefile.am
@@ -0,0 +1,6 @@
+phpsupportdatadir = ${kde_datadir}/kdevphpsupport
+
+install-data-local:
+ mkdir -p $(DESTDIR)$(phpsupportdatadir)
+ $(INSTALL_DATA) $(srcdir)/phpfunctions $(DESTDIR)$(phpsupportdatadir)/phpfunctions
+
diff --git a/languages/php/data/phpfunctions b/languages/php/data/phpfunctions
new file mode 100644
index 00000000..d0897bd5
--- /dev/null
+++ b/languages/php/data/phpfunctions
@@ -0,0 +1,1657 @@
+CODING_STANDARDS:int abs(int number)
+CODING_STANDARDS:object imap_header(int stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]])
+README:bool my_drawtext(resource image, string text, resource font, int x, int y[, int color])
+zend_builtin_functions:int strlen(string str)
+zend_builtin_functions:int strcmp(string str1, string str2)
+zend_builtin_functions:int strncmp(string str1, string str2, int len)
+zend_builtin_functions:int strcasecmp(string str1, string str2)
+zend_builtin_functions:int strncasecmp(string str1, string str2, int len)
+zend_builtin_functions:string get_class(object object)
+zend_builtin_functions:string get_parent_class(object object)
+zend_builtin_functions:bool is_subclass_of(object object, string class_name)
+zend_builtin_functions:array get_class_vars(string class_name)
+zend_builtin_functions:array get_object_vars(object obj)
+zend_builtin_functions:array get_class_methods(string class_name)
+zend_builtin_functions:bool method_exists(object object, string method)
+zend_builtin_functions:bool class_exists(string classname)
+zend_builtin_functions:bool function_exists(string function_name)
+zend_builtin_functions:array get_included_files(void)
+zend_builtin_functions:void trigger_error(string messsage [, int error_type])
+zend_builtin_functions:string set_error_handler(string error_handler)
+zend_builtin_functions:void restore_error_handler(void)
+zend_builtin_functions:array get_declared_classes(void)
+zend_builtin_functions:string create_function(string args, string code)
+aspell:int aspell_new(string master [, string personal])
+aspell:array aspell_suggest(aspell int, string word)
+aspell:int aspell_check(aspell int, string word)
+aspell:int aspell_check_raw(aspell int, string word)
+bcmath:string bcadd(string left_operand, string right_operand [, int scale])
+bcmath:string bcsub(string left_operand, string right_operand [, int scale])
+bcmath:string bcmul(string left_operand, string right_operand [, int scale])
+bcmath:string bcdiv(string left_operand, string right_operand [, int scale])
+bcmath:string bcmod(string left_operand, string right_operand)
+bcmath:string bcpow(string x, string y [, int scale])
+bcmath:string bcsqrt(string operand [, int scale])
+bcmath:string bccomp(string left_operand, string right_operand [, int scale])
+bcmath:string bcscale(int scale)
+cal_unix:int unixtojd([int timestamp])
+cal_unix:int jdtounix(int jday)
+calendar:string jdtogregorian(int juliandaycount)
+calendar:int gregoriantojd(int month, int day, int year)
+calendar:string jdtojulian(int juliandaycount)
+calendar:int juliantojd(int month, int day, int year)
+calendar:string jdtojewish(int juliandaycount)
+calendar:int jewishtojd(int month, int day, int year)
+calendar:string jdtofrench(int juliandaycount)
+calendar:int frenchtojd(int month, int day, int year)
+calendar:mixed jddayofweek(int juliandaycount [, int mode])
+calendar:string jdmonthname(int juliandaycount, int mode)
+easter:int easter_date([int year])
+easter:int easter_days([int year])
+ccvs:string ccvs_init(string name)
+ccvs:string ccvs_done(string sess)
+ccvs:string ccvs_new(string session, string invoice)
+ccvs:string ccvs_add(string session, string invoice, string argtype, string argval)
+ccvs:string ccvs_delete(string session, string invoice)
+ccvs:string ccvs_auth(string session, string invoice)
+ccvs:string ccvs_return(string session, string invoice)
+ccvs:string ccvs_reverse(string session, string invoice)
+ccvs:string ccvs_sale(string session, string invoice)
+ccvs:string ccvs_void(string session, string invoice)
+ccvs:string ccvs_status(string session, string invoice)
+ccvs:int ccvs_count(string session, string type)
+ccvs:string ccvs_lookup(string session, string invoice, int inum)
+ccvs:string ccvs_report(string session, string type)
+ccvs:string ccvs_command(string session, string type, string argval)
+ccvs:string ccvs_textvalue(string session)
+COM:int com_load(string module_name)
+COM:mixed com_invoke(int module, string handler_name [, mixed arg [, ...]])
+COM:mixed com_propget(int module, string property_name)
+COM:bool com_propput(int module, string property_name, mixed value)
+cpdf:void cpdf_global_set_document_limits(int maxPages, int maxFonts, int maxImages, int maxAnnots, int maxObjects)
+cpdf:bool cpdf_set_creator(int pdfdoc, string creator)
+cpdf:bool cpdf_set_title(int pdfptr, string title)
+cpdf:bool cpdf_set_subject(int pdfptr, string subject)
+cpdf:bool cpdf_set_keywords(int pdfptr, string keywords)
+cpdf:void cpdf_set_viewer_preferences(int pdfdoc, int pagemode)
+cpdf:int cpdf_open(int compression [, string filename [, array doc_limits]])
+cpdf:void cpdf_close(int pdfdoc)
+cpdf:void cpdf_page_init(int pdfdoc, int pagenr, int orientation, int height, int width [, double unit])
+cpdf:void cpdf_finalize_page(int pdfdoc, int pagenr)
+cpdf:void cpdf_set_current_page(int pdfdoc, int pagenr)
+cpdf:void cpdf_begin_text(int pdfdoc)
+cpdf:void cpdf_end_text(int pdfdoc)
+cpdf:void cpdf_show(int pdfdoc, string text)
+cpdf:void cpdf_show_xy(int pdfdoc, string text, double x-koor, double y-koor [, int mode])
+cpdf:void cpdf_continue_text(int pdfdoc, string text)
+cpdf:void cpdf_text(int pdfdoc, string text [, double x-koor, double y-koor [, int mode [, double orientation [, int alignmode]]]])
+cpdf:void cpdf_set_font(int pdfdoc, string font, double size, string encoding)
+cpdf:void cpdf_set_leading(int pdfdoc, double distance)
+cpdf:void cpdf_set_text_rendering(int pdfdoc, int rendermode)
+cpdf:void cpdf_set_horiz_scaling(int pdfdoc, double scale)
+cpdf:void cpdf_set_text_rise(int pdfdoc, double value)
+cpdf:void cpdf_set_text_matrix(int pdfdoc, arry matrix)
+cpdf:void cpdf_set_text_pos(int pdfdoc, double x, double y [, int mode])
+cpdf:void cpdf_rotate_text(int pdfdoc, double angle)
+cpdf:void cpdf_set_char_spacing(int pdfdoc, double space)
+cpdf:void cpdf_set_word_spacing(int pdfdoc, double space)
+cpdf:double cpdf_stringwidth(int pdfdoc, string text)
+cpdf:void cpdf_save(int pdfdoc)
+cpdf:void cpdf_restore(int pdfdoc)
+cpdf:void cpdf_translate(int pdfdoc, double x, double y)
+cpdf:void cpdf_scale(int pdfdoc, double x-scale, double y-scale)
+cpdf:void cpdf_rotate(int pdfdoc, double angle)
+cpdf:void cpdf_setflat(int pdfdoc, double value)
+cpdf:void cpdf_setlinejoin(int pdfdoc, int value)
+cpdf:void cpdf_setlinecap(int pdfdoc, int value)
+cpdf:void cpdf_setmiterlimit(int pdfdoc, double value)
+cpdf:void cpdf_setlinewidth(int pdfdoc, double width)
+cpdf:void cpdf_setdash(int pdfdoc, long white, long black)
+cpdf:void cpdf_moveto(int pdfdoc, double x, double y [, int mode])
+cpdf:void cpdf_rmoveto(int pdfdoc, double x, double y [, int mode])
+cpdf:void cpdf_curveto(int pdfdoc, double x1, double y1, double x2, double y2, double x3, double y3 [, int mode])
+cpdf:void cpdf_lineto(int pdfdoc, double x, double y [, int mode])
+cpdf:void cpdf_rlineto(int pdfdoc, double x, double y [, int mode])
+cpdf:void cpdf_circle(int pdfdoc, double x, double y, double radius [, int mode])
+cpdf:void cpdf_arc(int pdfdoc, double x, double y, double radius, double start, double end [, int mode])
+cpdf:void cpdf_rect(int pdfdoc, double x, double y, double width, double height [, int mode])
+cpdf:void cpdf_newpath(int pdfdoc)
+cpdf:void cpdf_closepath(int pdfdoc)
+cpdf:void cpdf_closepath_stroke(int pdfdoc)
+cpdf:void cpdf_stroke(int pdfdoc)
+cpdf:void cpdf_fill(int pdfdoc)
+cpdf:void cpdf_fill_stroke(int pdfdoc)
+cpdf:void cpdf_closepath_fill_stroke(int pdfdoc)
+cpdf:void cpdf_clip(int pdfdoc)
+cpdf:void cpdf_setgray_fill(int pdfdoc, double value)
+cpdf:void cpdf_setgray_stroke(int pdfdoc, double value)
+cpdf:void cpdf_setgray(int pdfdoc, double value)
+cpdf:void cpdf_setrgbcolor_fill(int pdfdoc, double red, double green, double blue)
+cpdf:void cpdf_setrgbcolor_stroke(int pdfdoc, double red, double green, double blue)
+cpdf:void cpdf_setrgbcolor(int pdfdoc, double red, double green, double blue)
+cpdf:void cpdf_set_page_animation(int pdfdoc, int transition, double duration, double direction, int orientation, int inout)
+cpdf:array cpdf_finalize(int pdfdoc)
+cpdf:array cpdf_output_buffer(int pdfdoc)
+cpdf:array cpdf_save_to_file(int pdfdoc, string filename)
+cpdf:void cpdf_import_jpeg(int pdfdoc, string filename, double x, double y, double angle, double width, double height, double x-scale, double y-scale, int gsave [, int mode])
+cpdf:void cpdf_place_inline_image(int pdfdoc, int gdimage, double x, double y, double angle, fload width, float height, int gsave [, int mode])
+cpdf:void cpdf_add_annotation(int pdfdoc, double xll, double yll, double xur, double xur, string title, string text [, int mode])
+cpdf:void cpdf_set_action_url(int pdfdoc, double xll, double yll, double xur, double xur, string url [, int mode])
+cpdf:int cpdf_add_outline(int pdfdoc, int lastoutline, int sublevel, int open, int pagenr, string title)
+curl:string curl_version(void)
+curl:int curl_init([string url])
+curl:bool curl_setopt(int ch, string option, mixed value)
+curl:bool curl_exec(int ch)
+curl:string curl_error(int ch)
+curl:int curl_errno(int ch)
+curl:void curl_close(int ch)
+dav:void dav_set_mkcol_handlers(string test, string create)
+db:string dblist(void)
+db:int dbmopen(string filename, string mode)
+db:bool dbmclose(int dbm_identifier)
+db:int dbminsert(int dbm_identifier, string key, string value)
+db:int dbmreplace(int dbm_identifier, string key, string value)
+db:string dbmfetch(int dbm_identifier, string key)
+db:int dbmexists(int dbm_identifier, string key)
+db:int dbmdelete(int dbm_identifier, string key)
+db:string dbmfirstkey(int dbm_identifier)
+db:string dbmnextkey(int dbm_identifier, string key)
+dba:int dba_popen(string path, string mode, string handlername [, string ...])
+dba:int dba_open(string path, string mode, string handlername [, string ...])
+dba:void dba_close(int handle)
+dba:bool dba_exists(string key, int handle)
+dba:string dba_fetch(string key, int handle)
+dba:string dba_firstkey(int handle)
+dba:string dba_nextkey(int handle)
+dba:bool dba_delete(string key, int handle)
+dba:bool dba_insert(string key, string value, int handle)
+dba:bool dba_replace(string key, string value, int handle)
+dba:bool dba_optimize(int handle)
+dba:bool dba_sync(int handle)
+dbase:int dbase_open(string name, int mode)
+dbase:bool dbase_close(int identifier)
+dbase:int dbase_numrecords(int identifier)
+dbase:int dbase_numfields(int identifier)
+dbase:bool dbase_pack(int identifier)
+dbase:bool dbase_add_record(int identifier, array data)
+dbase:bool dbase_replace_record(int identifier, array data, int recnum)
+dbase:bool dbase_delete_record(int identifier, int record)
+dbase:array dbase_get_record(int identifier, int record)
+dbase:array dbase_get_record_with_names(int identifier, int record)
+dbase:bool dbase_create(string filename, array fields)
+domxml:string domxml_test(int id)
+domxml:string domxml_attrname([int dir_handle])
+domxml:class domxml_node(string name)
+domxml:string domxml_lastchild([int node])
+domxml:string domxml_parent([int node])
+domxml:string domxml_children([int node])
+domxml:string domxml_getattr([int node,] string attrname)
+domxml:bool domxml_setattr([int node,] string attrname, string value)
+domxml:array domxml_attributes([int node])
+domxml:string domxml_rootnew([int doc])
+domxml:string domxml_root([int doc_handle])
+domxml:string domxml_dtd([int doc_handle])
+domxml:string domxml_dumpmem([int doc_handle])
+domxml:class xmldoc(string xmldoc)
+domxml:class xmldocfile(string filename)
+domxml:string domxml_new_child([int node_handle,] string name, string content)
+domxml:string domxml_add_root([int doc_handle,] string name)
+domxml:class domxml_new_xmldoc(string version)
+domxml:string node_namespace([int node])
+domxml:string node_attributes([int node])
+domxml:string node_children([int node])
+domxml:class xmltree(string xmldoc)
+dotnet:int dotnet_load(string module_name)
+exif:string read_exif_data(string filename)
+fdf:int fdf_open(string filename)
+fdf:void fdf_close(int fdfdoc)
+fdf:void fdf_create(void)
+fdf:void fdf_get_value(int fdfdoc, string fieldname)
+fdf:void fdf_set_value(int fdfdoc, string fieldname, string value, int isName)
+fdf:void fdf_next_field_name(int fdfdoc [, string fieldname])
+fdf:void fdf_set_ap(int fdfdoc, string fieldname, int face, string filename, int pagenr)
+fdf:void fdf_set_status(int fdfdoc, string status)
+fdf:void fdf_get_status(int fdfdoc)
+fdf:void fdf_set_file(int fdfdoc, string filename)
+fdf:void fdf_get_file(int fdfdoc)
+fdf:void fdf_save(int fdfdoc, string filename)
+fdf:void fdf_add_template(int fdfdoc, int newpage, string filename, string template, int rename)
+fdf:void fdf_set_flags(int fdfdoc, string fieldname, int whichFlags, int newFlags)
+fdf:void fdf_set_opt(int fdfdoc, string fieldname, int element, string value, string name)
+fdf:void fdf_set_submit_form_action(int fdfdoc, string fieldname, int whichTrigger, string url, int flags)
+fdf:void fdf_set_javascript_action(int fdfdoc, string fieldname, int whichTrigger, string script)
+filepro:bool filepro(string directory)
+filepro:int filepro_rowcount(void)
+filepro:string filepro_fieldname(int fieldnumber)
+filepro:string filepro_fieldtype(int field_number)
+filepro:int filepro_fieldwidth(int field_number)
+filepro:int filepro_fieldcount(void)
+filepro:string filepro_retrieve(int row_number, int field_number)
+ftp:int ftp_connect(string host [, int port])
+ftp:int ftp_login(int stream, string username, string password)
+ftp:string ftp_pwd(int stream)
+ftp:int ftp_cdup(int stream)
+ftp:int ftp_chdir(int stream, string directory)
+ftp:int ftp_exec(int stream, string command)
+ftp:string ftp_mkdir(int stream, string directory)
+ftp:int ftp_rmdir(int stream, string directory)
+ftp:array ftp_nlist(int stream, string directory)
+ftp:array ftp_rawlist(int stream, string directory)
+ftp:string ftp_systype(int stream)
+ftp:int ftp_fget(int stream, int fp, string remote_file, int mode)
+ftp:int ftp_pasv(int stream, int pasv)
+ftp:int ftp_get(int stream, string local_file, string remote_file, int mode)
+ftp:int ftp_fput(int stream, string local_file, string remote_file, int mode)
+ftp:int ftp_put(int stream, string remote_file, string local_file, int mode)
+ftp:int ftp_size(int stream, string path)
+ftp:int ftp_mdtm(int stream, string path)
+ftp:int ftp_rename(int stream, string src, string dest)
+ftp:int ftp_delete(int stream, string path)
+ftp:int ftp_site(int stream, string cmd)
+ftp:int ftp_quit(int stream)
+gd:int imageloadfont(string filename)
+gd:int imagecreate(int x_size, int y_size)
+gd:int imagetypes(void)
+gd:int imagecreatefromgif(string filename)
+gd:int imagecreatefromjpeg(string filename)
+gd:int imagecreatefrompng(string filename)
+gd:int imagecreatefromxbm(string filename)
+gd:int imagecreatefromwbmp(string filename)
+gd:int imagegif(int im [, string filename])
+gd:int imagepng(int im [, string filename])
+gd:int imagejpeg(int im [, string filename [, int quality]])
+gd:int imagewbmp(int im [, string filename])
+gd:int imagedestroy(int im)
+gd:int imagecolorallocate(int im, int red, int green, int blue)
+gd:int imagepalettecopy(int dst, int src)
+gd:int imagecolorat(int im, int x, int y)
+gd:int imagecolorclosest(int im, int red, int green, int blue)
+gd:int imagecolorclosesthwb(int im, int red, int green, int blue)
+gd:int imagecolordeallocate(int im, int index)
+gd:int imagecolorresolve(int im, int red, int green, int blue)
+gd:int imagecolorexact(int im, int red, int green, int blue)
+gd:int imagecolorset(int im, int col, int red, int green, int blue)
+gd:array imagecolorsforindex(int im, int col)
+gd:int imagegammacorrect(int im, double inputgamma, double outputgamma)
+gd:int imagesetpixel(int im, int x, int y, int col)
+gd:int imageline(int im, int x1, int y1, int x2, int y2, int col)
+gd:int imagedashedline(int im, int x1, int y1, int x2, int y2, int col)
+gd:int imagerectangle(int im, int x1, int y1, int x2, int y2, int col)
+gd:int imagefilledrectangle(int im, int x1, int y1, int x2, int y2, int col)
+gd:int imagearc(int im, int cx, int cy, int w, int h, int s, int e, int col)
+gd:int imagefilltoborder(int im, int x, int y, int border, int col)
+gd:int imagefill(int im, int x, int y, int col)
+gd:int imagecolorstotal(int im)
+gd:int imagecolortransparent(int im [, int col])
+gd:int imageinterlace(int im [, int interlace])
+gd:int imagepolygon(int im, array point, int num_points, int col)
+gd:int imagefilledpolygon(int im, array point, int num_points, int col)
+gd:int imagefontwidth(int font)
+gd:int imagefontheight(int font)
+gd:int imagechar(int im, int font, int x, int y, string c, int col)
+gd:int imagecharup(int im, int font, int x, int y, string c, int col)
+gd:int imagestring(int im, int font, int x, int y, string str, int col)
+gd:int imagestringup(int im, int font, int x, int y, string str, int col)
+gd:int imagecopy(int dst_im, int src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)
+gd:int imagecopymerge(int src_im, int dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)
+gd:int imagecopyresized(int dst_im, int src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)
+gd:int imagesx(int im)
+gd:int imagesy(int im)
+gd:array imagettfbbox(int size, int angle, string font_file, string text)
+gd:array imagettftext(int im, int size, int angle, int x, int y, int col, string font_file, string text)
+gd:int imagepsloadfont(string pathname)
+gd:bool imagepsfreefont(int font_index)
+gd:bool imagepsencodefont(int font_index, string filename)
+gd:bool imagepsextendfont(int font_index, double extend)
+gd:bool imagepsslantfont(int font_index, double slant)
+gd:array imagepstext(int image, string text, int font, int size, int xcoord, int ycoord [, int space, int tightness, double angle, int antialias])
+gd:array imagepsbbox(string text, int font, int size [, int space, int tightness, int angle])
+gdt1:int imagepsloadfont(string pathname)
+gdt1:bool imagepsfreefont(int font_index)
+gdt1:bool imagepsencodefont(int font_index, string filename)
+gdt1:bool imagepsextendfont(int font_index, double extend)
+gdt1:bool imagepsslantfont(int font_index, double slant)
+gdt1:array imagepstext(int image, string text, int font, int size, int xcoord, int ycoord [, int space, int tightness, double angle, int antialias])
+gdt1:array imagepsbbox(string text, int font, int size [, int space, int tightness, int angle])
+gettext:string textdomain(string domain)
+gettext:string gettext(string msgid)
+gettext:string dgettext(string domain_name, string msgid)
+gettext:string dcgettext(string domain_name, string msgid, long category)
+gettext:string bindtextdomain(string domain_name, string dir)
+hw:int hw_connect(string host, int port [string username [, string password]])
+hw:int hw_pconnect(string host, int port [, string username [, string password]])
+hw:void hw_close(int link)
+hw:void hw_info(int link)
+hw:int hw_error(int link)
+hw:string hw_errormsg(int link)
+hw:int hw_root(void)
+hw:string hw_stat(int link)
+hw:array hw_who(int link)
+hw:string hw_dummy(int link, int id, int msgid)
+hw:string hw_getobject(int link, int objid [, string linkroot])
+hw:int hw_insertobject(int link, string objrec, string parms)
+hw:string hw_getandlock(int link, int objid)
+hw:void hw_unlock(int link, int objid)
+hw:void hw_deleteobject(int link, int objid)
+hw:void hw_changeobject(int link, int objid, array attributes)
+hw:void hw_modifyobject(int link, int objid, array remattributes, array addattributes [, int mode])
+hw:void hw_mv(int link, array objrec, int from, int dest)
+hw:void hw_cp(int link, array objrec, int dest)
+hw:hwdoc hw_gettext(int link, int objid [, int rootid])
+hw:void hw_edittext(int link, hwdoc doc)
+hw:hwdoc hw_getcgi(int link, int objid)
+hw:int hw_getremote(int link, int objid)
+hw:[array|int] hw_getremotechildren(int link, string objrec)
+hw:void hw_setlinkroot(int link, int rootid)
+hw:hwdoc hw_pipedocument(int link, int objid)
+hw:hwdoc hw_pipecgi(int link, int objid)
+hw:void hw_insertdocument(int link, int parentid, hwdoc doc)
+hw:hwdoc hw_new_document(string objrec, string data, int size)
+hw:void hw_free_document(hwdoc doc)
+hw:void hw_outputdocument(hwdoc doc)
+hw:void hw_output_document(hwdoc doc)
+hw:string hw_documentbodytag(hwdoc doc [, string prefix])
+hw:string hw_document_bodytag(hwdoc doc [, string prefix])
+hw:string hw_document_content(hwdoc doc)
+hw:int hw_document_setcontent(hwdoc doc, string content)
+hw:int hw_documentsize(hwdoc doc)
+hw:int hw_document_size(hwdoc doc)
+hw:string hw_documentattributes(hwdoc doc)
+hw:string hw_document_attributes(hwdoc doc)
+hw:array hw_getparentsobj(int link, int objid)
+hw:array hw_getparents(int link, int objid)
+hw:array hw_children(int link, int objid)
+hw:array hw_childrenobj(int link, int objid)
+hw:array hw_getchildcoll(int link, int objid)
+hw:array hw_getchildcollobj(int link, int objid)
+hw:int hw_docbyanchor(int link, int anchorid)
+hw:array hw_docbyanchorobj(int link, int anchorid)
+hw:array hw_getobjectbyquery(int link, string query, int maxhits)
+hw:array hw_getobjectbyqueryobj(int link, string query, int maxhits)
+hw:array hw_getobjectbyquerycoll(int link, int collid, string query, int maxhits)
+hw:array hw_getobjectbyquerycollobj(int link, int collid, string query, int maxhits)
+hw:array hw_getchilddoccoll(int link, int objid)
+hw:array hw_getchilddoccollobj(int link, int objid)
+hw:array hw_getanchors(int link, int objid)
+hw:array hw_getanchorsobj(int link, int objid)
+hw:string hw_getusername(int link)
+hw:void hw_identify(int link, string username, string password)
+hw:array hw_objrec2array(string objrec, [array format])
+hw:string hw_array2objrec(array objarr)
+hw:array hw_incollections(int link, array objids, array collids, int para)
+hw:void hw_inscoll(int link, int parentid, array objarr)
+hw:void hw_insdoc(int link, int parentid, string objrec [, string text])
+hw:int hw_getsrcbydestobj(int link, int destid)
+hw:int hw_mapid(int link, int serverid, int destid)
+hw:string hw_getrellink(int link, int rootid, int sourceid, int destid)
+hw:void hw_connection_info(int link)
+icap:int icap_close(int stream_id [, int options])
+icap:int icap_open(string calendar, string user, string password [, int options])
+icap:int icap_reopen(int stream_id, string calendar [, int options])
+icap:int icap_expunge(int stream_id)
+icap:int icap_fetch_event(int stream_id, int eventid [, int options])
+icap:array icap_list_events(int stream_id, int begindate [, int enddate])
+icap:string icap_create_calendar(int stream_id, string calendar)
+icap:string icap_rename_calendar(int stream_id, string src_calendar, string dest_calendar)
+icap:int icap_list_alarms(int stream_id, array date, array time)
+icap:string icap_delete_calendar(int stream_id, string calendar)
+icap:string icap_delete_event(int stream_id, int uid)
+icap:string icap_delete_calendar(int stream_id, int uid)
+icap:string icap_store_event(int stream_id, object event)
+icap:string icap_snooze(int stream_id, int uid)
+imap:int imap_open(string mailbox, string user, string password [, int options])
+imap:int imap_popen(string mailbox, string user, string password [, int options])
+imap:int imap_reopen(int stream_id, string mailbox [, int options])
+imap:int imap_append(int stream_id, string folder, string message [, string flags])
+imap:int imap_num_msg(int stream_id)
+imap:int imap_ping(int stream_id)
+imap:int imap_num_recent(int stream_id)
+imap:int imap_expunge(int stream_id)
+imap:int imap_close(int stream_id [, int options])
+imap:array imap_headers(int stream_id)
+imap:string imap_body(int stream_id, int msg_no [, int options])
+imap:string imap_fetchtext_full(int stream_id, int msg_no [, int options])
+imap:int imap_mail_copy(int stream_id, int msg_no, string mailbox [, int options])
+imap:int imap_mail_move(int stream_id, int msg_no, string mailbox [, int options])
+imap:int imap_createmailbox(int stream_id, string mailbox)
+imap:int imap_renamemailbox(int stream_id, string old_name, string new_name)
+imap:int imap_deletemailbox(int stream_id, string mailbox)
+imap:array imap_list(int stream_id, string ref, string pattern)
+imap:array imap_getmailboxes(int stream_id, string ref, string pattern)
+imap:array imap_scan(int stream_id, string ref, string pattern, string content)
+imap:object imap_check(int stream_id)
+imap:int imap_delete(int stream_id, int msg_no [, int flags])
+imap:int imap_undelete(int stream_id, int msg_no)
+imap:object imap_headerinfo(int stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]])
+imap:object imap_rfc822_parse_headers(string headers [, string default_host])
+imap:array imap_lsub(int stream_id, string ref, string pattern)
+imap:array imap_getsubscribed(int stream_id, string ref, string pattern)
+imap:int imap_subscribe(int stream_id, string mailbox)
+imap:int imap_unsubscribe(int stream_id, string mailbox)
+imap:object imap_fetchstructure(int stream_id, int msg_no [, int options])
+imap:string imap_fetchbody(int stream_id, int msg_no, int section [, int options])
+imap:string imap_base64(string text)
+imap:string imap_qprint(string text)
+imap:string imap_8bit(string text)
+imap:string imap_binary(string text)
+imap:object imap_mailboxmsginfo(int stream_id)
+imap:string imap_rfc822_write_address(string mailbox, string host, string personal)
+imap:array imap_rfc822_parse_adrlist(string address_string, string default_host)
+imap:string imap_utf8(string string)
+imap:string imap_utf7_decode(string buf)
+imap:string imap_utf7_encode(string buf)
+imap:int imap_setflag_full(int stream_id, string sequence, string flag [, int options])
+imap:int imap_clearflag_full(int stream_id, string sequence, string flag [, int options])
+imap:array imap_sort(int stream_id, int criteria, int reverse [, int options])
+imap:string imap_fetchheader(int stream_id, int msg_no [, int options])
+imap:int imap_uid(int stream_id, int msg_no)
+imap:int imap_msgno(int stream_id, int unique_msg_id)
+imap:object imap_status(int stream_id, string mailbox, int options)
+imap:object imap_bodystruct(int stream_id, int msg_no, int section)
+imap:array imap_fetch_overview(int stream_id, int msg_no)
+imap:string imap_mail_compose(array envelope, array body)
+imap:int imap_mail(string to, string subject, string message [, string additional_headers [, string cc [, string bcc [, string rpath]]]])
+imap:array imap_search(int stream_id, string criteria [, long flags])
+imap:array imap_alerts(void)
+imap:array imap_errors(void)
+imap:string imap_last_error(void)
+imap:array imap_mime_header_decode(string str)
+ifx:int ifx_connect([string database [, string userid [, string password]]])
+ifx:int ifx_pconnect([string database [, string userid [, string password]]])
+ifx:int ifx_close(int connid)
+ifx:int ifx_query(string query, int connid [, int cursortype] [, array idarray])
+ifx:int ifx_prepare(string query, int connid [, int cursortype] [, array idarray])
+ifx:int ifx_do(int resultid)
+ifx:string ifx_error([int connection_id])
+ifx:string ifx_errormsg([int errorcode])
+ifx:int ifx_affected_rows(int resultid)
+ifx:array ifx_fetch_row(int resultid [, mixed position])
+ifx:int ifx_htmltbl_result(int resultid [, string htmltableoptions])
+ifx:array ifx_fieldtypes(int resultid)
+ifx:array ifx_fieldproperties(int resultid)
+ifx:int ifx_num_rows(int resultid)
+ifx:int ifx_getsqlca(int resultid)
+ifx:int ifx_num_fields(int resultid)
+ifx:int ifx_free_result(int resultid)
+ifx:int ifx_create_blob(int type, int mode, string param)
+ifx:int ifx_copy_blob(int bid)
+ifx:int ifx_free_blob(int bid)
+ifx:string ifx_get_blob(int bid)
+ifx:int ifx_update_blob(int bid, string content)
+ifx:void ifx_blobinfile_mode(int mode)
+ifx:void ifx_textasvarchar(int mode)
+ifx:void ifx_byteasvarchar(int mode)
+ifx:void ifx_nullformat(int mode)
+ifx:int ifx_create_char(string param)
+ifx:string ifx_get_char(int bid)
+ifx:int ifx_free_char(int bid)
+ifx:int ifx_update_char(int bid, string content)
+ifx:int ifxus_create_slob(int mode)
+ifx:int ifxus_free_slob(int bid)
+ifx:int ifxus_close_slob(int bid)
+ifx:int ifxus_open_slob(long bid, int mode)
+ifx:int ifxus_tell_slob(long bid)
+ifx:int ifxus_seek_slob(long bid, int mode, long offset)
+ifx:int ifxus_read_slob(long bid, long nbytes)
+ifx:int ifxus_write_slob(long bid, string content)
+ii:resource ingres_connect([string database [, string username [, string password]]])
+ii:resource ingres_pconnect([string database [, string username [, string password]]])
+ii:bool ingres_close([resource link])
+ii:bool ingres_query(string query [, resource link])
+ii:int ingres_num_rows([resource link])
+ii:int ingres_num_fields([resource link])
+ii:string ingres_field_name(int index [, resource link])
+ii:string ingres_field_type(int index [, resource link])
+ii:string ingres_field_nullable(int index [, resource link])
+ii:string ingres_field_length(int index [, resource link])
+ii:string ingres_field_precision(int index [, resource link])
+ii:string ingres_field_scale(int index [, resource link])
+ii:array ingres_fetch_array([int result_type [, resource link]])
+ii:array ingres_fetch_row([resource link])
+ii:array ingres_fetch_object([int result_type [, resource link]])
+ii:bool ingres_rollback([resource link])
+ii:bool ingres_commit([resource link])
+ii:bool ingres_autocommit([resource link])
+interbase:string ibase_errmsg(void)
+interbase:int ibase_connect(string database [, string username] [, string password] [, string charset] [, int buffers] [, int dialect] [, string role])
+interbase:int ibase_pconnect(string database [, string username] [, string password] [, string charset] [, int buffers] [, int dialect] [, string role])
+interbase:int ibase_close([int link_identifier])
+interbase:int ibase_trans([int trans_args [, int link_identifier]])
+interbase:int ibase_commit([int link_identifier,] int trans_number)
+interbase:int ibase_rollback([int link_identifier,] int trans_number)
+interbase:int ibase_query([int link_identifier,] string query [, int bind_args])
+interbase:array ibase_fetch_row(int result [, int blob_flag])
+interbase:object ibase_fetch_object(int result [, int blob_flag])
+interbase:int ibase_free_result(int result)
+interbase:int ibase_prepare([int link_identifier,] string query)
+interbase:int ibase_execute(int query [, int bind_args [, int ...])
+interbase:int ibase_free_query(int query)
+interbase:int ibase_timefmt(string format)
+interbase:int ibase_num_fields(int result)
+interbase:array ibase_field_info(int result, int field_number)
+interbase:int ibase_blob_create([int link_identifier])
+interbase:int ibase_blob_open(string blob_id)
+interbase:int ibase_blob_add(int blob_id, string data)
+interbase:string ibase_blob_get(int blob_id, int len)
+interbase:int ibase_blob_close(int blob_id)
+interbase:int ibase_blob_cancel(int blob_id)
+interbase:object ibase_blob_info(string blob_id_str)
+interbase:int ibase_blob_echo(string blob_id_str)
+interbase:string ibase_blob_import([link_identifier,] int file_id)
+ldap:int ldap_connect([string host [, int port]])
+ldap:int ldap_bind(int link [, string dn, string password])
+ldap:int ldap_unbind(int link)
+ldap:int ldap_read(int link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]] )
+ldap:int ldap_list(int link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]] )
+ldap:int ldap_search(int link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]] )
+ldap:int ldap_free_result(int result)
+ldap:int ldap_count_entries(int link, int result)
+ldap:int ldap_first_entry(int link, int result)
+ldap:int ldap_next_entry(int link, int entry)
+ldap:array ldap_get_entries(int link, int result)
+ldap:string ldap_first_attribute(int link, int result, int ber)
+ldap:string ldap_next_attribute(int link, int result, int ber)
+ldap:array ldap_get_attributes(int link, int result)
+ldap:array ldap_get_values(int link, int result, string attribute)
+ldap:array ldap_get_values_len(int link, int result, string attribute)
+ldap:string ldap_get_dn(int link, int result)
+ldap:array ldap_explode_dn(string dn, int with_attrib)
+ldap:string ldap_dn2ufn(string dn)
+ldap:int ldap_add(int link, string dn, array entry)
+ldap:int ldap_modify(int link, string dn, array entry)
+ldap:int ldap_mod_replace(int link, string dn, array entry)
+ldap:int ldap_mod_add(int link, string dn, array entry)
+ldap:int ldap_mod_del(int link, string dn, array entry)
+ldap:int ldap_delete(int link, string dn)
+ldap:int ldap_errno(int link)
+ldap:string ldap_err2str(int errno)
+ldap:string ldap_error(int link)
+ldap:int ldap_compare(int link, string dn, string attr, string value)
+ldap:string ldap_t61_to_8859(string value)
+ldap:string ldap_8859_to_t61(string value)
+mcal:int mcal_close(int stream_id [, int options])
+mcal:int mcal_open(string calendar, string user, string password [, int options])
+mcal:string mcal_popen(string calendar, string user, string password [, int options])
+mcal:int mcal_reopen(int stream_id, string calendar [, int options])
+mcal:int mcal_expunge(int stream_id)
+mcal:int mcal_fetch_event(int stream_id, int eventid [, int options])
+mcal:object mcal_fetch_current_stream_event(int stream_id)
+mcal:array mcal_list_events(int stream_id, object begindate [, object enddate])
+mcal:string mcal_create_calendar(int stream_id, string calendar)
+mcal:string mcal_rename_calendar(int stream_id, string src_calendar, string dest_calendar)
+mcal:bool mcal_list_alarms(int stream_id, int year, int month, int day, int hour, int min, int sec)
+mcal:string mcal_delete_calendar(int stream_id, string calendar)
+mcal:string mcal_delete_event(int stream_id, int event_id)
+mcal:string mcal_append_event(int stream_id)
+mcal:string mcal_store_event(int stream_id)
+mcal:string mcal_snooze(int stream_id, int uid)
+mcal:string mcal_event_set_category(int stream_id, string category)
+mcal:string mcal_event_set_title(int stream_id, string title)
+mcal:string mcal_event_set_description(int stream_id, string description)
+mcal:string mcal_event_set_start(int stream_id, int year,int month, int day [[[, int hour], int min], int sec])
+mcal:string mcal_event_set_end(int stream_id, int year,int month, int day [[[, int hour], int min], int sec])
+mcal:int mcal_event_set_alarm(int stream_id, int alarm)
+mcal:int mcal_event_init(int stream_id)
+mcal:int mcal_event_set_class(int stream_id, int class)
+mcal:string mcal_event_add_attribute(int stream_id, string attribute, string value)
+mcal:bool mcal_is_leap_year(int year)
+mcal:int mcal_days_in_month(int month, bool leap_year)
+mcal:bool mcal_date_valid(int year, int month, int day)
+mcal:bool mcal_time_valid(int hour, int min, int sec)
+mcal:int mcal_day_of_week(int year, int month, int day)
+mcal:int mcal_day_of_year(int year, int month, int day)
+mcal:int mcal_week_of_year(int day, int month, int year)
+mcal:int mcal_date_compare(int ayear, int amonth, int aday, int byear, int bmonth, int bday)
+mcal:object mcal_next_recurrence(int stream_id, int weekstart, array next)
+mcal:string mcal_event_set_recur_none(int stream_id)
+mcal:string mcal_event_set_recur_daily(int stream_id, int year, int month, int day, int interval)
+mcal:string mcal_event_set_recur_weekly(int stream_id, int year, int month, int day, int interval, int weekdays)
+mcal:string mcal_event_set_recur_monthly_mday(int stream_id, int year, int month, int day, int interval)
+mcal:string mcal_event_set_recur_monthly_wday(int stream_id, int year, int month, int day, int interval)
+mcal:string mcal_event_set_recur_yearly(int stream_id, int year, int month, int day, int interval)
+mcrypt:resource mcrypt_module_open(string cipher, string cipher_directory, string mode, string mode_directory)
+mcrypt:int mcrypt_generic_init(resource td, string key, string iv)
+mcrypt:string mcrypt_generic(resource td, string data)
+mcrypt:string mdecrypt_generic(resource td, string data)
+mcrypt:int mcrypt_enc_get_supported_key_sizes(resource td)
+mcrypt:int mcrypt_enc_self_test(resource td)
+mcrypt:bool mcrypt_generic_end(resource td)
+mcrypt:bool mcrypt_enc_is_block_algorithm_mode(resource td)
+mcrypt:bool mcrypt_enc_is_block_algorithm(resource td)
+mcrypt:bool mcrypt_enc_is_block_mode(resource td)
+mcrypt:int mcrypt_enc_get_block_size(resource td)
+mcrypt:int mcrypt_enc_get_key_size(resource td)
+mcrypt:int mcrypt_enc_get_iv_size(resource td)
+mcrypt:string mcrypt_enc_get_algorithms_name(resource td)
+mcrypt:string mcrypt_enc_get_modes_name(resource td)
+mcrypt:bool mcrypt_module_self_test(string algorithm [, string lib_dir])
+mcrypt:bool mcrypt_module_is_block_algorithm_mode(string mode [, string lib_dir])
+mcrypt:bool mcrypt_module_is_block_algorithm(string algorithm [, string lib_dir])
+mcrypt:bool mcrypt_module_is_block_mode(string mode [, string lib_dir])
+mcrypt:int mcrypt_module_get_algo_block_size(string algorithm [, string lib_dir])
+mcrypt:int mcrypt_module_get_algo_key_size(string algorithm [, string lib_dir])
+mcrypt:int mcrypt_module_get_supported_key_sizes(string algorithm [, string lib_dir])
+mcrypt:array mcrypt_list_algorithms([string lib_dir])
+mcrypt:array mcrypt_list_modes([string lib_dir])
+mcrypt:int mcrypt_get_key_size(string cipher, string module)
+mcrypt:int mcrypt_get_block_size(string cipher, string module)
+mcrypt:int mcrypt_get_iv_size(string cipher, string module)
+mcrypt:string mcrypt_get_cipher_name(string cipher)
+mcrypt:string mcrypt_encrypt(string cipher, string key, string data, string mode, string iv)
+mcrypt:string mcrypt_decrypt(string cipher, string key, string data, string mode, string iv)
+mcrypt:string mcrypt_ecb(int cipher, string key, string data, int mode, string iv)
+mcrypt:string mcrypt_cbc(int cipher, string key, string data, int mode, string iv)
+mcrypt:string mcrypt_cfb(int cipher, string key, string data, int mode, string iv)
+mcrypt:string mcrypt_ofb(int cipher, string key, string data, int mode, string iv)
+mcrypt:string mcrypt_create_iv(int size, int source)
+mcrypt:string mcrypt_get_cipher_name(int cipher)
+mcrypt:int mcrypt_get_key_size(int cipher)
+mcrypt:int mcrypt_get_block_size(int cipher)
+mcrypt:string mcrypt_ofb(int cipher, string key, string data, int mode, string iv)
+mcrypt:string mcrypt_cfb(int cipher, string key, string data, int mode, string iv)
+mcrypt:string mcrypt_cbc(int cipher, string key, string data, int mode [, string iv])
+mcrypt:string mcrypt_ecb(int cipher, string key, string data, int mode)
+mhash:int mhash_count()
+mhash:int mhash_get_block_size(int hash)
+mhash:string mhash_get_hash_name(int hash)
+mhash:string mhash(int hash, string data)
+msql:int msql_connect([string hostname[
+msql:int msql_pconnect([string hostname[
+msql:int msql_close([int link_identifier])
+msql:int msql_select_db(string database_name [, int link_identifier])
+msql:int msql_create_db(string database_name [, int link_identifier])
+msql:int msql_drop_db(string database_name [, int link_identifier])
+msql:int msql_query(string query [, int link_identifier])
+msql:int msql_db_query(string database_name, string query [, int link_identifier])
+msql:int msql_list_dbs([int link_identifier])
+msql:int msql_list_tables(string database_name [, int link_identifier])
+msql:int msql_list_fields(string database_name, string table_name [, int link_identifier])
+msql:string msql_error([int link_identifier])
+msql:int msql_result(int query, int row [, mixed field])
+msql:int msql_num_rows(int query)
+msql:int msql_num_fields(int query)
+msql:array msql_fetch_row(int query)
+msql:object msql_fetch_object(int query [, int result_type])
+msql:array msql_fetch_array(int query [, int result_type])
+msql:int msql_data_seek(int query, int row_number)
+msql:object msql_fetch_field(int query [, int field_offset])
+msql:int msql_field_seek(int query, int field_offset)
+msql:string msql_field_name(int query, int field_index)
+msql:string msql_field_table(int query, int field_offset)
+msql:int msql_field_len(int query, int field_offet)
+msql:string msql_field_type(int query, int field_offset)
+msql:string msql_field_flags(int query, int field_offset)
+msql:int msql_free_result(int query)
+msql:int msql_affected_rows(int query)
+mssql:int mssql_connect([string servername [, string username [, string password]]])
+mssql:int mssql_pconnect([string servername [, string username [, string password]]])
+mssql:int mssql_close([int connectionid])
+mssql:bool mssql_select_db(string database_name [, int conn_id])
+mssql:int mssql_query(string query [, int conn_id])
+mssql:int mssql_free_result(string result_index)
+mssql:string mssql_get_last_message(void)
+mssql:int mssql_num_rows(int mssql_result_index)
+mssql:int mssql_num_fields(int mssql_result_index)
+mssql:array mssql_fetch_row(int result_id)
+mssql:object mssql_fetch_object(int result_id)
+mssql:array mssql_fetch_array(int result_id)
+mssql:int mssql_data_seek(int result_id, int offset)
+mssql:object mssql_fetch_field(int result_id [, int offset])
+mssql:int mssql_field_length(int result_id [, int offset])
+mssql:string mssql_field_name(int result_id [, int offset])
+mssql:string mssql_field_type(int result_id [, int offset])
+mssql:bool mssql_field_seek(int result_id, int offset)
+mssql:string mssql_result(int result_id, int row, mixed field)
+mssql:void mssql_min_error_severity(int severity)
+mssql:void mssql_min_message_severity(int severity)
+mysql:int mysql_connect([string hostname])
+mysql:int mysql_pconnect([string hostname])
+mysql:int mysql_close([int link_identifier])
+mysql:int mysql_select_db(string database_name [, int link_identifier])
+mysql:int mysql_create_db(string database_name [, int link_identifier])
+mysql:int mysql_drop_db(string database_name [, int link_identifier])
+mysql:int mysql_query(string query [, int link_identifier])
+mysql:int mysql_db_query(string database_name, string query [, int link_identifier])
+mysql:int mysql_list_dbs([int link_identifier])
+mysql:int mysql_list_tables(string database_name [, int link_identifier])
+mysql:int mysql_list_fields(string database_name, string table_name [, int link_identifier])
+mysql:string mysql_error([int link_identifier])
+mysql:int mysql_errno([int link_identifier])
+mysql:int mysql_affected_rows([int link_identifier])
+mysql:char mysql_escape_string([char string])
+mysql:int mysql_insert_id([int link_identifier])
+mysql:int mysql_result(int result, int row [, mixed field])
+mysql:int mysql_num_rows(int result)
+mysql:int mysql_num_fields(int result)
+mysql:array mysql_fetch_row(int result)
+mysql:object mysql_fetch_object(int result [, int result_type])
+mysql:array mysql_fetch_array(int result [, int result_type])
+mysql:array mysql_fetch_assoc(int result)
+mysql:int mysql_data_seek(int result, int row_number)
+mysql:array mysql_fetch_lengths(int result)
+mysql:object mysql_fetch_field(int result [, int field_offset])
+mysql:int mysql_field_seek(int result, int field_offset)
+mysql:string mysql_field_name(int result, int field_index)
+mysql:string mysql_field_table(int result, int field_offset)
+mysql:int mysql_field_len(int result, int field_offet)
+mysql:string mysql_field_type(int result, int field_offset)
+mysql:string mysql_field_flags(int result, int field_offset)
+mysql:int mysql_free_result(int result)
+oci8:int ocidefinebyname(int stmt, string name, mixed &var [, int type])
+oci8:int ocibindbyname(int stmt, string name, mixed &var, int maxlength [, int type])
+oci8:string ocifreedesc(object lob)
+oci8:string ocisavelob(object lob)
+oci8:string ocisavelobfile(object lob)
+oci8:string ociloadlob(object lob)
+oci8:void ociwritelobtofile(object lob [, string filename] [, int start] [, int length])
+oci8:string ocinewdescriptor(int connection [, int type])
+oci8:string ocirollback(int conn)
+oci8:string ocicommit(int conn)
+oci8:string ocicolumnname(int stmt, int col)
+oci8:int ocicolumnsize(int stmt, int col)
+oci8:int ocicolumnscale(int stmt, int col)
+oci8:int ocicolumnprecision(int stmt, int col)
+oci8:mixed ocicolumntype(int stmt, int col)
+oci8:mixed ocicolumntyperaw(int stmt, int col)
+oci8:int ocicolumnisnull(int stmt, int col)
+oci8:void ociinternaldebug(int onoff)
+oci8:int ociexecute(int stmt [, int mode])
+oci8:int ocicancel(int stmt)
+oci8:int ocifetch(int stmt)
+oci8:int ocifetchinto(int stmt, array &output [, int mode])
+oci8:int ocifetchstatement(int stmt, array &output)
+oci8:int ocifreestatement(int stmt)
+oci8:int ocilogoff(int conn)
+oci8:int ocinlogon(string user, string pass [, string db])
+oci8:int ocilogon(string user, string pass [, string db])
+oci8:int ociplogon(string user, string pass [, string db])
+oci8:array ocierror([int stmt|conn|global])
+oci8:int ocinumcols(int stmt)
+oci8:int ociparse(int conn, string query)
+oci8:int ocisetprefetch(int conn, string query)
+oci8:int ocinewcursor(int conn)
+oci8:string ociresult(int stmt, mixed column)
+oci8:string ociserverversion(int conn)
+oci8:int ocistatementtype(int stmt)
+oci8:int ocirowcount(int stmt)
+odbc:void odbc_close_all(void)
+odbc:int odbc_binmode(int result_id, int mode)
+odbc:int odbc_longreadlen(int result_id, int length)
+odbc:int odbc_prepare(int connection_id, string query)
+odbc:int odbc_execute(int result_id [, array parameters_array])
+odbc:string odbc_cursor(int result_id)
+odbc:int odbc_exec(int connection_id, string query [, int flags])
+odbc:object odbc_fetch_object(int result [, int rownumber])
+odbc:array odbc_fetch_array(int result [, int rownumber])
+odbc:int odbc_fetch_into(int result_id [, int rownumber], array result_array)
+odbc:int odbc_fetch_row(int result_id [, int row_number])
+odbc:string odbc_result(int result_id, mixed field)
+odbc:int odbc_result_all(int result_id [, string format])
+odbc:int odbc_free_result(int result_id)
+odbc:int odbc_connect(string DSN, string user, string password [, int cursor_option])
+odbc:int odbc_pconnect(string DSN, string user, string password [, int cursor_option])
+odbc:void odbc_close(int connection_id)
+odbc:int odbc_num_rows(int result_id)
+odbc:int odbc_num_fields(int result_id)
+odbc:string odbc_field_name(int result_id, int field_number)
+odbc:string odbc_field_type(int result_id, int field_number)
+odbc:int odbc_field_len(int result_id, int field_number)
+odbc:int odbc_field_scale(int result_id, int field_number)
+odbc:int odbc_field_num(int result_id, string field_name)
+odbc:int odbc_autocommit(int connection_id [, int OnOff])
+odbc:int odbc_commit(int connection_id)
+odbc:int odbc_rollback(int connection_id)
+odbc:int odbc_setoption(int conn_id|result_id, int which, int option, int value)
+odbc:int odbc_tables(int connection_id [, string qualifier, string owner, string name, string table_types])
+odbc:int odbc_columns(int connection_id, string qualifier, string owner, string table_name, string column_name)
+odbc:int odbc_columnprivileges(int connection_id, string catalog, string schema, string table, string column)
+odbc:int odbc_foreignkeys(int connection_id, string pk_qualifier, string pk_owner, string pk_table, string fk_qualifier, string fk_owner, string fk_table)
+odbc:int odbc_gettypeinfo(int connection_id [, int data_type])
+odbc:int odbc_primarykeys(int connection_id, string qualifier, string owner, string table)
+odbc:int odbc_procedurecolumns(int connection_id [, string qualifier, string owner, string proc, string column])
+odbc:int odbc_procedures(int connection_id [, string qualifier, string owner, string name])
+odbc:int odbc_specialcolumns(int connection_id, int type, string qualifier, string owner, string table, int scope, int nullable)
+odbc:int odbc_statistics(int connection_id, string qualifier, string owner, string name, int unique, int accuracy)
+odbc:int odbc_tableprivileges(int connection_id, string qualifier, string owner, string name)
+oracle:int ora_logon(string user, string password)
+oracle:int ora_plogon(string user, string password)
+oracle:int ora_logoff(int connection)
+oracle:int ora_open(int connection)
+oracle:int ora_close(int cursor)
+oracle:int ora_commitoff(int connection)
+oracle:int ora_commiton(int connection)
+oracle:int ora_commit(int connection)
+oracle:int ora_rollback(int connection)
+oracle:int ora_parse(int cursor, string sql_statement [, int defer])
+oracle:int ora_bind(int cursor, string php_variable_name, string sql_parameter_name, int length [, int type])
+oracle:int ora_exec(int cursor)
+oracle:int ora_numcols(int cursor)
+oracle:int ora_numrows(int cursor)
+oracle:int ora_do(int connection, int cursor)
+oracle:int ora_fetch(int cursor)
+oracle:int ora_fetch_into(int cursor, array result [, int flags])
+oracle:string ora_columnname(int cursor, int column)
+oracle:string ora_columntype(int cursor, int column)
+oracle:int ora_columnsize(int cursor, int column)
+oracle:mixed ora_getcolumn(int cursor, int column)
+oracle:string ora_error(int cursor_or_connection)
+oracle:int ora_errorcode(int cursor_or_connection)
+ovrimos:int ovrimos_connect(string host, string db, string user, string password)
+ovrimos:void ovrimos_close(int connection)
+ovrimos:void ovrimos_close_all()
+ovrimos:int ovrimos_longreadlen(int result_id, int length)
+ovrimos:int ovrimos_prepare(int connection_id, string query)
+ovrimos:int ovrimos_execute(int result_id [, array parameters_array])
+ovrimos:string ovrimos_cursor(int result_id)
+ovrimos:int ovrimos_exec(int connection_id, string query)
+ovrimos:int ovrimos_fetch_into(int result_id, array result_array [, string how, [int rownumber]])
+ovrimos:int ovrimos_fetch_row(int result_id [, int how, [int row_number]])
+ovrimos:string ovrimos_result(int result_id, mixed field)
+ovrimos:int ovrimos_result_all(int result_id [, string format])
+ovrimos:int ovrimos_free_result(int result_id)
+ovrimos:int ovrimos_num_rows(int result_id)
+ovrimos:int ovrimos_num_fields(int result_id)
+ovrimos:string ovrimos_field_name(int result_id, int field_number)
+ovrimos:string ovrimos_field_type(int result_id, int field_number)
+ovrimos:int ovrimos_field_len(int result_id, int field_number)
+ovrimos:int ovrimos_field_num(int result_id, string field_name)
+ovrimos:int ovrimos_autocommit(int connection_id, int OnOff)
+ovrimos:int ovrimos_commit(int connection_id)
+ovrimos:int ovrimos_rollback(int connection_id)
+ovrimos:int ovrimos_setoption(int conn_id|result_id, int which, int option, int value)
+pcre:int preg_match(string pattern, string subject [, array subpatterns])
+pcre:int preg_match_all(string pattern, string subject, array subpatterns [, int order])
+pcre:string preg_replace(string|array regex, string|array replace, string|array subject [, int limit])
+pcre:array preg_split(string pattern, string subject [, int limit [, int flags]])
+pcre:string preg_quote(string str, string delim_char)
+pcre:array preg_grep(string regex, array input)
+pdf:bool pdf_set_info(int pdfdoc, string fieldname, string value)
+pdf:bool pdf_set_info_creator(int pdfdoc, string creator)
+pdf:bool pdf_set_info_title(int pdfdoc, string title)
+pdf:bool pdf_set_info_subject(int pdfdoc, string subject)
+pdf:bool pdf_set_info_author(int pdfdoc, string author)
+pdf:bool pdf_set_info_keywords(int pdfdoc, string keywords)
+pdf:int pdf_open([int filedesc])
+pdf:void pdf_close(int pdfdoc)
+pdf:void pdf_begin_page(int pdfdoc, double width, double height)
+pdf:void pdf_end_page(int pdfdoc)
+pdf:void pdf_show(int pdfdoc, string text)
+pdf:void pdf_show_xy(int pdfdoc, string text, double x-koor, double y-koor)
+pdf:int pdf_show_boxed(int pdfdoc, string text, double x-koor, double y-koor, double width, double height, string mode, [string feature])
+pdf:void pdf_set_font(int pdfdoc, string font, double size, string encoding [, int embed])
+pdf:int pdf_get_font(int pdfdoc)
+pdf:string pdf_get_fontname(int pdfdoc)
+pdf:double pdf_get_fontsize(int pdfdoc)
+pdf:void pdf_set_leading(int pdfdoc, double distance)
+pdf:void pdf_set_text_rendering(int pdfdoc, int mode)
+pdf:void pdf_set_horiz_scaling(int pdfdoc, double scale)
+pdf:void pdf_set_text_rise(int pdfdoc, double value)
+pdf:void pdf_set_text_matrix(int pdfdoc, arry matrix)
+pdf:void pdf_set_text_pos(int pdfdoc, double x, double y)
+pdf:void pdf_set_char_spacing(int pdfdoc, double space)
+pdf:void pdf_set_word_spacing(int pdfdoc, double space)
+pdf:void pdf_continue_text(int pdfdoc, string text)
+pdf:double pdf_stringwidth(int pdfdoc, string text)
+pdf:void pdf_save(int pdfdoc)
+pdf:void pdf_restore(int pdfdoc)
+pdf:void pdf_translate(int pdfdoc, double x, double y)
+pdf:void pdf_scale(int pdfdoc, double x-scale, double y-scale)
+pdf:void pdf_rotate(int pdfdoc, double angle)
+pdf:void pdf_skew(int pdfdoc, double xangle, double yangle)
+pdf:void pdf_setflat(int pdfdoc, double value)
+pdf:void pdf_setlinejoin(int pdfdoc, int value)
+pdf:void pdf_setlinecap(int pdfdoc, int value)
+pdf:void pdf_setmiterlimit(int pdfdoc, double value)
+pdf:void pdf_setlinewidth(int pdfdoc, double width)
+pdf:void pdf_setdash(int pdfdoc, double white, double black)
+pdf:void pdf_moveto(int pdfdoc, double x, double y)
+pdf:void pdf_curveto(int pdfdoc, double x1, double y1, double x2, double y2, double x3, double y3)
+pdf:void pdf_lineto(int pdfdoc, double x, double y)
+pdf:void pdf_circle(int pdfdoc, double x, double y, double radius)
+pdf:void pdf_arc(int pdfdoc, double x, double y, double radius, double start, double end)
+pdf:void pdf_rect(int pdfdoc, double x, double y, double width, double height)
+pdf:void pdf_closepath(int pdfdoc)
+pdf:void pdf_closepath_stroke(int pdfdoc)
+pdf:void pdf_stroke(int pdfdoc)
+pdf:void pdf_fill(int pdfdoc)
+pdf:void pdf_fill_stroke(int pdfdoc)
+pdf:void pdf_closepath_fill_stroke(int pdfdoc)
+pdf:void pdf_endpath(int pdfdoc)
+pdf:void pdf_clip(int pdfdoc)
+pdf:void pdf_set_parameter(int pdfdoc, string key, string value)
+pdf:string pdf_get_parameter(int pdfdoc, string key, mixed modifier)
+pdf:void pdf_set_value(int pdfdoc, string key, double value)
+pdf:double pdf_get_value(int pdfdoc, string key, double modifier)
+pdf:void pdf_setgray_fill(int pdfdoc, double value)
+pdf:void pdf_setgray_stroke(int pdfdoc, double value)
+pdf:void pdf_setgray(int pdfdoc, double value)
+pdf:void pdf_setrgbcolor_fill(int pdfdoc, double red, double green, double blue)
+pdf:void pdf_setrgbcolor_stroke(int pdfdoc, double red, double green, double blue)
+pdf:void pdf_setrgbcolor(int pdfdoc, double red, double green, double blue)
+pdf:int pdf_add_outline(int pdfdoc, string text [, int parent, int open]);
+pdf:void pdf_set_transition(int pdfdoc, int transition)
+pdf:void pdf_set_duration(int pdfdoc, double duration)
+pdf:int pdf_open_gif(int pdf, string giffile)
+pdf:int pdf_open_jpeg(int pdf, string jpegfile)
+pdf:int pdf_open_png(int pdf, string pngfile)
+pdf:int pdf_open_tiff(int pdf, string tifffile)
+pdf:int pdf_open_image_file(int pdf, string type, string file)
+pdf:int pdf_open_memory_image(int pdf, int image)
+pdf:void pdf_close_image(int pdfimage)
+pdf:void pdf_place_image(int pdf, int pdfimage, double x, double y, double scale)
+pdf:void pdf_get_image_width(int pdf, int pdfimage)
+pdf:void pdf_get_image_height(int pdf, int pdfimage)
+pdf:void pdf_add_weblink(int pdfdoc, double llx, double lly, double urx, double ury, string url)
+pdf:void pdf_add_pdflink(int pdfdoc, double llx, double lly, double urx, double ury, string filename, int page, string dest)
+pdf:void pdf_set_border_style(int pdfdoc, string style, double width)
+pdf:void pdf_set_border_color(int pdfdoc, double red, double green, double blue)
+pdf:void pdf_set_border_dash(int pdfdoc, double black, double white)
+pdf:void pdf_add_annotation(int pdfdoc, double xll, double yll, double xur, double xur, string title, string text)
+pfpro:string pfpro_version()
+pfpro:void pfpro_init()
+pfpro:void pfpro_cleanup()
+pfpro:string pfpro_process_raw(string parmlist [, string hostaddress [, int port, [, int timeout [, string proxyAddress [, int proxyPort [, string proxyLogon [, string proxyPassword]]]]]]])
+pfpro:array pfpro_process(array parmlist [, string hostaddress [, int port, [, int timeout [, string proxyAddress [, int proxyPort [, string proxyLogon [, string proxyPassword]]]]]]])
+pgsql:int pg_connect([string connection_string] | [string host, string port [, string options [, string tty,]] string database)
+pgsql:int pg_pconnect([string connection_string] | [string host, string port [, string options [, string tty,]] string database)
+pgsql:bool pg_close([int connection])
+pgsql:string pg_dbname([int connection])
+pgsql:string pg_errormessage([int connection])
+pgsql:string pg_options([int connection])
+pgsql:int pg_port([int connection])
+pgsql:string pg_tty([int connection])
+pgsql:string pg_host([int connection])
+pgsql:int pg_exec([int connection,] string query)
+pgsql:int pg_end_copy([int connection])
+pgsql:int pg_put_line([int connection,] string query)
+pgsql:int pg_numrows(int result)
+pgsql:int pg_numfields(int result)
+pgsql:int pg_cmdtuples(int result)
+pgsql:string pg_fieldname(int result, int field_number)
+pgsql:int pg_fieldsize(int result, int field_number)
+pgsql:string pg_fieldtype(int result, int field_number)
+pgsql:int pg_fieldnum(int result, string field_name)
+pgsql:mixed pg_result(int result, int row_number, mixed field_name)
+pgsql:array pg_fetch_row(int result, int row)
+pgsql:array pg_fetch_array(int result, int row [, int result_type])
+pgsql:object pg_fetch_object(int result, int row [, int result_type])
+pgsql:int pg_fieldprtlen(int result, int row, mixed field_name_or_number)
+pgsql:int pg_fieldisnull(int result, int row, mixed field_name_or_number)
+pgsql:int pg_freeresult(int result)
+pgsql:int pg_getlastoid(int result)
+pgsql:bool pg_trace(string filename [, string mode [, resource connection]])
+pgsql:bool pg_untrace([int connection])
+pgsql:int pg_locreate(int connection)
+pgsql:void pg_lounlink([int connection,] int large_obj_id)
+pgsql:int pg_loopen([int connection,] int objoid, string mode)
+pgsql:void pg_loclose(int fd)
+pgsql:string pg_loread(int fd, int len)
+pgsql:int pg_lowrite(int fd, string buf)
+pgsql:void pg_loreadall(int fd)
+pgsql:int pg_loimport(string filename [, resource connection])
+pgsql:bool pg_loexport(int objoid, string filename [, resource connection])
+pgsql:int pg_set_client_encoding([int connection,] string encoding)
+pgsql:string pg_client_encoding([int connection])
+posix:int posix_kill(int pid, int sig)
+posix:long posix_getpid(void)
+posix:long posix_getppid(void)
+posix:long posix_getuid(void)
+posix:long posix_getgid(void)
+posix:long posix_geteuid(void)
+posix:long posix_getegid(void)
+posix:long posix_setuid(long uid)
+posix:long posix_setgid(long uid)
+posix:long posix_seteuid(long uid)
+posix:long posix_setegid(long uid)
+posix:long posix_getgroups(void)
+posix:string posix_getlogin(void)
+posix:long posix_getpgrp(void)
+posix:long posix_setsid(void)
+posix:long posix_setpgid(long pid, long pgid)
+posix:long posix_getpgid(void)
+posix:long posix_getsid(void)
+posix:array posix_uname(void)
+posix:array posix_times(void)
+posix:string posix_ctermid(void)
+posix:string posix_ttyname(int fd)
+posix:bool posix_isatty(int fd)
+posix:string posix_getcwd(void)
+posix:string posix_mkfifo(void)
+posix:array posix_getgrnam(string groupname)
+posix:array posix_getgrgid(long gid)
+posix:array posix_getpwnam(string groupname)
+posix:array posix_getpwuid(long uid)
+posix:long posix_getrlimit(void)
+pspell:int pspell_new(string language [, string spelling [, string jargon [, string encoding [, int mode]]]])
+pspell:int pspell_new_personal(string personal, string language [, string spelling [, string jargon [, string encoding [, int mode]]]])
+pspell:int pspell_new_config(int config)
+pspell:int pspell_check(int pspell, string word)
+pspell:array pspell_suggest(int pspell, string word)
+pspell:int pspell_store_replacement(int pspell, string misspell, string correct)
+pspell:int pspell_add_to_personal(int pspell, string word)
+pspell:int pspell_add_to_session(int pspell, string word)
+pspell:int pspell_clear_session(int pspell)
+pspell:int pspell_save_wordlist(int pspell)
+pspell:int pspell_config_create(string language [, string spelling [, string jargon [, string encoding]]])
+pspell:int pspell_config_runtogether(int conf, bool runtogether)
+pspell:int pspell_config_mode(int conf, long mode)
+pspell:int pspell_config_ignore(int conf, int ignore)
+pspell:int pspell_config_personal(int conf, string personal)
+pspell:int pspell_config_repl(int conf, string repl)
+pspell:int pspell_config_save_repl(int conf, bool save)
+readline:string readline([string prompt])
+readline:mixed readline_info([string varname] [, string newvalue])
+readline:void readline_add_history([string prompt])
+readline:void readline_clear_history(void)
+readline:array readline_list_history(void)
+readline:int readline_read_history([string filename] [, int from] [,int to])
+readline:int readline_write_history([string filename])
+readline:void readline_completion_function(string funcname)
+recode:string recode_string(string request, string str)
+recode:bool recode_file(string request, resource input, resource output)
+sablot:resource xslt_create(void)
+sablot:bool xslt_run(resource xh, string xslt_file, string data_file[, string result[, array xslt_params[, array xslt_args]]])
+sablot:bool xslt_openlog(resource xh, string logfile[, int loglevel])
+sablot:bool xslt_closelog(resource xh)
+sablot:string xslt_fetch_result(resource xh[, string result_name])
+sablot:void xslt_free(resource xh)
+sablot:void xslt_set_sax_handler(resource xh, array handlers)
+sablot:mixed xslt_error([int xh])
+sablot:int xslt_errno([int xh])
+session:void session_set_cookie_params(int lifetime [, string path [, string domain]])
+session:array session_get_cookie_params(void)
+session:string session_name([string newname])
+session:string session_module_name([string newname])
+session:void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)
+session:string session_save_path([string newname])
+session:string session_id([string newid])
+session:string session_cache_limiter([string new_cache_limiter])
+session:bool session_register(mixed var_names [, mixed ...])
+session:bool session_unregister(string varname)
+session:bool session_is_registered(string varname)
+session:string session_encode(void)
+session:bool session_decode(string data)
+session:bool session_start(void)
+session:bool session_destroy(void)
+session:void session_unset(void)
+shmop:int shm_open (int key, int flags, int mode, int size)
+shmop:string shm_read (int shmid, int start, int count)
+shmop:void shm_close (int shmid)
+shmop:int shm_size (int shmid)
+shmop:int shm_write (int shmid, string data, int offset)
+shmop:bool shm_delete (int shmid)
+create_stubs:{{{ proto " types[i] " " funcs[i] "("
+skeleton:string confirm_extname_compiled(string arg)
+snmp:string snmpget(string host, string community, string object_id [, int timeout [, int retries]])
+snmp:array snmpwalk(string host, string community, string object_id [, int timeout [, int retries]])
+snmp:array snmprealwalk(string host, string community, string object_id [, int timeout [, int retries]])
+snmp:bool snmp_get_quick_print(void)
+snmp:void snmp_set_quick_print(int quick_print)
+snmp:int snmpset(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]])
+sockets:resource fd_alloc(void)
+sockets:void fd_dealloc(void)
+sockets:bool fd_set(int fd, resource set)
+sockets:bool fd_clear(int fd, resource set)
+sockets:bool fd_isset(int fd, resource set)
+sockets:void fd_zero(resource set)
+sockets:int select(int max_fd, resource readfds, resource writefds, resource exceptfds, int tv_sec, int tv_usec)
+sockets:int open_listen_sock(int port)
+sockets:int accept_connect(int fd)
+sockets:bool set_nonblock(int fd)
+sockets:bool listen(int fd, int backlog)
+sockets:bool close(int fd)
+sockets:int write(int fd, string buf, int length)
+sockets:int read(int fd, string &buf, int length)
+sockets:int getsockname(int fd, string &addr, int &port)
+sockets:int gethostbyname(string name, string &addr)
+sockets:int getpeername(int fd, string &addr, int &port)
+sockets:int gethostbyaddr(string addr, string &name)
+sockets:int socket(int domain, int type, int protocol)
+sockets:int connect(int sockfd, string addr [, int port])
+sockets:string strerror(int errno)
+sockets:int bind(int sockfd, string addr [, int port])
+sockets:resource build_iovec(int num_vectors [, int ...])
+sockets:string fetch_iovec(resource iovec_id, int iovec_position)
+sockets:bool set_iovec(resource iovec_id, int iovec_position, string new_val)
+sockets:bool add_iovec(resource iovec_id, int iov_len)
+sockets:bool delete_iovec(resource iovec_id, int iov_pos)
+sockets:bool free_iovec(resource iovec_id)
+sockets:int readv(int fd, resource iovec_id)
+sockets:int writev(int fd, resource iovec_id)
+sockets:int recv(int fd, string buf, int len, int flags)
+sockets:int send(int fd, string buf, int len, int flags)
+sockets:int recvfrom(int fd, string &buf, int len, int flags, string &name [, int &port])
+sockets:int sendto(int fd, string buf, int len, int flags, string addr [, int port])
+sockets:int recvmsg(int fd, resource iovec, array &control, int &controllen, int &flags, string &addr [, int &port])
+sockets:int sendmsg(int fd, resource iovec, int flags, string addr [, int port])
+sockets:int getsockopt(int fd, int level, int optname, array|int &optval)
+sockets:int setsockopt(int fd, int level, int optname, int|array optval)
+sockets:int socketpair(int domain, int type, int protocol, array &fds)
+sockets:int shutdown(int fd, int how)
+array:int krsort(array array_arg [, int sort_flags])
+array:int ksort(array array_arg [, int sort_flags])
+array:int count(mixed var)
+array:void natsort(array array_arg)
+array:void natcasesort(array array_arg)
+array:void asort(array array_arg [, int sort_flags])
+array:void arsort(array array_arg [, int sort_flags])
+array:void sort(array array_arg [, int sort_flags])
+array:void rsort(array array_arg [, int sort_flags])
+array:void usort(array array_arg, string cmp_function)
+array:void uasort(array array_arg, string cmp_function)
+array:void uksort(array array_arg, string cmp_function)
+array:mixed end(array array_arg)
+array:mixed prev(array array_arg)
+array:mixed next(array array_arg)
+array:mixed reset(array array_arg)
+array:mixed current(array array_arg)
+array:mixed key(array array_arg)
+array:mixed min(mixed arg1 [, mixed arg2 [, mixed ...]])
+array:mixed max(mixed arg1 [, mixed arg2 [, mixed ...]])
+array:int array_walk(array input, string funcname [, mixed userdata])
+array:bool in_array(mixed needle, array haystack [, bool strict])
+array:void extract(array var_array, int extract_type [, string prefix])
+array:array compact(mixed var_names [, mixed ...])
+array:array range(int low, int high)
+array:int shuffle(array array_arg)
+array:int array_push(array stack, mixed var [, mixed ...])
+array:mixed array_pop(array stack)
+array:mixed array_shift(array stack)
+array:int array_unshift(array stack, mixed var [, mixed ...])
+array:array array_splice(array input, int offset [, int length [, array replacement]])
+array:array array_slice(array input, int offset [, int length])
+array:array array_merge(array arr1, array arr2 [, array ...])
+array:array array_merge_recursive(array arr1, array arr2 [, array ...])
+array:array array_keys(array input [, mixed search_value])
+array:array array_values(array input)
+array:array array_count_values(array input)
+array:array array_reverse(array input [, bool preserve keys])
+array:array array_pad(array input, int pad_size, mixed pad_value)
+array:array array_flip(array input)
+array:array array_unique(array input)
+array:array array_intersect(array arr1, array arr2 [, array ...])
+array:array array_diff(array arr1, array arr2 [, array ...])
+array:bool array_multisort(array ar1 [, SORT_ASC|SORT_DESC [, SORT_REGULAR|SORT_NUMERIC|SORT_STRING]] [, array ar2 [, SORT_ASC|SORT_DESC [, SORT_REGULAR|SORT_NUMERIC|SORT_STRING]], ...])
+array:mixed array_rand(array input [, int num_req])
+assert:int assert(string|bool assertion)
+assert:mixed assert_options(int what [, mixed value])
+base64:string base64_encode(string str)
+base64:string base64_decode(string str)
+basic_functions:int ip2long(string ip_address)
+basic_functions:string long2ip(int proper_address)
+basic_functions:string getenv(string varname)
+basic_functions:void putenv(string setting)
+basic_functions:int intval(mixed var [, int base])
+basic_functions:double doubleval(mixed var)
+basic_functions:string strval(mixed var)
+basic_functions:void flush(void)
+basic_functions:void sleep(int seconds)
+basic_functions:void usleep(int micro_seconds)
+basic_functions:string gettype(mixed var)
+basic_functions:int settype(string var, string type)
+basic_functions:string get_current_user(void)
+basic_functions:string get_cfg_var(string option_name)
+basic_functions:int set_magic_quotes_runtime(int new_setting)
+basic_functions:int get_magic_quotes_runtime(void)
+basic_functions:int get_magic_quotes_gpc(void)
+basic_functions:bool is_resource(mixed var)
+basic_functions:bool is_bool(mixed var)
+basic_functions:bool is_long(mixed var)
+basic_functions:bool is_double(mixed var)
+basic_functions:bool is_string(mixed var)
+basic_functions:bool is_array(mixed var)
+basic_functions:bool is_object(mixed var)
+basic_functions:bool is_numeric(mixed value)
+basic_functions:int error_log(string message, int message_type [, string destination] [, string extra_headers])
+basic_functions:mixed call_user_func(string function_name [, mixed parmeter] [, mixed ...])
+basic_functions:mixed call_user_method(string method_name, object object [, mixed parameter] [, mixed ...])
+basic_functions:void register_shutdown_function(string function_name)
+basic_functions:void highlight_file(string file_name)
+basic_functions:void highlight_string(string string)
+basic_functions:string ini_get(string varname)
+basic_functions:string ini_set(string varname, string newvalue)
+basic_functions:string ini_restore(string varname)
+basic_functions:string print_r(mixed var)
+basic_functions:int connection_aborted(void)
+basic_functions:int connection_timeout(void)
+basic_functions:int connection_status(void)
+basic_functions:int ignore_user_abort(boolean value)
+basic_functions:int getservbyname(string service, string protocol)
+basic_functions:string getservbyport(int port, string protocol)
+basic_functions:int getprotobyname(string name)
+basic_functions:string getprotobynumber(int proto)
+basic_functions:array get_loaded_extensions(void)
+basic_functions:bool extension_loaded(string extension_name)
+basic_functions:array get_extension_funcs(string extension_name)
+basic_functions:void register_tick_function(string function_name [, mixed arg [, ... ]])
+basic_functions:void unregister_tick_function(string function_name)
+basic_functions:boolean is_uploaded_file(string path)
+basic_functions:boolean move_uploaded_file(string path, string new_path)
+browscap:object get_browser(string browser_name)
+crc32:string crc32(string str)
+crypt:string crypt(string str [, string salt])
+cyr_convert:string convert_cyr_string(string str, string from, string to)
+datetime:int time(void)
+datetime:int mktime(int hour, int min, int sec, int mon, int day, int year)
+datetime:int gmmktime(int hour, int min, int sec, int mon, int day, int year)
+datetime:string date(string format [, int timestamp])
+datetime:string gmdate(string format [, int timestamp])
+datetime:array localtime([int timestamp [, bool associative_array]])
+datetime:array getdate([int timestamp])
+datetime:bool checkdate(int month, int day, int year)
+datetime:string strftime(string format [, int timestamp])
+datetime:string gmstrftime(string format [, int timestamp])
+datetime:int strtotime(string time, int now)
+dir:int opendir(string path)
+dir:class dir(string directory)
+dir:void closedir([int dir_handle])
+dir:int chdir(string directory)
+dir:string getcwd(void)
+dir:void rewinddir([int dir_handle])
+dir:string readdir([int dir_handle])
+dl:int dl(string extension_filename)
+dns:string gethostbyaddr(string ip_address)
+dns:string gethostbyname(string hostname)
+dns:array gethostbynamel(string hostname)
+dns:int checkdnsrr(string host [, string type])
+dns:int getmxrr(string hostname, array mxhosts [, array weight])
+exec:int exec(string command [, array output [, int return_value]])
+exec:int system(string command [, int return_value])
+exec:void passthru(string command [, int return_value])
+exec:string escapeshellcmd(string command)
+exec:string escapeshellarg(string arg)
+exec:string shell_exec(string cmd)
+file:bool flock(int fp, int operation [, int wouldblock])
+file:array get_meta_tags(string filename [, int use_include_path])
+file:array file(string filename [, int use_include_path])
+file:string tempnam(string dir, string prefix)
+file:int tmpfile(void)
+file:int fopen(string filename, string mode [, int use_include_path])
+file:int fclose(int fp)
+file:int popen(string command, string mode)
+file:int pclose(int fp)
+file:int feof(int fp)
+file:int set_socket_blocking(int socket_descriptor, int mode)
+file:bool socket_set_timeout(int socket_descriptor, int seconds, int microseconds)
+file:array socket_get_status(resource socket_descriptor)
+file:string fgets(int fp, int length)
+file:string fgetc(int fp)
+file:string fgetss(int fp, int length [, string allowable_tags])
+file:mixed fscanf(string str, string format [, string ...])
+file:int fwrite(int fp, string str [, int length])
+file:int fflush(int fp)
+file:int set_file_buffer(int fp, int buffer)
+file:int rewind(int fp)
+file:int ftell(int fp)
+file:int fseek(int fp, int offset [, int whence])
+file:int mkdir(string pathname, int mode)
+file:int rmdir(string dirname)
+file:int readfile(string filename [, int use_include_path])
+file:int umask([int mask])
+file:int fpassthru(int fp)
+file:int rename(string old_name, string new_name)
+file:int unlink(string filename)
+file:int ftruncate (int fp, int size)
+file:int fstat(int fp)
+file:int copy(string source_file, string destination_file)
+file:int fread(int fp, int length)
+file:array fgetcsv(int fp, int length)
+file:string realpath(string path)
+filestat:double diskfreespace(string path)
+filestat:bool chgrp(string filename, mixed group)
+filestat:bool chown (string filename, mixed user)
+filestat:bool chmod(string filename, int mode)
+filestat:bool touch(string filename [, int time])
+filestat:void clearstatcache(void)
+filestat:int fileperms(string filename)
+filestat:int fileinode(string filename)
+filestat:int filesize(string filename)
+filestat:int fileowner(string filename)
+filestat:nt filegroup(string filename)
+filestat:int fileatime(string filename)
+filestat:int filemtime(string filename)
+filestat:int filectime(string filename)
+filestat:string filetype(string filename)
+filestat:int is_writable(string filename)
+filestat:int is_readable(string filename)
+filestat:int is_executable(string filename)
+filestat:int is_file(string filename)
+filestat:int is_dir(string filename)
+filestat:int is_link(string filename)
+filestat:bool file_exists(string filename)
+filestat:array lstat(string filename)
+filestat:array stat(string filename)
+formatted_print:string sprintf(string format [, mixed arg1 [, mixed ...]])
+formatted_print:int printf(string format [, mixed arg1 [, mixed ...]])
+fsock:int fsockopen(string hostname, int port [, int errno [, string errstr [, double timeout]]])
+fsock:int pfsockopen(string hostname, int port [, int errno [, string errstr [, double timeout]]])
+head:void header(string header)
+head:void setcookie(string name [, string value [, int expires [, string path [, string domain [, string secure]]]]])
+head:int headers_sent(void)
+html:string htmlspecialchars(string string [, int quote_style])
+html:string htmlentities(string string [, int quote_style])
+html:array get_html_translation_table([int table [, int quote_style]])
+image:array getimagesize(string imagefile [, array info])
+info:void phpinfo([int what])
+info:string phpversion(void)
+info:void phpcredits([int flag])
+info:string php_logo_guid(void)
+info:string php_egg_logo_guid(void)
+info:string zend_logo_guid(void)
+info:string php_sapi_name(void)
+info:string php_uname(void)
+iptc:array iptcembed(string iptcdata, string jpeg_file_name [, int spool])
+iptc:array iptcparse(string iptcdata)
+lcg:double lcg_value()
+levenshtein:int levenshtein(string str1, string str2)
+link:string readlink(string filename)
+link:int linkinfo(string filename)
+link:int symlink(string target, string link)
+link:int link(string target, string link)
+mail:int ezmlm_hash(string addr)
+mail:int mail(string to, string subject, string message [, string additional_headers])
+math:int abs(int number)
+math:double ceil(double number)
+math:double floor(double number)
+math:double round(double number [, int precision])
+math:double sin(double number)
+math:double cos(double number)
+math:double tan(double number)
+math:double asin(double number)
+math:double acos(double number)
+math:double atan(double number)
+math:double atan2(double y, double x)
+math:double pi(void)
+math:double pow(double base, double exponent)
+math:double exp(double number)
+math:double log(double number)
+math:double log10(double number)
+math:double sqrt(double number)
+math:double deg2rad(double number)
+math:double rad2deg(double number)
+math:int bindec(string binary_number)
+math:int hexdec(string hexadecimal_number)
+math:int octdec(string octal_number)
+math:string decbin(int decimal_number)
+math:string decoct(int decimal_number)
+math:string dechex(int decimal_number)
+math:string base_convert(string number, int frombase, int tobase)
+math:string number_format(double number [, int num_decimal_places [, string dec_seperator, string thousands_seperator]])
+md5:string md5(string str)
+metaphone:string metaphone(string text, int phones)
+microtime:string microtime(void)
+microtime:array gettimeofday(void)
+microtime:array getrusage([int who])
+output:void ob_start(void)
+output:void ob_end_flush(void)
+output:void ob_end_clean(void)
+output:string ob_get_contents(void)
+output:string ob_get_length(void)
+output:void ob_implicit_flush([int flag])
+pack:string pack(string format, mixed arg1 [, mixed arg2 [, mixed ...]])
+pack:array unpack(string format, string input)
+pageinfo:int getmyuid(void)
+pageinfo:int getmypid(void)
+pageinfo:int getmyinode(void)
+pageinfo:int getlastmod(void)
+rand:void srand(int seed)
+rand:void mt_srand(int seed)
+rand:int rand([int min, int max])
+rand:int mt_rand([int min, int max])
+rand:int getrandmax(void)
+rand:int mt_getrandmax(void)
+quot_print:string quoted_printable_decode(string str)
+reg:int ereg(string pattern, string string [, array registers])
+reg:int eregi(string pattern, string string [, array registers])
+reg:string ereg_replace(string pattern, string replacement, string string)
+reg:string eregi_replace(string pattern, string replacement, string string])
+reg:array split(string pattern, string string [, int limit])
+reg:array spliti(string pattern, string string [, int limit])
+reg:string sql_regcase(string string)
+soundex:string soundex(string str)
+string:string bin2hex(string data)
+string:int strspn(string str, string mask)
+string:int strcspn(string str, string mask)
+string:string rtrim(string str)
+string:string chop(string str)
+string:string trim(string str)
+string:string ltrim(string str)
+string:string wordwrap(string str [, int width [, string break [, int cut]]])
+string:array explode(string separator, string str [, int limit])
+string:string join(array src, string glue)
+string:string implode(string glue, array src)
+string:string strtok([string str,] string token)
+string:string strtoupper(string str)
+string:string strtolower(string str)
+string:string basename(string path)
+string:string dirname(string path)
+string:array pathinfo(string path)
+string:string stristr(string haystack, string needle)
+string:string strstr(string haystack, string needle)
+string:string strchr(string haystack, string needle)
+string:int strpos(string haystack, string needle [, int offset])
+string:int strrpos(string haystack, string needle)
+string:string strrchr(string haystack, string needle)
+string:string chunk_split(string str [, int chunklen [, string ending]])
+string:string substr(string str, int start [, int length])
+string:string substr_replace(string str, string repl, int start [, int length])
+string:string quotemeta(string str)
+string:int ord(string character)
+string:string chr(int ascii)
+string:string ucfirst(string str)
+string:string ucwords(string str)
+string:string strtr(string str, string from, string to)
+string:string strrev(string str)
+string:int similar_text(string str1, string str2 [, double percent])
+string:string addcslashes(string str, string charlist)
+string:string addslashes(string str)
+string:string stripcslashes(string str)
+string:string stripslashes(string str)
+string:string str_replace(string needle, string str, string haystack)
+string:string hebrev(string str [, int max_chars_per_line])
+string:string hebrevc(string str [, int max_chars_per_line])
+string:string nl2br(string str)
+string:string strip_tags(string str [, string allowable_tags])
+string:string setlocale(string category, string locale)
+string:void parse_str(string encoded_string, [array result])
+string:string str_repeat(string input, int mult)
+string:mixed count_chars(string input [, int mode])
+string:int strnatcmp(string s1, string s2)
+string:int strnatcasecmp(string s1, string s2)
+string:int substr_count(string haystack, string needle)
+string:string str_pad(string input, int pad_length [, string pad_string [, int pad_type]])
+string:mixed sscanf(string str, string format [, string ...])
+syslog:void define_syslog_variables(void)
+syslog:int openlog(string ident, int option, int facility)
+syslog:int closelog(void)
+syslog:int syslog(int priority, string message)
+uniqid:string uniqid(string prefix, [bool more_entropy])
+url:array parse_url(string url)
+url:string urlencode(string str)
+url:string urldecode(string str)
+url:string rawurlencode(string str)
+url:string rawurldecode(string str)
+var:void var_dump(mixed var)
+var:string serialize(mixed variable)
+var:mixed unserialize(string variable_representation)
+swf:void swf_openfile(string name, double xsize, double ysize, double framerate, double r, double g, double b)
+swf:void swf_closefile(void)
+swf:void swf_labelframe(string name)
+swf:void swf_showframe(void)
+swf:void swf_setframe(int frame_number)
+swf:int swf_getframe(void)
+swf:void swf_mulcolor(double r, double g, double b, double a)
+swf:void swf_addcolor(double r, double g, double b, double a)
+swf:void swf_placeobject(int objid, int depth)
+swf:void swf_modifyobject(int depth, int how)
+swf:void swf_removeobject(int depth)
+swf:int swf_nextid(void)
+swf:void swf_startdoaction(void)
+swf:void swf_enddoaction(void)
+swf:void swf_actiongotoframe(int frame_number)
+swf:void swf_actiongeturl(string url, string target)
+swf:void swf_actionnextframe(void)
+swf:void swf_actionprevframe(void)
+swf:void swf_actionplay(void)
+swf:void swf_actionstop(void)
+swf:void swf_actiontogglequality(void)
+swf:void swf_actionwaitforframe(int frame, int skipcount)
+swf:void swf_actionsettarget(string target)
+swf:void swf_actiongotolabel(string label)
+swf:void swf_defineline(int objid, double x1, double y1, double x2, double y2, double width)
+swf:void swf_definerect(int objid, double x1, double y1, double x2, double y2, double width)
+swf:void swf_definepoly(int obj_id, array coords, int npoints, double width)
+swf:void swf_startshape(int objid)
+swf:void swf_shapelinesolid(double r, double g, double b, double a, double width)
+swf:void swf_shapefilloff(void)
+swf:void swf_shapefillsolid(double r, double g, double b, double a)
+swf:void swf_shapefillbitmapclip(int bitmapid)
+swf:void swf_shapefillbitmaptile(int bitmapid)
+swf:void swf_shapemoveto(double x, double y)
+swf:void swf_shapelineto(double x, double y)
+swf:void swf_shapecurveto(double x1, double y1, double x2, double y2)
+swf:void swf_shapecurveto3(double x1, double y1, double x2, double y2, double x3, double y3)
+swf:void swf_shapearc(double x, double y, double r, double ang1, double ang2)
+swf:void swf_endshape(void)
+swf:void swf_definefont(int fontid, string name)
+swf:void swf_setfont(int fontid)
+swf:void swf_fontsize(double height)
+swf:void swf_fontslant(double slant)
+swf:void swf_fonttracking(track)
+swf:array swf_getfontinfo(void)
+swf:void swf_definetext(int objid, string str, int docCenter)
+swf:void swf_textwidth(string str)
+swf:void swf_definebitmap(int objid, string imgname)
+swf:array swf_getbitmapinfo(int bitmapid)
+swf:void swf_startsymbol(int objid)
+swf:void swf_endsymbol(void)
+swf:void swf_startbutton(int objid, int type)
+swf:void swf_addbuttonrecord(int state, int objid, int depth)
+swf:void swf_oncondition(int transitions)
+swf:void swf_endbutton(void)
+swf:void swf_viewport(double xmin, double xmax, double ymin, double ymax)
+swf:void swf_ortho2(double xmin, double xmax, double ymin, double ymax)
+swf:void swf_ortho(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax)
+swf:void swf_polarview(double dist, double azimuth, double incidence, double twist)
+swf:void swf_perspective(double fovy, double aspect, double near, double far)
+swf:void swf_lookat(double vx, double vy, double vz, double px, double py, double pz, double twist)
+swf:void swf_pushmatrix(void)
+swf:void swf_popmatrix(void)
+swf:void swf_scale(double x, double y, double z)
+swf:void swf_translate(double x, double y, double z)
+swf:void swf_rotate(double angle, string axis)
+swf:void swf_posround(int doit)
+sybase_db:int sybase_connect([string host [, string user [, string password [, string charset]]]])
+sybase_db:int sybase_pconnect([string host [, string user [, string password [, string charset]]]])
+sybase_db:bool sybase_close([int link_id])
+sybase_db:bool sybase_select_db(string database [, int link_id])
+sybase_db:int sybase_query(string query [, int link_id])
+sybase_db:bool sybase_free_result(int result)
+sybase_db:string sybase_get_last_message(void)
+sybase_db:int sybase_num_rows(int result)
+sybase_db:int sybase_num_fields(int result)
+sybase_db:array sybase_fetch_row(int result)
+sybase_db:object sybase_fetch_object(int result)
+sybase_db:array sybase_fetch_array(int result)
+sybase_db:bool sybase_data_seek(int result, int offset)
+sybase_db:object sybase_fetch_field(int result [, int offset])
+sybase_db:bool sybase_field_seek(int result, int offset)
+sybase_db:string sybase_result(int result, int row, mixed field)
+sybase_db:void sybase_min_error_severity(int severity)
+sybase_db:void sybase_min_message_severity(int severity)
+sybase_ct:int sybase_connect([string host [, string user [, string password [, string charset]]]])
+sybase_ct:int sybase_pconnect([string host [, string user [, string password [, string charset]]]])
+sybase_ct:bool sybase_close([int link_id])
+sybase_ct:bool sybase_select_db(string database [, int link_id])
+sybase_ct:int sybase_query(string query [, int link_id])
+sybase_ct:bool sybase_free_result(int result)
+sybase_ct:int sybase_num_rows(int result)
+sybase_ct:int sybase_num_fields(int result)
+sybase_ct:array sybase_fetch_row(int result)
+sybase_ct:object sybase_fetch_object(int result)
+sybase_ct:array sybase_fetch_array(int result)
+sybase_ct:bool sybase_data_seek(int result, int offset)
+sybase_ct:object sybase_fetch_field(int result [, int offset])
+sybase_ct:bool sybase_field_seek(int result, int offset)
+sybase_ct:string sybase_result(int result, int row, mixed field)
+sybase_ct:int sybase_affected_rows([int link_id])
+sybase_ct:void sybase_min_client_severity(int severity)
+sybase_ct:void sybase_min_server_severity(int severity)
+sysvsem:int sem_get(int key [, int max_acquire [, int perm]])
+sysvsem:int sem_acquire(int id)
+sysvsem:int sem_release(int id)
+sysvshm:int shm_attach(int key [, int memsize [, int perm]])
+sysvshm:int shm_detach(int shm_identifier)
+sysvshm:int shm_remove(int shm_identifier)
+sysvshm:int shm_put_var(int shm_identifier, int variable_key, mixed variable)
+sysvshm:mixed shm_get_var(int id, int variable_key)
+sysvshm:int shm_remove_var(int id, int variable_key)
+wddx:string wddx_serialize_value(mixed var [, string comment])
+wddx:string wddx_serialize_vars(mixed var_name [, mixed ...])
+wddx:int wddx_packet_start([string comment])
+wddx:string wddx_packet_end(int packet_id)
+wddx:int wddx_add_vars(int packet_id [, mixed var_names [, mixed ...]])
+wddx:mixed wddx_deserialize(string packet)
+xml:int xml_parser_create(void)
+xml:int xml_set_object(int pind, object &obj)
+xml:int xml_set_element_handler(int pind, string shdl, string ehdl)
+xml:int xml_set_character_data_handler(int pind, string hdl)
+xml:int xml_set_processing_instruction_handler(int pind, string hdl)
+xml:int xml_set_default_handler(int pind, string hdl)
+xml:int xml_set_unparsed_entity_decl_handler(int pind, string hdl)
+xml:int xml_set_notation_decl_handler(int pind, string hdl)
+xml:int xml_set_external_entity_ref_handler(int pind, string hdl)
+xml:int xml_parse(int pind, string data [, int isFinal])
+xml:int xml_parse_into_struct(int pind, string data, array &struct, array &index)
+xml:int xml_get_error_code(int pind)
+xml:string xml_error_string(int code)
+xml:int xml_get_current_line_number(int pind)
+xml:int xml_get_current_column_number(int pind)
+xml:int xml_get_current_byte_index(int pind)
+xml:int xml_parser_free(int pind)
+xml:int xml_parser_set_option(int pind, int option, mixed value)
+xml:int xml_parser_get_option(int pind, int option)
+xml:string utf8_encode(string data)
+xml:string utf8_decode(string data)
+yaz:int yaz_connect(string zurl [, string user [, string group, string pass]])
+yaz:int yaz_close(int id)
+yaz:int yaz_search(int id, string type, string query)
+yaz:int yaz_wait()
+yaz:int yaz_errno(int id)
+yaz:string yaz_error(int id)
+yaz:string yaz_addinfo(int id)
+yaz:int yaz_hits(int id)
+yaz:string yaz_record(int id, int pos, string type)
+yaz:int yaz_syntax(int id, string syntax)
+yaz:int yaz_element(int id, string elementsetname)
+yaz:int yaz_range(int id, int start, int number)
+yp:string yp_get_default_domain(void)
+yp:int yp_order(string domain, string map)
+yp:string yp_master(string domain, string map)
+yp:string yp_match(string domain, string map, string key)
+yp:array yp_first(string domain, string map)
+yp:array yp_next(string domain, string map, string key)
+zlib:array gzfile(string filename [, int use_include_path])
+zlib:int gzopen(string filename, string mode [, int use_include_path])
+zlib:int gzclose(int zp)
+zlib:int gzeof(int zp)
+zlib:string gzgets(int zp, int length)
+zlib:string gzgetc(int zp)
+zlib:string gzgetss(int zp, int length [, string allowable_tags])
+zlib:int gzwrite(int zp, string str [, int length])
+zlib:int gzputs(int zp, string str [, int length])
+zlib:int gzrewind(int zp)
+zlib:int gztell(int zp)
+zlib:int gzseek(int zp, int offset)
+zlib:int readgzfile(string filename [, int use_include_path])
+zlib:int gzpassthru(int zp)
+zlib:string gzread(int zp, int length)
+zlib:string gzcompress(string data [, int level])
+zlib:string gzuncompress(string data, int length)
+configuration-parser:void parse_ini_file(string filename)
+main:void set_time_limit(int seconds)
+configuration-parser:void parse_ini_file(string filename)
+apache:string apache_note(string note_name [, string note_value])
+apache:int virtual(string filename)
+apache:array getallheaders(void)
+apache:class apache_lookup_uri(string URI)
diff --git a/languages/php/doc/Makefile.am b/languages/php/doc/Makefile.am
new file mode 100644
index 00000000..163d435b
--- /dev/null
+++ b/languages/php/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = php.toc php_bugs.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA = php.index
+
diff --git a/languages/php/doc/php.toc b/languages/php/doc/php.toc
new file mode 100644
index 00000000..f09df62e
--- /dev/null
+++ b/languages/php/doc/php.toc
@@ -0,0 +1,7069 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>PHP Manual</title>
+<base href="http://www.php.net/manual/en/"/>
+<tocsect1 name="PHP Manual" url="manual.php">
+ <tocsect2 name="Preface" url="preface.php"/>
+</tocsect1>
+<tocsect1 name="Getting Started" url="getting-started.php">
+ <tocsect2 name="Introduction" url="introduction.php"/>
+ <tocsect2 name="A simple tutorial" url="tutorial.php"/>
+</tocsect1>
+<tocsect1 name="Installation and Configuration" url="install.php">
+ <tocsect2 name="General Installation Considerations" url="install.general.php"/>
+ <tocsect2 name="Installation on Unix systems" url="install.unix.php"/>
+ <tocsect2 name="Installation on Mac OS X" url="install.macosx.php"/>
+ <tocsect2 name="Installation on Windows systems" url="install.windows.php"/>
+ <tocsect2 name="Installation of PECL extensions" url="install.pecl.php"/>
+ <tocsect2 name="Problems?" url="install.problems.php"/>
+ <tocsect2 name="Runtime Configuration" url="configuration.php"/>
+</tocsect1>
+<tocsect1 name="Language Reference" url="langref.php">
+ <tocsect2 name="Basic syntax" url="language.basic-syntax.php"/>
+ <tocsect2 name="Types" url="language.types.php"/>
+ <tocsect2 name="Variables" url="language.variables.php"/>
+ <tocsect2 name="Constants" url="language.constants.php"/>
+ <tocsect2 name="Expressions" url="language.expressions.php"/>
+ <tocsect2 name="Operators" url="language.operators.php"/>
+ <tocsect2 name="Control Structures" url="language.control-structures.php"/>
+ <tocsect2 name="Functions" url="language.functions.php"/>
+ <tocsect2 name="Classes and Objects (PHP 4)" url="language.oop.php"/>
+ <tocsect2 name="Classes and Objects (PHP 5)" url="language.oop5.php"/>
+ <tocsect2 name="Namespaces" url="language.namespaces.php"/>
+ <tocsect2 name="Exceptions" url="language.exceptions.php"/>
+ <tocsect2 name="References Explained" url="language.references.php"/>
+ <tocsect2 name="Predefined variables" url="reserved.variables.php"/>
+ <tocsect2 name="Predefined Exceptions" url="reserved.exceptions.php"/>
+ <tocsect2 name="Context options and parameters" url="context.php"/>
+</tocsect1>
+<tocsect1 name="Security" url="security.php">
+ <tocsect2 name="Introduction" url="security.intro.php"/>
+ <tocsect2 name="General considerations" url="security.general.php"/>
+ <tocsect2 name="Installed as CGI binary" url="security.cgi-bin.php"/>
+ <tocsect2 name="Installed as an Apache module" url="security.apache.php"/>
+ <tocsect2 name="Filesystem Security" url="security.filesystem.php"/>
+ <tocsect2 name="Database Security" url="security.database.php"/>
+ <tocsect2 name="Error Reporting" url="security.errors.php"/>
+ <tocsect2 name="Using Register Globals" url="security.globals.php"/>
+ <tocsect2 name="User Submitted Data" url="security.variables.php"/>
+ <tocsect2 name="Magic Quotes" url="security.magicquotes.php"/>
+ <tocsect2 name="Hiding PHP" url="security.hiding.php"/>
+ <tocsect2 name="Keeping Current" url="security.current.php"/>
+</tocsect1>
+<tocsect1 name="Features" url="features.php">
+ <tocsect2 name="HTTP authentication with PHP" url="features.http-auth.php"/>
+ <tocsect2 name="Cookies" url="features.cookies.php"/>
+ <tocsect2 name="Sessions" url="features.sessions.php"/>
+ <tocsect2 name="Dealing with XForms" url="features.xforms.php"/>
+ <tocsect2 name="Handling file uploads" url="features.file-upload.php"/>
+ <tocsect2 name="Using remote files" url="features.remote-files.php"/>
+ <tocsect2 name="Connection handling" url="features.connection-handling.php"/>
+ <tocsect2 name="Persistent Database Connections" url="features.persistent-connections.php"/>
+ <tocsect2 name="Safe Mode" url="features.safe-mode.php"/>
+ <tocsect2 name="Using PHP from the command line" url="features.commandline.php"/>
+</tocsect1>
+<tocsect1 name="APC" url="book.apc.php">
+ <tocsect2 name="Introduction" url="intro.apc.php"/>
+ <tocsect2 name="Installing/Configuring" url="apc.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="apc.constants.php"/>
+ <tocsect2 name="APC Functions" url="ref.apc.php"/>
+</tocsect1>
+<tocsect1 name="APD" url="book.apd.php">
+ <tocsect2 name="Introduction" url="intro.apd.php"/>
+ <tocsect2 name="Installing/Configuring" url="apd.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="apd.constants.php"/>
+ <tocsect2 name="Examples" url="apd.examples.php"/>
+ <tocsect2 name="APD Functions" url="ref.apd.php"/>
+</tocsect1>
+<tocsect1 name="bcompiler" url="book.bcompiler.php">
+ <tocsect2 name="Introduction" url="intro.bcompiler.php"/>
+ <tocsect2 name="Installing/Configuring" url="bcompiler.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="bcompiler.constants.php"/>
+ <tocsect2 name="bcompiler Functions" url="ref.bcompiler.php"/>
+</tocsect1>
+<tocsect1 name="Error Handling" url="book.errorfunc.php">
+ <tocsect2 name="Introduction" url="intro.errorfunc.php"/>
+ <tocsect2 name="Installing/Configuring" url="errorfunc.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="errorfunc.constants.php"/>
+ <tocsect2 name="Examples" url="errorfunc.examples.php"/>
+ <tocsect2 name="Error Handling Functions" url="ref.errorfunc.php"/>
+</tocsect1>
+<tocsect1 name="Object overloading" url="book.overload.php">
+ <tocsect2 name="Introduction" url="intro.overload.php"/>
+ <tocsect2 name="Installing/Configuring" url="overload.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="overload.constants.php"/>
+ <tocsect2 name="Examples" url="overload.examples.php"/>
+ <tocsect2 name="Object overloading Functions" url="ref.overload.php"/>
+</tocsect1>
+<tocsect1 name="Output Control" url="book.outcontrol.php">
+ <tocsect2 name="Introduction" url="intro.outcontrol.php"/>
+ <tocsect2 name="Installing/Configuring" url="outcontrol.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="outcontrol.constants.php"/>
+ <tocsect2 name="Examples" url="outcontrol.examples.php"/>
+ <tocsect2 name="Output Control Functions" url="ref.outcontrol.php"/>
+</tocsect1>
+<tocsect1 name="PHP Options/Info" url="book.info.php">
+ <tocsect2 name="Introduction" url="intro.info.php"/>
+ <tocsect2 name="Installing/Configuring" url="info.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="info.constants.php"/>
+ <tocsect2 name="PHP Options/Info Functions" url="ref.info.php"/>
+</tocsect1>
+<tocsect1 name="runkit" url="book.runkit.php">
+ <tocsect2 name="Introduction" url="intro.runkit.php"/>
+ <tocsect2 name="Predefined Constants" url="runkit.constants.php"/>
+ <tocsect2 name="Installing/Configuring" url="runkit.setup.php"/>
+ <tocsect2 name="runkit Functions" url="ref.runkit.php"/>
+</tocsect1>
+<tocsect1 name="ID3" url="book.id3.php">
+ <tocsect2 name="Introduction" url="intro.id3.php"/>
+ <tocsect2 name="Installing/Configuring" url="id3.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="id3.constants.php"/>
+ <tocsect2 name="ID3 Functions" url="ref.id3.php"/>
+</tocsect1>
+<tocsect1 name="oggvorbis" url="book.oggvorbis.php">
+ <tocsect2 name="Introduction" url="intro.oggvorbis.php"/>
+ <tocsect2 name="Installing/Configuring" url="oggvorbis.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="oggvorbis.constants.php"/>
+ <tocsect2 name="Context options" url="oggvorbis.contexts.php"/>
+ <tocsect2 name="Examples" url="oggvorbis.examples.php"/>
+</tocsect1>
+<tocsect1 name="OpenAL" url="book.openal.php">
+ <tocsect2 name="Introduction" url="intro.openal.php"/>
+ <tocsect2 name="Installing/Configuring" url="openal.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="openal.constants.php"/>
+ <tocsect2 name="OpenAL Functions" url="ref.openal.php"/>
+</tocsect1>
+<tocsect1 name="KADM5" url="book.kadm5.php">
+ <tocsect2 name="Introduction" url="intro.kadm5.php"/>
+ <tocsect2 name="Installing/Configuring" url="kadm5.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="kadm5.constants.php"/>
+ <tocsect2 name="Examples" url="kadm5.examples.php"/>
+ <tocsect2 name="KADM5 Functions" url="ref.kadm5.php"/>
+</tocsect1>
+<tocsect1 name="Radius" url="book.radius.php">
+ <tocsect2 name="Introduction" url="intro.radius.php"/>
+ <tocsect2 name="Installing/Configuring" url="radius.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="radius.constants.php"/>
+ <tocsect2 name="Examples" url="radius.examples.php"/>
+ <tocsect2 name="Radius Functions" url="ref.radius.php"/>
+</tocsect1>
+<tocsect1 name="Calendar" url="book.calendar.php">
+ <tocsect2 name="Introduction" url="intro.calendar.php"/>
+ <tocsect2 name="Installing/Configuring" url="calendar.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="calendar.constants.php"/>
+ <tocsect2 name="Calendar Functions" url="ref.calendar.php"/>
+</tocsect1>
+<tocsect1 name="Date/Time" url="book.datetime.php">
+ <tocsect2 name="Introduction" url="intro.datetime.php"/>
+ <tocsect2 name="Installing/Configuring" url="datetime.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="datetime.constants.php"/>
+ <tocsect2 name="List of Supported Timezones" url="timezones.php"/>
+ <tocsect2 name="Date/Time Functions" url="ref.datetime.php"/>
+</tocsect1>
+<tocsect1 name="Newt" url="book.newt.php">
+ <tocsect2 name="Introduction" url="intro.newt.php"/>
+ <tocsect2 name="Installing/Configuring" url="newt.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="newt.constants.php"/>
+ <tocsect2 name="Examples" url="newt.examples.php"/>
+ <tocsect2 name="Newt Functions" url="ref.newt.php"/>
+</tocsect1>
+<tocsect1 name="Ncurses" url="book.ncurses.php">
+ <tocsect2 name="Introduction" url="intro.ncurses.php"/>
+ <tocsect2 name="Installing/Configuring" url="ncurses.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ncurses.constants.php"/>
+ <tocsect2 name="Ncurses Functions" url="ref.ncurses.php"/>
+</tocsect1>
+<tocsect1 name="Readline" url="book.readline.php">
+ <tocsect2 name="Introduction" url="intro.readline.php"/>
+ <tocsect2 name="Installing/Configuring" url="readline.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="readline.constants.php"/>
+ <tocsect2 name="Readline Functions" url="ref.readline.php"/>
+</tocsect1>
+<tocsect1 name="Bzip2" url="book.bzip2.php">
+ <tocsect2 name="Introduction" url="intro.bzip2.php"/>
+ <tocsect2 name="Installing/Configuring" url="bzip2.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="bzip2.constants.php"/>
+ <tocsect2 name="Examples" url="bzip2.examples.php"/>
+ <tocsect2 name="Bzip2 Functions" url="ref.bzip2.php"/>
+</tocsect1>
+<tocsect1 name="LZF" url="book.lzf.php">
+ <tocsect2 name="Introduction" url="intro.lzf.php"/>
+ <tocsect2 name="Installing/Configuring" url="lzf.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="lzf.constants.php"/>
+ <tocsect2 name="LZF Functions" url="ref.lzf.php"/>
+</tocsect1>
+<tocsect1 name="Phar" url="book.phar.php">
+ <tocsect2 name="Introduction" url="intro.phar.php"/>
+ <tocsect2 name="Installing/Configuring" url="phar.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="phar.constants.php"/>
+ <tocsect2 name="Using Phar Archives" url="phar.using.php"/>
+ <tocsect2 name="Creating Phar Archives" url="phar.creating.php"/>
+ <tocsect2 name="What makes a phar a phar and not a tar or a zip?" url="phar.fileformat.php"/>
+ <tocsect2 name="Phar" url="class.Phar.php"/>
+ <tocsect2 name="PharData" url="class.PharData.php"/>
+ <tocsect2 name="PharFileInfo" url="class.PharFileInfo.php"/>
+ <tocsect2 name="PharException" url="class.PharException.php"/>
+</tocsect1>
+<tocsect1 name="Rar" url="book.rar.php">
+ <tocsect2 name="Introduction" url="intro.rar.php"/>
+ <tocsect2 name="Installing/Configuring" url="rar.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="rar.constants.php"/>
+ <tocsect2 name="Examples" url="rar.examples.php"/>
+ <tocsect2 name="Rar Functions" url="ref.rar.php"/>
+</tocsect1>
+<tocsect1 name="Zip" url="book.zip.php">
+ <tocsect2 name="Introduction" url="intro.zip.php"/>
+ <tocsect2 name="Installing/Configuring" url="zip.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="zip.constants.php"/>
+ <tocsect2 name="Examples" url="zip.examples.php"/>
+ <tocsect2 name="Zip Functions" url="ref.zip.php"/>
+</tocsect1>
+<tocsect1 name="Zlib" url="book.zlib.php">
+ <tocsect2 name="Introduction" url="intro.zlib.php"/>
+ <tocsect2 name="Installing/Configuring" url="zlib.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="zlib.constants.php"/>
+ <tocsect2 name="Examples" url="zlib.examples.php"/>
+ <tocsect2 name="Zlib Functions" url="ref.zlib.php"/>
+</tocsect1>
+<tocsect1 name="MCVE" url="book.mcve.php">
+ <tocsect2 name="Introduction" url="intro.mcve.php"/>
+ <tocsect2 name="Installing/Configuring" url="mcve.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mcve.constants.php"/>
+ <tocsect2 name="MCVE Functions" url="ref.mcve.php"/>
+</tocsect1>
+<tocsect1 name="SPPLUS" url="book.spplus.php">
+ <tocsect2 name="Introduction" url="intro.spplus.php"/>
+ <tocsect2 name="Installing/Configuring" url="spplus.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="spplus.constants.php"/>
+ <tocsect2 name="SPPLUS Functions" url="ref.spplus.php"/>
+</tocsect1>
+<tocsect1 name="Cracklib" url="book.crack.php">
+ <tocsect2 name="Introduction" url="intro.crack.php"/>
+ <tocsect2 name="Installing/Configuring" url="crack.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="crack.constants.php"/>
+ <tocsect2 name="Examples" url="crack.examples.php"/>
+ <tocsect2 name="Crack Functions" url="ref.crack.php"/>
+</tocsect1>
+<tocsect1 name="Hash" url="book.hash.php">
+ <tocsect2 name="Introduction" url="intro.hash.php"/>
+ <tocsect2 name="Installing/Configuring" url="hash.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="hash.constants.php"/>
+ <tocsect2 name="Hash Functions" url="ref.hash.php"/>
+</tocsect1>
+<tocsect1 name="Mcrypt" url="book.mcrypt.php">
+ <tocsect2 name="Introduction" url="intro.mcrypt.php"/>
+ <tocsect2 name="Installing/Configuring" url="mcrypt.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mcrypt.constants.php"/>
+ <tocsect2 name="Mcrypt ciphers" url="mcrypt.ciphers.php"/>
+ <tocsect2 name="Examples" url="mcrypt.examples.php"/>
+ <tocsect2 name="Mcrypt Functions" url="ref.mcrypt.php"/>
+</tocsect1>
+<tocsect1 name="Mhash" url="book.mhash.php">
+ <tocsect2 name="Introduction" url="intro.mhash.php"/>
+ <tocsect2 name="Installing/Configuring" url="mhash.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mhash.constants.php"/>
+ <tocsect2 name="Examples" url="mhash.examples.php"/>
+ <tocsect2 name="Mhash Functions" url="ref.mhash.php"/>
+</tocsect1>
+<tocsect1 name="OpenSSL" url="book.openssl.php">
+ <tocsect2 name="Introduction" url="intro.openssl.php"/>
+ <tocsect2 name="Installing/Configuring" url="openssl.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="openssl.constants.php"/>
+ <tocsect2 name="Key/Certificate parameters" url="openssl.certparams.php"/>
+ <tocsect2 name="Certificate Verification" url="openssl.cert.verification.php"/>
+ <tocsect2 name="OpenSSL Functions" url="ref.openssl.php"/>
+</tocsect1>
+<tocsect1 name="DBA" url="book.dba.php">
+ <tocsect2 name="Introduction" url="intro.dba.php"/>
+ <tocsect2 name="Installing/Configuring" url="dba.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="dba.constants.php"/>
+ <tocsect2 name="Examples" url="dba.examples.php"/>
+ <tocsect2 name="DBA Functions" url="ref.dba.php"/>
+</tocsect1>
+<tocsect1 name="dbx" url="book.dbx.php">
+ <tocsect2 name="Introduction" url="intro.dbx.php"/>
+ <tocsect2 name="Installing/Configuring" url="dbx.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="constants.dbx.php"/>
+ <tocsect2 name="dbx Functions" url="ref.dbx.php"/>
+</tocsect1>
+<tocsect1 name="ODBC" url="book.uodbc.php">
+ <tocsect2 name="Introduction" url="intro.uodbc.php"/>
+ <tocsect2 name="Installing/Configuring" url="uodbc.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="uodbc.constants.php"/>
+ <tocsect2 name="ODBC Functions" url="ref.uodbc.php"/>
+</tocsect1>
+<tocsect1 name="PDO" url="book.pdo.php">
+ <tocsect2 name="Introduction" url="intro.pdo.php"/>
+ <tocsect2 name="Installing/Configuring" url="pdo.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="pdo.constants.php"/>
+ <tocsect2 name="Connections and Connection management" url="pdo.connections.php"/>
+ <tocsect2 name="Transactions and auto-commit" url="pdo.transactions.php"/>
+ <tocsect2 name="Prepared statements and stored procedures" url="pdo.prepared-statements.php"/>
+ <tocsect2 name="Errors and error handling" url="pdo.error-handling.php"/>
+ <tocsect2 name="Large Objects (LOBs)" url="pdo.lobs.php"/>
+ <tocsect2 name="PDO" url="class.pdo.php"/>
+ <tocsect2 name="PDOStatement" url="class.pdostatement.php"/>
+ <tocsect2 name="PDO Drivers" url="pdo.drivers.php"/>
+</tocsect1>
+<tocsect1 name="SDO" url="book.sdo.php">
+ <tocsect2 name="Introduction" url="intro.sdo.php"/>
+ <tocsect2 name="Installing/Configuring" url="sdo.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="sdo.constants.php"/>
+ <tocsect2 name="Limitations" url="sdo.limitations.php"/>
+ <tocsect2 name="Examples" url="sdo.examples.php"/>
+ <tocsect2 name="SDO Functions" url="ref.sdo.php"/>
+</tocsect1>
+<tocsect1 name="SDO-DAS-Relational" url="book.sdodasrel.php">
+ <tocsect2 name="Introduction" url="intro.sdodasrel.php"/>
+ <tocsect2 name="Installing/Configuring" url="sdodasrel.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="sdodasrel.constants.php"/>
+ <tocsect2 name="Examples" url="sdo.das.rel.examples.php"/>
+ <tocsect2 name="Limitations" url="sdo.das.rel.limitations.php"/>
+ <tocsect2 name="SDO-DAS-Relational Functions" url="ref.sdo.das.rel.php"/>
+</tocsect1>
+<tocsect1 name="dBase" url="book.dbase.php">
+ <tocsect2 name="Introduction" url="intro.dbase.php"/>
+ <tocsect2 name="Installing/Configuring" url="dbase.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="dbase.constants.php"/>
+ <tocsect2 name="dBase Functions" url="ref.dbase.php"/>
+</tocsect1>
+<tocsect1 name="DB++" url="book.dbplus.php">
+ <tocsect2 name="Introduction" url="intro.dbplus.php"/>
+ <tocsect2 name="Installing/Configuring" url="dbplus.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="dbplus.constants.php"/>
+ <tocsect2 name="DB++ Functions" url="ref.dbplus.php"/>
+</tocsect1>
+<tocsect1 name="FrontBase" url="book.fbsql.php">
+ <tocsect2 name="Introduction" url="intro.fbsql.php"/>
+ <tocsect2 name="Installing/Configuring" url="fbsql.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="fbsql.constants.php"/>
+ <tocsect2 name="FrontBase Functions" url="ref.fbsql.php"/>
+</tocsect1>
+<tocsect1 name="filePro" url="book.filepro.php">
+ <tocsect2 name="Introduction" url="intro.filepro.php"/>
+ <tocsect2 name="Installing/Configuring" url="filepro.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="filepro.constants.php"/>
+ <tocsect2 name="filePro Functions" url="ref.filepro.php"/>
+</tocsect1>
+<tocsect1 name="Firebird/InterBase" url="book.ibase.php">
+ <tocsect2 name="Introduction" url="intro.ibase.php"/>
+ <tocsect2 name="Installing/Configuring" url="ibase.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ibase.constants.php"/>
+ <tocsect2 name="Firebird/InterBase Functions" url="ref.ibase.php"/>
+</tocsect1>
+<tocsect1 name="Informix" url="book.ifx.php">
+ <tocsect2 name="Introduction" url="intro.ifx.php"/>
+ <tocsect2 name="Installing/Configuring" url="ifx.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ifx.constants.php"/>
+ <tocsect2 name="Informix Functions" url="ref.ifx.php"/>
+</tocsect1>
+<tocsect1 name="IBM DB2" url="book.ibm-db2.php">
+ <tocsect2 name="Introduction" url="intro.ibm-db2.php"/>
+ <tocsect2 name="Installing/Configuring" url="ibm-db2.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ibm-db2.constants.php"/>
+ <tocsect2 name="IBM DB2 Functions" url="ref.ibm-db2.php"/>
+</tocsect1>
+<tocsect1 name="Ingres II" url="book.ingres.php">
+ <tocsect2 name="Introduction" url="intro.ingres.php"/>
+ <tocsect2 name="Installing/Configuring" url="ingres.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ingres.constants.php"/>
+ <tocsect2 name="Examples" url="ingres.examples.php"/>
+ <tocsect2 name="Ingres II Functions" url="ref.ingres.php"/>
+</tocsect1>
+<tocsect1 name="MaxDB" url="book.maxdb.php">
+ <tocsect2 name="Introduction" url="intro.maxdb.php"/>
+ <tocsect2 name="Installing/Configuring" url="maxdb.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="maxdb.constants.php"/>
+ <tocsect2 name="Examples" url="maxdb.examples.php"/>
+ <tocsect2 name="MaxDB Functions" url="ref.maxdb.php"/>
+</tocsect1>
+<tocsect1 name="mSQL" url="book.msql.php">
+ <tocsect2 name="Introduction" url="intro.msql.php"/>
+ <tocsect2 name="Installing/Configuring" url="msql.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="msql.constants.php"/>
+ <tocsect2 name="Examples" url="msql.examples.php"/>
+ <tocsect2 name="mSQL Functions" url="ref.msql.php"/>
+</tocsect1>
+<tocsect1 name="Mssql" url="book.mssql.php">
+ <tocsect2 name="Introduction" url="intro.mssql.php"/>
+ <tocsect2 name="Installing/Configuring" url="mssql.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mssql.constants.php"/>
+ <tocsect2 name="Mssql Functions" url="ref.mssql.php"/>
+</tocsect1>
+<tocsect1 name="MySQL" url="book.mysql.php">
+ <tocsect2 name="Introduction" url="intro.mysql.php"/>
+ <tocsect2 name="Installing/Configuring" url="mysql.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mysql.constants.php"/>
+ <tocsect2 name="Examples" url="mysql.examples.php"/>
+ <tocsect2 name="MySQL Functions" url="ref.mysql.php"/>
+</tocsect1>
+<tocsect1 name="Mysqli" url="book.mysqli.php">
+ <tocsect2 name="Introduction" url="intro.mysqli.php"/>
+ <tocsect2 name="Installing/Configuring" url="mysqli.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mysqli.constants.php"/>
+ <tocsect2 name="MySQLi" url="class.mysqli.php"/>
+ <tocsect2 name="MySQLi_STMT" url="class.mysqli-stmt.php"/>
+ <tocsect2 name="MySQLi_Result" url="class.mysqli-result.php"/>
+ <tocsect2 name="MySQLi_Driver" url="class.mysqli-driver.php"/>
+ <tocsect2 name="Aliases and deprecated Mysqli Functions" url="ref.mysqli.php"/>
+</tocsect1>
+<tocsect1 name="OCI8" url="book.oci8.php">
+ <tocsect2 name="Introduction" url="intro.oci8.php"/>
+ <tocsect2 name="Installing/Configuring" url="oci8.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="oci8.constants.php"/>
+ <tocsect2 name="Examples" url="oci8.examples.php"/>
+ <tocsect2 name="Connecting Handling" url="oci8.connection.php"/>
+ <tocsect2 name="Supported Datatypes" url="oci8.datatypes.php"/>
+ <tocsect2 name="OCI8 Functions" url="ref.oci8.php"/>
+</tocsect1>
+<tocsect1 name="Ovrimos SQL" url="book.ovrimos.php">
+ <tocsect2 name="Introduction" url="intro.ovrimos.php"/>
+ <tocsect2 name="Installing/Configuring" url="ovrimos.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ovrimos.constants.php"/>
+ <tocsect2 name="Examples" url="ovrimos.examples.php"/>
+ <tocsect2 name="Ovrimos SQL Functions" url="ref.ovrimos.php"/>
+</tocsect1>
+<tocsect1 name="Paradox" url="book.paradox.php">
+ <tocsect2 name="Introduction" url="intro.paradox.php"/>
+ <tocsect2 name="Installing/Configuring" url="paradox.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="paradox.constants.php"/>
+ <tocsect2 name="Paradox Functions" url="ref.paradox.php"/>
+</tocsect1>
+<tocsect1 name="PostgreSQL" url="book.pgsql.php">
+ <tocsect2 name="Introduction" url="intro.pgsql.php"/>
+ <tocsect2 name="Installing/Configuring" url="pgsql.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="pgsql.constants.php"/>
+ <tocsect2 name="Examples" url="pgsql.examples.php"/>
+ <tocsect2 name="PostgreSQL Functions" url="ref.pgsql.php"/>
+</tocsect1>
+<tocsect1 name="SQLite" url="book.sqlite.php">
+ <tocsect2 name="Introduction" url="intro.sqlite.php"/>
+ <tocsect2 name="Installing/Configuring" url="sqlite.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="sqlite.constants.php"/>
+ <tocsect2 name="SQLite Functions" url="ref.sqlite.php"/>
+</tocsect1>
+<tocsect1 name="Sybase" url="book.sybase.php">
+ <tocsect2 name="Introduction" url="intro.sybase.php"/>
+ <tocsect2 name="Installing/Configuring" url="sybase.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="sybase.constants.php"/>
+ <tocsect2 name="Sybase Functions" url="ref.sybase.php"/>
+</tocsect1>
+<tocsect1 name="Direct IO" url="book.dio.php">
+ <tocsect2 name="Introduction" url="intro.dio.php"/>
+ <tocsect2 name="Installing/Configuring" url="dio.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="dio.constants.php"/>
+ <tocsect2 name="Direct IO Functions" url="ref.dio.php"/>
+</tocsect1>
+<tocsect1 name="Directories" url="book.dir.php">
+ <tocsect2 name="Installing/Configuring" url="dir.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="dir.constants.php"/>
+ <tocsect2 name="Directory Functions" url="ref.dir.php"/>
+</tocsect1>
+<tocsect1 name="Fileinfo" url="book.fileinfo.php">
+ <tocsect2 name="Introduction" url="intro.fileinfo.php"/>
+ <tocsect2 name="Installing/Configuring" url="fileinfo.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="fileinfo.constants.php"/>
+ <tocsect2 name="Fileinfo Functions" url="ref.fileinfo.php"/>
+</tocsect1>
+<tocsect1 name="Filesystem" url="book.filesystem.php">
+ <tocsect2 name="Introduction" url="intro.filesystem.php"/>
+ <tocsect2 name="Installing/Configuring" url="filesystem.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="filesystem.constants.php"/>
+ <tocsect2 name="Filesystem Functions" url="ref.filesystem.php"/>
+</tocsect1>
+<tocsect1 name="Mimetype" url="book.mime-magic.php">
+ <tocsect2 name="Introduction" url="intro.mime-magic.php"/>
+ <tocsect2 name="Installing/Configuring" url="mime-magic.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mime-magic.constants.php"/>
+ <tocsect2 name="Mimetype Functions" url="ref.mime-magic.php"/>
+</tocsect1>
+<tocsect1 name="xattr" url="book.xattr.php">
+ <tocsect2 name="Introduction" url="intro.xattr.php"/>
+ <tocsect2 name="Installing/Configuring" url="xattr.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="xattr.constants.php"/>
+ <tocsect2 name="xattr Functions" url="ref.xattr.php"/>
+</tocsect1>
+<tocsect1 name="xdiff" url="book.xdiff.php">
+ <tocsect2 name="Introduction" url="intro.xdiff.php"/>
+ <tocsect2 name="Installing/Configuring" url="xdiff.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="xdiff.constants.php"/>
+ <tocsect2 name="xdiff Functions" url="ref.xdiff.php"/>
+</tocsect1>
+<tocsect1 name="Enchant" url="book.enchant.php">
+ <tocsect2 name="Introduction" url="intro.enchant.php"/>
+ <tocsect2 name="Installing/Configuring" url="enchant.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="enchant.constants.php"/>
+ <tocsect2 name="Examples" url="enchant.examples.php"/>
+ <tocsect2 name="Enchant Functions" url="ref.enchant.php"/>
+</tocsect1>
+<tocsect1 name="FriBiDi" url="book.fribidi.php">
+ <tocsect2 name="Introduction" url="intro.fribidi.php"/>
+ <tocsect2 name="Installing/Configuring" url="fribidi.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="fribidi.constants.php"/>
+ <tocsect2 name="FriBiDi Functions" url="ref.fribidi.php"/>
+</tocsect1>
+<tocsect1 name="Gettext" url="book.gettext.php">
+ <tocsect2 name="Introduction" url="intro.gettext.php"/>
+ <tocsect2 name="Installing/Configuring" url="gettext.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="gettext.constants.php"/>
+ <tocsect2 name="Gettext Functions" url="ref.gettext.php"/>
+</tocsect1>
+<tocsect1 name="i18n" url="book.i18n.php">
+ <tocsect2 name="Introduction" url="intro.i18n.php"/>
+ <tocsect2 name="Installing/Configuring" url="i18n.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="i18n.constants.php"/>
+ <tocsect2 name="i18n Functions" url="ref.i18n.php"/>
+</tocsect1>
+<tocsect1 name="iconv" url="book.iconv.php">
+ <tocsect2 name="Introduction" url="intro.iconv.php"/>
+ <tocsect2 name="Installing/Configuring" url="iconv.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="iconv.constants.php"/>
+ <tocsect2 name="iconv Functions" url="ref.iconv.php"/>
+</tocsect1>
+<tocsect1 name="intl" url="book.intl.php">
+ <tocsect2 name="Introduction" url="intro.intl.php"/>
+ <tocsect2 name="Installing/Configuring" url="intl.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="intl.constants.php"/>
+ <tocsect2 name="Examples" url="intl.examples.php"/>
+ <tocsect2 name="intl Functions" url="ref.intl.php"/>
+ <tocsect2 name="Collator" url="class.collator.php"/>
+ <tocsect2 name="NumberFormatter" url="class.numberformatter.php"/>
+ <tocsect2 name="Locale" url="class.locale.php"/>
+ <tocsect2 name="Normalizer" url="class.normalizer.php"/>
+ <tocsect2 name="MessageFormatter" url="class.messageformatter.php"/>
+ <tocsect2 name="IntlDateFormatter" url="class.intldateformatter.php"/>
+</tocsect1>
+<tocsect1 name="Multibyte String" url="book.mbstring.php">
+ <tocsect2 name="Introduction" url="intro.mbstring.php"/>
+ <tocsect2 name="Installing/Configuring" url="mbstring.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mbstring.constants.php"/>
+ <tocsect2 name="Summaries of supported encodings" url="mbstring.encodings.php"/>
+ <tocsect2 name="Basics of Japanese multi-byte encodings" url="mbstring.ja-basic.php"/>
+ <tocsect2 name="HTTP Input and Output" url="mbstring.http.php"/>
+ <tocsect2 name="Supported Character Encodings" url="mbstring.supported-encodings.php"/>
+ <tocsect2 name="Function Overloading Feature" url="mbstring.overload.php"/>
+ <tocsect2 name="PHP Character Encoding Requirements" url="mbstring.php4.req.php"/>
+ <tocsect2 name="Multibyte String Functions" url="ref.mbstring.php"/>
+</tocsect1>
+<tocsect1 name="Pspell" url="book.pspell.php">
+ <tocsect2 name="Introduction" url="intro.pspell.php"/>
+ <tocsect2 name="Installing/Configuring" url="pspell.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="pspell.constants.php"/>
+ <tocsect2 name="Pspell Functions" url="ref.pspell.php"/>
+</tocsect1>
+<tocsect1 name="Recode" url="book.recode.php">
+ <tocsect2 name="Introduction" url="intro.recode.php"/>
+ <tocsect2 name="Installing/Configuring" url="recode.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="recode.constants.php"/>
+ <tocsect2 name="Recode Functions" url="ref.recode.php"/>
+</tocsect1>
+<tocsect1 name="Unicode" url="book.unicode.php">
+ <tocsect2 name="Introduction" url="intro.unicode.php"/>
+ <tocsect2 name="Installing/Configuring" url="unicode.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="unicode.constants.php"/>
+ <tocsect2 name="Unicode Functions" url="ref.unicode.php"/>
+</tocsect1>
+<tocsect1 name="Exif" url="book.exif.php">
+ <tocsect2 name="Introduction" url="intro.exif.php"/>
+ <tocsect2 name="Installing/Configuring" url="exif.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="exif.constants.php"/>
+ <tocsect2 name="Exif Functions" url="ref.exif.php"/>
+</tocsect1>
+<tocsect1 name="GD" url="book.image.php">
+ <tocsect2 name="Introduction" url="intro.image.php"/>
+ <tocsect2 name="Installing/Configuring" url="image.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="image.constants.php"/>
+ <tocsect2 name="Examples" url="image.examples.php"/>
+ <tocsect2 name="GD Functions" url="ref.image.php"/>
+</tocsect1>
+<tocsect1 name="ImageMagick" url="book.imagick.php">
+ <tocsect2 name="Introduction" url="intro.imagick.php"/>
+ <tocsect2 name="Installing/Configuring" url="imagick.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="imagick.constants.php"/>
+ <tocsect2 name="Examples" url="imagick.examples.php"/>
+ <tocsect2 name="The Imagick class" url="class.imagick.php"/>
+ <tocsect2 name="The ImagickDraw class" url="class.imagickdraw.php"/>
+ <tocsect2 name="The ImagickPixel class" url="class.imagickpixel.php"/>
+ <tocsect2 name="The ImagickPixelIterator class" url="class.imagickpixeliterator.php"/>
+</tocsect1>
+<tocsect1 name="Cyrus" url="book.cyrus.php">
+ <tocsect2 name="Introduction" url="intro.cyrus.php"/>
+ <tocsect2 name="Installing/Configuring" url="cyrus.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="cyrus.constants.php"/>
+ <tocsect2 name="Cyrus Functions" url="ref.cyrus.php"/>
+</tocsect1>
+<tocsect1 name="IMAP" url="book.imap.php">
+ <tocsect2 name="Introduction" url="intro.imap.php"/>
+ <tocsect2 name="Installing/Configuring" url="imap.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="imap.constants.php"/>
+ <tocsect2 name="IMAP Functions" url="ref.imap.php"/>
+</tocsect1>
+<tocsect1 name="Mail" url="book.mail.php">
+ <tocsect2 name="Introduction" url="intro.mail.php"/>
+ <tocsect2 name="Installing/Configuring" url="mail.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mail.constants.php"/>
+ <tocsect2 name="Mail Functions" url="ref.mail.php"/>
+</tocsect1>
+<tocsect1 name="Mailparse" url="book.mailparse.php">
+ <tocsect2 name="Introduction" url="intro.mailparse.php"/>
+ <tocsect2 name="Installing/Configuring" url="mailparse.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mailparse.constants.php"/>
+ <tocsect2 name="Mailparse Functions" url="ref.mailparse.php"/>
+</tocsect1>
+<tocsect1 name="vpopmail" url="book.vpopmail.php">
+ <tocsect2 name="Introduction" url="intro.vpopmail.php"/>
+ <tocsect2 name="Installing/Configuring" url="vpopmail.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="vpopmail.constants.php"/>
+ <tocsect2 name="vpopmail Functions" url="ref.vpopmail.php"/>
+</tocsect1>
+<tocsect1 name="BC Math" url="book.bc.php">
+ <tocsect2 name="Introduction" url="intro.bc.php"/>
+ <tocsect2 name="Installing/Configuring" url="bc.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="bc.constants.php"/>
+ <tocsect2 name="BC Math Functions" url="ref.bc.php"/>
+</tocsect1>
+<tocsect1 name="GMP" url="book.gmp.php">
+ <tocsect2 name="Introduction" url="intro.gmp.php"/>
+ <tocsect2 name="Installing/Configuring" url="gmp.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="gmp.constants.php"/>
+ <tocsect2 name="Examples" url="gmp.examples.php"/>
+ <tocsect2 name="GMP Functions" url="ref.gmp.php"/>
+</tocsect1>
+<tocsect1 name="Math" url="book.math.php">
+ <tocsect2 name="Introduction" url="intro.math.php"/>
+ <tocsect2 name="Installing/Configuring" url="math.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="math.constants.php"/>
+ <tocsect2 name="Math Functions" url="ref.math.php"/>
+</tocsect1>
+<tocsect1 name="Statistics" url="book.stats.php">
+ <tocsect2 name="Introduction" url="intro.stats.php"/>
+ <tocsect2 name="Installing/Configuring" url="stats.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="stats.constants.php"/>
+ <tocsect2 name="Statistic Functions" url="ref.stats.php"/>
+</tocsect1>
+<tocsect1 name="FDF" url="book.fdf.php">
+ <tocsect2 name="Introduction" url="intro.fdf.php"/>
+ <tocsect2 name="Installing/Configuring" url="fdf.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="fdf.constants.php"/>
+ <tocsect2 name="Examples" url="fdf.examples.php"/>
+ <tocsect2 name="FDF Functions" url="ref.fdf.php"/>
+</tocsect1>
+<tocsect1 name="GnuPG" url="book.gnupg.php">
+ <tocsect2 name="Introduction" url="intro.gnupg.php"/>
+ <tocsect2 name="Installing/Configuring" url="gnupg.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="gnupg.constants.php"/>
+ <tocsect2 name="Examples" url="gnupg.examples.php"/>
+ <tocsect2 name="GnuPG Functions" url="ref.gnupg.php"/>
+</tocsect1>
+<tocsect1 name="haru" url="book.haru.php">
+ <tocsect2 name="Introduction" url="intro.haru.php"/>
+ <tocsect2 name="Installing/Configuring" url="haru.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="haru.constants.php"/>
+ <tocsect2 name="Examples" url="haru.examples.php"/>
+ <tocsect2 name="Builtin Fonts And Encodings" url="haru.builtin.php"/>
+ <tocsect2 name="HaruException" url="class.haruexception.php"/>
+ <tocsect2 name="HaruDoc" url="class.harudoc.php"/>
+ <tocsect2 name="HaruPage" url="class.harupage.php"/>
+ <tocsect2 name="HaruFont" url="class.harufont.php"/>
+ <tocsect2 name="HaruImage" url="class.haruimage.php"/>
+ <tocsect2 name="HaruEncoder" url="class.haruencoder.php"/>
+ <tocsect2 name="HaruOutline" url="class.haruoutline.php"/>
+ <tocsect2 name="HaruAnnotation" url="class.haruannotation.php"/>
+ <tocsect2 name="HaruDestination" url="class.harudestination.php"/>
+</tocsect1>
+<tocsect1 name="Ming" url="book.ming.php">
+ <tocsect2 name="Introduction" url="intro.ming.php"/>
+ <tocsect2 name="Installing/Configuring" url="ming.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ming.constants.php"/>
+ <tocsect2 name="Examples" url="ming.examples.php"/>
+ <tocsect2 name="Ming Functions" url="ref.ming.php"/>
+ <tocsect2 name="SWFAction" url="class.swfaction.php"/>
+ <tocsect2 name="SWFBitmap" url="class.swfbitmap.php"/>
+ <tocsect2 name="SWFButton" url="class.swfbutton.php"/>
+ <tocsect2 name="SWFDisplayItem" url="class.swfdisplayitem.php"/>
+ <tocsect2 name="SWFFill" url="class.swffill.php"/>
+ <tocsect2 name="SWFFont" url="class.swffont.php"/>
+ <tocsect2 name="SWFFontChar" url="class.swffontchar.php"/>
+ <tocsect2 name="SWFGradient" url="class.swfgradient.php"/>
+ <tocsect2 name="SWFMorph" url="class.swfmorph.php"/>
+ <tocsect2 name="SWFMovie" url="class.swfmovie.php"/>
+ <tocsect2 name="SWFPrebuiltClip" url="class.swfprebuiltclip.php"/>
+ <tocsect2 name="SWFShape" url="class.swfshape.php"/>
+ <tocsect2 name="SWFSound" url="class.swfsound.php"/>
+ <tocsect2 name="SWFSoundInstance" url="class.swfsoundinstance.php"/>
+ <tocsect2 name="SWFSprite" url="class.swfsprite.php"/>
+ <tocsect2 name="SWFText" url="class.swftext.php"/>
+ <tocsect2 name="SWFTextField" url="class.swftextfield.php"/>
+ <tocsect2 name="SWFVideoStream" url="class.swfvideostream.php"/>
+</tocsect1>
+<tocsect1 name="PDF" url="book.pdf.php">
+ <tocsect2 name="Introduction" url="intro.pdf.php"/>
+ <tocsect2 name="Installing/Configuring" url="pdf.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="pdf.constants.php"/>
+ <tocsect2 name="Examples" url="pdf.examples.php"/>
+ <tocsect2 name="PDF Functions" url="ref.pdf.php"/>
+</tocsect1>
+<tocsect1 name="PS" url="book.ps.php">
+ <tocsect2 name="Introduction" url="intro.ps.php"/>
+ <tocsect2 name="Installing/Configuring" url="ps.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ps.constants.php"/>
+ <tocsect2 name="PS Functions" url="ref.ps.php"/>
+</tocsect1>
+<tocsect1 name="RPM Reader" url="book.rpmreader.php">
+ <tocsect2 name="Introduction" url="intro.rpmreader.php"/>
+ <tocsect2 name="Installing/Configuring" url="rpmreader.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="rpmreader.constants.php"/>
+ <tocsect2 name="Examples" url="rpmreader.examples.php"/>
+ <tocsect2 name="RPM Reader Functions" url="ref.rpmreader.php"/>
+</tocsect1>
+<tocsect1 name="SWF" url="book.swf.php">
+ <tocsect2 name="Introduction" url="intro.swf.php"/>
+ <tocsect2 name="Installing/Configuring" url="swf.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="swf.constants.php"/>
+ <tocsect2 name="Examples" url="swf.examples.php"/>
+ <tocsect2 name="SWF Functions" url="ref.swf.php"/>
+</tocsect1>
+<tocsect1 name="Swish" url="book.swish.php">
+ <tocsect2 name="Introduction" url="intro.swish.php"/>
+ <tocsect2 name="Installing/Configuring" url="swish.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="swish.constants.php"/>
+ <tocsect2 name="Examples" url="swish.examples.php"/>
+ <tocsect2 name="Swish Functions" url="ref.swish.php"/>
+</tocsect1>
+<tocsect1 name="Program execution" url="book.exec.php">
+ <tocsect2 name="Introduction" url="intro.exec.php"/>
+ <tocsect2 name="Installing/Configuring" url="exec.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="exec.constants.php"/>
+ <tocsect2 name="Program execution Functions" url="ref.exec.php"/>
+</tocsect1>
+<tocsect1 name="Expect" url="book.expect.php">
+ <tocsect2 name="Introduction" url="intro.expect.php"/>
+ <tocsect2 name="Installing/Configuring" url="expect.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="expect.constants.php"/>
+ <tocsect2 name="Examples" url="expect.examples.php"/>
+ <tocsect2 name="Expect Functions" url="ref.expect.php"/>
+</tocsect1>
+<tocsect1 name="PCNTL" url="book.pcntl.php">
+ <tocsect2 name="Introduction" url="intro.pcntl.php"/>
+ <tocsect2 name="Installing/Configuring" url="pcntl.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="pcntl.constants.php"/>
+ <tocsect2 name="Examples" url="pcntl.examples.php"/>
+ <tocsect2 name="PCNTL Functions" url="ref.pcntl.php"/>
+</tocsect1>
+<tocsect1 name="POSIX" url="book.posix.php">
+ <tocsect2 name="Introduction" url="intro.posix.php"/>
+ <tocsect2 name="Installing/Configuring" url="posix.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="posix.constants.php"/>
+ <tocsect2 name="POSIX Functions" url="ref.posix.php"/>
+</tocsect1>
+<tocsect1 name="Semaphore" url="book.sem.php">
+ <tocsect2 name="Introduction" url="intro.sem.php"/>
+ <tocsect2 name="Installing/Configuring" url="sem.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="sem.constants.php"/>
+ <tocsect2 name="Semaphore Functions" url="ref.sem.php"/>
+</tocsect1>
+<tocsect1 name="Shared Memory" url="book.shmop.php">
+ <tocsect2 name="Introduction" url="intro.shmop.php"/>
+ <tocsect2 name="Installing/Configuring" url="shmop.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="shmop.constants.php"/>
+ <tocsect2 name="Examples" url="shmop.examples.php"/>
+ <tocsect2 name="Shared Memory Functions" url="ref.shmop.php"/>
+</tocsect1>
+<tocsect1 name="GeoIP" url="book.geoip.php">
+ <tocsect2 name="Introduction" url="intro.geoip.php"/>
+ <tocsect2 name="Installing/Configuring" url="geoip.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="geoip.constants.php"/>
+ <tocsect2 name="GeoIP Functions" url="ref.geoip.php"/>
+</tocsect1>
+<tocsect1 name="JSON" url="book.json.php">
+ <tocsect2 name="Introduction" url="intro.json.php"/>
+ <tocsect2 name="Installing/Configuring" url="json.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="json.constants.php"/>
+ <tocsect2 name="JSON Functions" url="ref.json.php"/>
+</tocsect1>
+<tocsect1 name="Misc." url="book.misc.php">
+ <tocsect2 name="Introduction" url="intro.misc.php"/>
+ <tocsect2 name="Installing/Configuring" url="misc.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="misc.constants.php"/>
+ <tocsect2 name="Misc. Functions" url="ref.misc.php"/>
+</tocsect1>
+<tocsect1 name="Parsekit" url="book.parsekit.php">
+ <tocsect2 name="Introduction" url="intro.parsekit.php"/>
+ <tocsect2 name="Installing/Configuring" url="parsekit.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="parsekit.constants.php"/>
+ <tocsect2 name="Parsekit Functions" url="ref.parsekit.php"/>
+</tocsect1>
+<tocsect1 name="SPL" url="book.spl.php">
+ <tocsect2 name="Introduction" url="intro.spl.php"/>
+ <tocsect2 name="Installing/Configuring" url="spl.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="spl.constants.php"/>
+ <tocsect2 name="Datastructures" url="spl.datastructures.php"/>
+ <tocsect2 name="SPL Functions" url="ref.spl.php"/>
+ <tocsect2 name="ArrayIterator" url="class.arrayiterator.php"/>
+ <tocsect2 name="ArrayObject" url="class.arrayobject.php"/>
+ <tocsect2 name="CachingIterator" url="class.cachingiterator.php"/>
+ <tocsect2 name="RecursiveCachingIterator" url="class.recursivecachingiterator.php"/>
+ <tocsect2 name="DirectoryIterator" url="class.directoryiterator.php"/>
+ <tocsect2 name="FilterIterator" url="class.filteriterator.php"/>
+ <tocsect2 name="LimitIterator" url="class.limititerator.php"/>
+ <tocsect2 name="ParentIterator" url="class.parentiterator.php"/>
+ <tocsect2 name="RecursiveDirectoryIterator" url="class.recursivedirectoryiterator.php"/>
+ <tocsect2 name="RecursiveIteratorIterator" url="class.recursiveiteratoriterator.php"/>
+ <tocsect2 name="SimpleXMLIterator" url="class.simplexmliterator.php"/>
+ <tocsect2 name="SplDoublyLinkedList" url="class.spldoublylinkedlist.php"/>
+ <tocsect2 name="SplStack" url="class.splstack.php"/>
+ <tocsect2 name="SplQueue" url="class.splqueue.php"/>
+ <tocsect2 name="SplHeap" url="class.splheap.php"/>
+ <tocsect2 name="SplMaxHeap" url="class.splmaxheap.php"/>
+ <tocsect2 name="SplMinHeap" url="class.splminheap.php"/>
+ <tocsect2 name="SplPriorityQueue" url="class.splpriorityqueue.php"/>
+</tocsect1>
+<tocsect1 name="Streams" url="book.stream.php">
+ <tocsect2 name="Introduction" url="intro.stream.php"/>
+ <tocsect2 name="Installing/Configuring" url="stream.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="stream.constants.php"/>
+ <tocsect2 name="Stream Filters" url="stream.filters.php"/>
+ <tocsect2 name="Stream Contexts" url="stream.contexts.php"/>
+ <tocsect2 name="Stream Errors" url="stream.errors.php"/>
+ <tocsect2 name="Examples" url="stream.examples.php"/>
+ <tocsect2 name="Stream Functions" url="ref.stream.php"/>
+</tocsect1>
+<tocsect1 name="Tidy" url="book.tidy.php">
+ <tocsect2 name="Introduction" url="intro.tidy.php"/>
+ <tocsect2 name="Installing/Configuring" url="tidy.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="tidy.constants.php"/>
+ <tocsect2 name="Examples" url="tidy.examples.php"/>
+ <tocsect2 name="Tidy Functions" url="ref.tidy.php"/>
+</tocsect1>
+<tocsect1 name="Tokenizer" url="book.tokenizer.php">
+ <tocsect2 name="Introduction" url="intro.tokenizer.php"/>
+ <tocsect2 name="Installing/Configuring" url="tokenizer.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="tokenizer.constants.php"/>
+ <tocsect2 name="Examples" url="tokenizer.examples.php"/>
+ <tocsect2 name="Tokenizer Functions" url="ref.tokenizer.php"/>
+</tocsect1>
+<tocsect1 name="URLs" url="book.url.php">
+ <tocsect2 name="Introduction" url="intro.url.php"/>
+ <tocsect2 name="Installing/Configuring" url="url.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="url.constants.php"/>
+ <tocsect2 name="URL Functions" url="ref.url.php"/>
+</tocsect1>
+<tocsect1 name="cURL" url="book.curl.php">
+ <tocsect2 name="Introduction" url="intro.curl.php"/>
+ <tocsect2 name="Installing/Configuring" url="curl.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="curl.constants.php"/>
+ <tocsect2 name="Examples" url="curl.examples.php"/>
+ <tocsect2 name="cURL Functions" url="ref.curl.php"/>
+</tocsect1>
+<tocsect1 name="FAM" url="book.fam.php">
+ <tocsect2 name="Introduction" url="intro.fam.php"/>
+ <tocsect2 name="Installing/Configuring" url="fam.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="fam.constants.php"/>
+ <tocsect2 name="FAM Functions" url="ref.fam.php"/>
+</tocsect1>
+<tocsect1 name="FTP" url="book.ftp.php">
+ <tocsect2 name="Introduction" url="intro.ftp.php"/>
+ <tocsect2 name="Installing/Configuring" url="ftp.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ftp.constants.php"/>
+ <tocsect2 name="Examples" url="ftp.examples.php"/>
+ <tocsect2 name="FTP Functions" url="ref.ftp.php"/>
+</tocsect1>
+<tocsect1 name="Hyperwave" url="book.hw.php">
+ <tocsect2 name="Introduction" url="intro.hw.php"/>
+ <tocsect2 name="Installing/Configuring" url="hw.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="hw.constants.php"/>
+ <tocsect2 name="Integration with Apache" url="hw.apache.php"/>
+ <tocsect2 name="Hyperwave Functions" url="ref.hw.php"/>
+</tocsect1>
+<tocsect1 name="Hyperwave API" url="book.hwapi.php">
+ <tocsect2 name="Introduction" url="intro.hwapi.php"/>
+ <tocsect2 name="Installing/Configuring" url="hwapi.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="hwapi.constants.php"/>
+ <tocsect2 name="Hyperwave API Functions" url="ref.hwapi.php"/>
+</tocsect1>
+<tocsect1 name="HTTP" url="book.http.php">
+ <tocsect2 name="Introduction" url="intro.http.php"/>
+ <tocsect2 name="Installing/Configuring" url="http.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="http.constants.php"/>
+ <tocsect2 name="Request Options" url="http.request.options.php"/>
+ <tocsect2 name="The HttpDeflateStream class" url="class.httpdeflatestream.php"/>
+ <tocsect2 name="The HttpInflateStream class" url="class.httpinflatestream.php"/>
+ <tocsect2 name="The HttpMessage class" url="class.httpmessage.php"/>
+ <tocsect2 name="The HttpQueryString class" url="class.httpquerystring.php"/>
+ <tocsect2 name="The HttpRequest" url="class.httprequest.php"/>
+ <tocsect2 name="The HttpRequestPool class" url="class.httprequestpool.php"/>
+ <tocsect2 name="The HttpResponse" url="class.httpresponse.php"/>
+ <tocsect2 name="HTTP Functions" url="ref.http.php"/>
+</tocsect1>
+<tocsect1 name="Java" url="book.java.php">
+ <tocsect2 name="Introduction" url="intro.java.php"/>
+ <tocsect2 name="Installing/Configuring" url="java.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="java.constants.php"/>
+ <tocsect2 name="Java Servlet SAPI" url="java.servlet.php"/>
+ <tocsect2 name="Examples" url="java.examples.php"/>
+ <tocsect2 name="Java Functions" url="ref.java.php"/>
+</tocsect1>
+<tocsect1 name="LDAP" url="book.ldap.php">
+ <tocsect2 name="Introduction" url="intro.ldap.php"/>
+ <tocsect2 name="Installing/Configuring" url="ldap.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ldap.constants.php"/>
+ <tocsect2 name="Using the PHP LDAP calls" url="ldap.using.php"/>
+ <tocsect2 name="Examples" url="ldap.examples.php"/>
+ <tocsect2 name="LDAP Functions" url="ref.ldap.php"/>
+</tocsect1>
+<tocsect1 name="Lotus Notes" url="book.notes.php">
+ <tocsect2 name="Introduction" url="intro.notes.php"/>
+ <tocsect2 name="Installing/Configuring" url="notes.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="notes.constants.php"/>
+ <tocsect2 name="Lotus Notes Functions" url="ref.notes.php"/>
+</tocsect1>
+<tocsect1 name="Memcache" url="book.memcache.php">
+ <tocsect2 name="Introduction" url="intro.memcache.php"/>
+ <tocsect2 name="Installing/Configuring" url="memcache.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="memcache.constants.php"/>
+ <tocsect2 name="Examples" url="memcache.examples.php"/>
+ <tocsect2 name="Memcache Functions" url="ref.memcache.php"/>
+</tocsect1>
+<tocsect1 name="mnoGoSearch" url="book.mnogosearch.php">
+ <tocsect2 name="Introduction" url="intro.mnogosearch.php"/>
+ <tocsect2 name="Installing/Configuring" url="mnogosearch.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mnogosearch.constants.php"/>
+ <tocsect2 name="mnoGoSearch Functions" url="ref.mnogosearch.php"/>
+</tocsect1>
+<tocsect1 name="mqseries" url="book.mqseries.php">
+ <tocsect2 name="Introduction" url="intro.mqseries.php"/>
+ <tocsect2 name="Installing/Configuring" url="mqseries.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="mqseries.constants.php"/>
+ <tocsect2 name="mqseries Functions" url="ref.mqseries.php"/>
+</tocsect1>
+<tocsect1 name="Gopher" url="book.net-gopher.php">
+ <tocsect2 name="Introduction" url="intro.net-gopher.php"/>
+ <tocsect2 name="Installing/Configuring" url="net-gopher.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="net-gopher.constants.php"/>
+ <tocsect2 name="Examples" url="net-gopher.examples.php"/>
+ <tocsect2 name="Gopher Functions" url="ref.net-gopher.php"/>
+</tocsect1>
+<tocsect1 name="Network" url="book.network.php">
+ <tocsect2 name="Introduction" url="intro.network.php"/>
+ <tocsect2 name="Installing/Configuring" url="network.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="network.constants.php"/>
+ <tocsect2 name="Network Functions" url="ref.network.php"/>
+</tocsect1>
+<tocsect1 name="SAM" url="book.sam.php">
+ <tocsect2 name="Introduction" url="intro.sam.php"/>
+ <tocsect2 name="Installing/Configuring" url="sam.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="sam.constants.php"/>
+ <tocsect2 name="Examples" url="sam.examples.php"/>
+ <tocsect2 name="SAM Functions" url="ref.sam.php"/>
+</tocsect1>
+<tocsect1 name="SNMP" url="book.snmp.php">
+ <tocsect2 name="Introduction" url="intro.snmp.php"/>
+ <tocsect2 name="Installing/Configuring" url="snmp.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="snmp.constants.php"/>
+ <tocsect2 name="SNMP Functions" url="ref.snmp.php"/>
+</tocsect1>
+<tocsect1 name="Sockets" url="book.sockets.php">
+ <tocsect2 name="Introduction" url="intro.sockets.php"/>
+ <tocsect2 name="Installing/Configuring" url="sockets.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="sockets.constants.php"/>
+ <tocsect2 name="Examples" url="sockets.examples.php"/>
+ <tocsect2 name="Socket Errors" url="sockets.errors.php"/>
+ <tocsect2 name="Socket Functions" url="ref.sockets.php"/>
+</tocsect1>
+<tocsect1 name="SSH2" url="book.ssh2.php">
+ <tocsect2 name="Introduction" url="intro.ssh2.php"/>
+ <tocsect2 name="Installing/Configuring" url="ssh2.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ssh2.constants.php"/>
+ <tocsect2 name="SSH2 Functions" url="ref.ssh2.php"/>
+</tocsect1>
+<tocsect1 name="SVN" url="book.svn.php">
+ <tocsect2 name="Introduction" url="intro.svn.php"/>
+ <tocsect2 name="Installing/Configuring" url="svn.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="svn.constants.php"/>
+ <tocsect2 name="SVN Functions" url="ref.svn.php"/>
+</tocsect1>
+<tocsect1 name="TCP" url="book.tcpwrap.php">
+ <tocsect2 name="Introduction" url="intro.tcpwrap.php"/>
+ <tocsect2 name="Installing/Configuring" url="tcpwrap.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="tcpwrap.constants.php"/>
+ <tocsect2 name="TCP Functions" url="ref.tcpwrap.php"/>
+</tocsect1>
+<tocsect1 name="YAZ" url="book.yaz.php">
+ <tocsect2 name="Introduction" url="intro.yaz.php"/>
+ <tocsect2 name="Installing/Configuring" url="yaz.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="yaz.constants.php"/>
+ <tocsect2 name="Examples" url="yaz.examples.php"/>
+ <tocsect2 name="YAZ Functions" url="ref.yaz.php"/>
+</tocsect1>
+<tocsect1 name="YP/NIS" url="book.nis.php">
+ <tocsect2 name="Introduction" url="intro.nis.php"/>
+ <tocsect2 name="Installing/Configuring" url="nis.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="nis.constants.php"/>
+ <tocsect2 name="YP/NIS Functions" url="ref.nis.php"/>
+</tocsect1>
+<tocsect1 name="Apache" url="book.apache.php">
+ <tocsect2 name="Introduction" url="intro.apache.php"/>
+ <tocsect2 name="Installing/Configuring" url="apache.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="apache.constants.php"/>
+ <tocsect2 name="Apache Functions" url="ref.apache.php"/>
+</tocsect1>
+<tocsect1 name="IIS" url="book.iisfunc.php">
+ <tocsect2 name="Introduction" url="intro.iisfunc.php"/>
+ <tocsect2 name="Installing/Configuring" url="iisfunc.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="iisfunc.constants.php"/>
+ <tocsect2 name="IIS Functions" url="ref.iisfunc.php"/>
+</tocsect1>
+<tocsect1 name="NSAPI" url="book.nsapi.php">
+ <tocsect2 name="Introduction" url="intro.nsapi.php"/>
+ <tocsect2 name="Installing/Configuring" url="nsapi.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="nsapi.constants.php"/>
+ <tocsect2 name="NSAPI Functions" url="ref.nsapi.php"/>
+</tocsect1>
+<tocsect1 name="Msession" url="book.msession.php">
+ <tocsect2 name="Introduction" url="intro.msession.php"/>
+ <tocsect2 name="Installing/Configuring" url="msession.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="msession.constants.php"/>
+ <tocsect2 name="Msession Functions" url="ref.msession.php"/>
+</tocsect1>
+<tocsect1 name="Sessions" url="book.session.php">
+ <tocsect2 name="Introduction" url="intro.session.php"/>
+ <tocsect2 name="Installing/Configuring" url="session.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="session.constants.php"/>
+ <tocsect2 name="Examples" url="session.examples.php"/>
+ <tocsect2 name="Sessions and security" url="session.security.php"/>
+ <tocsect2 name="Session Functions" url="ref.session.php"/>
+</tocsect1>
+<tocsect1 name="Session PgSQL" url="book.session-pgsql.php">
+ <tocsect2 name="Introduction" url="intro.session-pgsql.php"/>
+ <tocsect2 name="Installing/Configuring" url="session-pgsql.setup.php"/>
+ <tocsect2 name="Table definitions" url="session-pgsql.tables.php"/>
+ <tocsect2 name="Predefined Constants" url="session-pgsql.constants.php"/>
+ <tocsect2 name="Session PgSQL Functions" url="ref.session-pgsql.php"/>
+</tocsect1>
+<tocsect1 name="BBCode" url="book.bbcode.php">
+ <tocsect2 name="Introduction" url="intro.bbcode.php"/>
+ <tocsect2 name="Installing/Configuring" url="bbcode.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="bbcode.constants.php"/>
+ <tocsect2 name="BBCode Functions" url="ref.bbcode.php"/>
+</tocsect1>
+<tocsect1 name="PCRE" url="book.pcre.php">
+ <tocsect2 name="Introduction" url="intro.pcre.php"/>
+ <tocsect2 name="Installing/Configuring" url="pcre.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="pcre.constants.php"/>
+ <tocsect2 name="Examples" url="pcre.examples.php"/>
+ <tocsect2 name="PCRE Patterns" url="pcre.pattern.php"/>
+ <tocsect2 name="PCRE Functions" url="ref.pcre.php"/>
+</tocsect1>
+<tocsect1 name="POSIX Regex" url="book.regex.php">
+ <tocsect2 name="Introduction" url="intro.regex.php"/>
+ <tocsect2 name="Installing/Configuring" url="regex.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="regex.constants.php"/>
+ <tocsect2 name="Examples" url="regex.examples.php"/>
+ <tocsect2 name="POSIX Regex Functions" url="ref.regex.php"/>
+</tocsect1>
+<tocsect1 name="Strings" url="book.strings.php">
+ <tocsect2 name="Introduction" url="intro.strings.php"/>
+ <tocsect2 name="Installing/Configuring" url="strings.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="string.constants.php"/>
+ <tocsect2 name="String Functions" url="ref.strings.php"/>
+</tocsect1>
+<tocsect1 name="Arrays" url="book.array.php">
+ <tocsect2 name="Introduction" url="intro.array.php"/>
+ <tocsect2 name="Installing/Configuring" url="array.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="array.constants.php"/>
+ <tocsect2 name="Array Functions" url="ref.array.php"/>
+</tocsect1>
+<tocsect1 name="Classes/Objects" url="book.classobj.php">
+ <tocsect2 name="Introduction" url="intro.classobj.php"/>
+ <tocsect2 name="Installing/Configuring" url="classobj.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="classobj.constants.php"/>
+ <tocsect2 name="Examples" url="classobj.examples.php"/>
+ <tocsect2 name="Classes/Object Functions" url="ref.classobj.php"/>
+</tocsect1>
+<tocsect1 name="Classkit" url="book.classkit.php">
+ <tocsect2 name="Introduction" url="intro.classkit.php"/>
+ <tocsect2 name="Installing/Configuring" url="classkit.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="classkit.constants.php"/>
+ <tocsect2 name="Classkit Functions" url="ref.classkit.php"/>
+</tocsect1>
+<tocsect1 name="Ctype" url="book.ctype.php">
+ <tocsect2 name="Introduction" url="intro.ctype.php"/>
+ <tocsect2 name="Installing/Configuring" url="ctype.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="ctype.constants.php"/>
+ <tocsect2 name="Ctype Functions" url="ref.ctype.php"/>
+</tocsect1>
+<tocsect1 name="Filter" url="book.filter.php">
+ <tocsect2 name="Introduction" url="intro.filter.php"/>
+ <tocsect2 name="Installing/Configuring" url="filter.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="filter.constants.php"/>
+ <tocsect2 name="Filter Functions" url="ref.filter.php"/>
+</tocsect1>
+<tocsect1 name="Function Handling" url="book.funchand.php">
+ <tocsect2 name="Introduction" url="intro.funchand.php"/>
+ <tocsect2 name="Installing/Configuring" url="funchand.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="funchand.constants.php"/>
+ <tocsect2 name="Function handling Functions" url="ref.funchand.php"/>
+</tocsect1>
+<tocsect1 name="Object Aggregation" url="book.objaggregation.php">
+ <tocsect2 name="Introduction" url="intro.objaggregation.php"/>
+ <tocsect2 name="Examples" url="objaggregation.examples.php"/>
+ <tocsect2 name="Object Aggregation Functions" url="ref.objaggregation.php"/>
+</tocsect1>
+<tocsect1 name="Variable handling" url="book.var.php">
+ <tocsect2 name="Introduction" url="intro.var.php"/>
+ <tocsect2 name="Installing/Configuring" url="var.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="var.constants.php"/>
+ <tocsect2 name="Variable handling Functions" url="ref.var.php"/>
+</tocsect1>
+<tocsect1 name="SOAP" url="book.soap.php">
+ <tocsect2 name="Introduction" url="intro.soap.php"/>
+ <tocsect2 name="Installing/Configuring" url="soap.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="soap.constants.php"/>
+ <tocsect2 name="SOAP Functions" url="ref.soap.php"/>
+</tocsect1>
+<tocsect1 name="XML-RPC" url="book.xmlrpc.php">
+ <tocsect2 name="Introduction" url="intro.xmlrpc.php"/>
+ <tocsect2 name="Installing/Configuring" url="xmlrpc.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="xmlrpc.constants.php"/>
+ <tocsect2 name="XML-RPC Functions" url="ref.xmlrpc.php"/>
+</tocsect1>
+<tocsect1 name=".NET" url="book.dotnet.php">
+ <tocsect2 name="Introduction" url="dotnet.intro.php"/>
+ <tocsect2 name="Installing/Configuring" url="dotnet.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="dotnet.constants.php"/>
+ <tocsect2 name=".NET Functions" url="ref.dotnet.php"/>
+</tocsect1>
+<tocsect1 name="COM" url="book.com.php">
+ <tocsect2 name="Introduction" url="intro.com.php"/>
+ <tocsect2 name="Installing/Configuring" url="com.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="com.constants.php"/>
+ <tocsect2 name="Errors and error handling" url="com.error-handling.php"/>
+ <tocsect2 name="Examples" url="com.examples.php"/>
+ <tocsect2 name="COM Functions" url="ref.com.php"/>
+</tocsect1>
+<tocsect1 name="Printer" url="book.printer.php">
+ <tocsect2 name="Introduction" url="intro.printer.php"/>
+ <tocsect2 name="Installing/Configuring" url="printer.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="printer.constants.php"/>
+ <tocsect2 name="Printer Functions" url="ref.printer.php"/>
+</tocsect1>
+<tocsect1 name="W32api" url="book.w32api.php">
+ <tocsect2 name="Introduction" url="intro.w32api.php"/>
+ <tocsect2 name="Installing/Configuring" url="w32api.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="w32api.constants.php"/>
+ <tocsect2 name="Examples" url="w32api.examples.php"/>
+ <tocsect2 name="W32api Functions" url="ref.w32api.php"/>
+</tocsect1>
+<tocsect1 name="win32ps" url="book.win32ps.php">
+ <tocsect2 name="Introduction" url="intro.win32ps.php"/>
+ <tocsect2 name="Installing/Configuring" url="win32ps.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="win32ps.constants.php"/>
+ <tocsect2 name="Examples" url="win32ps.examples.php"/>
+ <tocsect2 name="win32ps Functions" url="ref.win32ps.php"/>
+</tocsect1>
+<tocsect1 name="win32service" url="book.win32service.php">
+ <tocsect2 name="Introduction" url="intro.win32service.php"/>
+ <tocsect2 name="Installing/Configuring" url="win32service.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="win32service.constants.php"/>
+ <tocsect2 name="Examples" url="win32service.examples.php"/>
+ <tocsect2 name="win32service Functions" url="ref.win32service.php"/>
+</tocsect1>
+<tocsect1 name="DOM" url="book.dom.php">
+ <tocsect2 name="Introduction" url="intro.dom.php"/>
+ <tocsect2 name="Installing/Configuring" url="dom.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="dom.constants.php"/>
+ <tocsect2 name="DOMAttr" url="class.domattr.php"/>
+ <tocsect2 name="DOMCharacterData" url="class.domcharacterdata.php"/>
+ <tocsect2 name="DOMComment" url="class.domcomment.php"/>
+ <tocsect2 name="DOMDocument" url="class.domdocument.php"/>
+ <tocsect2 name="DOMDocumentFragment" url="class.domdocumentfragment.php"/>
+ <tocsect2 name="DOMDocumentType" url="class.domdocumenttype.php"/>
+ <tocsect2 name="DOMElement" url="class.domelement.php"/>
+ <tocsect2 name="DOMEntity" url="class.domentity.php"/>
+ <tocsect2 name="DOMEntityReference" url="class.domentityreference.php"/>
+ <tocsect2 name="DOMException" url="class.domexception.php"/>
+ <tocsect2 name="DOMImplementation" url="class.domimplementation.php"/>
+ <tocsect2 name="DOMNamedNodeMap" url="class.domnamednodemap.php"/>
+ <tocsect2 name="DOMNode" url="class.domnode.php"/>
+ <tocsect2 name="DOMNodeList" url="class.domnodelist.php"/>
+ <tocsect2 name="DOMNotation" url="class.domnotation.php"/>
+ <tocsect2 name="DOMProcessingInstruction" url="class.domprocessinginstruction.php"/>
+ <tocsect2 name="DOMText" url="class.domtext.php"/>
+ <tocsect2 name="DOMXPath" url="class.domxpath.php"/>
+ <tocsect2 name="DOM Functions" url="ref.dom.php"/>
+</tocsect1>
+<tocsect1 name="DOM XML" url="book.domxml.php">
+ <tocsect2 name="Introduction" url="intro.domxml.php"/>
+ <tocsect2 name="Installing/Configuring" url="domxml.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="domxml.constants.php"/>
+ <tocsect2 name="DOM XML Functions" url="ref.domxml.php"/>
+</tocsect1>
+<tocsect1 name="libxml" url="book.libxml.php">
+ <tocsect2 name="Introduction" url="intro.libxml.php"/>
+ <tocsect2 name="Installing/Configuring" url="libxml.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="libxml.constants.php"/>
+ <tocsect2 name="libxml Functions" url="ref.libxml.php"/>
+</tocsect1>
+<tocsect1 name="qtdom" url="book.qtdom.php">
+ <tocsect2 name="Introduction" url="intro.qtdom.php"/>
+ <tocsect2 name="Installing/Configuring" url="qtdom.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="qtdom.constants.php"/>
+ <tocsect2 name="qtdom Functions" url="ref.qtdom.php"/>
+</tocsect1>
+<tocsect1 name="SCA" url="book.sca.php">
+ <tocsect2 name="Introduction" url="intro.sca.php"/>
+ <tocsect2 name="Installing/Configuring" url="sca.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="sca.constants.php"/>
+ <tocsect2 name="Examples" url="sca.examples.php"/>
+ <tocsect2 name="SCA Functions" url="ref.sca.php"/>
+</tocsect1>
+<tocsect1 name="SDO DAS XML" url="book.sdo-das-xml.php">
+ <tocsect2 name="Introduction" url="intro.sdo-das-xml.php"/>
+ <tocsect2 name="Installing/Configuring" url="sdo-das-xml.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="sdo-das-xml.constants.php"/>
+ <tocsect2 name="Examples" url="sdo-das-xml.examples.php"/>
+ <tocsect2 name="SDO DAS XML Functions" url="ref.sdo-das-xml.php"/>
+</tocsect1>
+<tocsect1 name="SimpleXML" url="book.simplexml.php">
+ <tocsect2 name="Introduction" url="intro.simplexml.php"/>
+ <tocsect2 name="Installing/Configuring" url="simplexml.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="simplexml.constants.php"/>
+ <tocsect2 name="Examples" url="simplexml.examples.php"/>
+ <tocsect2 name="SimpleXML Functions" url="ref.simplexml.php"/>
+</tocsect1>
+<tocsect1 name="WDDX" url="book.wddx.php">
+ <tocsect2 name="Introduction" url="intro.wddx.php"/>
+ <tocsect2 name="Installing/Configuring" url="wddx.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="wddx.constants.php"/>
+ <tocsect2 name="Examples" url="wddx.examples.php"/>
+ <tocsect2 name="WDDX Functions" url="ref.wddx.php"/>
+</tocsect1>
+<tocsect1 name="XML Parser" url="book.xml.php">
+ <tocsect2 name="Introduction" url="intro.xml.php"/>
+ <tocsect2 name="Installing/Configuring" url="xml.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="xml.constants.php"/>
+ <tocsect2 name="Event Handlers" url="xml.eventhandlers.php"/>
+ <tocsect2 name="Case Folding" url="xml.case-folding.php"/>
+ <tocsect2 name="Error Codes" url="xml.error-codes.php"/>
+ <tocsect2 name="Character Encoding" url="xml.encoding.php"/>
+ <tocsect2 name="Examples" url="xml.examples.php"/>
+ <tocsect2 name="XML Parser Functions" url="ref.xml.php"/>
+</tocsect1>
+<tocsect1 name="XMLReader" url="book.xmlreader.php">
+ <tocsect2 name="Introduction" url="intro.xmlreader.php"/>
+ <tocsect2 name="Installing/Configuring" url="xmlreader.setup.php"/>
+ <tocsect2 name="XMLReader" url="class.xmlreader.php"/>
+</tocsect1>
+<tocsect1 name="XMLWriter" url="book.xmlwriter.php">
+ <tocsect2 name="Introduction" url="intro.xmlwriter.php"/>
+ <tocsect2 name="Installing/Configuring" url="xmlwriter.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="xmlwriter.constants.php"/>
+ <tocsect2 name="XMLWriter Functions" url="ref.xmlwriter.php"/>
+</tocsect1>
+<tocsect1 name="XSL" url="book.xsl.php">
+ <tocsect2 name="Introduction" url="intro.xsl.php"/>
+ <tocsect2 name="Installing/Configuring" url="xsl.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="xsl.constants.php"/>
+ <tocsect2 name="Examples" url="xsl.examples.php"/>
+ <tocsect2 name="XSLTProcessor" url="class.xsltprocessor.php"/>
+</tocsect1>
+<tocsect1 name="XSLT" url="book.xslt.php">
+ <tocsect2 name="Introduction" url="intro.xslt.php"/>
+ <tocsect2 name="Installing/Configuring" url="xslt.setup.php"/>
+ <tocsect2 name="Predefined Constants" url="xslt.constants.php"/>
+ <tocsect2 name="XSLT Functions" url="ref.xslt.php"/>
+</tocsect1>
+<tocsect1 name="PHP at the Core: A Hacker&#039;s Guide to the Zend Engine" url="internals2.php">
+ <tocsect2 name="Preface" url="internals2.preface.php"/>
+ <tocsect2 name="The &quot;counter&quot; Extension - A Continuing Example" url="internals2.counter.php"/>
+ <tocsect2 name="The PHP 5 build system" url="internals2.buildsys.php"/>
+ <tocsect2 name="Extension structure" url="internals2.structure.php"/>
+ <tocsect2 name="Memory management" url="internals2.memory.php"/>
+ <tocsect2 name="Working with variables" url="internals2.variables.php"/>
+ <tocsect2 name="Writing functions" url="internals2.funcs.php"/>
+ <tocsect2 name="Working with classes and objects" url="internals2.objects.php"/>
+ <tocsect2 name="Working with resources" url="internals2.resources.php"/>
+ <tocsect2 name="Working with INI settings" url="internals2.ini.php"/>
+ <tocsect2 name="Working with streams" url="internals2.streams.php"/>
+ <tocsect2 name="PDO Driver How-To" url="internals2.pdo.php"/>
+ <tocsect2 name="Extension FAQs" url="internals2.faq.php"/>
+ <tocsect2 name="Zend Engine 2 API reference" url="internals2.apiref.php"/>
+ <tocsect2 name="Zend Engine 1" url="internals2.ze1.php"/>
+ <tocsect2 name="The future: PHP 6 and Zend Engine 3" url="internals2.ze3.php"/>
+</tocsect1>
+<tocsect1 name="FAQ" url="faq.php">
+ <tocsect2 name="General Information" url="faq.general.php"/>
+ <tocsect2 name="Mailing lists" url="faq.mailinglist.php"/>
+ <tocsect2 name="Obtaining PHP" url="faq.obtaining.php"/>
+ <tocsect2 name="Database issues" url="faq.databases.php"/>
+ <tocsect2 name="Installation" url="faq.installation.php"/>
+ <tocsect2 name="Build Problems" url="faq.build.php"/>
+ <tocsect2 name="Using PHP" url="faq.using.php"/>
+ <tocsect2 name="PHP and HTML" url="faq.html.php"/>
+ <tocsect2 name="PHP and COM" url="faq.com.php"/>
+ <tocsect2 name="PHP and other languages" url="faq.languages.php"/>
+ <tocsect2 name="Migrating from PHP 4 to PHP 5" url="faq.migration5.php"/>
+ <tocsect2 name="Miscellaneous Questions" url="faq.misc.php"/>
+</tocsect1>
+<tocsect1 name="Appendices" url="appendices.php">
+ <tocsect2 name="History of PHP and related projects" url="history.php"/>
+ <tocsect2 name="Migrating from PHP 5.1.x to PHP 5.2.x" url="migration52.php"/>
+ <tocsect2 name="Migrating from PHP 5.0.x to PHP 5.1.x" url="migration51.php"/>
+ <tocsect2 name="Migrating from PHP 4 to PHP 5" url="migration5.php"/>
+ <tocsect2 name="Debugging in PHP" url="debugger.php"/>
+ <tocsect2 name="Configure options" url="configure.php"/>
+ <tocsect2 name="php.ini directives" url="ini.php"/>
+ <tocsect2 name="Extension Categorization" url="extensions.php"/>
+ <tocsect2 name="List of Function Aliases" url="aliases.php"/>
+ <tocsect2 name="List of Reserved Words" url="reserved.php"/>
+ <tocsect2 name="List of Resource Types" url="resource.php"/>
+ <tocsect2 name="List of Supported Protocols/Wrappers" url="wrappers.php"/>
+ <tocsect2 name="List of Available Filters" url="filters.php"/>
+ <tocsect2 name="List of Supported Socket Transports" url="transports.php"/>
+ <tocsect2 name="PHP type comparison tables" url="types.comparisons.php"/>
+ <tocsect2 name="List of Parser Tokens" url="tokens.php"/>
+ <tocsect2 name="Userland Naming Guide" url="userlandnaming.php"/>
+ <tocsect2 name="About the manual" url="about.php"/>
+ <tocsect2 name="Open Publication License" url="opl.license.php"/>
+ <tocsect2 name="Function Index" url="indexes.php"/>
+</tocsect1>
+<index>
+<entry name="Superglobals" url="language.variables.superglobals.php"/>
+<entry name="$GLOBALS" url="reserved.variables.globals.php"/>
+<entry name="$HTTP_SERVER_VARS [deprecated]" url="reserved.variables.server.php"/>
+<entry name="$HTTP_GET_VARS [deprecated]" url="reserved.variables.get.php"/>
+<entry name="$HTTP_POST_VARS [deprecated]" url="reserved.variables.post.php"/>
+<entry name="$HTTP_POST_FILES [deprecated]" url="reserved.variables.files.php"/>
+<entry name="$_REQUEST" url="reserved.variables.request.php"/>
+<entry name="$HTTP_SESSION_VARS [deprecated]" url="reserved.variables.session.php"/>
+<entry name="$HTTP_ENV_VARS [deprecated]" url="reserved.variables.environment.php"/>
+<entry name="$HTTP_COOKIE_VARS [deprecated]" url="reserved.variables.cookies.php"/>
+<entry name="$php_errormsg" url="reserved.variables.phperrormsg.php"/>
+<entry name="$HTTP_RAW_POST_DATA" url="reserved.variables.httprawpostdata.php"/>
+<entry name="$http_response_header" url="reserved.variables.httpresponseheader.php"/>
+<entry name="$argc" url="reserved.variables.argc.php"/>
+<entry name="$argv" url="reserved.variables.argv.php"/>
+<entry name="Exception::__construct" url="exception.construct.php"/>
+<entry name="Exception::getMessage" url="exception.getmessage.php"/>
+<entry name="Exception::getCode" url="exception.getcode.php"/>
+<entry name="Exception::getFile" url="exception.getfile.php"/>
+<entry name="Exception::getLine" url="exception.getline.php"/>
+<entry name="Exception::getTrace" url="exception.gettrace.php"/>
+<entry name="Exception::getTraceAsString" url="exception.gettraceasstring.php"/>
+<entry name="Exception::__toString" url="exception.tostring.php"/>
+<entry name="Exception::__clone" url="exception.clone.php"/>
+<entry name="ErrorException::__construct" url="errorexception.construct.php"/>
+<entry name="ErrorException::getSeverity" url="errorexception.getseverity.php"/>
+<entry name="Socket context options" url="context.socket.php"/>
+<entry name="HTTP context options" url="context.http.php"/>
+<entry name="FTP context options" url="context.ftp.php"/>
+<entry name="SSL context options" url="context.ssl.php"/>
+<entry name="CURL context options" url="context.curl.php"/>
+<entry name="Context parameters" url="context.params.php"/>
+<entry name="apc_add" url="function.apc-add.php"/>
+<entry name="apc_cache_info" url="function.apc-cache-info.php"/>
+<entry name="apc_clear_cache" url="function.apc-clear-cache.php"/>
+<entry name="apc_compile_file" url="function.apc-compile-file.php"/>
+<entry name="apc_define_constants" url="function.apc-define-constants.php"/>
+<entry name="apc_delete" url="function.apc-delete.php"/>
+<entry name="apc_fetch" url="function.apc-fetch.php"/>
+<entry name="apc_load_constants" url="function.apc-load-constants.php"/>
+<entry name="apc_sma_info" url="function.apc-sma-info.php"/>
+<entry name="apc_store" url="function.apc-store.php"/>
+<entry name="apd_breakpoint" url="function.apd-breakpoint.php"/>
+<entry name="apd_callstack" url="function.apd-callstack.php"/>
+<entry name="apd_clunk" url="function.apd-clunk.php"/>
+<entry name="apd_continue" url="function.apd-continue.php"/>
+<entry name="apd_croak" url="function.apd-croak.php"/>
+<entry name="apd_dump_function_table" url="function.apd-dump-function-table.php"/>
+<entry name="apd_dump_persistent_resources" url="function.apd-dump-persistent-resources.php"/>
+<entry name="apd_dump_regular_resources" url="function.apd-dump-regular-resources.php"/>
+<entry name="apd_echo" url="function.apd-echo.php"/>
+<entry name="apd_get_active_symbols" url="function.apd-get-active-symbols.php"/>
+<entry name="apd_set_pprof_trace" url="function.apd-set-pprof-trace.php"/>
+<entry name="apd_set_session_trace" url="function.apd-set-session-trace.php"/>
+<entry name="apd_set_session" url="function.apd-set-session.php"/>
+<entry name="apd_set_socket_session_trace" url="function.apd-set-socket-session-trace.php"/>
+<entry name="override_function" url="function.override-function.php"/>
+<entry name="rename_function" url="function.rename-function.php"/>
+<entry name="bcompiler_load_exe" url="function.bcompiler-load-exe.php"/>
+<entry name="bcompiler_load" url="function.bcompiler-load.php"/>
+<entry name="bcompiler_parse_class" url="function.bcompiler-parse-class.php"/>
+<entry name="bcompiler_read" url="function.bcompiler-read.php"/>
+<entry name="bcompiler_write_class" url="function.bcompiler-write-class.php"/>
+<entry name="bcompiler_write_constant" url="function.bcompiler-write-constant.php"/>
+<entry name="bcompiler_write_exe_footer" url="function.bcompiler-write-exe-footer.php"/>
+<entry name="bcompiler_write_file" url="function.bcompiler-write-file.php"/>
+<entry name="bcompiler_write_footer" url="function.bcompiler-write-footer.php"/>
+<entry name="bcompiler_write_function" url="function.bcompiler-write-function.php"/>
+<entry name="bcompiler_write_functions_from_file" url="function.bcompiler-write-functions-from-file.php"/>
+<entry name="bcompiler_write_header" url="function.bcompiler-write-header.php"/>
+<entry name="bcompiler_write_included_filename" url="function.bcompiler-write-included-filename.php"/>
+<entry name="debug_backtrace" url="function.debug-backtrace.php"/>
+<entry name="debug_print_backtrace" url="function.debug-print-backtrace.php"/>
+<entry name="error_get_last" url="function.error-get-last.php"/>
+<entry name="error_log" url="function.error-log.php"/>
+<entry name="error_reporting" url="function.error-reporting.php"/>
+<entry name="restore_error_handler" url="function.restore-error-handler.php"/>
+<entry name="restore_exception_handler" url="function.restore-exception-handler.php"/>
+<entry name="set_error_handler" url="function.set-error-handler.php"/>
+<entry name="set_exception_handler" url="function.set-exception-handler.php"/>
+<entry name="trigger_error" url="function.trigger-error.php"/>
+<entry name="user_error" url="function.user-error.php"/>
+<entry name="overload" url="function.overload.php"/>
+<entry name="flush" url="function.flush.php"/>
+<entry name="ob_clean" url="function.ob-clean.php"/>
+<entry name="ob_end_clean" url="function.ob-end-clean.php"/>
+<entry name="ob_end_flush" url="function.ob-end-flush.php"/>
+<entry name="ob_flush" url="function.ob-flush.php"/>
+<entry name="ob_get_clean" url="function.ob-get-clean.php"/>
+<entry name="ob_get_contents" url="function.ob-get-contents.php"/>
+<entry name="ob_get_flush" url="function.ob-get-flush.php"/>
+<entry name="ob_get_length" url="function.ob-get-length.php"/>
+<entry name="ob_get_level" url="function.ob-get-level.php"/>
+<entry name="ob_get_status" url="function.ob-get-status.php"/>
+<entry name="ob_gzhandler" url="function.ob-gzhandler.php"/>
+<entry name="ob_implicit_flush" url="function.ob-implicit-flush.php"/>
+<entry name="ob_list_handlers" url="function.ob-list-handlers.php"/>
+<entry name="ob_start" url="function.ob-start.php"/>
+<entry name="output_add_rewrite_var" url="function.output-add-rewrite-var.php"/>
+<entry name="output_reset_rewrite_vars" url="function.output-reset-rewrite-vars.php"/>
+<entry name="assert_options" url="function.assert-options.php"/>
+<entry name="assert" url="function.assert.php"/>
+<entry name="dl" url="function.dl.php"/>
+<entry name="extension_loaded" url="function.extension-loaded.php"/>
+<entry name="get_cfg_var" url="function.get-cfg-var.php"/>
+<entry name="get_current_user" url="function.get-current-user.php"/>
+<entry name="get_defined_constants" url="function.get-defined-constants.php"/>
+<entry name="get_extension_funcs" url="function.get-extension-funcs.php"/>
+<entry name="get_include_path" url="function.get-include-path.php"/>
+<entry name="get_included_files" url="function.get-included-files.php"/>
+<entry name="get_loaded_extensions" url="function.get-loaded-extensions.php"/>
+<entry name="get_magic_quotes_gpc" url="function.get-magic-quotes-gpc.php"/>
+<entry name="get_magic_quotes_runtime" url="function.get-magic-quotes-runtime.php"/>
+<entry name="get_required_files" url="function.get-required-files.php"/>
+<entry name="getenv" url="function.getenv.php"/>
+<entry name="getlastmod" url="function.getlastmod.php"/>
+<entry name="getmygid" url="function.getmygid.php"/>
+<entry name="getmyinode" url="function.getmyinode.php"/>
+<entry name="getmypid" url="function.getmypid.php"/>
+<entry name="getmyuid" url="function.getmyuid.php"/>
+<entry name="getopt" url="function.getopt.php"/>
+<entry name="getrusage" url="function.getrusage.php"/>
+<entry name="ini_alter" url="function.ini-alter.php"/>
+<entry name="ini_get_all" url="function.ini-get-all.php"/>
+<entry name="ini_get" url="function.ini-get.php"/>
+<entry name="ini_restore" url="function.ini-restore.php"/>
+<entry name="ini_set" url="function.ini-set.php"/>
+<entry name="main" url="function.main.php"/>
+<entry name="memory_get_peak_usage" url="function.memory-get-peak-usage.php"/>
+<entry name="memory_get_usage" url="function.memory-get-usage.php"/>
+<entry name="php_ini_loaded_file" url="function.php-ini-loaded-file.php"/>
+<entry name="php_ini_scanned_files" url="function.php-ini-scanned-files.php"/>
+<entry name="php_logo_guid" url="function.php-logo-guid.php"/>
+<entry name="php_sapi_name" url="function.php-sapi-name.php"/>
+<entry name="php_uname" url="function.php-uname.php"/>
+<entry name="phpcredits" url="function.phpcredits.php"/>
+<entry name="phpinfo" url="function.phpinfo.php"/>
+<entry name="phpversion" url="function.phpversion.php"/>
+<entry name="putenv" url="function.putenv.php"/>
+<entry name="restore_include_path" url="function.restore-include-path.php"/>
+<entry name="set_include_path" url="function.set-include-path.php"/>
+<entry name="set_magic_quotes_runtime" url="function.set-magic-quotes-runtime.php"/>
+<entry name="set_time_limit" url="function.set-time-limit.php"/>
+<entry name="sys_get_temp_dir" url="function.sys-get-temp-dir.php"/>
+<entry name="version_compare" url="function.version-compare.php"/>
+<entry name="zend_logo_guid" url="function.zend-logo-guid.php"/>
+<entry name="zend_thread_id" url="function.zend-thread-id.php"/>
+<entry name="zend_version" url="function.zend-version.php"/>
+<entry name="Runkit_Sandbox" url="runkit.sandbox.php"/>
+<entry name="Runkit_Sandbox_Parent" url="runkit.sandbox-parent.php"/>
+<entry name="runkit_class_adopt" url="function.runkit-class-adopt.php"/>
+<entry name="runkit_class_emancipate" url="function.runkit-class-emancipate.php"/>
+<entry name="runkit_constant_add" url="function.runkit-constant-add.php"/>
+<entry name="runkit_constant_redefine" url="function.runkit-constant-redefine.php"/>
+<entry name="runkit_constant_remove" url="function.runkit-constant-remove.php"/>
+<entry name="runkit_function_add" url="function.runkit-function-add.php"/>
+<entry name="runkit_function_copy" url="function.runkit-function-copy.php"/>
+<entry name="runkit_function_redefine" url="function.runkit-function-redefine.php"/>
+<entry name="runkit_function_remove" url="function.runkit-function-remove.php"/>
+<entry name="runkit_function_rename" url="function.runkit-function-rename.php"/>
+<entry name="runkit_import" url="function.runkit-import.php"/>
+<entry name="runkit_lint_file" url="function.runkit-lint-file.php"/>
+<entry name="runkit_lint" url="function.runkit-lint.php"/>
+<entry name="runkit_method_add" url="function.runkit-method-add.php"/>
+<entry name="runkit_method_copy" url="function.runkit-method-copy.php"/>
+<entry name="runkit_method_redefine" url="function.runkit-method-redefine.php"/>
+<entry name="runkit_method_remove" url="function.runkit-method-remove.php"/>
+<entry name="runkit_method_rename" url="function.runkit-method-rename.php"/>
+<entry name="runkit_return_value_used" url="function.runkit-return-value-used.php"/>
+<entry name="runkit_sandbox_output_handler" url="function.runkit-sandbox-output-handler.php"/>
+<entry name="runkit_superglobals" url="function.runkit-superglobals.php"/>
+<entry name="id3_get_frame_long_name" url="function.id3-get-frame-long-name.php"/>
+<entry name="id3_get_frame_short_name" url="function.id3-get-frame-short-name.php"/>
+<entry name="id3_get_genre_id" url="function.id3-get-genre-id.php"/>
+<entry name="id3_get_genre_list" url="function.id3-get-genre-list.php"/>
+<entry name="id3_get_genre_name" url="function.id3-get-genre-name.php"/>
+<entry name="id3_get_tag" url="function.id3-get-tag.php"/>
+<entry name="id3_get_version" url="function.id3-get-version.php"/>
+<entry name="id3_remove_tag" url="function.id3-remove-tag.php"/>
+<entry name="id3_set_tag" url="function.id3-set-tag.php"/>
+<entry name="openal_buffer_create" url="function.openal-buffer-create.php"/>
+<entry name="openal_buffer_data" url="function.openal-buffer-data.php"/>
+<entry name="openal_buffer_destroy" url="function.openal-buffer-destroy.php"/>
+<entry name="openal_buffer_get" url="function.openal-buffer-get.php"/>
+<entry name="openal_buffer_loadwav" url="function.openal-buffer-loadwav.php"/>
+<entry name="openal_context_create" url="function.openal-context-create.php"/>
+<entry name="openal_context_current" url="function.openal-context-current.php"/>
+<entry name="openal_context_destroy" url="function.openal-context-destroy.php"/>
+<entry name="openal_context_process" url="function.openal-context-process.php"/>
+<entry name="openal_context_suspend" url="function.openal-context-suspend.php"/>
+<entry name="openal_device_close" url="function.openal-device-close.php"/>
+<entry name="openal_device_open" url="function.openal-device-open.php"/>
+<entry name="openal_listener_get" url="function.openal-listener-get.php"/>
+<entry name="openal_listener_set" url="function.openal-listener-set.php"/>
+<entry name="openal_source_create" url="function.openal-source-create.php"/>
+<entry name="openal_source_destroy" url="function.openal-source-destroy.php"/>
+<entry name="openal_source_get" url="function.openal-source-get.php"/>
+<entry name="openal_source_pause" url="function.openal-source-pause.php"/>
+<entry name="openal_source_play" url="function.openal-source-play.php"/>
+<entry name="openal_source_rewind" url="function.openal-source-rewind.php"/>
+<entry name="openal_source_set" url="function.openal-source-set.php"/>
+<entry name="openal_source_stop" url="function.openal-source-stop.php"/>
+<entry name="openal_stream" url="function.openal-stream.php"/>
+<entry name="kadm5_chpass_principal" url="function.kadm5-chpass-principal.php"/>
+<entry name="kadm5_create_principal" url="function.kadm5-create-principal.php"/>
+<entry name="kadm5_delete_principal" url="function.kadm5-delete-principal.php"/>
+<entry name="kadm5_destroy" url="function.kadm5-destroy.php"/>
+<entry name="kadm5_flush" url="function.kadm5-flush.php"/>
+<entry name="kadm5_get_policies" url="function.kadm5-get-policies.php"/>
+<entry name="kadm5_get_principal" url="function.kadm5-get-principal.php"/>
+<entry name="kadm5_get_principals" url="function.kadm5-get-principals.php"/>
+<entry name="kadm5_init_with_password" url="function.kadm5-init-with-password.php"/>
+<entry name="kadm5_modify_principal" url="function.kadm5-modify-principal.php"/>
+<entry name="radius_acct_open" url="function.radius-acct-open.php"/>
+<entry name="radius_add_server" url="function.radius-add-server.php"/>
+<entry name="radius_auth_open" url="function.radius-auth-open.php"/>
+<entry name="radius_close" url="function.radius-close.php"/>
+<entry name="radius_config" url="function.radius-config.php"/>
+<entry name="radius_create_request" url="function.radius-create-request.php"/>
+<entry name="radius_cvt_addr" url="function.radius-cvt-addr.php"/>
+<entry name="radius_cvt_int" url="function.radius-cvt-int.php"/>
+<entry name="radius_cvt_string" url="function.radius-cvt-string.php"/>
+<entry name="radius_demangle_mppe_key" url="function.radius-demangle-mppe-key.php"/>
+<entry name="radius_demangle" url="function.radius-demangle.php"/>
+<entry name="radius_get_attr" url="function.radius-get-attr.php"/>
+<entry name="radius_get_vendor_attr" url="function.radius-get-vendor-attr.php"/>
+<entry name="radius_put_addr" url="function.radius-put-addr.php"/>
+<entry name="radius_put_attr" url="function.radius-put-attr.php"/>
+<entry name="radius_put_int" url="function.radius-put-int.php"/>
+<entry name="radius_put_string" url="function.radius-put-string.php"/>
+<entry name="radius_put_vendor_addr" url="function.radius-put-vendor-addr.php"/>
+<entry name="radius_put_vendor_attr" url="function.radius-put-vendor-attr.php"/>
+<entry name="radius_put_vendor_int" url="function.radius-put-vendor-int.php"/>
+<entry name="radius_put_vendor_string" url="function.radius-put-vendor-string.php"/>
+<entry name="radius_request_authenticator" url="function.radius-request-authenticator.php"/>
+<entry name="radius_send_request" url="function.radius-send-request.php"/>
+<entry name="radius_server_secret" url="function.radius-server-secret.php"/>
+<entry name="radius_strerror" url="function.radius-strerror.php"/>
+<entry name="cal_days_in_month" url="function.cal-days-in-month.php"/>
+<entry name="cal_from_jd" url="function.cal-from-jd.php"/>
+<entry name="cal_info" url="function.cal-info.php"/>
+<entry name="cal_to_jd" url="function.cal-to-jd.php"/>
+<entry name="easter_date" url="function.easter-date.php"/>
+<entry name="easter_days" url="function.easter-days.php"/>
+<entry name="FrenchToJD" url="function.frenchtojd.php"/>
+<entry name="GregorianToJD" url="function.gregoriantojd.php"/>
+<entry name="JDDayOfWeek" url="function.jddayofweek.php"/>
+<entry name="JDMonthName" url="function.jdmonthname.php"/>
+<entry name="JDToFrench" url="function.jdtofrench.php"/>
+<entry name="JDToGregorian" url="function.jdtogregorian.php"/>
+<entry name="jdtojewish" url="function.jdtojewish.php"/>
+<entry name="JDToJulian" url="function.jdtojulian.php"/>
+<entry name="jdtounix" url="function.jdtounix.php"/>
+<entry name="JewishToJD" url="function.jewishtojd.php"/>
+<entry name="JulianToJD" url="function.juliantojd.php"/>
+<entry name="unixtojd" url="function.unixtojd.php"/>
+<entry name="checkdate" url="function.checkdate.php"/>
+<entry name="date_create" url="function.date-create.php"/>
+<entry name="date_date_set" url="function.date-date-set.php"/>
+<entry name="date_default_timezone_get" url="function.date-default-timezone-get.php"/>
+<entry name="date_default_timezone_set" url="function.date-default-timezone-set.php"/>
+<entry name="date_format" url="function.date-format.php"/>
+<entry name="date_isodate_set" url="function.date-isodate-set.php"/>
+<entry name="date_modify" url="function.date-modify.php"/>
+<entry name="date_offset_get" url="function.date-offset-get.php"/>
+<entry name="date_parse" url="function.date-parse.php"/>
+<entry name="date_sun_info" url="function.date-sun-info.php"/>
+<entry name="date_sunrise" url="function.date-sunrise.php"/>
+<entry name="date_sunset" url="function.date-sunset.php"/>
+<entry name="date_time_set" url="function.date-time-set.php"/>
+<entry name="date_timezone_get" url="function.date-timezone-get.php"/>
+<entry name="date_timezone_set" url="function.date-timezone-set.php"/>
+<entry name="date" url="function.date.php"/>
+<entry name="getdate" url="function.getdate.php"/>
+<entry name="gettimeofday" url="function.gettimeofday.php"/>
+<entry name="gmdate" url="function.gmdate.php"/>
+<entry name="gmmktime" url="function.gmmktime.php"/>
+<entry name="gmstrftime" url="function.gmstrftime.php"/>
+<entry name="idate" url="function.idate.php"/>
+<entry name="localtime" url="function.localtime.php"/>
+<entry name="microtime" url="function.microtime.php"/>
+<entry name="mktime" url="function.mktime.php"/>
+<entry name="strftime" url="function.strftime.php"/>
+<entry name="strptime" url="function.strptime.php"/>
+<entry name="strtotime" url="function.strtotime.php"/>
+<entry name="time" url="function.time.php"/>
+<entry name="timezone_abbreviations_list" url="function.timezone-abbreviations-list.php"/>
+<entry name="timezone_identifiers_list" url="function.timezone-identifiers-list.php"/>
+<entry name="timezone_name_from_abbr" url="function.timezone-name-from-abbr.php"/>
+<entry name="timezone_name_get" url="function.timezone-name-get.php"/>
+<entry name="timezone_offset_get" url="function.timezone-offset-get.php"/>
+<entry name="timezone_open" url="function.timezone-open.php"/>
+<entry name="timezone_transitions_get" url="function.timezone-transitions-get.php"/>
+<entry name="newt_bell" url="function.newt-bell.php"/>
+<entry name="newt_button_bar" url="function.newt-button-bar.php"/>
+<entry name="newt_button" url="function.newt-button.php"/>
+<entry name="newt_centered_window" url="function.newt-centered-window.php"/>
+<entry name="newt_checkbox_get_value" url="function.newt-checkbox-get-value.php"/>
+<entry name="newt_checkbox_set_flags" url="function.newt-checkbox-set-flags.php"/>
+<entry name="newt_checkbox_set_value" url="function.newt-checkbox-set-value.php"/>
+<entry name="newt_checkbox_tree_add_item" url="function.newt-checkbox-tree-add-item.php"/>
+<entry name="newt_checkbox_tree_find_item" url="function.newt-checkbox-tree-find-item.php"/>
+<entry name="newt_checkbox_tree_get_current" url="function.newt-checkbox-tree-get-current.php"/>
+<entry name="newt_checkbox_tree_get_entry_value" url="function.newt-checkbox-tree-get-entry-value.php"/>
+<entry name="newt_checkbox_tree_get_multi_selection" url="function.newt-checkbox-tree-get-multi-selection.php"/>
+<entry name="newt_checkbox_tree_get_selection" url="function.newt-checkbox-tree-get-selection.php"/>
+<entry name="newt_checkbox_tree_multi" url="function.newt-checkbox-tree-multi.php"/>
+<entry name="newt_checkbox_tree_set_current" url="function.newt-checkbox-tree-set-current.php"/>
+<entry name="newt_checkbox_tree_set_entry_value" url="function.newt-checkbox-tree-set-entry-value.php"/>
+<entry name="newt_checkbox_tree_set_entry" url="function.newt-checkbox-tree-set-entry.php"/>
+<entry name="newt_checkbox_tree_set_width" url="function.newt-checkbox-tree-set-width.php"/>
+<entry name="newt_checkbox_tree" url="function.newt-checkbox-tree.php"/>
+<entry name="newt_checkbox" url="function.newt-checkbox.php"/>
+<entry name="newt_clear_key_buffer" url="function.newt-clear-key-buffer.php"/>
+<entry name="newt_cls" url="function.newt-cls.php"/>
+<entry name="newt_compact_button" url="function.newt-compact-button.php"/>
+<entry name="newt_component_add_callback" url="function.newt-component-add-callback.php"/>
+<entry name="newt_component_takes_focus" url="function.newt-component-takes-focus.php"/>
+<entry name="newt_create_grid" url="function.newt-create-grid.php"/>
+<entry name="newt_cursor_off" url="function.newt-cursor-off.php"/>
+<entry name="newt_cursor_on" url="function.newt-cursor-on.php"/>
+<entry name="newt_delay" url="function.newt-delay.php"/>
+<entry name="newt_draw_form" url="function.newt-draw-form.php"/>
+<entry name="newt_draw_root_text" url="function.newt-draw-root-text.php"/>
+<entry name="newt_entry_get_value" url="function.newt-entry-get-value.php"/>
+<entry name="newt_entry_set_filter" url="function.newt-entry-set-filter.php"/>
+<entry name="newt_entry_set_flags" url="function.newt-entry-set-flags.php"/>
+<entry name="newt_entry_set" url="function.newt-entry-set.php"/>
+<entry name="newt_entry" url="function.newt-entry.php"/>
+<entry name="newt_finished" url="function.newt-finished.php"/>
+<entry name="newt_form_add_component" url="function.newt-form-add-component.php"/>
+<entry name="newt_form_add_components" url="function.newt-form-add-components.php"/>
+<entry name="newt_form_add_hot_key" url="function.newt-form-add-hot-key.php"/>
+<entry name="newt_form_destroy" url="function.newt-form-destroy.php"/>
+<entry name="newt_form_get_current" url="function.newt-form-get-current.php"/>
+<entry name="newt_form_run" url="function.newt-form-run.php"/>
+<entry name="newt_form_set_background" url="function.newt-form-set-background.php"/>
+<entry name="newt_form_set_height" url="function.newt-form-set-height.php"/>
+<entry name="newt_form_set_size" url="function.newt-form-set-size.php"/>
+<entry name="newt_form_set_timer" url="function.newt-form-set-timer.php"/>
+<entry name="newt_form_set_width" url="function.newt-form-set-width.php"/>
+<entry name="newt_form_watch_fd" url="function.newt-form-watch-fd.php"/>
+<entry name="newt_form" url="function.newt-form.php"/>
+<entry name="newt_get_screen_size" url="function.newt-get-screen-size.php"/>
+<entry name="newt_grid_add_components_to_form" url="function.newt-grid-add-components-to-form.php"/>
+<entry name="newt_grid_basic_window" url="function.newt-grid-basic-window.php"/>
+<entry name="newt_grid_free" url="function.newt-grid-free.php"/>
+<entry name="newt_grid_get_size" url="function.newt-grid-get-size.php"/>
+<entry name="newt_grid_h_close_stacked" url="function.newt-grid-h-close-stacked.php"/>
+<entry name="newt_grid_h_stacked" url="function.newt-grid-h-stacked.php"/>
+<entry name="newt_grid_place" url="function.newt-grid-place.php"/>
+<entry name="newt_grid_set_field" url="function.newt-grid-set-field.php"/>
+<entry name="newt_grid_simple_window" url="function.newt-grid-simple-window.php"/>
+<entry name="newt_grid_v_close_stacked" url="function.newt-grid-v-close-stacked.php"/>
+<entry name="newt_grid_v_stacked" url="function.newt-grid-v-stacked.php"/>
+<entry name="newt_grid_wrapped_window_at" url="function.newt-grid-wrapped-window-at.php"/>
+<entry name="newt_grid_wrapped_window" url="function.newt-grid-wrapped-window.php"/>
+<entry name="newt_init" url="function.newt-init.php"/>
+<entry name="newt_label_set_text" url="function.newt-label-set-text.php"/>
+<entry name="newt_label" url="function.newt-label.php"/>
+<entry name="newt_listbox_append_entry" url="function.newt-listbox-append-entry.php"/>
+<entry name="newt_listbox_clear_selection" url="function.newt-listbox-clear-selection.php"/>
+<entry name="newt_listbox_clear" url="function.newt-listbox-clear.php"/>
+<entry name="newt_listbox_delete_entry" url="function.newt-listbox-delete-entry.php"/>
+<entry name="newt_listbox_get_current" url="function.newt-listbox-get-current.php"/>
+<entry name="newt_listbox_get_selection" url="function.newt-listbox-get-selection.php"/>
+<entry name="newt_listbox_insert_entry" url="function.newt-listbox-insert-entry.php"/>
+<entry name="newt_listbox_item_count" url="function.newt-listbox-item-count.php"/>
+<entry name="newt_listbox_select_item" url="function.newt-listbox-select-item.php"/>
+<entry name="newt_listbox_set_current_by_key" url="function.newt-listbox-set-current-by-key.php"/>
+<entry name="newt_listbox_set_current" url="function.newt-listbox-set-current.php"/>
+<entry name="newt_listbox_set_data" url="function.newt-listbox-set-data.php"/>
+<entry name="newt_listbox_set_entry" url="function.newt-listbox-set-entry.php"/>
+<entry name="newt_listbox_set_width" url="function.newt-listbox-set-width.php"/>
+<entry name="newt_listbox" url="function.newt-listbox.php"/>
+<entry name="newt_listitem_get_data" url="function.newt-listitem-get-data.php"/>
+<entry name="newt_listitem_set" url="function.newt-listitem-set.php"/>
+<entry name="newt_listitem" url="function.newt-listitem.php"/>
+<entry name="newt_open_window" url="function.newt-open-window.php"/>
+<entry name="newt_pop_help_line" url="function.newt-pop-help-line.php"/>
+<entry name="newt_pop_window" url="function.newt-pop-window.php"/>
+<entry name="newt_push_help_line" url="function.newt-push-help-line.php"/>
+<entry name="newt_radio_get_current" url="function.newt-radio-get-current.php"/>
+<entry name="newt_radiobutton" url="function.newt-radiobutton.php"/>
+<entry name="newt_redraw_help_line" url="function.newt-redraw-help-line.php"/>
+<entry name="newt_reflow_text" url="function.newt-reflow-text.php"/>
+<entry name="newt_refresh" url="function.newt-refresh.php"/>
+<entry name="newt_resize_screen" url="function.newt-resize-screen.php"/>
+<entry name="newt_resume" url="function.newt-resume.php"/>
+<entry name="newt_run_form" url="function.newt-run-form.php"/>
+<entry name="newt_scale_set" url="function.newt-scale-set.php"/>
+<entry name="newt_scale" url="function.newt-scale.php"/>
+<entry name="newt_scrollbar_set" url="function.newt-scrollbar-set.php"/>
+<entry name="newt_set_help_callback" url="function.newt-set-help-callback.php"/>
+<entry name="newt_set_suspend_callback" url="function.newt-set-suspend-callback.php"/>
+<entry name="newt_suspend" url="function.newt-suspend.php"/>
+<entry name="newt_textbox_get_num_lines" url="function.newt-textbox-get-num-lines.php"/>
+<entry name="newt_textbox_reflowed" url="function.newt-textbox-reflowed.php"/>
+<entry name="newt_textbox_set_height" url="function.newt-textbox-set-height.php"/>
+<entry name="newt_textbox_set_text" url="function.newt-textbox-set-text.php"/>
+<entry name="newt_textbox" url="function.newt-textbox.php"/>
+<entry name="newt_vertical_scrollbar" url="function.newt-vertical-scrollbar.php"/>
+<entry name="newt_wait_for_key" url="function.newt-wait-for-key.php"/>
+<entry name="newt_win_choice" url="function.newt-win-choice.php"/>
+<entry name="newt_win_entries" url="function.newt-win-entries.php"/>
+<entry name="newt_win_menu" url="function.newt-win-menu.php"/>
+<entry name="newt_win_message" url="function.newt-win-message.php"/>
+<entry name="newt_win_messagev" url="function.newt-win-messagev.php"/>
+<entry name="newt_win_ternary" url="function.newt-win-ternary.php"/>
+<entry name="ncurses_addch" url="function.ncurses-addch.php"/>
+<entry name="ncurses_addchnstr" url="function.ncurses-addchnstr.php"/>
+<entry name="ncurses_addchstr" url="function.ncurses-addchstr.php"/>
+<entry name="ncurses_addnstr" url="function.ncurses-addnstr.php"/>
+<entry name="ncurses_addstr" url="function.ncurses-addstr.php"/>
+<entry name="ncurses_assume_default_colors" url="function.ncurses-assume-default-colors.php"/>
+<entry name="ncurses_attroff" url="function.ncurses-attroff.php"/>
+<entry name="ncurses_attron" url="function.ncurses-attron.php"/>
+<entry name="ncurses_attrset" url="function.ncurses-attrset.php"/>
+<entry name="ncurses_baudrate" url="function.ncurses-baudrate.php"/>
+<entry name="ncurses_beep" url="function.ncurses-beep.php"/>
+<entry name="ncurses_bkgd" url="function.ncurses-bkgd.php"/>
+<entry name="ncurses_bkgdset" url="function.ncurses-bkgdset.php"/>
+<entry name="ncurses_border" url="function.ncurses-border.php"/>
+<entry name="ncurses_bottom_panel" url="function.ncurses-bottom-panel.php"/>
+<entry name="ncurses_can_change_color" url="function.ncurses-can-change-color.php"/>
+<entry name="ncurses_cbreak" url="function.ncurses-cbreak.php"/>
+<entry name="ncurses_clear" url="function.ncurses-clear.php"/>
+<entry name="ncurses_clrtobot" url="function.ncurses-clrtobot.php"/>
+<entry name="ncurses_clrtoeol" url="function.ncurses-clrtoeol.php"/>
+<entry name="ncurses_color_content" url="function.ncurses-color-content.php"/>
+<entry name="ncurses_color_set" url="function.ncurses-color-set.php"/>
+<entry name="ncurses_curs_set" url="function.ncurses-curs-set.php"/>
+<entry name="ncurses_def_prog_mode" url="function.ncurses-def-prog-mode.php"/>
+<entry name="ncurses_def_shell_mode" url="function.ncurses-def-shell-mode.php"/>
+<entry name="ncurses_define_key" url="function.ncurses-define-key.php"/>
+<entry name="ncurses_del_panel" url="function.ncurses-del-panel.php"/>
+<entry name="ncurses_delay_output" url="function.ncurses-delay-output.php"/>
+<entry name="ncurses_delch" url="function.ncurses-delch.php"/>
+<entry name="ncurses_deleteln" url="function.ncurses-deleteln.php"/>
+<entry name="ncurses_delwin" url="function.ncurses-delwin.php"/>
+<entry name="ncurses_doupdate" url="function.ncurses-doupdate.php"/>
+<entry name="ncurses_echo" url="function.ncurses-echo.php"/>
+<entry name="ncurses_echochar" url="function.ncurses-echochar.php"/>
+<entry name="ncurses_end" url="function.ncurses-end.php"/>
+<entry name="ncurses_erase" url="function.ncurses-erase.php"/>
+<entry name="ncurses_erasechar" url="function.ncurses-erasechar.php"/>
+<entry name="ncurses_filter" url="function.ncurses-filter.php"/>
+<entry name="ncurses_flash" url="function.ncurses-flash.php"/>
+<entry name="ncurses_flushinp" url="function.ncurses-flushinp.php"/>
+<entry name="ncurses_getch" url="function.ncurses-getch.php"/>
+<entry name="ncurses_getmaxyx" url="function.ncurses-getmaxyx.php"/>
+<entry name="ncurses_getmouse" url="function.ncurses-getmouse.php"/>
+<entry name="ncurses_getyx" url="function.ncurses-getyx.php"/>
+<entry name="ncurses_halfdelay" url="function.ncurses-halfdelay.php"/>
+<entry name="ncurses_has_colors" url="function.ncurses-has-colors.php"/>
+<entry name="ncurses_has_ic" url="function.ncurses-has-ic.php"/>
+<entry name="ncurses_has_il" url="function.ncurses-has-il.php"/>
+<entry name="ncurses_has_key" url="function.ncurses-has-key.php"/>
+<entry name="ncurses_hide_panel" url="function.ncurses-hide-panel.php"/>
+<entry name="ncurses_hline" url="function.ncurses-hline.php"/>
+<entry name="ncurses_inch" url="function.ncurses-inch.php"/>
+<entry name="ncurses_init_color" url="function.ncurses-init-color.php"/>
+<entry name="ncurses_init_pair" url="function.ncurses-init-pair.php"/>
+<entry name="ncurses_init" url="function.ncurses-init.php"/>
+<entry name="ncurses_insch" url="function.ncurses-insch.php"/>
+<entry name="ncurses_insdelln" url="function.ncurses-insdelln.php"/>
+<entry name="ncurses_insertln" url="function.ncurses-insertln.php"/>
+<entry name="ncurses_insstr" url="function.ncurses-insstr.php"/>
+<entry name="ncurses_instr" url="function.ncurses-instr.php"/>
+<entry name="ncurses_isendwin" url="function.ncurses-isendwin.php"/>
+<entry name="ncurses_keyok" url="function.ncurses-keyok.php"/>
+<entry name="ncurses_keypad" url="function.ncurses-keypad.php"/>
+<entry name="ncurses_killchar" url="function.ncurses-killchar.php"/>
+<entry name="ncurses_longname" url="function.ncurses-longname.php"/>
+<entry name="ncurses_meta" url="function.ncurses-meta.php"/>
+<entry name="ncurses_mouse_trafo" url="function.ncurses-mouse-trafo.php"/>
+<entry name="ncurses_mouseinterval" url="function.ncurses-mouseinterval.php"/>
+<entry name="ncurses_mousemask" url="function.ncurses-mousemask.php"/>
+<entry name="ncurses_move_panel" url="function.ncurses-move-panel.php"/>
+<entry name="ncurses_move" url="function.ncurses-move.php"/>
+<entry name="ncurses_mvaddch" url="function.ncurses-mvaddch.php"/>
+<entry name="ncurses_mvaddchnstr" url="function.ncurses-mvaddchnstr.php"/>
+<entry name="ncurses_mvaddchstr" url="function.ncurses-mvaddchstr.php"/>
+<entry name="ncurses_mvaddnstr" url="function.ncurses-mvaddnstr.php"/>
+<entry name="ncurses_mvaddstr" url="function.ncurses-mvaddstr.php"/>
+<entry name="ncurses_mvcur" url="function.ncurses-mvcur.php"/>
+<entry name="ncurses_mvdelch" url="function.ncurses-mvdelch.php"/>
+<entry name="ncurses_mvgetch" url="function.ncurses-mvgetch.php"/>
+<entry name="ncurses_mvhline" url="function.ncurses-mvhline.php"/>
+<entry name="ncurses_mvinch" url="function.ncurses-mvinch.php"/>
+<entry name="ncurses_mvvline" url="function.ncurses-mvvline.php"/>
+<entry name="ncurses_mvwaddstr" url="function.ncurses-mvwaddstr.php"/>
+<entry name="ncurses_napms" url="function.ncurses-napms.php"/>
+<entry name="ncurses_new_panel" url="function.ncurses-new-panel.php"/>
+<entry name="ncurses_newpad" url="function.ncurses-newpad.php"/>
+<entry name="ncurses_newwin" url="function.ncurses-newwin.php"/>
+<entry name="ncurses_nl" url="function.ncurses-nl.php"/>
+<entry name="ncurses_nocbreak" url="function.ncurses-nocbreak.php"/>
+<entry name="ncurses_noecho" url="function.ncurses-noecho.php"/>
+<entry name="ncurses_nonl" url="function.ncurses-nonl.php"/>
+<entry name="ncurses_noqiflush" url="function.ncurses-noqiflush.php"/>
+<entry name="ncurses_noraw" url="function.ncurses-noraw.php"/>
+<entry name="ncurses_pair_content" url="function.ncurses-pair-content.php"/>
+<entry name="ncurses_panel_above" url="function.ncurses-panel-above.php"/>
+<entry name="ncurses_panel_below" url="function.ncurses-panel-below.php"/>
+<entry name="ncurses_panel_window" url="function.ncurses-panel-window.php"/>
+<entry name="ncurses_pnoutrefresh" url="function.ncurses-pnoutrefresh.php"/>
+<entry name="ncurses_prefresh" url="function.ncurses-prefresh.php"/>
+<entry name="ncurses_putp" url="function.ncurses-putp.php"/>
+<entry name="ncurses_qiflush" url="function.ncurses-qiflush.php"/>
+<entry name="ncurses_raw" url="function.ncurses-raw.php"/>
+<entry name="ncurses_refresh" url="function.ncurses-refresh.php"/>
+<entry name="ncurses_replace_panel" url="function.ncurses-replace-panel.php"/>
+<entry name="ncurses_reset_prog_mode" url="function.ncurses-reset-prog-mode.php"/>
+<entry name="ncurses_reset_shell_mode" url="function.ncurses-reset-shell-mode.php"/>
+<entry name="ncurses_resetty" url="function.ncurses-resetty.php"/>
+<entry name="ncurses_savetty" url="function.ncurses-savetty.php"/>
+<entry name="ncurses_scr_dump" url="function.ncurses-scr-dump.php"/>
+<entry name="ncurses_scr_init" url="function.ncurses-scr-init.php"/>
+<entry name="ncurses_scr_restore" url="function.ncurses-scr-restore.php"/>
+<entry name="ncurses_scr_set" url="function.ncurses-scr-set.php"/>
+<entry name="ncurses_scrl" url="function.ncurses-scrl.php"/>
+<entry name="ncurses_show_panel" url="function.ncurses-show-panel.php"/>
+<entry name="ncurses_slk_attr" url="function.ncurses-slk-attr.php"/>
+<entry name="ncurses_slk_attroff" url="function.ncurses-slk-attroff.php"/>
+<entry name="ncurses_slk_attron" url="function.ncurses-slk-attron.php"/>
+<entry name="ncurses_slk_attrset" url="function.ncurses-slk-attrset.php"/>
+<entry name="ncurses_slk_clear" url="function.ncurses-slk-clear.php"/>
+<entry name="ncurses_slk_color" url="function.ncurses-slk-color.php"/>
+<entry name="ncurses_slk_init" url="function.ncurses-slk-init.php"/>
+<entry name="ncurses_slk_noutrefresh" url="function.ncurses-slk-noutrefresh.php"/>
+<entry name="ncurses_slk_refresh" url="function.ncurses-slk-refresh.php"/>
+<entry name="ncurses_slk_restore" url="function.ncurses-slk-restore.php"/>
+<entry name="ncurses_slk_set" url="function.ncurses-slk-set.php"/>
+<entry name="ncurses_slk_touch" url="function.ncurses-slk-touch.php"/>
+<entry name="ncurses_standend" url="function.ncurses-standend.php"/>
+<entry name="ncurses_standout" url="function.ncurses-standout.php"/>
+<entry name="ncurses_start_color" url="function.ncurses-start-color.php"/>
+<entry name="ncurses_termattrs" url="function.ncurses-termattrs.php"/>
+<entry name="ncurses_termname" url="function.ncurses-termname.php"/>
+<entry name="ncurses_timeout" url="function.ncurses-timeout.php"/>
+<entry name="ncurses_top_panel" url="function.ncurses-top-panel.php"/>
+<entry name="ncurses_typeahead" url="function.ncurses-typeahead.php"/>
+<entry name="ncurses_ungetch" url="function.ncurses-ungetch.php"/>
+<entry name="ncurses_ungetmouse" url="function.ncurses-ungetmouse.php"/>
+<entry name="ncurses_update_panels" url="function.ncurses-update-panels.php"/>
+<entry name="ncurses_use_default_colors" url="function.ncurses-use-default-colors.php"/>
+<entry name="ncurses_use_env" url="function.ncurses-use-env.php"/>
+<entry name="ncurses_use_extended_names" url="function.ncurses-use-extended-names.php"/>
+<entry name="ncurses_vidattr" url="function.ncurses-vidattr.php"/>
+<entry name="ncurses_vline" url="function.ncurses-vline.php"/>
+<entry name="ncurses_waddch" url="function.ncurses-waddch.php"/>
+<entry name="ncurses_waddstr" url="function.ncurses-waddstr.php"/>
+<entry name="ncurses_wattroff" url="function.ncurses-wattroff.php"/>
+<entry name="ncurses_wattron" url="function.ncurses-wattron.php"/>
+<entry name="ncurses_wattrset" url="function.ncurses-wattrset.php"/>
+<entry name="ncurses_wborder" url="function.ncurses-wborder.php"/>
+<entry name="ncurses_wclear" url="function.ncurses-wclear.php"/>
+<entry name="ncurses_wcolor_set" url="function.ncurses-wcolor-set.php"/>
+<entry name="ncurses_werase" url="function.ncurses-werase.php"/>
+<entry name="ncurses_wgetch" url="function.ncurses-wgetch.php"/>
+<entry name="ncurses_whline" url="function.ncurses-whline.php"/>
+<entry name="ncurses_wmouse_trafo" url="function.ncurses-wmouse-trafo.php"/>
+<entry name="ncurses_wmove" url="function.ncurses-wmove.php"/>
+<entry name="ncurses_wnoutrefresh" url="function.ncurses-wnoutrefresh.php"/>
+<entry name="ncurses_wrefresh" url="function.ncurses-wrefresh.php"/>
+<entry name="ncurses_wstandend" url="function.ncurses-wstandend.php"/>
+<entry name="ncurses_wstandout" url="function.ncurses-wstandout.php"/>
+<entry name="ncurses_wvline" url="function.ncurses-wvline.php"/>
+<entry name="readline_add_history" url="function.readline-add-history.php"/>
+<entry name="readline_callback_handler_install" url="function.readline-callback-handler-install.php"/>
+<entry name="readline_callback_handler_remove" url="function.readline-callback-handler-remove.php"/>
+<entry name="readline_callback_read_char" url="function.readline-callback-read-char.php"/>
+<entry name="readline_clear_history" url="function.readline-clear-history.php"/>
+<entry name="readline_completion_function" url="function.readline-completion-function.php"/>
+<entry name="readline_info" url="function.readline-info.php"/>
+<entry name="readline_list_history" url="function.readline-list-history.php"/>
+<entry name="readline_on_new_line" url="function.readline-on-new-line.php"/>
+<entry name="readline_read_history" url="function.readline-read-history.php"/>
+<entry name="readline_redisplay" url="function.readline-redisplay.php"/>
+<entry name="readline_write_history" url="function.readline-write-history.php"/>
+<entry name="readline" url="function.readline.php"/>
+<entry name="bzclose" url="function.bzclose.php"/>
+<entry name="bzcompress" url="function.bzcompress.php"/>
+<entry name="bzdecompress" url="function.bzdecompress.php"/>
+<entry name="bzerrno" url="function.bzerrno.php"/>
+<entry name="bzerror" url="function.bzerror.php"/>
+<entry name="bzerrstr" url="function.bzerrstr.php"/>
+<entry name="bzflush" url="function.bzflush.php"/>
+<entry name="bzopen" url="function.bzopen.php"/>
+<entry name="bzread" url="function.bzread.php"/>
+<entry name="bzwrite" url="function.bzwrite.php"/>
+<entry name="lzf_compress" url="function.lzf-compress.php"/>
+<entry name="lzf_decompress" url="function.lzf-decompress.php"/>
+<entry name="lzf_optimized_for" url="function.lzf-optimized-for.php"/>
+<entry name="Phar::addEmptyDir" url="phar.addemptydir.php"/>
+<entry name="Phar::addFile" url="phar.addfile.php"/>
+<entry name="Phar::addFromString" url="phar.addfromstring.php"/>
+<entry name="Phar::apiVersion" url="phar.apiversion.php"/>
+<entry name="Phar::buildFromDirectory" url="phar.buildfromdirectory.php"/>
+<entry name="Phar::buildFromIterator" url="phar.buildfromiterator.php"/>
+<entry name="Phar::canCompress" url="phar.cancompress.php"/>
+<entry name="Phar::canWrite" url="phar.canwrite.php"/>
+<entry name="Phar::compress" url="phar.compress.php"/>
+<entry name="Phar::compressAllFilesBZIP2" url="phar.compressallfilesbzip2.php"/>
+<entry name="Phar::compressAllFilesGZ" url="phar.compressallfilesgz.php"/>
+<entry name="Phar::compressFiles" url="phar.compressfiles.php"/>
+<entry name="Phar::__construct" url="phar.construct.php"/>
+<entry name="Phar::convertToData" url="phar.converttodata.php"/>
+<entry name="Phar::convertToExecutable" url="phar.converttoexecutable.php"/>
+<entry name="Phar::copy" url="phar.copy.php"/>
+<entry name="Phar::count" url="phar.count.php"/>
+<entry name="Phar::createDefaultStub" url="phar.createdefaultstub.php"/>
+<entry name="Phar::decompress" url="phar.decompress.php"/>
+<entry name="Phar::decompressFiles" url="phar.decompressfiles.php"/>
+<entry name="Phar::delMetadata" url="phar.delmetadata.php"/>
+<entry name="Phar::delete" url="phar.delete.php"/>
+<entry name="Phar::extractTo" url="phar.extractto.php"/>
+<entry name="Phar::getMetaData" url="phar.getmetadata.php"/>
+<entry name="Phar::getModified" url="phar.getmodified.php"/>
+<entry name="Phar::getSignature" url="phar.getsignature.php"/>
+<entry name="Phar::getStub" url="phar.getstub.php"/>
+<entry name="Phar::getSupportedCompression" url="phar.getsupportedcompression.php"/>
+<entry name="Phar::getSupportedSignatures" url="phar.getsupportedsignatures.php"/>
+<entry name="Phar::getVersion" url="phar.getversion.php"/>
+<entry name="Phar::hasMetaData" url="phar.hasmetadata.php"/>
+<entry name="Phar::interceptFileFuncs" url="phar.interceptfilefuncs.php"/>
+<entry name="Phar::isBuffering" url="phar.isbuffering.php"/>
+<entry name="Phar::isCompressed" url="phar.iscompressed.php"/>
+<entry name="Phar::isFileFormat" url="phar.isfileformat.php"/>
+<entry name="Phar::isValidPharFilename" url="phar.isvalidpharfilename.php"/>
+<entry name="Phar::isWritable" url="phar.iswritable.php"/>
+<entry name="Phar::loadPhar" url="phar.loadphar.php"/>
+<entry name="Phar::mapPhar" url="phar.mapphar.php"/>
+<entry name="Phar::mount" url="phar.mount.php"/>
+<entry name="Phar::mungServer" url="phar.mungserver.php"/>
+<entry name="Phar::offsetExists" url="phar.offsetexists.php"/>
+<entry name="Phar::offsetGet" url="phar.offsetget.php"/>
+<entry name="Phar::offsetSet" url="phar.offsetset.php"/>
+<entry name="Phar::offsetUnset" url="phar.offsetunset.php"/>
+<entry name="Phar::running" url="phar.running.php"/>
+<entry name="Phar::setAlias" url="phar.setalias.php"/>
+<entry name="Phar::setDefaultStub" url="phar.setdefaultstub.php"/>
+<entry name="Phar::setMetadata" url="phardata.setmetadata.php"/>
+<entry name="Phar::setSignatureAlgorithm" url="phardata.setsignaturealgorithm.php"/>
+<entry name="Phar::setStub" url="phar.setstub.php"/>
+<entry name="Phar::startBuffering" url="phar.startbuffering.php"/>
+<entry name="Phar::stopBuffering" url="phar.stopbuffering.php"/>
+<entry name="Phar::uncompressAllFiles" url="phar.uncompressallfiles.php"/>
+<entry name="Phar::unlinkArchive" url="phar.unlinkarchive.php"/>
+<entry name="Phar::webPhar" url="phar.webphar.php"/>
+<entry name="PharData::addEmptyDir" url="phardata.addemptydir.php"/>
+<entry name="PharData::addFile" url="phardata.addfile.php"/>
+<entry name="PharData::addFromString" url="phardata.addfromstring.php"/>
+<entry name="PharData::buildFromDirectory" url="phardata.buildfromdirectory.php"/>
+<entry name="PharData::buildFromIterator" url="phardata.buildfromiterator.php"/>
+<entry name="PharData::compress" url="phardata.compress.php"/>
+<entry name="PharData::compressFiles" url="phardata.compressfiles.php"/>
+<entry name="PharData::__construct" url="phardata.construct.php"/>
+<entry name="PharData::convertToData" url="phardata.converttodata.php"/>
+<entry name="PharData::convertToExecutable" url="phardata.converttoexecutable.php"/>
+<entry name="PharData::copy" url="phardata.copy.php"/>
+<entry name="PharData::decompress" url="phardata.decompress.php"/>
+<entry name="PharData::decompressFiles" url="phardata.decompressfiles.php"/>
+<entry name="PharData::delMetadata" url="phardata.delmetadata.php"/>
+<entry name="PharData::delete" url="phardata.delete.php"/>
+<entry name="PharData::extractTo" url="phardata.extractto.php"/>
+<entry name="PharData::isWritable" url="phardata.iswritable.php"/>
+<entry name="PharData::offsetSet" url="phardata.offsetset.php"/>
+<entry name="PharData::offsetUnset" url="phardata.offsetunset.php"/>
+<entry name="PharData::setAlias" url="phardata.setalias.php"/>
+<entry name="PharData::setDefaultStub" url="phardata.setdefaultstub.php"/>
+<entry name="PharData::setStub" url="phardata.setstub.php"/>
+<entry name="PharFileInfo::chmod" url="pharfileinfo.chmod.php"/>
+<entry name="PharFileInfo::compress" url="pharfileinfo.compress.php"/>
+<entry name="PharFileInfo::__construct" url="pharfileinfo.construct.php"/>
+<entry name="PharFileInfo::decompress" url="pharfileinfo.decompress.php"/>
+<entry name="PharFileInfo::delMetadata" url="pharfileinfo.delmetadata.php"/>
+<entry name="PharFileInfo::getCRC32" url="pharfileinfo.getcrc32.php"/>
+<entry name="PharFileInfo::getCompressedSize" url="pharfileinfo.getcompressedsize.php"/>
+<entry name="PharFileInfo::getMetaData" url="pharfileinfo.getmetadata.php"/>
+<entry name="PharFileInfo::getPharFlags" url="pharfileinfo.getpharflags.php"/>
+<entry name="PharFileInfo::hasMetadata" url="pharfileinfo.hasmetadata.php"/>
+<entry name="PharFileInfo::isCRCChecked" url="pharfileinfo.iscrcchecked.php"/>
+<entry name="PharFileInfo::isCompressed" url="pharfileinfo.iscompressed.php"/>
+<entry name="PharFileInfo::isCompressedBZIP2" url="pharfileinfo.iscompressedbzip2.php"/>
+<entry name="PharFileInfo::isCompressedGZ" url="pharfileinfo.iscompressedgz.php"/>
+<entry name="PharFileInfo::setCompressedBZIP2" url="pharfileinfo.setcompressedbzip2.php"/>
+<entry name="PharFileInfo::setCompressedGZ" url="pharfileinfo.setcompressedgz.php"/>
+<entry name="PharFileInfo::setMetaData" url="pharfileinfo.setmetadata.php"/>
+<entry name="PharFileInfo::setUncompressed" url="pharfileinfo.setuncompressed.php"/>
+<entry name="PharException" url="PharException.intro.unused.php"/>
+<entry name="rar_close" url="function.rar-close.php"/>
+<entry name="rar_entry_get" url="function.rar-entry-get.php"/>
+<entry name="Rar::extract" url="function.rar-extract.php"/>
+<entry name="Rar::getAttr" url="function.rar-getattr.php"/>
+<entry name="Rar::getCrc" url="function.rar-getcrc.php"/>
+<entry name="Rar::getFileTime" url="function.rar-getfiletime.php"/>
+<entry name="Rar::getHostOs" url="function.rar-gethostos.php"/>
+<entry name="Rar::getMethod" url="function.rar-getmethod.php"/>
+<entry name="Rar::getName" url="function.rar-getname.php"/>
+<entry name="Rar::getPackedSize" url="function.rar-getpackedsize.php"/>
+<entry name="Rar::getUnpackedSize" url="function.rar-getunpackedsize.php"/>
+<entry name="Rar::getVersion" url="function.rar-getversion.php"/>
+<entry name="rar_list" url="function.rar-list.php"/>
+<entry name="rar_open" url="function.rar-open.php"/>
+<entry name="zip_close" url="function.zip-close.php"/>
+<entry name="zip_entry_close" url="function.zip-entry-close.php"/>
+<entry name="zip_entry_compressedsize" url="function.zip-entry-compressedsize.php"/>
+<entry name="zip_entry_compressionmethod" url="function.zip-entry-compressionmethod.php"/>
+<entry name="zip_entry_filesize" url="function.zip-entry-filesize.php"/>
+<entry name="zip_entry_name" url="function.zip-entry-name.php"/>
+<entry name="zip_entry_open" url="function.zip-entry-open.php"/>
+<entry name="zip_entry_read" url="function.zip-entry-read.php"/>
+<entry name="zip_open" url="function.zip-open.php"/>
+<entry name="zip_read" url="function.zip-read.php"/>
+<entry name="ZipArchive::addEmptyDir" url="function.ziparchive-addemptydir.php"/>
+<entry name="ZipArchive::addFile" url="function.ziparchive-addfile.php"/>
+<entry name="ZipArchive::addFromString" url="function.ziparchive-addfromstring.php"/>
+<entry name="ZipArchive::close" url="function.ziparchive-close.php"/>
+<entry name="ZipArchive::deleteIndex" url="function.ziparchive-deleteindex.php"/>
+<entry name="ZipArchive::deleteName" url="function.ziparchive-deletename.php"/>
+<entry name="ZipArchive::extractTo" url="function.ziparchive-extractto.php"/>
+<entry name="ZipArchive::getArchiveComment" url="function.ziparchive-getarchivecomment.php"/>
+<entry name="ZipArchive::getCommentIndex" url="function.ziparchive-getcommentindex.php"/>
+<entry name="ZipArchive::getCommentName" url="function.ziparchive-getcommentname.php"/>
+<entry name="ZipArchive::getFromIndex" url="function.ziparchive-getfromindex.php"/>
+<entry name="ZipArchive::getFromName" url="function.ziparchive-getfromname.php"/>
+<entry name="ZipArchive::getNameIndex" url="function.ziparchive-getnameindex.php"/>
+<entry name="ZipArchive::getStream" url="function.ziparchive-getstream.php"/>
+<entry name="ZipArchive::locateName" url="function.ziparchive-locatename.php"/>
+<entry name="ZipArchive::open" url="function.ziparchive-open.php"/>
+<entry name="ZipArchive::renameIndex" url="function.ziparchive-renameindex.php"/>
+<entry name="ZipArchive::renameName" url="function.ziparchive-renamename.php"/>
+<entry name="ZipArchive::setArchiveComment" url="function.ziparchive-setarchivecomment.php"/>
+<entry name="ZipArchive::setCommentIndex" url="function.ziparchive-setcommentindex.php"/>
+<entry name="ZipArchive::setCommentName" url="function.ziparchive-setCommentName.php"/>
+<entry name="ZipArchive::statIndex" url="function.ziparchive-statindex.php"/>
+<entry name="ZipArchive::statName" url="function.ziparchive-statname.php"/>
+<entry name="ZipArchive::unchangeAll" url="function.ziparchive-unchangeall.php"/>
+<entry name="ZipArchive::unchangeArchive" url="function.ziparchive-unchangearchive.php"/>
+<entry name="ZipArchive::unchangeIndex" url="function.ziparchive-unchangeindex.php"/>
+<entry name="ZipArchive::unchangeName" url="function.ziparchive-unchangename.php"/>
+<entry name="gzclose" url="function.gzclose.php"/>
+<entry name="gzcompress" url="function.gzcompress.php"/>
+<entry name="gzdecode" url="function.gzdecode.php"/>
+<entry name="gzdeflate" url="function.gzdeflate.php"/>
+<entry name="gzencode" url="function.gzencode.php"/>
+<entry name="gzeof" url="function.gzeof.php"/>
+<entry name="gzfile" url="function.gzfile.php"/>
+<entry name="gzgetc" url="function.gzgetc.php"/>
+<entry name="gzgets" url="function.gzgets.php"/>
+<entry name="gzgetss" url="function.gzgetss.php"/>
+<entry name="gzinflate" url="function.gzinflate.php"/>
+<entry name="gzopen" url="function.gzopen.php"/>
+<entry name="gzpassthru" url="function.gzpassthru.php"/>
+<entry name="gzputs" url="function.gzputs.php"/>
+<entry name="gzread" url="function.gzread.php"/>
+<entry name="gzrewind" url="function.gzrewind.php"/>
+<entry name="gzseek" url="function.gzseek.php"/>
+<entry name="gztell" url="function.gztell.php"/>
+<entry name="gzuncompress" url="function.gzuncompress.php"/>
+<entry name="gzwrite" url="function.gzwrite.php"/>
+<entry name="readgzfile" url="function.readgzfile.php"/>
+<entry name="zlib_get_coding_type" url="function.zlib-get-coding-type.php"/>
+<entry name="m_checkstatus" url="function.m-checkstatus.php"/>
+<entry name="m_completeauthorizations" url="function.m-completeauthorizations.php"/>
+<entry name="m_connect" url="function.m-connect.php"/>
+<entry name="m_connectionerror" url="function.m-connectionerror.php"/>
+<entry name="m_deletetrans" url="function.m-deletetrans.php"/>
+<entry name="m_destroyconn" url="function.m-destroyconn.php"/>
+<entry name="m_destroyengine" url="function.m-destroyengine.php"/>
+<entry name="m_getcell" url="function.m-getcell.php"/>
+<entry name="m_getcellbynum" url="function.m-getcellbynum.php"/>
+<entry name="m_getcommadelimited" url="function.m-getcommadelimited.php"/>
+<entry name="m_getheader" url="function.m-getheader.php"/>
+<entry name="m_initconn" url="function.m-initconn.php"/>
+<entry name="m_initengine" url="function.m-initengine.php"/>
+<entry name="m_iscommadelimited" url="function.m-iscommadelimited.php"/>
+<entry name="m_maxconntimeout" url="function.m-maxconntimeout.php"/>
+<entry name="m_monitor" url="function.m-monitor.php"/>
+<entry name="m_numcolumns" url="function.m-numcolumns.php"/>
+<entry name="m_numrows" url="function.m-numrows.php"/>
+<entry name="m_parsecommadelimited" url="function.m-parsecommadelimited.php"/>
+<entry name="m_responsekeys" url="function.m-responsekeys.php"/>
+<entry name="m_responseparam" url="function.m-responseparam.php"/>
+<entry name="m_returnstatus" url="function.m-returnstatus.php"/>
+<entry name="m_setblocking" url="function.m-setblocking.php"/>
+<entry name="m_setdropfile" url="function.m-setdropfile.php"/>
+<entry name="m_setip" url="function.m-setip.php"/>
+<entry name="m_setssl_cafile" url="function.m-setssl-cafile.php"/>
+<entry name="m_setssl_files" url="function.m-setssl-files.php"/>
+<entry name="m_setssl" url="function.m-setssl.php"/>
+<entry name="m_settimeout" url="function.m-settimeout.php"/>
+<entry name="m_sslcert_gen_hash" url="function.m-sslcert-gen-hash.php"/>
+<entry name="m_transactionssent" url="function.m-transactionssent.php"/>
+<entry name="m_transinqueue" url="function.m-transinqueue.php"/>
+<entry name="m_transkeyval" url="function.m-transkeyval.php"/>
+<entry name="m_transnew" url="function.m-transnew.php"/>
+<entry name="m_transsend" url="function.m-transsend.php"/>
+<entry name="m_uwait" url="function.m-uwait.php"/>
+<entry name="m_validateidentifier" url="function.m-validateidentifier.php"/>
+<entry name="m_verifyconnection" url="function.m-verifyconnection.php"/>
+<entry name="m_verifysslcert" url="function.m-verifysslcert.php"/>
+<entry name="calcul_hmac" url="function.calcul-hmac.php"/>
+<entry name="calculhmac" url="function.calculhmac.php"/>
+<entry name="nthmac" url="function.nthmac.php"/>
+<entry name="signeurlpaiement" url="function.signeurlpaiement.php"/>
+<entry name="crack_check" url="function.crack-check.php"/>
+<entry name="crack_closedict" url="function.crack-closedict.php"/>
+<entry name="crack_getlastmessage" url="function.crack-getlastmessage.php"/>
+<entry name="crack_opendict" url="function.crack-opendict.php"/>
+<entry name="hash_algos" url="function.hash-algos.php"/>
+<entry name="hash_copy" url="function.hash-copy.php"/>
+<entry name="hash_file" url="function.hash-file.php"/>
+<entry name="hash_final" url="function.hash-final.php"/>
+<entry name="hash_hmac_file" url="function.hash-hmac-file.php"/>
+<entry name="hash_hmac" url="function.hash-hmac.php"/>
+<entry name="hash_init" url="function.hash-init.php"/>
+<entry name="hash_update_file" url="function.hash-update-file.php"/>
+<entry name="hash_update_stream" url="function.hash-update-stream.php"/>
+<entry name="hash_update" url="function.hash-update.php"/>
+<entry name="hash" url="function.hash.php"/>
+<entry name="mcrypt_cbc" url="function.mcrypt-cbc.php"/>
+<entry name="mcrypt_cfb" url="function.mcrypt-cfb.php"/>
+<entry name="mcrypt_create_iv" url="function.mcrypt-create-iv.php"/>
+<entry name="mcrypt_decrypt" url="function.mcrypt-decrypt.php"/>
+<entry name="mcrypt_ecb" url="function.mcrypt-ecb.php"/>
+<entry name="mcrypt_enc_get_algorithms_name" url="function.mcrypt-enc-get-algorithms-name.php"/>
+<entry name="mcrypt_enc_get_block_size" url="function.mcrypt-enc-get-block-size.php"/>
+<entry name="mcrypt_enc_get_iv_size" url="function.mcrypt-enc-get-iv-size.php"/>
+<entry name="mcrypt_enc_get_key_size" url="function.mcrypt-enc-get-key-size.php"/>
+<entry name="mcrypt_enc_get_modes_name" url="function.mcrypt-enc-get-modes-name.php"/>
+<entry name="mcrypt_enc_get_supported_key_sizes" url="function.mcrypt-enc-get-supported-key-sizes.php"/>
+<entry name="mcrypt_enc_is_block_algorithm_mode" url="function.mcrypt-enc-is-block-algorithm-mode.php"/>
+<entry name="mcrypt_enc_is_block_algorithm" url="function.mcrypt-enc-is-block-algorithm.php"/>
+<entry name="mcrypt_enc_is_block_mode" url="function.mcrypt-enc-is-block-mode.php"/>
+<entry name="mcrypt_enc_self_test" url="function.mcrypt-enc-self-test.php"/>
+<entry name="mcrypt_encrypt" url="function.mcrypt-encrypt.php"/>
+<entry name="mcrypt_generic_deinit" url="function.mcrypt-generic-deinit.php"/>
+<entry name="mcrypt_generic_end" url="function.mcrypt-generic-end.php"/>
+<entry name="mcrypt_generic_init" url="function.mcrypt-generic-init.php"/>
+<entry name="mcrypt_generic" url="function.mcrypt-generic.php"/>
+<entry name="mcrypt_get_block_size" url="function.mcrypt-get-block-size.php"/>
+<entry name="mcrypt_get_cipher_name" url="function.mcrypt-get-cipher-name.php"/>
+<entry name="mcrypt_get_iv_size" url="function.mcrypt-get-iv-size.php"/>
+<entry name="mcrypt_get_key_size" url="function.mcrypt-get-key-size.php"/>
+<entry name="mcrypt_list_algorithms" url="function.mcrypt-list-algorithms.php"/>
+<entry name="mcrypt_list_modes" url="function.mcrypt-list-modes.php"/>
+<entry name="mcrypt_module_close" url="function.mcrypt-module-close.php"/>
+<entry name="mcrypt_module_get_algo_block_size" url="function.mcrypt-module-get-algo-block-size.php"/>
+<entry name="mcrypt_module_get_algo_key_size" url="function.mcrypt-module-get-algo-key-size.php"/>
+<entry name="mcrypt_module_get_supported_key_sizes" url="function.mcrypt-module-get-supported-key-sizes.php"/>
+<entry name="mcrypt_module_is_block_algorithm_mode" url="function.mcrypt-module-is-block-algorithm-mode.php"/>
+<entry name="mcrypt_module_is_block_algorithm" url="function.mcrypt-module-is-block-algorithm.php"/>
+<entry name="mcrypt_module_is_block_mode" url="function.mcrypt-module-is-block-mode.php"/>
+<entry name="mcrypt_module_open" url="function.mcrypt-module-open.php"/>
+<entry name="mcrypt_module_self_test" url="function.mcrypt-module-self-test.php"/>
+<entry name="mcrypt_ofb" url="function.mcrypt-ofb.php"/>
+<entry name="mdecrypt_generic" url="function.mdecrypt-generic.php"/>
+<entry name="mhash_count" url="function.mhash-count.php"/>
+<entry name="mhash_get_block_size" url="function.mhash-get-block-size.php"/>
+<entry name="mhash_get_hash_name" url="function.mhash-get-hash-name.php"/>
+<entry name="mhash_keygen_s2k" url="function.mhash-keygen-s2k.php"/>
+<entry name="mhash" url="function.mhash.php"/>
+<entry name="openssl_csr_export_to_file" url="function.openssl-csr-export-to-file.php"/>
+<entry name="openssl_csr_export" url="function.openssl-csr-export.php"/>
+<entry name="openssl_csr_get_public_key" url="function.openssl-csr-get-public-key.php"/>
+<entry name="openssl_csr_get_subject" url="function.openssl-csr-get-subject.php"/>
+<entry name="openssl_csr_new" url="function.openssl-csr-new.php"/>
+<entry name="openssl_csr_sign" url="function.openssl-csr-sign.php"/>
+<entry name="openssl_error_string" url="function.openssl-error-string.php"/>
+<entry name="openssl_free_key" url="function.openssl-free-key.php"/>
+<entry name="openssl_get_privatekey" url="function.openssl-get-privatekey.php"/>
+<entry name="openssl_get_publickey" url="function.openssl-get-publickey.php"/>
+<entry name="openssl_open" url="function.openssl-open.php"/>
+<entry name="openssl_pkcs12_export_to_file" url="function.openssl-pkcs12-export-to-file.php"/>
+<entry name="openssl_pkcs12_export" url="function.openssl-pkcs12-export.php"/>
+<entry name="openssl_pkcs12_read" url="function.openssl-pkcs12-read.php"/>
+<entry name="openssl_pkcs7_decrypt" url="function.openssl-pkcs7-decrypt.php"/>
+<entry name="openssl_pkcs7_encrypt" url="function.openssl-pkcs7-encrypt.php"/>
+<entry name="openssl_pkcs7_sign" url="function.openssl-pkcs7-sign.php"/>
+<entry name="openssl_pkcs7_verify" url="function.openssl-pkcs7-verify.php"/>
+<entry name="openssl_pkey_export_to_file" url="function.openssl-pkey-export-to-file.php"/>
+<entry name="openssl_pkey_export" url="function.openssl-pkey-export.php"/>
+<entry name="openssl_pkey_free" url="function.openssl-pkey-free.php"/>
+<entry name="openssl_pkey_get_details" url="function.openssl-pkey-get-details.php"/>
+<entry name="openssl_pkey_get_private" url="function.openssl-pkey-get-private.php"/>
+<entry name="openssl_pkey_get_public" url="function.openssl-pkey-get-public.php"/>
+<entry name="openssl_pkey_new" url="function.openssl-pkey-new.php"/>
+<entry name="openssl_private_decrypt" url="function.openssl-private-decrypt.php"/>
+<entry name="openssl_private_encrypt" url="function.openssl-private-encrypt.php"/>
+<entry name="openssl_public_decrypt" url="function.openssl-public-decrypt.php"/>
+<entry name="openssl_public_encrypt" url="function.openssl-public-encrypt.php"/>
+<entry name="openssl_seal" url="function.openssl-seal.php"/>
+<entry name="openssl_sign" url="function.openssl-sign.php"/>
+<entry name="openssl_verify" url="function.openssl-verify.php"/>
+<entry name="openssl_x509_check_private_key" url="function.openssl-x509-check-private-key.php"/>
+<entry name="openssl_x509_checkpurpose" url="function.openssl-x509-checkpurpose.php"/>
+<entry name="openssl_x509_export_to_file" url="function.openssl-x509-export-to-file.php"/>
+<entry name="openssl_x509_export" url="function.openssl-x509-export.php"/>
+<entry name="openssl_x509_free" url="function.openssl-x509-free.php"/>
+<entry name="openssl_x509_parse" url="function.openssl-x509-parse.php"/>
+<entry name="openssl_x509_read" url="function.openssl-x509-read.php"/>
+<entry name="dba_close" url="function.dba-close.php"/>
+<entry name="dba_delete" url="function.dba-delete.php"/>
+<entry name="dba_exists" url="function.dba-exists.php"/>
+<entry name="dba_fetch" url="function.dba-fetch.php"/>
+<entry name="dba_firstkey" url="function.dba-firstkey.php"/>
+<entry name="dba_handlers" url="function.dba-handlers.php"/>
+<entry name="dba_insert" url="function.dba-insert.php"/>
+<entry name="dba_key_split" url="function.dba-key-split.php"/>
+<entry name="dba_list" url="function.dba-list.php"/>
+<entry name="dba_nextkey" url="function.dba-nextkey.php"/>
+<entry name="dba_open" url="function.dba-open.php"/>
+<entry name="dba_optimize" url="function.dba-optimize.php"/>
+<entry name="dba_popen" url="function.dba-popen.php"/>
+<entry name="dba_replace" url="function.dba-replace.php"/>
+<entry name="dba_sync" url="function.dba-sync.php"/>
+<entry name="dbx_close" url="function.dbx-close.php"/>
+<entry name="dbx_compare" url="function.dbx-compare.php"/>
+<entry name="dbx_connect" url="function.dbx-connect.php"/>
+<entry name="dbx_error" url="function.dbx-error.php"/>
+<entry name="dbx_escape_string" url="function.dbx-escape-string.php"/>
+<entry name="dbx_fetch_row" url="function.dbx-fetch-row.php"/>
+<entry name="dbx_query" url="function.dbx-query.php"/>
+<entry name="dbx_sort" url="function.dbx-sort.php"/>
+<entry name="odbc_autocommit" url="function.odbc-autocommit.php"/>
+<entry name="odbc_binmode" url="function.odbc-binmode.php"/>
+<entry name="odbc_close_all" url="function.odbc-close-all.php"/>
+<entry name="odbc_close" url="function.odbc-close.php"/>
+<entry name="odbc_columnprivileges" url="function.odbc-columnprivileges.php"/>
+<entry name="odbc_columns" url="function.odbc-columns.php"/>
+<entry name="odbc_commit" url="function.odbc-commit.php"/>
+<entry name="odbc_connect" url="function.odbc-connect.php"/>
+<entry name="odbc_cursor" url="function.odbc-cursor.php"/>
+<entry name="odbc_data_source" url="function.odbc-data-source.php"/>
+<entry name="odbc_do" url="function.odbc-do.php"/>
+<entry name="odbc_error" url="function.odbc-error.php"/>
+<entry name="odbc_errormsg" url="function.odbc-errormsg.php"/>
+<entry name="odbc_exec" url="function.odbc-exec.php"/>
+<entry name="odbc_execute" url="function.odbc-execute.php"/>
+<entry name="odbc_fetch_array" url="function.odbc-fetch-array.php"/>
+<entry name="odbc_fetch_into" url="function.odbc-fetch-into.php"/>
+<entry name="odbc_fetch_object" url="function.odbc-fetch-object.php"/>
+<entry name="odbc_fetch_row" url="function.odbc-fetch-row.php"/>
+<entry name="odbc_field_len" url="function.odbc-field-len.php"/>
+<entry name="odbc_field_name" url="function.odbc-field-name.php"/>
+<entry name="odbc_field_num" url="function.odbc-field-num.php"/>
+<entry name="odbc_field_precision" url="function.odbc-field-precision.php"/>
+<entry name="odbc_field_scale" url="function.odbc-field-scale.php"/>
+<entry name="odbc_field_type" url="function.odbc-field-type.php"/>
+<entry name="odbc_foreignkeys" url="function.odbc-foreignkeys.php"/>
+<entry name="odbc_free_result" url="function.odbc-free-result.php"/>
+<entry name="odbc_gettypeinfo" url="function.odbc-gettypeinfo.php"/>
+<entry name="odbc_longreadlen" url="function.odbc-longreadlen.php"/>
+<entry name="odbc_next_result" url="function.odbc-next-result.php"/>
+<entry name="odbc_num_fields" url="function.odbc-num-fields.php"/>
+<entry name="odbc_num_rows" url="function.odbc-num-rows.php"/>
+<entry name="odbc_pconnect" url="function.odbc-pconnect.php"/>
+<entry name="odbc_prepare" url="function.odbc-prepare.php"/>
+<entry name="odbc_primarykeys" url="function.odbc-primarykeys.php"/>
+<entry name="odbc_procedurecolumns" url="function.odbc-procedurecolumns.php"/>
+<entry name="odbc_procedures" url="function.odbc-procedures.php"/>
+<entry name="odbc_result_all" url="function.odbc-result-all.php"/>
+<entry name="odbc_result" url="function.odbc-result.php"/>
+<entry name="odbc_rollback" url="function.odbc-rollback.php"/>
+<entry name="odbc_setoption" url="function.odbc-setoption.php"/>
+<entry name="odbc_specialcolumns" url="function.odbc-specialcolumns.php"/>
+<entry name="odbc_statistics" url="function.odbc-statistics.php"/>
+<entry name="odbc_tableprivileges" url="function.odbc-tableprivileges.php"/>
+<entry name="odbc_tables" url="function.odbc-tables.php"/>
+<entry name="PDO::beginTransaction" url="pdo.begintransaction.php"/>
+<entry name="PDO::commit" url="pdo.commit.php"/>
+<entry name="PDO::__construct" url="pdo.construct.php"/>
+<entry name="PDO::errorCode" url="pdo.errorcode.php"/>
+<entry name="PDO::errorInfo" url="pdo.errorinfo.php"/>
+<entry name="PDO::exec" url="pdo.exec.php"/>
+<entry name="PDO::getAttribute" url="pdo.getattribute.php"/>
+<entry name="PDO::getAvailableDrivers" url="pdo.getavailabledrivers.php"/>
+<entry name="PDO::lastInsertId" url="pdo.lastinsertid.php"/>
+<entry name="PDO::prepare" url="pdo.prepare.php"/>
+<entry name="PDO::query" url="pdo.query.php"/>
+<entry name="PDO::quote" url="pdo.quote.php"/>
+<entry name="PDO::rollBack" url="pdo.rollback.php"/>
+<entry name="PDO::setAttribute" url="pdo.setattribute.php"/>
+<entry name="PDOStatement->bindColumn" url="pdostatement.bindcolumn.php"/>
+<entry name="PDOStatement->bindParam" url="pdostatement.bindparam.php"/>
+<entry name="PDOStatement->bindValue" url="pdostatement.bindvalue.php"/>
+<entry name="PDOStatement->closeCursor" url="pdostatement.closecursor.php"/>
+<entry name="PDOStatement->columnCount" url="pdostatement.columncount.php"/>
+<entry name="PDOStatement->errorCode" url="pdostatement.errorcode.php"/>
+<entry name="PDOStatement->errorInfo" url="pdostatement.errorinfo.php"/>
+<entry name="PDOStatement->execute" url="pdostatement.execute.php"/>
+<entry name="PDOStatement->fetch" url="pdostatement.fetch.php"/>
+<entry name="PDOStatement->fetchAll" url="pdostatement.fetchall.php"/>
+<entry name="PDOStatement->fetchColumn" url="pdostatement.fetchcolumn.php"/>
+<entry name="PDOStatement->fetchObject" url="pdostatement.fetchobject.php"/>
+<entry name="PDOStatement->getAttribute" url="pdostatement.getattribute.php"/>
+<entry name="PDOStatement->getColumnMeta" url="pdostatement.getcolumnmeta.php"/>
+<entry name="PDOStatement->nextRowset" url="pdostatement.nextrowset.php"/>
+<entry name="PDOStatement->rowCount" url="pdostatement.rowcount.php"/>
+<entry name="PDOStatement->setAttribute" url="pdostatement.setattribute.php"/>
+<entry name="PDOStatement->setFetchMode" url="pdostatement.setfetchmode.php"/>
+<entry name="PDO_DBLIB DSN" url="ref.pdo-dblib.connection.php"/>
+<entry name="PDO_FIREBIRD DSN" url="ref.pdo-firebird.connection.php"/>
+<entry name="PDO_IBM DSN" url="ref.pdo-ibm.connection.php"/>
+<entry name="PDO_INFORMIX DSN" url="ref.pdo-informix.connection.php"/>
+<entry name="PDO_MYSQL DSN" url="ref.pdo-mysql.connection.php"/>
+<entry name="PDO_OCI DSN" url="ref.pdo-oci.connection.php"/>
+<entry name="PDO_ODBC DSN" url="ref.pdo-odbc.connection.php"/>
+<entry name="PDO_PGSQL DSN" url="ref.pdo-pgsql.connection.php"/>
+<entry name="PDO::pgsqlLOBCreate" url="function.pdo-pgsqllobcreate.php"/>
+<entry name="PDO::pgsqlLOBOpen" url="function.pdo-pgsqllobopen.php"/>
+<entry name="PDO::pgsqlLOBUnlink" url="function.pdo-pgsqllobunlink.php"/>
+<entry name="PDO_SQLITE DSN" url="ref.pdo-sqlite.connection.php"/>
+<entry name="PDO->sqliteCreateAggregate()" url="function.pdo-sqlitecreateaggregate.php"/>
+<entry name="PDO->sqliteCreateFunction()" url="function.pdo-sqlitecreatefunction.php"/>
+<entry name="SDO_DAS_ChangeSummary::beginLogging" url="function.sdo-das-changesummary-beginlogging.php"/>
+<entry name="SDO_DAS_ChangeSummary::endLogging" url="function.sdo-das-changesummary-endlogging.php"/>
+<entry name="SDO_DAS_ChangeSummary::getChangeType" url="function.sdo-das-changesummary-getchangetype.php"/>
+<entry name="SDO_DAS_ChangeSummary::getChangedDataObjects" url="function.sdo-das-changesummary-getchangeddataobjects.php"/>
+<entry name="SDO_DAS_ChangeSummary::getOldContainer" url="function.sdo-das-changesummary-getoldcontainer.php"/>
+<entry name="SDO_DAS_ChangeSummary::getOldValues" url="function.sdo-das-changesummary-getoldvalues.php"/>
+<entry name="SDO_DAS_ChangeSummary::isLogging" url="function.sdo-das-changesummary-islogging.php"/>
+<entry name="SDO_DAS_DataFactory::addPropertyToType" url="function.sdo-das-datafactory-addpropertytotype.php"/>
+<entry name="SDO_DAS_DataFactory::addType" url="function.sdo-das-datafactory-addtype.php"/>
+<entry name="SDO_DAS_DataFactory::getDataFactory" url="function.sdo-das-datafactory-getdatafactory.php"/>
+<entry name="SDO_DAS_DataObject::getChangeSummary" url="function.sdo-das-dataobject-getchangesummary.php"/>
+<entry name="SDO_DAS_Setting::getListIndex" url="function.sdo-das-setting-getlistindex.php"/>
+<entry name="SDO_DAS_Setting::getPropertyIndex" url="function.sdo-das-setting-getpropertyindex.php"/>
+<entry name="SDO_DAS_Setting::getPropertyName" url="function.sdo-das-setting-getpropertyname.php"/>
+<entry name="SDO_DAS_Setting::getValue" url="function.sdo-das-setting-getvalue.php"/>
+<entry name="SDO_DAS_Setting::isSet" url="function.sdo-das-setting-isset.php"/>
+<entry name="SDO_DataFactory::create" url="function.sdo-datafactory-create.php"/>
+<entry name="SDO_DataObject::clear" url="function.sdo-dataobject-clear.php"/>
+<entry name="SDO_DataObject::createDataObject" url="function.sdo-dataobject-createdataobject.php"/>
+<entry name="SDO_DataObject::getContainer" url="function.sdo-dataobject-getcontainer.php"/>
+<entry name="SDO_DataObject::getSequence" url="function.sdo-dataobject-getsequence.php"/>
+<entry name="SDO_DataObject::getTypeName" url="function.sdo-dataobject-gettypename.php"/>
+<entry name="SDO_DataObject::getTypeNamespaceURI" url="function.sdo-dataobject-gettypenamespaceuri.php"/>
+<entry name="SDO_Exception::getCause" url="function.sdo-exception-getcause.php"/>
+<entry name="SDO_List::insert" url="function.sdo-list-insert.php"/>
+<entry name="SDO_Model_Property::getContainingType" url="function.sdo-model-property-getcontainingtype.php"/>
+<entry name="SDO_Model_Property::getDefault" url="function.sdo-model-property-getdefault.php"/>
+<entry name="SDO_Model_Property::getName" url="function.sdo-model-property-getname.php"/>
+<entry name="SDO_Model_Property::getType" url="function.sdo-model-property-gettype.php"/>
+<entry name="SDO_Model_Property::isContainment" url="function.sdo-model-property-iscontainment.php"/>
+<entry name="SDO_Model_Property::isMany" url="function.sdo-model-property-ismany.php"/>
+<entry name="SDO_Model_ReflectionDataObject::__construct" url="function.sdo-model-reflectiondataobject-construct.php"/>
+<entry name="SDO_Model_ReflectionDataObject::export" url="function.sdo-model-reflectiondataobject-export.php"/>
+<entry name="SDO_Model_ReflectionDataObject::getContainmentProperty" url="function.sdo-model-reflectiondataobject-getcontainmentproperty.php"/>
+<entry name="SDO_Model_ReflectionDataObject::getInstanceProperties" url="function.sdo-model-reflectiondataobject-getinstanceproperties.php"/>
+<entry name="SDO_Model_ReflectionDataObject::getType" url="function.sdo-model-reflectiondataobject-gettype.php"/>
+<entry name="SDO_Model_Type::getBaseType" url="function.sdo-model-type-getbasetype.php"/>
+<entry name="SDO_Model_Type::getName" url="function.sdo-model-type-getname.php"/>
+<entry name="SDO_Model_Type::getNamespaceURI" url="function.sdo-model-type-getnamespaceuri.php"/>
+<entry name="SDO_Model_Type::getProperties" url="function.sdo-model-type-getproperties.php"/>
+<entry name="SDO_Model_Type::getProperty" url="function.sdo-model-type-getproperty.php"/>
+<entry name="SDO_Model_Type::isAbstractType" url="function.sdo-model-type-isabstracttype.php"/>
+<entry name="SDO_Model_Type::isDataType" url="function.sdo-model-type-isdatatype.php"/>
+<entry name="SDO_Model_Type::isInstance" url="function.sdo-model-type-isinstance.php"/>
+<entry name="SDO_Model_Type::isOpenType" url="function.sdo-model-type-isopentype.php"/>
+<entry name="SDO_Model_Type::isSequencedType" url="function.sdo-model-type-issequencedtype.php"/>
+<entry name="SDO_Sequence::getProperty" url="function.sdo-sequence-getproperty.php"/>
+<entry name="SDO_Sequence::insert" url="function.sdo-sequence-insert.php"/>
+<entry name="SDO_Sequence::move" url="function.sdo-sequence-move.php"/>
+<entry name="SDO_DAS_Relational::applyChanges" url="function.sdo-das-relational-applychanges.php"/>
+<entry name="SDO_DAS_Relational::__construct" url="function.sdo-das-relational-construct.php"/>
+<entry name="SDO_DAS_Relational::createRootDataObject" url="function.sdo-das-relational-createrootdataobject.php"/>
+<entry name="SDO_DAS_Relational::executePreparedQuery" url="function.sdo-das-relational-executepreparedquery.php"/>
+<entry name="SDO_DAS_Relational::executeQuery" url="function.sdo-das-relational-executequery.php"/>
+<entry name="dbase_add_record" url="function.dbase-add-record.php"/>
+<entry name="dbase_close" url="function.dbase-close.php"/>
+<entry name="dbase_create" url="function.dbase-create.php"/>
+<entry name="dbase_delete_record" url="function.dbase-delete-record.php"/>
+<entry name="dbase_get_header_info" url="function.dbase-get-header-info.php"/>
+<entry name="dbase_get_record_with_names" url="function.dbase-get-record-with-names.php"/>
+<entry name="dbase_get_record" url="function.dbase-get-record.php"/>
+<entry name="dbase_numfields" url="function.dbase-numfields.php"/>
+<entry name="dbase_numrecords" url="function.dbase-numrecords.php"/>
+<entry name="dbase_open" url="function.dbase-open.php"/>
+<entry name="dbase_pack" url="function.dbase-pack.php"/>
+<entry name="dbase_replace_record" url="function.dbase-replace-record.php"/>
+<entry name="dbplus_add" url="function.dbplus-add.php"/>
+<entry name="dbplus_aql" url="function.dbplus-aql.php"/>
+<entry name="dbplus_chdir" url="function.dbplus-chdir.php"/>
+<entry name="dbplus_close" url="function.dbplus-close.php"/>
+<entry name="dbplus_curr" url="function.dbplus-curr.php"/>
+<entry name="dbplus_errcode" url="function.dbplus-errcode.php"/>
+<entry name="dbplus_errno" url="function.dbplus-errno.php"/>
+<entry name="dbplus_find" url="function.dbplus-find.php"/>
+<entry name="dbplus_first" url="function.dbplus-first.php"/>
+<entry name="dbplus_flush" url="function.dbplus-flush.php"/>
+<entry name="dbplus_freealllocks" url="function.dbplus-freealllocks.php"/>
+<entry name="dbplus_freelock" url="function.dbplus-freelock.php"/>
+<entry name="dbplus_freerlocks" url="function.dbplus-freerlocks.php"/>
+<entry name="dbplus_getlock" url="function.dbplus-getlock.php"/>
+<entry name="dbplus_getunique" url="function.dbplus-getunique.php"/>
+<entry name="dbplus_info" url="function.dbplus-info.php"/>
+<entry name="dbplus_last" url="function.dbplus-last.php"/>
+<entry name="dbplus_lockrel" url="function.dbplus-lockrel.php"/>
+<entry name="dbplus_next" url="function.dbplus-next.php"/>
+<entry name="dbplus_open" url="function.dbplus-open.php"/>
+<entry name="dbplus_prev" url="function.dbplus-prev.php"/>
+<entry name="dbplus_rchperm" url="function.dbplus-rchperm.php"/>
+<entry name="dbplus_rcreate" url="function.dbplus-rcreate.php"/>
+<entry name="dbplus_rcrtexact" url="function.dbplus-rcrtexact.php"/>
+<entry name="dbplus_rcrtlike" url="function.dbplus-rcrtlike.php"/>
+<entry name="dbplus_resolve" url="function.dbplus-resolve.php"/>
+<entry name="dbplus_restorepos" url="function.dbplus-restorepos.php"/>
+<entry name="dbplus_rkeys" url="function.dbplus-rkeys.php"/>
+<entry name="dbplus_ropen" url="function.dbplus-ropen.php"/>
+<entry name="dbplus_rquery" url="function.dbplus-rquery.php"/>
+<entry name="dbplus_rrename" url="function.dbplus-rrename.php"/>
+<entry name="dbplus_rsecindex" url="function.dbplus-rsecindex.php"/>
+<entry name="dbplus_runlink" url="function.dbplus-runlink.php"/>
+<entry name="dbplus_rzap" url="function.dbplus-rzap.php"/>
+<entry name="dbplus_savepos" url="function.dbplus-savepos.php"/>
+<entry name="dbplus_setindex" url="function.dbplus-setindex.php"/>
+<entry name="dbplus_setindexbynumber" url="function.dbplus-setindexbynumber.php"/>
+<entry name="dbplus_sql" url="function.dbplus-sql.php"/>
+<entry name="dbplus_tcl" url="function.dbplus-tcl.php"/>
+<entry name="dbplus_tremove" url="function.dbplus-tremove.php"/>
+<entry name="dbplus_undo" url="function.dbplus-undo.php"/>
+<entry name="dbplus_undoprepare" url="function.dbplus-undoprepare.php"/>
+<entry name="dbplus_unlockrel" url="function.dbplus-unlockrel.php"/>
+<entry name="dbplus_unselect" url="function.dbplus-unselect.php"/>
+<entry name="dbplus_update" url="function.dbplus-update.php"/>
+<entry name="dbplus_xlockrel" url="function.dbplus-xlockrel.php"/>
+<entry name="dbplus_xunlockrel" url="function.dbplus-xunlockrel.php"/>
+<entry name="fbsql_affected_rows" url="function.fbsql-affected-rows.php"/>
+<entry name="fbsql_autocommit" url="function.fbsql-autocommit.php"/>
+<entry name="fbsql_blob_size" url="function.fbsql-blob-size.php"/>
+<entry name="fbsql_change_user" url="function.fbsql-change-user.php"/>
+<entry name="fbsql_clob_size" url="function.fbsql-clob-size.php"/>
+<entry name="fbsql_close" url="function.fbsql-close.php"/>
+<entry name="fbsql_commit" url="function.fbsql-commit.php"/>
+<entry name="fbsql_connect" url="function.fbsql-connect.php"/>
+<entry name="fbsql_create_blob" url="function.fbsql-create-blob.php"/>
+<entry name="fbsql_create_clob" url="function.fbsql-create-clob.php"/>
+<entry name="fbsql_create_db" url="function.fbsql-create-db.php"/>
+<entry name="fbsql_data_seek" url="function.fbsql-data-seek.php"/>
+<entry name="fbsql_database_password" url="function.fbsql-database-password.php"/>
+<entry name="fbsql_database" url="function.fbsql-database.php"/>
+<entry name="fbsql_db_query" url="function.fbsql-db-query.php"/>
+<entry name="fbsql_db_status" url="function.fbsql-db-status.php"/>
+<entry name="fbsql_drop_db" url="function.fbsql-drop-db.php"/>
+<entry name="fbsql_errno" url="function.fbsql-errno.php"/>
+<entry name="fbsql_error" url="function.fbsql-error.php"/>
+<entry name="fbsql_fetch_array" url="function.fbsql-fetch-array.php"/>
+<entry name="fbsql_fetch_assoc" url="function.fbsql-fetch-assoc.php"/>
+<entry name="fbsql_fetch_field" url="function.fbsql-fetch-field.php"/>
+<entry name="fbsql_fetch_lengths" url="function.fbsql-fetch-lengths.php"/>
+<entry name="fbsql_fetch_object" url="function.fbsql-fetch-object.php"/>
+<entry name="fbsql_fetch_row" url="function.fbsql-fetch-row.php"/>
+<entry name="fbsql_field_flags" url="function.fbsql-field-flags.php"/>
+<entry name="fbsql_field_len" url="function.fbsql-field-len.php"/>
+<entry name="fbsql_field_name" url="function.fbsql-field-name.php"/>
+<entry name="fbsql_field_seek" url="function.fbsql-field-seek.php"/>
+<entry name="fbsql_field_table" url="function.fbsql-field-table.php"/>
+<entry name="fbsql_field_type" url="function.fbsql-field-type.php"/>
+<entry name="fbsql_free_result" url="function.fbsql-free-result.php"/>
+<entry name="fbsql_get_autostart_info" url="function.fbsql-get-autostart-info.php"/>
+<entry name="fbsql_hostname" url="function.fbsql-hostname.php"/>
+<entry name="fbsql_insert_id" url="function.fbsql-insert-id.php"/>
+<entry name="fbsql_list_dbs" url="function.fbsql-list-dbs.php"/>
+<entry name="fbsql_list_fields" url="function.fbsql-list-fields.php"/>
+<entry name="fbsql_list_tables" url="function.fbsql-list-tables.php"/>
+<entry name="fbsql_next_result" url="function.fbsql-next-result.php"/>
+<entry name="fbsql_num_fields" url="function.fbsql-num-fields.php"/>
+<entry name="fbsql_num_rows" url="function.fbsql-num-rows.php"/>
+<entry name="fbsql_password" url="function.fbsql-password.php"/>
+<entry name="fbsql_pconnect" url="function.fbsql-pconnect.php"/>
+<entry name="fbsql_query" url="function.fbsql-query.php"/>
+<entry name="fbsql_read_blob" url="function.fbsql-read-blob.php"/>
+<entry name="fbsql_read_clob" url="function.fbsql-read-clob.php"/>
+<entry name="fbsql_result" url="function.fbsql-result.php"/>
+<entry name="fbsql_rollback" url="function.fbsql-rollback.php"/>
+<entry name="fbsql_rows_fetched" url="function.fbsql-rows-fetched.php"/>
+<entry name="fbsql_select_db" url="function.fbsql-select-db.php"/>
+<entry name="fbsql_set_characterset" url="function.fbsql-set-characterset.php"/>
+<entry name="fbsql_set_lob_mode" url="function.fbsql-set-lob-mode.php"/>
+<entry name="fbsql_set_password" url="function.fbsql-set-password.php"/>
+<entry name="fbsql_set_transaction" url="function.fbsql-set-transaction.php"/>
+<entry name="fbsql_start_db" url="function.fbsql-start-db.php"/>
+<entry name="fbsql_stop_db" url="function.fbsql-stop-db.php"/>
+<entry name="fbsql_table_name" url="function.fbsql-table-name.php"/>
+<entry name="fbsql_tablename" url="function.fbsql-tablename.php"/>
+<entry name="fbsql_username" url="function.fbsql-username.php"/>
+<entry name="fbsql_warnings" url="function.fbsql-warnings.php"/>
+<entry name="filepro_fieldcount" url="function.filepro-fieldcount.php"/>
+<entry name="filepro_fieldname" url="function.filepro-fieldname.php"/>
+<entry name="filepro_fieldtype" url="function.filepro-fieldtype.php"/>
+<entry name="filepro_fieldwidth" url="function.filepro-fieldwidth.php"/>
+<entry name="filepro_retrieve" url="function.filepro-retrieve.php"/>
+<entry name="filepro_rowcount" url="function.filepro-rowcount.php"/>
+<entry name="filepro" url="function.filepro.php"/>
+<entry name="ibase_add_user" url="function.ibase-add-user.php"/>
+<entry name="ibase_affected_rows" url="function.ibase-affected-rows.php"/>
+<entry name="ibase_backup" url="function.ibase-backup.php"/>
+<entry name="ibase_blob_add" url="function.ibase-blob-add.php"/>
+<entry name="ibase_blob_cancel" url="function.ibase-blob-cancel.php"/>
+<entry name="ibase_blob_close" url="function.ibase-blob-close.php"/>
+<entry name="ibase_blob_create" url="function.ibase-blob-create.php"/>
+<entry name="ibase_blob_echo" url="function.ibase-blob-echo.php"/>
+<entry name="ibase_blob_get" url="function.ibase-blob-get.php"/>
+<entry name="ibase_blob_import" url="function.ibase-blob-import.php"/>
+<entry name="ibase_blob_info" url="function.ibase-blob-info.php"/>
+<entry name="ibase_blob_open" url="function.ibase-blob-open.php"/>
+<entry name="ibase_close" url="function.ibase-close.php"/>
+<entry name="ibase_commit_ret" url="function.ibase-commit-ret.php"/>
+<entry name="ibase_commit" url="function.ibase-commit.php"/>
+<entry name="ibase_connect" url="function.ibase-connect.php"/>
+<entry name="ibase_db_info" url="function.ibase-db-info.php"/>
+<entry name="ibase_delete_user" url="function.ibase-delete-user.php"/>
+<entry name="ibase_drop_db" url="function.ibase-drop-db.php"/>
+<entry name="ibase_errcode" url="function.ibase-errcode.php"/>
+<entry name="ibase_errmsg" url="function.ibase-errmsg.php"/>
+<entry name="ibase_execute" url="function.ibase-execute.php"/>
+<entry name="ibase_fetch_assoc" url="function.ibase-fetch-assoc.php"/>
+<entry name="ibase_fetch_object" url="function.ibase-fetch-object.php"/>
+<entry name="ibase_fetch_row" url="function.ibase-fetch-row.php"/>
+<entry name="ibase_field_info" url="function.ibase-field-info.php"/>
+<entry name="ibase_free_event_handler" url="function.ibase-free-event-handler.php"/>
+<entry name="ibase_free_query" url="function.ibase-free-query.php"/>
+<entry name="ibase_free_result" url="function.ibase-free-result.php"/>
+<entry name="ibase_gen_id" url="function.ibase-gen-id.php"/>
+<entry name="ibase_maintain_db" url="function.ibase-maintain-db.php"/>
+<entry name="ibase_modify_user" url="function.ibase-modify-user.php"/>
+<entry name="ibase_name_result" url="function.ibase-name-result.php"/>
+<entry name="ibase_num_fields" url="function.ibase-num-fields.php"/>
+<entry name="ibase_num_params" url="function.ibase-num-params.php"/>
+<entry name="ibase_param_info" url="function.ibase-param-info.php"/>
+<entry name="ibase_pconnect" url="function.ibase-pconnect.php"/>
+<entry name="ibase_prepare" url="function.ibase-prepare.php"/>
+<entry name="ibase_query" url="function.ibase-query.php"/>
+<entry name="ibase_restore" url="function.ibase-restore.php"/>
+<entry name="ibase_rollback_ret" url="function.ibase-rollback-ret.php"/>
+<entry name="ibase_rollback" url="function.ibase-rollback.php"/>
+<entry name="ibase_server_info" url="function.ibase-server-info.php"/>
+<entry name="ibase_service_attach" url="function.ibase-service-attach.php"/>
+<entry name="ibase_service_detach" url="function.ibase-service-detach.php"/>
+<entry name="ibase_set_event_handler" url="function.ibase-set-event-handler.php"/>
+<entry name="ibase_timefmt" url="function.ibase-timefmt.php"/>
+<entry name="ibase_trans" url="function.ibase-trans.php"/>
+<entry name="ibase_wait_event" url="function.ibase-wait-event.php"/>
+<entry name="ifx_affected_rows" url="function.ifx-affected-rows.php"/>
+<entry name="ifx_blobinfile_mode" url="function.ifx-blobinfile-mode.php"/>
+<entry name="ifx_byteasvarchar" url="function.ifx-byteasvarchar.php"/>
+<entry name="ifx_close" url="function.ifx-close.php"/>
+<entry name="ifx_connect" url="function.ifx-connect.php"/>
+<entry name="ifx_copy_blob" url="function.ifx-copy-blob.php"/>
+<entry name="ifx_create_blob" url="function.ifx-create-blob.php"/>
+<entry name="ifx_create_char" url="function.ifx-create-char.php"/>
+<entry name="ifx_do" url="function.ifx-do.php"/>
+<entry name="ifx_error" url="function.ifx-error.php"/>
+<entry name="ifx_errormsg" url="function.ifx-errormsg.php"/>
+<entry name="ifx_fetch_row" url="function.ifx-fetch-row.php"/>
+<entry name="ifx_fieldproperties" url="function.ifx-fieldproperties.php"/>
+<entry name="ifx_fieldtypes" url="function.ifx-fieldtypes.php"/>
+<entry name="ifx_free_blob" url="function.ifx-free-blob.php"/>
+<entry name="ifx_free_char" url="function.ifx-free-char.php"/>
+<entry name="ifx_free_result" url="function.ifx-free-result.php"/>
+<entry name="ifx_get_blob" url="function.ifx-get-blob.php"/>
+<entry name="ifx_get_char" url="function.ifx-get-char.php"/>
+<entry name="ifx_getsqlca" url="function.ifx-getsqlca.php"/>
+<entry name="ifx_htmltbl_result" url="function.ifx-htmltbl-result.php"/>
+<entry name="ifx_nullformat" url="function.ifx-nullformat.php"/>
+<entry name="ifx_num_fields" url="function.ifx-num-fields.php"/>
+<entry name="ifx_num_rows" url="function.ifx-num-rows.php"/>
+<entry name="ifx_pconnect" url="function.ifx-pconnect.php"/>
+<entry name="ifx_prepare" url="function.ifx-prepare.php"/>
+<entry name="ifx_query" url="function.ifx-query.php"/>
+<entry name="ifx_textasvarchar" url="function.ifx-textasvarchar.php"/>
+<entry name="ifx_update_blob" url="function.ifx-update-blob.php"/>
+<entry name="ifx_update_char" url="function.ifx-update-char.php"/>
+<entry name="ifxus_close_slob" url="function.ifxus-close-slob.php"/>
+<entry name="ifxus_create_slob" url="function.ifxus-create-slob.php"/>
+<entry name="ifxus_free_slob" url="function.ifxus-free-slob.php"/>
+<entry name="ifxus_open_slob" url="function.ifxus-open-slob.php"/>
+<entry name="ifxus_read_slob" url="function.ifxus-read-slob.php"/>
+<entry name="ifxus_seek_slob" url="function.ifxus-seek-slob.php"/>
+<entry name="ifxus_tell_slob" url="function.ifxus-tell-slob.php"/>
+<entry name="ifxus_write_slob" url="function.ifxus-write-slob.php"/>
+<entry name="db2_autocommit" url="function.db2-autocommit.php"/>
+<entry name="db2_bind_param" url="function.db2-bind-param.php"/>
+<entry name="db2_client_info" url="function.db2-client-info.php"/>
+<entry name="db2_close" url="function.db2-close.php"/>
+<entry name="db2_column_privileges" url="function.db2-column-privileges.php"/>
+<entry name="db2_columns" url="function.db2-columns.php"/>
+<entry name="db2_commit" url="function.db2-commit.php"/>
+<entry name="db2_conn_error" url="function.db2-conn-error.php"/>
+<entry name="db2_conn_errormsg" url="function.db2-conn-errormsg.php"/>
+<entry name="db2_connect" url="function.db2-connect.php"/>
+<entry name="db2_cursor_type" url="function.db2-cursor-type.php"/>
+<entry name="db2_escape_string" url="function.db2-escape-string.php"/>
+<entry name="db2_exec" url="function.db2-exec.php"/>
+<entry name="db2_execute" url="function.db2-execute.php"/>
+<entry name="db2_fetch_array" url="function.db2-fetch-array.php"/>
+<entry name="db2_fetch_assoc" url="function.db2-fetch-assoc.php"/>
+<entry name="db2_fetch_both" url="function.db2-fetch-both.php"/>
+<entry name="db2_fetch_object" url="function.db2-fetch-object.php"/>
+<entry name="db2_fetch_row" url="function.db2-fetch-row.php"/>
+<entry name="db2_field_display_size" url="function.db2-field-display-size.php"/>
+<entry name="db2_field_name" url="function.db2-field-name.php"/>
+<entry name="db2_field_num" url="function.db2-field-num.php"/>
+<entry name="db2_field_precision" url="function.db2-field-precision.php"/>
+<entry name="db2_field_scale" url="function.db2-field-scale.php"/>
+<entry name="db2_field_type" url="function.db2-field-type.php"/>
+<entry name="db2_field_width" url="function.db2-field-width.php"/>
+<entry name="db2_foreign_keys" url="function.db2-foreign-keys.php"/>
+<entry name="db2_free_result" url="function.db2-free-result.php"/>
+<entry name="db2_free_stmt" url="function.db2-free-stmt.php"/>
+<entry name="db2_get_option" url="function.db2-get-option.php"/>
+<entry name="db2_lob_read" url="function.db2-lob-read.php"/>
+<entry name="db2_next_result" url="function.db2-next-result.php"/>
+<entry name="db2_num_fields" url="function.db2-num-fields.php"/>
+<entry name="db2_num_rows" url="function.db2-num-rows.php"/>
+<entry name="db2_pconnect" url="function.db2-pconnect.php"/>
+<entry name="db2_prepare" url="function.db2-prepare.php"/>
+<entry name="db2_primary_keys" url="function.db2-primary-keys.php"/>
+<entry name="db2_procedure_columns" url="function.db2-procedure-columns.php"/>
+<entry name="db2_procedures" url="function.db2-procedures.php"/>
+<entry name="db2_result" url="function.db2-result.php"/>
+<entry name="db2_rollback" url="function.db2-rollback.php"/>
+<entry name="db2_server_info" url="function.db2-server-info.php"/>
+<entry name="db2_set_option" url="function.db2-set-option.php"/>
+<entry name="db2_special_columns" url="function.db2-special-columns.php"/>
+<entry name="db2_statistics" url="function.db2-statistics.php"/>
+<entry name="db2_stmt_error" url="function.db2-stmt-error.php"/>
+<entry name="db2_stmt_errormsg" url="function.db2-stmt-errormsg.php"/>
+<entry name="db2_table_privileges" url="function.db2-table-privileges.php"/>
+<entry name="db2_tables" url="function.db2-tables.php"/>
+<entry name="ingres_autocommit" url="function.ingres-autocommit.php"/>
+<entry name="ingres_close" url="function.ingres-close.php"/>
+<entry name="ingres_commit" url="function.ingres-commit.php"/>
+<entry name="ingres_connect" url="function.ingres-connect.php"/>
+<entry name="ingres_cursor" url="function.ingres-cursor.php"/>
+<entry name="ingres_errno" url="function.ingres-errno.php"/>
+<entry name="ingres_error" url="function.ingres-error.php"/>
+<entry name="ingres_errsqlstate" url="function.ingres-errsqlstate.php"/>
+<entry name="ingres_fetch_array" url="function.ingres-fetch-array.php"/>
+<entry name="ingres_fetch_object" url="function.ingres-fetch-object.php"/>
+<entry name="ingres_fetch_row" url="function.ingres-fetch-row.php"/>
+<entry name="ingres_field_length" url="function.ingres-field-length.php"/>
+<entry name="ingres_field_name" url="function.ingres-field-name.php"/>
+<entry name="ingres_field_nullable" url="function.ingres-field-nullable.php"/>
+<entry name="ingres_field_precision" url="function.ingres-field-precision.php"/>
+<entry name="ingres_field_scale" url="function.ingres-field-scale.php"/>
+<entry name="ingres_field_type" url="function.ingres-field-type.php"/>
+<entry name="ingres_num_fields" url="function.ingres-num-fields.php"/>
+<entry name="ingres_num_rows" url="function.ingres-num-rows.php"/>
+<entry name="ingres_pconnect" url="function.ingres-pconnect.php"/>
+<entry name="ingres_query" url="function.ingres-query.php"/>
+<entry name="ingres_rollback" url="function.ingres-rollback.php"/>
+<entry name="maxdb->affected_rows" url="function.maxdb-affected-rows.php"/>
+<entry name=" maxdb->auto_commit" url="function.maxdb-autocommit.php"/>
+<entry name="maxdb_bind_param" url="function.maxdb-bind-param.php"/>
+<entry name="maxdb_bind_result" url="function.maxdb-bind-result.php"/>
+<entry name="maxdb->change_user" url="function.maxdb-change-user.php"/>
+<entry name="maxdb->character_set_name" url="function.maxdb-character-set-name.php"/>
+<entry name="maxdb_client_encoding" url="function.maxdb-client-encoding.php"/>
+<entry name="maxdb->close_long_data" url="function.maxdb-close-long-data.php"/>
+<entry name="maxdb->close" url="function.maxdb-close.php"/>
+<entry name="maxdb->commit" url="function.maxdb-commit.php"/>
+<entry name="maxdb_connect_errno" url="function.maxdb-connect-errno.php"/>
+<entry name="maxdb_connect_error" url="function.maxdb-connect-error.php"/>
+<entry name="maxdb()" url="function.maxdb-connect.php"/>
+<entry name="result->data_seek" url="function.maxdb-data-seek.php"/>
+<entry name="maxdb_debug" url="function.maxdb-debug.php"/>
+<entry name="maxdb->disable_reads_from_master" url="function.maxdb-disable-reads-from-master.php"/>
+<entry name="maxdb_disable_rpl_parse" url="function.maxdb-disable-rpl-parse.php"/>
+<entry name="maxdb_dump_debug_info" url="function.maxdb-dump-debug-info.php"/>
+<entry name="maxdb_embedded_connect" url="function.maxdb-embedded-connect.php"/>
+<entry name="maxdb_enable_reads_from_master" url="function.maxdb-enable-reads-from-master.php"/>
+<entry name="maxdb_enable_rpl_parse" url="function.maxdb-enable-rpl-parse.php"/>
+<entry name="maxdb->errno" url="function.maxdb-errno.php"/>
+<entry name="maxdb_error" url="function.maxdb-error.php"/>
+<entry name="maxdb_escape_string" url="function.maxdb-escape-string.php"/>
+<entry name="maxdb_execute" url="function.maxdb-execute.php"/>
+<entry name="result->fetch_array" url="function.maxdb-fetch-array.php"/>
+<entry name="maxdb->fetch_assoc" url="function.maxdb-fetch-assoc.php"/>
+<entry name="result->fetch_field_direct" url="function.maxdb-fetch-field-direct.php"/>
+<entry name="result->fetch_field" url="function.maxdb-fetch-field.php"/>
+<entry name="result->fetch_fields" url="function.maxdb-fetch-fields.php"/>
+<entry name="result->lengths" url="function.maxdb-fetch-lengths.php"/>
+<entry name="result->fetch_object" url="function.maxdb-fetch-object.php"/>
+<entry name="result->fetch_row" url="function.maxdb-fetch-row.php"/>
+<entry name="maxdb_fetch" url="function.maxdb-fetch.php"/>
+<entry name="maxdb->field_count" url="function.maxdb-field-count.php"/>
+<entry name="result->field_seek" url="function.maxdb-field-seek.php"/>
+<entry name="result->current_field" url="function.maxdb-field-tell.php"/>
+<entry name="result->free" url="function.maxdb-free-result.php"/>
+<entry name="maxdb_get_client_info" url="function.maxdb-get-client-info.php"/>
+<entry name="maxdb_get_client_version" url="function.maxdb-get-client-version.php"/>
+<entry name="maxdb->get_host_info" url="function.maxdb-get-host-info.php"/>
+<entry name="maxdb_get_metadata" url="function.maxdb-get-metadata.php"/>
+<entry name="maxdb->protocol_version" url="function.maxdb-get-proto-info.php"/>
+<entry name="maxdb->server_info" url="function.maxdb-get-server-info.php"/>
+<entry name="maxdb_get_server_version" url="function.maxdb-get-server-version.php"/>
+<entry name="maxdb->info" url="function.maxdb-info.php"/>
+<entry name="maxdb_init" url="function.maxdb-init.php"/>
+<entry name="maxdb->insert_id" url="function.maxdb-insert-id.php"/>
+<entry name="maxdb->kill" url="function.maxdb-kill.php"/>
+<entry name="maxdb_master_query" url="function.maxdb-master-query.php"/>
+<entry name="maxdb->more_results" url="function.maxdb-more-results.php"/>
+<entry name="maxdb->multi_query" url="function.maxdb-multi-query.php"/>
+<entry name="maxdb->next_result" url="function.maxdb-next-result.php"/>
+<entry name="result->field_count" url="function.maxdb-num-fields.php"/>
+<entry name="maxdb_num_rows" url="function.maxdb-num-rows.php"/>
+<entry name="maxdb->options" url="function.maxdb-options.php"/>
+<entry name="maxdb_param_count" url="function.maxdb-param-count.php"/>
+<entry name="maxdb->ping" url="function.maxdb-ping.php"/>
+<entry name="maxdb->prepare" url="function.maxdb-prepare.php"/>
+<entry name="maxdb->query" url="function.maxdb-query.php"/>
+<entry name="maxdb->real_connect" url="function.maxdb-real-connect.php"/>
+<entry name="maxdb->real_escape_string" url="function.maxdb-real-escape-string.php"/>
+<entry name="maxdb->real_query" url="function.maxdb-real-query.php"/>
+<entry name="maxdb_report" url="function.maxdb-report.php"/>
+<entry name="maxdb->rollback" url="function.maxdb-rollback.php"/>
+<entry name="maxdb_rpl_parse_enabled" url="function.maxdb-rpl-parse-enabled.php"/>
+<entry name="maxdb_rpl_probe" url="function.maxdb-rpl-probe.php"/>
+<entry name="maxdb->rpl_query_type" url="function.maxdb-rpl-query-type.php"/>
+<entry name="maxdb->select_db" url="function.maxdb-select-db.php"/>
+<entry name="maxdb_send_long_data" url="function.maxdb-send-long-data.php"/>
+<entry name="maxdb->send_query" url="function.maxdb-send-query.php"/>
+<entry name="maxdb_server_end" url="function.maxdb-server-end.php"/>
+<entry name="maxdb_server_init" url="function.maxdb-server-init.php"/>
+<entry name="maxdb_set_opt" url="function.maxdb-set-opt.php"/>
+<entry name="maxdb->sqlstate" url="function.maxdb-sqlstate.php"/>
+<entry name="maxdb->ssl_set" url="function.maxdb-ssl-set.php"/>
+<entry name="maxdb->stat" url="function.maxdb-stat.php"/>
+<entry name="maxdb_stmt->affected_rows" url="function.maxdb-stmt-affected-rows.php"/>
+<entry name="stmt->bind_param" url="function.maxdb-stmt-bind-param.php"/>
+<entry name="stmt->bind_result" url="function.maxdb-stmt-bind-result.php"/>
+<entry name="stmt->close_long_data" url="function.maxdb-stmt-close-long-data.php"/>
+<entry name="maxdb_stmt->close" url="function.maxdb-stmt-close.php"/>
+<entry name="stmt->data_seek" url="function.maxdb-stmt-data-seek.php"/>
+<entry name="maxdb_stmt->errno" url="function.maxdb-stmt-errno.php"/>
+<entry name="maxdb_stmt->error" url="function.maxdb-stmt-error.php"/>
+<entry name="stmt->execute" url="function.maxdb-stmt-execute.php"/>
+<entry name="stmt->fetch" url="function.maxdb-stmt-fetch.php"/>
+<entry name="stmt->free_result" url="function.maxdb-stmt-free-result.php"/>
+<entry name="maxdb->stmt_init" url="function.maxdb-stmt-init.php"/>
+<entry name="stmt->num_rows" url="function.maxdb-stmt-num-rows.php"/>
+<entry name="stmt->param_count" url="function.maxdb-stmt-param-count.php"/>
+<entry name="stmt->prepare" url="function.maxdb-stmt-prepare.php"/>
+<entry name="stmt->reset" url="function.maxdb-stmt-reset.php"/>
+<entry name="maxdb_stmt_result_metadata" url="function.maxdb-stmt-result-metadata.php"/>
+<entry name="stmt->send_long_data" url="function.maxdb-stmt-send-long-data.php"/>
+<entry name="maxdb_stmt_sqlstate" url="function.maxdb-stmt-sqlstate.php"/>
+<entry name="maxdb->store_result" url="function.maxdb-store-result.php"/>
+<entry name="maxdb->thread_id" url="function.maxdb-thread-id.php"/>
+<entry name="maxdb_thread_safe" url="function.maxdb-thread-safe.php"/>
+<entry name="maxdb->use_result" url="function.maxdb-use-result.php"/>
+<entry name="maxdb->warning_count" url="function.maxdb-warning-count.php"/>
+<entry name="msql_affected_rows" url="function.msql-affected-rows.php"/>
+<entry name="msql_close" url="function.msql-close.php"/>
+<entry name="msql_connect" url="function.msql-connect.php"/>
+<entry name="msql_create_db" url="function.msql-create-db.php"/>
+<entry name="msql_createdb" url="function.msql-createdb.php"/>
+<entry name="msql_data_seek" url="function.msql-data-seek.php"/>
+<entry name="msql_db_query" url="function.msql-db-query.php"/>
+<entry name="msql_dbname" url="function.msql-dbname.php"/>
+<entry name="msql_drop_db" url="function.msql-drop-db.php"/>
+<entry name="msql_error" url="function.msql-error.php"/>
+<entry name="msql_fetch_array" url="function.msql-fetch-array.php"/>
+<entry name="msql_fetch_field" url="function.msql-fetch-field.php"/>
+<entry name="msql_fetch_object" url="function.msql-fetch-object.php"/>
+<entry name="msql_fetch_row" url="function.msql-fetch-row.php"/>
+<entry name="msql_field_flags" url="function.msql-field-flags.php"/>
+<entry name="msql_field_len" url="function.msql-field-len.php"/>
+<entry name="msql_field_name" url="function.msql-field-name.php"/>
+<entry name="msql_field_seek" url="function.msql-field-seek.php"/>
+<entry name="msql_field_table" url="function.msql-field-table.php"/>
+<entry name="msql_field_type" url="function.msql-field-type.php"/>
+<entry name="msql_fieldflags" url="function.msql-fieldflags.php"/>
+<entry name="msql_fieldlen" url="function.msql-fieldlen.php"/>
+<entry name="msql_fieldname" url="function.msql-fieldname.php"/>
+<entry name="msql_fieldtable" url="function.msql-fieldtable.php"/>
+<entry name="msql_fieldtype" url="function.msql-fieldtype.php"/>
+<entry name="msql_free_result" url="function.msql-free-result.php"/>
+<entry name="msql_list_dbs" url="function.msql-list-dbs.php"/>
+<entry name="msql_list_fields" url="function.msql-list-fields.php"/>
+<entry name="msql_list_tables" url="function.msql-list-tables.php"/>
+<entry name="msql_num_fields" url="function.msql-num-fields.php"/>
+<entry name="msql_num_rows" url="function.msql-num-rows.php"/>
+<entry name="msql_numfields" url="function.msql-numfields.php"/>
+<entry name="msql_numrows" url="function.msql-numrows.php"/>
+<entry name="msql_pconnect" url="function.msql-pconnect.php"/>
+<entry name="msql_query" url="function.msql-query.php"/>
+<entry name="msql_regcase" url="function.msql-regcase.php"/>
+<entry name="msql_result" url="function.msql-result.php"/>
+<entry name="msql_select_db" url="function.msql-select-db.php"/>
+<entry name="msql_tablename" url="function.msql-tablename.php"/>
+<entry name="msql" url="function.msql.php"/>
+<entry name="mssql_bind" url="function.mssql-bind.php"/>
+<entry name="mssql_close" url="function.mssql-close.php"/>
+<entry name="mssql_connect" url="function.mssql-connect.php"/>
+<entry name="mssql_data_seek" url="function.mssql-data-seek.php"/>
+<entry name="mssql_execute" url="function.mssql-execute.php"/>
+<entry name="mssql_fetch_array" url="function.mssql-fetch-array.php"/>
+<entry name="mssql_fetch_assoc" url="function.mssql-fetch-assoc.php"/>
+<entry name="mssql_fetch_batch" url="function.mssql-fetch-batch.php"/>
+<entry name="mssql_fetch_field" url="function.mssql-fetch-field.php"/>
+<entry name="mssql_fetch_object" url="function.mssql-fetch-object.php"/>
+<entry name="mssql_fetch_row" url="function.mssql-fetch-row.php"/>
+<entry name="mssql_field_length" url="function.mssql-field-length.php"/>
+<entry name="mssql_field_name" url="function.mssql-field-name.php"/>
+<entry name="mssql_field_seek" url="function.mssql-field-seek.php"/>
+<entry name="mssql_field_type" url="function.mssql-field-type.php"/>
+<entry name="mssql_free_result" url="function.mssql-free-result.php"/>
+<entry name="mssql_free_statement" url="function.mssql-free-statement.php"/>
+<entry name="mssql_get_last_message" url="function.mssql-get-last-message.php"/>
+<entry name="mssql_guid_string" url="function.mssql-guid-string.php"/>
+<entry name="mssql_init" url="function.mssql-init.php"/>
+<entry name="mssql_min_error_severity" url="function.mssql-min-error-severity.php"/>
+<entry name="mssql_min_message_severity" url="function.mssql-min-message-severity.php"/>
+<entry name="mssql_next_result" url="function.mssql-next-result.php"/>
+<entry name="mssql_num_fields" url="function.mssql-num-fields.php"/>
+<entry name="mssql_num_rows" url="function.mssql-num-rows.php"/>
+<entry name="mssql_pconnect" url="function.mssql-pconnect.php"/>
+<entry name="mssql_query" url="function.mssql-query.php"/>
+<entry name="mssql_result" url="function.mssql-result.php"/>
+<entry name="mssql_rows_affected" url="function.mssql-rows-affected.php"/>
+<entry name="mssql_select_db" url="function.mssql-select-db.php"/>
+<entry name="mysql_affected_rows" url="function.mysql-affected-rows.php"/>
+<entry name="mysql_change_user" url="function.mysql-change-user.php"/>
+<entry name="mysql_client_encoding" url="function.mysql-client-encoding.php"/>
+<entry name="mysql_close" url="function.mysql-close.php"/>
+<entry name="mysql_connect" url="function.mysql-connect.php"/>
+<entry name="mysql_create_db" url="function.mysql-create-db.php"/>
+<entry name="mysql_data_seek" url="function.mysql-data-seek.php"/>
+<entry name="mysql_db_name" url="function.mysql-db-name.php"/>
+<entry name="mysql_db_query" url="function.mysql-db-query.php"/>
+<entry name="mysql_drop_db" url="function.mysql-drop-db.php"/>
+<entry name="mysql_errno" url="function.mysql-errno.php"/>
+<entry name="mysql_error" url="function.mysql-error.php"/>
+<entry name="mysql_escape_string" url="function.mysql-escape-string.php"/>
+<entry name="mysql_fetch_array" url="function.mysql-fetch-array.php"/>
+<entry name="mysql_fetch_assoc" url="function.mysql-fetch-assoc.php"/>
+<entry name="mysql_fetch_field" url="function.mysql-fetch-field.php"/>
+<entry name="mysql_fetch_lengths" url="function.mysql-fetch-lengths.php"/>
+<entry name="mysql_fetch_object" url="function.mysql-fetch-object.php"/>
+<entry name="mysql_fetch_row" url="function.mysql-fetch-row.php"/>
+<entry name="mysql_field_flags" url="function.mysql-field-flags.php"/>
+<entry name="mysql_field_len" url="function.mysql-field-len.php"/>
+<entry name="mysql_field_name" url="function.mysql-field-name.php"/>
+<entry name="mysql_field_seek" url="function.mysql-field-seek.php"/>
+<entry name="mysql_field_table" url="function.mysql-field-table.php"/>
+<entry name="mysql_field_type" url="function.mysql-field-type.php"/>
+<entry name="mysql_free_result" url="function.mysql-free-result.php"/>
+<entry name="mysql_get_client_info" url="function.mysql-get-client-info.php"/>
+<entry name="mysql_get_host_info" url="function.mysql-get-host-info.php"/>
+<entry name="mysql_get_proto_info" url="function.mysql-get-proto-info.php"/>
+<entry name="mysql_get_server_info" url="function.mysql-get-server-info.php"/>
+<entry name="mysql_info" url="function.mysql-info.php"/>
+<entry name="mysql_insert_id" url="function.mysql-insert-id.php"/>
+<entry name="mysql_list_dbs" url="function.mysql-list-dbs.php"/>
+<entry name="mysql_list_fields" url="function.mysql-list-fields.php"/>
+<entry name="mysql_list_processes" url="function.mysql-list-processes.php"/>
+<entry name="mysql_list_tables" url="function.mysql-list-tables.php"/>
+<entry name="mysql_num_fields" url="function.mysql-num-fields.php"/>
+<entry name="mysql_num_rows" url="function.mysql-num-rows.php"/>
+<entry name="mysql_pconnect" url="function.mysql-pconnect.php"/>
+<entry name="mysql_ping" url="function.mysql-ping.php"/>
+<entry name="mysql_query" url="function.mysql-query.php"/>
+<entry name="mysql_real_escape_string" url="function.mysql-real-escape-string.php"/>
+<entry name="mysql_result" url="function.mysql-result.php"/>
+<entry name="mysql_select_db" url="function.mysql-select-db.php"/>
+<entry name="mysql_set_charset" url="function.mysql-set-charset.php"/>
+<entry name="mysql_stat" url="function.mysql-stat.php"/>
+<entry name="mysql_tablename" url="function.mysql-tablename.php"/>
+<entry name="mysql_thread_id" url="function.mysql-thread-id.php"/>
+<entry name="mysql_unbuffered_query" url="function.mysql-unbuffered-query.php"/>
+<entry name="mysqli_affected_rows" url="mysqli.affected-rows.php"/>
+<entry name="mysqli_autocommit" url="mysqli.autocommit.php"/>
+<entry name="mysqli_change_user" url="mysqli.change-user.php"/>
+<entry name="mysqli_character_set_name" url="mysqli.character-set-name.php"/>
+<entry name="mysqli_close" url="mysqli.close.php"/>
+<entry name="mysqli_commit" url="mysqli.commit.php"/>
+<entry name="mysqli_connect_errno" url="mysqli.connect-errno.php"/>
+<entry name="mysqli_connect_error" url="mysqli.connect-error.php"/>
+<entry name="mysqli_connect" url="mysqli.connect.php"/>
+<entry name="mysqli_debug" url="mysqli.debug.php"/>
+<entry name="mysqli_dump_debug_info" url="mysqli.dump-debug-info.php"/>
+<entry name="mysqli_errno" url="mysqli.errno.php"/>
+<entry name="mysqli_error" url="mysqli.error.php"/>
+<entry name="mysqli_field_count" url="mysqli.field-count.php"/>
+<entry name="mysqli_get_charset" url="mysqli.get-charset.php"/>
+<entry name="mysqli_get_client_info" url="mysqli.get-client-info.php"/>
+<entry name="mysqli_get_client_version" url="mysqli.get-client-version.php"/>
+<entry name="mysqli_get_host_info" url="mysqli.get-host-info.php"/>
+<entry name="mysqli_get_proto_info" url="mysqli.get-proto-info.php"/>
+<entry name="mysqli_get_server_info" url="mysqli.get-server-info.php"/>
+<entry name="mysqli_get_server_version" url="mysqli.get-server-version.php"/>
+<entry name="mysqli_get_warnings" url="mysqli.get-warnings.php"/>
+<entry name="mysqli_info" url="mysqli.info.php"/>
+<entry name="mysqli_init" url="mysqli.init.php"/>
+<entry name="mysqli_insert_id" url="mysqli.insert-id.php"/>
+<entry name="mysqli_kill" url="mysqli.kill.php"/>
+<entry name="mysqli_more_results" url="mysqli.more-results.php"/>
+<entry name="mysqli_multi_query" url="mysqli.multi-query.php"/>
+<entry name="mysqli_next_result" url="mysqli.next-result.php"/>
+<entry name="mysqli_options" url="mysqli.options.php"/>
+<entry name="mysqli_ping" url="mysqli.ping.php"/>
+<entry name="mysqli_prepare" url="mysqli.prepare.php"/>
+<entry name="mysqli_query" url="mysqli.query.php"/>
+<entry name="mysqli_real_connect" url="mysqli.real-connect.php"/>
+<entry name="mysqli_real_escape_string" url="mysqli.real-escape-string.php"/>
+<entry name="mysqli_real_query" url="mysqli.real-query.php"/>
+<entry name="mysqli_rollback" url="mysqli.rollback.php"/>
+<entry name="mysqli_select_db" url="mysqli.select-db.php"/>
+<entry name="mysqli_set_charset" url="mysqli.set-charset.php"/>
+<entry name="mysqli_set_local_infile_default" url="mysqli.set-local-infile-default.php"/>
+<entry name="mysqli_set_local_infile_handler" url="mysqli.set-local-infile-handler.php"/>
+<entry name="mysqli_sqlstate" url="mysqli.sqlstate.php"/>
+<entry name="mysqli_ssl_set" url="mysqli.ssl-set.php"/>
+<entry name="mysqli_stat" url="mysqli.stat.php"/>
+<entry name="mysqli_stmt_init" url="mysqli.stmt-init.php"/>
+<entry name="mysqli_store_result" url="mysqli.store-result.php"/>
+<entry name="mysqli_thread_id" url="mysqli.thread-id.php"/>
+<entry name="mysqli_thread_safe" url="mysqli.thread-safe.php"/>
+<entry name="mysqli_use_result" url="mysqli.use-result.php"/>
+<entry name="mysqli_warning_count" url="mysqli.warning-count.php"/>
+<entry name="mysqli_stmt_affected_rows" url="mysqli-stmt.affected-rows.php"/>
+<entry name="mysqli_stmt_attr_get" url="mysqli-stmt.attr-get.php"/>
+<entry name="mysqli_stmt_attr_set" url="mysqli-stmt.attr-set.php"/>
+<entry name="mysqli_stmt_bind_param" url="mysqli-stmt.bind-param.php"/>
+<entry name="mysqli_stmt_bind_result" url="mysqli-stmt.bind-result.php"/>
+<entry name="mysqli_stmt_close" url="mysqli-stmt.close.php"/>
+<entry name="mysqli_stmt_data_seek" url="mysqli-stmt.data-seek.php"/>
+<entry name="mysqli_stmt_errno" url="mysqli-stmt.errno.php"/>
+<entry name="mysqli_stmt_error" url="mysqli-stmt.error.php"/>
+<entry name="mysqli_stmt_execute" url="mysqli-stmt.execute.php"/>
+<entry name="mysqli_stmt_fetch" url="mysqli-stmt.fetch.php"/>
+<entry name="mysqli_stmt_field_count" url="mysqli-stmt.field-count.php"/>
+<entry name="mysqli_stmt_free_result" url="mysqli-stmt.free-result.php"/>
+<entry name="mysqli_stmt_get_warnings" url="mysqli-stmt.get-warnings.php"/>
+<entry name="mysqli_stmt_insert_id" url="mysqli-stmt.insert-id.php"/>
+<entry name="mysqli_stmt_num_rows" url="mysqli-stmt.num-rows.php"/>
+<entry name="mysqli_stmt_param_count" url="mysqli-stmt.param-count.php"/>
+<entry name="mysqli_stmt_prepare" url="mysqli-stmt.prepare.php"/>
+<entry name="mysqli_stmt_reset" url="mysqli-stmt.reset.php"/>
+<entry name="mysqli_stmt_result_metadata" url="mysqli-stmt.result-metadata.php"/>
+<entry name="mysqli_stmt_send_long_data" url="mysqli-stmt.send-long-data.php"/>
+<entry name="mysqli_stmt_sqlstate" url="mysqli-stmt.sqlstate.php"/>
+<entry name="mysqli_stmt_store_result" url="mysqli-stmt.store-result.php"/>
+<entry name="mysqli_field_tell" url="mysqli-result.current-field.php"/>
+<entry name="mysqli_data_seek" url="mysqli-result.data-seek.php"/>
+<entry name="mysqli_fetch_array" url="mysqli-result.fetch-array.php"/>
+<entry name="mysqli_fetch_assoc" url="mysqli-result.fetch-assoc.php"/>
+<entry name="mysqli_fetch_field_direct" url="mysqli-result.fetch-field-direct.php"/>
+<entry name="mysqli_fetch_field" url="mysqli-result.fetch-field.php"/>
+<entry name="mysqli_fetch_fields" url="mysqli-result.fetch-fields.php"/>
+<entry name="mysqli_fetch_object" url="mysqli-result.fetch-object.php"/>
+<entry name="mysqli_fetch_row" url="mysqli-result.fetch-row.php"/>
+<entry name="mysqli_num_fields" url="mysqli-result.field-count.php"/>
+<entry name="mysqli_field_seek" url="mysqli-result.field-seek.php"/>
+<entry name="mysqli_free_result" url="mysqli-result.free.php"/>
+<entry name="mysqli_fetch_lengths" url="mysqli-result.lengths.php"/>
+<entry name="mysqli_num_rows" url="mysqli-result.num-rows.php"/>
+<entry name="mysqli_embedded_server_end" url="mysqli-driver.embedded-server-end.php"/>
+<entry name="mysqli_embedded_server_start" url="mysqli-driver.embedded-server-start.php"/>
+<entry name="mysqli_bind_param" url="function.mysqli-bind-param.php"/>
+<entry name="mysqli_bind_result" url="function.mysqli-bind-result.php"/>
+<entry name="mysqli_client_encoding" url="function.mysqli-client-encoding.php"/>
+<entry name="mysqli->disable_reads_from_master()" url="function.mysqli-disable-reads-from-master.php"/>
+<entry name="mysqli_disable_rpl_parse" url="function.mysqli-disable-rpl-parse.php"/>
+<entry name="mysqli_enable_reads_from_master" url="function.mysqli-enable-reads-from-master.php"/>
+<entry name="mysqli_enable_rpl_parse" url="function.mysqli-enable-rpl-parse.php"/>
+<entry name="mysqli_escape_string" url="function.mysqli-escape-string.php"/>
+<entry name="mysqli_execute" url="function.mysqli-execute.php"/>
+<entry name="mysqli_fetch" url="function.mysqli-fetch.php"/>
+<entry name="mysqli_get_metadata" url="function.mysqli-get-metadata.php"/>
+<entry name="mysqli_master_query" url="function.mysqli-master-query.php"/>
+<entry name="mysqli_param_count" url="function.mysqli-param-count.php"/>
+<entry name="mysqli_report" url="function.mysqli-report.php"/>
+<entry name="mysqli_rpl_parse_enabled" url="function.mysqli-rpl-parse-enabled.php"/>
+<entry name="mysqli_rpl_probe" url="function.mysqli-rpl-probe.php"/>
+<entry name="mysqli->rpl_query_type()" url="function.mysqli-rpl-query-type.php"/>
+<entry name="mysqli_send_long_data" url="function.mysqli-send-long-data.php"/>
+<entry name="mysqli->send_query()" url="function.mysqli-send-query.php"/>
+<entry name="mysqli_set_opt" url="function.mysqli-set-opt.php"/>
+<entry name="mysqli_slave_query" url="function.mysqli-slave-query.php"/>
+<entry name="oci_bind_array_by_name" url="function.oci-bind-array-by-name.php"/>
+<entry name="oci_bind_by_name" url="function.oci-bind-by-name.php"/>
+<entry name="oci_cancel" url="function.oci-cancel.php"/>
+<entry name="oci_close" url="function.oci-close.php"/>
+<entry name="OCI-Collection->append" url="function.oci-collection-append.php"/>
+<entry name="OCI-Collection->assign" url="function.oci-collection-assign.php"/>
+<entry name="OCI-Collection->assignElem" url="function.oci-collection-element-assign.php"/>
+<entry name="OCI-Collection->free" url="function.oci-collection-free.php"/>
+<entry name="OCI-Collection->getElem" url="function.oci-collection-element-get.php"/>
+<entry name="OCI-Collection->max" url="function.oci-collection-max.php"/>
+<entry name="OCI-Collection->size" url="function.oci-collection-size.php"/>
+<entry name="OCI-Collection->trim" url="function.oci-collection-trim.php"/>
+<entry name="oci_commit" url="function.oci-commit.php"/>
+<entry name="oci_connect" url="function.oci-connect.php"/>
+<entry name="oci_define_by_name" url="function.oci-define-by-name.php"/>
+<entry name="oci_error" url="function.oci-error.php"/>
+<entry name="oci_execute" url="function.oci-execute.php"/>
+<entry name="oci_fetch_all" url="function.oci-fetch-all.php"/>
+<entry name="oci_fetch_array" url="function.oci-fetch-array.php"/>
+<entry name="oci_fetch_assoc" url="function.oci-fetch-assoc.php"/>
+<entry name="oci_fetch_object" url="function.oci-fetch-object.php"/>
+<entry name="oci_fetch_row" url="function.oci-fetch-row.php"/>
+<entry name="oci_fetch" url="function.oci-fetch.php"/>
+<entry name="oci_field_is_null" url="function.oci-field-is-null.php"/>
+<entry name="oci_field_name" url="function.oci-field-name.php"/>
+<entry name="oci_field_precision" url="function.oci-field-precision.php"/>
+<entry name="oci_field_scale" url="function.oci-field-scale.php"/>
+<entry name="oci_field_size" url="function.oci-field-size.php"/>
+<entry name="oci_field_type_raw" url="function.oci-field-type-raw.php"/>
+<entry name="oci_field_type" url="function.oci-field-type.php"/>
+<entry name="oci_free_statement" url="function.oci-free-statement.php"/>
+<entry name="oci_internal_debug" url="function.oci-internal-debug.php"/>
+<entry name="OCI-Lob->append" url="function.oci-lob-append.php"/>
+<entry name="OCI-Lob->close" url="function.oci-lob-close.php"/>
+<entry name="oci_lob_copy" url="function.oci-lob-copy.php"/>
+<entry name="OCI-Lob->eof" url="function.oci-lob-eof.php"/>
+<entry name="OCI-Lob->erase" url="function.oci-lob-erase.php"/>
+<entry name="OCI-Lob->export" url="function.oci-lob-export.php"/>
+<entry name="OCI-Lob->flush" url="function.oci-lob-flush.php"/>
+<entry name="OCI-Lob->free" url="function.oci-lob-free.php"/>
+<entry name="OCI-Lob->getBuffering" url="function.oci-lob-getbuffering.php"/>
+<entry name="OCI-Lob->import" url="function.oci-lob-import.php"/>
+<entry name="oci_lob_is_equal" url="function.oci-lob-is-equal.php"/>
+<entry name="OCI-Lob->load" url="function.oci-lob-load.php"/>
+<entry name="OCI-Lob->read" url="function.oci-lob-read.php"/>
+<entry name="OCI-Lob->rewind" url="function.oci-lob-rewind.php"/>
+<entry name="OCI-Lob->save" url="function.oci-lob-save.php"/>
+<entry name="OCI-Lob->saveFile" url="function.oci-lob-savefile.php"/>
+<entry name="OCI-Lob->seek" url="function.oci-lob-seek.php"/>
+<entry name="OCI-Lob->setBuffering" url="function.oci-lob-setbuffering.php"/>
+<entry name="OCI-Lob->size" url="function.oci-lob-size.php"/>
+<entry name="OCI-Lob->tell" url="function.oci-lob-tell.php"/>
+<entry name="OCI-Lob->truncate" url="function.oci-lob-truncate.php"/>
+<entry name="OCI-Lob->write" url="function.oci-lob-write.php"/>
+<entry name="OCI-Lob->writeTemporary" url="function.oci-lob-writetemporary.php"/>
+<entry name="OCI-Lob->writeToFile" url="function.oci-lob-writetofile.php"/>
+<entry name="oci_new_collection" url="function.oci-new-collection.php"/>
+<entry name="oci_new_connect" url="function.oci-new-connect.php"/>
+<entry name="oci_new_cursor" url="function.oci-new-cursor.php"/>
+<entry name="oci_new_descriptor" url="function.oci-new-descriptor.php"/>
+<entry name="oci_num_fields" url="function.oci-num-fields.php"/>
+<entry name="oci_num_rows" url="function.oci-num-rows.php"/>
+<entry name="oci_parse" url="function.oci-parse.php"/>
+<entry name="oci_password_change" url="function.oci-password-change.php"/>
+<entry name="oci_pconnect" url="function.oci-pconnect.php"/>
+<entry name="oci_result" url="function.oci-result.php"/>
+<entry name="oci_rollback" url="function.oci-rollback.php"/>
+<entry name="oci_server_version" url="function.oci-server-version.php"/>
+<entry name="oci_set_prefetch" url="function.oci-set-prefetch.php"/>
+<entry name="oci_statement_type" url="function.oci-statement-type.php"/>
+<entry name="ocibindbyname" url="function.ocibindbyname.php"/>
+<entry name="ocicancel" url="function.ocicancel.php"/>
+<entry name="ocicloselob" url="function.ocicloselob.php"/>
+<entry name="ocicollappend" url="function.ocicollappend.php"/>
+<entry name="ocicollassign" url="function.ocicollassign.php"/>
+<entry name="ocicollassignelem" url="function.ocicollassignelem.php"/>
+<entry name="ocicollgetelem" url="function.ocicollgetelem.php"/>
+<entry name="ocicollmax" url="function.ocicollmax.php"/>
+<entry name="ocicollsize" url="function.ocicollsize.php"/>
+<entry name="ocicolltrim" url="function.ocicolltrim.php"/>
+<entry name="ocicolumnisnull" url="function.ocicolumnisnull.php"/>
+<entry name="ocicolumnname" url="function.ocicolumnname.php"/>
+<entry name="ocicolumnprecision" url="function.ocicolumnprecision.php"/>
+<entry name="ocicolumnscale" url="function.ocicolumnscale.php"/>
+<entry name="ocicolumnsize" url="function.ocicolumnsize.php"/>
+<entry name="ocicolumntype" url="function.ocicolumntype.php"/>
+<entry name="ocicolumntyperaw" url="function.ocicolumntyperaw.php"/>
+<entry name="ocicommit" url="function.ocicommit.php"/>
+<entry name="ocidefinebyname" url="function.ocidefinebyname.php"/>
+<entry name="ocierror" url="function.ocierror.php"/>
+<entry name="ociexecute" url="function.ociexecute.php"/>
+<entry name="ocifetch" url="function.ocifetch.php"/>
+<entry name="ocifetchinto" url="function.ocifetchinto.php"/>
+<entry name="ocifetchstatement" url="function.ocifetchstatement.php"/>
+<entry name="ocifreecollection" url="function.ocifreecollection.php"/>
+<entry name="ocifreecursor" url="function.ocifreecursor.php"/>
+<entry name="ocifreedesc" url="function.ocifreedesc.php"/>
+<entry name="ocifreestatement" url="function.ocifreestatement.php"/>
+<entry name="ociinternaldebug" url="function.ociinternaldebug.php"/>
+<entry name="ociloadlob" url="function.ociloadlob.php"/>
+<entry name="ocilogoff" url="function.ocilogoff.php"/>
+<entry name="ocilogon" url="function.ocilogon.php"/>
+<entry name="ocinewcollection" url="function.ocinewcollection.php"/>
+<entry name="ocinewcursor" url="function.ocinewcursor.php"/>
+<entry name="ocinewdescriptor" url="function.ocinewdescriptor.php"/>
+<entry name="ocinlogon" url="function.ocinlogon.php"/>
+<entry name="ocinumcols" url="function.ocinumcols.php"/>
+<entry name="ociparse" url="function.ociparse.php"/>
+<entry name="ociplogon" url="function.ociplogon.php"/>
+<entry name="ociresult" url="function.ociresult.php"/>
+<entry name="ocirollback" url="function.ocirollback.php"/>
+<entry name="ocirowcount" url="function.ocirowcount.php"/>
+<entry name="ocisavelob" url="function.ocisavelob.php"/>
+<entry name="ocisavelobfile" url="function.ocisavelobfile.php"/>
+<entry name="ociserverversion" url="function.ociserverversion.php"/>
+<entry name="ocisetprefetch" url="function.ocisetprefetch.php"/>
+<entry name="ocistatementtype" url="function.ocistatementtype.php"/>
+<entry name="ociwritelobtofile" url="function.ociwritelobtofile.php"/>
+<entry name="ociwritetemporarylob" url="function.ociwritetemporarylob.php"/>
+<entry name="ovrimos_close" url="function.ovrimos-close.php"/>
+<entry name="ovrimos_commit" url="function.ovrimos-commit.php"/>
+<entry name="ovrimos_connect" url="function.ovrimos-connect.php"/>
+<entry name="ovrimos_cursor" url="function.ovrimos-cursor.php"/>
+<entry name="ovrimos_exec" url="function.ovrimos-exec.php"/>
+<entry name="ovrimos_execute" url="function.ovrimos-execute.php"/>
+<entry name="ovrimos_fetch_into" url="function.ovrimos-fetch-into.php"/>
+<entry name="ovrimos_fetch_row" url="function.ovrimos-fetch-row.php"/>
+<entry name="ovrimos_field_len" url="function.ovrimos-field-len.php"/>
+<entry name="ovrimos_field_name" url="function.ovrimos-field-name.php"/>
+<entry name="ovrimos_field_num" url="function.ovrimos-field-num.php"/>
+<entry name="ovrimos_field_type" url="function.ovrimos-field-type.php"/>
+<entry name="ovrimos_free_result" url="function.ovrimos-free-result.php"/>
+<entry name="ovrimos_longreadlen" url="function.ovrimos-longreadlen.php"/>
+<entry name="ovrimos_num_fields" url="function.ovrimos-num-fields.php"/>
+<entry name="ovrimos_num_rows" url="function.ovrimos-num-rows.php"/>
+<entry name="ovrimos_prepare" url="function.ovrimos-prepare.php"/>
+<entry name="ovrimos_result_all" url="function.ovrimos-result-all.php"/>
+<entry name="ovrimos_result" url="function.ovrimos-result.php"/>
+<entry name="ovrimos_rollback" url="function.ovrimos-rollback.php"/>
+<entry name="px_close" url="function.px-close.php"/>
+<entry name="px_create_fp" url="function.px-create-fp.php"/>
+<entry name="px_date2string" url="function.px-date2string.php"/>
+<entry name="px_delete_record" url="function.px-delete-record.php"/>
+<entry name="px_delete" url="function.px-delete.php"/>
+<entry name="px_get_field" url="function.px-get-field.php"/>
+<entry name="px_get_info" url="function.px-get-info.php"/>
+<entry name="px_get_parameter" url="function.px-get-parameter.php"/>
+<entry name="px_get_record" url="function.px-get-record.php"/>
+<entry name="px_get_schema" url="function.px-get-schema.php"/>
+<entry name="px_get_value" url="function.px-get-value.php"/>
+<entry name="px_insert_record" url="function.px-insert-record.php"/>
+<entry name="px_new" url="function.px-new.php"/>
+<entry name="px_numfields" url="function.px-numfields.php"/>
+<entry name="px_numrecords" url="function.px-numrecords.php"/>
+<entry name="px_open_fp" url="function.px-open-fp.php"/>
+<entry name="px_put_record" url="function.px-put-record.php"/>
+<entry name="px_retrieve_record" url="function.px-retrieve-record.php"/>
+<entry name="px_set_blob_file" url="function.px-set-blob-file.php"/>
+<entry name="px_set_parameter" url="function.px-set-parameter.php"/>
+<entry name="px_set_tablename" url="function.px-set-tablename.php"/>
+<entry name="px_set_targetencoding" url="function.px-set-targetencoding.php"/>
+<entry name="px_set_value" url="function.px-set-value.php"/>
+<entry name="px_timestamp2string" url="function.px-timestamp2string.php"/>
+<entry name="px_update_record" url="function.px-update-record.php"/>
+<entry name="pg_affected_rows" url="function.pg-affected-rows.php"/>
+<entry name="pg_cancel_query" url="function.pg-cancel-query.php"/>
+<entry name="pg_client_encoding" url="function.pg-client-encoding.php"/>
+<entry name="pg_close" url="function.pg-close.php"/>
+<entry name="pg_connect" url="function.pg-connect.php"/>
+<entry name="pg_connection_busy" url="function.pg-connection-busy.php"/>
+<entry name="pg_connection_reset" url="function.pg-connection-reset.php"/>
+<entry name="pg_connection_status" url="function.pg-connection-status.php"/>
+<entry name="pg_convert" url="function.pg-convert.php"/>
+<entry name="pg_copy_from" url="function.pg-copy-from.php"/>
+<entry name="pg_copy_to" url="function.pg-copy-to.php"/>
+<entry name="pg_dbname" url="function.pg-dbname.php"/>
+<entry name="pg_delete" url="function.pg-delete.php"/>
+<entry name="pg_end_copy" url="function.pg-end-copy.php"/>
+<entry name="pg_escape_bytea" url="function.pg-escape-bytea.php"/>
+<entry name="pg_escape_string" url="function.pg-escape-string.php"/>
+<entry name="pg_execute" url="function.pg-execute.php"/>
+<entry name="pg_fetch_all_columns" url="function.pg-fetch-all-columns.php"/>
+<entry name="pg_fetch_all" url="function.pg-fetch-all.php"/>
+<entry name="pg_fetch_array" url="function.pg-fetch-array.php"/>
+<entry name="pg_fetch_assoc" url="function.pg-fetch-assoc.php"/>
+<entry name="pg_fetch_object" url="function.pg-fetch-object.php"/>
+<entry name="pg_fetch_result" url="function.pg-fetch-result.php"/>
+<entry name="pg_fetch_row" url="function.pg-fetch-row.php"/>
+<entry name="pg_field_is_null" url="function.pg-field-is-null.php"/>
+<entry name="pg_field_name" url="function.pg-field-name.php"/>
+<entry name="pg_field_num" url="function.pg-field-num.php"/>
+<entry name="pg_field_prtlen" url="function.pg-field-prtlen.php"/>
+<entry name="pg_field_size" url="function.pg-field-size.php"/>
+<entry name="pg_field_table" url="function.pg-field-table.php"/>
+<entry name="pg_field_type_oid" url="function.pg-field-type-oid.php"/>
+<entry name="pg_field_type" url="function.pg-field-type.php"/>
+<entry name="pg_free_result" url="function.pg-free-result.php"/>
+<entry name="pg_get_notify" url="function.pg-get-notify.php"/>
+<entry name="pg_get_pid" url="function.pg-get-pid.php"/>
+<entry name="pg_get_result" url="function.pg-get-result.php"/>
+<entry name="pg_host" url="function.pg-host.php"/>
+<entry name="pg_insert" url="function.pg-insert.php"/>
+<entry name="pg_last_error" url="function.pg-last-error.php"/>
+<entry name="pg_last_notice" url="function.pg-last-notice.php"/>
+<entry name="pg_last_oid" url="function.pg-last-oid.php"/>
+<entry name="pg_lo_close" url="function.pg-lo-close.php"/>
+<entry name="pg_lo_create" url="function.pg-lo-create.php"/>
+<entry name="pg_lo_export" url="function.pg-lo-export.php"/>
+<entry name="pg_lo_import" url="function.pg-lo-import.php"/>
+<entry name="pg_lo_open" url="function.pg-lo-open.php"/>
+<entry name="pg_lo_read_all" url="function.pg-lo-read-all.php"/>
+<entry name="pg_lo_read" url="function.pg-lo-read.php"/>
+<entry name="pg_lo_seek" url="function.pg-lo-seek.php"/>
+<entry name="pg_lo_tell" url="function.pg-lo-tell.php"/>
+<entry name="pg_lo_unlink" url="function.pg-lo-unlink.php"/>
+<entry name="pg_lo_write" url="function.pg-lo-write.php"/>
+<entry name="pg_meta_data" url="function.pg-meta-data.php"/>
+<entry name="pg_num_fields" url="function.pg-num-fields.php"/>
+<entry name="pg_num_rows" url="function.pg-num-rows.php"/>
+<entry name="pg_options" url="function.pg-options.php"/>
+<entry name="pg_parameter_status" url="function.pg-parameter-status.php"/>
+<entry name="pg_pconnect" url="function.pg-pconnect.php"/>
+<entry name="pg_ping" url="function.pg-ping.php"/>
+<entry name="pg_port" url="function.pg-port.php"/>
+<entry name="pg_prepare" url="function.pg-prepare.php"/>
+<entry name="pg_put_line" url="function.pg-put-line.php"/>
+<entry name="pg_query_params" url="function.pg-query-params.php"/>
+<entry name="pg_query" url="function.pg-query.php"/>
+<entry name="pg_result_error_field" url="function.pg-result-error-field.php"/>
+<entry name="pg_result_error" url="function.pg-result-error.php"/>
+<entry name="pg_result_seek" url="function.pg-result-seek.php"/>
+<entry name="pg_result_status" url="function.pg-result-status.php"/>
+<entry name="pg_select" url="function.pg-select.php"/>
+<entry name="pg_send_execute" url="function.pg-send-execute.php"/>
+<entry name="pg_send_prepare" url="function.pg-send-prepare.php"/>
+<entry name="pg_send_query_params" url="function.pg-send-query-params.php"/>
+<entry name="pg_send_query" url="function.pg-send-query.php"/>
+<entry name="pg_set_client_encoding" url="function.pg-set-client-encoding.php"/>
+<entry name="pg_set_error_verbosity" url="function.pg-set-error-verbosity.php"/>
+<entry name="pg_trace" url="function.pg-trace.php"/>
+<entry name="pg_transaction_status" url="function.pg-transaction-status.php"/>
+<entry name="pg_tty" url="function.pg-tty.php"/>
+<entry name="pg_unescape_bytea" url="function.pg-unescape-bytea.php"/>
+<entry name="pg_untrace" url="function.pg-untrace.php"/>
+<entry name="pg_update" url="function.pg-update.php"/>
+<entry name="pg_version" url="function.pg-version.php"/>
+<entry name="SQLiteDatabase->arrayQuery" url="function.sqlite-array-query.php"/>
+<entry name="SQLiteDatabase->busyTimeout" url="function.sqlite-busy-timeout.php"/>
+<entry name="SQLiteDatabase->changes" url="function.sqlite-changes.php"/>
+<entry name="sqlite_close" url="function.sqlite-close.php"/>
+<entry name="SQLiteUnbuffered->column" url="function.sqlite-column.php"/>
+<entry name="SQLiteDatabase->createAggregate" url="function.sqlite-create-aggregate.php"/>
+<entry name="SQLiteDatabase->createFunction" url="function.sqlite-create-function.php"/>
+<entry name="SQLiteUnbuffered->current" url="function.sqlite-current.php"/>
+<entry name="sqlite_error_string" url="function.sqlite-error-string.php"/>
+<entry name="sqlite_escape_string" url="function.sqlite-escape-string.php"/>
+<entry name="SQLiteDatabase->exec" url="function.sqlite-exec.php"/>
+<entry name="sqlite_factory" url="function.sqlite-factory.php"/>
+<entry name="SQLiteUnbuffered->fetchAll" url="function.sqlite-fetch-all.php"/>
+<entry name="SQLiteUnbuffered->fetch" url="function.sqlite-fetch-array.php"/>
+<entry name="SQLiteDatabase->fetchColumnTypes" url="function.sqlite-fetch-column-types.php"/>
+<entry name="SQLiteUnbuffered->fetchObject" url="function.sqlite-fetch-object.php"/>
+<entry name="SQLiteUnbuffered->fetchSingle" url="function.sqlite-fetch-single.php"/>
+<entry name="sqlite_fetch_string" url="function.sqlite-fetch-string.php"/>
+<entry name="SQLiteUnbuffered->fieldName" url="function.sqlite-field-name.php"/>
+<entry name="sqlite_has_more" url="function.sqlite-has-more.php"/>
+<entry name="SQLiteResult->hasPrev" url="function.sqlite-has-prev.php"/>
+<entry name="SQLiteResult->key" url="function.sqlite-key.php"/>
+<entry name="SQLiteDatabase->lastError" url="function.sqlite-last-error.php"/>
+<entry name="SQLiteDatabase->lastInsertRowid" url="function.sqlite-last-insert-rowid.php"/>
+<entry name="sqlite_libencoding" url="function.sqlite-libencoding.php"/>
+<entry name="sqlite_libversion" url="function.sqlite-libversion.php"/>
+<entry name="SQLiteUnbuffered->next" url="function.sqlite-next.php"/>
+<entry name="SQLiteUnbuffered->numFields" url="function.sqlite-num-fields.php"/>
+<entry name="SQLiteResult->numRows" url="function.sqlite-num-rows.php"/>
+<entry name="sqlite_open" url="function.sqlite-open.php"/>
+<entry name="sqlite_popen" url="function.sqlite-popen.php"/>
+<entry name="SQLiteResult->prev" url="function.sqlite-prev.php"/>
+<entry name="SQLiteDatabase->query" url="function.sqlite-query.php"/>
+<entry name="SQLiteResult->rewind" url="function.sqlite-rewind.php"/>
+<entry name="SQLiteResult->seek" url="function.sqlite-seek.php"/>
+<entry name="SQLiteDatabase->singleQuery" url="function.sqlite-single-query.php"/>
+<entry name="sqlite_udf_decode_binary" url="function.sqlite-udf-decode-binary.php"/>
+<entry name="sqlite_udf_encode_binary" url="function.sqlite-udf-encode-binary.php"/>
+<entry name="SQLiteDatabase->unbufferedQuery" url="function.sqlite-unbuffered-query.php"/>
+<entry name="SQLiteUnbuffered->valid" url="function.sqlite-valid.php"/>
+<entry name="sybase_affected_rows" url="function.sybase-affected-rows.php"/>
+<entry name="sybase_close" url="function.sybase-close.php"/>
+<entry name="sybase_connect" url="function.sybase-connect.php"/>
+<entry name="sybase_data_seek" url="function.sybase-data-seek.php"/>
+<entry name="sybase_deadlock_retry_count" url="function.sybase-deadlock-retry-count.php"/>
+<entry name="sybase_fetch_array" url="function.sybase-fetch-array.php"/>
+<entry name="sybase_fetch_assoc" url="function.sybase-fetch-assoc.php"/>
+<entry name="sybase_fetch_field" url="function.sybase-fetch-field.php"/>
+<entry name="sybase_fetch_object" url="function.sybase-fetch-object.php"/>
+<entry name="sybase_fetch_row" url="function.sybase-fetch-row.php"/>
+<entry name="sybase_field_seek" url="function.sybase-field-seek.php"/>
+<entry name="sybase_free_result" url="function.sybase-free-result.php"/>
+<entry name="sybase_get_last_message" url="function.sybase-get-last-message.php"/>
+<entry name="sybase_min_client_severity" url="function.sybase-min-client-severity.php"/>
+<entry name="sybase_min_error_severity" url="function.sybase-min-error-severity.php"/>
+<entry name="sybase_min_message_severity" url="function.sybase-min-message-severity.php"/>
+<entry name="sybase_min_server_severity" url="function.sybase-min-server-severity.php"/>
+<entry name="sybase_num_fields" url="function.sybase-num-fields.php"/>
+<entry name="sybase_num_rows" url="function.sybase-num-rows.php"/>
+<entry name="sybase_pconnect" url="function.sybase-pconnect.php"/>
+<entry name="sybase_query" url="function.sybase-query.php"/>
+<entry name="sybase_result" url="function.sybase-result.php"/>
+<entry name="sybase_select_db" url="function.sybase-select-db.php"/>
+<entry name="sybase_set_message_handler" url="function.sybase-set-message-handler.php"/>
+<entry name="sybase_unbuffered_query" url="function.sybase-unbuffered-query.php"/>
+<entry name="dio_close" url="function.dio-close.php"/>
+<entry name="dio_fcntl" url="function.dio-fcntl.php"/>
+<entry name="dio_open" url="function.dio-open.php"/>
+<entry name="dio_read" url="function.dio-read.php"/>
+<entry name="dio_seek" url="function.dio-seek.php"/>
+<entry name="dio_stat" url="function.dio-stat.php"/>
+<entry name="dio_tcsetattr" url="function.dio-tcsetattr.php"/>
+<entry name="dio_truncate" url="function.dio-truncate.php"/>
+<entry name="dio_write" url="function.dio-write.php"/>
+<entry name="chdir" url="function.chdir.php"/>
+<entry name="chroot" url="function.chroot.php"/>
+<entry name="dir" url="class.dir.php"/>
+<entry name="closedir" url="function.closedir.php"/>
+<entry name="getcwd" url="function.getcwd.php"/>
+<entry name="opendir" url="function.opendir.php"/>
+<entry name="readdir" url="function.readdir.php"/>
+<entry name="rewinddir" url="function.rewinddir.php"/>
+<entry name="scandir" url="function.scandir.php"/>
+<entry name="finfo_buffer" url="function.finfo-buffer.php"/>
+<entry name="finfo_close" url="function.finfo-close.php"/>
+<entry name="finfo_file" url="function.finfo-file.php"/>
+<entry name="finfo->__construct()" url="function.finfo-open.php"/>
+<entry name="finfo_set_flags" url="function.finfo-set-flags.php"/>
+<entry name="basename" url="function.basename.php"/>
+<entry name="chgrp" url="function.chgrp.php"/>
+<entry name="chmod" url="function.chmod.php"/>
+<entry name="chown" url="function.chown.php"/>
+<entry name="clearstatcache" url="function.clearstatcache.php"/>
+<entry name="copy" url="function.copy.php"/>
+<entry name="delete" url="function.delete.php"/>
+<entry name="dirname" url="function.dirname.php"/>
+<entry name="disk_free_space" url="function.disk-free-space.php"/>
+<entry name="disk_total_space" url="function.disk-total-space.php"/>
+<entry name="diskfreespace" url="function.diskfreespace.php"/>
+<entry name="fclose" url="function.fclose.php"/>
+<entry name="feof" url="function.feof.php"/>
+<entry name="fflush" url="function.fflush.php"/>
+<entry name="fgetc" url="function.fgetc.php"/>
+<entry name="fgetcsv" url="function.fgetcsv.php"/>
+<entry name="fgets" url="function.fgets.php"/>
+<entry name="fgetss" url="function.fgetss.php"/>
+<entry name="file_exists" url="function.file-exists.php"/>
+<entry name="file_get_contents" url="function.file-get-contents.php"/>
+<entry name="file_put_contents" url="function.file-put-contents.php"/>
+<entry name="file" url="function.file.php"/>
+<entry name="fileatime" url="function.fileatime.php"/>
+<entry name="filectime" url="function.filectime.php"/>
+<entry name="filegroup" url="function.filegroup.php"/>
+<entry name="fileinode" url="function.fileinode.php"/>
+<entry name="filemtime" url="function.filemtime.php"/>
+<entry name="fileowner" url="function.fileowner.php"/>
+<entry name="fileperms" url="function.fileperms.php"/>
+<entry name="filesize" url="function.filesize.php"/>
+<entry name="filetype" url="function.filetype.php"/>
+<entry name="flock" url="function.flock.php"/>
+<entry name="fnmatch" url="function.fnmatch.php"/>
+<entry name="fopen" url="function.fopen.php"/>
+<entry name="fpassthru" url="function.fpassthru.php"/>
+<entry name="fputcsv" url="function.fputcsv.php"/>
+<entry name="fputs" url="function.fputs.php"/>
+<entry name="fread" url="function.fread.php"/>
+<entry name="fscanf" url="function.fscanf.php"/>
+<entry name="fseek" url="function.fseek.php"/>
+<entry name="fstat" url="function.fstat.php"/>
+<entry name="ftell" url="function.ftell.php"/>
+<entry name="ftruncate" url="function.ftruncate.php"/>
+<entry name="fwrite" url="function.fwrite.php"/>
+<entry name="glob" url="function.glob.php"/>
+<entry name="is_dir" url="function.is-dir.php"/>
+<entry name="is_executable" url="function.is-executable.php"/>
+<entry name="is_file" url="function.is-file.php"/>
+<entry name="is_link" url="function.is-link.php"/>
+<entry name="is_readable" url="function.is-readable.php"/>
+<entry name="is_uploaded_file" url="function.is-uploaded-file.php"/>
+<entry name="is_writable" url="function.is-writable.php"/>
+<entry name="is_writeable" url="function.is-writeable.php"/>
+<entry name="lchgrp" url="function.lchgrp.php"/>
+<entry name="lchown" url="function.lchown.php"/>
+<entry name="link" url="function.link.php"/>
+<entry name="linkinfo" url="function.linkinfo.php"/>
+<entry name="lstat" url="function.lstat.php"/>
+<entry name="mkdir" url="function.mkdir.php"/>
+<entry name="move_uploaded_file" url="function.move-uploaded-file.php"/>
+<entry name="parse_ini_file" url="function.parse-ini-file.php"/>
+<entry name="pathinfo" url="function.pathinfo.php"/>
+<entry name="pclose" url="function.pclose.php"/>
+<entry name="popen" url="function.popen.php"/>
+<entry name="readfile" url="function.readfile.php"/>
+<entry name="readlink" url="function.readlink.php"/>
+<entry name="realpath" url="function.realpath.php"/>
+<entry name="rename" url="function.rename.php"/>
+<entry name="rewind" url="function.rewind.php"/>
+<entry name="rmdir" url="function.rmdir.php"/>
+<entry name="set_file_buffer" url="function.set-file-buffer.php"/>
+<entry name="stat" url="function.stat.php"/>
+<entry name="symlink" url="function.symlink.php"/>
+<entry name="tempnam" url="function.tempnam.php"/>
+<entry name="tmpfile" url="function.tmpfile.php"/>
+<entry name="touch" url="function.touch.php"/>
+<entry name="umask" url="function.umask.php"/>
+<entry name="unlink" url="function.unlink.php"/>
+<entry name="mime_content_type" url="function.mime-content-type.php"/>
+<entry name="xattr_get" url="function.xattr-get.php"/>
+<entry name="xattr_list" url="function.xattr-list.php"/>
+<entry name="xattr_remove" url="function.xattr-remove.php"/>
+<entry name="xattr_set" url="function.xattr-set.php"/>
+<entry name="xattr_supported" url="function.xattr-supported.php"/>
+<entry name="xdiff_file_diff_binary" url="function.xdiff-file-diff-binary.php"/>
+<entry name="xdiff_file_diff" url="function.xdiff-file-diff.php"/>
+<entry name="xdiff_file_merge3" url="function.xdiff-file-merge3.php"/>
+<entry name="xdiff_file_patch_binary" url="function.xdiff-file-patch-binary.php"/>
+<entry name="xdiff_file_patch" url="function.xdiff-file-patch.php"/>
+<entry name="xdiff_string_diff_binary" url="function.xdiff-string-diff-binary.php"/>
+<entry name="xdiff_string_diff" url="function.xdiff-string-diff.php"/>
+<entry name="xdiff_string_merge3" url="function.xdiff-string-merge3.php"/>
+<entry name="xdiff_string_patch_binary" url="function.xdiff-string-patch-binary.php"/>
+<entry name="xdiff_string_patch" url="function.xdiff-string-patch.php"/>
+<entry name="enchant_broker_describe" url="function.enchant-broker-describe.php"/>
+<entry name="enchant_broker_dict_exists" url="function.enchant-broker-dict-exists.php"/>
+<entry name="enchant_broker_free_dict" url="function.enchant-broker-free-dict.php"/>
+<entry name="enchant_broker_free" url="function.enchant-broker-free.php"/>
+<entry name="enchant_broker_get_error" url="function.enchant-broker-get-error.php"/>
+<entry name="enchant_broker_init" url="function.enchant-broker-init.php"/>
+<entry name="enchant_broker_list_dicts" url="function.enchant-broker-list-dicts.php"/>
+<entry name="enchant_broker_request_dict" url="function.enchant-broker-request-dict.php"/>
+<entry name="enchant_broker_request_pwl_dict" url="function.enchant-broker-request-pwl-dict.php"/>
+<entry name="enchant_broker_set_ordering" url="function.enchant-broker-set-ordering.php"/>
+<entry name="enchant_dict_add_to_personal" url="function.enchant-dict-add-to-personal.php"/>
+<entry name="enchant_dict_add_to_session" url="function.enchant-dict-add-to-session.php"/>
+<entry name="enchant_dict_check" url="function.enchant-dict-check.php"/>
+<entry name="enchant_dict_describe" url="function.enchant-dict-describe.php"/>
+<entry name="enchant_dict_get_error" url="function.enchant-dict-get-error.php"/>
+<entry name="enchant_dict_is_in_session" url="function.enchant-dict-is-in-session.php"/>
+<entry name="enchant_dict_quick_check" url="function.enchant-dict-quick-check.php"/>
+<entry name="enchant_dict_store_replacement" url="function.enchant-dict-store-replacement.php"/>
+<entry name="enchant_dict_suggest" url="function.enchant-dict-suggest.php"/>
+<entry name="fribidi_log2vis" url="function.fribidi-log2vis.php"/>
+<entry name="bind_textdomain_codeset" url="function.bind-textdomain-codeset.php"/>
+<entry name="bindtextdomain" url="function.bindtextdomain.php"/>
+<entry name="dcgettext" url="function.dcgettext.php"/>
+<entry name="dcngettext" url="function.dcngettext.php"/>
+<entry name="dgettext" url="function.dgettext.php"/>
+<entry name="dngettext" url="function.dngettext.php"/>
+<entry name="gettext" url="function.gettext.php"/>
+<entry name="ngettext" url="function.ngettext.php"/>
+<entry name="textdomain" url="function.textdomain.php"/>
+<entry name="locale_get_default" url="locale.getdefault.php"/>
+<entry name="locale_set_default" url="locale.setdefault.php"/>
+<entry name="iconv_get_encoding" url="function.iconv-get-encoding.php"/>
+<entry name="iconv_mime_decode_headers" url="function.iconv-mime-decode-headers.php"/>
+<entry name="iconv_mime_decode" url="function.iconv-mime-decode.php"/>
+<entry name="iconv_mime_encode" url="function.iconv-mime-encode.php"/>
+<entry name="iconv_set_encoding" url="function.iconv-set-encoding.php"/>
+<entry name="iconv_strlen" url="function.iconv-strlen.php"/>
+<entry name="iconv_strpos" url="function.iconv-strpos.php"/>
+<entry name="iconv_strrpos" url="function.iconv-strrpos.php"/>
+<entry name="iconv_substr" url="function.iconv-substr.php"/>
+<entry name="iconv" url="function.iconv.php"/>
+<entry name="ob_iconv_handler" url="function.ob-iconv-handler.php"/>
+<entry name="grapheme_extract" url="function.grapheme-extract.php"/>
+<entry name="grapheme_stripos" url="function.grapheme-stripos.php"/>
+<entry name="grapheme_stristr" url="function.grapheme-stristr.php"/>
+<entry name="grapheme_strlen" url="function.grapheme-strlen.php"/>
+<entry name="grapheme_strpos" url="function.grapheme-strpos.php"/>
+<entry name="grapheme_strripos" url="function.grapheme-strripos.php"/>
+<entry name="grapheme_strrpos" url="function.grapheme-strrpos.php"/>
+<entry name="grapheme_strstr" url="function.grapheme-strstr.php"/>
+<entry name="grapheme_substr" url="function.grapheme-substr.php"/>
+<entry name="intl_error_name" url="function.intl-error-name.php"/>
+<entry name="intl_get_error_code" url="function.intl-get-error-code.php"/>
+<entry name="intl_get_error_message" url="function.intl-get-error-message.php"/>
+<entry name="intl_is_failure" url="function.intl-is-failure.php"/>
+<entry name="collator_asort" url="collator.asort.php"/>
+<entry name="collator_compare" url="collator.compare.php"/>
+<entry name="Collator::__construct" url="collator.construct.php"/>
+<entry name="collator_create" url="collator.create.php"/>
+<entry name="collator_get_attribute" url="collator.getattribute.php"/>
+<entry name="collator_get_error_code" url="collator.geterrorcode.php"/>
+<entry name="collator_get_error_message" url="collator.geterrormessage.php"/>
+<entry name="collator_get_locale" url="collator.getlocale.php"/>
+<entry name="collator_get_strength" url="collator.getstrength.php"/>
+<entry name="collator_set_attribute" url="collator.setattribute.php"/>
+<entry name="collator_set_strength" url="collator.setstrength.php"/>
+<entry name="collator_sort_with_sort_keys" url="collator.sortwithsortkeys.php"/>
+<entry name="collator_sort" url="collator.sort.php"/>
+<entry name="NumberFormatter::__construct" url="numberformatter.create.php"/>
+<entry name="numfmt_format_currency" url="numberformatter.formatcurrency.php"/>
+<entry name="numfmt_format" url="numberformatter.format.php"/>
+<entry name="numfmt_get_attribute" url="numberformatter.getattribute.php"/>
+<entry name="numfmt_get_error_code" url="numberformatter.geterrorcode.php"/>
+<entry name="numfmt_get_error_message" url="numberformatter.geterrormessage.php"/>
+<entry name="numfmt_get_locale" url="numberformatter.getlocale.php"/>
+<entry name="numfmt_get_pattern" url="numberformatter.getpattern.php"/>
+<entry name="numfmt_get_symbol" url="numberformatter.getsymbol.php"/>
+<entry name="numfmt_get_text_attribute" url="numberformatter.gettextattribute.php"/>
+<entry name="numfmt_parse_currency" url="numberformatter.parsecurrency.php"/>
+<entry name="numfmt_parse" url="numberformatter.parse.php"/>
+<entry name="numfmt_set_attribute" url="numberformatter.setattribute.php"/>
+<entry name="numfmt_set_pattern" url="numberformatter.setpattern.php"/>
+<entry name="numfmt_set_symbol" url="numberformatter.setsymbol.php"/>
+<entry name="numfmt_set_text_attribute" url="numberformatter.settextattribute.php"/>
+<entry name="locale_compose_locale" url="locale.composelocale.php"/>
+<entry name="locale_filter_matches" url="locale.filtermatches.php"/>
+<entry name="locale_get_all_variants" url="locale.getallvariants.php"/>
+<entry name="locale_get_display_language" url="locale.getdisplaylanguage.php"/>
+<entry name="locale_get_display_name" url="locale.getdisplayname.php"/>
+<entry name="locale_get_display_region" url="locale.getdisplayregion.php"/>
+<entry name="locale_get_display_script" url="locale.getdisplayscript.php"/>
+<entry name="locale_get_display_variant" url="locale.getdisplayvariant.php"/>
+<entry name="locale_get_keywords" url="locale.getkeywords.php"/>
+<entry name="locale_get_primary_language" url="locale.getprimarylanguage.php"/>
+<entry name="locale_get_region" url="locale.getregion.php"/>
+<entry name="locale_get_script" url="locale.getscript.php"/>
+<entry name="locale_lookup" url="locale.lookup.php"/>
+<entry name="locale_parse_locale" url="locale.parselocale.php"/>
+<entry name="normalizer_is_normalized" url="normalizer.isnormalized.php"/>
+<entry name="normalizer_normalize" url="normalizer.normalize.php"/>
+<entry name="msgfmt_create" url="messageformatter.create.php"/>
+<entry name="msgfmt_format_message" url="messageformatter.formatmessage.php"/>
+<entry name="msgfmt_format" url="messageformatter.format.php"/>
+<entry name="msgfmt_get_error_code" url="messageformatter.geterrorcode.php"/>
+<entry name="msgfmt_get_error_message" url="messageformatter.geterrormessage.php"/>
+<entry name="msgfmt_get_locale" url="messageformatter.getlocale.php"/>
+<entry name="msgfmt_get_pattern" url="messageformatter.getpattern.php"/>
+<entry name="msgfmt_parse_message" url="messageformatter.parsemessage.php"/>
+<entry name="msgfmt_parse" url="messageformatter.parse.php"/>
+<entry name="msgfmt_set_pattern" url="messageformatter.setpattern.php"/>
+<entry name="IntlDateFormatter::__construct" url="intldateformatter.create.php"/>
+<entry name="datefmt_format" url="intldateformatter.format.php"/>
+<entry name="datefmt_get_calendar" url="intldateformatter.getcalendar.php"/>
+<entry name="datefmt_get_datetype" url="intldateformatter.getdatetype.php"/>
+<entry name="datefmt_get_error_code" url="intldateformatter.geterrorcode.php"/>
+<entry name="datefmt_get_error_message" url="intldateformatter.geterrormessage.php"/>
+<entry name="datefmt_get_locale" url="intldateformatter.getlocale.php"/>
+<entry name="datefmt_get_pattern" url="intldateformatter.getpattern.php"/>
+<entry name="datefmt_get_timetype" url="intldateformatter.gettimetype.php"/>
+<entry name="datefmt_get_timezone_id" url="intldateformatter.gettimezoneid.php"/>
+<entry name="datefmt_is_lenient" url="intldateformatter.islenient.php"/>
+<entry name="datefmt_localtime" url="intldateformatter.localtime.php"/>
+<entry name="datefmt_parse" url="intldateformatter.parse.php"/>
+<entry name="datefmt_set_calendar" url="intldateformatter.setcalendar.php"/>
+<entry name="datefmt_set_lenient" url="intldateformatter.setlenient.php"/>
+<entry name="datefmt_set_pattern" url="intldateformatter.setpattern.php"/>
+<entry name="datefmt_set_timezone_id" url="intldateformatter.settimezoneid.php"/>
+<entry name="mb_check_encoding" url="function.mb-check-encoding.php"/>
+<entry name="mb_convert_case" url="function.mb-convert-case.php"/>
+<entry name="mb_convert_encoding" url="function.mb-convert-encoding.php"/>
+<entry name="mb_convert_kana" url="function.mb-convert-kana.php"/>
+<entry name="mb_convert_variables" url="function.mb-convert-variables.php"/>
+<entry name="mb_decode_mimeheader" url="function.mb-decode-mimeheader.php"/>
+<entry name="mb_decode_numericentity" url="function.mb-decode-numericentity.php"/>
+<entry name="mb_detect_encoding" url="function.mb-detect-encoding.php"/>
+<entry name="mb_detect_order" url="function.mb-detect-order.php"/>
+<entry name="mb_encode_mimeheader" url="function.mb-encode-mimeheader.php"/>
+<entry name="mb_encode_numericentity" url="function.mb-encode-numericentity.php"/>
+<entry name="mb_ereg_match" url="function.mb-ereg-match.php"/>
+<entry name="mb_ereg_replace" url="function.mb-ereg-replace.php"/>
+<entry name="mb_ereg_search_getpos" url="function.mb-ereg-search-getpos.php"/>
+<entry name="mb_ereg_search_getregs" url="function.mb-ereg-search-getregs.php"/>
+<entry name="mb_ereg_search_init" url="function.mb-ereg-search-init.php"/>
+<entry name="mb_ereg_search_pos" url="function.mb-ereg-search-pos.php"/>
+<entry name="mb_ereg_search_regs" url="function.mb-ereg-search-regs.php"/>
+<entry name="mb_ereg_search_setpos" url="function.mb-ereg-search-setpos.php"/>
+<entry name="mb_ereg_search" url="function.mb-ereg-search.php"/>
+<entry name="mb_ereg" url="function.mb-ereg.php"/>
+<entry name="mb_eregi_replace" url="function.mb-eregi-replace.php"/>
+<entry name="mb_eregi" url="function.mb-eregi.php"/>
+<entry name="mb_get_info" url="function.mb-get-info.php"/>
+<entry name="mb_http_input" url="function.mb-http-input.php"/>
+<entry name="mb_http_output" url="function.mb-http-output.php"/>
+<entry name="mb_internal_encoding" url="function.mb-internal-encoding.php"/>
+<entry name="mb_language" url="function.mb-language.php"/>
+<entry name="mb_list_encodings" url="function.mb-list-encodings.php"/>
+<entry name="mb_output_handler" url="function.mb-output-handler.php"/>
+<entry name="mb_parse_str" url="function.mb-parse-str.php"/>
+<entry name="mb_preferred_mime_name" url="function.mb-preferred-mime-name.php"/>
+<entry name="mb_regex_encoding" url="function.mb-regex-encoding.php"/>
+<entry name="mb_regex_set_options" url="function.mb-regex-set-options.php"/>
+<entry name="mb_send_mail" url="function.mb-send-mail.php"/>
+<entry name="mb_split" url="function.mb-split.php"/>
+<entry name="mb_strcut" url="function.mb-strcut.php"/>
+<entry name="mb_strimwidth" url="function.mb-strimwidth.php"/>
+<entry name="mb_stripos" url="function.mb-stripos.php"/>
+<entry name="mb_stristr" url="function.mb-stristr.php"/>
+<entry name="mb_strlen" url="function.mb-strlen.php"/>
+<entry name="mb_strpos" url="function.mb-strpos.php"/>
+<entry name="mb_strrchr" url="function.mb-strrchr.php"/>
+<entry name="mb_strrichr" url="function.mb-strrichr.php"/>
+<entry name="mb_strripos" url="function.mb-strripos.php"/>
+<entry name="mb_strrpos" url="function.mb-strrpos.php"/>
+<entry name="mb_strstr" url="function.mb-strstr.php"/>
+<entry name="mb_strtolower" url="function.mb-strtolower.php"/>
+<entry name="mb_strtoupper" url="function.mb-strtoupper.php"/>
+<entry name="mb_strwidth" url="function.mb-strwidth.php"/>
+<entry name="mb_substitute_character" url="function.mb-substitute-character.php"/>
+<entry name="mb_substr_count" url="function.mb-substr-count.php"/>
+<entry name="mb_substr" url="function.mb-substr.php"/>
+<entry name="pspell_add_to_personal" url="function.pspell-add-to-personal.php"/>
+<entry name="pspell_add_to_session" url="function.pspell-add-to-session.php"/>
+<entry name="pspell_check" url="function.pspell-check.php"/>
+<entry name="pspell_clear_session" url="function.pspell-clear-session.php"/>
+<entry name="pspell_config_create" url="function.pspell-config-create.php"/>
+<entry name="pspell_config_data_dir" url="function.pspell-config-data-dir.php"/>
+<entry name="pspell_config_dict_dir" url="function.pspell-config-dict-dir.php"/>
+<entry name="pspell_config_ignore" url="function.pspell-config-ignore.php"/>
+<entry name="pspell_config_mode" url="function.pspell-config-mode.php"/>
+<entry name="pspell_config_personal" url="function.pspell-config-personal.php"/>
+<entry name="pspell_config_repl" url="function.pspell-config-repl.php"/>
+<entry name="pspell_config_runtogether" url="function.pspell-config-runtogether.php"/>
+<entry name="pspell_config_save_repl" url="function.pspell-config-save-repl.php"/>
+<entry name="pspell_new_config" url="function.pspell-new-config.php"/>
+<entry name="pspell_new_personal" url="function.pspell-new-personal.php"/>
+<entry name="pspell_new" url="function.pspell-new.php"/>
+<entry name="pspell_save_wordlist" url="function.pspell-save-wordlist.php"/>
+<entry name="pspell_store_replacement" url="function.pspell-store-replacement.php"/>
+<entry name="pspell_suggest" url="function.pspell-suggest.php"/>
+<entry name="recode_file" url="function.recode-file.php"/>
+<entry name="recode_string" url="function.recode-string.php"/>
+<entry name="recode" url="function.recode.php"/>
+<entry name="unicode_decode" url="function.unicode-decode.php"/>
+<entry name="unicode_encode" url="function.unicode-encode.php"/>
+<entry name="unicode_get_error_mode" url="function.unicode-get-error-mode.php"/>
+<entry name="unicode_get_subst_char" url="function.unicode-get-subst-char.php"/>
+<entry name="unicode_set_error_mode" url="function.unicode-set-error-mode.php"/>
+<entry name="unicode_set_subst_char" url="function.unicode-set-subst-char.php"/>
+<entry name="exif_imagetype" url="function.exif-imagetype.php"/>
+<entry name="exif_read_data" url="function.exif-read-data.php"/>
+<entry name="exif_tagname" url="function.exif-tagname.php"/>
+<entry name="exif_thumbnail" url="function.exif-thumbnail.php"/>
+<entry name="read_exif_data" url="function.read-exif-data.php"/>
+<entry name="gd_info" url="function.gd-info.php"/>
+<entry name="getimagesize" url="function.getimagesize.php"/>
+<entry name="image_type_to_extension" url="function.image-type-to-extension.php"/>
+<entry name="image_type_to_mime_type" url="function.image-type-to-mime-type.php"/>
+<entry name="image2wbmp" url="function.image2wbmp.php"/>
+<entry name="imagealphablending" url="function.imagealphablending.php"/>
+<entry name="imageantialias" url="function.imageantialias.php"/>
+<entry name="imagearc" url="function.imagearc.php"/>
+<entry name="imagechar" url="function.imagechar.php"/>
+<entry name="imagecharup" url="function.imagecharup.php"/>
+<entry name="imagecolorallocate" url="function.imagecolorallocate.php"/>
+<entry name="imagecolorallocatealpha" url="function.imagecolorallocatealpha.php"/>
+<entry name="imagecolorat" url="function.imagecolorat.php"/>
+<entry name="imagecolorclosest" url="function.imagecolorclosest.php"/>
+<entry name="imagecolorclosestalpha" url="function.imagecolorclosestalpha.php"/>
+<entry name="imagecolorclosesthwb" url="function.imagecolorclosesthwb.php"/>
+<entry name="imagecolordeallocate" url="function.imagecolordeallocate.php"/>
+<entry name="imagecolorexact" url="function.imagecolorexact.php"/>
+<entry name="imagecolorexactalpha" url="function.imagecolorexactalpha.php"/>
+<entry name="imagecolormatch" url="function.imagecolormatch.php"/>
+<entry name="imagecolorresolve" url="function.imagecolorresolve.php"/>
+<entry name="imagecolorresolvealpha" url="function.imagecolorresolvealpha.php"/>
+<entry name="imagecolorset" url="function.imagecolorset.php"/>
+<entry name="imagecolorsforindex" url="function.imagecolorsforindex.php"/>
+<entry name="imagecolorstotal" url="function.imagecolorstotal.php"/>
+<entry name="imagecolortransparent" url="function.imagecolortransparent.php"/>
+<entry name="imageconvolution" url="function.imageconvolution.php"/>
+<entry name="imagecopy" url="function.imagecopy.php"/>
+<entry name="imagecopymerge" url="function.imagecopymerge.php"/>
+<entry name="imagecopymergegray" url="function.imagecopymergegray.php"/>
+<entry name="imagecopyresampled" url="function.imagecopyresampled.php"/>
+<entry name="imagecopyresized" url="function.imagecopyresized.php"/>
+<entry name="imagecreate" url="function.imagecreate.php"/>
+<entry name="imagecreatefromgd2" url="function.imagecreatefromgd2.php"/>
+<entry name="imagecreatefromgd2part" url="function.imagecreatefromgd2part.php"/>
+<entry name="imagecreatefromgd" url="function.imagecreatefromgd.php"/>
+<entry name="imagecreatefromgif" url="function.imagecreatefromgif.php"/>
+<entry name="imagecreatefromjpeg" url="function.imagecreatefromjpeg.php"/>
+<entry name="imagecreatefrompng" url="function.imagecreatefrompng.php"/>
+<entry name="imagecreatefromstring" url="function.imagecreatefromstring.php"/>
+<entry name="imagecreatefromwbmp" url="function.imagecreatefromwbmp.php"/>
+<entry name="imagecreatefromxbm" url="function.imagecreatefromxbm.php"/>
+<entry name="imagecreatefromxpm" url="function.imagecreatefromxpm.php"/>
+<entry name="imagecreatetruecolor" url="function.imagecreatetruecolor.php"/>
+<entry name="imagedashedline" url="function.imagedashedline.php"/>
+<entry name="imagedestroy" url="function.imagedestroy.php"/>
+<entry name="imageellipse" url="function.imageellipse.php"/>
+<entry name="imagefill" url="function.imagefill.php"/>
+<entry name="imagefilledarc" url="function.imagefilledarc.php"/>
+<entry name="imagefilledellipse" url="function.imagefilledellipse.php"/>
+<entry name="imagefilledpolygon" url="function.imagefilledpolygon.php"/>
+<entry name="imagefilledrectangle" url="function.imagefilledrectangle.php"/>
+<entry name="imagefilltoborder" url="function.imagefilltoborder.php"/>
+<entry name="imagefilter" url="function.imagefilter.php"/>
+<entry name="imagefontheight" url="function.imagefontheight.php"/>
+<entry name="imagefontwidth" url="function.imagefontwidth.php"/>
+<entry name="imageftbbox" url="function.imageftbbox.php"/>
+<entry name="imagefttext" url="function.imagefttext.php"/>
+<entry name="imagegammacorrect" url="function.imagegammacorrect.php"/>
+<entry name="imagegd2" url="function.imagegd2.php"/>
+<entry name="imagegd" url="function.imagegd.php"/>
+<entry name="imagegif" url="function.imagegif.php"/>
+<entry name="imagegrabscreen" url="function.imagegrabscreen.php"/>
+<entry name="imagegrabwindow" url="function.imagegrabwindow.php"/>
+<entry name="imageinterlace" url="function.imageinterlace.php"/>
+<entry name="imageistruecolor" url="function.imageistruecolor.php"/>
+<entry name="imagejpeg" url="function.imagejpeg.php"/>
+<entry name="imagelayereffect" url="function.imagelayereffect.php"/>
+<entry name="imageline" url="function.imageline.php"/>
+<entry name="imageloadfont" url="function.imageloadfont.php"/>
+<entry name="imagepalettecopy" url="function.imagepalettecopy.php"/>
+<entry name="imagepng" url="function.imagepng.php"/>
+<entry name="imagepolygon" url="function.imagepolygon.php"/>
+<entry name="imagepsbbox" url="function.imagepsbbox.php"/>
+<entry name="imagepsencodefont" url="function.imagepsencodefont.php"/>
+<entry name="imagepsextendfont" url="function.imagepsextendfont.php"/>
+<entry name="imagepsfreefont" url="function.imagepsfreefont.php"/>
+<entry name="imagepsloadfont" url="function.imagepsloadfont.php"/>
+<entry name="imagepsslantfont" url="function.imagepsslantfont.php"/>
+<entry name="imagepstext" url="function.imagepstext.php"/>
+<entry name="imagerectangle" url="function.imagerectangle.php"/>
+<entry name="imagerotate" url="function.imagerotate.php"/>
+<entry name="imagesavealpha" url="function.imagesavealpha.php"/>
+<entry name="imagesetbrush" url="function.imagesetbrush.php"/>
+<entry name="imagesetpixel" url="function.imagesetpixel.php"/>
+<entry name="imagesetstyle" url="function.imagesetstyle.php"/>
+<entry name="imagesetthickness" url="function.imagesetthickness.php"/>
+<entry name="imagesettile" url="function.imagesettile.php"/>
+<entry name="imagestring" url="function.imagestring.php"/>
+<entry name="imagestringup" url="function.imagestringup.php"/>
+<entry name="imagesx" url="function.imagesx.php"/>
+<entry name="imagesy" url="function.imagesy.php"/>
+<entry name="imagetruecolortopalette" url="function.imagetruecolortopalette.php"/>
+<entry name="imagettfbbox" url="function.imagettfbbox.php"/>
+<entry name="imagettftext" url="function.imagettftext.php"/>
+<entry name="imagetypes" url="function.imagetypes.php"/>
+<entry name="imagewbmp" url="function.imagewbmp.php"/>
+<entry name="imagexbm" url="function.imagexbm.php"/>
+<entry name="iptcembed" url="function.iptcembed.php"/>
+<entry name="iptcparse" url="function.iptcparse.php"/>
+<entry name="jpeg2wbmp" url="function.jpeg2wbmp.php"/>
+<entry name="png2wbmp" url="function.png2wbmp.php"/>
+<entry name="Imagick::adaptiveBlurImage" url="function.imagick-adaptiveblurimage.php"/>
+<entry name="Imagick::adaptiveResizeImage" url="function.imagick-adaptiveresizeimage.php"/>
+<entry name="Imagick::adaptiveSharpenImage" url="function.imagick-adaptivesharpenimage.php"/>
+<entry name="Imagick::adaptiveThresholdImage" url="function.imagick-adaptivethresholdimage.php"/>
+<entry name="Imagick::addImage" url="function.imagick-addimage.php"/>
+<entry name="Imagick::addNoiseImage" url="function.imagick-addnoiseimage.php"/>
+<entry name="Imagick::affineTransformImage" url="function.imagick-affinetransformimage.php"/>
+<entry name="Imagick::annotateImage" url="function.imagick-annotateimage.php"/>
+<entry name="Imagick::appendImages" url="function.imagick-appendimages.php"/>
+<entry name="Imagick::averageImages" url="function.imagick-averageimages.php"/>
+<entry name="Imagick::blackThresholdImage" url="function.imagick-blackthresholdimage.php"/>
+<entry name="Imagick::blurImage" url="function.imagick-blurimage.php"/>
+<entry name="Imagick::borderImage" url="function.imagick-borderimage.php"/>
+<entry name="Imagick::charcoalImage" url="function.imagick-charcoalimage.php"/>
+<entry name="Imagick::chopImage" url="function.imagick-chopimage.php"/>
+<entry name="Imagick::clear" url="function.imagick-clear.php"/>
+<entry name="Imagick::clipImage" url="function.imagick-clipimage.php"/>
+<entry name="Imagick::clipPathImage" url="function.imagick-clippathimage.php"/>
+<entry name="Imagick::clone" url="function.imagick-clone.php"/>
+<entry name="Imagick::clutImage" url="function.imagick-clutimage.php"/>
+<entry name="Imagick::coalesceImages" url="function.imagick-coalesceimages.php"/>
+<entry name="Imagick::colorFloodfillImage" url="function.imagick-paintfloodfillimage.php"/>
+<entry name="Imagick::colorizeImage" url="function.imagick-colorizeimage.php"/>
+<entry name="Imagick::combineImages" url="function.imagick-combineimages.php"/>
+<entry name="Imagick::commentImage" url="function.imagick-commentimage.php"/>
+<entry name="Imagick::compareImageChannels" url="function.imagick-compareimagechannels.php"/>
+<entry name="Imagick::compareImageLayers" url="function.imagick-compareimagelayers.php"/>
+<entry name="Imagick::compareImages" url="function.imagick-compareimages.php"/>
+<entry name="Imagick::compositeImage" url="function.imagick-compositeimage.php"/>
+<entry name="Imagick::__construct" url="function.imagick-construct.php"/>
+<entry name="Imagick::contrastImage" url="function.imagick-contrastimage.php"/>
+<entry name="Imagick::contrastStretchImage" url="function.imagick-contraststretchimage.php"/>
+<entry name="Imagick::convolveImage" url="function.imagick-convolveimage.php"/>
+<entry name="Imagick::cropImage" url="function.imagick-cropimage.php"/>
+<entry name="Imagick::cropThumbnailImage" url="function.imagick-cropthumbnailimage.php"/>
+<entry name="Imagick::current" url="function.imagick-current.php"/>
+<entry name="Imagick::cycleColormapImage" url="function.imagick-cyclecolormapimage.php"/>
+<entry name="Imagick::deconstructImages" url="function.imagick-deconstructimages.php"/>
+<entry name="Imagick::despeckleImage" url="function.imagick-despeckleimage.php"/>
+<entry name="Imagick::destroy" url="function.imagick-destroy.php"/>
+<entry name="Imagick::displayImage" url="function.imagick-displayimage.php"/>
+<entry name="Imagick::displayImages" url="function.imagick-displayimages.php"/>
+<entry name="Imagick::distortImage" url="function.imagick-distortimage.php"/>
+<entry name="Imagick::drawImage" url="function.imagick-drawimage.php"/>
+<entry name="Imagick::edgeImage" url="function.imagick-edgeimage.php"/>
+<entry name="Imagick::embossImage" url="function.imagick-embossimage.php"/>
+<entry name="Imagick::enhanceImage" url="function.imagick-enhanceimage.php"/>
+<entry name="Imagick::equalizeImage" url="function.imagick-equalizeimage.php"/>
+<entry name="Imagick::evaluateImage" url="function.imagick-evaluateimage.php"/>
+<entry name="Imagick::flattenImages" url="function.imagick-flattenimages.php"/>
+<entry name="Imagick::flipImage" url="function.imagick-flipimage.php"/>
+<entry name="Imagick::flopImage" url="function.imagick-flopimage.php"/>
+<entry name="Imagick::frameImage" url="function.imagick-frameimage.php"/>
+<entry name="Imagick::fxImage" url="function.imagick-fximage.php"/>
+<entry name="Imagick::gammaImage" url="function.imagick-gammaimage.php"/>
+<entry name="Imagick::gaussianBlurImage" url="function.imagick-gaussianblurimage.php"/>
+<entry name="Imagick::getCompression" url="function.imagick-getcompression.php"/>
+<entry name="Imagick::getCompressionQuality" url="function.imagick-getcompressionquality.php"/>
+<entry name="Imagick::getCopyright" url="function.imagick-getcopyright.php"/>
+<entry name="Imagick::getFilename" url="function.imagick-getfilename.php"/>
+<entry name="Imagick::getFormat" url="function.imagick-getformat.php"/>
+<entry name="Imagick::getHomeURL" url="function.imagick-gethomeurl.php"/>
+<entry name="Imagick::getImage" url="function.imagick-getimage.php"/>
+<entry name="Imagick::getImageBackgroundColor" url="function.imagick-getimagebackgroundcolor.php"/>
+<entry name="Imagick::getImageBlob" url="function.imagick-getimageblob.php"/>
+<entry name="Imagick::getImageBluePrimary" url="function.imagick-getimageblueprimary.php"/>
+<entry name="Imagick::getImageBorderColor" url="function.imagick-getimagebordercolor.php"/>
+<entry name="Imagick::getImageChannelDepth" url="function.imagick-getimagechanneldepth.php"/>
+<entry name="Imagick::getImageChannelDistortion" url="function.imagick-getimagechanneldistortion.php"/>
+<entry name="Imagick::getImageChannelExtrema" url="function.imagick-getimagechannelextrema.php"/>
+<entry name="Imagick::getImageChannelMean" url="function.imagick-getimagechannelmean.php"/>
+<entry name="Imagick::getImageChannelStatistics" url="function.imagick-getimagechannelstatistics.php"/>
+<entry name="Imagick::getImageColormapColor" url="function.imagick-getimagecolormapcolor.php"/>
+<entry name="Imagick::getImageColors" url="function.imagick-getimagecolors.php"/>
+<entry name="Imagick::getImageColorspace" url="function.imagick-getimagecolorspace.php"/>
+<entry name="Imagick::getImageCompose" url="function.imagick-getimagecompose.php"/>
+<entry name="Imagick::getImageDelay" url="function.imagick-getimagedelay.php"/>
+<entry name="Imagick::getImageDepth" url="function.imagick-getimagedepth.php"/>
+<entry name="Imagick::getImageDispose" url="function.imagick-getimagedispose.php"/>
+<entry name="Imagick::getImageDistortion" url="function.imagick-getimagedistortion.php"/>
+<entry name="Imagick::getImageExtrema" url="function.imagick-getimageextrema.php"/>
+<entry name="Imagick::getImageFilename" url="function.imagick-getimagefilename.php"/>
+<entry name="Imagick::getImageFormat" url="function.imagick-getimageformat.php"/>
+<entry name="Imagick::getImageGamma" url="function.imagick-getimagegamma.php"/>
+<entry name="Imagick::getImageGeometry" url="function.imagick-getimagegeometry.php"/>
+<entry name="Imagick::getImageGreenPrimary" url="function.imagick-getimagegreenprimary.php"/>
+<entry name="Imagick::getImageHeight" url="function.imagick-getimageheight.php"/>
+<entry name="Imagick::getImageHistogram" url="function.imagick-getimagehistogram.php"/>
+<entry name="Imagick::getImageIndex" url="function.imagick-getimageindex.php"/>
+<entry name="Imagick::getImageInterlaceScheme" url="function.imagick-getimageinterlacescheme.php"/>
+<entry name="Imagick::getImageInterpolateMethod" url="function.imagick-getimageinterpolatemethod.php"/>
+<entry name="Imagick::getImageIterations" url="function.imagick-getimageiterations.php"/>
+<entry name="Imagick::getImageLength" url="function.imagick-getimagelength.php"/>
+<entry name="Imagick::getImageMagickLicense" url="function.imagick-getimagemagicklicense.php"/>
+<entry name="Imagick::getImageMatte" url="function.imagick-getimagematte.php"/>
+<entry name="Imagick::getImageMatteColor" url="function.imagick-getimagemattecolor.php"/>
+<entry name="Imagick::getImageOrientation" url="function.imagick-getimageorientation.php"/>
+<entry name="Imagick::getImagePage" url="function.imagick-getimagepage.php"/>
+<entry name="Imagick::getImagePixelColor" url="function.imagick-getimagepixelcolor.php"/>
+<entry name="Imagick::getImageProfile" url="function.imagick-getimageprofile.php"/>
+<entry name="Imagick::getImageProfiles" url="function.imagick-getimageprofiles.php"/>
+<entry name="Imagick::getImageProperties" url="function.imagick-getimageproperties.php"/>
+<entry name="Imagick::getImageProperty" url="function.imagick-getimageproperty.php"/>
+<entry name="Imagick::getImageRedPrimary" url="function.imagick-getimageredprimary.php"/>
+<entry name="Imagick::getImageRegion" url="function.imagick-getimageregion.php"/>
+<entry name="Imagick::getImageRenderingIntent" url="function.imagick-getimagerenderingintent.php"/>
+<entry name="Imagick::getImageResolution" url="function.imagick-getimageresolution.php"/>
+<entry name="Imagick::getImageScene" url="function.imagick-getimagescene.php"/>
+<entry name="Imagick::getImageSignature" url="function.imagick-getimagesignature.php"/>
+<entry name="Imagick::getImageSize" url="function.imagick-getimagesize.php"/>
+<entry name="Imagick::getImageTicksPerSecond" url="function.imagick-getimagetickspersecond.php"/>
+<entry name="Imagick::getImageTotalInkDensity" url="function.imagick-getimagetotalinkdensity.php"/>
+<entry name="Imagick::getImageType" url="function.imagick-getimagetype.php"/>
+<entry name="Imagick::getImageUnits" url="function.imagick-getimageunits.php"/>
+<entry name="Imagick::getImageVirtualPixelMethod" url="function.imagick-getimagevirtualpixelmethod.php"/>
+<entry name="Imagick::getImageWhitePoint" url="function.imagick-getimagewhitepoint.php"/>
+<entry name="Imagick::getImageWidth" url="function.imagick-getimagewidth.php"/>
+<entry name="Imagick::getInterlaceScheme" url="function.imagick-getinterlacescheme.php"/>
+<entry name="Imagick::getIteratorIndex" url="function.imagick-getiteratorindex.php"/>
+<entry name="Imagick::getNumberImages" url="function.imagick-getnumberimages.php"/>
+<entry name="Imagick::getOption" url="function.imagick-getoption.php"/>
+<entry name="Imagick::getPackageName" url="function.imagick-getpackagename.php"/>
+<entry name="Imagick::getPage" url="function.imagick-getpage.php"/>
+<entry name="Imagick::getPixelIterator" url="function.imagick-getpixeliterator.php"/>
+<entry name="Imagick::getPixelRegionIterator" url="function.imagick-getpixelregioniterator.php"/>
+<entry name="Imagick::getQuantumDepth" url="function.imagick-getquantumdepth.php"/>
+<entry name="Imagick::getQuantumRange" url="function.imagick-getquantumrange.php"/>
+<entry name="Imagick::getReleaseDate" url="function.imagick-getreleasedate.php"/>
+<entry name="Imagick::getResource" url="function.imagick-getresource.php"/>
+<entry name="Imagick::getResourceLimit" url="function.imagick-getresourcelimit.php"/>
+<entry name="Imagick::getSamplingFactors" url="function.imagick-getsamplingfactors.php"/>
+<entry name="Imagick::getSize" url="function.imagick-getsize.php"/>
+<entry name="Imagick::getSizeOffset" url="function.imagick-getsizeoffset.php"/>
+<entry name="Imagick::getVersion" url="function.imagick-getversion.php"/>
+<entry name="Imagick::hasNextImage" url="function.imagick-hasnextimage.php"/>
+<entry name="Imagick::hasPreviousImage" url="function.imagick-haspreviousimage.php"/>
+<entry name="Imagick::identifyImage" url="function.imagick-identifyimage.php"/>
+<entry name="Imagick::implodeImage" url="function.imagick-implodeimage.php"/>
+<entry name="Imagick::labelImage" url="function.imagick-labelimage.php"/>
+<entry name="Imagick::levelImage" url="function.imagick-levelimage.php"/>
+<entry name="Imagick::linearStretchImage" url="function.imagick-linearstretchimage.php"/>
+<entry name="Imagick::magnifyImage" url="function.imagick-magnifyimage.php"/>
+<entry name="Imagick::mapImage" url="function.imagick-mapimage.php"/>
+<entry name="Imagick::matteFloodfillImage" url="function.imagick-mattefloodfillimage.php"/>
+<entry name="Imagick::medianFilterImage" url="function.imagick-medianfilterimage.php"/>
+<entry name="Imagick::minifyImage" url="function.imagick-minifyimage.php"/>
+<entry name="Imagick::modulateImage" url="function.imagick-modulateimage.php"/>
+<entry name="Imagick::montageImage" url="function.imagick-montageimage.php"/>
+<entry name="Imagick::morphImages" url="function.imagick-morphimages.php"/>
+<entry name="Imagick::mosaicImages" url="function.imagick-mosaicimages.php"/>
+<entry name="Imagick::motionBlurImage" url="function.imagick-motionblurimage.php"/>
+<entry name="Imagick::negateImage" url="function.imagick-negateimage.php"/>
+<entry name="Imagick::newImage" url="function.imagick-newimage.php"/>
+<entry name="Imagick::newPseudoImage" url="function.imagick-newpseudoimage.php"/>
+<entry name="Imagick::nextImage" url="function.imagick-nextimage.php"/>
+<entry name="Imagick::normalizeImage" url="function.imagick-normalizeimage.php"/>
+<entry name="Imagick::oilPaintImage" url="function.imagick-oilpaintimage.php"/>
+<entry name="Imagick::optimizeImageLayers" url="function.imagick-optimizeimagelayers.php"/>
+<entry name="Imagick::paintOpaqueImage" url="function.imagick-paintopaqueimage.php"/>
+<entry name="Imagick::paintTransparentImage" url="function.imagick-painttransparentimage.php"/>
+<entry name="Imagick::pingImage" url="function.imagick-pingimage.php"/>
+<entry name="Imagick::pingImageBlob" url="function.imagick-pingimageblob.php"/>
+<entry name="Imagick::pingImageFile" url="function.imagick-pingimagefile.php"/>
+<entry name="Imagick::polaroidImage" url="function.imagick-polaroidimage.php"/>
+<entry name="Imagick::posterizeImage" url="function.imagick-posterizeimage.php"/>
+<entry name="Imagick::previewImages" url="function.imagick-previewimages.php"/>
+<entry name="Imagick::previousImage" url="function.imagick-previousimage.php"/>
+<entry name="Imagick::profileImage" url="function.imagick-profileimage.php"/>
+<entry name="Imagick::quantizeImage" url="function.imagick-quantizeimage.php"/>
+<entry name="Imagick::quantizeImages" url="function.imagick-quantizeimages.php"/>
+<entry name="Imagick::queryFontMetrics" url="function.imagick-queryfontmetrics.php"/>
+<entry name="Imagick::queryFonts" url="function.imagick-queryfonts.php"/>
+<entry name="Imagick::queryFormats" url="function.imagick-queryformats.php"/>
+<entry name="Imagick::radialBlurImage" url="function.imagick-radialblurimage.php"/>
+<entry name="Imagick::raiseImage" url="function.imagick-raiseimage.php"/>
+<entry name="Imagick::randomThresholdImage" url="function.imagick-randomthresholdimage.php"/>
+<entry name="Imagick::readImage" url="function.imagick-readimage.php"/>
+<entry name="Imagick::readImageBlob" url="function.imagick-readimageblob.php"/>
+<entry name="Imagick::readImageFile" url="function.imagick-readimagefile.php"/>
+<entry name="Imagick::reduceNoiseImage" url="function.imagick-reducenoiseimage.php"/>
+<entry name="Imagick::removeImage" url="function.imagick-removeimage.php"/>
+<entry name="Imagick::removeImageProfile" url="function.imagick-removeimageprofile.php"/>
+<entry name="Imagick::render" url="function.imagick-render.php"/>
+<entry name="Imagick::resampleImage" url="function.imagick-resampleimage.php"/>
+<entry name="Imagick::resizeImage" url="function.imagick-resizeimage.php"/>
+<entry name="Imagick::rollImage" url="function.imagick-rollimage.php"/>
+<entry name="Imagick::rotateImage" url="function.imagick-rotateimage.php"/>
+<entry name="Imagick::roundCorners" url="function.imagick-roundcorners.php"/>
+<entry name="Imagick::sampleImage" url="function.imagick-sampleimage.php"/>
+<entry name="Imagick::scaleImage" url="function.imagick-scaleimage.php"/>
+<entry name="Imagick::separateImageChannel" url="function.imagick-separateimagechannel.php"/>
+<entry name="Imagick::sepiaToneImage" url="function.imagick-sepiatoneimage.php"/>
+<entry name="Imagick::setBackgroundColor" url="function.imagick-setbackgroundcolor.php"/>
+<entry name="Imagick::setCompression" url="function.imagick-setcompression.php"/>
+<entry name="Imagick::setCompressionQuality" url="function.imagick-setcompressionquality.php"/>
+<entry name="Imagick::setFilename" url="function.imagick-setfilename.php"/>
+<entry name="Imagick::setFirstIterator" url="function.imagick-setfirstiterator.php"/>
+<entry name="Imagick::setFormat" url="function.imagick-setformat.php"/>
+<entry name="Imagick::setImage" url="function.imagick-setimage.php"/>
+<entry name="Imagick::setImageBackgroundColor" url="function.imagick-setimagebackgroundcolor.php"/>
+<entry name="Imagick::setImageBias" url="function.imagick-setimagebias.php"/>
+<entry name="Imagick::setImageBluePrimary" url="function.imagick-setimageblueprimary.php"/>
+<entry name="Imagick::setImageBorderColor" url="function.imagick-setimagebordercolor.php"/>
+<entry name="Imagick::setImageChannelDepth" url="function.imagick-setimagechanneldepth.php"/>
+<entry name="Imagick::setImageColormapColor" url="function.imagick-setimagecolormapcolor.php"/>
+<entry name="Imagick::setImageColorspace" url="function.imagick-setimagecolorspace.php"/>
+<entry name="Imagick::setImageCompose" url="function.imagick-setimagecompose.php"/>
+<entry name="Imagick::setImageCompression" url="function.imagick-setimagecompression.php"/>
+<entry name="Imagick::setImageDelay" url="function.imagick-setimagedelay.php"/>
+<entry name="Imagick::setImageDepth" url="function.imagick-setimagedepth.php"/>
+<entry name="Imagick::setImageDispose" url="function.imagick-setimagedispose.php"/>
+<entry name="Imagick::setImageExtent" url="function.imagick-setimageextent.php"/>
+<entry name="Imagick::setImageFilename" url="function.imagick-setimagefilename.php"/>
+<entry name="Imagick::setImageFormat" url="function.imagick-setimageformat.php"/>
+<entry name="Imagick::setImageGamma" url="function.imagick-setimagegamma.php"/>
+<entry name="Imagick::setImageGreenPrimary" url="function.imagick-setimagegreenprimary.php"/>
+<entry name="Imagick::setImageIndex" url="function.imagick-setimageindex.php"/>
+<entry name="Imagick::setImageInterlaceScheme" url="function.imagick-setimageinterlacescheme.php"/>
+<entry name="Imagick::setImageInterpolateMethod" url="function.imagick-setimageinterpolatemethod.php"/>
+<entry name="Imagick::setImageIterations" url="function.imagick-setimageiterations.php"/>
+<entry name="Imagick::setImageMatte" url="function.imagick-setimagematte.php"/>
+<entry name="Imagick::setImageMatteColor" url="function.imagick-setimagemattecolor.php"/>
+<entry name="Imagick::setImageOpacity" url="function.imagick-setimageopacity.php"/>
+<entry name="Imagick::setImageOrientation" url="function.imagick-setimageorientation.php"/>
+<entry name="Imagick::setImagePage" url="function.imagick-setimagepage.php"/>
+<entry name="Imagick::setImageProfile" url="function.imagick-setimageprofile.php"/>
+<entry name="Imagick::setImageProperty" url="function.imagick-setimageproperty.php"/>
+<entry name="Imagick::setImageRedPrimary" url="function.imagick-setimageredprimary.php"/>
+<entry name="Imagick::setImageRenderingIntent" url="function.imagick-setimagerenderingintent.php"/>
+<entry name="Imagick::setImageResolution" url="function.imagick-setimageresolution.php"/>
+<entry name="Imagick::setImageScene" url="function.imagick-setimagescene.php"/>
+<entry name="Imagick::setImageTicksPerSecond" url="function.imagick-setimagetickspersecond.php"/>
+<entry name="Imagick::setImageType" url="function.imagick-setimagetype.php"/>
+<entry name="Imagick::setImageUnits" url="function.imagick-setimageunits.php"/>
+<entry name="Imagick::setImageVirtualPixelMethod" url="function.imagick-setimagevirtualpixelmethod.php"/>
+<entry name="Imagick::setImageWhitePoint" url="function.imagick-setimagewhitepoint.php"/>
+<entry name="Imagick::setInterlaceScheme" url="function.imagick-setinterlacescheme.php"/>
+<entry name="Imagick::setIteratorIndex" url="function.imagick-setiteratorindex.php"/>
+<entry name="Imagick::setLastIterator" url="function.imagick-setlastiterator.php"/>
+<entry name="Imagick::setOption" url="function.imagick-setoption.php"/>
+<entry name="Imagick::setPage" url="function.imagick-setpage.php"/>
+<entry name="Imagick::setResolution" url="function.imagick-setresolution.php"/>
+<entry name="Imagick::setResourceLimit" url="function.imagick-setresourcelimit.php"/>
+<entry name="Imagick::setSamplingFactors" url="function.imagick-setsamplingfactors.php"/>
+<entry name="Imagick::setSize" url="function.imagick-setsize.php"/>
+<entry name="Imagick::setSizeOffset" url="function.imagick-setsizeoffset.php"/>
+<entry name="Imagick::setType" url="function.imagick-settype.php"/>
+<entry name="Imagick::shadeImage" url="function.imagick-shadeimage.php"/>
+<entry name="Imagick::shadowImage" url="function.imagick-shadowimage.php"/>
+<entry name="Imagick::sharpenImage" url="function.imagick-sharpenimage.php"/>
+<entry name="Imagick::shaveImage" url="function.imagick-shaveimage.php"/>
+<entry name="Imagick::shearImage" url="function.imagick-shearimage.php"/>
+<entry name="Imagick::sigmoidalContrastImage" url="function.imagick-sigmoidalcontrastimage.php"/>
+<entry name="Imagick::sketchImage" url="function.imagick-sketchimage.php"/>
+<entry name="Imagick::solarizeImage" url="function.imagick-solarizeimage.php"/>
+<entry name="Imagick::spliceImage" url="function.imagick-spliceimage.php"/>
+<entry name="Imagick::spreadImage" url="function.imagick-spreadimage.php"/>
+<entry name="Imagick::steganoImage" url="function.imagick-steganoimage.php"/>
+<entry name="Imagick::stereoImage" url="function.imagick-stereoimage.php"/>
+<entry name="Imagick::stripImage" url="function.imagick-stripimage.php"/>
+<entry name="Imagick::swirlImage" url="function.imagick-swirlimage.php"/>
+<entry name="Imagick::textureImage" url="function.imagick-textureimage.php"/>
+<entry name="Imagick::thresholdImage" url="function.imagick-thresholdimage.php"/>
+<entry name="Imagick::thumbnailImage" url="function.imagick-thumbnailimage.php"/>
+<entry name="Imagick::tintImage" url="function.imagick-tintimage.php"/>
+<entry name="Imagick::transformImage" url="function.imagick-transformimage.php"/>
+<entry name="Imagick::transverseImage" url="function.imagick-transverseimage.php"/>
+<entry name="Imagick::trimImage" url="function.imagick-trimimage.php"/>
+<entry name="Imagick::uniqueImageColors" url="function.imagick-uniqueimagecolors.php"/>
+<entry name="Imagick::unsharpMaskImage" url="function.imagick-unsharpmaskimage.php"/>
+<entry name="Imagick::valid" url="function.imagick-valid.php"/>
+<entry name="Imagick::vignetteImage" url="function.imagick-vignetteimage.php"/>
+<entry name="Imagick::waveImage" url="function.imagick-waveimage.php"/>
+<entry name="Imagick::whiteThresholdImage" url="function.imagick-whitethresholdimage.php"/>
+<entry name="Imagick::writeImage" url="function.imagick-writeimage.php"/>
+<entry name="Imagick::writeImages" url="function.imagick-writeimages.php"/>
+<entry name="ImagickDraw::affine" url="function.imagickdraw-affine.php"/>
+<entry name="ImagickDraw::annotation" url="function.imagickdraw-annotation.php"/>
+<entry name="ImagickDraw::arc" url="function.imagickdraw-arc.php"/>
+<entry name="ImagickDraw::bezier" url="function.imagickdraw-bezier.php"/>
+<entry name="ImagickDraw::circle" url="function.imagickdraw-circle.php"/>
+<entry name="ImagickDraw::clear" url="function.imagickdraw-clear.php"/>
+<entry name="ImagickDraw::clone" url="function.imagickdraw-clone.php"/>
+<entry name="ImagickDraw::color" url="function.imagickdraw-color.php"/>
+<entry name="ImagickDraw::comment" url="function.imagickdraw-comment.php"/>
+<entry name="ImagickDraw::composite" url="function.imagickdraw-composite.php"/>
+<entry name="ImagickDraw::__construct" url="function.imagickdraw-construct.php"/>
+<entry name="ImagickDraw::destroy" url="function.imagickdraw-destroy.php"/>
+<entry name="ImagickDraw::ellipse" url="function.imagickdraw-ellipse.php"/>
+<entry name="ImagickDraw::getClipPath" url="function.imagickdraw-getclippath.php"/>
+<entry name="ImagickDraw::getClipRule" url="function.imagickdraw-getcliprule.php"/>
+<entry name="ImagickDraw::getClipUnits" url="function.imagickdraw-getclipunits.php"/>
+<entry name="ImagickDraw::getFillColor" url="function.imagickdraw-getfillcolor.php"/>
+<entry name="ImagickDraw::getFillOpacity" url="function.imagickdraw-getfillopacity.php"/>
+<entry name="ImagickDraw::getFillRule" url="function.imagickdraw-getfillrule.php"/>
+<entry name="ImagickDraw::getFont" url="function.imagickdraw-getfont.php"/>
+<entry name="ImagickDraw::getFontFamily" url="function.imagickdraw-getfontfamily.php"/>
+<entry name="ImagickDraw::getFontSize" url="function.imagickdraw-getfontsize.php"/>
+<entry name="ImagickDraw::getFontStyle" url="function.imagickdraw-getfontstyle.php"/>
+<entry name="ImagickDraw::getFontWeight" url="function.imagickdraw-getfontweight.php"/>
+<entry name="ImagickDraw::getGravity" url="function.imagickdraw-getgravity.php"/>
+<entry name="ImagickDraw::getStrokeAntialias" url="function.imagickdraw-getstrokeantialias.php"/>
+<entry name="ImagickDraw::getStrokeColor" url="function.imagickdraw-getstrokecolor.php"/>
+<entry name="ImagickDraw::getStrokeDashArray" url="function.imagickdraw-getstrokedasharray.php"/>
+<entry name="ImagickDraw::getStrokeDashOffset" url="function.imagickdraw-getstrokedashoffset.php"/>
+<entry name="ImagickDraw::getStrokeLineCap" url="function.imagickdraw-getstrokelinecap.php"/>
+<entry name="ImagickDraw::getStrokeLineJoin" url="function.imagickdraw-getstrokelinejoin.php"/>
+<entry name="ImagickDraw::getStrokeMiterLimit" url="function.imagickdraw-getstrokemiterlimit.php"/>
+<entry name="ImagickDraw::getStrokeOpacity" url="function.imagickdraw-getstrokeopacity.php"/>
+<entry name="ImagickDraw::getStrokeWidth" url="function.imagickdraw-getstrokewidth.php"/>
+<entry name="ImagickDraw::getTextAlignment" url="function.imagickdraw-gettextalignment.php"/>
+<entry name="ImagickDraw::getTextAntialias" url="function.imagickdraw-gettextantialias.php"/>
+<entry name="ImagickDraw::getTextDecoration" url="function.imagickdraw-gettextdecoration.php"/>
+<entry name="ImagickDraw::getTextEncoding" url="function.imagickdraw-gettextencoding.php"/>
+<entry name="ImagickDraw::getTextUnderColor" url="function.imagickdraw-gettextundercolor.php"/>
+<entry name="ImagickDraw::getVectorGraphics" url="function.imagickdraw-getvectorgraphics.php"/>
+<entry name="ImagickDraw::line" url="function.imagickdraw-line.php"/>
+<entry name="ImagickDraw::matte" url="function.imagickdraw-matte.php"/>
+<entry name="ImagickDraw::pathClose" url="function.imagickdraw-pathclose.php"/>
+<entry name="ImagickDraw::pathCurveToAbsolute" url="function.imagickdraw-pathcurvetoabsolute.php"/>
+<entry name="ImagickDraw::pathCurveToQuadraticBezierAbsolute" url="function.imagickdraw-pathcurvetoquadraticbezierabsolute.php"/>
+<entry name="ImagickDraw::pathCurveToQuadraticBezierRelative" url="function.imagickdraw-pathcurvetoquadraticbezierrelative.php"/>
+<entry name="ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute" url="function.imagickdraw-pathcurvetoquadraticbeziersmoothabsolute.php"/>
+<entry name="ImagickDraw::pathCurveToQuadraticBezierSmoothRelative" url="function.imagickdraw-pathcurvetoquadraticbeziersmoothrelative.php"/>
+<entry name="ImagickDraw::pathCurveToRelative" url="function.imagickdraw-pathcurvetorelative.php"/>
+<entry name="ImagickDraw::pathCurveToSmoothAbsolute" url="function.imagickdraw-pathcurvetosmoothabsolute.php"/>
+<entry name="ImagickDraw::pathCurveToSmoothRelative" url="function.imagickdraw-pathcurvetosmoothrelative.php"/>
+<entry name="ImagickDraw::pathEllipticArcAbsolute" url="function.imagickdraw-pathellipticarcabsolute.php"/>
+<entry name="ImagickDraw::pathEllipticArcRelative" url="function.imagickdraw-pathellipticarcrelative.php"/>
+<entry name="ImagickDraw::pathFinish" url="function.imagickdraw-pathfinish.php"/>
+<entry name="ImagickDraw::pathLineToAbsolute" url="function.imagickdraw-pathlinetoabsolute.php"/>
+<entry name="ImagickDraw::pathLineToHorizontalAbsolute" url="function.imagickdraw-pathlinetohorizontalabsolute.php"/>
+<entry name="ImagickDraw::pathLineToHorizontalRelative" url="function.imagickdraw-pathlinetohorizontalrelative.php"/>
+<entry name="ImagickDraw::pathLineToRelative" url="function.imagickdraw-pathlinetorelative.php"/>
+<entry name="ImagickDraw::pathLineToVerticalAbsolute" url="function.imagickdraw-pathlinetoverticalabsolute.php"/>
+<entry name="ImagickDraw::pathLineToVerticalRelative" url="function.imagickdraw-pathlinetoverticalrelative.php"/>
+<entry name="ImagickDraw::pathMoveToAbsolute" url="function.imagickdraw-pathmovetoabsolute.php"/>
+<entry name="ImagickDraw::pathMoveToRelative" url="function.imagickdraw-pathmovetorelative.php"/>
+<entry name="ImagickDraw::pathStart" url="function.imagickdraw-pathstart.php"/>
+<entry name="ImagickDraw::point" url="function.imagickdraw-point.php"/>
+<entry name="ImagickDraw::polygon" url="function.imagickdraw-polygon.php"/>
+<entry name="ImagickDraw::polyline" url="function.imagickdraw-polyline.php"/>
+<entry name="ImagickDraw::pop" url="function.imagickdraw-pop.php"/>
+<entry name="ImagickDraw::popClipPath" url="function.imagickdraw-popclippath.php"/>
+<entry name="ImagickDraw::popDefs" url="function.imagickdraw-popdefs.php"/>
+<entry name="ImagickDraw::popPattern" url="function.imagickdraw-poppattern.php"/>
+<entry name="ImagickDraw::push" url="function.imagickdraw-push.php"/>
+<entry name="ImagickDraw::pushClipPath" url="function.imagickdraw-pushclippath.php"/>
+<entry name="ImagickDraw::pushDefs" url="function.imagickdraw-pushdefs.php"/>
+<entry name="ImagickDraw::pushPattern" url="function.imagickdraw-pushpattern.php"/>
+<entry name="ImagickDraw::rectangle" url="function.imagickdraw-rectangle.php"/>
+<entry name="ImagickDraw::render" url="function.imagickdraw-render.php"/>
+<entry name="ImagickDraw::rotate" url="function.imagickdraw-rotate.php"/>
+<entry name="ImagickDraw::roundRectangle" url="function.imagickdraw-roundrectangle.php"/>
+<entry name="ImagickDraw::scale" url="function.imagickdraw-scale.php"/>
+<entry name="ImagickDraw::setClipPath" url="function.imagickdraw-setclippath.php"/>
+<entry name="ImagickDraw::setClipRule" url="function.imagickdraw-setcliprule.php"/>
+<entry name="ImagickDraw::setClipUnits" url="function.imagickdraw-setclipunits.php"/>
+<entry name="ImagickDraw::setFillAlpha" url="function.imagickdraw-setfillalpha.php"/>
+<entry name="ImagickDraw::setFillColor" url="function.imagickdraw-setfillcolor.php"/>
+<entry name="ImagickDraw::setFillOpacity" url="function.imagickdraw-setfillopacity.php"/>
+<entry name="ImagickDraw::setFillPatternURL" url="function.imagickdraw-setfillpatternurl.php"/>
+<entry name="ImagickDraw::setFillRule" url="function.imagickdraw-setfillrule.php"/>
+<entry name="ImagickDraw::setFont" url="function.imagickdraw-setfont.php"/>
+<entry name="ImagickDraw::setFontFamily" url="function.imagickdraw-setfontfamily.php"/>
+<entry name="ImagickDraw::setFontSize" url="function.imagickdraw-setfontsize.php"/>
+<entry name="ImagickDraw::setFontStretch" url="function.imagickdraw-setfontstretch.php"/>
+<entry name="ImagickDraw::setFontStyle" url="function.imagickdraw-setfontstyle.php"/>
+<entry name="ImagickDraw::setFontWeight" url="function.imagickdraw-setfontweight.php"/>
+<entry name="ImagickDraw::setGravity" url="function.imagickdraw-setgravity.php"/>
+<entry name="ImagickDraw::setStrokeAlpha" url="function.imagickdraw-setstrokealpha.php"/>
+<entry name="ImagickDraw::setStrokeAntialias" url="function.imagickdraw-setstrokeantialias.php"/>
+<entry name="ImagickDraw::setStrokeColor" url="function.imagickdraw-setstrokecolor.php"/>
+<entry name="ImagickDraw::setStrokeDashArray" url="function.imagickdraw-setstrokedasharray.php"/>
+<entry name="ImagickDraw::setStrokeDashOffset" url="function.imagickdraw-setstrokedashoffset.php"/>
+<entry name="ImagickDraw::setStrokeLineCap" url="function.imagickdraw-setstrokelinecap.php"/>
+<entry name="ImagickDraw::setStrokeLineJoin" url="function.imagickdraw-setstrokelinejoin.php"/>
+<entry name="ImagickDraw::setStrokeMiterLimit" url="function.imagickdraw-setstrokemiterlimit.php"/>
+<entry name="ImagickDraw::setStrokeOpacity" url="function.imagickdraw-setstrokeopacity.php"/>
+<entry name="ImagickDraw::setStrokePatternURL" url="function.imagickdraw-setstrokepatternurl.php"/>
+<entry name="ImagickDraw::setStrokeWidth" url="function.imagickdraw-setstrokewidth.php"/>
+<entry name="ImagickDraw::setTextAlignment" url="function.imagickdraw-settextalignment.php"/>
+<entry name="ImagickDraw::setTextAntialias" url="function.imagickdraw-settextantialias.php"/>
+<entry name="ImagickDraw::setTextDecoration" url="function.imagickdraw-settextdecoration.php"/>
+<entry name="ImagickDraw::setTextEncoding" url="function.imagickdraw-settextencoding.php"/>
+<entry name="ImagickDraw::setTextUnderColor" url="function.imagickdraw-settextundercolor.php"/>
+<entry name="ImagickDraw::setVectorGraphics" url="function.imagickdraw-setvectorgraphics.php"/>
+<entry name="ImagickDraw::setViewbox" url="function.imagickdraw-setviewbox.php"/>
+<entry name="ImagickDraw::skewX" url="function.imagickdraw-skewx.php"/>
+<entry name="ImagickDraw::skewY" url="function.imagickdraw-skewy.php"/>
+<entry name="ImagickDraw::translate" url="function.imagickdraw-translate.php"/>
+<entry name="ImagickPixel::clear" url="function.imagickpixel-clear.php"/>
+<entry name="ImagickPixel::__construct" url="function.imagickpixel-construct.php"/>
+<entry name="ImagickPixel::destroy" url="function.imagickpixel-destroy.php"/>
+<entry name="ImagickPixel::getColor" url="function.imagickpixel-getcolor.php"/>
+<entry name="ImagickPixel::getColorAsString" url="function.imagickpixel-getcolorasstring.php"/>
+<entry name="ImagickPixel::getColorCount" url="function.imagickpixel-getcolorcount.php"/>
+<entry name="ImagickPixel::getColorValue" url="function.imagickpixel-getcolorvalue.php"/>
+<entry name="ImagickPixel::getHSL" url="function.imagickpixel-gethsl.php"/>
+<entry name="ImagickPixel::isSimilar" url="function.imagickpixel-issimilar.php"/>
+<entry name="ImagickPixel::setColor" url="function.imagickpixel-setcolor.php"/>
+<entry name="ImagickPixel::setColorValue" url="function.imagickpixel-setcolorvalue.php"/>
+<entry name="ImagickPixel::setHSL" url="function.imagickpixel-sethsl.php"/>
+<entry name="ImagickPixelIterator::clear" url="function.imagickpixeliterator-clear.php"/>
+<entry name="ImagickPixelIterator::__construct" url="function.imagickpixeliterator-construct.php"/>
+<entry name="ImagickPixelIterator::destroy" url="function.imagickpixeliterator-destroy.php"/>
+<entry name="ImagickPixelIterator::getCurrentIteratorRow" url="function.imagickpixeliterator-getcurrentiteratorrow.php"/>
+<entry name="ImagickPixelIterator::getIteratorRow" url="function.imagickpixeliterator-getiteratorrow.php"/>
+<entry name="ImagickPixelIterator::getNextIteratorRow" url="function.imagickpixeliterator-getnextiteratorrow.php"/>
+<entry name="ImagickPixelIterator::getPreviousIteratorRow" url="function.imagickpixeliterator-getpreviousiteratorrow.php"/>
+<entry name="ImagickPixelIterator::newPixelIterator" url="function.imagickpixeliterator-newpixeliterator.php"/>
+<entry name="ImagickPixelIterator::newPixelRegionIterator" url="function.imagickpixeliterator-newpixelregioniterator.php"/>
+<entry name="ImagickPixelIterator::resetIterator" url="function.imagickpixeliterator-resetiterator.php"/>
+<entry name="ImagickPixelIterator::setIteratorFirstRow" url="function.imagickpixeliterator-setiteratorfirstrow.php"/>
+<entry name="ImagickPixelIterator::setIteratorLastRow" url="function.imagickpixeliterator-setiteratorlastrow.php"/>
+<entry name="ImagickPixelIterator::setIteratorRow" url="function.imagickpixeliterator-setiteratorrow.php"/>
+<entry name="ImagickPixelIterator::syncIterator" url="function.imagickpixeliterator-synciterator.php"/>
+<entry name="cyrus_authenticate" url="function.cyrus-authenticate.php"/>
+<entry name="cyrus_bind" url="function.cyrus-bind.php"/>
+<entry name="cyrus_close" url="function.cyrus-close.php"/>
+<entry name="cyrus_connect" url="function.cyrus-connect.php"/>
+<entry name="cyrus_query" url="function.cyrus-query.php"/>
+<entry name="cyrus_unbind" url="function.cyrus-unbind.php"/>
+<entry name="imap_8bit" url="function.imap-8bit.php"/>
+<entry name="imap_alerts" url="function.imap-alerts.php"/>
+<entry name="imap_append" url="function.imap-append.php"/>
+<entry name="imap_base64" url="function.imap-base64.php"/>
+<entry name="imap_binary" url="function.imap-binary.php"/>
+<entry name="imap_body" url="function.imap-body.php"/>
+<entry name="imap_bodystruct" url="function.imap-bodystruct.php"/>
+<entry name="imap_check" url="function.imap-check.php"/>
+<entry name="imap_clearflag_full" url="function.imap-clearflag-full.php"/>
+<entry name="imap_close" url="function.imap-close.php"/>
+<entry name="imap_createmailbox" url="function.imap-createmailbox.php"/>
+<entry name="imap_delete" url="function.imap-delete.php"/>
+<entry name="imap_deletemailbox" url="function.imap-deletemailbox.php"/>
+<entry name="imap_errors" url="function.imap-errors.php"/>
+<entry name="imap_expunge" url="function.imap-expunge.php"/>
+<entry name="imap_fetch_overview" url="function.imap-fetch-overview.php"/>
+<entry name="imap_fetchbody" url="function.imap-fetchbody.php"/>
+<entry name="imap_fetchheader" url="function.imap-fetchheader.php"/>
+<entry name="imap_fetchstructure" url="function.imap-fetchstructure.php"/>
+<entry name="imap_get_quota" url="function.imap-get-quota.php"/>
+<entry name="imap_get_quotaroot" url="function.imap-get-quotaroot.php"/>
+<entry name="imap_getacl" url="function.imap-getacl.php"/>
+<entry name="imap_getmailboxes" url="function.imap-getmailboxes.php"/>
+<entry name="imap_getsubscribed" url="function.imap-getsubscribed.php"/>
+<entry name="imap_header" url="function.imap-header.php"/>
+<entry name="imap_headerinfo" url="function.imap-headerinfo.php"/>
+<entry name="imap_headers" url="function.imap-headers.php"/>
+<entry name="imap_last_error" url="function.imap-last-error.php"/>
+<entry name="imap_list" url="function.imap-list.php"/>
+<entry name="imap_listmailbox" url="function.imap-listmailbox.php"/>
+<entry name="imap_listscan" url="function.imap-listscan.php"/>
+<entry name="imap_listsubscribed" url="function.imap-listsubscribed.php"/>
+<entry name="imap_lsub" url="function.imap-lsub.php"/>
+<entry name="imap_mail_compose" url="function.imap-mail-compose.php"/>
+<entry name="imap_mail_copy" url="function.imap-mail-copy.php"/>
+<entry name="imap_mail_move" url="function.imap-mail-move.php"/>
+<entry name="imap_mail" url="function.imap-mail.php"/>
+<entry name="imap_mailboxmsginfo" url="function.imap-mailboxmsginfo.php"/>
+<entry name="imap_mime_header_decode" url="function.imap-mime-header-decode.php"/>
+<entry name="imap_msgno" url="function.imap-msgno.php"/>
+<entry name="imap_num_msg" url="function.imap-num-msg.php"/>
+<entry name="imap_num_recent" url="function.imap-num-recent.php"/>
+<entry name="imap_open" url="function.imap-open.php"/>
+<entry name="imap_ping" url="function.imap-ping.php"/>
+<entry name="imap_qprint" url="function.imap-qprint.php"/>
+<entry name="imap_renamemailbox" url="function.imap-renamemailbox.php"/>
+<entry name="imap_reopen" url="function.imap-reopen.php"/>
+<entry name="imap_rfc822_parse_adrlist" url="function.imap-rfc822-parse-adrlist.php"/>
+<entry name="imap_rfc822_parse_headers" url="function.imap-rfc822-parse-headers.php"/>
+<entry name="imap_rfc822_write_address" url="function.imap-rfc822-write-address.php"/>
+<entry name="imap_savebody" url="function.imap-savebody.php"/>
+<entry name="imap_scanmailbox" url="function.imap-scanmailbox.php"/>
+<entry name="imap_search" url="function.imap-search.php"/>
+<entry name="imap_set_quota" url="function.imap-set-quota.php"/>
+<entry name="imap_setacl" url="function.imap-setacl.php"/>
+<entry name="imap_setflag_full" url="function.imap-setflag-full.php"/>
+<entry name="imap_sort" url="function.imap-sort.php"/>
+<entry name="imap_status" url="function.imap-status.php"/>
+<entry name="imap_subscribe" url="function.imap-subscribe.php"/>
+<entry name="imap_thread" url="function.imap-thread.php"/>
+<entry name="imap_timeout" url="function.imap-timeout.php"/>
+<entry name="imap_uid" url="function.imap-uid.php"/>
+<entry name="imap_undelete" url="function.imap-undelete.php"/>
+<entry name="imap_unsubscribe" url="function.imap-unsubscribe.php"/>
+<entry name="imap_utf7_decode" url="function.imap-utf7-decode.php"/>
+<entry name="imap_utf7_encode" url="function.imap-utf7-encode.php"/>
+<entry name="imap_utf8" url="function.imap-utf8.php"/>
+<entry name="ezmlm_hash" url="function.ezmlm-hash.php"/>
+<entry name="mail" url="function.mail.php"/>
+<entry name="mailparse_determine_best_xfer_encoding" url="function.mailparse-determine-best-xfer-encoding.php"/>
+<entry name="mailparse_msg_create" url="function.mailparse-msg-create.php"/>
+<entry name="mailparse_msg_extract_part_file" url="function.mailparse-msg-extract-part-file.php"/>
+<entry name="mailparse_msg_extract_part" url="function.mailparse-msg-extract-part.php"/>
+<entry name="mailparse_msg_extract_whole_part_file" url="function.mailparse-msg-extract-whole-part-file.php"/>
+<entry name="mailparse_msg_free" url="function.mailparse-msg-free.php"/>
+<entry name="mailparse_msg_get_part_data" url="function.mailparse-msg-get-part-data.php"/>
+<entry name="mailparse_msg_get_part" url="function.mailparse-msg-get-part.php"/>
+<entry name="mailparse_msg_get_structure" url="function.mailparse-msg-get-structure.php"/>
+<entry name="mailparse_msg_parse_file" url="function.mailparse-msg-parse-file.php"/>
+<entry name="mailparse_msg_parse" url="function.mailparse-msg-parse.php"/>
+<entry name="mailparse_rfc822_parse_addresses" url="function.mailparse-rfc822-parse-addresses.php"/>
+<entry name="mailparse_stream_encode" url="function.mailparse-stream-encode.php"/>
+<entry name="mailparse_uudecode_all" url="function.mailparse-uudecode-all.php"/>
+<entry name="vpopmail_add_alias_domain_ex" url="function.vpopmail-add-alias-domain-ex.php"/>
+<entry name="vpopmail_add_alias_domain" url="function.vpopmail-add-alias-domain.php"/>
+<entry name="vpopmail_add_domain_ex" url="function.vpopmail-add-domain-ex.php"/>
+<entry name="vpopmail_add_domain" url="function.vpopmail-add-domain.php"/>
+<entry name="vpopmail_add_user" url="function.vpopmail-add-user.php"/>
+<entry name="vpopmail_alias_add" url="function.vpopmail-alias-add.php"/>
+<entry name="vpopmail_alias_del_domain" url="function.vpopmail-alias-del-domain.php"/>
+<entry name="vpopmail_alias_del" url="function.vpopmail-alias-del.php"/>
+<entry name="vpopmail_alias_get_all" url="function.vpopmail-alias-get-all.php"/>
+<entry name="vpopmail_alias_get" url="function.vpopmail-alias-get.php"/>
+<entry name="vpopmail_auth_user" url="function.vpopmail-auth-user.php"/>
+<entry name="vpopmail_del_domain_ex" url="function.vpopmail-del-domain-ex.php"/>
+<entry name="vpopmail_del_domain" url="function.vpopmail-del-domain.php"/>
+<entry name="vpopmail_del_user" url="function.vpopmail-del-user.php"/>
+<entry name="vpopmail_error" url="function.vpopmail-error.php"/>
+<entry name="vpopmail_passwd" url="function.vpopmail-passwd.php"/>
+<entry name="vpopmail_set_user_quota" url="function.vpopmail-set-user-quota.php"/>
+<entry name="bcadd" url="function.bcadd.php"/>
+<entry name="bccomp" url="function.bccomp.php"/>
+<entry name="bcdiv" url="function.bcdiv.php"/>
+<entry name="bcmod" url="function.bcmod.php"/>
+<entry name="bcmul" url="function.bcmul.php"/>
+<entry name="bcpow" url="function.bcpow.php"/>
+<entry name="bcpowmod" url="function.bcpowmod.php"/>
+<entry name="bcscale" url="function.bcscale.php"/>
+<entry name="bcsqrt" url="function.bcsqrt.php"/>
+<entry name="bcsub" url="function.bcsub.php"/>
+<entry name="gmp_abs" url="function.gmp-abs.php"/>
+<entry name="gmp_add" url="function.gmp-add.php"/>
+<entry name="gmp_and" url="function.gmp-and.php"/>
+<entry name="gmp_clrbit" url="function.gmp-clrbit.php"/>
+<entry name="gmp_cmp" url="function.gmp-cmp.php"/>
+<entry name="gmp_com" url="function.gmp-com.php"/>
+<entry name="gmp_div_q" url="function.gmp-div-q.php"/>
+<entry name="gmp_div_qr" url="function.gmp-div-qr.php"/>
+<entry name="gmp_div_r" url="function.gmp-div-r.php"/>
+<entry name="gmp_div" url="function.gmp-div.php"/>
+<entry name="gmp_divexact" url="function.gmp-divexact.php"/>
+<entry name="gmp_fact" url="function.gmp-fact.php"/>
+<entry name="gmp_gcd" url="function.gmp-gcd.php"/>
+<entry name="gmp_gcdext" url="function.gmp-gcdext.php"/>
+<entry name="gmp_hamdist" url="function.gmp-hamdist.php"/>
+<entry name="gmp_init" url="function.gmp-init.php"/>
+<entry name="gmp_intval" url="function.gmp-intval.php"/>
+<entry name="gmp_invert" url="function.gmp-invert.php"/>
+<entry name="gmp_jacobi" url="function.gmp-jacobi.php"/>
+<entry name="gmp_legendre" url="function.gmp-legendre.php"/>
+<entry name="gmp_mod" url="function.gmp-mod.php"/>
+<entry name="gmp_mul" url="function.gmp-mul.php"/>
+<entry name="gmp_neg" url="function.gmp-neg.php"/>
+<entry name="gmp_nextprime" url="function.gmp-nextprime.php"/>
+<entry name="gmp_or" url="function.gmp-or.php"/>
+<entry name="gmp_perfect_square" url="function.gmp-perfect-square.php"/>
+<entry name="gmp_popcount" url="function.gmp-popcount.php"/>
+<entry name="gmp_pow" url="function.gmp-pow.php"/>
+<entry name="gmp_powm" url="function.gmp-powm.php"/>
+<entry name="gmp_prob_prime" url="function.gmp-prob-prime.php"/>
+<entry name="gmp_random" url="function.gmp-random.php"/>
+<entry name="gmp_scan0" url="function.gmp-scan0.php"/>
+<entry name="gmp_scan1" url="function.gmp-scan1.php"/>
+<entry name="gmp_setbit" url="function.gmp-setbit.php"/>
+<entry name="gmp_sign" url="function.gmp-sign.php"/>
+<entry name="gmp_sqrt" url="function.gmp-sqrt.php"/>
+<entry name="gmp_sqrtrem" url="function.gmp-sqrtrem.php"/>
+<entry name="gmp_strval" url="function.gmp-strval.php"/>
+<entry name="gmp_sub" url="function.gmp-sub.php"/>
+<entry name="gmp_testbit" url="function.gmp-testbit.php"/>
+<entry name="gmp_xor" url="function.gmp-xor.php"/>
+<entry name="abs" url="function.abs.php"/>
+<entry name="acos" url="function.acos.php"/>
+<entry name="acosh" url="function.acosh.php"/>
+<entry name="asin" url="function.asin.php"/>
+<entry name="asinh" url="function.asinh.php"/>
+<entry name="atan2" url="function.atan2.php"/>
+<entry name="atan" url="function.atan.php"/>
+<entry name="atanh" url="function.atanh.php"/>
+<entry name="base_convert" url="function.base-convert.php"/>
+<entry name="bindec" url="function.bindec.php"/>
+<entry name="ceil" url="function.ceil.php"/>
+<entry name="cos" url="function.cos.php"/>
+<entry name="cosh" url="function.cosh.php"/>
+<entry name="decbin" url="function.decbin.php"/>
+<entry name="dechex" url="function.dechex.php"/>
+<entry name="decoct" url="function.decoct.php"/>
+<entry name="deg2rad" url="function.deg2rad.php"/>
+<entry name="exp" url="function.exp.php"/>
+<entry name="expm1" url="function.expm1.php"/>
+<entry name="floor" url="function.floor.php"/>
+<entry name="fmod" url="function.fmod.php"/>
+<entry name="getrandmax" url="function.getrandmax.php"/>
+<entry name="hexdec" url="function.hexdec.php"/>
+<entry name="hypot" url="function.hypot.php"/>
+<entry name="is_finite" url="function.is-finite.php"/>
+<entry name="is_infinite" url="function.is-infinite.php"/>
+<entry name="is_nan" url="function.is-nan.php"/>
+<entry name="lcg_value" url="function.lcg-value.php"/>
+<entry name="log10" url="function.log10.php"/>
+<entry name="log1p" url="function.log1p.php"/>
+<entry name="log" url="function.log.php"/>
+<entry name="max" url="function.max.php"/>
+<entry name="min" url="function.min.php"/>
+<entry name="mt_getrandmax" url="function.mt-getrandmax.php"/>
+<entry name="mt_rand" url="function.mt-rand.php"/>
+<entry name="mt_srand" url="function.mt-srand.php"/>
+<entry name="octdec" url="function.octdec.php"/>
+<entry name="pi" url="function.pi.php"/>
+<entry name="pow" url="function.pow.php"/>
+<entry name="rad2deg" url="function.rad2deg.php"/>
+<entry name="rand" url="function.rand.php"/>
+<entry name="round" url="function.round.php"/>
+<entry name="sin" url="function.sin.php"/>
+<entry name="sinh" url="function.sinh.php"/>
+<entry name="sqrt" url="function.sqrt.php"/>
+<entry name="srand" url="function.srand.php"/>
+<entry name="tan" url="function.tan.php"/>
+<entry name="tanh" url="function.tanh.php"/>
+<entry name="stats_absolute_deviation" url="function.stats-absolute-deviation.php"/>
+<entry name="stats_cdf_beta" url="function.stats-cdf-beta.php"/>
+<entry name="stats_cdf_binomial" url="function.stats-cdf-binomial.php"/>
+<entry name="stats_cdf_cauchy" url="function.stats-cdf-cauchy.php"/>
+<entry name="stats_cdf_chisquare" url="function.stats-cdf-chisquare.php"/>
+<entry name="stats_cdf_exponential" url="function.stats-cdf-exponential.php"/>
+<entry name="stats_cdf_f" url="function.stats-cdf-f.php"/>
+<entry name="stats_cdf_gamma" url="function.stats-cdf-gamma.php"/>
+<entry name="stats_cdf_laplace" url="function.stats-cdf-laplace.php"/>
+<entry name="stats_cdf_logistic" url="function.stats-cdf-logistic.php"/>
+<entry name="stats_cdf_negative_binomial" url="function.stats-cdf-negative-binomial.php"/>
+<entry name="stats_cdf_noncentral_chisquare" url="function.stats-cdf-noncentral-chisquare.php"/>
+<entry name="stats_cdf_noncentral_f" url="function.stats-cdf-noncentral-f.php"/>
+<entry name="stats_cdf_poisson" url="function.stats-cdf-poisson.php"/>
+<entry name="stats_cdf_t" url="function.stats-cdf-t.php"/>
+<entry name="stats_cdf_uniform" url="function.stats-cdf-uniform.php"/>
+<entry name="stats_cdf_weibull" url="function.stats-cdf-weibull.php"/>
+<entry name="stats_covariance" url="function.stats-covariance.php"/>
+<entry name="stats_den_uniform" url="function.stats-den-uniform.php"/>
+<entry name="stats_dens_beta" url="function.stats-dens-beta.php"/>
+<entry name="stats_dens_cauchy" url="function.stats-dens-cauchy.php"/>
+<entry name="stats_dens_chisquare" url="function.stats-dens-chisquare.php"/>
+<entry name="stats_dens_exponential" url="function.stats-dens-exponential.php"/>
+<entry name="stats_dens_f" url="function.stats-dens-f.php"/>
+<entry name="stats_dens_gamma" url="function.stats-dens-gamma.php"/>
+<entry name="stats_dens_laplace" url="function.stats-dens-laplace.php"/>
+<entry name="stats_dens_logistic" url="function.stats-dens-logistic.php"/>
+<entry name="stats_dens_negative_binomial" url="function.stats-dens-negative-binomial.php"/>
+<entry name="stats_dens_normal" url="function.stats-dens-normal.php"/>
+<entry name="stats_dens_pmf_binomial" url="function.stats-dens-pmf-binomial.php"/>
+<entry name="stats_dens_pmf_hypergeometric" url="function.stats-dens-pmf-hypergeometric.php"/>
+<entry name="stats_dens_pmf_poisson" url="function.stats-dens-pmf-poisson.php"/>
+<entry name="stats_dens_t" url="function.stats-dens-t.php"/>
+<entry name="stats_dens_weibull" url="function.stats-dens-weibull.php"/>
+<entry name="stats_harmonic_mean" url="function.stats-harmonic-mean.php"/>
+<entry name="stats_kurtosis" url="function.stats-kurtosis.php"/>
+<entry name="stats_rand_gen_beta" url="function.stats-rand-gen-beta.php"/>
+<entry name="stats_rand_gen_chisquare" url="function.stats-rand-gen-chisquare.php"/>
+<entry name="stats_rand_gen_exponential" url="function.stats-rand-gen-exponential.php"/>
+<entry name="stats_rand_gen_f" url="function.stats-rand-gen-f.php"/>
+<entry name="stats_rand_gen_funiform" url="function.stats-rand-gen-funiform.php"/>
+<entry name="stats_rand_gen_gamma" url="function.stats-rand-gen-gamma.php"/>
+<entry name="stats_rand_gen_ibinomial_negative" url="function.stats-rand-gen-ibinomial-negative.php"/>
+<entry name="stats_rand_gen_ibinomial" url="function.stats-rand-gen-ibinomial.php"/>
+<entry name="stats_rand_gen_int" url="function.stats-rand-gen-int.php"/>
+<entry name="stats_rand_gen_ipoisson" url="function.stats-rand-gen-ipoisson.php"/>
+<entry name="stats_rand_gen_iuniform" url="function.stats-rand-gen-iuniform.php"/>
+<entry name="stats_rand_gen_noncenral_chisquare" url="function.stats-rand-gen-noncenral-chisquare.php"/>
+<entry name="stats_rand_gen_noncentral_f" url="function.stats-rand-gen-noncentral-f.php"/>
+<entry name="stats_rand_gen_noncentral_t" url="function.stats-rand-gen-noncentral-t.php"/>
+<entry name="stats_rand_gen_normal" url="function.stats-rand-gen-normal.php"/>
+<entry name="stats_rand_gen_t" url="function.stats-rand-gen-t.php"/>
+<entry name="stats_rand_get_seeds" url="function.stats-rand-get-seeds.php"/>
+<entry name="stats_rand_phrase_to_seeds" url="function.stats-rand-phrase-to-seeds.php"/>
+<entry name="stats_rand_ranf" url="function.stats-rand-ranf.php"/>
+<entry name="stats_rand_setall" url="function.stats-rand-setall.php"/>
+<entry name="stats_skew" url="function.stats-skew.php"/>
+<entry name="stats_standard_deviation" url="function.stats-standard-deviation.php"/>
+<entry name="stats_stat_binomial_coef" url="function.stats-stat-binomial-coef.php"/>
+<entry name="stats_stat_correlation" url="function.stats-stat-correlation.php"/>
+<entry name="stats_stat_gennch" url="function.stats-stat-gennch.php"/>
+<entry name="stats_stat_independent_t" url="function.stats-stat-independent-t.php"/>
+<entry name="stats_stat_innerproduct" url="function.stats-stat-innerproduct.php"/>
+<entry name="stats_stat_noncentral_t" url="function.stats-stat-noncentral-t.php"/>
+<entry name="stats_stat_paired_t" url="function.stats-stat-paired-t.php"/>
+<entry name="stats_stat_percentile" url="function.stats-stat-percentile.php"/>
+<entry name="stats_stat_powersum" url="function.stats-stat-powersum.php"/>
+<entry name="stats_variance" url="function.stats-variance.php"/>
+<entry name="fdf_add_doc_javascript" url="function.fdf-add-doc-javascript.php"/>
+<entry name="fdf_add_template" url="function.fdf-add-template.php"/>
+<entry name="fdf_close" url="function.fdf-close.php"/>
+<entry name="fdf_create" url="function.fdf-create.php"/>
+<entry name="fdf_enum_values" url="function.fdf-enum-values.php"/>
+<entry name="fdf_errno" url="function.fdf-errno.php"/>
+<entry name="fdf_error" url="function.fdf-error.php"/>
+<entry name="fdf_get_ap" url="function.fdf-get-ap.php"/>
+<entry name="fdf_get_attachment" url="function.fdf-get-attachment.php"/>
+<entry name="fdf_get_encoding" url="function.fdf-get-encoding.php"/>
+<entry name="fdf_get_file" url="function.fdf-get-file.php"/>
+<entry name="fdf_get_flags" url="function.fdf-get-flags.php"/>
+<entry name="fdf_get_opt" url="function.fdf-get-opt.php"/>
+<entry name="fdf_get_status" url="function.fdf-get-status.php"/>
+<entry name="fdf_get_value" url="function.fdf-get-value.php"/>
+<entry name="fdf_get_version" url="function.fdf-get-version.php"/>
+<entry name="fdf_header" url="function.fdf-header.php"/>
+<entry name="fdf_next_field_name" url="function.fdf-next-field-name.php"/>
+<entry name="fdf_open_string" url="function.fdf-open-string.php"/>
+<entry name="fdf_open" url="function.fdf-open.php"/>
+<entry name="fdf_remove_item" url="function.fdf-remove-item.php"/>
+<entry name="fdf_save_string" url="function.fdf-save-string.php"/>
+<entry name="fdf_save" url="function.fdf-save.php"/>
+<entry name="fdf_set_ap" url="function.fdf-set-ap.php"/>
+<entry name="fdf_set_encoding" url="function.fdf-set-encoding.php"/>
+<entry name="fdf_set_file" url="function.fdf-set-file.php"/>
+<entry name="fdf_set_flags" url="function.fdf-set-flags.php"/>
+<entry name="fdf_set_javascript_action" url="function.fdf-set-javascript-action.php"/>
+<entry name="fdf_set_on_import_javascript" url="function.fdf-set-on-import-javascript.php"/>
+<entry name="fdf_set_opt" url="function.fdf-set-opt.php"/>
+<entry name="fdf_set_status" url="function.fdf-set-status.php"/>
+<entry name="fdf_set_submit_form_action" url="function.fdf-set-submit-form-action.php"/>
+<entry name="fdf_set_target_frame" url="function.fdf-set-target-frame.php"/>
+<entry name="fdf_set_value" url="function.fdf-set-value.php"/>
+<entry name="fdf_set_version" url="function.fdf-set-version.php"/>
+<entry name="gnupg_adddecryptkey" url="function.gnupg-adddecryptkey.php"/>
+<entry name="gnupg_addencryptkey" url="function.gnupg-addencryptkey.php"/>
+<entry name="gnupg_addsignkey" url="function.gnupg-addsignkey.php"/>
+<entry name="gnupg_cleardecryptkeys" url="function.gnupg-cleardecryptkeys.php"/>
+<entry name="gnupg_clearencryptkeys" url="function.gnupg-clearencryptkeys.php"/>
+<entry name="gnupg_clearsignkeys" url="function.gnupg-clearsignkeys.php"/>
+<entry name="gnupg_decrypt" url="function.gnupg-decrypt.php"/>
+<entry name="gnupg_decryptverify" url="function.gnupg-decryptverify.php"/>
+<entry name="gnupg_encrypt" url="function.gnupg-encrypt.php"/>
+<entry name="gnupg_encryptsign" url="function.gnupg-encryptsign.php"/>
+<entry name="gnupg_export" url="function.gnupg-export.php"/>
+<entry name="gnupg_geterror" url="function.gnupg-geterror.php"/>
+<entry name="gnupg_getprotocol" url="function.gnupg-getprotocol.php"/>
+<entry name="gnupg_import" url="function.gnupg-import.php"/>
+<entry name="gnupg_init" url="function.gnupg-init.php"/>
+<entry name="gnupg_keyinfo" url="function.gnupg-keyinfo.php"/>
+<entry name="gnupg_setarmor" url="function.gnupg-setarmor.php"/>
+<entry name="gnupg_seterrormode" url="function.gnupg-seterrormode.php"/>
+<entry name="gnupg_setsignmode" url="function.gnupg-setsignmode.php"/>
+<entry name="gnupg_sign" url="function.gnupg-sign.php"/>
+<entry name="gnupg_verify" url="function.gnupg-verify.php"/>
+<entry name="HaruDoc::addPage" url="function.harudoc-addpage.php"/>
+<entry name="HaruDoc::addPageLabel" url="function.harudoc-addpagelabel.php"/>
+<entry name="HaruDoc::__construct" url="function.harudoc-construct.php"/>
+<entry name="HaruDoc::createOutline" url="function.harudoc-createoutline.php"/>
+<entry name="HaruDoc::getCurrentEncoder" url="function.harudoc-getcurrentencoder.php"/>
+<entry name="HaruDoc::getCurrentPage" url="function.harudoc-getcurrentpage.php"/>
+<entry name="HaruDoc::getEncoder" url="function.harudoc-getencoder.php"/>
+<entry name="HaruDoc::getFont" url="function.harudoc-getfont.php"/>
+<entry name="HaruDoc::getInfoAttr" url="function.harudoc-getinfoattr.php"/>
+<entry name="HaruDoc::getPageLayout" url="function.harudoc-getpagelayout.php"/>
+<entry name="HaruDoc::getPageMode" url="function.harudoc-getpagemode.php"/>
+<entry name="HaruDoc::getStreamSize" url="function.harudoc-getstreamsize.php"/>
+<entry name="HaruDoc::insertPage" url="function.harudoc-insertpage.php"/>
+<entry name="HaruDoc::loadJPEG" url="function.harudoc-loadjpeg.php"/>
+<entry name="HaruDoc::loadPNG" url="function.harudoc-loadpng.php"/>
+<entry name="HaruDoc::loadRaw" url="function.harudoc-loadraw.php"/>
+<entry name="HaruDoc::loadTTC" url="function.harudoc-loadttc.php"/>
+<entry name="HaruDoc::loadTTF" url="function.harudoc-loadttf.php"/>
+<entry name="HaruDoc::loadType1" url="function.harudoc-loadtype1.php"/>
+<entry name="HaruDoc::output" url="function.harudoc-output.php"/>
+<entry name="HaruDoc::readFromStream" url="function.harudoc-readfromstream.php"/>
+<entry name="HaruDoc::resetError" url="function.harudoc-reseterror.php"/>
+<entry name="HaruDoc::resetStream" url="function.harudoc-resetstream.php"/>
+<entry name="HaruDoc::save" url="function.harudoc-save.php"/>
+<entry name="HaruDoc::saveToStream" url="function.harudoc-savetostream.php"/>
+<entry name="HaruDoc::setCompressionMode" url="function.harudoc-setcompressionmode.php"/>
+<entry name="HaruDoc::setCurrentEncoder" url="function.harudoc-setcurrentencoder.php"/>
+<entry name="HaruDoc::setEncryptionMode" url="function.harudoc-setencryptionmode.php"/>
+<entry name="HaruDoc::setInfoAttr" url="function.harudoc-setinfoattr.php"/>
+<entry name="HaruDoc::setInfoDateAttr" url="function.harudoc-setinfodateattr.php"/>
+<entry name="HaruDoc::setOpenAction" url="function.harudoc-setopenaction.php"/>
+<entry name="HaruDoc::setPageLayout" url="function.harudoc-setpagelayout.php"/>
+<entry name="HaruDoc::setPageMode" url="function.harudoc-setpagemode.php"/>
+<entry name="HaruDoc::setPagesConfiguration" url="function.harudoc-setpagesconfiguration.php"/>
+<entry name="HaruDoc::setPassword" url="function.harudoc-setpassword.php"/>
+<entry name="HaruDoc::setPermission" url="function.harudoc-setpermission.php"/>
+<entry name="HaruDoc::useCNSEncodings" url="function.harudoc-usecnsencodings.php"/>
+<entry name="HaruDoc::useCNSFonts" url="function.harudoc-usecnsfonts.php"/>
+<entry name="HaruDoc::useCNTEncodings" url="function.harudoc-usecntencodings.php"/>
+<entry name="HaruDoc::useCNTFonts" url="function.harudoc-usecntfonts.php"/>
+<entry name="HaruDoc::useJPEncodings" url="function.harudoc-usejpencodings.php"/>
+<entry name="HaruDoc::useJPFonts" url="function.harudoc-usejpfonts.php"/>
+<entry name="HaruDoc::useKREncodings" url="function.harudoc-usekrencodings.php"/>
+<entry name="HaruDoc::useKRFonts" url="function.harudoc-usekrfonts.php"/>
+<entry name="HaruPage::arc" url="function.harupage-arc.php"/>
+<entry name="HaruPage::beginText" url="function.harupage-begintext.php"/>
+<entry name="HaruPage::circle" url="function.harupage-circle.php"/>
+<entry name="HaruPage::closePath" url="function.harupage-closepath.php"/>
+<entry name="HaruPage::concat" url="function.harupage-concat.php"/>
+<entry name="HaruPage::createDestination" url="function.harupage-createdestination.php"/>
+<entry name="HaruPage::createLinkAnnotation" url="function.harupage-createlinkannotation.php"/>
+<entry name="HaruPage::createTextAnnotation" url="function.harupage-createtextannotation.php"/>
+<entry name="HaruPage::createURLAnnotation" url="function.harupage-createurlannotation.php"/>
+<entry name="HaruPage::curveTo2" url="function.harupage-curveto2.php"/>
+<entry name="HaruPage::curveTo3" url="function.harupage-curveto3.php"/>
+<entry name="HaruPage::curveTo" url="function.harupage-curveto.php"/>
+<entry name="HaruPage::drawImage" url="function.harupage-drawimage.php"/>
+<entry name="HaruPage::ellipse" url="function.harupage-ellipse.php"/>
+<entry name="HaruPage::endPath" url="function.harupage-endpath.php"/>
+<entry name="HaruPage::endText" url="function.harupage-endtext.php"/>
+<entry name="HaruPage::eofill" url="function.harupage-eofill.php"/>
+<entry name="HaruPage::eoFillStroke" url="function.harupage-eofillstroke.php"/>
+<entry name="HaruPage::fill" url="function.harupage-fill.php"/>
+<entry name="HaruPage::fillStroke" url="function.harupage-fillstroke.php"/>
+<entry name="HaruPage::getCharSpace" url="function.harupage-getcharspace.php"/>
+<entry name="HaruPage::getCMYKFill" url="function.harupage-getcmykfill.php"/>
+<entry name="HaruPage::getCMYKStroke" url="function.harupage-getcmykstroke.php"/>
+<entry name="HaruPage::getCurrentFont" url="function.harupage-getcurrentfont.php"/>
+<entry name="HaruPage::getCurrentFontSize" url="function.harupage-getcurrentfontsize.php"/>
+<entry name="HaruPage::getCurrentPos" url="function.harupage-getcurrentpos.php"/>
+<entry name="HaruPage::getCurrentTextPos" url="function.harupage-getcurrenttextpos.php"/>
+<entry name="HaruPage::getDash" url="function.harupage-getdash.php"/>
+<entry name="HaruPage::getFillingColorSpace" url="function.harupage-getfillingcolorspace.php"/>
+<entry name="HaruPage::getFlatness" url="function.harupage-getflatness.php"/>
+<entry name="HaruPage::getGMode" url="function.harupage-getgmode.php"/>
+<entry name="HaruPage::getGrayFill" url="function.harupage-getgrayfill.php"/>
+<entry name="HaruPage::getGrayStroke" url="function.harupage-getgraystroke.php"/>
+<entry name="HaruPage::getHeight" url="function.harupage-getheight.php"/>
+<entry name="HaruPage::getHorizontalScaling" url="function.harupage-gethorizontalscaling.php"/>
+<entry name="HaruPage::getLineCap" url="function.harupage-getlinecap.php"/>
+<entry name="HaruPage::getLineJoin" url="function.harupage-getlinejoin.php"/>
+<entry name="HaruPage::getLineWidth" url="function.harupage-getlinewidth.php"/>
+<entry name="HaruPage::getMiterLimit" url="function.harupage-getmiterlimit.php"/>
+<entry name="HaruPage::getRGBFill" url="function.harupage-getrgbfill.php"/>
+<entry name="HaruPage::getRGBStroke" url="function.harupage-getrgbstroke.php"/>
+<entry name="HaruPage::getStrokingColorSpace" url="function.harupage-getstrokingcolorspace.php"/>
+<entry name="HaruPage::getTextLeading" url="function.harupage-gettextleading.php"/>
+<entry name="HaruPage::getTextMatrix" url="function.harupage-gettextmatrix.php"/>
+<entry name="HaruPage::getTextRenderingMode" url="function.harupage-gettextrenderingmode.php"/>
+<entry name="HaruPage::getTextRise" url="function.harupage-gettextrise.php"/>
+<entry name="HaruPage::getTextWidth" url="function.harupage-gettextwidth.php"/>
+<entry name="HaruPage::getTransMatrix" url="function.harupage-gettransmatrix.php"/>
+<entry name="HaruPage::getWidth" url="function.harupage-getwidth.php"/>
+<entry name="HaruPage::getWordSpace" url="function.harupage-getwordspace.php"/>
+<entry name="HaruPage::lineTo" url="function.harupage-lineto.php"/>
+<entry name="HaruPage::measureText" url="function.harupage-measuretext.php"/>
+<entry name="HaruPage::moveTextPos" url="function.harupage-movetextpos.php"/>
+<entry name="HaruPage::moveTo" url="function.harupage-moveto.php"/>
+<entry name="HaruPage::moveToNextLine" url="function.harupage-movetonextline.php"/>
+<entry name="HaruPage::rectangle" url="function.harupage-rectangle.php"/>
+<entry name="HaruPage::setCharSpace" url="function.harupage-setcharspace.php"/>
+<entry name="HaruPage::setCMYKFill" url="function.harupage-setcmykfill.php"/>
+<entry name="HaruPage::setCMYKStroke" url="function.harupage-setcmykstroke.php"/>
+<entry name="HaruPage::setDash" url="function.harupage-setdash.php"/>
+<entry name="HaruPage::setFlatness" url="function.harupage-setflatness.php"/>
+<entry name="HaruPage::setFontAndSize" url="function.harupage-setfontandsize.php"/>
+<entry name="HaruPage::setGrayFill" url="function.harupage-setgrayfill.php"/>
+<entry name="HaruPage::setGrayStroke" url="function.harupage-setgraystroke.php"/>
+<entry name="HaruPage::setHeight" url="function.harupage-setheight.php"/>
+<entry name="HaruPage::setHorizontalScaling" url="function.harupage-sethorizontalscaling.php"/>
+<entry name="HaruPage::setLineCap" url="function.harupage-setlinecap.php"/>
+<entry name="HaruPage::setLineJoin" url="function.harupage-setlinejoin.php"/>
+<entry name="HaruPage::setLineWidth" url="function.harupage-setlinewidth.php"/>
+<entry name="HaruPage::setMiterLimit" url="function.harupage-setmiterlimit.php"/>
+<entry name="HaruPage::setRGBFill" url="function.harupage-setrgbfill.php"/>
+<entry name="HaruPage::setRGBStroke" url="function.harupage-setrgbstroke.php"/>
+<entry name="HaruPage::setRotate" url="function.harupage-setrotate.php"/>
+<entry name="HaruPage::setSize" url="function.harupage-setsize.php"/>
+<entry name="HaruPage::setSlideShow" url="function.harupage-setslideshow.php"/>
+<entry name="HaruPage::setTextLeading" url="function.harupage-settextleading.php"/>
+<entry name="HaruPage::setTextMatrix" url="function.harupage-settextmatrix.php"/>
+<entry name="HaruPage::setTextRenderingMode" url="function.harupage-settextrenderingmode.php"/>
+<entry name="HaruPage::setTextRise" url="function.harupage-settextrise.php"/>
+<entry name="HaruPage::setWidth" url="function.harupage-setwidth.php"/>
+<entry name="HaruPage::setWordSpace" url="function.harupage-setwordspace.php"/>
+<entry name="HaruPage::showText" url="function.harupage-showtext.php"/>
+<entry name="HaruPage::showTextNextLine" url="function.harupage-showtextnextline.php"/>
+<entry name="HaruPage::stroke" url="function.harupage-stroke.php"/>
+<entry name="HaruPage::textOut" url="function.harupage-textout.php"/>
+<entry name="HaruPage::textRect" url="function.harupage-textrect.php"/>
+<entry name="HaruFont::getAscent" url="function.harufont-getascent.php"/>
+<entry name="HaruFont::getCapHeight" url="function.harufont-getcapheight.php"/>
+<entry name="HaruFont::getDescent" url="function.harufont-getdescent.php"/>
+<entry name="HaruFont::getEncodingName" url="function.harufont-getencodingname.php"/>
+<entry name="HaruFont::getFontName" url="function.harufont-getfontname.php"/>
+<entry name="HaruFont::getTextWidth" url="function.harufont-gettextwidth.php"/>
+<entry name="HaruFont::getUnicodeWidth" url="function.harufont-getunicodewidth.php"/>
+<entry name="HaruFont::getXHeight" url="function.harufont-getxheight.php"/>
+<entry name="HaruFont::measureText" url="function.harufont-measuretext.php"/>
+<entry name="HaruImage::getBitsPerComponent" url="function.haruimage-getbitspercomponent.php"/>
+<entry name="HaruImage::getColorSpace" url="function.haruimage-getcolorspace.php"/>
+<entry name="HaruImage::getHeight" url="function.haruimage-getheight.php"/>
+<entry name="HaruImage::getSize" url="function.haruimage-getsize.php"/>
+<entry name="HaruImage::getWidth" url="function.haruimage-getwidth.php"/>
+<entry name="HaruImage::setColorMask" url="function.haruimage-setcolormask.php"/>
+<entry name="HaruImage::setMaskImage" url="function.haruimage-setmaskimage.php"/>
+<entry name="HaruEncoder::getByteType" url="function.haruencoder-getbytetype.php"/>
+<entry name="HaruEncoder::getType" url="function.haruencoder-gettype.php"/>
+<entry name="HaruEncoder::getUnicode" url="function.haruencoder-getunicode.php"/>
+<entry name="HaruEncoder::getWritingMode" url="function.haruencoder-getwritingmode.php"/>
+<entry name="HaruOutline::setDestination" url="function.haruoutline-setdestination.php"/>
+<entry name="HaruOutline::setOpened" url="function.haruoutline-setopened.php"/>
+<entry name="HaruAnnotation::setBorderStyle" url="function.haruannotation-setborderstyle.php"/>
+<entry name="HaruAnnotation::setHighlightMode" url="function.haruannotation-sethighlightmode.php"/>
+<entry name="HaruAnnotation::setIcon" url="function.haruannotation-seticon.php"/>
+<entry name="HaruAnnotation::setOpened" url="function.haruannotation-setopened.php"/>
+<entry name="HaruDestination::setFit" url="function.harudestination-setfit.php"/>
+<entry name="HaruDestination::setFitB" url="function.harudestination-setfitb.php"/>
+<entry name="HaruDestination::setFitBH" url="function.harudestination-setfitbh.php"/>
+<entry name="HaruDestination::setFitBV" url="function.harudestination-setfitbv.php"/>
+<entry name="HaruDestination::setFitH" url="function.harudestination-setfith.php"/>
+<entry name="HaruDestination::setFitR" url="function.harudestination-setfitr.php"/>
+<entry name="HaruDestination::setFitV" url="function.harudestination-setfitv.php"/>
+<entry name="HaruDestination::setXYZ" url="function.harudestination-setxyz.php"/>
+<entry name="ming_keypress" url="function.ming-keypress.php"/>
+<entry name="ming_setcubicthreshold" url="function.ming-setcubicthreshold.php"/>
+<entry name="ming_setscale" url="function.ming-setscale.php"/>
+<entry name="ming_setswfcompression" url="function.ming-setswfcompression.php"/>
+<entry name="ming_useconstants" url="function.ming-useconstants.php"/>
+<entry name="ming_useswfversion" url="function.ming-useswfversion.php"/>
+<entry name="SWFAction->__construct()" url="function.swfaction.construct.php"/>
+<entry name="SWFBitmap->__construct()" url="function.swfbitmap.construct.php"/>
+<entry name="SWFBitmap->getHeight()" url="function.swfbitmap.getheight.php"/>
+<entry name="SWFBitmap->getWidth()" url="function.swfbitmap.getwidth.php"/>
+<entry name="SWFButton->addAction()" url="function.swfbutton.addaction.php"/>
+<entry name="SWFButton->addASound()" url="function.swfbutton.addasound.php"/>
+<entry name="SWFButton->addShape()" url="function.swfbutton.addshape.php"/>
+<entry name="SWFButton->__construct()" url="function.swfbutton.construct.php"/>
+<entry name="SWFButton->setAction()" url="function.swfbutton.setaction.php"/>
+<entry name="SWFButton->setDown()" url="function.swfbutton.setdown.php"/>
+<entry name="SWFButton->setHit()" url="function.swfbutton.sethit.php"/>
+<entry name="SWFButton->setMenu()" url="function.swfbutton.setmenu.php"/>
+<entry name="SWFButton->setOver()" url="function.swfbutton.setover.php"/>
+<entry name="SWFButton->setUp()" url="function.swfbutton.setup.php"/>
+<entry name="SWFDisplayItem->addAction()" url="function.swfdisplayitem.addaction.php"/>
+<entry name="SWFDisplayItem->addColor()" url="function.swfdisplayitem.addcolor.php"/>
+<entry name="SWFDisplayItem->endMask()" url="function.swfdisplayitem.endmask.php"/>
+<entry name="SWFDisplayItem->getRot()" url="function.swfdisplayitem.getrot.php"/>
+<entry name="SWFDisplayItem->getX()" url="function.swfdisplayitem.getx.php"/>
+<entry name="SWFDisplayItem->getXScale()" url="function.swfdisplayitem.getxscale.php"/>
+<entry name="SWFDisplayItem->getXSkew()" url="function.swfdisplayitem.getxskew.php"/>
+<entry name="SWFDisplayItem->getY()" url="function.swfdisplayitem.gety.php"/>
+<entry name="SWFDisplayItem->getYScale()" url="function.swfdisplayitem.getyscale.php"/>
+<entry name="SWFDisplayItem->getYSkew()" url="function.swfdisplayitem.getyskew.php"/>
+<entry name="SWFDisplayItem->move()" url="function.swfdisplayitem.move.php"/>
+<entry name="SWFDisplayItem->moveTo()" url="function.swfdisplayitem.moveto.php"/>
+<entry name="SWFDisplayItem->multColor()" url="function.swfdisplayitem.multcolor.php"/>
+<entry name="SWFDisplayItem->remove()" url="function.swfdisplayitem.remove.php"/>
+<entry name="SWFDisplayItem->rotate()" url="function.swfdisplayitem.rotate.php"/>
+<entry name="SWFDisplayItem->rotateTo()" url="function.swfdisplayitem.rotateto.php"/>
+<entry name="SWFDisplayItem->scale()" url="function.swfdisplayitem.scale.php"/>
+<entry name="SWFDisplayItem->scaleTo()" url="function.swfdisplayitem.scaleto.php"/>
+<entry name="SWFDisplayItem->setDepth()" url="function.swfdisplayitem.setdepth.php"/>
+<entry name="SWFDisplayItem->setMaskLevel()" url="function.swfdisplayitem.setmasklevel.php"/>
+<entry name="SWFDisplayItem->setMatrix()" url="function.swfdisplayitem.setmatrix.php"/>
+<entry name="SWFDisplayItem->setName()" url="function.swfdisplayitem.setname.php"/>
+<entry name="SWFDisplayItem->setRatio()" url="function.swfdisplayitem.setratio.php"/>
+<entry name="SWFDisplayItem->skewX()" url="function.swfdisplayitem.skewx.php"/>
+<entry name="SWFDisplayItem->skewXTo()" url="function.swfdisplayitem.skewxto.php"/>
+<entry name="SWFDisplayItem->skewY()" url="function.swfdisplayitem.skewy.php"/>
+<entry name="SWFDisplayItem->skewYTo()" url="function.swfdisplayitem.skewyto.php"/>
+<entry name="SWFFill->moveTo()" url="function.swffill.moveto.php"/>
+<entry name="SWFFill->rotateTo()" url="function.swffill.rotateto.php"/>
+<entry name="SWFFill->scaleTo()" url="function.swffill.scaleto.php"/>
+<entry name="SWFFill->skewXTo()" url="function.swffill.skewxto.php"/>
+<entry name="SWFFill->skewYTo()" url="function.swffill.skewyto.php"/>
+<entry name="SWFFont->__construct()" url="function.swffont.construct.php"/>
+<entry name="SWFFont->getAscent()" url="function.swffont.getascent.php"/>
+<entry name="SWFFont->getDescent()" url="function.swffont.getdescent.php"/>
+<entry name="SWFFont->getLeading()" url="function.swffont.getleading.php"/>
+<entry name="SWFFont->getShape()" url="function.swffont.getshape.php"/>
+<entry name="SWFFont->getUTF8Width()" url="function.swffont.getutf8width.php"/>
+<entry name="SWFFont->getWidth()" url="function.swffont.getwidth.php"/>
+<entry name="SWFFontChar->addChars()" url="function.swffontchar.addchars.php"/>
+<entry name="SWFFontChar->addUTF8Chars()" url="function.swffontchar.addutf8chars.php"/>
+<entry name="SWFGradient->addEntry()" url="function.swfgradient.addentry.php"/>
+<entry name="SWFGradient->__construct()" url="function.swfgradient.construct.php"/>
+<entry name="SWFMorph->__construct()" url="function.swfmorph.construct.php"/>
+<entry name="SWFMorph->getShape1()" url="function.swfmorph.getshape1.php"/>
+<entry name="SWFMorph->getShape2()" url="function.swfmorph.getshape2.php"/>
+<entry name="SWFMovie->add()" url="function.swfmovie.add.php"/>
+<entry name="SWFMovie->addExport()" url="function.swfmovie.addexport.php"/>
+<entry name="SWFMovie->addFont()" url="function.swfmovie.addfont.php"/>
+<entry name="SWFMovie->__construct()" url="function.swfmovie.construct.php"/>
+<entry name="SWFMovie->importChar()" url="function.swfmovie.importchar.php"/>
+<entry name="SWFMovie->importFont()" url="function.swfmovie.importfont.php"/>
+<entry name="SWFMovie->labelFrame()" url="function.swfmovie.labelframe.php"/>
+<entry name="SWFMovie->nextFrame()" url="function.swfmovie.nextframe.php"/>
+<entry name="SWFMovie->output()" url="function.swfmovie.output.php"/>
+<entry name="SWFMovie->remove()" url="function.swfmovie.remove.php"/>
+<entry name="SWFMovie->save()" url="function.swfmovie.save.php"/>
+<entry name="SWFMovie->saveToFile()" url="function.swfmovie.savetofile.php"/>
+<entry name="SWFMovie->setbackground()" url="function.swfmovie.setbackground.php"/>
+<entry name="SWFMovie->setDimension()" url="function.swfmovie.setdimension.php"/>
+<entry name="SWFMovie->setFrames()" url="function.swfmovie.setframes.php"/>
+<entry name="SWFMovie->setRate()" url="function.swfmovie.setrate.php"/>
+<entry name="SWFMovie->startSound()" url="function.swfmovie.startsound.php"/>
+<entry name="SWFMovie->stopSound()" url="function.swfmovie.stopsound.php"/>
+<entry name="SWFMovie->streamMP3()" url="function.swfmovie.streammp3.php"/>
+<entry name="SWFMovie->writeExports()" url="function.swfmovie.writeexports.php"/>
+<entry name="SWFPrebuiltClip->__construct()" url="function.swfprebuiltclip.construct.php"/>
+<entry name="SWFShape->addFill()" url="function.swfshape.addfill.php"/>
+<entry name="SWFShape->__construct()" url="function.swfshape.construct.php"/>
+<entry name="SWFShape->drawArc()" url="function.swfshape.drawarc.php"/>
+<entry name="SWFShape->drawCircle()" url="function.swfshape.drawcircle.php"/>
+<entry name="SWFShape->drawCubic()" url="function.swfshape.drawcubic.php"/>
+<entry name="SWFShape->drawCubicTo()" url="function.swfshape.drawcubicto.php"/>
+<entry name="SWFShape->drawCurve()" url="function.swfshape.drawcurve.php"/>
+<entry name="SWFShape->drawCurveTo()" url="function.swfshape.drawcurveto.php"/>
+<entry name="SWFShape->drawGlyph()" url="function.swfshape.drawglyph.php"/>
+<entry name="SWFShape->drawLine()" url="function.swfshape.drawline.php"/>
+<entry name="SWFShape->drawLineTo()" url="function.swfshape.drawlineto.php"/>
+<entry name="SWFShape->movePen()" url="function.swfshape.movepen.php"/>
+<entry name="SWFShape->movePenTo()" url="function.swfshape.movepento.php"/>
+<entry name="SWFShape->setLeftFill()" url="function.swfshape.setleftfill.php"/>
+<entry name="SWFShape->setLine()" url="function.swfshape.setline.php"/>
+<entry name="SWFShape->setRightFill()" url="function.swfshape.setrightfill.php"/>
+<entry name="SWFSound" url="function.swfsound.construct.php"/>
+<entry name="SWFSoundInstance->loopCount()" url="function.swfsoundinstance.loopcount.php"/>
+<entry name="SWFSoundInstance->loopInPoint()" url="function.swfsoundinstance.loopinpoint.php"/>
+<entry name="SWFSoundInstance->loopOutPoint()" url="function.swfsoundinstance.loopoutpoint.php"/>
+<entry name="SWFSoundInstance->noMultiple()" url="function.swfsoundinstance.nomultiple.php"/>
+<entry name="SWFSprite->add()" url="function.swfsprite.add.php"/>
+<entry name="SWFSprite->__construct()" url="function.swfsprite.construct.php"/>
+<entry name="SWFSprite->labelFrame()" url="function.swfsprite.labelframe.php"/>
+<entry name="SWFSprite->nextFrame()" url="function.swfsprite.nextframe.php"/>
+<entry name="SWFSprite->remove()" url="function.swfsprite.remove.php"/>
+<entry name="SWFSprite->setFrames()" url="function.swfsprite.setframes.php"/>
+<entry name="SWFSprite->startSound()" url="function.swfsprite.startsound.php"/>
+<entry name="SWFSprite->stopSound()" url="function.swfsprite.stopsound.php"/>
+<entry name="SWFText->addString()" url="function.swftext.addstring.php"/>
+<entry name="SWFText->addUTF8String()" url="function.swftext.addutf8string.php"/>
+<entry name="SWFText->__construct()" url="function.swftext.construct.php"/>
+<entry name="SWFText->getAscent()" url="function.swftext.getascent.php"/>
+<entry name="SWFText->getDescent()" url="function.swftext.getdescent.php"/>
+<entry name="SWFText->getLeading()" url="function.swftext.getleading.php"/>
+<entry name="SWFText->getUTF8Width()" url="function.swftext.getutf8width.php"/>
+<entry name="SWFText->getWidth()" url="function.swftext.getwidth.php"/>
+<entry name="SWFText->moveTo()" url="function.swftext.moveto.php"/>
+<entry name="SWFText->setColor()" url="function.swftext.setcolor.php"/>
+<entry name="SWFText->setFont()" url="function.swftext.setfont.php"/>
+<entry name="SWFText->setHeight()" url="function.swftext.setheight.php"/>
+<entry name="SWFText->setSpacing()" url="function.swftext.setspacing.php"/>
+<entry name="SWFTextField->addChars()" url="function.swftextfield.addchars.php"/>
+<entry name="SWFTextField->addString()" url="function.swftextfield.addstring.php"/>
+<entry name="SWFTextField->align()" url="function.swftextfield.align.php"/>
+<entry name="SWFTextField->__construct()" url="function.swftextfield.construct.php"/>
+<entry name="SWFTextField->setBounds()" url="function.swftextfield.setbounds.php"/>
+<entry name="SWFTextField->setColor()" url="function.swftextfield.setcolor.php"/>
+<entry name="SWFTextField->setFont()" url="function.swftextfield.setfont.php"/>
+<entry name="SWFTextField->setHeight()" url="function.swftextfield.setheight.php"/>
+<entry name="SWFTextField->setIndentation()" url="function.swftextfield.setindentation.php"/>
+<entry name="SWFTextField->setLeftMargin()" url="function.swftextfield.setleftmargin.php"/>
+<entry name="SWFTextField->setLineSpacing()" url="function.swftextfield.setlinespacing.php"/>
+<entry name="SWFTextField->setMargins()" url="function.swftextfield.setmargins.php"/>
+<entry name="SWFTextField->setName()" url="function.swftextfield.setname.php"/>
+<entry name="SWFTextField->setPadding()" url="function.swftextfield.setpadding.php"/>
+<entry name="SWFTextField->setRightMargin()" url="function.swftextfield.setrightmargin.php"/>
+<entry name="SWFVideoStream->__construct()" url="function.swfvideostream.construct.php"/>
+<entry name="SWFVideoStream->getNumFrames()" url="function.swfvideostream.getnumframes.php"/>
+<entry name="SWFVideoStream->setDimension()" url="function.swfvideostream.setdimension.php"/>
+<entry name="PDF_activate_item" url="function.pdf-activate-item.php"/>
+<entry name="PDF_add_annotation" url="function.pdf-add-annotation.php"/>
+<entry name="PDF_add_bookmark" url="function.pdf-add-bookmark.php"/>
+<entry name="PDF_add_launchlink" url="function.pdf-add-launchlink.php"/>
+<entry name="PDF_add_locallink" url="function.pdf-add-locallink.php"/>
+<entry name="PDF_add_nameddest" url="function.pdf-add-nameddest.php"/>
+<entry name="PDF_add_note" url="function.pdf-add-note.php"/>
+<entry name="PDF_add_outline" url="function.pdf-add-outline.php"/>
+<entry name="PDF_add_pdflink" url="function.pdf-add-pdflink.php"/>
+<entry name="PDF_add_table_cell" url="function.pdf-add-table-cell.php"/>
+<entry name="PDF_add_textflow" url="function.pdf-add-textflow.php"/>
+<entry name="PDF_add_thumbnail" url="function.pdf-add-thumbnail.php"/>
+<entry name="PDF_add_weblink" url="function.pdf-add-weblink.php"/>
+<entry name="PDF_arc" url="function.pdf-arc.php"/>
+<entry name="PDF_arcn" url="function.pdf-arcn.php"/>
+<entry name="PDF_attach_file" url="function.pdf-attach-file.php"/>
+<entry name="PDF_begin_document" url="function.pdf-begin-document.php"/>
+<entry name="PDF_begin_font" url="function.pdf-begin-font.php"/>
+<entry name="PDF_begin_glyph" url="function.pdf-begin-glyph.php"/>
+<entry name="PDF_begin_item" url="function.pdf-begin-item.php"/>
+<entry name="PDF_begin_layer" url="function.pdf-begin-layer.php"/>
+<entry name="PDF_begin_page_ext" url="function.pdf-begin-page-ext.php"/>
+<entry name="PDF_begin_page" url="function.pdf-begin-page.php"/>
+<entry name="PDF_begin_pattern" url="function.pdf-begin-pattern.php"/>
+<entry name="PDF_begin_template_ext" url="function.pdf-begin-template-ext.php"/>
+<entry name="PDF_begin_template" url="function.pdf-begin-template.php"/>
+<entry name="PDF_circle" url="function.pdf-circle.php"/>
+<entry name="PDF_clip" url="function.pdf-clip.php"/>
+<entry name="PDF_close_image" url="function.pdf-close-image.php"/>
+<entry name="PDF_close_pdi_page" url="function.pdf-close-pdi-page.php"/>
+<entry name="PDF_close_pdi" url="function.pdf-close-pdi.php"/>
+<entry name="PDF_close" url="function.pdf-close.php"/>
+<entry name="PDF_closepath_fill_stroke" url="function.pdf-closepath-fill-stroke.php"/>
+<entry name="PDF_closepath_stroke" url="function.pdf-closepath-stroke.php"/>
+<entry name="PDF_closepath" url="function.pdf-closepath.php"/>
+<entry name="PDF_concat" url="function.pdf-concat.php"/>
+<entry name="PDF_continue_text" url="function.pdf-continue-text.php"/>
+<entry name="PDF_create_3dview" url="function.pdf-create-3dview.php"/>
+<entry name="PDF_create_action" url="function.pdf-create-action.php"/>
+<entry name="PDF_create_annotation" url="function.pdf-create-annotation.php"/>
+<entry name="PDF_create_bookmark" url="function.pdf-create-bookmark.php"/>
+<entry name="PDF_create_field" url="function.pdf-create-field.php"/>
+<entry name="PDF_create_fieldgroup" url="function.pdf-create-fieldgroup.php"/>
+<entry name="PDF_create_gstate" url="function.pdf-create-gstate.php"/>
+<entry name="PDF_create_pvf" url="function.pdf-create-pvf.php"/>
+<entry name="PDF_create_textflow" url="function.pdf-create-textflow.php"/>
+<entry name="PDF_curveto" url="function.pdf-curveto.php"/>
+<entry name="PDF_define_layer" url="function.pdf-define-layer.php"/>
+<entry name="PDF_delete_pvf" url="function.pdf-delete-pvf.php"/>
+<entry name="PDF_delete_table" url="function.pdf-delete-table.php"/>
+<entry name="PDF_delete_textflow" url="function.pdf-delete-textflow.php"/>
+<entry name="PDF_delete" url="function.pdf-delete.php"/>
+<entry name="PDF_encoding_set_char" url="function.pdf-encoding-set-char.php"/>
+<entry name="PDF_end_document" url="function.pdf-end-document.php"/>
+<entry name="PDF_end_font" url="function.pdf-end-font.php"/>
+<entry name="PDF_end_glyph" url="function.pdf-end-glyph.php"/>
+<entry name="PDF_end_item" url="function.pdf-end-item.php"/>
+<entry name="PDF_end_layer" url="function.pdf-end-layer.php"/>
+<entry name="PDF_end_page_ext" url="function.pdf-end-page-ext.php"/>
+<entry name="PDF_end_page" url="function.pdf-end-page.php"/>
+<entry name="PDF_end_pattern" url="function.pdf-end-pattern.php"/>
+<entry name="PDF_end_template" url="function.pdf-end-template.php"/>
+<entry name="PDF_endpath" url="function.pdf-endpath.php"/>
+<entry name="PDF_fill_imageblock" url="function.pdf-fill-imageblock.php"/>
+<entry name="PDF_fill_pdfblock" url="function.pdf-fill-pdfblock.php"/>
+<entry name="PDF_fill_stroke" url="function.pdf-fill-stroke.php"/>
+<entry name="PDF_fill_textblock" url="function.pdf-fill-textblock.php"/>
+<entry name="PDF_fill" url="function.pdf-fill.php"/>
+<entry name="PDF_findfont" url="function.pdf-findfont.php"/>
+<entry name="PDF_fit_image" url="function.pdf-fit-image.php"/>
+<entry name="PDF_fit_pdi_page" url="function.pdf-fit-pdi-page.php"/>
+<entry name="PDF_fit_table" url="function.pdf-fit-table.php"/>
+<entry name="PDF_fit_textflow" url="function.pdf-fit-textflow.php"/>
+<entry name="PDF_fit_textline" url="function.pdf-fit-textline.php"/>
+<entry name="PDF_get_apiname" url="function.pdf-get-apiname.php"/>
+<entry name="PDF_get_buffer" url="function.pdf-get-buffer.php"/>
+<entry name="PDF_get_errmsg" url="function.pdf-get-errmsg.php"/>
+<entry name="PDF_get_errnum" url="function.pdf-get-errnum.php"/>
+<entry name="PDF_get_font" url="function.pdf-get-font.php"/>
+<entry name="PDF_get_fontname" url="function.pdf-get-fontname.php"/>
+<entry name="PDF_get_fontsize" url="function.pdf-get-fontsize.php"/>
+<entry name="PDF_get_image_height" url="function.pdf-get-image-height.php"/>
+<entry name="PDF_get_image_width" url="function.pdf-get-image-width.php"/>
+<entry name="PDF_get_majorversion" url="function.pdf-get-majorversion.php"/>
+<entry name="PDF_get_minorversion" url="function.pdf-get-minorversion.php"/>
+<entry name="PDF_get_parameter" url="function.pdf-get-parameter.php"/>
+<entry name="PDF_get_pdi_parameter" url="function.pdf-get-pdi-parameter.php"/>
+<entry name="PDF_get_pdi_value" url="function.pdf-get-pdi-value.php"/>
+<entry name="PDF_get_value" url="function.pdf-get-value.php"/>
+<entry name="PDF_info_font" url="function.pdf-info-font.php"/>
+<entry name="PDF_info_matchbox" url="function.pdf-info-matchbox.php"/>
+<entry name="PDF_info_table" url="function.pdf-info-table.php"/>
+<entry name="PDF_info_textflow" url="function.pdf-info-textflow.php"/>
+<entry name="PDF_info_textline" url="function.pdf-info-textline.php"/>
+<entry name="PDF_initgraphics" url="function.pdf-initgraphics.php"/>
+<entry name="PDF_lineto" url="function.pdf-lineto.php"/>
+<entry name="PDF_load_3ddata" url="function.pdf-load-3ddata.php"/>
+<entry name="PDF_load_font" url="function.pdf-load-font.php"/>
+<entry name="PDF_load_iccprofile" url="function.pdf-load-iccprofile.php"/>
+<entry name="PDF_load_image" url="function.pdf-load-image.php"/>
+<entry name="PDF_makespotcolor" url="function.pdf-makespotcolor.php"/>
+<entry name="PDF_moveto" url="function.pdf-moveto.php"/>
+<entry name="PDF_new" url="function.pdf-new.php"/>
+<entry name="PDF_open_ccitt" url="function.pdf-open-ccitt.php"/>
+<entry name="PDF_open_file" url="function.pdf-open-file.php"/>
+<entry name="PDF_open_gif" url="function.pdf-open-gif.php"/>
+<entry name="PDF_open_image_file" url="function.pdf-open-image-file.php"/>
+<entry name="PDF_open_image" url="function.pdf-open-image.php"/>
+<entry name="PDF_open_jpeg" url="function.pdf-open-jpeg.php"/>
+<entry name="PDF_open_memory_image" url="function.pdf-open-memory-image.php"/>
+<entry name="PDF_open_pdi_page" url="function.pdf-open-pdi-page.php"/>
+<entry name="PDF_open_pdi" url="function.pdf-open-pdi.php"/>
+<entry name="PDF_open_tiff" url="function.pdf-open-tiff.php"/>
+<entry name="PDF_pcos_get_number" url="function.pdf-pcos-get-number.php"/>
+<entry name="PDF_pcos_get_stream" url="function.pdf-pcos-get-stream.php"/>
+<entry name="PDF_pcos_get_string" url="function.pdf-pcos-get-string.php"/>
+<entry name="PDF_place_image" url="function.pdf-place-image.php"/>
+<entry name="PDF_place_pdi_page" url="function.pdf-place-pdi-page.php"/>
+<entry name="PDF_process_pdi" url="function.pdf-process-pdi.php"/>
+<entry name="PDF_rect" url="function.pdf-rect.php"/>
+<entry name="PDF_restore" url="function.pdf-restore.php"/>
+<entry name="PDF_resume_page" url="function.pdf-resume-page.php"/>
+<entry name="PDF_rotate" url="function.pdf-rotate.php"/>
+<entry name="PDF_save" url="function.pdf-save.php"/>
+<entry name="PDF_scale" url="function.pdf-scale.php"/>
+<entry name="PDF_set_border_color" url="function.pdf-set-border-color.php"/>
+<entry name="PDF_set_border_dash" url="function.pdf-set-border-dash.php"/>
+<entry name="PDF_set_border_style" url="function.pdf-set-border-style.php"/>
+<entry name="PDF_set_char_spacing" url="function.pdf-set-char-spacing.php"/>
+<entry name="PDF_set_duration" url="function.pdf-set-duration.php"/>
+<entry name="PDF_set_gstate" url="function.pdf-set-gstate.php"/>
+<entry name="PDF_set_horiz_scaling" url="function.pdf-set-horiz-scaling.php"/>
+<entry name="PDF_set_info_author" url="function.pdf-set-info-author.php"/>
+<entry name="PDF_set_info_creator" url="function.pdf-set-info-creator.php"/>
+<entry name="PDF_set_info_keywords" url="function.pdf-set-info-keywords.php"/>
+<entry name="PDF_set_info_subject" url="function.pdf-set-info-subject.php"/>
+<entry name="PDF_set_info_title" url="function.pdf-set-info-title.php"/>
+<entry name="PDF_set_info" url="function.pdf-set-info.php"/>
+<entry name="PDF_set_layer_dependency" url="function.pdf-set-layer-dependency.php"/>
+<entry name="PDF_set_leading" url="function.pdf-set-leading.php"/>
+<entry name="PDF_set_parameter" url="function.pdf-set-parameter.php"/>
+<entry name="PDF_set_text_matrix" url="function.pdf-set-text-matrix.php"/>
+<entry name="PDF_set_text_pos" url="function.pdf-set-text-pos.php"/>
+<entry name="PDF_set_text_rendering" url="function.pdf-set-text-rendering.php"/>
+<entry name="PDF_set_text_rise" url="function.pdf-set-text-rise.php"/>
+<entry name="PDF_set_value" url="function.pdf-set-value.php"/>
+<entry name="PDF_set_word_spacing" url="function.pdf-set-word-spacing.php"/>
+<entry name="PDF_setcolor" url="function.pdf-setcolor.php"/>
+<entry name="PDF_setdash" url="function.pdf-setdash.php"/>
+<entry name="PDF_setdashpattern" url="function.pdf-setdashpattern.php"/>
+<entry name="PDF_setflat" url="function.pdf-setflat.php"/>
+<entry name="PDF_setfont" url="function.pdf-setfont.php"/>
+<entry name="PDF_setgray_fill" url="function.pdf-setgray-fill.php"/>
+<entry name="PDF_setgray_stroke" url="function.pdf-setgray-stroke.php"/>
+<entry name="PDF_setgray" url="function.pdf-setgray.php"/>
+<entry name="PDF_setlinecap" url="function.pdf-setlinecap.php"/>
+<entry name="PDF_setlinejoin" url="function.pdf-setlinejoin.php"/>
+<entry name="PDF_setlinewidth" url="function.pdf-setlinewidth.php"/>
+<entry name="PDF_setmatrix" url="function.pdf-setmatrix.php"/>
+<entry name="PDF_setmiterlimit" url="function.pdf-setmiterlimit.php"/>
+<entry name="PDF_setpolydash" url="function.pdf-setpolydash.php"/>
+<entry name="PDF_setrgbcolor_fill" url="function.pdf-setrgbcolor-fill.php"/>
+<entry name="PDF_setrgbcolor_stroke" url="function.pdf-setrgbcolor-stroke.php"/>
+<entry name="PDF_setrgbcolor" url="function.pdf-setrgbcolor.php"/>
+<entry name="PDF_shading_pattern" url="function.pdf-shading-pattern.php"/>
+<entry name="PDF_shading" url="function.pdf-shading.php"/>
+<entry name="PDF_shfill" url="function.pdf-shfill.php"/>
+<entry name="PDF_show_boxed" url="function.pdf-show-boxed.php"/>
+<entry name="PDF_show_xy" url="function.pdf-show-xy.php"/>
+<entry name="PDF_show" url="function.pdf-show.php"/>
+<entry name="PDF_skew" url="function.pdf-skew.php"/>
+<entry name="PDF_stringwidth" url="function.pdf-stringwidth.php"/>
+<entry name="PDF_stroke" url="function.pdf-stroke.php"/>
+<entry name="PDF_suspend_page" url="function.pdf-suspend-page.php"/>
+<entry name="PDF_translate" url="function.pdf-translate.php"/>
+<entry name="PDF_utf16_to_utf8" url="function.pdf-utf16-to-utf8.php"/>
+<entry name="PDF_utf32_to_utf16" url="function.pdf-utf32-to-utf16.php"/>
+<entry name="PDF_utf8_to_utf16" url="function.pdf-utf8-to-utf16.php"/>
+<entry name="ps_add_bookmark" url="function.ps-add-bookmark.php"/>
+<entry name="ps_add_launchlink" url="function.ps-add-launchlink.php"/>
+<entry name="ps_add_locallink" url="function.ps-add-locallink.php"/>
+<entry name="ps_add_note" url="function.ps-add-note.php"/>
+<entry name="ps_add_pdflink" url="function.ps-add-pdflink.php"/>
+<entry name="ps_add_weblink" url="function.ps-add-weblink.php"/>
+<entry name="ps_arc" url="function.ps-arc.php"/>
+<entry name="ps_arcn" url="function.ps-arcn.php"/>
+<entry name="ps_begin_page" url="function.ps-begin-page.php"/>
+<entry name="ps_begin_pattern" url="function.ps-begin-pattern.php"/>
+<entry name="ps_begin_template" url="function.ps-begin-template.php"/>
+<entry name="ps_circle" url="function.ps-circle.php"/>
+<entry name="ps_clip" url="function.ps-clip.php"/>
+<entry name="ps_close_image" url="function.ps-close-image.php"/>
+<entry name="ps_close" url="function.ps-close.php"/>
+<entry name="ps_closepath_stroke" url="function.ps-closepath-stroke.php"/>
+<entry name="ps_closepath" url="function.ps-closepath.php"/>
+<entry name="ps_continue_text" url="function.ps-continue-text.php"/>
+<entry name="ps_curveto" url="function.ps-curveto.php"/>
+<entry name="ps_delete" url="function.ps-delete.php"/>
+<entry name="ps_end_page" url="function.ps-end-page.php"/>
+<entry name="ps_end_pattern" url="function.ps-end-pattern.php"/>
+<entry name="ps_end_template" url="function.ps-end-template.php"/>
+<entry name="ps_fill_stroke" url="function.ps-fill-stroke.php"/>
+<entry name="ps_fill" url="function.ps-fill.php"/>
+<entry name="ps_findfont" url="function.ps-findfont.php"/>
+<entry name="ps_get_buffer" url="function.ps-get-buffer.php"/>
+<entry name="ps_get_parameter" url="function.ps-get-parameter.php"/>
+<entry name="ps_get_value" url="function.ps-get-value.php"/>
+<entry name="ps_hyphenate" url="function.ps-hyphenate.php"/>
+<entry name="ps_include_file" url="function.ps-include-file.php"/>
+<entry name="ps_lineto" url="function.ps-lineto.php"/>
+<entry name="ps_makespotcolor" url="function.ps-makespotcolor.php"/>
+<entry name="ps_moveto" url="function.ps-moveto.php"/>
+<entry name="ps_new" url="function.ps-new.php"/>
+<entry name="ps_open_file" url="function.ps-open-file.php"/>
+<entry name="ps_open_image_file" url="function.ps-open-image-file.php"/>
+<entry name="ps_open_image" url="function.ps-open-image.php"/>
+<entry name="ps_open_memory_image" url="function.ps-open-memory-image.php"/>
+<entry name="ps_place_image" url="function.ps-place-image.php"/>
+<entry name="ps_rect" url="function.ps-rect.php"/>
+<entry name="ps_restore" url="function.ps-restore.php"/>
+<entry name="ps_rotate" url="function.ps-rotate.php"/>
+<entry name="ps_save" url="function.ps-save.php"/>
+<entry name="ps_scale" url="function.ps-scale.php"/>
+<entry name="ps_set_border_color" url="function.ps-set-border-color.php"/>
+<entry name="ps_set_border_dash" url="function.ps-set-border-dash.php"/>
+<entry name="ps_set_border_style" url="function.ps-set-border-style.php"/>
+<entry name="ps_set_info" url="function.ps-set-info.php"/>
+<entry name="ps_set_parameter" url="function.ps-set-parameter.php"/>
+<entry name="ps_set_text_pos" url="function.ps-set-text-pos.php"/>
+<entry name="ps_set_value" url="function.ps-set-value.php"/>
+<entry name="ps_setcolor" url="function.ps-setcolor.php"/>
+<entry name="ps_setdash" url="function.ps-setdash.php"/>
+<entry name="ps_setflat" url="function.ps-setflat.php"/>
+<entry name="ps_setfont" url="function.ps-setfont.php"/>
+<entry name="ps_setgray" url="function.ps-setgray.php"/>
+<entry name="ps_setlinecap" url="function.ps-setlinecap.php"/>
+<entry name="ps_setlinejoin" url="function.ps-setlinejoin.php"/>
+<entry name="ps_setlinewidth" url="function.ps-setlinewidth.php"/>
+<entry name="ps_setmiterlimit" url="function.ps-setmiterlimit.php"/>
+<entry name="ps_setoverprintmode" url="function.ps-setoverprintmode.php"/>
+<entry name="ps_setpolydash" url="function.ps-setpolydash.php"/>
+<entry name="ps_shading_pattern" url="function.ps-shading-pattern.php"/>
+<entry name="ps_shading" url="function.ps-shading.php"/>
+<entry name="ps_shfill" url="function.ps-shfill.php"/>
+<entry name="ps_show_boxed" url="function.ps-show-boxed.php"/>
+<entry name="ps_show_xy2" url="function.ps-show-xy2.php"/>
+<entry name="ps_show_xy" url="function.ps-show-xy.php"/>
+<entry name="ps_show2" url="function.ps-show2.php"/>
+<entry name="ps_show" url="function.ps-show.php"/>
+<entry name="ps_string_geometry" url="function.ps-string-geometry.php"/>
+<entry name="ps_stringwidth" url="function.ps-stringwidth.php"/>
+<entry name="ps_stroke" url="function.ps-stroke.php"/>
+<entry name="ps_symbol_name" url="function.ps-symbol-name.php"/>
+<entry name="ps_symbol_width" url="function.ps-symbol-width.php"/>
+<entry name="ps_symbol" url="function.ps-symbol.php"/>
+<entry name="ps_translate" url="function.ps-translate.php"/>
+<entry name="rpm_close" url="function.rpm-close.php"/>
+<entry name="rpm_get_tag" url="function.rpm-get-tag.php"/>
+<entry name="rpm_is_valid" url="function.rpm-is-valid.php"/>
+<entry name="rpm_open" url="function.rpm-open.php"/>
+<entry name="rpm_version" url="function.rpm-version.php"/>
+<entry name="swf_actiongeturl" url="function.swf-actiongeturl.php"/>
+<entry name="swf_actiongotoframe" url="function.swf-actiongotoframe.php"/>
+<entry name="swf_actiongotolabel" url="function.swf-actiongotolabel.php"/>
+<entry name="swf_actionnextframe" url="function.swf-actionnextframe.php"/>
+<entry name="swf_actionplay" url="function.swf-actionplay.php"/>
+<entry name="swf_actionprevframe" url="function.swf-actionprevframe.php"/>
+<entry name="swf_actionsettarget" url="function.swf-actionsettarget.php"/>
+<entry name="swf_actionstop" url="function.swf-actionstop.php"/>
+<entry name="swf_actiontogglequality" url="function.swf-actiontogglequality.php"/>
+<entry name="swf_actionwaitforframe" url="function.swf-actionwaitforframe.php"/>
+<entry name="swf_addbuttonrecord" url="function.swf-addbuttonrecord.php"/>
+<entry name="swf_addcolor" url="function.swf-addcolor.php"/>
+<entry name="swf_closefile" url="function.swf-closefile.php"/>
+<entry name="swf_definebitmap" url="function.swf-definebitmap.php"/>
+<entry name="swf_definefont" url="function.swf-definefont.php"/>
+<entry name="swf_defineline" url="function.swf-defineline.php"/>
+<entry name="swf_definepoly" url="function.swf-definepoly.php"/>
+<entry name="swf_definerect" url="function.swf-definerect.php"/>
+<entry name="swf_definetext" url="function.swf-definetext.php"/>
+<entry name="swf_endbutton" url="function.swf-endbutton.php"/>
+<entry name="swf_enddoaction" url="function.swf-enddoaction.php"/>
+<entry name="swf_endshape" url="function.swf-endshape.php"/>
+<entry name="swf_endsymbol" url="function.swf-endsymbol.php"/>
+<entry name="swf_fontsize" url="function.swf-fontsize.php"/>
+<entry name="swf_fontslant" url="function.swf-fontslant.php"/>
+<entry name="swf_fonttracking" url="function.swf-fonttracking.php"/>
+<entry name="swf_getbitmapinfo" url="function.swf-getbitmapinfo.php"/>
+<entry name="swf_getfontinfo" url="function.swf-getfontinfo.php"/>
+<entry name="swf_getframe" url="function.swf-getframe.php"/>
+<entry name="swf_labelframe" url="function.swf-labelframe.php"/>
+<entry name="swf_lookat" url="function.swf-lookat.php"/>
+<entry name="swf_modifyobject" url="function.swf-modifyobject.php"/>
+<entry name="swf_mulcolor" url="function.swf-mulcolor.php"/>
+<entry name="swf_nextid" url="function.swf-nextid.php"/>
+<entry name="swf_oncondition" url="function.swf-oncondition.php"/>
+<entry name="swf_openfile" url="function.swf-openfile.php"/>
+<entry name="swf_ortho2" url="function.swf-ortho2.php"/>
+<entry name="swf_ortho" url="function.swf-ortho.php"/>
+<entry name="swf_perspective" url="function.swf-perspective.php"/>
+<entry name="swf_placeobject" url="function.swf-placeobject.php"/>
+<entry name="swf_polarview" url="function.swf-polarview.php"/>
+<entry name="swf_popmatrix" url="function.swf-popmatrix.php"/>
+<entry name="swf_posround" url="function.swf-posround.php"/>
+<entry name="swf_pushmatrix" url="function.swf-pushmatrix.php"/>
+<entry name="swf_removeobject" url="function.swf-removeobject.php"/>
+<entry name="swf_rotate" url="function.swf-rotate.php"/>
+<entry name="swf_scale" url="function.swf-scale.php"/>
+<entry name="swf_setfont" url="function.swf-setfont.php"/>
+<entry name="swf_setframe" url="function.swf-setframe.php"/>
+<entry name="swf_shapearc" url="function.swf-shapearc.php"/>
+<entry name="swf_shapecurveto3" url="function.swf-shapecurveto3.php"/>
+<entry name="swf_shapecurveto" url="function.swf-shapecurveto.php"/>
+<entry name="swf_shapefillbitmapclip" url="function.swf-shapefillbitmapclip.php"/>
+<entry name="swf_shapefillbitmaptile" url="function.swf-shapefillbitmaptile.php"/>
+<entry name="swf_shapefilloff" url="function.swf-shapefilloff.php"/>
+<entry name="swf_shapefillsolid" url="function.swf-shapefillsolid.php"/>
+<entry name="swf_shapelinesolid" url="function.swf-shapelinesolid.php"/>
+<entry name="swf_shapelineto" url="function.swf-shapelineto.php"/>
+<entry name="swf_shapemoveto" url="function.swf-shapemoveto.php"/>
+<entry name="swf_showframe" url="function.swf-showframe.php"/>
+<entry name="swf_startbutton" url="function.swf-startbutton.php"/>
+<entry name="swf_startdoaction" url="function.swf-startdoaction.php"/>
+<entry name="swf_startshape" url="function.swf-startshape.php"/>
+<entry name="swf_startsymbol" url="function.swf-startsymbol.php"/>
+<entry name="swf_textwidth" url="function.swf-textwidth.php"/>
+<entry name="swf_translate" url="function.swf-translate.php"/>
+<entry name="swf_viewport" url="function.swf-viewport.php"/>
+<entry name="Swish::__construct" url="function.swish-construct.php"/>
+<entry name="Swish->getMetaList" url="function.swish-getmetalist.php"/>
+<entry name="Swish->getPropertyList" url="function.swish-getpropertylist.php"/>
+<entry name="Swish->prepare" url="function.swish-prepare.php"/>
+<entry name="Swish->query" url="function.swish-query.php"/>
+<entry name="SwishResult->getMetaList" url="function.swishresult-getmetalist.php"/>
+<entry name="SwishResult->stem" url="function.swishresult-stem.php"/>
+<entry name="SwishResults->getParsedWords" url="function.swishresults-getparsedwords.php"/>
+<entry name="SwishResults->getRemovedStopwords" url="function.swishresults-getremovedstopwords.php"/>
+<entry name="SwishResults->nextResult" url="function.swishresults-nextresult.php"/>
+<entry name="SwishResults->seekResult" url="function.swishresults-seekresult.php"/>
+<entry name="SwishSearch->execute" url="function.swishsearch-execute.php"/>
+<entry name="SwishSearch->resetLimit" url="function.swishsearch-resetlimit.php"/>
+<entry name="SwishSearch->setLimit" url="function.swishsearch-setlimit.php"/>
+<entry name="SwishSearch->setPhraseDelimiter" url="function.swishsearch-setphrasedelimiter.php"/>
+<entry name="SwishSearch->setSort" url="function.swishsearch-setsort.php"/>
+<entry name="SwishSearch->setStructure" url="function.swishsearch-setstructure.php"/>
+<entry name="escapeshellarg" url="function.escapeshellarg.php"/>
+<entry name="escapeshellcmd" url="function.escapeshellcmd.php"/>
+<entry name="exec" url="function.exec.php"/>
+<entry name="passthru" url="function.passthru.php"/>
+<entry name="proc_close" url="function.proc-close.php"/>
+<entry name="proc_get_status" url="function.proc-get-status.php"/>
+<entry name="proc_nice" url="function.proc-nice.php"/>
+<entry name="proc_open" url="function.proc-open.php"/>
+<entry name="proc_terminate" url="function.proc-terminate.php"/>
+<entry name="shell_exec" url="function.shell-exec.php"/>
+<entry name="system" url="function.system.php"/>
+<entry name="expect_expectl" url="function.expect-expectl.php"/>
+<entry name="expect_popen" url="function.expect-popen.php"/>
+<entry name="pcntl_alarm" url="function.pcntl-alarm.php"/>
+<entry name="pcntl_exec" url="function.pcntl-exec.php"/>
+<entry name="pcntl_fork" url="function.pcntl-fork.php"/>
+<entry name="pcntl_getpriority" url="function.pcntl-getpriority.php"/>
+<entry name="pcntl_setpriority" url="function.pcntl-setpriority.php"/>
+<entry name="pcntl_signal" url="function.pcntl-signal.php"/>
+<entry name="pcntl_wait" url="function.pcntl-wait.php"/>
+<entry name="pcntl_waitpid" url="function.pcntl-waitpid.php"/>
+<entry name="pcntl_wexitstatus" url="function.pcntl-wexitstatus.php"/>
+<entry name="pcntl_wifexited" url="function.pcntl-wifexited.php"/>
+<entry name="pcntl_wifsignaled" url="function.pcntl-wifsignaled.php"/>
+<entry name="pcntl_wifstopped" url="function.pcntl-wifstopped.php"/>
+<entry name="pcntl_wstopsig" url="function.pcntl-wstopsig.php"/>
+<entry name="pcntl_wtermsig" url="function.pcntl-wtermsig.php"/>
+<entry name="posix_access" url="function.posix-access.php"/>
+<entry name="posix_ctermid" url="function.posix-ctermid.php"/>
+<entry name="posix_get_last_error" url="function.posix-get-last-error.php"/>
+<entry name="posix_getcwd" url="function.posix-getcwd.php"/>
+<entry name="posix_getegid" url="function.posix-getegid.php"/>
+<entry name="posix_geteuid" url="function.posix-geteuid.php"/>
+<entry name="posix_getgid" url="function.posix-getgid.php"/>
+<entry name="posix_getgrgid" url="function.posix-getgrgid.php"/>
+<entry name="posix_getgrnam" url="function.posix-getgrnam.php"/>
+<entry name="posix_getgroups" url="function.posix-getgroups.php"/>
+<entry name="posix_getlogin" url="function.posix-getlogin.php"/>
+<entry name="posix_getpgid" url="function.posix-getpgid.php"/>
+<entry name="posix_getpgrp" url="function.posix-getpgrp.php"/>
+<entry name="posix_getpid" url="function.posix-getpid.php"/>
+<entry name="posix_getppid" url="function.posix-getppid.php"/>
+<entry name="posix_getpwnam" url="function.posix-getpwnam.php"/>
+<entry name="posix_getpwuid" url="function.posix-getpwuid.php"/>
+<entry name="posix_getrlimit" url="function.posix-getrlimit.php"/>
+<entry name="posix_getsid" url="function.posix-getsid.php"/>
+<entry name="posix_getuid" url="function.posix-getuid.php"/>
+<entry name="posix_initgroups" url="function.posix-initgroups.php"/>
+<entry name="posix_isatty" url="function.posix-isatty.php"/>
+<entry name="posix_kill" url="function.posix-kill.php"/>
+<entry name="posix_mkfifo" url="function.posix-mkfifo.php"/>
+<entry name="posix_mknod" url="function.posix-mknod.php"/>
+<entry name="posix_setegid" url="function.posix-setegid.php"/>
+<entry name="posix_seteuid" url="function.posix-seteuid.php"/>
+<entry name="posix_setgid" url="function.posix-setgid.php"/>
+<entry name="posix_setpgid" url="function.posix-setpgid.php"/>
+<entry name="posix_setsid" url="function.posix-setsid.php"/>
+<entry name="posix_setuid" url="function.posix-setuid.php"/>
+<entry name="posix_strerror" url="function.posix-strerror.php"/>
+<entry name="posix_times" url="function.posix-times.php"/>
+<entry name="posix_ttyname" url="function.posix-ttyname.php"/>
+<entry name="posix_uname" url="function.posix-uname.php"/>
+<entry name="ftok" url="function.ftok.php"/>
+<entry name="msg_get_queue" url="function.msg-get-queue.php"/>
+<entry name="msg_queue_exists" url="function.msg-queue-exists.php"/>
+<entry name="msg_receive" url="function.msg-receive.php"/>
+<entry name="msg_remove_queue" url="function.msg-remove-queue.php"/>
+<entry name="msg_send" url="function.msg-send.php"/>
+<entry name="msg_set_queue" url="function.msg-set-queue.php"/>
+<entry name="msg_stat_queue" url="function.msg-stat-queue.php"/>
+<entry name="sem_acquire" url="function.sem-acquire.php"/>
+<entry name="sem_get" url="function.sem-get.php"/>
+<entry name="sem_release" url="function.sem-release.php"/>
+<entry name="sem_remove" url="function.sem-remove.php"/>
+<entry name="shm_attach" url="function.shm-attach.php"/>
+<entry name="shm_detach" url="function.shm-detach.php"/>
+<entry name="shm_get_var" url="function.shm-get-var.php"/>
+<entry name="shm_put_var" url="function.shm-put-var.php"/>
+<entry name="shm_remove_var" url="function.shm-remove-var.php"/>
+<entry name="shm_remove" url="function.shm-remove.php"/>
+<entry name="shmop_close" url="function.shmop-close.php"/>
+<entry name="shmop_delete" url="function.shmop-delete.php"/>
+<entry name="shmop_open" url="function.shmop-open.php"/>
+<entry name="shmop_read" url="function.shmop-read.php"/>
+<entry name="shmop_size" url="function.shmop-size.php"/>
+<entry name="shmop_write" url="function.shmop-write.php"/>
+<entry name="geoip_country_code_by_name" url="function.geoip-country-code-by-name.php"/>
+<entry name="geoip_country_code3_by_name" url="function.geoip-country-code3-by-name.php"/>
+<entry name="geoip_country_name_by_name" url="function.geoip-country-name-by-name.php"/>
+<entry name="geoip_database_info" url="function.geoip-database-info.php"/>
+<entry name="geoip_db_avail" url="function.geoip-db-avail.php"/>
+<entry name="geoip_db_filename" url="function.geoip-db-filename.php"/>
+<entry name="geoip_db_get_all_info" url="function.geoip-db-get-all-info.php"/>
+<entry name="geoip_id_by_name" url="function.geoip-id-by-name.php"/>
+<entry name="geoip_isp_by_name" url="function.geoip-isp-by-name.php"/>
+<entry name="geoip_org_by_name" url="function.geoip-org-by-name.php"/>
+<entry name="geoip_record_by_name" url="function.geoip-record-by-name.php"/>
+<entry name="geoip_region_by_name" url="function.geoip-region-by-name.php"/>
+<entry name="json_decode" url="function.json-decode.php"/>
+<entry name="json_encode" url="function.json-encode.php"/>
+<entry name="connection_aborted" url="function.connection-aborted.php"/>
+<entry name="connection_status" url="function.connection-status.php"/>
+<entry name="connection_timeout" url="function.connection-timeout.php"/>
+<entry name="constant" url="function.constant.php"/>
+<entry name="define" url="function.define.php"/>
+<entry name="defined" url="function.defined.php"/>
+<entry name="die" url="function.die.php"/>
+<entry name="eval" url="function.eval.php"/>
+<entry name="exit" url="function.exit.php"/>
+<entry name="get_browser" url="function.get-browser.php"/>
+<entry name="__halt_compiler" url="function.halt-compiler.php"/>
+<entry name="highlight_file" url="function.highlight-file.php"/>
+<entry name="highlight_string" url="function.highlight-string.php"/>
+<entry name="ignore_user_abort" url="function.ignore-user-abort.php"/>
+<entry name="pack" url="function.pack.php"/>
+<entry name="php_check_syntax" url="function.php-check-syntax.php"/>
+<entry name="php_strip_whitespace" url="function.php-strip-whitespace.php"/>
+<entry name="show_source" url="function.show-source.php"/>
+<entry name="sleep" url="function.sleep.php"/>
+<entry name="sys_getloadavg" url="function.sys-getloadavg.php"/>
+<entry name="time_nanosleep" url="function.time-nanosleep.php"/>
+<entry name="time_sleep_until" url="function.time-sleep-until.php"/>
+<entry name="uniqid" url="function.uniqid.php"/>
+<entry name="unpack" url="function.unpack.php"/>
+<entry name="usleep" url="function.usleep.php"/>
+<entry name="parsekit_compile_file" url="function.parsekit-compile-file.php"/>
+<entry name="parsekit_compile_string" url="function.parsekit-compile-string.php"/>
+<entry name="parsekit_func_arginfo" url="function.parsekit-func-arginfo.php"/>
+<entry name="class_implements" url="function.class-implements.php"/>
+<entry name="class_parents" url="function.class-parents.php"/>
+<entry name="iterator_count" url="function.iterator-count.php"/>
+<entry name="iterator_to_array" url="function.iterator-to-array.php"/>
+<entry name="spl_autoload_call" url="function.spl-autoload-call.php"/>
+<entry name="spl_autoload_extensions" url="function.spl-autoload-extensions.php"/>
+<entry name="spl_autoload_functions" url="function.spl-autoload-functions.php"/>
+<entry name="spl_autoload_register" url="function.spl-autoload-register.php"/>
+<entry name="spl_autoload_unregister" url="function.spl-autoload-unregister.php"/>
+<entry name="spl_autoload" url="function.spl-autoload.php"/>
+<entry name="spl_classes" url="function.spl-classes.php"/>
+<entry name="spl_object_hash" url="function.spl-object-hash.php"/>
+<entry name="ArrayIterator::current" url="arrayiterator.current.php"/>
+<entry name="ArrayIterator::key" url="arrayiterator.key.php"/>
+<entry name="ArrayIterator::next" url="arrayiterator.next.php"/>
+<entry name="ArrayIterator::rewind" url="arrayiterator.rewind.php"/>
+<entry name="ArrayIterator::seek" url="arrayiterator.seek.php"/>
+<entry name="ArrayIterator::valid" url="arrayiterator.valid.php"/>
+<entry name="ArrayObject::append" url="arrayobject.append.php"/>
+<entry name="ArrayObject::__construct" url="arrayobject.construct.php"/>
+<entry name="ArrayObject::count" url="arrayobject.count.php"/>
+<entry name="ArrayObject::getIterator" url="arrayobject.getiterator.php"/>
+<entry name="ArrayObject::offsetExists" url="arrayobject.offsetexists.php"/>
+<entry name="ArrayObject::offsetGet" url="arrayobject.offsetget.php"/>
+<entry name="ArrayObject::offsetSet" url="arrayobject.offsetset.php"/>
+<entry name="ArrayObject::offsetUnset" url="arrayobject.offsetunset.php"/>
+<entry name="CachingIterator::hasNext" url="cachingiterator.hasnext.php"/>
+<entry name="CachingIterator::next" url="cachingiterator.next.php"/>
+<entry name="CachingIterator::rewind" url="cachingiterator.rewind.php"/>
+<entry name="CachingIterator::__toString" url="cachingiterator.tostring.php"/>
+<entry name="CachingIterator::valid" url="cachingiterator.valid.php"/>
+<entry name="RecursiveCachingIterator::getChildren" url="recursivecachingiterator.getchildren.php"/>
+<entry name="RecursiveCachingIterator::hasChildren" url="recursivecachingiterator.haschildren.php"/>
+<entry name="DirectoryIterator::__construct" url="directoryiterator.construct.php"/>
+<entry name="DirectoryIterator::current" url="directoryiterator.current.php"/>
+<entry name="DirectoryIterator::getATime" url="directoryiterator.getatime.php"/>
+<entry name="DirectoryIterator::getCTime" url="directoryiterator.getctime.php"/>
+<entry name="DirectoryIterator::getFilename" url="directoryiterator.getfilename.php"/>
+<entry name="DirectoryIterator::getGroup" url="directoryiterator.getgroup.php"/>
+<entry name="DirectoryIterator::getInode" url="directoryiterator.getinode.php"/>
+<entry name="DirectoryIterator::getMTime" url="directoryiterator.getmtime.php"/>
+<entry name="DirectoryIterator::getOwner" url="directoryiterator.getowner.php"/>
+<entry name="DirectoryIterator::getPath" url="directoryiterator.getpath.php"/>
+<entry name="DirectoryIterator::getPathname" url="directoryiterator.getpathname.php"/>
+<entry name="DirectoryIterator::getPerms" url="directoryiterator.getperms.php"/>
+<entry name="DirectoryIterator::getSize" url="directoryiterator.getsize.php"/>
+<entry name="DirectoryIterator::getType" url="directoryiterator.gettype.php"/>
+<entry name="DirectoryIterator::isDir" url="directoryiterator.isdir.php"/>
+<entry name="DirectoryIterator::isDot" url="directoryiterator.isdot.php"/>
+<entry name="DirectoryIterator::isExecutable" url="directoryiterator.isexecutable.php"/>
+<entry name="DirectoryIterator::isFile" url="directoryiterator.isfile.php"/>
+<entry name="DirectoryIterator::isLink" url="directoryiterator.islink.php"/>
+<entry name="DirectoryIterator::isReadable" url="directoryiterator.isreadable.php"/>
+<entry name="DirectoryIterator::isWritable" url="directoryiterator.iswritable.php"/>
+<entry name="DirectoryIterator::key" url="directoryiterator.key.php"/>
+<entry name="DirectoryIterator::next" url="directoryiterator.next.php"/>
+<entry name="DirectoryIterator::rewind" url="directoryiterator.rewind.php"/>
+<entry name="DirectoryIterator::valid" url="directoryiterator.valid.php"/>
+<entry name="FilterIterator::current" url="filteriterator.current.php"/>
+<entry name="FilterIterator::getInnerIterator" url="filteriterator.getinneriterator.php"/>
+<entry name="FilterIterator::key" url="filteriterator.key.php"/>
+<entry name="FilterIterator::next" url="filteriterator.next.php"/>
+<entry name="FilterIterator::rewind" url="filteriterator.rewind.php"/>
+<entry name="FilterIterator::valid" url="filteriterator.valid.php"/>
+<entry name="LimitIterator::getPosition" url="limititerator.getposition.php"/>
+<entry name="LimitIterator::next" url="limititerator.next.php"/>
+<entry name="LimitIterator::rewind" url="limititerator.rewind.php"/>
+<entry name="LimitIterator::seek" url="limititerator.seek.php"/>
+<entry name="LimitIterator::valid" url="limititerator.valid.php"/>
+<entry name="ParentIterator::getChildren" url="parentiterator.getchildren.php"/>
+<entry name="ParentIterator::hasChildren" url="parentiterator.haschildren.php"/>
+<entry name="ParentIterator::next" url="parentiterator.next.php"/>
+<entry name="ParentIterator::rewind" url="parentiterator.rewind.php"/>
+<entry name="RecursiveDirectoryIterator::getChildren" url="recursivedirectoryiterator.getchildren.php"/>
+<entry name="RecursiveDirectoryIterator::hasChildren" url="recursivedirectoryiterator.haschildren.php"/>
+<entry name="RecursiveDirectoryIterator::key" url="recursivedirectoryiterator.key.php"/>
+<entry name="RecursiveDirectoryIterator::next" url="recursivedirectoryiterator.next.php"/>
+<entry name="RecursiveDirectoryIterator::rewind" url="recursivedirectoryiterator.rewind.php"/>
+<entry name="RecursiveIteratorIterator::current" url="recursiveiteratoriterator.current.php"/>
+<entry name="RecursiveIteratorIterator::getDepth" url="recursiveiteratoriterator.getdepth.php"/>
+<entry name="RecursiveIteratorIterator::getSubIterator" url="recursiveiteratoriterator.getsubiterator.php"/>
+<entry name="RecursiveIteratorIterator::key" url="recursiveiteratoriterator.key.php"/>
+<entry name="RecursiveIteratorIterator::next" url="recursiveiteratoriterator.next.php"/>
+<entry name="RecursiveIteratorIterator::rewind" url="recursiveiteratoriterator.rewind.php"/>
+<entry name="RecursiveIteratorIterator::valid" url="recursiveiteratoriterator.valid.php"/>
+<entry name="SimpleXMLIterator::current" url="simplexmliterator.current.php"/>
+<entry name="SimpleXMLIterator::getChildren" url="simplexmliterator.getchildren.php"/>
+<entry name="SimpleXMLIterator::hasChildren" url="simplexmliterator.haschildren.php"/>
+<entry name="SimpleXMLIterator::key" url="simplexmliterator.key.php"/>
+<entry name="SimpleXMLIterator::next" url="simplexmliterator.next.php"/>
+<entry name="SimpleXMLIterator::rewind" url="simplexmliterator.rewind.php"/>
+<entry name="SimpleXMLIterator::valid" url="simplexmliterator.valid.php"/>
+<entry name="SplDoublyLinkedList::bottom" url="spldoublylinkedlist.bottom.php"/>
+<entry name="SplDoublyLinkedList::__construct" url="spldoublylinkedlist.construct.php"/>
+<entry name="SplDoublyLinkedList::count" url="spldoublylinkedlist.count.php"/>
+<entry name="SplDoublyLinkedList::current" url="spldoublylinkedlist.current.php"/>
+<entry name="SplDoublyLinkedList::getIteratorMode" url="spldoublylinkedlist.getiteratormode.php"/>
+<entry name="SplDoublyLinkedList::isEmpty" url="spldoublylinkedlist.isempty.php"/>
+<entry name="SplDoublyLinkedList::key" url="spldoublylinkedlist.key.php"/>
+<entry name="SplDoublyLinkedList::next" url="spldoublylinkedlist.next.php"/>
+<entry name="SplDoublyLinkedList::offsetExists" url="spldoublylinkedlist.offsetexists.php"/>
+<entry name="SplDoublyLinkedList::offsetGet" url="spldoublylinkedlist.offsetget.php"/>
+<entry name="SplDoublyLinkedList::offsetSet" url="spldoublylinkedlist.offsetset.php"/>
+<entry name="SplDoublyLinkedList::offsetUnset" url="spldoublylinkedlist.offsetunset.php"/>
+<entry name="SplDoublyLinkedList::pop" url="spldoublylinkedlist.pop.php"/>
+<entry name="SplDoublyLinkedList::push" url="spldoublylinkedlist.push.php"/>
+<entry name="SplDoublyLinkedList::rewind" url="spldoublylinkedlist.rewind.php"/>
+<entry name="SplDoublyLinkedList::setIteratorMode" url="spldoublylinkedlist.setiteratormode.php"/>
+<entry name="SplDoublyLinkedList::shift" url="spldoublylinkedlist.shift.php"/>
+<entry name="SplDoublyLinkedList::top" url="spldoublylinkedlist.top.php"/>
+<entry name="SplDoublyLinkedList::unshift" url="spldoublylinkedlist.unshift.php"/>
+<entry name="SplDoublyLinkedList::valid" url="spldoublylinkedlist.valid.php"/>
+<entry name="SplStack::__construct" url="splstack.construct.php"/>
+<entry name="SplStack::setIteratorMode" url="splstack.setiteratormode.php"/>
+<entry name="SplQueue::__construct" url="splqueue.construct.php"/>
+<entry name="SplQueue::dequeue" url="splqueue.dequeue.php"/>
+<entry name="SplQueue::enqueue" url="splqueue.enqueue.php"/>
+<entry name="SplQueue::setIteratorMode" url="splqueue.setiteratormode.php"/>
+<entry name="SplHeap::compare" url="splheap.compare.php"/>
+<entry name="SplHeap::__construct" url="splheap.construct.php"/>
+<entry name="SplHeap::count" url="splheap.count.php"/>
+<entry name="SplHeap::current" url="splheap.current.php"/>
+<entry name="SplHeap::extract" url="splheap.extract.php"/>
+<entry name="SplHeap::insert" url="splheap.insert.php"/>
+<entry name="SplHeap::isEmpty" url="splheap.isempty.php"/>
+<entry name="SplHeap::key" url="splheap.key.php"/>
+<entry name="SplHeap::next" url="splheap.next.php"/>
+<entry name="SplHeap::recoverFromCorruption" url="splheap.recoverfromcorruption.php"/>
+<entry name="SplHeap::rewind" url="splheap.rewind.php"/>
+<entry name="SplHeap::top" url="splheap.top.php"/>
+<entry name="SplHeap::valid" url="splheap.valid.php"/>
+<entry name="SplMaxHeap::compare" url="splmaxheap.compare.php"/>
+<entry name="SplMinHeap::compare" url="splminheap.compare.php"/>
+<entry name="SplPriorityQueue::compare" url="splpriorityqueue.compare.php"/>
+<entry name="SplPriorityQueue::__construct" url="splpriorityqueue.construct.php"/>
+<entry name="SplPriorityQueue::count" url="splpriorityqueue.count.php"/>
+<entry name="SplPriorityQueue::current" url="splpriorityqueue.current.php"/>
+<entry name="SplPriorityQueue::extract" url="splpriorityqueue.extract.php"/>
+<entry name="SplPriorityQueue::insert" url="splpriorityqueue.insert.php"/>
+<entry name="SplPriorityQueue::isEmpty" url="splpriorityqueue.isempty.php"/>
+<entry name="SplPriorityQueue::key" url="splpriorityqueue.key.php"/>
+<entry name="SplPriorityQueue::next" url="splpriorityqueue.next.php"/>
+<entry name="SplPriorityQueue::recoverFromCorruption" url="splpriorityqueue.recoverfromcorruption.php"/>
+<entry name="SplPriorityQueue::rewind" url="splpriorityqueue.rewind.php"/>
+<entry name="SplPriorityQueue::setExtractFlags" url="splpriorityqueue.setextractflags.php"/>
+<entry name="SplPriorityQueue::top" url="splpriorityqueue.top.php"/>
+<entry name="SplPriorityQueue::valid" url="splpriorityqueue.valid.php"/>
+<entry name="stream_bucket_append" url="function.stream-bucket-append.php"/>
+<entry name="stream_bucket_make_writeable" url="function.stream-bucket-make-writeable.php"/>
+<entry name="stream_bucket_new" url="function.stream-bucket-new.php"/>
+<entry name="stream_bucket_prepend" url="function.stream-bucket-prepend.php"/>
+<entry name="stream_context_create" url="function.stream-context-create.php"/>
+<entry name="stream_context_get_default" url="function.stream-context-get-default.php"/>
+<entry name="stream_context_get_options" url="function.stream-context-get-options.php"/>
+<entry name="stream_context_set_option" url="function.stream-context-set-option.php"/>
+<entry name="stream_context_set_params" url="function.stream-context-set-params.php"/>
+<entry name="stream_copy_to_stream" url="function.stream-copy-to-stream.php"/>
+<entry name="stream_encoding" url="function.stream-encoding.php"/>
+<entry name="stream_filter_append" url="function.stream-filter-append.php"/>
+<entry name="stream_filter_prepend" url="function.stream-filter-prepend.php"/>
+<entry name="stream_filter_register" url="function.stream-filter-register.php"/>
+<entry name="stream_filter_remove" url="function.stream-filter-remove.php"/>
+<entry name="stream_get_contents" url="function.stream-get-contents.php"/>
+<entry name="stream_get_filters" url="function.stream-get-filters.php"/>
+<entry name="stream_get_line" url="function.stream-get-line.php"/>
+<entry name="stream_get_meta_data" url="function.stream-get-meta-data.php"/>
+<entry name="stream_get_transports" url="function.stream-get-transports.php"/>
+<entry name="stream_get_wrappers" url="function.stream-get-wrappers.php"/>
+<entry name="stream_notification_callback" url="function.stream-notification-callback.php"/>
+<entry name="stream_register_wrapper" url="function.stream-register-wrapper.php"/>
+<entry name="stream_resolve_include_path" url="function.stream-resolve-include-path.php"/>
+<entry name="stream_select" url="function.stream-select.php"/>
+<entry name="stream_set_blocking" url="function.stream-set-blocking.php"/>
+<entry name="stream_set_timeout" url="function.stream-set-timeout.php"/>
+<entry name="stream_set_write_buffer" url="function.stream-set-write-buffer.php"/>
+<entry name="stream_socket_accept" url="function.stream-socket-accept.php"/>
+<entry name="stream_socket_client" url="function.stream-socket-client.php"/>
+<entry name="stream_socket_enable_crypto" url="function.stream-socket-enable-crypto.php"/>
+<entry name="stream_socket_get_name" url="function.stream-socket-get-name.php"/>
+<entry name="stream_socket_pair" url="function.stream-socket-pair.php"/>
+<entry name="stream_socket_recvfrom" url="function.stream-socket-recvfrom.php"/>
+<entry name="stream_socket_sendto" url="function.stream-socket-sendto.php"/>
+<entry name="stream_socket_server" url="function.stream-socket-server.php"/>
+<entry name="stream_socket_shutdown" url="function.stream-socket-shutdown.php"/>
+<entry name="stream_wrapper_register" url="function.stream-wrapper-register.php"/>
+<entry name="stream_wrapper_restore" url="function.stream-wrapper-restore.php"/>
+<entry name="stream_wrapper_unregister" url="function.stream-wrapper-unregister.php"/>
+<entry name="ob_tidyhandler" url="function.ob-tidyhandler.php"/>
+<entry name="tidy_access_count" url="function.tidy-access-count.php"/>
+<entry name="tidy_clean_repair" url="function.tidy-clean-repair.php"/>
+<entry name="tidy_config_count" url="function.tidy-config-count.php"/>
+<entry name="tidy::__construct" url="function.tidy-construct.php"/>
+<entry name="tidy_diagnose" url="function.tidy-diagnose.php"/>
+<entry name="tidy_error_count" url="function.tidy-error-count.php"/>
+<entry name="tidy_get_body" url="function.tidy-get-body.php"/>
+<entry name="tidy_get_config" url="function.tidy-get-config.php"/>
+<entry name="tidy_get_error_buffer" url="function.tidy-get-error-buffer.php"/>
+<entry name="tidy_get_head" url="function.tidy-get-head.php"/>
+<entry name="tidy_get_html_ver" url="function.tidy-get-html-ver.php"/>
+<entry name="tidy_get_html" url="function.tidy-get-html.php"/>
+<entry name="tidy_get_opt_doc" url="function.tidy-get-opt-doc.php"/>
+<entry name="tidy_get_output" url="function.tidy-get-output.php"/>
+<entry name="tidy_get_release" url="function.tidy-get-release.php"/>
+<entry name="tidy_get_root" url="function.tidy-get-root.php"/>
+<entry name="tidy_get_status" url="function.tidy-get-status.php"/>
+<entry name="tidy_getopt" url="function.tidy-getopt.php"/>
+<entry name="tidy_is_xhtml" url="function.tidy-is-xhtml.php"/>
+<entry name="tidy_is_xml" url="function.tidy-is-xml.php"/>
+<entry name="tidy_load_config" url="function.tidy-load-config.php"/>
+<entry name="tidy_node->get_attr" url="function.tidy-node-get-attr.php"/>
+<entry name="tidy_node->get_nodes" url="function.tidy-node-get-nodes.php"/>
+<entry name="tidy_node->next" url="function.tidy-node-next.php"/>
+<entry name="tidy_node->prev" url="function.tidy-node-prev.php"/>
+<entry name="tidy_parse_file" url="function.tidy-parse-file.php"/>
+<entry name="tidy_parse_string" url="function.tidy-parse-string.php"/>
+<entry name="tidy_repair_file" url="function.tidy-repair-file.php"/>
+<entry name="tidy_repair_string" url="function.tidy-repair-string.php"/>
+<entry name="tidy_reset_config" url="function.tidy-reset-config.php"/>
+<entry name="tidy_save_config" url="function.tidy-save-config.php"/>
+<entry name="tidy_set_encoding" url="function.tidy-set-encoding.php"/>
+<entry name="tidy_setopt" url="function.tidy-setopt.php"/>
+<entry name="tidy_warning_count" url="function.tidy-warning-count.php"/>
+<entry name="tidyNode->hasChildren" url="function.tidynode-haschildren.php"/>
+<entry name="tidyNode->hasSiblings" url="function.tidynode-hassiblings.php"/>
+<entry name="tidyNode->isAsp" url="function.tidynode-isasp.php"/>
+<entry name="tidyNode->isComment" url="function.tidynode-iscomment.php"/>
+<entry name="tidyNode->isHtml" url="function.tidynode-ishtml.php"/>
+<entry name="tidyNode->isJste" url="function.tidynode-isjste.php"/>
+<entry name="tidyNode->isPhp" url="function.tidynode-isphp.php"/>
+<entry name="tidyNode->isText" url="function.tidynode-istext.php"/>
+<entry name="tidyNode::getParent" url="function.tidynode-getparent.php"/>
+<entry name="token_get_all" url="function.token-get-all.php"/>
+<entry name="token_name" url="function.token-name.php"/>
+<entry name="base64_decode" url="function.base64-decode.php"/>
+<entry name="base64_encode" url="function.base64-encode.php"/>
+<entry name="get_headers" url="function.get-headers.php"/>
+<entry name="get_meta_tags" url="function.get-meta-tags.php"/>
+<entry name="http_build_query" url="function.http-build-query.php"/>
+<entry name="parse_url" url="function.parse-url.php"/>
+<entry name="rawurldecode" url="function.rawurldecode.php"/>
+<entry name="rawurlencode" url="function.rawurlencode.php"/>
+<entry name="urldecode" url="function.urldecode.php"/>
+<entry name="urlencode" url="function.urlencode.php"/>
+<entry name="curl_close" url="function.curl-close.php"/>
+<entry name="curl_copy_handle" url="function.curl-copy-handle.php"/>
+<entry name="curl_errno" url="function.curl-errno.php"/>
+<entry name="curl_error" url="function.curl-error.php"/>
+<entry name="curl_exec" url="function.curl-exec.php"/>
+<entry name="curl_getinfo" url="function.curl-getinfo.php"/>
+<entry name="curl_init" url="function.curl-init.php"/>
+<entry name="curl_multi_add_handle" url="function.curl-multi-add-handle.php"/>
+<entry name="curl_multi_close" url="function.curl-multi-close.php"/>
+<entry name="curl_multi_exec" url="function.curl-multi-exec.php"/>
+<entry name="curl_multi_getcontent" url="function.curl-multi-getcontent.php"/>
+<entry name="curl_multi_info_read" url="function.curl-multi-info-read.php"/>
+<entry name="curl_multi_init" url="function.curl-multi-init.php"/>
+<entry name="curl_multi_remove_handle" url="function.curl-multi-remove-handle.php"/>
+<entry name="curl_multi_select" url="function.curl-multi-select.php"/>
+<entry name="curl_setopt_array" url="function.curl-setopt-array.php"/>
+<entry name="curl_setopt" url="function.curl-setopt.php"/>
+<entry name="curl_version" url="function.curl-version.php"/>
+<entry name="fam_cancel_monitor" url="function.fam-cancel-monitor.php"/>
+<entry name="fam_close" url="function.fam-close.php"/>
+<entry name="fam_monitor_collection" url="function.fam-monitor-collection.php"/>
+<entry name="fam_monitor_directory" url="function.fam-monitor-directory.php"/>
+<entry name="fam_monitor_file" url="function.fam-monitor-file.php"/>
+<entry name="fam_next_event" url="function.fam-next-event.php"/>
+<entry name="fam_open" url="function.fam-open.php"/>
+<entry name="fam_pending" url="function.fam-pending.php"/>
+<entry name="fam_resume_monitor" url="function.fam-resume-monitor.php"/>
+<entry name="fam_suspend_monitor" url="function.fam-suspend-monitor.php"/>
+<entry name="ftp_alloc" url="function.ftp-alloc.php"/>
+<entry name="ftp_cdup" url="function.ftp-cdup.php"/>
+<entry name="ftp_chdir" url="function.ftp-chdir.php"/>
+<entry name="ftp_chmod" url="function.ftp-chmod.php"/>
+<entry name="ftp_close" url="function.ftp-close.php"/>
+<entry name="ftp_connect" url="function.ftp-connect.php"/>
+<entry name="ftp_delete" url="function.ftp-delete.php"/>
+<entry name="ftp_exec" url="function.ftp-exec.php"/>
+<entry name="ftp_fget" url="function.ftp-fget.php"/>
+<entry name="ftp_fput" url="function.ftp-fput.php"/>
+<entry name="ftp_get_option" url="function.ftp-get-option.php"/>
+<entry name="ftp_get" url="function.ftp-get.php"/>
+<entry name="ftp_login" url="function.ftp-login.php"/>
+<entry name="ftp_mdtm" url="function.ftp-mdtm.php"/>
+<entry name="ftp_mkdir" url="function.ftp-mkdir.php"/>
+<entry name="ftp_nb_continue" url="function.ftp-nb-continue.php"/>
+<entry name="ftp_nb_fget" url="function.ftp-nb-fget.php"/>
+<entry name="ftp_nb_fput" url="function.ftp-nb-fput.php"/>
+<entry name="ftp_nb_get" url="function.ftp-nb-get.php"/>
+<entry name="ftp_nb_put" url="function.ftp-nb-put.php"/>
+<entry name="ftp_nlist" url="function.ftp-nlist.php"/>
+<entry name="ftp_pasv" url="function.ftp-pasv.php"/>
+<entry name="ftp_put" url="function.ftp-put.php"/>
+<entry name="ftp_pwd" url="function.ftp-pwd.php"/>
+<entry name="ftp_quit" url="function.ftp-quit.php"/>
+<entry name="ftp_raw" url="function.ftp-raw.php"/>
+<entry name="ftp_rawlist" url="function.ftp-rawlist.php"/>
+<entry name="ftp_rename" url="function.ftp-rename.php"/>
+<entry name="ftp_rmdir" url="function.ftp-rmdir.php"/>
+<entry name="ftp_set_option" url="function.ftp-set-option.php"/>
+<entry name="ftp_site" url="function.ftp-site.php"/>
+<entry name="ftp_size" url="function.ftp-size.php"/>
+<entry name="ftp_ssl_connect" url="function.ftp-ssl-connect.php"/>
+<entry name="ftp_systype" url="function.ftp-systype.php"/>
+<entry name="hw_Array2Objrec" url="function.hw-array2objrec.php"/>
+<entry name="hw_changeobject" url="function.hw-changeobject.php"/>
+<entry name="hw_Children" url="function.hw-children.php"/>
+<entry name="hw_ChildrenObj" url="function.hw-childrenobj.php"/>
+<entry name="hw_Close" url="function.hw-close.php"/>
+<entry name="hw_Connect" url="function.hw-connect.php"/>
+<entry name="hw_connection_info" url="function.hw-connection-info.php"/>
+<entry name="hw_cp" url="function.hw-cp.php"/>
+<entry name="hw_Deleteobject" url="function.hw-deleteobject.php"/>
+<entry name="hw_DocByAnchor" url="function.hw-docbyanchor.php"/>
+<entry name="hw_DocByAnchorObj" url="function.hw-docbyanchorobj.php"/>
+<entry name="hw_Document_Attributes" url="function.hw-document-attributes.php"/>
+<entry name="hw_Document_BodyTag" url="function.hw-document-bodytag.php"/>
+<entry name="hw_Document_Content" url="function.hw-document-content.php"/>
+<entry name="hw_Document_SetContent" url="function.hw-document-setcontent.php"/>
+<entry name="hw_Document_Size" url="function.hw-document-size.php"/>
+<entry name="hw_dummy" url="function.hw-dummy.php"/>
+<entry name="hw_EditText" url="function.hw-edittext.php"/>
+<entry name="hw_Error" url="function.hw-error.php"/>
+<entry name="hw_ErrorMsg" url="function.hw-errormsg.php"/>
+<entry name="hw_Free_Document" url="function.hw-free-document.php"/>
+<entry name="hw_GetAnchors" url="function.hw-getanchors.php"/>
+<entry name="hw_GetAnchorsObj" url="function.hw-getanchorsobj.php"/>
+<entry name="hw_GetAndLock" url="function.hw-getandlock.php"/>
+<entry name="hw_GetChildColl" url="function.hw-getchildcoll.php"/>
+<entry name="hw_GetChildCollObj" url="function.hw-getchildcollobj.php"/>
+<entry name="hw_GetChildDocColl" url="function.hw-getchilddoccoll.php"/>
+<entry name="hw_GetChildDocCollObj" url="function.hw-getchilddoccollobj.php"/>
+<entry name="hw_GetObject" url="function.hw-getobject.php"/>
+<entry name="hw_GetObjectByQuery" url="function.hw-getobjectbyquery.php"/>
+<entry name="hw_GetObjectByQueryColl" url="function.hw-getobjectbyquerycoll.php"/>
+<entry name="hw_GetObjectByQueryCollObj" url="function.hw-getobjectbyquerycollobj.php"/>
+<entry name="hw_GetObjectByQueryObj" url="function.hw-getobjectbyqueryobj.php"/>
+<entry name="hw_GetParents" url="function.hw-getparents.php"/>
+<entry name="hw_GetParentsObj" url="function.hw-getparentsobj.php"/>
+<entry name="hw_getrellink" url="function.hw-getrellink.php"/>
+<entry name="hw_GetRemote" url="function.hw-getremote.php"/>
+<entry name="hw_getremotechildren" url="function.hw-getremotechildren.php"/>
+<entry name="hw_GetSrcByDestObj" url="function.hw-getsrcbydestobj.php"/>
+<entry name="hw_GetText" url="function.hw-gettext.php"/>
+<entry name="hw_getusername" url="function.hw-getusername.php"/>
+<entry name="hw_Identify" url="function.hw-identify.php"/>
+<entry name="hw_InCollections" url="function.hw-incollections.php"/>
+<entry name="hw_Info" url="function.hw-info.php"/>
+<entry name="hw_InsColl" url="function.hw-inscoll.php"/>
+<entry name="hw_InsDoc" url="function.hw-insdoc.php"/>
+<entry name="hw_insertanchors" url="function.hw-insertanchors.php"/>
+<entry name="hw_InsertDocument" url="function.hw-insertdocument.php"/>
+<entry name="hw_InsertObject" url="function.hw-insertobject.php"/>
+<entry name="hw_mapid" url="function.hw-mapid.php"/>
+<entry name="hw_Modifyobject" url="function.hw-modifyobject.php"/>
+<entry name="hw_mv" url="function.hw-mv.php"/>
+<entry name="hw_New_Document" url="function.hw-new-document.php"/>
+<entry name="hw_objrec2array" url="function.hw-objrec2array.php"/>
+<entry name="hw_Output_Document" url="function.hw-output-document.php"/>
+<entry name="hw_pConnect" url="function.hw-pconnect.php"/>
+<entry name="hw_PipeDocument" url="function.hw-pipedocument.php"/>
+<entry name="hw_Root" url="function.hw-root.php"/>
+<entry name="hw_setlinkroot" url="function.hw-setlinkroot.php"/>
+<entry name="hw_stat" url="function.hw-stat.php"/>
+<entry name="hw_Unlock" url="function.hw-unlock.php"/>
+<entry name="hw_Who" url="function.hw-who.php"/>
+<entry name="hw_api_attribute->key" url="function.hwapi-attribute-key.php"/>
+<entry name="hw_api_attribute->langdepvalue" url="function.hwapi-attribute-langdepvalue.php"/>
+<entry name="hw_api_attribute->value" url="function.hwapi-attribute-value.php"/>
+<entry name="hw_api_attribute->values" url="function.hwapi-attribute-values.php"/>
+<entry name="hw_api_attribute" url="function.hwapi-attribute.php"/>
+<entry name="hw_api->checkin" url="function.hwapi-checkin.php"/>
+<entry name="hw_api->checkout" url="function.hwapi-checkout.php"/>
+<entry name="hw_api->children" url="function.hwapi-children.php"/>
+<entry name="hw_api_content->mimetype" url="function.hwapi-content-mimetype.php"/>
+<entry name="hw_api_content->read" url="function.hwapi-content-read.php"/>
+<entry name="hw_api->content" url="function.hwapi-content.php"/>
+<entry name="hw_api->copy" url="function.hwapi-copy.php"/>
+<entry name="hw_api->dbstat" url="function.hwapi-dbstat.php"/>
+<entry name="hw_api->dcstat" url="function.hwapi-dcstat.php"/>
+<entry name="hw_api->dstanchors" url="function.hwapi-dstanchors.php"/>
+<entry name="hw_api->dstofsrcanchor" url="function.hwapi-dstofsrcanchor.php"/>
+<entry name="hw_api_error->count" url="function.hwapi-error-count.php"/>
+<entry name="hw_api_error->reason" url="function.hwapi-error-reason.php"/>
+<entry name="hw_api->find" url="function.hwapi-find.php"/>
+<entry name="hw_api->ftstat" url="function.hwapi-ftstat.php"/>
+<entry name="hwapi_hgcsp" url="function.hwapi-hgcsp.php"/>
+<entry name="hw_api->hwstat" url="function.hwapi-hwstat.php"/>
+<entry name="hw_api->identify" url="function.hwapi-identify.php"/>
+<entry name="hw_api->info" url="function.hwapi-info.php"/>
+<entry name="hw_api->insert" url="function.hwapi-insert.php"/>
+<entry name="hw_api->insertanchor" url="function.hwapi-insertanchor.php"/>
+<entry name="hw_api->insertcollection" url="function.hwapi-insertcollection.php"/>
+<entry name="hw_api->insertdocument" url="function.hwapi-insertdocument.php"/>
+<entry name="hw_api->link" url="function.hwapi-link.php"/>
+<entry name="hw_api->lock" url="function.hwapi-lock.php"/>
+<entry name="hw_api->move" url="function.hwapi-move.php"/>
+<entry name="hw_api_content" url="function.hwapi-new-content.php"/>
+<entry name="hw_api_object->assign" url="function.hwapi-object-assign.php"/>
+<entry name="hw_api_object->attreditable" url="function.hwapi-object-attreditable.php"/>
+<entry name="hw_api_object->count" url="function.hwapi-object-count.php"/>
+<entry name="hw_api_object->insert" url="function.hwapi-object-insert.php"/>
+<entry name="hw_api_object" url="function.hwapi-object-new.php"/>
+<entry name="hw_api_object->remove" url="function.hwapi-object-remove.php"/>
+<entry name="hw_api_object->title" url="function.hwapi-object-title.php"/>
+<entry name="hw_api_object->value" url="function.hwapi-object-value.php"/>
+<entry name="hw_api->object" url="function.hwapi-object.php"/>
+<entry name="hw_api->objectbyanchor" url="function.hwapi-objectbyanchor.php"/>
+<entry name="hw_api->parents" url="function.hwapi-parents.php"/>
+<entry name="hw_api_reason->description" url="function.hwapi-reason-description.php"/>
+<entry name="hw_api_reason->type" url="function.hwapi-reason-type.php"/>
+<entry name="hw_api->remove" url="function.hwapi-remove.php"/>
+<entry name="hw_api->replace" url="function.hwapi-replace.php"/>
+<entry name="hw_api->setcommittedversion" url="function.hwapi-setcommittedversion.php"/>
+<entry name="hw_api->srcanchors" url="function.hwapi-srcanchors.php"/>
+<entry name="hw_api->srcsofdst" url="function.hwapi-srcsofdst.php"/>
+<entry name="hw_api->unlock" url="function.hwapi-unlock.php"/>
+<entry name="hw_api->user" url="function.hwapi-user.php"/>
+<entry name="hw_api->userlist" url="function.hwapi-userlist.php"/>
+<entry name="HttpDeflateStream::__construct" url="function.httpdeflatestream-construct.php"/>
+<entry name="HttpDeflateStream::factory" url="function.httpdeflatestream-factory.php"/>
+<entry name="HttpDeflateStream::finish" url="function.httpdeflatestream-finish.php"/>
+<entry name="HttpDeflateStream::flush" url="function.httpdeflatestream-flush.php"/>
+<entry name="HttpDeflateStream::update" url="function.httpdeflatestream-update.php"/>
+<entry name="HttpInflateStream::__construct" url="function.httpinflatestream-construct.php"/>
+<entry name="HttpInflateStream::factory" url="function.httpinflatestream-factory.php"/>
+<entry name="HttpInflateStream::finish" url="function.httpinflatestream-finish.php"/>
+<entry name="HttpInflateStream::flush" url="function.httpinflatestream-flush.php"/>
+<entry name="HttpInflateStream::update" url="function.httpinflatestream-update.php"/>
+<entry name="HttpMessage::addHeaders" url="function.httpmessage-addheaders.php"/>
+<entry name="HttpMessage::__construct" url="function.httpmessage-construct.php"/>
+<entry name="HttpMessage::detach" url="function.httpmessage-detach.php"/>
+<entry name="HttpMessage::factory" url="function.httpmessage-factory.php"/>
+<entry name="HttpMessage::fromEnv" url="function.httpmessage-fromenv.php"/>
+<entry name="HttpMessage::fromString" url="function.httpmessage-fromstring.php"/>
+<entry name="HttpMessage::getBody" url="function.httpmessage-getbody.php"/>
+<entry name="HttpMessage::getHeader" url="function.httpmessage-getheader.php"/>
+<entry name="HttpMessage::getHeaders" url="function.httpmessage-getheaders.php"/>
+<entry name="HttpMessage::getHttpVersion" url="function.httpmessage-gethttpversion.php"/>
+<entry name="HttpMessage::getParentMessage" url="function.httpmessage-getparentmessage.php"/>
+<entry name="HttpMessage::getRequestMethod" url="function.httpmessage-getrequestmethod.php"/>
+<entry name="HttpMessage::getRequestUrl" url="function.httpmessage-getrequesturl.php"/>
+<entry name="HttpMessage::getResponseCode" url="function.httpmessage-getresponsecode.php"/>
+<entry name="HttpMessage::getResponseStatus" url="function.httpmessage-getresponsestatus.php"/>
+<entry name="HttpMessage::getType" url="function.httpmessage-gettype.php"/>
+<entry name="HttpMessage::guessContentType" url="function.httpmessage-guesscontenttype.php"/>
+<entry name="HttpMessage::prepend" url="function.httpmessage-prepend.php"/>
+<entry name="HttpMessage::reverse" url="function.httpmessage-reverse.php"/>
+<entry name="HttpMessage::send" url="function.httpmessage-send.php"/>
+<entry name="HttpMessage::setBody" url="function.httpmessage-setbody.php"/>
+<entry name="HttpMessage::setHeaders" url="function.httpmessage-setheaders.php"/>
+<entry name="HttpMessage::setHttpVersion" url="function.httpmessage-sethttpversion.php"/>
+<entry name="HttpMessage::setRequestMethod" url="function.httpmessage-setrequestmethod.php"/>
+<entry name="HttpMessage::setRequestUrl" url="function.httpmessage-setrequesturl.php"/>
+<entry name="HttpMessage::setResponseCode" url="function.httpmessage-setresponsecode.php"/>
+<entry name="HttpMessage::setResponseStatus" url="function.httpmessage-setresponsestatus.php"/>
+<entry name="HttpMessage::setType" url="function.httpmessage-settype.php"/>
+<entry name="HttpMessage::toMessageTypeObject" url="function.httpmessage-tomessagetypeobject.php"/>
+<entry name="HttpMessage::toString" url="function.httpmessage-tostring.php"/>
+<entry name="HttpQueryString::__construct" url="function.httpquerystring-construct.php"/>
+<entry name="HttpQueryString::get" url="function.httpquerystring-get.php"/>
+<entry name="HttpQueryString::mod" url="function.httpquerystring-mod.php"/>
+<entry name="HttpQueryString::set" url="function.httpquerystring-set.php"/>
+<entry name="HttpQueryString::singleton" url="function.httpquerystring-singleton.php"/>
+<entry name="HttpQueryString::toArray" url="function.httpquerystring-toarray.php"/>
+<entry name="HttpQueryString::toString" url="function.httpquerystring-tostring.php"/>
+<entry name="HttpQueryString::xlate" url="function.httpquerystring-xlate.php"/>
+<entry name="HttpRequest::addCookies" url="function.httprequest-addcookies.php"/>
+<entry name="HttpRequest::addHeaders" url="function.httprequest-addheaders.php"/>
+<entry name="HttpRequest::addPostFields" url="function.httprequest-addpostfields.php"/>
+<entry name="HttpRequest::addPostFile" url="function.httprequest-addpostfile.php"/>
+<entry name="HttpRequest::addPutData" url="function.httprequest-addputdata.php"/>
+<entry name="HttpRequest::addQueryData" url="function.httprequest-addquerydata.php"/>
+<entry name="HttpRequest::addRawPostData" url="function.httprequest-addrawpostdata.php"/>
+<entry name="HttpRequest::addSslOptions" url="function.httprequest-addssloptions.php"/>
+<entry name="HttpRequest::clearHistory" url="function.httprequest-clearhistory.php"/>
+<entry name="HttpRequest::__construct" url="function.httprequest-construct.php"/>
+<entry name="HttpRequest::enableCookies" url="function.httprequest-enablecookies.php"/>
+<entry name="HttpRequest::getContentType" url="function.httprequest-getcontenttype.php"/>
+<entry name="HttpRequest::getCookies" url="function.httprequest-getcookies.php"/>
+<entry name="HttpRequest::getHeaders" url="function.httprequest-getheaders.php"/>
+<entry name="HttpRequest::getHistory" url="function.httprequest-gethistory.php"/>
+<entry name="HttpRequest::getMethod" url="function.httprequest-getmethod.php"/>
+<entry name="HttpRequest::getOptions" url="function.httprequest-getoptions.php"/>
+<entry name="HttpRequest::getPostFields" url="function.httprequest-getpostfields.php"/>
+<entry name="HttpRequest::getPostFiles" url="function.httprequest-getpostfiles.php"/>
+<entry name="HttpRequest::getPutData" url="function.httprequest-getputdata.php"/>
+<entry name="HttpRequest::getPutFile" url="function.httprequest-getputfile.php"/>
+<entry name="HttpRequest::getQueryData" url="function.httprequest-getquerydata.php"/>
+<entry name="HttpRequest::getRawPostData" url="function.httprequest-getrawpostdata.php"/>
+<entry name="HttpRequest::getRawRequestMessage" url="function.httprequest-getrawrequestmessage.php"/>
+<entry name="HttpRequest::getRawResponseMessage" url="function.httprequest-getrawresponsemessage.php"/>
+<entry name="HttpRequest::getRequestMessage" url="function.httprequest-getrequestmessage.php"/>
+<entry name="HttpRequest::getResponseBody" url="function.httprequest-getresponsebody.php"/>
+<entry name="HttpRequest::getResponseCode" url="function.httprequest-getresponsecode.php"/>
+<entry name="HttpRequest::getResponseCookies" url="function.httprequest-getresponsecookies.php"/>
+<entry name="HttpRequest::getResponseData" url="function.httprequest-getresponsedata.php"/>
+<entry name="HttpRequest::getResponseHeader" url="function.httprequest-getresponseheader.php"/>
+<entry name="HttpRequest::getResponseInfo" url="function.httprequest-getresponseinfo.php"/>
+<entry name="HttpRequest::getResponseMessage" url="function.httprequest-getresponsemessage.php"/>
+<entry name="HttpRequest::getResponseStatus" url="function.httprequest-getresponsestatus.php"/>
+<entry name="HttpRequest::getSslOptions" url="function.httprequest-getssloptions.php"/>
+<entry name="HttpRequest::getUrl" url="function.httprequest-geturl.php"/>
+<entry name="HttpRequest::resetCookies" url="function.httprequest-resetcookies.php"/>
+<entry name="HttpRequest::send" url="function.httprequest-send.php"/>
+<entry name="HttpRequest::setContentType" url="function.httprequest-setcontenttype.php"/>
+<entry name="HttpRequest::setCookies" url="function.httprequest-setcookies.php"/>
+<entry name="HttpRequest::setHeaders" url="function.httprequest-setheaders.php"/>
+<entry name="HttpRequest::setMethod" url="function.httprequest-setmethod.php"/>
+<entry name="HttpRequest::setOptions" url="function.httprequest-setoptions.php"/>
+<entry name="HttpRequest::setPostFields" url="function.httprequest-setpostfields.php"/>
+<entry name="HttpRequest::setPostFiles" url="function.httprequest-setpostfiles.php"/>
+<entry name="HttpRequest::setPutData" url="function.httprequest-setputdata.php"/>
+<entry name="HttpRequest::setPutFile" url="function.httprequest-setputfile.php"/>
+<entry name="HttpRequest::setQueryData" url="function.httprequest-setquerydata.php"/>
+<entry name="HttpRequest::setRawPostData" url="function.httprequest-setrawpostdata.php"/>
+<entry name="HttpRequest::setSslOptions" url="function.httprequest-setssloptions.php"/>
+<entry name="HttpRequest::setUrl" url="function.httprequest-seturl.php"/>
+<entry name="HttpRequestPool::attach" url="function.httprequestpool-attach.php"/>
+<entry name="HttpRequestPool::__construct" url="function.httprequestpool-construct.php"/>
+<entry name="HttpRequestPool::__destruct" url="function.httprequestpool-destruct.php"/>
+<entry name="HttpRequestPool::detach" url="function.httprequestpool-detach.php"/>
+<entry name="HttpRequestPool::getAttachedRequests" url="function.httprequestpool-getattachedrequests.php"/>
+<entry name="HttpRequestPool::getFinishedRequests" url="function.httprequestpool-getfinishedrequests.php"/>
+<entry name="HttpRequestPool::reset" url="function.httprequestpool-reset.php"/>
+<entry name="HttpRequestPool::send" url="function.httprequestpool-send.php"/>
+<entry name="HttpRequestPool::socketPerform" url="function.httprequestpool-socketperform.php"/>
+<entry name="HttpRequestPool::socketSelect" url="function.httprequestpool-socketselect.php"/>
+<entry name="HttpResponse::capture" url="function.httpresponse-capture.php"/>
+<entry name="HttpResponse::getBufferSize" url="function.httpresponse-getbuffersize.php"/>
+<entry name="HttpResponse::getCache" url="function.httpresponse-getcache.php"/>
+<entry name="HttpResponse::getCacheControl" url="function.httpresponse-getcachecontrol.php"/>
+<entry name="HttpResponse::getContentDisposition" url="function.httpresponse-getcontentdisposition.php"/>
+<entry name="HttpResponse::getContentType" url="function.httpresponse-getcontenttype.php"/>
+<entry name="HttpResponse::getData" url="function.httpresponse-getdata.php"/>
+<entry name="HttpResponse::getETag" url="function.httpresponse-getetag.php"/>
+<entry name="HttpResponse::getFile" url="function.httpresponse-getfile.php"/>
+<entry name="HttpResponse::getGzip" url="function.httpresponse-getgzip.php"/>
+<entry name="HttpResponse::getHeader" url="function.httpresponse-getheader.php"/>
+<entry name="HttpResponse::getLastModified" url="function.httpresponse-getlastmodified.php"/>
+<entry name="HttpResponse::getRequestBody" url="function.httpresponse-getrequestbody.php"/>
+<entry name="HttpResponse::getRequestBodyStream" url="function.httpresponse-getrequestbodystream.php"/>
+<entry name="HttpResponse::getRequestHeaders" url="function.httpresponse-getrequestheaders.php"/>
+<entry name="HttpResponse::getStream" url="function.httpresponse-getstream.php"/>
+<entry name="HttpResponse::getThrottleDelay" url="function.httpresponse-getthrottledelay.php"/>
+<entry name="HttpResponse::guessContentType" url="function.httpresponse-guesscontenttype.php"/>
+<entry name="HttpResponse::redirect" url="function.httpresponse-redirect.php"/>
+<entry name="HttpResponse::send" url="function.httpresponse-send.php"/>
+<entry name="HttpResponse::setBufferSize" url="function.httpresponse-setbuffersize.php"/>
+<entry name="HttpResponse::setCache" url="function.httpresponse-setcache.php"/>
+<entry name="HttpResponse::setCacheControl" url="function.httpresponse-setcachecontrol.php"/>
+<entry name="HttpResponse::setContentDisposition" url="function.httpresponse-setcontentdisposition.php"/>
+<entry name="HttpResponse::setContentType" url="function.httpresponse-setcontenttype.php"/>
+<entry name="HttpResponse::setData" url="function.httpresponse-setdata.php"/>
+<entry name="HttpResponse::setETag" url="function.httpresponse-setetag.php"/>
+<entry name="HttpResponse::setFile" url="function.httpresponse-setfile.php"/>
+<entry name="HttpResponse::setGzip" url="function.httpresponse-setgzip.php"/>
+<entry name="HttpResponse::setHeader" url="function.httpresponse-setheader.php"/>
+<entry name="HttpResponse::setLastModified" url="function.httpresponse-setlastmodified.php"/>
+<entry name="HttpResponse::setStream" url="function.httpresponse-setstream.php"/>
+<entry name="HttpResponse::setThrottleDelay" url="function.httpresponse-setthrottledelay.php"/>
+<entry name="HttpResponse::status" url="function.httpresponse-status.php"/>
+<entry name="http_cache_etag" url="function.http-cache-etag.php"/>
+<entry name="http_cache_last_modified" url="function.http-cache-last-modified.php"/>
+<entry name="http_chunked_decode" url="function.http-chunked-decode.php"/>
+<entry name="http_deflate" url="function.http-deflate.php"/>
+<entry name="http_inflate" url="function.http-inflate.php"/>
+<entry name="http_build_cookie" url="function.http-build-cookie.php"/>
+<entry name="http_date" url="function.http-date.php"/>
+<entry name="http_get_request_body_stream" url="function.http-get-request-body-stream.php"/>
+<entry name="http_get_request_body" url="function.http-get-request-body.php"/>
+<entry name="http_get_request_headers" url="function.http-get-request-headers.php"/>
+<entry name="http_match_etag" url="function.http-match-etag.php"/>
+<entry name="http_match_modified" url="function.http-match-modified.php"/>
+<entry name="http_match_request_header" url="function.http-match-request-header.php"/>
+<entry name="http_support" url="function.http-support.php"/>
+<entry name="http_negotiate_charset" url="function.http-negotiate-charset.php"/>
+<entry name="http_negotiate_content_type" url="function.http-negotiate-content-type.php"/>
+<entry name="http_negotiate_language" url="function.http-negotiate-language.php"/>
+<entry name="ob_deflatehandler" url="function.ob-deflatehandler.php"/>
+<entry name="ob_etaghandler" url="function.ob-etaghandler.php"/>
+<entry name="ob_inflatehandler" url="function.ob-inflatehandler.php"/>
+<entry name="http_parse_cookie" url="function.http-parse-cookie.php"/>
+<entry name="http_parse_headers" url="function.http-parse-headers.php"/>
+<entry name="http_parse_message" url="function.http-parse-message.php"/>
+<entry name="http_parse_params" url="function.http-parse-params.php"/>
+<entry name="http_persistent_handles_clean" url="function.http-persistent-handles-clean.php"/>
+<entry name="http_persistent_handles_count" url="function.http-persistent-handles-count.php"/>
+<entry name="http_persistent_handles_ident" url="function.http-persistent-handles-ident.php"/>
+<entry name="http_get" url="function.http-get.php"/>
+<entry name="http_head" url="function.http-head.php"/>
+<entry name="http_post_data" url="function.http-post-data.php"/>
+<entry name="http_post_fields" url="function.http-post-fields.php"/>
+<entry name="http_put_data" url="function.http-put-data.php"/>
+<entry name="http_put_file" url="function.http-put-file.php"/>
+<entry name="http_put_stream" url="function.http-put-stream.php"/>
+<entry name="http_request_body_encode" url="function.http-request-body-encode.php"/>
+<entry name="http_request_method_exists" url="function.http-request-method-exists.php"/>
+<entry name="http_request_method_name" url="function.http-request-method-name.php"/>
+<entry name="http_request_method_register" url="function.http-request-method-register.php"/>
+<entry name="http_request_method_unregister" url="function.http-request-method-unregister.php"/>
+<entry name="http_request" url="function.http-request.php"/>
+<entry name="http_redirect" url="function.http-redirect.php"/>
+<entry name="http_send_content_disposition" url="function.http-send-content-disposition.php"/>
+<entry name="http_send_content_type" url="function.http-send-content-type.php"/>
+<entry name="http_send_data" url="function.http-send-data.php"/>
+<entry name="http_send_file" url="function.http-send-file.php"/>
+<entry name="http_send_last_modified" url="function.http-send-last-modified.php"/>
+<entry name="http_send_status" url="function.http-send-status.php"/>
+<entry name="http_send_stream" url="function.http-send-stream.php"/>
+<entry name="http_throttle" url="function.http-throttle.php"/>
+<entry name="http_build_str" url="function.http-build-str.php"/>
+<entry name="http_build_url" url="function.http-build-url.php"/>
+<entry name="java_last_exception_clear" url="function.java-last-exception-clear.php"/>
+<entry name="java_last_exception_get" url="function.java-last-exception-get.php"/>
+<entry name="ldap_8859_to_t61" url="function.ldap-8859-to-t61.php"/>
+<entry name="ldap_add" url="function.ldap-add.php"/>
+<entry name="ldap_bind" url="function.ldap-bind.php"/>
+<entry name="ldap_close" url="function.ldap-close.php"/>
+<entry name="ldap_compare" url="function.ldap-compare.php"/>
+<entry name="ldap_connect" url="function.ldap-connect.php"/>
+<entry name="ldap_count_entries" url="function.ldap-count-entries.php"/>
+<entry name="ldap_delete" url="function.ldap-delete.php"/>
+<entry name="ldap_dn2ufn" url="function.ldap-dn2ufn.php"/>
+<entry name="ldap_err2str" url="function.ldap-err2str.php"/>
+<entry name="ldap_errno" url="function.ldap-errno.php"/>
+<entry name="ldap_error" url="function.ldap-error.php"/>
+<entry name="ldap_explode_dn" url="function.ldap-explode-dn.php"/>
+<entry name="ldap_first_attribute" url="function.ldap-first-attribute.php"/>
+<entry name="ldap_first_entry" url="function.ldap-first-entry.php"/>
+<entry name="ldap_first_reference" url="function.ldap-first-reference.php"/>
+<entry name="ldap_free_result" url="function.ldap-free-result.php"/>
+<entry name="ldap_get_attributes" url="function.ldap-get-attributes.php"/>
+<entry name="ldap_get_dn" url="function.ldap-get-dn.php"/>
+<entry name="ldap_get_entries" url="function.ldap-get-entries.php"/>
+<entry name="ldap_get_option" url="function.ldap-get-option.php"/>
+<entry name="ldap_get_values_len" url="function.ldap-get-values-len.php"/>
+<entry name="ldap_get_values" url="function.ldap-get-values.php"/>
+<entry name="ldap_list" url="function.ldap-list.php"/>
+<entry name="ldap_mod_add" url="function.ldap-mod-add.php"/>
+<entry name="ldap_mod_del" url="function.ldap-mod-del.php"/>
+<entry name="ldap_mod_replace" url="function.ldap-mod-replace.php"/>
+<entry name="ldap_modify" url="function.ldap-modify.php"/>
+<entry name="ldap_next_attribute" url="function.ldap-next-attribute.php"/>
+<entry name="ldap_next_entry" url="function.ldap-next-entry.php"/>
+<entry name="ldap_next_reference" url="function.ldap-next-reference.php"/>
+<entry name="ldap_parse_reference" url="function.ldap-parse-reference.php"/>
+<entry name="ldap_parse_result" url="function.ldap-parse-result.php"/>
+<entry name="ldap_read" url="function.ldap-read.php"/>
+<entry name="ldap_rename" url="function.ldap-rename.php"/>
+<entry name="ldap_sasl_bind" url="function.ldap-sasl-bind.php"/>
+<entry name="ldap_search" url="function.ldap-search.php"/>
+<entry name="ldap_set_option" url="function.ldap-set-option.php"/>
+<entry name="ldap_set_rebind_proc" url="function.ldap-set-rebind-proc.php"/>
+<entry name="ldap_sort" url="function.ldap-sort.php"/>
+<entry name="ldap_start_tls" url="function.ldap-start-tls.php"/>
+<entry name="ldap_t61_to_8859" url="function.ldap-t61-to-8859.php"/>
+<entry name="ldap_unbind" url="function.ldap-unbind.php"/>
+<entry name="notes_body" url="function.notes-body.php"/>
+<entry name="notes_copy_db" url="function.notes-copy-db.php"/>
+<entry name="notes_create_db" url="function.notes-create-db.php"/>
+<entry name="notes_create_note" url="function.notes-create-note.php"/>
+<entry name="notes_drop_db" url="function.notes-drop-db.php"/>
+<entry name="notes_find_note" url="function.notes-find-note.php"/>
+<entry name="notes_header_info" url="function.notes-header-info.php"/>
+<entry name="notes_list_msgs" url="function.notes-list-msgs.php"/>
+<entry name="notes_mark_read" url="function.notes-mark-read.php"/>
+<entry name="notes_mark_unread" url="function.notes-mark-unread.php"/>
+<entry name="notes_nav_create" url="function.notes-nav-create.php"/>
+<entry name="notes_search" url="function.notes-search.php"/>
+<entry name="notes_unread" url="function.notes-unread.php"/>
+<entry name="notes_version" url="function.notes-version.php"/>
+<entry name="Memcache::add" url="function.memcache-add.php"/>
+<entry name="Memcache::addServer" url="function.memcache-addserver.php"/>
+<entry name="Memcache::close" url="function.memcache-close.php"/>
+<entry name="Memcache::connect" url="function.memcache-connect.php"/>
+<entry name="memcache_debug" url="function.memcache-debug.php"/>
+<entry name="Memcache::decrement" url="function.memcache-decrement.php"/>
+<entry name="Memcache::delete" url="function.memcache-delete.php"/>
+<entry name="Memcache::flush" url="function.memcache-flush.php"/>
+<entry name="Memcache::get" url="function.memcache-get.php"/>
+<entry name="Memcache::getExtendedStats" url="function.memcache-getextendedstats.php"/>
+<entry name="Memcache::getServerStatus" url="function.memcache-getserverstatus.php"/>
+<entry name="Memcache::getStats" url="function.memcache-getstats.php"/>
+<entry name="Memcache::getVersion" url="function.memcache-getversion.php"/>
+<entry name="Memcache::increment" url="function.memcache-increment.php"/>
+<entry name="Memcache::pconnect" url="function.memcache-pconnect.php"/>
+<entry name="Memcache::replace" url="function.memcache-replace.php"/>
+<entry name="Memcache::set" url="function.memcache-set.php"/>
+<entry name="Memcache::setCompressThreshold" url="function.memcache-setcompressthreshold.php"/>
+<entry name="Memcache::setServerParams" url="function.memcache-setserverparams.php"/>
+<entry name="udm_add_search_limit" url="function.udm-add-search-limit.php"/>
+<entry name="udm_alloc_agent_array" url="function.udm-alloc-agent-array.php"/>
+<entry name="udm_alloc_agent" url="function.udm-alloc-agent.php"/>
+<entry name="udm_api_version" url="function.udm-api-version.php"/>
+<entry name="udm_cat_list" url="function.udm-cat-list.php"/>
+<entry name="udm_cat_path" url="function.udm-cat-path.php"/>
+<entry name="udm_check_charset" url="function.udm-check-charset.php"/>
+<entry name="udm_check_stored" url="function.udm-check-stored.php"/>
+<entry name="udm_clear_search_limits" url="function.udm-clear-search-limits.php"/>
+<entry name="udm_close_stored" url="function.udm-close-stored.php"/>
+<entry name="udm_crc32" url="function.udm-crc32.php"/>
+<entry name="udm_errno" url="function.udm-errno.php"/>
+<entry name="udm_error" url="function.udm-error.php"/>
+<entry name="udm_find" url="function.udm-find.php"/>
+<entry name="udm_free_agent" url="function.udm-free-agent.php"/>
+<entry name="udm_free_ispell_data" url="function.udm-free-ispell-data.php"/>
+<entry name="udm_free_res" url="function.udm-free-res.php"/>
+<entry name="udm_get_doc_count" url="function.udm-get-doc-count.php"/>
+<entry name="udm_get_res_field" url="function.udm-get-res-field.php"/>
+<entry name="udm_get_res_param" url="function.udm-get-res-param.php"/>
+<entry name="udm_hash32" url="function.udm-hash32.php"/>
+<entry name="udm_load_ispell_data" url="function.udm-load-ispell-data.php"/>
+<entry name="udm_open_stored" url="function.udm-open-stored.php"/>
+<entry name="udm_set_agent_param" url="function.udm-set-agent-param.php"/>
+<entry name="mqseries_back" url="function.mqseries-back.php"/>
+<entry name="mqseries_begin" url="function.mqseries-begin.php"/>
+<entry name="mqseries_close" url="function.mqseries-close.php"/>
+<entry name="mqseries_cmit" url="function.mqseries-cmit.php"/>
+<entry name="mqseries_conn" url="function.mqseries-conn.php"/>
+<entry name="mqseries_connx" url="function.mqseries-connx.php"/>
+<entry name="mqseries_disc" url="function.mqseries-disc.php"/>
+<entry name="mqseries_get" url="function.mqseries-get.php"/>
+<entry name="mqseries_inq" url="function.mqseries-inq.php"/>
+<entry name="mqseries_open" url="function.mqseries-open.php"/>
+<entry name="mqseries_put1" url="function.mqseries-put1.php"/>
+<entry name="mqseries_put" url="function.mqseries-put.php"/>
+<entry name="mqseries_set" url="function.mqseries-set.php"/>
+<entry name="mqseries_strerror" url="function.mqseries-strerror.php"/>
+<entry name="gopher_parsedir" url="function.gopher-parsedir.php"/>
+<entry name="checkdnsrr" url="function.checkdnsrr.php"/>
+<entry name="closelog" url="function.closelog.php"/>
+<entry name="define_syslog_variables" url="function.define-syslog-variables.php"/>
+<entry name="dns_check_record" url="function.dns-check-record.php"/>
+<entry name="dns_get_mx" url="function.dns-get-mx.php"/>
+<entry name="dns_get_record" url="function.dns-get-record.php"/>
+<entry name="fsockopen" url="function.fsockopen.php"/>
+<entry name="gethostbyaddr" url="function.gethostbyaddr.php"/>
+<entry name="gethostbyname" url="function.gethostbyname.php"/>
+<entry name="gethostbynamel" url="function.gethostbynamel.php"/>
+<entry name="getmxrr" url="function.getmxrr.php"/>
+<entry name="getprotobyname" url="function.getprotobyname.php"/>
+<entry name="getprotobynumber" url="function.getprotobynumber.php"/>
+<entry name="getservbyname" url="function.getservbyname.php"/>
+<entry name="getservbyport" url="function.getservbyport.php"/>
+<entry name="header" url="function.header.php"/>
+<entry name="headers_list" url="function.headers-list.php"/>
+<entry name="headers_sent" url="function.headers-sent.php"/>
+<entry name="inet_ntop" url="function.inet-ntop.php"/>
+<entry name="inet_pton" url="function.inet-pton.php"/>
+<entry name="ip2long" url="function.ip2long.php"/>
+<entry name="long2ip" url="function.long2ip.php"/>
+<entry name="openlog" url="function.openlog.php"/>
+<entry name="pfsockopen" url="function.pfsockopen.php"/>
+<entry name="setcookie" url="function.setcookie.php"/>
+<entry name="setrawcookie" url="function.setrawcookie.php"/>
+<entry name="socket_get_status" url="function.socket-get-status.php"/>
+<entry name="socket_set_blocking" url="function.socket-set-blocking.php"/>
+<entry name="socket_set_timeout" url="function.socket-set-timeout.php"/>
+<entry name="syslog" url="function.syslog.php"/>
+<entry name="SAMConnection->commit()" url="function.samconnection-commit.php"/>
+<entry name="SAMConnection->connect()" url="function.samconnection-connect.php"/>
+<entry name="SAMConnection->__construct()" url="function.samconnection-constructor.php"/>
+<entry name="SAMConnection->disconnect()" url="function.samconnection-disconnect.php"/>
+<entry name="SAMConnection->errno" url="function.samconnection-errno.php"/>
+<entry name="SAMConnection->error" url="function.samconnection-error.php"/>
+<entry name="SAMConnection->isConnected()" url="function.samconnection-isconnected.php"/>
+<entry name="SAMConnection->peek()" url="function.samconnection-peek.php"/>
+<entry name="SAMConnection->peekAll()" url="function.samconnection-peekall.php"/>
+<entry name="SAMConnection->receive()" url="function.samconnection-receive.php"/>
+<entry name="SAMConnection->remove()" url="function.samconnection-remove.php"/>
+<entry name="SAMConnection->rollback()" url="function.samconnection-rollback.php"/>
+<entry name="SAMConnection->send()" url="function.samconnection-send.php"/>
+<entry name="SAMConnection::setDebug()" url="function.samconnection-setDebug.php"/>
+<entry name="SAMConnection->subscribe()" url="function.samconnection-subscribe.php"/>
+<entry name="SAMConnection->unsubscribe()" url="function.samconnection-unsubscribe.php"/>
+<entry name="SAMMessage->body" url="function.sammessage-body.php"/>
+<entry name="SAMMessage->__construct()" url="function.sammessage-constructor.php"/>
+<entry name="SAMMessage->header" url="function.sammessage-header.php"/>
+<entry name="snmp_get_quick_print" url="function.snmp-get-quick-print.php"/>
+<entry name="snmp_get_valueretrieval" url="function.snmp-get-valueretrieval.php"/>
+<entry name="snmp_read_mib" url="function.snmp-read-mib.php"/>
+<entry name="snmp_set_enum_print" url="function.snmp-set-enum-print.php"/>
+<entry name="snmp_set_oid_numeric_print" url="function.snmp-set-oid-numeric-print.php"/>
+<entry name="snmp_set_oid_output_format" url="function.snmp-set-oid-output-format.php"/>
+<entry name="snmp_set_quick_print" url="function.snmp-set-quick-print.php"/>
+<entry name="snmp_set_valueretrieval" url="function.snmp-set-valueretrieval.php"/>
+<entry name="snmpget" url="function.snmpget.php"/>
+<entry name="snmpgetnext" url="function.snmpgetnext.php"/>
+<entry name="snmprealwalk" url="function.snmprealwalk.php"/>
+<entry name="snmpset" url="function.snmpset.php"/>
+<entry name="snmpwalk" url="function.snmpwalk.php"/>
+<entry name="snmpwalkoid" url="function.snmpwalkoid.php"/>
+<entry name="socket_accept" url="function.socket-accept.php"/>
+<entry name="socket_bind" url="function.socket-bind.php"/>
+<entry name="socket_clear_error" url="function.socket-clear-error.php"/>
+<entry name="socket_close" url="function.socket-close.php"/>
+<entry name="socket_connect" url="function.socket-connect.php"/>
+<entry name="socket_create_listen" url="function.socket-create-listen.php"/>
+<entry name="socket_create_pair" url="function.socket-create-pair.php"/>
+<entry name="socket_create" url="function.socket-create.php"/>
+<entry name="socket_get_option" url="function.socket-get-option.php"/>
+<entry name="socket_getpeername" url="function.socket-getpeername.php"/>
+<entry name="socket_getsockname" url="function.socket-getsockname.php"/>
+<entry name="socket_last_error" url="function.socket-last-error.php"/>
+<entry name="socket_listen" url="function.socket-listen.php"/>
+<entry name="socket_read" url="function.socket-read.php"/>
+<entry name="socket_recv" url="function.socket-recv.php"/>
+<entry name="socket_recvfrom" url="function.socket-recvfrom.php"/>
+<entry name="socket_select" url="function.socket-select.php"/>
+<entry name="socket_send" url="function.socket-send.php"/>
+<entry name="socket_sendto" url="function.socket-sendto.php"/>
+<entry name="socket_set_block" url="function.socket-set-block.php"/>
+<entry name="socket_set_nonblock" url="function.socket-set-nonblock.php"/>
+<entry name="socket_set_option" url="function.socket-set-option.php"/>
+<entry name="socket_shutdown" url="function.socket-shutdown.php"/>
+<entry name="socket_strerror" url="function.socket-strerror.php"/>
+<entry name="socket_write" url="function.socket-write.php"/>
+<entry name="ssh2_auth_hostbased_file" url="function.ssh2-auth-hostbased-file.php"/>
+<entry name="ssh2_auth_none" url="function.ssh2-auth-none.php"/>
+<entry name="ssh2_auth_password" url="function.ssh2-auth-password.php"/>
+<entry name="ssh2_auth_pubkey_file" url="function.ssh2-auth-pubkey-file.php"/>
+<entry name="ssh2_connect" url="function.ssh2-connect.php"/>
+<entry name="ssh2_exec" url="function.ssh2-exec.php"/>
+<entry name="ssh2_fetch_stream" url="function.ssh2-fetch-stream.php"/>
+<entry name="ssh2_fingerprint" url="function.ssh2-fingerprint.php"/>
+<entry name="ssh2_methods_negotiated" url="function.ssh2-methods-negotiated.php"/>
+<entry name="ssh2_publickey_add" url="function.ssh2-publickey-add.php"/>
+<entry name="ssh2_publickey_init" url="function.ssh2-publickey-init.php"/>
+<entry name="ssh2_publickey_list" url="function.ssh2-publickey-list.php"/>
+<entry name="ssh2_publickey_remove" url="function.ssh2-publickey-remove.php"/>
+<entry name="ssh2_scp_recv" url="function.ssh2-scp-recv.php"/>
+<entry name="ssh2_scp_send" url="function.ssh2-scp-send.php"/>
+<entry name="ssh2_sftp_lstat" url="function.ssh2-sftp-lstat.php"/>
+<entry name="ssh2_sftp_mkdir" url="function.ssh2-sftp-mkdir.php"/>
+<entry name="ssh2_sftp_readlink" url="function.ssh2-sftp-readlink.php"/>
+<entry name="ssh2_sftp_realpath" url="function.ssh2-sftp-realpath.php"/>
+<entry name="ssh2_sftp_rename" url="function.ssh2-sftp-rename.php"/>
+<entry name="ssh2_sftp_rmdir" url="function.ssh2-sftp-rmdir.php"/>
+<entry name="ssh2_sftp_stat" url="function.ssh2-sftp-stat.php"/>
+<entry name="ssh2_sftp_symlink" url="function.ssh2-sftp-symlink.php"/>
+<entry name="ssh2_sftp_unlink" url="function.ssh2-sftp-unlink.php"/>
+<entry name="ssh2_sftp" url="function.ssh2-sftp.php"/>
+<entry name="ssh2_shell" url="function.ssh2-shell.php"/>
+<entry name="ssh2_tunnel" url="function.ssh2-tunnel.php"/>
+<entry name="svn_add" url="function.svn-add.php"/>
+<entry name="svn_auth_get_parameter" url="function.svn-auth-get-parameter.php"/>
+<entry name="svn_auth_set_parameter" url="function.svn-auth-set-parameter.php"/>
+<entry name="svn_cat" url="function.svn-cat.php"/>
+<entry name="svn_checkout" url="function.svn-checkout.php"/>
+<entry name="svn_cleanup" url="function.svn-cleanup.php"/>
+<entry name="svn_client_version" url="function.svn-client-version.php"/>
+<entry name="svn_commit" url="function.svn-commit.php"/>
+<entry name="svn_diff" url="function.svn-diff.php"/>
+<entry name="svn_fs_abort_txn" url="function.svn-fs-abort-txn.php"/>
+<entry name="svn_fs_apply_text" url="function.svn-fs-apply-text.php"/>
+<entry name="svn_fs_begin_txn2" url="function.svn-fs-begin-txn2.php"/>
+<entry name="svn_fs_change_node_prop" url="function.svn-fs-change-node-prop.php"/>
+<entry name="svn_fs_check_path" url="function.svn-fs-check-path.php"/>
+<entry name="svn_fs_contents_changed" url="function.svn-fs-contents-changed.php"/>
+<entry name="svn_fs_copy" url="function.svn-fs-copy.php"/>
+<entry name="svn_fs_delete" url="function.svn-fs-delete.php"/>
+<entry name="svn_fs_dir_entries" url="function.svn-fs-dir-entries.php"/>
+<entry name="svn_fs_file_contents" url="function.svn-fs-file-contents.php"/>
+<entry name="svn_fs_file_length" url="function.svn-fs-file-length.php"/>
+<entry name="svn_fs_is_dir" url="function.svn-fs-is-dir.php"/>
+<entry name="svn_fs_is_file" url="function.svn-fs-is-file.php"/>
+<entry name="svn_fs_make_dir" url="function.svn-fs-make-dir.php"/>
+<entry name="svn_fs_make_file" url="function.svn-fs-make-file.php"/>
+<entry name="svn_fs_node_created_rev" url="function.svn-fs-node-created-rev.php"/>
+<entry name="svn_fs_node_prop" url="function.svn-fs-node-prop.php"/>
+<entry name="svn_fs_props_changed" url="function.svn-fs-props-changed.php"/>
+<entry name="svn_fs_revision_prop" url="function.svn-fs-revision-prop.php"/>
+<entry name="svn_fs_revision_root" url="function.svn-fs-revision-root.php"/>
+<entry name="svn_fs_txn_root" url="function.svn-fs-txn-root.php"/>
+<entry name="svn_fs_youngest_rev" url="function.svn-fs-youngest-rev.php"/>
+<entry name="svn_import" url="function.svn-import.php"/>
+<entry name="svn_log" url="function.svn-log.php"/>
+<entry name="svn_ls" url="function.svn-ls.php"/>
+<entry name="svn_repos_create" url="function.svn-repos-create.php"/>
+<entry name="svn_repos_fs_begin_txn_for_commit" url="function.svn-repos-fs-begin-txn-for-commit.php"/>
+<entry name="svn_repos_fs_commit_txn" url="function.svn-repos-fs-commit-txn.php"/>
+<entry name="svn_repos_fs" url="function.svn-repos-fs.php"/>
+<entry name="svn_repos_hotcopy" url="function.svn-repos-hotcopy.php"/>
+<entry name="svn_repos_open" url="function.svn-repos-open.php"/>
+<entry name="svn_repos_recover" url="function.svn-repos-recover.php"/>
+<entry name="svn_status" url="function.svn-status.php"/>
+<entry name="svn_update" url="function.svn-update.php"/>
+<entry name="tcpwrap_check" url="function.tcpwrap-check.php"/>
+<entry name="yaz_addinfo" url="function.yaz-addinfo.php"/>
+<entry name="yaz_ccl_conf" url="function.yaz-ccl-conf.php"/>
+<entry name="yaz_ccl_parse" url="function.yaz-ccl-parse.php"/>
+<entry name="yaz_close" url="function.yaz-close.php"/>
+<entry name="yaz_connect" url="function.yaz-connect.php"/>
+<entry name="yaz_database" url="function.yaz-database.php"/>
+<entry name="yaz_element" url="function.yaz-element.php"/>
+<entry name="yaz_errno" url="function.yaz-errno.php"/>
+<entry name="yaz_error" url="function.yaz-error.php"/>
+<entry name="yaz_es_result" url="function.yaz-es-result.php"/>
+<entry name="yaz_es" url="function.yaz-es.php"/>
+<entry name="yaz_get_option" url="function.yaz-get-option.php"/>
+<entry name="yaz_hits" url="function.yaz-hits.php"/>
+<entry name="yaz_itemorder" url="function.yaz-itemorder.php"/>
+<entry name="yaz_present" url="function.yaz-present.php"/>
+<entry name="yaz_range" url="function.yaz-range.php"/>
+<entry name="yaz_record" url="function.yaz-record.php"/>
+<entry name="yaz_scan_result" url="function.yaz-scan-result.php"/>
+<entry name="yaz_scan" url="function.yaz-scan.php"/>
+<entry name="yaz_schema" url="function.yaz-schema.php"/>
+<entry name="yaz_search" url="function.yaz-search.php"/>
+<entry name="yaz_set_option" url="function.yaz-set-option.php"/>
+<entry name="yaz_sort" url="function.yaz-sort.php"/>
+<entry name="yaz_syntax" url="function.yaz-syntax.php"/>
+<entry name="yaz_wait" url="function.yaz-wait.php"/>
+<entry name="yp_all" url="function.yp-all.php"/>
+<entry name="yp_cat" url="function.yp-cat.php"/>
+<entry name="yp_err_string" url="function.yp-err-string.php"/>
+<entry name="yp_errno" url="function.yp-errno.php"/>
+<entry name="yp_first" url="function.yp-first.php"/>
+<entry name="yp_get_default_domain" url="function.yp-get-default-domain.php"/>
+<entry name="yp_master" url="function.yp-master.php"/>
+<entry name="yp_match" url="function.yp-match.php"/>
+<entry name="yp_next" url="function.yp-next.php"/>
+<entry name="yp_order" url="function.yp-order.php"/>
+<entry name="apache_child_terminate" url="function.apache-child-terminate.php"/>
+<entry name="apache_get_modules" url="function.apache-get-modules.php"/>
+<entry name="apache_get_version" url="function.apache-get-version.php"/>
+<entry name="apache_getenv" url="function.apache-getenv.php"/>
+<entry name="apache_lookup_uri" url="function.apache-lookup-uri.php"/>
+<entry name="apache_note" url="function.apache-note.php"/>
+<entry name="apache_request_headers" url="function.apache-request-headers.php"/>
+<entry name="apache_reset_timeout" url="function.apache-reset-timeout.php"/>
+<entry name="apache_response_headers" url="function.apache-response-headers.php"/>
+<entry name="apache_setenv" url="function.apache-setenv.php"/>
+<entry name="ascii2ebcdic" url="function.ascii2ebcdic.php"/>
+<entry name="ebcdic2ascii" url="function.ebcdic2ascii.php"/>
+<entry name="getallheaders" url="function.getallheaders.php"/>
+<entry name="virtual" url="function.virtual.php"/>
+<entry name="iis_add_server" url="function.iis-add-server.php"/>
+<entry name="iis_get_dir_security" url="function.iis-get-dir-security.php"/>
+<entry name="iis_get_script_map" url="function.iis-get-script-map.php"/>
+<entry name="iis_get_server_by_comment" url="function.iis-get-server-by-comment.php"/>
+<entry name="iis_get_server_by_path" url="function.iis-get-server-by-path.php"/>
+<entry name="iis_get_server_rights" url="function.iis-get-server-rights.php"/>
+<entry name="iis_get_service_state" url="function.iis-get-service-state.php"/>
+<entry name="iis_remove_server" url="function.iis-remove-server.php"/>
+<entry name="iis_set_app_settings" url="function.iis-set-app-settings.php"/>
+<entry name="iis_set_dir_security" url="function.iis-set-dir-security.php"/>
+<entry name="iis_set_script_map" url="function.iis-set-script-map.php"/>
+<entry name="iis_set_server_rights" url="function.iis-set-server-rights.php"/>
+<entry name="iis_start_server" url="function.iis-start-server.php"/>
+<entry name="iis_start_service" url="function.iis-start-service.php"/>
+<entry name="iis_stop_server" url="function.iis-stop-server.php"/>
+<entry name="iis_stop_service" url="function.iis-stop-service.php"/>
+<entry name="nsapi_request_headers" url="function.nsapi-request-headers.php"/>
+<entry name="nsapi_response_headers" url="function.nsapi-response-headers.php"/>
+<entry name="nsapi_virtual" url="function.nsapi-virtual.php"/>
+<entry name="msession_connect" url="function.msession-connect.php"/>
+<entry name="msession_count" url="function.msession-count.php"/>
+<entry name="msession_create" url="function.msession-create.php"/>
+<entry name="msession_destroy" url="function.msession-destroy.php"/>
+<entry name="msession_disconnect" url="function.msession-disconnect.php"/>
+<entry name="msession_find" url="function.msession-find.php"/>
+<entry name="msession_get_array" url="function.msession-get-array.php"/>
+<entry name="msession_get_data" url="function.msession-get-data.php"/>
+<entry name="msession_get" url="function.msession-get.php"/>
+<entry name="msession_inc" url="function.msession-inc.php"/>
+<entry name="msession_list" url="function.msession-list.php"/>
+<entry name="msession_listvar" url="function.msession-listvar.php"/>
+<entry name="msession_lock" url="function.msession-lock.php"/>
+<entry name="msession_plugin" url="function.msession-plugin.php"/>
+<entry name="msession_randstr" url="function.msession-randstr.php"/>
+<entry name="msession_set_array" url="function.msession-set-array.php"/>
+<entry name="msession_set_data" url="function.msession-set-data.php"/>
+<entry name="msession_set" url="function.msession-set.php"/>
+<entry name="msession_timeout" url="function.msession-timeout.php"/>
+<entry name="msession_uniq" url="function.msession-uniq.php"/>
+<entry name="msession_unlock" url="function.msession-unlock.php"/>
+<entry name="session_cache_expire" url="function.session-cache-expire.php"/>
+<entry name="session_cache_limiter" url="function.session-cache-limiter.php"/>
+<entry name="session_commit" url="function.session-commit.php"/>
+<entry name="session_decode" url="function.session-decode.php"/>
+<entry name="session_destroy" url="function.session-destroy.php"/>
+<entry name="session_encode" url="function.session-encode.php"/>
+<entry name="session_get_cookie_params" url="function.session-get-cookie-params.php"/>
+<entry name="session_id" url="function.session-id.php"/>
+<entry name="session_is_registered" url="function.session-is-registered.php"/>
+<entry name="session_module_name" url="function.session-module-name.php"/>
+<entry name="session_name" url="function.session-name.php"/>
+<entry name="session_regenerate_id" url="function.session-regenerate-id.php"/>
+<entry name="session_register" url="function.session-register.php"/>
+<entry name="session_save_path" url="function.session-save-path.php"/>
+<entry name="session_set_cookie_params" url="function.session-set-cookie-params.php"/>
+<entry name="session_set_save_handler" url="function.session-set-save-handler.php"/>
+<entry name="session_start" url="function.session-start.php"/>
+<entry name="session_unregister" url="function.session-unregister.php"/>
+<entry name="session_unset" url="function.session-unset.php"/>
+<entry name="session_write_close" url="function.session-write-close.php"/>
+<entry name="session_pgsql_add_error" url="function.session-pgsql-add-error.php"/>
+<entry name="session_pgsql_get_error" url="function.session-pgsql-get-error.php"/>
+<entry name="session_pgsql_get_field" url="function.session-pgsql-get-field.php"/>
+<entry name="session_pgsql_reset" url="function.session-pgsql-reset.php"/>
+<entry name="session_pgsql_set_field" url="function.session-pgsql-set-field.php"/>
+<entry name="session_pgsql_status" url="function.session-pgsql-status.php"/>
+<entry name="bbcode_add_element" url="function.bbcode-add-element.php"/>
+<entry name="bbcode_add_smiley" url="function.bbcode-add-smiley.php"/>
+<entry name="bbcode_create" url="function.bbcode-create.php"/>
+<entry name="bbcode_destroy" url="function.bbcode-destroy.php"/>
+<entry name="bbcode_parse" url="function.bbcode-parse.php"/>
+<entry name="bbcode_set_arg_parser" url="function.bbcode-set-arg-parser.php"/>
+<entry name="bbcode_set_flags" url="function.bbcode-set-flags.php"/>
+<entry name="preg_grep" url="function.preg-grep.php"/>
+<entry name="preg_last_error" url="function.preg-last-error.php"/>
+<entry name="preg_match_all" url="function.preg-match-all.php"/>
+<entry name="preg_match" url="function.preg-match.php"/>
+<entry name="preg_quote" url="function.preg-quote.php"/>
+<entry name="preg_replace_callback" url="function.preg-replace-callback.php"/>
+<entry name="preg_replace" url="function.preg-replace.php"/>
+<entry name="preg_split" url="function.preg-split.php"/>
+<entry name="ereg_replace" url="function.ereg-replace.php"/>
+<entry name="ereg" url="function.ereg.php"/>
+<entry name="eregi_replace" url="function.eregi-replace.php"/>
+<entry name="eregi" url="function.eregi.php"/>
+<entry name="split" url="function.split.php"/>
+<entry name="spliti" url="function.spliti.php"/>
+<entry name="sql_regcase" url="function.sql-regcase.php"/>
+<entry name="addcslashes" url="function.addcslashes.php"/>
+<entry name="addslashes" url="function.addslashes.php"/>
+<entry name="bin2hex" url="function.bin2hex.php"/>
+<entry name="chop" url="function.chop.php"/>
+<entry name="chr" url="function.chr.php"/>
+<entry name="chunk_split" url="function.chunk-split.php"/>
+<entry name="convert_cyr_string" url="function.convert-cyr-string.php"/>
+<entry name="convert_uudecode" url="function.convert-uudecode.php"/>
+<entry name="convert_uuencode" url="function.convert-uuencode.php"/>
+<entry name="count_chars" url="function.count-chars.php"/>
+<entry name="crc32" url="function.crc32.php"/>
+<entry name="crypt" url="function.crypt.php"/>
+<entry name="echo" url="function.echo.php"/>
+<entry name="explode" url="function.explode.php"/>
+<entry name="fprintf" url="function.fprintf.php"/>
+<entry name="get_html_translation_table" url="function.get-html-translation-table.php"/>
+<entry name="hebrev" url="function.hebrev.php"/>
+<entry name="hebrevc" url="function.hebrevc.php"/>
+<entry name="html_entity_decode" url="function.html-entity-decode.php"/>
+<entry name="htmlentities" url="function.htmlentities.php"/>
+<entry name="htmlspecialchars_decode" url="function.htmlspecialchars-decode.php"/>
+<entry name="htmlspecialchars" url="function.htmlspecialchars.php"/>
+<entry name="implode" url="function.implode.php"/>
+<entry name="join" url="function.join.php"/>
+<entry name="lcfirst" url="function.lcfirst.php"/>
+<entry name="levenshtein" url="function.levenshtein.php"/>
+<entry name="localeconv" url="function.localeconv.php"/>
+<entry name="ltrim" url="function.ltrim.php"/>
+<entry name="md5_file" url="function.md5-file.php"/>
+<entry name="md5" url="function.md5.php"/>
+<entry name="metaphone" url="function.metaphone.php"/>
+<entry name="money_format" url="function.money-format.php"/>
+<entry name="nl_langinfo" url="function.nl-langinfo.php"/>
+<entry name="nl2br" url="function.nl2br.php"/>
+<entry name="number_format" url="function.number-format.php"/>
+<entry name="ord" url="function.ord.php"/>
+<entry name="parse_str" url="function.parse-str.php"/>
+<entry name="print" url="function.print.php"/>
+<entry name="printf" url="function.printf.php"/>
+<entry name="quoted_printable_decode" url="function.quoted-printable-decode.php"/>
+<entry name="quotemeta" url="function.quotemeta.php"/>
+<entry name="rtrim" url="function.rtrim.php"/>
+<entry name="setlocale" url="function.setlocale.php"/>
+<entry name="sha1_file" url="function.sha1-file.php"/>
+<entry name="sha1" url="function.sha1.php"/>
+<entry name="similar_text" url="function.similar-text.php"/>
+<entry name="soundex" url="function.soundex.php"/>
+<entry name="sprintf" url="function.sprintf.php"/>
+<entry name="sscanf" url="function.sscanf.php"/>
+<entry name="str_getcsv" url="function.str-getcsv.php"/>
+<entry name="str_ireplace" url="function.str-ireplace.php"/>
+<entry name="str_pad" url="function.str-pad.php"/>
+<entry name="str_repeat" url="function.str-repeat.php"/>
+<entry name="str_replace" url="function.str-replace.php"/>
+<entry name="str_rot13" url="function.str-rot13.php"/>
+<entry name="str_shuffle" url="function.str-shuffle.php"/>
+<entry name="str_split" url="function.str-split.php"/>
+<entry name="str_word_count" url="function.str-word-count.php"/>
+<entry name="strcasecmp" url="function.strcasecmp.php"/>
+<entry name="strchr" url="function.strchr.php"/>
+<entry name="strcmp" url="function.strcmp.php"/>
+<entry name="strcoll" url="function.strcoll.php"/>
+<entry name="strcspn" url="function.strcspn.php"/>
+<entry name="strip_tags" url="function.strip-tags.php"/>
+<entry name="stripcslashes" url="function.stripcslashes.php"/>
+<entry name="stripos" url="function.stripos.php"/>
+<entry name="stripslashes" url="function.stripslashes.php"/>
+<entry name="stristr" url="function.stristr.php"/>
+<entry name="strlen" url="function.strlen.php"/>
+<entry name="strnatcasecmp" url="function.strnatcasecmp.php"/>
+<entry name="strnatcmp" url="function.strnatcmp.php"/>
+<entry name="strncasecmp" url="function.strncasecmp.php"/>
+<entry name="strncmp" url="function.strncmp.php"/>
+<entry name="strpbrk" url="function.strpbrk.php"/>
+<entry name="strpos" url="function.strpos.php"/>
+<entry name="strrchr" url="function.strrchr.php"/>
+<entry name="strrev" url="function.strrev.php"/>
+<entry name="strripos" url="function.strripos.php"/>
+<entry name="strrpos" url="function.strrpos.php"/>
+<entry name="strspn" url="function.strspn.php"/>
+<entry name="strstr" url="function.strstr.php"/>
+<entry name="strtok" url="function.strtok.php"/>
+<entry name="strtolower" url="function.strtolower.php"/>
+<entry name="strtoupper" url="function.strtoupper.php"/>
+<entry name="strtr" url="function.strtr.php"/>
+<entry name="substr_compare" url="function.substr-compare.php"/>
+<entry name="substr_count" url="function.substr-count.php"/>
+<entry name="substr_replace" url="function.substr-replace.php"/>
+<entry name="substr" url="function.substr.php"/>
+<entry name="trim" url="function.trim.php"/>
+<entry name="ucfirst" url="function.ucfirst.php"/>
+<entry name="ucwords" url="function.ucwords.php"/>
+<entry name="vfprintf" url="function.vfprintf.php"/>
+<entry name="vprintf" url="function.vprintf.php"/>
+<entry name="vsprintf" url="function.vsprintf.php"/>
+<entry name="wordwrap" url="function.wordwrap.php"/>
+<entry name="array_change_key_case" url="function.array-change-key-case.php"/>
+<entry name="array_chunk" url="function.array-chunk.php"/>
+<entry name="array_combine" url="function.array-combine.php"/>
+<entry name="array_count_values" url="function.array-count-values.php"/>
+<entry name="array_diff_assoc" url="function.array-diff-assoc.php"/>
+<entry name="array_diff_key" url="function.array-diff-key.php"/>
+<entry name="array_diff_uassoc" url="function.array-diff-uassoc.php"/>
+<entry name="array_diff_ukey" url="function.array-diff-ukey.php"/>
+<entry name="array_diff" url="function.array-diff.php"/>
+<entry name="array_fill_keys" url="function.array-fill-keys.php"/>
+<entry name="array_fill" url="function.array-fill.php"/>
+<entry name="array_filter" url="function.array-filter.php"/>
+<entry name="array_flip" url="function.array-flip.php"/>
+<entry name="array_intersect_assoc" url="function.array-intersect-assoc.php"/>
+<entry name="array_intersect_key" url="function.array-intersect-key.php"/>
+<entry name="array_intersect_uassoc" url="function.array-intersect-uassoc.php"/>
+<entry name="array_intersect_ukey" url="function.array-intersect-ukey.php"/>
+<entry name="array_intersect" url="function.array-intersect.php"/>
+<entry name="array_key_exists" url="function.array-key-exists.php"/>
+<entry name="array_keys" url="function.array-keys.php"/>
+<entry name="array_map" url="function.array-map.php"/>
+<entry name="array_merge_recursive" url="function.array-merge-recursive.php"/>
+<entry name="array_merge" url="function.array-merge.php"/>
+<entry name="array_multisort" url="function.array-multisort.php"/>
+<entry name="array_pad" url="function.array-pad.php"/>
+<entry name="array_pop" url="function.array-pop.php"/>
+<entry name="array_product" url="function.array-product.php"/>
+<entry name="array_push" url="function.array-push.php"/>
+<entry name="array_rand" url="function.array-rand.php"/>
+<entry name="array_reduce" url="function.array-reduce.php"/>
+<entry name="array_reverse" url="function.array-reverse.php"/>
+<entry name="array_search" url="function.array-search.php"/>
+<entry name="array_shift" url="function.array-shift.php"/>
+<entry name="array_slice" url="function.array-slice.php"/>
+<entry name="array_splice" url="function.array-splice.php"/>
+<entry name="array_sum" url="function.array-sum.php"/>
+<entry name="array_udiff_assoc" url="function.array-udiff-assoc.php"/>
+<entry name="array_udiff_uassoc" url="function.array-udiff-uassoc.php"/>
+<entry name="array_udiff" url="function.array-udiff.php"/>
+<entry name="array_uintersect_assoc" url="function.array-uintersect-assoc.php"/>
+<entry name="array_uintersect_uassoc" url="function.array-uintersect-uassoc.php"/>
+<entry name="array_uintersect" url="function.array-uintersect.php"/>
+<entry name="array_unique" url="function.array-unique.php"/>
+<entry name="array_unshift" url="function.array-unshift.php"/>
+<entry name="array_values" url="function.array-values.php"/>
+<entry name="array_walk_recursive" url="function.array-walk-recursive.php"/>
+<entry name="array_walk" url="function.array-walk.php"/>
+<entry name="array" url="function.array.php"/>
+<entry name="arsort" url="function.arsort.php"/>
+<entry name="asort" url="function.asort.php"/>
+<entry name="compact" url="function.compact.php"/>
+<entry name="count" url="function.count.php"/>
+<entry name="current" url="function.current.php"/>
+<entry name="each" url="function.each.php"/>
+<entry name="end" url="function.end.php"/>
+<entry name="extract" url="function.extract.php"/>
+<entry name="in_array" url="function.in-array.php"/>
+<entry name="key" url="function.key.php"/>
+<entry name="krsort" url="function.krsort.php"/>
+<entry name="ksort" url="function.ksort.php"/>
+<entry name="list" url="function.list.php"/>
+<entry name="natcasesort" url="function.natcasesort.php"/>
+<entry name="natsort" url="function.natsort.php"/>
+<entry name="next" url="function.next.php"/>
+<entry name="pos" url="function.pos.php"/>
+<entry name="prev" url="function.prev.php"/>
+<entry name="range" url="function.range.php"/>
+<entry name="reset" url="function.reset.php"/>
+<entry name="rsort" url="function.rsort.php"/>
+<entry name="shuffle" url="function.shuffle.php"/>
+<entry name="sizeof" url="function.sizeof.php"/>
+<entry name="sort" url="function.sort.php"/>
+<entry name="uasort" url="function.uasort.php"/>
+<entry name="uksort" url="function.uksort.php"/>
+<entry name="usort" url="function.usort.php"/>
+<entry name="call_user_method_array" url="function.call-user-method-array.php"/>
+<entry name="call_user_method" url="function.call-user-method.php"/>
+<entry name="class_exists" url="function.class-exists.php"/>
+<entry name="get_class_methods" url="function.get-class-methods.php"/>
+<entry name="get_class_vars" url="function.get-class-vars.php"/>
+<entry name="get_class" url="function.get-class.php"/>
+<entry name="get_declared_classes" url="function.get-declared-classes.php"/>
+<entry name="get_declared_interfaces" url="function.get-declared-interfaces.php"/>
+<entry name="get_object_vars" url="function.get-object-vars.php"/>
+<entry name="get_parent_class" url="function.get-parent-class.php"/>
+<entry name="interface_exists" url="function.interface-exists.php"/>
+<entry name="is_a" url="function.is-a.php"/>
+<entry name="is_subclass_of" url="function.is-subclass-of.php"/>
+<entry name="method_exists" url="function.method-exists.php"/>
+<entry name="property_exists" url="function.property-exists.php"/>
+<entry name="classkit_import" url="function.classkit-import.php"/>
+<entry name="classkit_method_add" url="function.classkit-method-add.php"/>
+<entry name="classkit_method_copy" url="function.classkit-method-copy.php"/>
+<entry name="classkit_method_redefine" url="function.classkit-method-redefine.php"/>
+<entry name="classkit_method_remove" url="function.classkit-method-remove.php"/>
+<entry name="classkit_method_rename" url="function.classkit-method-rename.php"/>
+<entry name="ctype_alnum" url="function.ctype-alnum.php"/>
+<entry name="ctype_alpha" url="function.ctype-alpha.php"/>
+<entry name="ctype_cntrl" url="function.ctype-cntrl.php"/>
+<entry name="ctype_digit" url="function.ctype-digit.php"/>
+<entry name="ctype_graph" url="function.ctype-graph.php"/>
+<entry name="ctype_lower" url="function.ctype-lower.php"/>
+<entry name="ctype_print" url="function.ctype-print.php"/>
+<entry name="ctype_punct" url="function.ctype-punct.php"/>
+<entry name="ctype_space" url="function.ctype-space.php"/>
+<entry name="ctype_upper" url="function.ctype-upper.php"/>
+<entry name="ctype_xdigit" url="function.ctype-xdigit.php"/>
+<entry name="filter_has_var" url="function.filter-has-var.php"/>
+<entry name="filter_id" url="function.filter-id.php"/>
+<entry name="filter_input_array" url="function.filter-input-array.php"/>
+<entry name="filter_input" url="function.filter-input.php"/>
+<entry name="filter_list" url="function.filter-list.php"/>
+<entry name="filter_var_array" url="function.filter-var-array.php"/>
+<entry name="filter_var" url="function.filter-var.php"/>
+<entry name="call_user_func_array" url="function.call-user-func-array.php"/>
+<entry name="call_user_func" url="function.call-user-func.php"/>
+<entry name="create_function" url="function.create-function.php"/>
+<entry name="func_get_arg" url="function.func-get-arg.php"/>
+<entry name="func_get_args" url="function.func-get-args.php"/>
+<entry name="func_num_args" url="function.func-num-args.php"/>
+<entry name="function_exists" url="function.function-exists.php"/>
+<entry name="get_defined_functions" url="function.get-defined-functions.php"/>
+<entry name="register_shutdown_function" url="function.register-shutdown-function.php"/>
+<entry name="register_tick_function" url="function.register-tick-function.php"/>
+<entry name="unregister_tick_function" url="function.unregister-tick-function.php"/>
+<entry name="aggregate_info" url="function.aggregate-info.php"/>
+<entry name="aggregate_methods_by_list" url="function.aggregate-methods-by-list.php"/>
+<entry name="aggregate_methods_by_regexp" url="function.aggregate-methods-by-regexp.php"/>
+<entry name="aggregate_methods" url="function.aggregate-methods.php"/>
+<entry name="aggregate_properties_by_list" url="function.aggregate-properties-by-list.php"/>
+<entry name="aggregate_properties_by_regexp" url="function.aggregate-properties-by-regexp.php"/>
+<entry name="aggregate_properties" url="function.aggregate-properties.php"/>
+<entry name="aggregate" url="function.aggregate.php"/>
+<entry name="aggregation_info" url="function.aggregation-info.php"/>
+<entry name="deaggregate" url="function.deaggregate.php"/>
+<entry name="debug_zval_dump" url="function.debug-zval-dump.php"/>
+<entry name="doubleval" url="function.doubleval.php"/>
+<entry name="empty" url="function.empty.php"/>
+<entry name="floatval" url="function.floatval.php"/>
+<entry name="get_defined_vars" url="function.get-defined-vars.php"/>
+<entry name="get_resource_type" url="function.get-resource-type.php"/>
+<entry name="gettype" url="function.gettype.php"/>
+<entry name="import_request_variables" url="function.import-request-variables.php"/>
+<entry name="intval" url="function.intval.php"/>
+<entry name="is_array" url="function.is-array.php"/>
+<entry name="is_binary" url="function.is-binary.php"/>
+<entry name="is_bool" url="function.is-bool.php"/>
+<entry name="is_buffer" url="function.is-buffer.php"/>
+<entry name="is_callable" url="function.is-callable.php"/>
+<entry name="is_double" url="function.is-double.php"/>
+<entry name="is_float" url="function.is-float.php"/>
+<entry name="is_int" url="function.is-int.php"/>
+<entry name="is_integer" url="function.is-integer.php"/>
+<entry name="is_long" url="function.is-long.php"/>
+<entry name="is_null" url="function.is-null.php"/>
+<entry name="is_numeric" url="function.is-numeric.php"/>
+<entry name="is_object" url="function.is-object.php"/>
+<entry name="is_real" url="function.is-real.php"/>
+<entry name="is_resource" url="function.is-resource.php"/>
+<entry name="is_scalar" url="function.is-scalar.php"/>
+<entry name="is_string" url="function.is-string.php"/>
+<entry name="is_unicode" url="function.is-unicode.php"/>
+<entry name="isset" url="function.isset.php"/>
+<entry name="print_r" url="function.print-r.php"/>
+<entry name="serialize" url="function.serialize.php"/>
+<entry name="settype" url="function.settype.php"/>
+<entry name="strval" url="function.strval.php"/>
+<entry name="unserialize" url="function.unserialize.php"/>
+<entry name="unset" url="function.unset.php"/>
+<entry name="var_dump" url="function.var-dump.php"/>
+<entry name="var_export" url="function.var-export.php"/>
+<entry name="is_soap_fault" url="function.is-soap-fault.php"/>
+<entry name="SoapClient->__call()" url="function.soap-soapclient-call.php"/>
+<entry name="SoapClient->__construct()" url="function.soap-soapclient-construct.php"/>
+<entry name="SoapClient->__doRequest()" url="function.soap-soapclient-dorequest.php"/>
+<entry name="SoapClient->__getFunctions()" url="function.soap-soapclient-getfunctions.php"/>
+<entry name="SoapClient->__getLastRequest()" url="function.soap-soapclient-getlastrequest.php"/>
+<entry name="SoapClient->__getLastRequestHeaders()" url="function.soap-soapclient-getlastrequestheaders.php"/>
+<entry name="SoapClient->__getLastResponse()" url="function.soap-soapclient-getlastresponse.php"/>
+<entry name="SoapClient->__getLastResponseHeaders()" url="function.soap-soapclient-getlastresponseheaders.php"/>
+<entry name="SoapClient->__getTypes()" url="function.soap-soapclient-gettypes.php"/>
+<entry name="SoapClient->__setCookie()" url="function.soap-soapclient-setcookie.php"/>
+<entry name="SoapClient->__soapCall()" url="function.soap-soapclient-soapcall.php"/>
+<entry name="SoapFault->__construct()" url="function.soap-soapfault-construct.php"/>
+<entry name="SoapHeader->__construct()" url="function.soap-soapheader-construct.php"/>
+<entry name="SoapParam->__construct()" url="function.soap-soapparam-construct.php"/>
+<entry name="SoapServer->addFunction()" url="function.soap-soapserver-addfunction.php"/>
+<entry name="SoapServer->__construct()" url="function.soap-soapserver-construct.php"/>
+<entry name="SoapServer->fault()" url="function.soap-soapserver-fault.php"/>
+<entry name="SoapServer->getFunctions()" url="function.soap-soapserver-getfunctions.php"/>
+<entry name="SoapServer->handle()" url="function.soap-soapserver-handle.php"/>
+<entry name="SoapServer->setClass()" url="function.soap-soapserver-setclass.php"/>
+<entry name="SoapServer->setPersistence()" url="function.soap-soapserver-setpersistence.php"/>
+<entry name="SoapVar->__construct()" url="function.soap-soapvar-construct.php"/>
+<entry name="use_soap_error_handler" url="function.use-soap-error-handler.php"/>
+<entry name="xmlrpc_decode_request" url="function.xmlrpc-decode-request.php"/>
+<entry name="xmlrpc_decode" url="function.xmlrpc-decode.php"/>
+<entry name="xmlrpc_encode_request" url="function.xmlrpc-encode-request.php"/>
+<entry name="xmlrpc_encode" url="function.xmlrpc-encode.php"/>
+<entry name="xmlrpc_get_type" url="function.xmlrpc-get-type.php"/>
+<entry name="xmlrpc_is_fault" url="function.xmlrpc-is-fault.php"/>
+<entry name="xmlrpc_parse_method_descriptions" url="function.xmlrpc-parse-method-descriptions.php"/>
+<entry name="xmlrpc_server_add_introspection_data" url="function.xmlrpc-server-add-introspection-data.php"/>
+<entry name="xmlrpc_server_call_method" url="function.xmlrpc-server-call-method.php"/>
+<entry name="xmlrpc_server_create" url="function.xmlrpc-server-create.php"/>
+<entry name="xmlrpc_server_destroy" url="function.xmlrpc-server-destroy.php"/>
+<entry name="xmlrpc_server_register_introspection_callback" url="function.xmlrpc-server-register-introspection-callback.php"/>
+<entry name="xmlrpc_server_register_method" url="function.xmlrpc-server-register-method.php"/>
+<entry name="xmlrpc_set_type" url="function.xmlrpc-set-type.php"/>
+<entry name="dotnet_load" url="function.dotnet-load.php"/>
+<entry name="COM" url="class.com.php"/>
+<entry name="DOTNET" url="class.dotnet.php"/>
+<entry name="VARIANT" url="class.variant.php"/>
+<entry name="com_addref" url="function.com-addref.php"/>
+<entry name="com_create_guid" url="function.com-create-guid.php"/>
+<entry name="com_event_sink" url="function.com-event-sink.php"/>
+<entry name="com_get_active_object" url="function.com-get-active-object.php"/>
+<entry name="com_get" url="function.com-get.php"/>
+<entry name="com_invoke" url="function.com-invoke.php"/>
+<entry name="com_isenum" url="function.com-isenum.php"/>
+<entry name="com_load_typelib" url="function.com-load-typelib.php"/>
+<entry name="com_load" url="function.com-load.php"/>
+<entry name="com_message_pump" url="function.com-message-pump.php"/>
+<entry name="com_print_typeinfo" url="function.com-print-typeinfo.php"/>
+<entry name="com_propget" url="function.com-propget.php"/>
+<entry name="com_propput" url="function.com-propput.php"/>
+<entry name="com_propset" url="function.com-propset.php"/>
+<entry name="com_release" url="function.com-release.php"/>
+<entry name="com_set" url="function.com-set.php"/>
+<entry name="variant_abs" url="function.variant-abs.php"/>
+<entry name="variant_add" url="function.variant-add.php"/>
+<entry name="variant_and" url="function.variant-and.php"/>
+<entry name="variant_cast" url="function.variant-cast.php"/>
+<entry name="variant_cat" url="function.variant-cat.php"/>
+<entry name="variant_cmp" url="function.variant-cmp.php"/>
+<entry name="variant_date_from_timestamp" url="function.variant-date-from-timestamp.php"/>
+<entry name="variant_date_to_timestamp" url="function.variant-date-to-timestamp.php"/>
+<entry name="variant_div" url="function.variant-div.php"/>
+<entry name="variant_eqv" url="function.variant-eqv.php"/>
+<entry name="variant_fix" url="function.variant-fix.php"/>
+<entry name="variant_get_type" url="function.variant-get-type.php"/>
+<entry name="variant_idiv" url="function.variant-idiv.php"/>
+<entry name="variant_imp" url="function.variant-imp.php"/>
+<entry name="variant_int" url="function.variant-int.php"/>
+<entry name="variant_mod" url="function.variant-mod.php"/>
+<entry name="variant_mul" url="function.variant-mul.php"/>
+<entry name="variant_neg" url="function.variant-neg.php"/>
+<entry name="variant_not" url="function.variant-not.php"/>
+<entry name="variant_or" url="function.variant-or.php"/>
+<entry name="variant_pow" url="function.variant-pow.php"/>
+<entry name="variant_round" url="function.variant-round.php"/>
+<entry name="variant_set_type" url="function.variant-set-type.php"/>
+<entry name="variant_set" url="function.variant-set.php"/>
+<entry name="variant_sub" url="function.variant-sub.php"/>
+<entry name="variant_xor" url="function.variant-xor.php"/>
+<entry name="printer_abort" url="function.printer-abort.php"/>
+<entry name="printer_close" url="function.printer-close.php"/>
+<entry name="printer_create_brush" url="function.printer-create-brush.php"/>
+<entry name="printer_create_dc" url="function.printer-create-dc.php"/>
+<entry name="printer_create_font" url="function.printer-create-font.php"/>
+<entry name="printer_create_pen" url="function.printer-create-pen.php"/>
+<entry name="printer_delete_brush" url="function.printer-delete-brush.php"/>
+<entry name="printer_delete_dc" url="function.printer-delete-dc.php"/>
+<entry name="printer_delete_font" url="function.printer-delete-font.php"/>
+<entry name="printer_delete_pen" url="function.printer-delete-pen.php"/>
+<entry name="printer_draw_bmp" url="function.printer-draw-bmp.php"/>
+<entry name="printer_draw_chord" url="function.printer-draw-chord.php"/>
+<entry name="printer_draw_elipse" url="function.printer-draw-elipse.php"/>
+<entry name="printer_draw_line" url="function.printer-draw-line.php"/>
+<entry name="printer_draw_pie" url="function.printer-draw-pie.php"/>
+<entry name="printer_draw_rectangle" url="function.printer-draw-rectangle.php"/>
+<entry name="printer_draw_roundrect" url="function.printer-draw-roundrect.php"/>
+<entry name="printer_draw_text" url="function.printer-draw-text.php"/>
+<entry name="printer_end_doc" url="function.printer-end-doc.php"/>
+<entry name="printer_end_page" url="function.printer-end-page.php"/>
+<entry name="printer_get_option" url="function.printer-get-option.php"/>
+<entry name="printer_list" url="function.printer-list.php"/>
+<entry name="printer_logical_fontheight" url="function.printer-logical-fontheight.php"/>
+<entry name="printer_open" url="function.printer-open.php"/>
+<entry name="printer_select_brush" url="function.printer-select-brush.php"/>
+<entry name="printer_select_font" url="function.printer-select-font.php"/>
+<entry name="printer_select_pen" url="function.printer-select-pen.php"/>
+<entry name="printer_set_option" url="function.printer-set-option.php"/>
+<entry name="printer_start_doc" url="function.printer-start-doc.php"/>
+<entry name="printer_start_page" url="function.printer-start-page.php"/>
+<entry name="printer_write" url="function.printer-write.php"/>
+<entry name="w32api_deftype" url="function.w32api-deftype.php"/>
+<entry name="w32api_init_dtype" url="function.w32api-init-dtype.php"/>
+<entry name="w32api_invoke_function" url="function.w32api-invoke-function.php"/>
+<entry name="w32api_register_function" url="function.w32api-register-function.php"/>
+<entry name="w32api_set_call_method" url="function.w32api-set-call-method.php"/>
+<entry name="win32_ps_list_procs" url="function.win32-ps-list-procs.php"/>
+<entry name="win32_ps_stat_mem" url="function.win32-ps-stat-mem.php"/>
+<entry name="win32_ps_stat_proc" url="function.win32-ps-stat-proc.php"/>
+<entry name="win32_create_service" url="function.win32-create-service.php"/>
+<entry name="win32_delete_service" url="function.win32-delete-service.php"/>
+<entry name="win32_get_last_control_message" url="function.win32-get-last-control-message.php"/>
+<entry name="win32_query_service_status" url="function.win32-query-service-status.php"/>
+<entry name="win32_set_service_status" url="function.win32-set-service-status.php"/>
+<entry name="win32_start_service_ctrl_dispatcher" url="function.win32-start-service-ctrl-dispatcher.php"/>
+<entry name="win32_start_service" url="function.win32-start-service.php"/>
+<entry name="win32_stop_service" url="function.win32-stop-service.php"/>
+<entry name="DOMAttr::__construct" url="domattr.construct.php"/>
+<entry name="DOMAttr::isId" url="domattr.isid.php"/>
+<entry name="DOMCharacterData::appendData" url="domcharacterdata.appenddata.php"/>
+<entry name="DOMCharacterData::deleteData" url="domcharacterdata.deletedata.php"/>
+<entry name="DOMCharacterData::insertData" url="domcharacterdata.insertdata.php"/>
+<entry name="DOMCharacterData::replaceData" url="domcharacterdata.replacedata.php"/>
+<entry name="DOMCharacterData::substringData" url="domcharacterdata.substringdata.php"/>
+<entry name="DOMComment::__construct" url="domcomment.construct.php"/>
+<entry name="DOMDocument::__construct" url="domdocument.construct.php"/>
+<entry name="DOMDocument::createAttribute" url="domdocument.createattribute.php"/>
+<entry name="DOMDocument::createAttributeNS" url="domdocument.createattributens.php"/>
+<entry name="DOMDocument::createCDATASection" url="domdocument.createcdatasection.php"/>
+<entry name="DOMDocument::createComment" url="domdocument.createcomment.php"/>
+<entry name="DOMDocument::createDocumentFragment" url="domdocument.createdocumentfragment.php"/>
+<entry name="DOMDocument::createElement" url="domdocument.createelement.php"/>
+<entry name="DOMDocument::createElementNS" url="domdocument.createelementns.php"/>
+<entry name="DOMDocument::createEntityReference" url="domdocument.createentityreference.php"/>
+<entry name="DOMDocument::createProcessingInstruction" url="domdocument.createprocessinginstruction.php"/>
+<entry name="DOMDocument::createTextNode" url="domdocument.createtextnode.php"/>
+<entry name="DOMDocument::getElementById" url="domdocument.getelementbyid.php"/>
+<entry name="DOMDocument::getElementsByTagName" url="domdocument.getelementsbytagname.php"/>
+<entry name="DOMDocument::getElementsByTagNameNS" url="domdocument.getelementsbytagnamens.php"/>
+<entry name="DOMDocument::importNode" url="domdocument.importnode.php"/>
+<entry name="DOMDocument::load" url="domdocument.load.php"/>
+<entry name="DOMDocument::loadHTML" url="domdocument.loadhtml.php"/>
+<entry name="DOMDocument::loadHTMLFile" url="domdocument.loadhtmlfile.php"/>
+<entry name="DOMDocument::loadXML" url="domdocument.loadxml.php"/>
+<entry name="DOMDocument::normalizeDocument" url="domdocument.normalizedocument.php"/>
+<entry name="DOMDocument::registerNodeClass" url="domdocument.registernodeclass.php"/>
+<entry name="DOMDocument::relaxNGValidate" url="domdocument.relaxngvalidate.php"/>
+<entry name="DOMDocument::relaxNGValidateSource" url="domdocument.relaxngvalidatesource.php"/>
+<entry name="DOMDocument::save" url="domdocument.save.php"/>
+<entry name="DOMDocument::saveHTML" url="domdocument.savehtml.php"/>
+<entry name="DOMDocument::saveHTMLFile" url="domdocument.savehtmlfile.php"/>
+<entry name="DOMDocument::saveXML" url="domdocument.savexml.php"/>
+<entry name="DOMDocument::schemaValidate" url="domdocument.schemavalidate.php"/>
+<entry name="DOMDocument::schemaValidateSource" url="domdocument.schemavalidatesource.php"/>
+<entry name="DOMDocument::validate" url="domdocument.validate.php"/>
+<entry name="DOMDocument::xinclude" url="domdocument.xinclude.php"/>
+<entry name="DOMDocumentFragment::appendXML" url="domdocumentfragment.appendxml.php"/>
+<entry name="DOMElement::__construct" url="domelement.construct.php"/>
+<entry name="DOMElement::getAttribute" url="domelement.getattribute.php"/>
+<entry name="DOMElement::getAttributeNode" url="domelement.getattributenode.php"/>
+<entry name="DOMElement::getAttributeNodeNS" url="domelement.getattributenodens.php"/>
+<entry name="DOMElement::getAttributeNS" url="domelement.getattributens.php"/>
+<entry name="DOMElement::getElementsByTagName" url="domelement.getelementsbytagname.php"/>
+<entry name="DOMElement::getElementsByTagNameNS" url="domelement.getelementsbytagnamens.php"/>
+<entry name="DOMElement::hasAttribute" url="domelement.hasattribute.php"/>
+<entry name="DOMElement::hasAttributeNS" url="domelement.hasattributens.php"/>
+<entry name="DOMElement::removeAttribute" url="domelement.removeattribute.php"/>
+<entry name="DOMElement::removeAttributeNode" url="domelement.removeattributenode.php"/>
+<entry name="DOMElement::removeAttributeNS" url="domelement.removeattributens.php"/>
+<entry name="DOMElement::setAttribute" url="domelement.setattribute.php"/>
+<entry name="DOMElement::setAttributeNode" url="domelement.setattributenode.php"/>
+<entry name="DOMElement::setAttributeNodeNS" url="domelement.setattributenodens.php"/>
+<entry name="DOMElement::setAttributeNS" url="domelement.setattributens.php"/>
+<entry name="DOMElement::setIdAttribute" url="domelement.setidattribute.php"/>
+<entry name="DOMElement::setIdAttributeNode" url="domelement.setidattributenode.php"/>
+<entry name="DOMElement::setIdAttributeNS" url="domelement.setidattributens.php"/>
+<entry name="DOMEntityReference::__construct" url="domentityreference.construct.php"/>
+<entry name="DOMImplementation::__construct" url="domimplementation.construct.php"/>
+<entry name="DOMImplementation::createDocument" url="domimplementation.createdocument.php"/>
+<entry name="DOMImplementation::createDocumentType" url="domimplementation.createdocumenttype.php"/>
+<entry name="DOMImplementation::hasFeature" url="domimplementation.hasfeature.php"/>
+<entry name="DOMNamedNodeMap::getNamedItem" url="domnamednodemap.getnameditem.php"/>
+<entry name="DOMNamedNodeMap::getNamedItemNS" url="domnamednodemap.getnameditemns.php"/>
+<entry name="DOMNamedNodeMap::item" url="domnamednodemap.item.php"/>
+<entry name="DOMNode::appendChild" url="domnode.appendchild.php"/>
+<entry name="DOMNode::cloneNode" url="domnode.clonenode.php"/>
+<entry name="DOMNode::hasAttributes" url="domnode.hasattributes.php"/>
+<entry name="DOMNode::hasChildNodes" url="domnode.haschildnodes.php"/>
+<entry name="DOMNode::insertBefore" url="domnode.insertbefore.php"/>
+<entry name="DOMNode::isDefaultNamespace" url="domnode.isdefaultnamespace.php"/>
+<entry name="DOMNode::isSameNode" url="domnode.issamenode.php"/>
+<entry name="DOMNode::isSupported" url="domnode.issupported.php"/>
+<entry name="DOMNode::lookupNamespaceURI" url="domnode.lookupnamespaceuri.php"/>
+<entry name="DOMNode::lookupPrefix" url="domnode.lookupprefix.php"/>
+<entry name="DOMNode::normalize" url="domnode.normalize.php"/>
+<entry name="DOMNode::removeChild" url="domnode.removechild.php"/>
+<entry name="DOMNode::replaceChild" url="domnode.replacechild.php"/>
+<entry name="DOMNodelist::item" url="domnodelist.item.php"/>
+<entry name="DOMProcessingInstruction::__construct" url="domprocessinginstruction.construct.php"/>
+<entry name="DOMText::__construct" url="domtext.construct.php"/>
+<entry name="DOMText::isWhitespaceInElementContent" url="domtext.iswhitespaceinelementcontent.php"/>
+<entry name="DOMText::splitText" url="domtext.splittext.php"/>
+<entry name="DOMXPath::__construct" url="domxpath.construct.php"/>
+<entry name="DOMXPath::evaluate" url="domxpath.evaluate.php"/>
+<entry name="DOMXPath::query" url="domxpath.query.php"/>
+<entry name="DOMXPath::registerNamespace" url="domxpath.registernamespace.php"/>
+<entry name="dom_import_simplexml" url="function.dom-import-simplexml.php"/>
+<entry name="DomAttribute->name" url="function.domattribute-name.php"/>
+<entry name="DomAttribute->set_value" url="function.domattribute-set-value.php"/>
+<entry name="DomAttribute->specified" url="function.domattribute-specified.php"/>
+<entry name="DomAttribute->value" url="function.domattribute-value.php"/>
+<entry name="DomDocument->add_root" url="function.domdocument-add-root.php"/>
+<entry name="DomDocument->create_attribute" url="function.domdocument-create-attribute.php"/>
+<entry name="DomDocument->create_cdata_section" url="function.domdocument-create-cdata-section.php"/>
+<entry name="DomDocument->create_comment" url="function.domdocument-create-comment.php"/>
+<entry name="DomDocument->create_element_ns" url="function.domdocument-create-element-ns.php"/>
+<entry name="DomDocument->create_element" url="function.domdocument-create-element.php"/>
+<entry name="DomDocument->create_entity_reference" url="function.domdocument-create-entity-reference.php"/>
+<entry name="DomDocument->create_processing_instruction" url="function.domdocument-create-processing-instruction.php"/>
+<entry name="DomDocument->create_text_node" url="function.domdocument-create-text-node.php"/>
+<entry name="DomDocument->doctype" url="function.domdocument-doctype.php"/>
+<entry name="DomDocument->document_element" url="function.domdocument-document-element.php"/>
+<entry name="DomDocument->dump_file" url="function.domdocument-dump-file.php"/>
+<entry name="DomDocument->dump_mem" url="function.domdocument-dump-mem.php"/>
+<entry name="DomDocument->get_element_by_id" url="function.domdocument-get-element-by-id.php"/>
+<entry name="DomDocument->get_elements_by_tagname" url="function.domdocument-get-elements-by-tagname.php"/>
+<entry name="DomDocument->html_dump_mem" url="function.domdocument-html-dump-mem.php"/>
+<entry name="DomDocument->xinclude" url="function.domdocument-xinclude.php"/>
+<entry name="DomDocumentType->entities()" url="function.domdocumenttype-entities.php"/>
+<entry name="DomDocumentType->internal_subset()" url="function.domdocumenttype-internal-subset.php"/>
+<entry name="DomDocumentType->name()" url="function.domdocumenttype-name.php"/>
+<entry name="DomDocumentType->notations()" url="function.domdocumenttype-notations.php"/>
+<entry name="DomDocumentType->public_id()" url="function.domdocumenttype-public-id.php"/>
+<entry name="DomDocumentType->system_id()" url="function.domdocumenttype-system-id.php"/>
+<entry name="DomElement->get_attribute_node()" url="function.domelement-get-attribute-node.php"/>
+<entry name="DomElement->get_attribute()" url="function.domelement-get-attribute.php"/>
+<entry name="DomElement->get_elements_by_tagname()" url="function.domelement-get-elements-by-tagname.php"/>
+<entry name="DomElement->has_attribute()" url="function.domelement-has-attribute.php"/>
+<entry name="DomElement->remove_attribute()" url="function.domelement-remove-attribute.php"/>
+<entry name="DomElement->set_attribute_node()" url="function.domelement-set-attribute-node.php"/>
+<entry name="DomElement->set_attribute()" url="function.domelement-set-attribute.php"/>
+<entry name="DomElement->tagname()" url="function.domelement-tagname.php"/>
+<entry name="DomNode->add_namespace" url="function.domnode-add-namespace.php"/>
+<entry name="DomNode->append_child" url="function.domnode-append-child.php"/>
+<entry name="DomNode->append_sibling" url="function.domnode-append-sibling.php"/>
+<entry name="DomNode->attributes" url="function.domnode-attributes.php"/>
+<entry name="DomNode->child_nodes" url="function.domnode-child-nodes.php"/>
+<entry name="DomNode->clone_node" url="function.domnode-clone-node.php"/>
+<entry name="DomNode->dump_node" url="function.domnode-dump-node.php"/>
+<entry name="DomNode->first_child" url="function.domnode-first-child.php"/>
+<entry name="DomNode->get_content" url="function.domnode-get-content.php"/>
+<entry name="DomNode->has_attributes" url="function.domnode-has-attributes.php"/>
+<entry name="DomNode->has_child_nodes" url="function.domnode-has-child-nodes.php"/>
+<entry name="DomNode->insert_before" url="function.domnode-insert-before.php"/>
+<entry name="DomNode->is_blank_node" url="function.domnode-is-blank-node.php"/>
+<entry name="DomNode->last_child" url="function.domnode-last-child.php"/>
+<entry name="DomNode->next_sibling" url="function.domnode-next-sibling.php"/>
+<entry name="DomNode->node_name" url="function.domnode-node-name.php"/>
+<entry name="DomNode->node_type" url="function.domnode-node-type.php"/>
+<entry name="DomNode->node_value" url="function.domnode-node-value.php"/>
+<entry name="DomNode->owner_document" url="function.domnode-owner-document.php"/>
+<entry name="DomNode->parent_node" url="function.domnode-parent-node.php"/>
+<entry name="DomNode->prefix" url="function.domnode-prefix.php"/>
+<entry name="DomNode->previous_sibling" url="function.domnode-previous-sibling.php"/>
+<entry name="DomNode->remove_child" url="function.domnode-remove-child.php"/>
+<entry name="DomNode->replace_child" url="function.domnode-replace-child.php"/>
+<entry name="DomNode->replace_node" url="function.domnode-replace-node.php"/>
+<entry name="DomNode->set_content" url="function.domnode-set-content.php"/>
+<entry name="DomNode->set_name" url="function.domnode-set-name.php"/>
+<entry name="DomNode->set_namespace" url="function.domnode-set-namespace.php"/>
+<entry name="DomNode->unlink_node" url="function.domnode-unlink-node.php"/>
+<entry name="DomProcessingInstruction->data" url="function.domprocessinginstruction-data.php"/>
+<entry name="DomProcessingInstruction->target" url="function.domprocessinginstruction-target.php"/>
+<entry name="DomXsltStylesheet->process()" url="function.domxsltstylesheet-process.php"/>
+<entry name="DomXsltStylesheet->result_dump_file()" url="function.domxsltstylesheet-result-dump-file.php"/>
+<entry name="DomXsltStylesheet->result_dump_mem()" url="function.domxsltstylesheet-result-dump-mem.php"/>
+<entry name="domxml_new_doc" url="function.domxml-new-doc.php"/>
+<entry name="domxml_open_file" url="function.domxml-open-file.php"/>
+<entry name="domxml_open_mem" url="function.domxml-open-mem.php"/>
+<entry name="domxml_version" url="function.domxml-version.php"/>
+<entry name="domxml_xmltree" url="function.domxml-xmltree.php"/>
+<entry name="domxml_xslt_stylesheet_doc" url="function.domxml-xslt-stylesheet-doc.php"/>
+<entry name="domxml_xslt_stylesheet_file" url="function.domxml-xslt-stylesheet-file.php"/>
+<entry name="domxml_xslt_stylesheet" url="function.domxml-xslt-stylesheet.php"/>
+<entry name="domxml_xslt_version" url="function.domxml-xslt-version.php"/>
+<entry name="xpath_eval_expression" url="function.xpath-eval-expression.php"/>
+<entry name="xpath_eval" url="function.xpath-eval.php"/>
+<entry name="xpath_new_context" url="function.xpath-new-context.php"/>
+<entry name="xpath_register_ns_auto" url="function.xpath-register-ns-auto.php"/>
+<entry name="xpath_register_ns" url="function.xpath-register-ns.php"/>
+<entry name="xptr_eval" url="function.xptr-eval.php"/>
+<entry name="xptr_new_context" url="function.xptr-new-context.php"/>
+<entry name="libxml_clear_errors" url="function.libxml-clear-errors.php"/>
+<entry name="libxml_get_errors" url="function.libxml-get-errors.php"/>
+<entry name="libxml_get_last_error" url="function.libxml-get-last-error.php"/>
+<entry name="libxml_set_streams_context" url="function.libxml-set-streams-context.php"/>
+<entry name="libxml_use_internal_errors" url="function.libxml-use-internal-errors.php"/>
+<entry name="qdom_error" url="function.qdom-error.php"/>
+<entry name="qdom_tree" url="function.qdom-tree.php"/>
+<entry name="SCA_LocalProxy::createDataObject" url="function.sca-localproxy-createdataobject.php"/>
+<entry name="SCA_SoapProxy::createDataObject" url="function.sca-soapproxy-createdataobject.php"/>
+<entry name="SCA::createDataObject" url="function.sca-createdataobject.php"/>
+<entry name="SCA::getService" url="function.sca-getservice.php"/>
+<entry name="SDO_DAS_XML_Document::getRootDataObject" url="function.sdo-das-xml-document-getrootdataobject.php"/>
+<entry name="SDO_DAS_XML_Document::getRootElementName" url="function.sdo-das-xml-document-getrootelementname.php"/>
+<entry name="SDO_DAS_XML_Document::getRootElementURI" url="function.sdo-das-xml-document-getrootelementuri.php"/>
+<entry name="SDO_DAS_XML_Document::setEncoding" url="function.sdo-das-xml-document-setencoding.php"/>
+<entry name="SDO_DAS_XML_Document::setXMLDeclaration" url="function.sdo-das-xml-document-setxmldeclaration.php"/>
+<entry name="SDO_DAS_XML_Document::setXMLVersion" url="function.sdo-das-xml-document-setxmlversion.php"/>
+<entry name="SDO_DAS_XML::addTypes" url="function.sdo-das-xml-addtypes.php"/>
+<entry name="SDO_DAS_XML::create" url="function.sdo-das-xml-create.php"/>
+<entry name="SDO_DAS_XML::createDataObject" url="function.sdo-das-xml-createdataobject.php"/>
+<entry name="SDO_DAS_XML::createDocument" url="function.sdo-das-xml-createdocument.php"/>
+<entry name="SDO_DAS_XML::loadFile" url="function.sdo-das-xml-loadfile.php"/>
+<entry name="SDO_DAS_XML::loadString" url="function.sdo-das-xml-loadstring.php"/>
+<entry name="SDO_DAS_XML::saveFile" url="function.sdo-das-xml-savefile.php"/>
+<entry name="SDO_DAS_XML::saveString" url="function.sdo-das-xml-savestring.php"/>
+<entry name="SimpleXMLElement->addAttribute()" url="function.simplexml-element-addAttribute.php"/>
+<entry name="SimpleXMLElement->addChild()" url="function.simplexml-element-addChild.php"/>
+<entry name="SimpleXMLElement->asXML()" url="function.simplexml-element-asXML.php"/>
+<entry name="SimpleXMLElement->attributes()" url="function.simplexml-element-attributes.php"/>
+<entry name="SimpleXMLElement->children()" url="function.simplexml-element-children.php"/>
+<entry name="SimpleXMLElement->__construct()" url="function.simplexml-element-construct.php"/>
+<entry name="SimpleXMLElement->getDocNamespaces()" url="function.simplexml-element-getDocNamespaces.php"/>
+<entry name="SimpleXMLElement->getName()" url="function.simplexml-element-getName.php"/>
+<entry name="SimpleXMLElement->getNamespaces()" url="function.simplexml-element-getNamespaces.php"/>
+<entry name="SimpleXMLElement->registerXPathNamespace()" url="function.simplexml-element-registerXPathNamespace.php"/>
+<entry name="SimpleXMLElement->xpath()" url="function.simplexml-element-xpath.php"/>
+<entry name="simplexml_import_dom" url="function.simplexml-import-dom.php"/>
+<entry name="simplexml_load_file" url="function.simplexml-load-file.php"/>
+<entry name="simplexml_load_string" url="function.simplexml-load-string.php"/>
+<entry name="wddx_add_vars" url="function.wddx-add-vars.php"/>
+<entry name="wddx_deserialize" url="function.wddx-deserialize.php"/>
+<entry name="wddx_packet_end" url="function.wddx-packet-end.php"/>
+<entry name="wddx_packet_start" url="function.wddx-packet-start.php"/>
+<entry name="wddx_serialize_value" url="function.wddx-serialize-value.php"/>
+<entry name="wddx_serialize_vars" url="function.wddx-serialize-vars.php"/>
+<entry name="wddx_unserialize" url="function.wddx-unserialize.php"/>
+<entry name="utf8_decode" url="function.utf8-decode.php"/>
+<entry name="utf8_encode" url="function.utf8-encode.php"/>
+<entry name="xml_error_string" url="function.xml-error-string.php"/>
+<entry name="xml_get_current_byte_index" url="function.xml-get-current-byte-index.php"/>
+<entry name="xml_get_current_column_number" url="function.xml-get-current-column-number.php"/>
+<entry name="xml_get_current_line_number" url="function.xml-get-current-line-number.php"/>
+<entry name="xml_get_error_code" url="function.xml-get-error-code.php"/>
+<entry name="xml_parse_into_struct" url="function.xml-parse-into-struct.php"/>
+<entry name="xml_parse" url="function.xml-parse.php"/>
+<entry name="xml_parser_create_ns" url="function.xml-parser-create-ns.php"/>
+<entry name="xml_parser_create" url="function.xml-parser-create.php"/>
+<entry name="xml_parser_free" url="function.xml-parser-free.php"/>
+<entry name="xml_parser_get_option" url="function.xml-parser-get-option.php"/>
+<entry name="xml_parser_set_option" url="function.xml-parser-set-option.php"/>
+<entry name="xml_set_character_data_handler" url="function.xml-set-character-data-handler.php"/>
+<entry name="xml_set_default_handler" url="function.xml-set-default-handler.php"/>
+<entry name="xml_set_element_handler" url="function.xml-set-element-handler.php"/>
+<entry name="xml_set_end_namespace_decl_handler" url="function.xml-set-end-namespace-decl-handler.php"/>
+<entry name="xml_set_external_entity_ref_handler" url="function.xml-set-external-entity-ref-handler.php"/>
+<entry name="xml_set_notation_decl_handler" url="function.xml-set-notation-decl-handler.php"/>
+<entry name="xml_set_object" url="function.xml-set-object.php"/>
+<entry name="xml_set_processing_instruction_handler" url="function.xml-set-processing-instruction-handler.php"/>
+<entry name="xml_set_start_namespace_decl_handler" url="function.xml-set-start-namespace-decl-handler.php"/>
+<entry name="xml_set_unparsed_entity_decl_handler" url="function.xml-set-unparsed-entity-decl-handler.php"/>
+<entry name="XMLReader::close" url="xmlreader.close.php"/>
+<entry name="XMLReader::expand" url="xmlreader.expand.php"/>
+<entry name="XMLReader::getAttribute" url="xmlreader.getattribute.php"/>
+<entry name="XMLReader::getAttributeNo" url="xmlreader.getattributeno.php"/>
+<entry name="XMLReader::getAttributeNs" url="xmlreader.getattributens.php"/>
+<entry name="XMLReader::getParserProperty" url="xmlreader.getparserproperty.php"/>
+<entry name="XMLReader::isValid" url="xmlreader.isvalid.php"/>
+<entry name="XMLReader::lookupNamespace" url="xmlreader.lookupnamespace.php"/>
+<entry name="XMLReader::moveToAttribute" url="xmlreader.movetoattribute.php"/>
+<entry name="XMLReader::moveToAttributeNo" url="xmlreader.movetoattributeno.php"/>
+<entry name="XMLReader::moveToAttributeNs" url="xmlreader.movetoattributens.php"/>
+<entry name="XMLReader::moveToElement" url="xmlreader.movetoelement.php"/>
+<entry name="XMLReader::moveToFirstAttribute" url="xmlreader.movetofirstattribute.php"/>
+<entry name="XMLReader::moveToNextAttribute" url="xmlreader.movetonextattribute.php"/>
+<entry name="XMLReader::next" url="xmlreader.next.php"/>
+<entry name="XMLReader::open" url="xmlreader.open.php"/>
+<entry name="XMLReader::read" url="xmlreader.read.php"/>
+<entry name="XMLReader::setParserProperty" url="xmlreader.setparserproperty.php"/>
+<entry name="XMLReader::setRelaxNGSchema" url="xmlreader.setrelaxngschema.php"/>
+<entry name="XMLReader::setRelaxNGSchemaSource" url="xmlreader.setrelaxngschemasource.php"/>
+<entry name="XMLReader::XML" url="xmlreader.xml.php"/>
+<entry name="XMLWriter::endAttribute" url="function.xmlwriter-end-attribute.php"/>
+<entry name="XMLWriter::endCData" url="function.xmlwriter-end-cdata.php"/>
+<entry name="XMLWriter::endComment" url="function.xmlwriter-end-comment.php"/>
+<entry name="XMLWriter::endDocument" url="function.xmlwriter-end-document.php"/>
+<entry name="XMLWriter::endDTDAttlist" url="function.xmlwriter-end-dtd-attlist.php"/>
+<entry name="XMLWriter::endDTDElement" url="function.xmlwriter-end-dtd-element.php"/>
+<entry name="XMLWriter::endDTDEntity" url="function.xmlwriter-end-dtd-entity.php"/>
+<entry name="XMLWriter::endDTD" url="function.xmlwriter-end-dtd.php"/>
+<entry name="XMLWriter::endElement" url="function.xmlwriter-end-element.php"/>
+<entry name="XMLWriter::endPI" url="function.xmlwriter-end-pi.php"/>
+<entry name="XMLWriter::flush" url="function.xmlwriter-flush.php"/>
+<entry name="XMLWriter::fullEndElement" url="function.xmlwriter-full-end-element.php"/>
+<entry name="XMLWriter::openMemory" url="function.xmlwriter-open-memory.php"/>
+<entry name="XMLWriter::openURI" url="function.xmlwriter-open-uri.php"/>
+<entry name="XMLWriter::outputMemory" url="function.xmlwriter-output-memory.php"/>
+<entry name="XMLWriter::setIndentString" url="function.xmlwriter-set-indent-string.php"/>
+<entry name="XMLWriter::setIndent" url="function.xmlwriter-set-indent.php"/>
+<entry name="XMLWriter::startAttributeNS" url="function.xmlwriter-start-attribute-ns.php"/>
+<entry name="XMLWriter::startAttribute" url="function.xmlwriter-start-attribute.php"/>
+<entry name="XMLWriter::startCData" url="function.xmlwriter-start-cdata.php"/>
+<entry name="XMLWriter::startComment" url="function.xmlwriter-start-comment.php"/>
+<entry name="XMLWriter::startDocument" url="function.xmlwriter-start-document.php"/>
+<entry name="XMLWriter::startDTDAttlist" url="function.xmlwriter-start-dtd-attlist.php"/>
+<entry name="XMLWriter::startDTDElement" url="function.xmlwriter-start-dtd-element.php"/>
+<entry name="XMLWriter::startDTDEntity" url="function.xmlwriter-start-dtd-entity.php"/>
+<entry name="XMLWriter::startDTD" url="function.xmlwriter-start-dtd.php"/>
+<entry name="XMLWriter::startElementNS" url="function.xmlwriter-start-element-ns.php"/>
+<entry name="XMLWriter::startElement" url="function.xmlwriter-start-element.php"/>
+<entry name="XMLWriter::startPI" url="function.xmlwriter-start-pi.php"/>
+<entry name="XMLWriter::text" url="function.xmlwriter-text.php"/>
+<entry name="XMLWriter::writeAttributeNS" url="function.xmlwriter-write-attribute-ns.php"/>
+<entry name="XMLWriter::writeAttribute" url="function.xmlwriter-write-attribute.php"/>
+<entry name="XMLWriter::writeCData" url="function.xmlwriter-write-cdata.php"/>
+<entry name="XMLWriter::writeComment" url="function.xmlwriter-write-comment.php"/>
+<entry name="XMLWriter::writeDTDAttlist" url="function.xmlwriter-write-dtd-attlist.php"/>
+<entry name="XMLWriter::writeDTDElement" url="function.xmlwriter-write-dtd-element.php"/>
+<entry name="XMLWriter::writeDTDEntity" url="function.xmlwriter-write-dtd-entity.php"/>
+<entry name="XMLWriter::writeDTD" url="function.xmlwriter-write-dtd.php"/>
+<entry name="XMLWriter::writeElementNS" url="function.xmlwriter-write-element-ns.php"/>
+<entry name="XMLWriter::writeElement" url="function.xmlwriter-write-element.php"/>
+<entry name="XMLWriter::writePI" url="function.xmlwriter-write-pi.php"/>
+<entry name="XMLWriter::writeRaw" url="function.xmlwriter-write-raw.php"/>
+<entry name="XSLTProcessor::__construct" url="xsltprocessor.construct.php"/>
+<entry name="XSLTProcessor::getParameter" url="xsltprocessor.getparameter.php"/>
+<entry name="XSLTProcessor::hasExsltSupport" url="xsltprocessor.hasexsltsupport.php"/>
+<entry name="XSLTProcessor::importStylesheet" url="xsltprocessor.importstylesheet.php"/>
+<entry name="XSLTProcessor::registerPHPFunctions" url="xsltprocessor.registerphpfunctions.php"/>
+<entry name="XSLTProcessor::removeParameter" url="xsltprocessor.removeparameter.php"/>
+<entry name="XSLTProcessor::setParameter" url="xsltprocessor.setparameter.php"/>
+<entry name="XSLTProcessor::transformToDoc" url="xsltprocessor.transformtodoc.php"/>
+<entry name="XSLTProcessor::transformToURI" url="xsltprocessor.transformtouri.php"/>
+<entry name="XSLTProcessor::transformToXML" url="xsltprocessor.transformtoxml.php"/>
+<entry name="xslt_backend_info" url="function.xslt-backend-info.php"/>
+<entry name="xslt_backend_name" url="function.xslt-backend-name.php"/>
+<entry name="xslt_backend_version" url="function.xslt-backend-version.php"/>
+<entry name="xslt_create" url="function.xslt-create.php"/>
+<entry name="xslt_errno" url="function.xslt-errno.php"/>
+<entry name="xslt_error" url="function.xslt-error.php"/>
+<entry name="xslt_free" url="function.xslt-free.php"/>
+<entry name="xslt_getopt" url="function.xslt-getopt.php"/>
+<entry name="xslt_process" url="function.xslt-process.php"/>
+<entry name="xslt_set_base" url="function.xslt-set-base.php"/>
+<entry name="xslt_set_encoding" url="function.xslt-set-encoding.php"/>
+<entry name="xslt_set_error_handler" url="function.xslt-set-error-handler.php"/>
+<entry name="xslt_set_log" url="function.xslt-set-log.php"/>
+<entry name="xslt_set_object" url="function.xslt-set-object.php"/>
+<entry name="xslt_set_sax_handler" url="function.xslt-set-sax-handler.php"/>
+<entry name="xslt_set_sax_handlers" url="function.xslt-set-sax-handlers.php"/>
+<entry name="xslt_set_scheme_handler" url="function.xslt-set-scheme-handler.php"/>
+<entry name="xslt_set_scheme_handlers" url="function.xslt-set-scheme-handlers.php"/>
+<entry name="xslt_setopt" url="function.xslt-setopt.php"/>
+<entry name="Counter::__construct" url="internals2.counter.counter-class.construct.php"/>
+<entry name="Counter::getValue" url="internals2.counter.counter-class.getValue.php"/>
+<entry name="Counter::bumpValue" url="internals2.counter.counter-class.bumpValue.php"/>
+<entry name="Counter::resetValue" url="internals2.counter.counter-class.resetValue.php"/>
+<entry name="Counter::getMeta" url="internals2.counter.counter-class.getMeta.php"/>
+<entry name="Counter::getNamed" url="internals2.counter.counter-class.getNamed.php"/>
+<entry name="Counter::setCounterClass" url="internals2.counter.counter-class.setCounterClass.php"/>
+<entry name="counter_get" url="internals2.counter.function.counter-get.php"/>
+<entry name="counter_bump" url="internals2.counter.function.counter-bump.php"/>
+<entry name="counter_reset" url="internals2.counter.function.counter-reset.php"/>
+<entry name="counter_create" url="internals2.counter.function.counter-create.php"/>
+<entry name="counter_get_value" url="internals2.counter.function.counter-get-value.php"/>
+<entry name="counter_bump_value" url="internals2.counter.function.counter-bump-value.php"/>
+<entry name="counter_reset_value" url="internals2.counter.function.counter-reset-value.php"/>
+<entry name="counter_get_meta" url="internals2.counter.function.counter-get-meta.php"/>
+<entry name="counter_get_named" url="internals2.counter.function.counter-get-named.php"/>
+</index>
+</kdeveloptoc>
diff --git a/languages/php/doc/php_bugs.toc b/languages/php/doc/php_bugs.toc
new file mode 100644
index 00000000..48c180a6
--- /dev/null
+++ b/languages/php/doc/php_bugs.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>PHP bugs</title>
+<base href="http://bugs.php.net/"/>
+<tocsect1 name="Query" url="index.html">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/php/file_templates/Makefile.am b/languages/php/file_templates/Makefile.am
new file mode 100644
index 00000000..7f031b4a
--- /dev/null
+++ b/languages/php/file_templates/Makefile.am
@@ -0,0 +1,4 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = php
+
+
diff --git a/languages/php/file_templates/php b/languages/php/file_templates/php
new file mode 100644
index 00000000..393d4867
--- /dev/null
+++ b/languages/php/file_templates/php
@@ -0,0 +1,12 @@
+<?php
+// +----------------------------------------------------------------------
+// | PHP Source
+// +----------------------------------------------------------------------
+// | Copyright (C) $YEAR$ by $AUTHOR$ <$EMAIL$>
+// +----------------------------------------------------------------------
+// |
+// | Copyright: See COPYING file that comes with this distribution
+// +----------------------------------------------------------------------
+//
+
+?>
diff --git a/languages/php/kdevphpsupport.desktop b/languages/php/kdevphpsupport.desktop
new file mode 100644
index 00000000..f1dc6597
--- /dev/null
+++ b/languages/php/kdevphpsupport.desktop
@@ -0,0 +1,86 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=PHP Support
+Comment[ca]=Suport per a PHP
+Comment[da]=PHP-understøttelse
+Comment[de]=PHP-Unterstützung für KDevelop
+Comment[el]=ΥποστήÏιξη PHP
+Comment[es]=Soporte para PHP
+Comment[et]=PHP toetus
+Comment[eu]=PHP euskarria
+Comment[fa]=پشتیبانی پی‌اچ‌پی
+Comment[fr]=Prise en charge du langage PHP
+Comment[ga]=Tacaíocht PHP
+Comment[gl]=Soporte para PHP
+Comment[hi]=पीà¤à¤šà¤ªà¥€ समरà¥à¤¥à¤¨
+Comment[hu]=PHP-támogatás
+Comment[is]=PHP stuðningur
+Comment[it]=Supporto per PHP
+Comment[ja]=PHP サãƒãƒ¼ãƒˆ
+Comment[nds]=Ünnerstütten för PHP
+Comment[ne]=पी à¤à¤š पी समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor PHP
+Comment[pa]=PHP ਸਹਿਯੋਗ
+Comment[pl]=Obsługa PHP
+Comment[pt]=Suporte a PHP
+Comment[pt_BR]=Suporte ao PHP
+Comment[ru]=Поддержка Ñзыка PHP
+Comment[sk]=PHP podpora
+Comment[sl]=Podpora za PHP
+Comment[sr]=Подршка за PHP
+Comment[sr@Latn]=Podrška za PHP
+Comment[sv]=PHP-stöd
+Comment[ta]=பிஎசà¯à®ªà®¿à®†à®¤à®°à®µà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони PHP
+Comment[tr]=PHP DesteÄŸi
+Comment[zh_CN]=PHP 支æŒ
+Comment[zh_TW]=PHP 支æ´
+Name=KDevPHPSupport
+Name[da]=KDevelop PHP-understøttelse
+Name[de]=Unterstützung für PHP (KDevelop)
+Name[hi]=के-डेव-पीà¤à¤šà¤ªà¥€-समरà¥à¤¥à¤¨
+Name[nds]=PHP-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaPHP
+Name[sk]=KDev PHP podpora
+Name[sv]=KDevelop PHP-stöd
+Name[ta]=கெடெவ௠பிஎசà¯à®ªà®¿ ஆதரவà¯
+Name[zh_TW]=KDevelop PHP 支æ´
+GenericName=PHP Support
+GenericName[ca]=Suport per a PHP
+GenericName[da]=PHP-understøttelse
+GenericName[de]=Unterstützung für PHP
+GenericName[el]=ΥποστήÏιξη PHP
+GenericName[es]=Soporte para PHP
+GenericName[et]=PHP toetus
+GenericName[eu]=PHP euskarria
+GenericName[fa]=پشتیبانی پی‌اچ‌پی
+GenericName[fr]=Prise en charge du langage PHP
+GenericName[ga]=Tacaíocht PHP
+GenericName[gl]=Soporte para PHP
+GenericName[hi]=पीà¤à¤šà¤ªà¥€ समरà¥à¤¥à¤¨
+GenericName[hu]=PHP-támogatás
+GenericName[it]=Supporto per PHP
+GenericName[ja]=PHP サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för PHP
+GenericName[ne]=पी à¤à¤š पी समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor PHP
+GenericName[pl]=Obsługa PHP
+GenericName[pt]=Suporte a PHP
+GenericName[pt_BR]=Suporte ao PHP
+GenericName[ru]=Поддержка Ñзыка PHP
+GenericName[sk]=PHP podpora
+GenericName[sl]=Podpora za PHP
+GenericName[sr]=Подршка за PHP
+GenericName[sr@Latn]=Podrška za PHP
+GenericName[sv]=PHP-stöd
+GenericName[ta]=பிஎசà¯à®ªà®¿ ஆதரவà¯
+GenericName[tg]=ÐÑ€Ó£ намудани забони PHP
+GenericName[tr]=PHP DesteÄŸi
+GenericName[zh_CN]=PHP 支æŒ
+GenericName[zh_TW]=PHP 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevphpsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=PHP
+
diff --git a/languages/php/kdevphpsupport.rc b/languages/php/kdevphpsupport.rc
new file mode 100644
index 00000000..14ebd3ba
--- /dev/null
+++ b/languages/php/kdevphpsupport.rc
@@ -0,0 +1,18 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KPHPSupport" version="3">
+<MenuBar>
+ <Menu name="edit">
+ <Action name="edit_complete_text"/>
+ </Menu>
+ <Menu name="build" >
+ <Action name="build_execute" />
+ </Menu>
+ <Menu name="project" >
+ <Action name="project_new_class" />
+ </Menu>
+</MenuBar>
+<ToolBar name="buildToolBar">
+ <Action name="build_execute" group="build_operations" />
+</ToolBar>
+</kpartgui>
+
diff --git a/languages/php/phpcodecompletion.cpp b/languages/php/phpcodecompletion.cpp
new file mode 100644
index 00000000..c9bd7213
--- /dev/null
+++ b/languages/php/phpcodecompletion.cpp
@@ -0,0 +1,712 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+ Copyright (C) 2001 by smeier@kdevelop.org
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "phpcodecompletion.h"
+#include "phpsupportpart.h"
+#include "phpconfigdata.h"
+
+#include <kdevcore.h>
+#include <kinstance.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+
+#include <iostream>
+
+#include "phpfile.h"
+
+using namespace std;
+
+PHPCodeCompletion::PHPCodeCompletion(PHPSupportPart *phpSupport, PHPConfigData *config) : QObject(), m_cursorInterface(0), m_codeInterface(0), m_editInterface(0), m_selectionInterface(0) {
+
+ m_phpSupport = phpSupport;
+ m_config = config;
+ m_model = phpSupport->codeModel();
+ m_argWidgetShow = false;
+ m_completionBoxShow = false;
+
+ readGlobalPHPFunctionsFile();
+}
+
+PHPCodeCompletion::~PHPCodeCompletion(){
+}
+
+void PHPCodeCompletion::readGlobalPHPFunctionsFile(){
+ KStandardDirs *dirs = PHPSupportFactory::instance()->dirs();
+ QString phpFuncFile = dirs->findResource("data","kdevphpsupport/phpfunctions");
+ QRegExp lineReg(":([0-9A-Za-z_]+) ([0-9A-Za-z_]+)\\((.*)\\)");
+ FunctionCompletionEntry e;
+
+ QFile f(phpFuncFile);
+ if ( f.open(IO_ReadOnly) ) { // file opened successfully
+ QTextStream t( &f ); // use a text stream
+ QString s;
+ while ( !t.eof() ) { // until end of file...
+ s = t.readLine(); // line of text excluding '\n'
+ if (lineReg.search(s.local8Bit()) != -1) {
+ e.prefix = lineReg.cap(1);
+ e.text = lineReg.cap(2);
+ e.postfix = "(" + QString(lineReg.cap(3)) + ")";
+ e.prototype = QString(lineReg.cap(1)) + " " + QString(lineReg.cap(2)) + "(" + QString(lineReg.cap(3)) + ")";
+ m_globalFunctions.append(e);
+ }
+ }
+ f.close();
+ }
+}
+
+void PHPCodeCompletion::argHintHided(){
+ kdDebug(9018) << "PHPCodeCompletion::argHintHided" << endl;
+ m_argWidgetShow = false;
+}
+
+void PHPCodeCompletion::completionBoxHided(){
+ kdDebug(9018) << "PHPCodeCompletion::completionBoxHided()" << endl;
+ m_completionBoxShow = false;
+}
+
+void PHPCodeCompletion::setActiveEditorPart(KParts::Part *part)
+{
+ if (!part || !part->widget())
+ return;
+
+ kdDebug(9018) << "PHPCodeCompletion::setActiveEditorPart" << endl;
+
+ if (!(m_config->getCodeCompletion() || m_config->getCodeHinting()))
+ return; // no help
+
+ m_editInterface = dynamic_cast<KTextEditor::EditInterface*>(part);
+ if (!m_editInterface) {
+ kdDebug(9018) << "editor doesn't support the EditDocumentIface" << endl;
+ return;
+ }
+
+ m_cursorInterface = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget());
+ if (!m_cursorInterface) {
+ kdDebug(9018) << "editor does not support the ViewCursorInterface" << endl;
+ return;
+ }
+
+ m_codeInterface = dynamic_cast<KTextEditor::CodeCompletionInterface*>(part->widget());
+ if (!m_codeInterface) { // no CodeCompletionDocument available
+ kdDebug(9018) << "editor doesn't support the CodeCompletionDocumentIface" << endl;
+ return;
+ }
+
+ m_selectionInterface = dynamic_cast<KTextEditor::SelectionInterface*>(part);
+ if (!m_selectionInterface) {
+ kdDebug(9018) << "editor doesn't support the SelectionInterface" << endl;
+ return;
+ }
+
+ disconnect(part->widget(), 0, this, 0 ); // to make sure that it is't connected twice
+// connect(part->widget(), SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChanged()));
+ connect( part, SIGNAL(textChanged()), this, SLOT(cursorPositionChanged()) );
+ connect(part->widget(), SIGNAL(argHintHidden()), this, SLOT(argHintHided()));
+ connect(part->widget(), SIGNAL(completionAborted()), this, SLOT(completionBoxHided()));
+ connect(part->widget(), SIGNAL(completionDone()), this, SLOT(completionBoxHided()));
+}
+
+void PHPCodeCompletion::cursorPositionChanged(){
+ uint line, col;
+ if( !m_cursorInterface || !m_selectionInterface || !m_codeInterface || !m_editInterface )
+ return;
+ m_cursorInterface->cursorPositionReal(&line, &col);
+
+ kdDebug(9018) << "cursorPositionChanged:" << line << ":" << col << endl;
+
+ m_currentLine = line;
+ QString lineStr = m_editInterface->textLine(line);
+ if (lineStr.isNull() || lineStr.isEmpty()) {
+ return;
+ }
+
+ if (m_selectionInterface->hasSelection()) {
+ kdDebug(9018) << "No CodeCompletion/ArgHinting at the moment, because text is selected" << endl;
+ return;
+ }
+
+ if (m_config->getCodeHinting()) {
+ int pos1 = lineStr.findRev("(", col - 1);
+ int pos2 = lineStr.findRev(QRegExp("[ \\t=;\\$\\.\\(\\)]"), pos1 - 1);
+ int pos3 = lineStr.findRev(")", col);
+
+ if (pos1 > pos2 && pos1 != -1 && pos3 < pos1) {
+ QString line = lineStr.mid(pos2 + 1, pos1 - pos2 - 1).stripWhiteSpace();
+ checkForArgHint(line, col);
+ kdDebug(9018) << "end checkForArgHint" << endl;
+ }
+
+ }
+
+ if (m_config->getCodeCompletion()) {
+ if (m_completionBoxShow == true) {
+ return;
+ }
+
+ int pos = lineStr.findRev(QRegExp("[ \\t=;\\$\\.\\(\\)]"), col - 1);
+ QString line = lineStr.mid(pos + 1, col - pos).stripWhiteSpace();
+
+ if (checkForVariable(line, col)) {
+kdDebug(9018) << "end checkForVariable" << endl;
+ return;
+ }
+ if (checkForStaticFunction(line, col)) {
+kdDebug(9018) << "end checkForStaticFunction" << endl;
+ return;
+ }
+
+ if(checkForGlobalFunction(line, col)) {
+kdDebug(9018) << "end checkForGlobalFunction" << endl;
+ return;
+ }
+
+ pos = lineStr.stripWhiteSpace().findRev(QRegExp("[ \\t=;\\$\\.\\(\\)]"), col - 1);
+ line = lineStr.mid(pos + 1, col - pos);
+
+ if (checkForNew(line, col)) {
+kdDebug(9018) << "end checkForNew" << endl;
+ return;
+ }
+
+ if (checkForExtends(line, col)) {
+kdDebug(9018) << "end checkForExtends" << endl;
+ return;
+ }
+kdDebug(9018) << "end checkFor" << endl;
+ }
+}
+
+bool PHPCodeCompletion::showCompletionBox(QValueList<KTextEditor::CompletionEntry> list, unsigned long max) {
+ if (list.count() > 0) {
+ if (list.count() == 1) {
+ KTextEditor::CompletionEntry e = list.first();
+ if (e.text.length() == max)
+ return false;
+ }
+ m_completionBoxShow = true;
+ m_codeInterface->showCompletionBox(list, max, FALSE);
+ return true;
+ }
+ return false;
+}
+
+bool PHPCodeCompletion::checkForStaticFunction(QString line, int col) {
+ kdDebug(9018) << "checkForStaticFunction" << endl;
+ QValueList<KTextEditor::CompletionEntry> list;
+
+ if (line.find("::") == -1)
+ return false;
+
+ QRegExp Class("([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)::([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*|)");
+ Class.setCaseSensitive(FALSE);
+
+ if (Class.search(line) != -1) {
+ QString classname = Class.cap(1);
+ QString function = Class.cap(2);
+
+ ClassList classList = getClassByName(classname);
+
+ ClassList::Iterator classIt;
+ for (classIt = classList.begin(); classIt != classList.end(); ++classIt) {
+ ClassDom nClass = *classIt;
+ FunctionList funcList = nClass->functionList();
+ FunctionList::Iterator funcIt;
+
+ for (funcIt = funcList.begin(); funcIt != funcList.end(); ++funcIt) {
+ FunctionDom nFunc = *funcIt;
+ if ((function.isEmpty() || nFunc->name().startsWith(function, FALSE)) && nFunc->isStatic()) {
+ KTextEditor::CompletionEntry e;
+ e.prefix = nClass->name() + " ::";
+ e.text = nFunc->name();
+ ArgumentDom pArg = (*funcIt)->argumentList().first();
+ if (pArg)
+ e.postfix = "(" + pArg->type() +")";
+ else
+ e.postfix = "()";
+ list.append(e);
+ }
+ }
+
+ if (nClass->baseClassList().count() != 0) {
+ QStringList base = nClass->baseClassList();
+ QStringList::Iterator nameIt;
+ for (nameIt = base.begin(); nameIt != base.end(); ++nameIt) {
+ ClassList baseList = getClassByName(*nameIt);
+ ClassList::Iterator baseIt;
+ for (baseIt = baseList.begin(); baseIt != baseList.end(); ++baseIt)
+ classList.append(*baseIt);
+ }
+ }
+ }
+ return showCompletionBox(list, Class.cap(2).length());
+ }
+ return false;
+}
+
+bool PHPCodeCompletion::checkForNew(QString line, int col){
+ kdDebug(9018) << "checkForNew" << endl;
+ QValueList<KTextEditor::CompletionEntry> list;
+
+ if (line.find("new ", 0, FALSE) == -1)
+ return false;
+
+ QRegExp New("[& \t]*new[ \t]+([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*|)");
+ New.setCaseSensitive(FALSE);
+
+ if (New.search(line) != -1) {
+ list = getClasses( New.cap(1) );
+
+ if (New.cap(1).lower() == "ob") {
+ KTextEditor::CompletionEntry e;
+ e.text = "object";
+ list.append(e);
+ }
+
+ if (New.cap(1).lower() == "ar") {
+ KTextEditor::CompletionEntry e;
+ e.text = "array";
+ list.append(e);
+ }
+ return showCompletionBox(list, New.cap(1).length());
+ }
+
+ return false;
+}
+
+bool PHPCodeCompletion::checkForExtends(QString line, int col){
+ kdDebug(9018) << "checkForExtends" << endl;
+ QValueList<KTextEditor::CompletionEntry> list;
+
+ if (line.find("extends", 0, FALSE) == -1)
+ return false;
+
+ QRegExp extends("[ \t]*extends[ \t]+([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*|)");
+ extends.setCaseSensitive(FALSE);
+
+ if (extends.search(line) != -1) {
+ list = getClasses(extends.cap(1));
+ return showCompletionBox(list, extends.cap(1).length());
+ }
+
+ return false;
+}
+
+bool PHPCodeCompletion::checkForVariable(QString line, int col){
+ kdDebug(9018) << "checkForVariable" << endl;
+ QValueList<KTextEditor::CompletionEntry> list;
+ QString args;
+
+ if (line.find("->") == -1) {
+ return false;
+ }
+
+ if (line.left(2) != "->") {
+ int pos = line.findRev("->");
+ args = line.mid(pos + 2, line.length() - pos);
+ line = line.mid(0, pos);
+ }
+
+ QStringList vars = QStringList::split("->", line);
+ QString classname;
+
+ for ( QStringList::Iterator it = vars.begin(); it != vars.end(); ++it ) {
+ classname = getClassName(*it, classname);
+ }
+
+ if (classname.isEmpty()) {
+ return false;
+ }
+
+ this->setStatusBar(line, classname);
+
+ list = this->getFunctionsAndVars(classname, args);
+ return showCompletionBox(list, args.length());
+}
+
+bool PHPCodeCompletion::checkForGlobalFunction(QString line, int col) {
+ kdDebug(9018) << "checkForGlobalFunction(" + line + "," << col << endl;
+ QValueList<KTextEditor::CompletionEntry> list;
+
+ if (line.length() < 3)
+ return false;
+
+ list = this->getFunctionsAndVars("", line);
+ return showCompletionBox(list, line.length());
+}
+
+QValueList<KTextEditor::CompletionEntry> PHPCodeCompletion::getClasses(QString name) {
+ QValueList<KTextEditor::CompletionEntry> list;
+ QStringList added;
+
+ ClassList classList = m_model->globalNamespace()->classList();
+ ClassList::Iterator classIt;
+ for (classIt = classList.begin(); classIt != classList.end(); ++classIt) {
+ ClassDom nClass = *classIt;
+ if (name == NULL || name.isEmpty() || nClass->name().startsWith(name, FALSE)) {
+ KTextEditor::CompletionEntry e;
+
+ QStringList::Iterator it = added.find(nClass->name());
+ if (it == added.end()) {
+ e.text = nClass->name();
+ list.append(e);
+ added.append(nClass->name());
+ }
+ }
+ }
+ return list;
+}
+
+QValueList<KTextEditor::CompletionEntry> PHPCodeCompletion::getFunctionsAndVars(QString classname, QString function) {
+ kdDebug(9018) << "getFunctionsAndVars " << classname << endl;
+ QValueList<KTextEditor::CompletionEntry> list;
+
+ if (classname.isEmpty()) {
+ QValueList<FunctionCompletionEntry>::Iterator it;
+ for( it = m_globalFunctions.begin(); it != m_globalFunctions.end(); ++it ) {
+ if((*it).text.startsWith(function, FALSE)){
+ KTextEditor::CompletionEntry e;
+ e = (*it);
+ list.append(e);
+ }
+ }
+
+ FunctionList methodList = m_model->globalNamespace()->functionList();
+ FunctionList::Iterator methodIt;
+ for (methodIt = methodList.begin(); methodIt != methodList.end(); ++methodIt) {
+ if ((*methodIt)->name().startsWith(function, FALSE)){
+ KTextEditor::CompletionEntry e;
+ e.text = (*methodIt)->name();
+ ArgumentDom pArg = (*methodIt)->argumentList().first();
+ if (pArg)
+ e.postfix = "(" + pArg->type() +")";
+ else
+ e.postfix = "()";
+ list.append(e);
+ }
+ }
+ return list;
+ }
+
+ ClassList classList = getClassByName(classname);
+ ClassList::Iterator classIt;
+ for (classIt = classList.begin(); classIt != classList.end(); ++classIt) {
+ ClassDom nClass = *classIt;
+
+ FunctionList methodList = nClass->functionList();
+ FunctionList::Iterator methodIt;
+ for (methodIt = methodList.begin(); methodIt != methodList.end(); ++methodIt) {
+ FunctionDom pMethod = *methodIt;
+ if (function.isEmpty() || pMethod->name().startsWith(function, FALSE)) {
+ KTextEditor::CompletionEntry e;
+ ArgumentDom arg = pMethod->argumentList().first();
+
+ e.prefix = nClass->name() + " ::";
+ e.text = pMethod->name();
+ e.postfix = "(" + arg->type() + ")";
+ list.append(e);
+ }
+ }
+ VariableList attrList = nClass->variableList();
+ VariableList::Iterator attrIt;
+ for (attrIt = attrList.begin(); attrIt != attrList.end(); ++attrIt) {
+ VariableDom pVar = *attrIt;
+ if (function.isEmpty() || pVar->name().startsWith(function, FALSE)) {
+ KTextEditor::CompletionEntry e;
+ e.prefix = nClass->name() + " ::";
+ e.text = pVar->name();
+ e.postfix = "";
+ list.append(e);
+ }
+ }
+
+ if (nClass->baseClassList().count() != 0) {
+ QStringList base = nClass->baseClassList();
+ QStringList::Iterator nameIt;
+ for (nameIt = base.begin(); nameIt != base.end(); ++nameIt) {
+ ClassList baseList = getClassByName(*nameIt);
+ ClassList::Iterator baseIt;
+ for (baseIt = baseList.begin(); baseIt != baseList.end(); ++baseIt)
+ classList.append(*baseIt);
+ }
+ }
+ }
+ return list;
+}
+
+QStringList PHPCodeCompletion::getArguments(QString classname, QString function) {
+ kdDebug(9018) << "getArguments " << function << endl;
+ QStringList list;
+
+ if (classname.isEmpty()) {
+ QValueList<FunctionCompletionEntry>::Iterator it;
+ for( it = m_globalFunctions.begin(); it != m_globalFunctions.end(); ++it ) {
+ if((*it).text.lower() == function.lower()){
+ KTextEditor::CompletionEntry e = (*it);
+ list.append(e.text + e.postfix);
+ }
+ }
+
+ FunctionList methodList = m_model->globalNamespace()->functionList();
+ FunctionList::Iterator methodIt;
+ for (methodIt = methodList.begin(); methodIt != methodList.end(); ++methodIt) {
+ if ((*methodIt)->name().lower() == function.lower()){
+ KTextEditor::CompletionEntry e;
+ ArgumentDom pArgs;
+ QString args = "()";
+
+ ArgumentDom pArg = (*methodIt)->argumentList().first();
+ if (pArgs)
+ args = "(" + pArg->type() +")";
+
+ list.append((*methodIt)->name() + "(" + args +")");
+ }
+ }
+ return list;
+ }
+
+ ClassList classList = getClassByName(classname);
+ ClassList::Iterator classIt;
+ for (classIt = classList.begin(); classIt != classList.end(); ++classIt) {
+ ClassDom nClass = *classIt;
+
+ FunctionList methodList = nClass->functionList();
+ FunctionList::Iterator methodIt;
+ for (methodIt = methodList.begin(); methodIt != methodList.end(); ++methodIt) {
+ if ((*methodIt)->name().lower() == function.lower()) {
+ ArgumentDom pArg = (*methodIt)->argumentList().first();
+ if (pArg)
+ list.append(nClass->name() + "::" + function + "(" + pArg->type() +")");
+ }
+ }
+
+ if (nClass->baseClassList().count() != 0) {
+ QStringList base = nClass->baseClassList();
+ QStringList::Iterator nameIt;
+ for (nameIt = base.begin(); nameIt != base.end(); ++nameIt) {
+ ClassList baseList = getClassByName(*nameIt);
+ ClassList::Iterator baseIt;
+ for (baseIt = baseList.begin(); baseIt != baseList.end(); ++baseIt)
+ classList.append(*baseIt);
+ }
+ }
+
+ }
+ return list;
+}
+
+QString PHPCodeCompletion::getCurrentClassName() {
+ kdDebug(9018) << "getCurrentClassName" << endl;
+ QRegExp Class("^[ \t]*(abstract|final|)[ \t]*class[ \t]+([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*(extends[ \t]*([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))?.*$");
+ Class.setCaseSensitive(FALSE);
+
+ for(int i = m_currentLine; i >= 0; i--){
+ QString line = m_editInterface->textLine(i);
+ if (!line.isNull()) {
+ if (Class.search(line) != -1)
+ return Class.cap(2);
+ }
+ }
+ return QString::null;
+}
+
+QString PHPCodeCompletion::getClassName(QString varName, QString classname) {
+ kdDebug(9018) << "getClassName " << varName << "::" << classname << endl;
+
+ if (varName.find("$") == 0)
+ varName = varName.mid(1);
+
+ if (varName.lower() == "this")
+ return this->getCurrentClassName();
+
+ if (classname.isEmpty()) {
+ VariableList attrList = m_model->globalNamespace()->variableList();
+ VariableList::Iterator attrIt;
+
+ for (attrIt = attrList.begin(); attrIt != attrList.end(); ++attrIt) {
+ if ((*attrIt)->name().lower() == varName.lower())
+ return (*attrIt)->type();
+ }
+ }
+
+ ClassList classList = getClassByName( classname );
+ ClassList::Iterator classIt;
+ for (classIt = classList.begin(); classIt != classList.end(); ++classIt) {
+ ClassDom pClass = *classIt;
+
+ FunctionList funcList = pClass->functionList();
+ FunctionList::Iterator funcIt;
+
+ for (funcIt = funcList.begin(); funcIt != funcList.end(); ++funcIt) {
+ if (QString((*funcIt)->name().lower() + "(") == varName.lower())
+ return (*funcIt)->resultType();
+ }
+
+ VariableList attrList = pClass->variableList();
+ VariableList::Iterator attrIt;
+
+ for (attrIt = attrList.begin(); attrIt != attrList.end(); ++attrIt) {
+ if ((*attrIt)->name().lower() == varName.lower())
+ return (*attrIt)->type();
+ }
+ }
+
+ kdDebug(9018) << "Need " << classname << " " << varName << endl;
+/*
+ /// @fixme peut devenir recursif voir xbutton.php ligne 204
+ QRegExp createmember("\\" + varName + "[ \t]*=[ \t]*(.*)[ \t]*;");
+
+ for(int i = m_currentLine; i >= 0; i--){
+ QString line = m_editInterface->textLine(i);
+ if (!line.isNull() && line.find(varName,0 , FALSE) != -1) {
+
+ if (createmember.search(line) != -1) {
+ QString right = createmember.cap(1).stripWhiteSpace();
+
+ QStringList vars = QStringList::split("->", right);
+ for ( QStringList::Iterator it = vars.begin(); it != vars.end(); ++it ) {
+ QString objet = *it;
+ ++it;
+ if (it == vars.end())
+ break;
+
+ QString var = *it;
+
+ if (objet.lower() == "$this")
+ objet = this->getCurrentClassName();
+
+ classname = getClassName(var, objet);
+
+ NamespaceDom varns = m_model->globalNamespace()->namespaceByName("varsns");
+ QString fromns;
+ if (varns) {
+ QString name = objet + "::" + var;
+ kdDebug(9018) << name << endl;
+ VariableDom nVar = varns->variableByName(name);
+ fromns = nVar->type();
+
+ }
+ kdDebug(9018) << "Need " << objet << " " << var << " " << fromns << " " << vars.size() << endl;
+
+ }
+ kdDebug(9018) << "Dehors" << " " << classname << endl;
+
+ return classname;
+ }
+ }
+ }
+ */
+ return "";
+}
+
+QValueList<ClassDom> PHPCodeCompletion::getClassByName(QString classname) {
+ QValueList<ClassDom> CList;
+
+ ClassList classList = m_model->globalNamespace()->classList();
+
+ ClassList::Iterator classIt;
+ for (classIt = classList.begin(); classIt != classList.end(); ++classIt) {
+ ClassDom nClass = *classIt;
+ if (nClass->name().lower() == classname.lower())
+ CList.append( nClass );
+ }
+ return CList;
+}
+
+bool PHPCodeCompletion::checkForArgHint(QString line, int col) {
+ kdDebug(9018) << "checkForArgHint" << endl;
+ QValueList<KTextEditor::CompletionEntry> list;
+ QStringList argsList;
+
+ if (m_argWidgetShow == true)
+ return false;
+
+ if (line.find("::") != -1) {
+ QRegExp Static("([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)::([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)");
+ Static.setCaseSensitive(FALSE);
+
+ if (Static.search(line) != -1) {
+ QString classname = Static.cap(1);
+ QString function = Static.cap(2);
+
+ argsList = getArguments(classname, function);
+
+ if (argsList.count() > 0) {
+ m_argWidgetShow = true;
+ m_codeInterface->showArgHint ( argsList, "()", "," );
+ return true;
+ }
+ }
+ }
+
+ if (line.findRev("->") != -1) {
+ int pos1 = line.findRev("->");
+
+ QString classname;
+ QString function = line.mid(pos1 + 2);
+
+ line = line.mid(0, pos1);
+
+kdDebug(9018) << "checkForArgHint 2 " << line << endl;
+
+ QStringList vars = QStringList::split("->", line);
+
+ for ( QStringList::Iterator it = vars.begin(); it != vars.end(); ++it ) {
+kdDebug(9018) << "for " << line << endl;
+ classname = getClassName(*it, classname);
+kdDebug(9018) << "next " << line << endl;
+ }
+
+kdDebug(9018) << "checkForArgHint 4 " << line << endl;
+
+ argsList = getArguments(classname, function);
+ if (argsList.count() > 0) {
+ m_argWidgetShow = true;
+ m_codeInterface->showArgHint ( argsList, "()", "," );
+ return true;
+ }
+ }
+
+kdDebug(9018) << "checkForArgHint 0 " << line << endl;
+
+ argsList = getArguments("", line);
+ if (argsList.count() > 0) {
+ m_argWidgetShow = true;
+ m_codeInterface->showArgHint ( argsList, "()", "," );
+ return true;
+ }
+
+ argsList = getArguments(line, line);
+ if (argsList.count() > 0) {
+ m_argWidgetShow = true;
+ m_codeInterface->showArgHint ( argsList, "()", "," );
+ return true;
+ }
+
+ return false;
+}
+
+void PHPCodeCompletion::setStatusBar(QString expr, QString type) {
+ m_phpSupport->mainWindow()->statusBar()->message( i18n("Type of %1 is %2").arg(expr).arg(type), 1000 );
+}
+
+#include "phpcodecompletion.moc"
diff --git a/languages/php/phpcodecompletion.h b/languages/php/phpcodecompletion.h
new file mode 100644
index 00000000..41d79934
--- /dev/null
+++ b/languages/php/phpcodecompletion.h
@@ -0,0 +1,103 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+ Copyright (C) 2001 by smeier@kdevelop.org
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+
+#ifndef PHPCODECOMPLETION_H
+#define PHPCODECOMPLETION_H
+
+#include <codemodel.h>
+
+#include <qobject.h>
+#include <kregexp.h>
+#include <kparts/part.h>
+
+#include <kdevmainwindow.h>
+#include <kstatusbar.h>
+
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <ktexteditor/codecompletioninterface.h>
+#include <ktexteditor/selectioninterface.h>
+
+
+class KDevCore;
+class PHPSupportPart;
+class PHPConfigData;
+
+class FunctionCompletionEntry : public KTextEditor::CompletionEntry {
+public:
+ QString prototype;
+};
+
+class PHPCodeCompletion : public QObject {
+ Q_OBJECT
+
+public:
+ PHPCodeCompletion(PHPSupportPart *phpSupport, PHPConfigData *config);
+ ~PHPCodeCompletion();
+ void setActiveEditorPart(KParts::Part *part);
+
+public slots:
+ void cursorPositionChanged();
+
+protected slots:
+ void argHintHided();
+ void completionBoxHided();
+
+protected:
+ bool showCompletionBox(QValueList<KTextEditor::CompletionEntry> list, unsigned long max);
+
+ bool checkForVariable(QString line, int col);
+ bool checkForStaticFunction(QString line, int col);
+ bool checkForNew(QString line, int col);
+ bool checkForExtends(QString line, int col);
+ bool checkForGlobalFunction(QString line, int col);
+
+ bool checkForArgHint(QString line, int col);
+
+ QValueList<KTextEditor::CompletionEntry> getClasses(QString name);
+ QValueList<KTextEditor::CompletionEntry> getFunctionsAndVars(QString classname, QString str);
+ QStringList getArguments(QString classname, QString function);
+ QString getCurrentClassName();
+ QString getClassName(QString varName, QString classname);
+ QValueList<ClassDom> getClassByName(QString classname);
+
+ void readGlobalPHPFunctionsFile();
+ void setStatusBar(QString expr, QString type);
+
+ private:
+ int m_currentLine;
+ QValueList<FunctionCompletionEntry> m_globalFunctions;
+
+ PHPSupportPart* m_phpSupport;
+ PHPConfigData* m_config;
+ CodeModel* m_model;
+
+ bool m_argWidgetShow;
+ bool m_completionBoxShow;
+
+ KTextEditor::EditInterface *m_editInterface;
+ KTextEditor::CodeCompletionInterface *m_codeInterface;
+ KTextEditor::ViewCursorInterface *m_cursorInterface;
+ KTextEditor::SelectionInterface *m_selectionInterface;
+
+ QString findDeclaration(QString name, int line = -1);
+};
+
+#endif
diff --git a/languages/php/phpconfigdata.cpp b/languages/php/phpconfigdata.cpp
new file mode 100644
index 00000000..45f27a79
--- /dev/null
+++ b/languages/php/phpconfigdata.cpp
@@ -0,0 +1,88 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+ Copyright (C) 2001 by smeier@kdevelop.org
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "kstandarddirs.h"
+#include "phpconfigdata.h"
+#include "domutil.h"
+#include <iostream>
+
+PHPConfigData::PHPConfigData(QDomDocument* dom) {
+ QString file = KStandardDirs::findExe("php");
+
+ if (file.isEmpty())
+ file = "/usr/local/bin/php";
+
+ document = dom;
+ invocationMode = (InvocationMode) DomUtil::readIntEntry(*dom, "/kdevphpsupport/general/invocationMode", Web);
+
+ webURL = DomUtil::readEntry(*document, "/kdevphpsupport/webInvocation/weburl");
+
+ phpExePath = DomUtil::readEntry(*document, "/kdevphpsupport/shell/phpexe", file);
+ phpIniPath = DomUtil::readEntry(*document, "/kdevphpsupport/shell/phpini");
+
+ phpIncludePath = DomUtil::readEntry(*document, "/kdevphpsupport/options/phpincludepath");
+ phpStartupFile = DomUtil::readEntry(*document, "/kdevphpsupport/options/defaultFile");
+ phpStartupFileMode = (StartupFileMode)DomUtil::readIntEntry(*document, "/kdevphpsupport/options/startupFileMode", Current);
+
+ m_codeCompletion = DomUtil::readBoolEntry(*document,"kdevphpsupport/codeHelp/codeCompletion", true);
+ m_codeHinting = DomUtil::readBoolEntry(*document,"kdevphpsupport/codeHelp/codeHinting", true);
+ m_realtimeParsing = DomUtil::readBoolEntry(*document,"kdevphpsupport/codeHelp/realtimeParsing", true);
+}
+
+PHPConfigData::~PHPConfigData() {
+}
+
+void PHPConfigData::storeConfig() {
+ DomUtil::writeIntEntry(*document, "/kdevphpsupport/general/invocationMode",(int) invocationMode);
+
+ DomUtil::writeEntry(*document, "/kdevphpsupport/webInvocation/weburl",webURL);
+
+ DomUtil::writeEntry(*document, "/kdevphpsupport/shell/phpexe",phpExePath);
+ DomUtil::writeEntry(*document, "/kdevphpsupport/shell/phpini",phpIniPath);
+
+ DomUtil::writeEntry(*document, "/kdevphpsupport/options/phpincludepath",phpIncludePath);
+ DomUtil::writeEntry(*document, "/kdevphpsupport/options/defaultFile",phpStartupFile);
+ DomUtil::writeIntEntry(*document, "/kdevphpsupport/options/startupFileMode",(int) phpStartupFileMode);
+
+ DomUtil::writeBoolEntry(*document,"kdevphpsupport/codeHelp/codeCompletion",m_codeCompletion);
+ DomUtil::writeBoolEntry(*document,"kdevphpsupport/codeHelp/codeHinting",m_codeHinting);
+ DomUtil::writeBoolEntry(*document,"kdevphpsupport/codeHelp/realtimeParsing",m_realtimeParsing);
+ emit configStored(); // inform all others
+}
+
+bool PHPConfigData::validateConfig(){
+ bool valid = false;
+ if (invocationMode == Web || invocationMode == Shell) {
+ valid = true;
+ }
+ if (valid) {
+ if (invocationMode == Web) {
+ if (!(!webURL.isEmpty() && (phpStartupFileMode == Default || phpStartupFileMode == Current))) {
+ valid = false;
+ }
+ }
+ if (invocationMode == Shell) {
+ if (phpExePath.isEmpty()) {
+ valid = false;
+ }
+ }
+ }
+ return valid;
+}
+#include "phpconfigdata.moc"
diff --git a/languages/php/phpconfigdata.h b/languages/php/phpconfigdata.h
new file mode 100644
index 00000000..0c7a49eb
--- /dev/null
+++ b/languages/php/phpconfigdata.h
@@ -0,0 +1,155 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+ Copyright (C) 2001 by smeier@kdevelop.org
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef PHPCONFIGDATA_H
+#define PHPCONFIGDATA_H
+
+#include <qstring.h>
+#include <qdom.h>
+#include <qobject.h>
+
+/**
+ *@author Sandy Meier
+ */
+
+class PHPConfigData : public QObject {
+Q_OBJECT
+
+signals:
+ void configStored();
+
+public:
+ enum InvocationMode {Web=1,Shell=2};
+ enum StartupFileMode {Current=1,Default=2};
+
+ PHPConfigData(QDomDocument* document);
+ ~PHPConfigData();
+
+ /** returns true if the configuration is ok, false if something is missing
+ */
+ bool validateConfig();
+ /** write the configuration to the DOM document(project file)
+ */
+ void storeConfig();
+
+ InvocationMode getInvocationMode() {
+ return invocationMode;
+ }
+
+ void setInvocationMode(InvocationMode mode) {
+ invocationMode = mode;
+ }
+
+ // web
+ QString getWebURL() {
+ return webURL;
+ }
+ void setWebURL(QString weburl) {
+ webURL = weburl;
+ }
+
+ // shell
+ QString getPHPExecPath() {
+ return phpExePath;
+ }
+
+ void setPHPExePath(QString path) {
+ phpExePath = path;
+ }
+
+ // config
+ QString getPHPIniPath() {
+ return phpIniPath;
+ }
+
+ void setPHPIniPath(QString path) {
+ phpIniPath = path;
+ }
+
+ // options
+ QString getPHPIncludePath() {
+ return phpIncludePath;
+ }
+ void setPHPIncludePath(QString path) {
+ phpIncludePath = path;
+ }
+
+ QString getStartupFile() {
+ return phpStartupFile;
+ }
+ void setStartupFile(QString defaultFile) {
+ phpStartupFile = defaultFile;
+ }
+
+ StartupFileMode getStartupFileMode() {
+ return phpStartupFileMode;
+ }
+
+ void setStartupFileMode(StartupFileMode mode) {
+ phpStartupFileMode = mode;
+ }
+
+ // code help
+ void setCodeCompletion(bool enable) {
+ m_codeCompletion = enable;
+ }
+
+ bool getCodeCompletion() {
+ return m_codeCompletion;
+ }
+
+ void setCodeHinting(bool enable) {
+ m_codeHinting = enable;
+ }
+
+ bool getCodeHinting() {
+ return m_codeHinting;
+ }
+
+ void setRealtimeParsing(bool enable) {
+ m_realtimeParsing = enable;
+ }
+
+ bool getRealtimeParsing() {
+ return m_realtimeParsing;
+ }
+
+private:
+ QDomDocument* document;
+ InvocationMode invocationMode;
+ // web
+ QString webURL;
+
+ // shell
+ QString phpExePath;
+ QString phpIniPath;
+ QString phpStartupFile;
+
+ // options
+ QString phpIncludePath;
+ QString phpDefaultFile;
+ StartupFileMode phpStartupFileMode;
+
+ // code help
+ bool m_codeCompletion;
+ bool m_codeHinting;
+ bool m_realtimeParsing;
+};
+
+#endif
diff --git a/languages/php/phpconfigwidget.cpp b/languages/php/phpconfigwidget.cpp
new file mode 100644
index 00000000..829e3038
--- /dev/null
+++ b/languages/php/phpconfigwidget.cpp
@@ -0,0 +1,161 @@
+#include "domutil.h"
+#include <kprocess.h>
+#include <klineedit.h>
+#include <qcheckbox.h>
+#include <qmultilineedit.h>
+#include <qcstring.h>
+#include <iostream>
+#include <qradiobutton.h>
+
+#include <kfiledialog.h>
+#include <kstandarddirs.h>
+
+#include "phpinfodlg.h"
+#include "phpconfigwidget.h"
+#include "phpconfigdata.h"
+
+using namespace std;
+
+PHPConfigWidget::PHPConfigWidget(PHPConfigData* data,QWidget* parent, const char* name, WFlags fl )
+ : PHPConfigWidgetBase( parent, name, fl )
+{
+ configData = data;
+ m_phpInfo = "";
+
+ PHPConfigData::InvocationMode mode = configData->getInvocationMode();
+
+ // page "Invocation"
+ if (mode == PHPConfigData::Shell) {
+ callPHPDirectly_radio->setChecked(true);
+ }
+
+ if (mode == PHPConfigData::Web) {
+ callWebserver_radio->setChecked(true);
+ }
+
+ // page webserver
+ QString weburl = configData->getWebURL();
+ if (weburl.isEmpty())
+ weburl = "http://localhost/";
+ weburl_edit->setText(weburl);
+
+ // page shell
+ QString exepath = configData->getPHPExecPath();
+ if (exepath.isEmpty()) {
+ QString fiexepath = KStandardDirs::findExe("php");
+
+ if (exepath.isEmpty())
+ exepath = "/usr/local/bin/php";
+ }
+
+ exe_edit->setText(exepath);
+
+ // page options
+ PHPConfigData::StartupFileMode phpStartupFileMode = configData->getStartupFileMode();
+ QString phpStartupFile = configData->getStartupFile();
+
+ useDefaultFile_edit->setText(phpStartupFile);
+
+ if(phpStartupFileMode == PHPConfigData::Current) {
+ useCurrentFile_radio->setChecked(true);
+ }
+
+ if(phpStartupFileMode == PHPConfigData::Default) {
+ useDefaultFile_radio->setChecked(true);
+ }
+
+ QString includepath = configData->getPHPIncludePath();
+ include_path_edit->setText(includepath);
+
+ codeCompletion_checkbox->setChecked(configData->getCodeCompletion());
+ codeHinting_checkbox->setChecked(configData->getCodeHinting());
+ realtimeParsing_checkbox->setChecked(configData->getRealtimeParsing());
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+PHPConfigWidget::~PHPConfigWidget()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+void PHPConfigWidget::accept()
+{
+ // invocation
+ if (callPHPDirectly_radio->isChecked()){
+ configData->setInvocationMode(PHPConfigData::Shell);
+ }
+ if (callWebserver_radio->isChecked()){
+ configData->setInvocationMode(PHPConfigData::Web);
+ }
+
+ // webserver
+ configData->setWebURL(weburl_edit->text());
+
+ // shell
+ configData->setPHPExePath(exe_edit->text());
+
+ // config
+ configData->setPHPIniPath(ini_edit->text());
+
+ // options
+ configData->setStartupFile(useDefaultFile_edit->text());
+
+ if (useCurrentFile_radio->isChecked()) {
+ configData->setStartupFileMode(PHPConfigData::Current);
+ }
+ if (useDefaultFile_radio->isChecked()){
+ configData->setStartupFileMode(PHPConfigData::Default);
+ }
+
+ configData->setPHPIncludePath(include_path_edit->text());
+ configData->setCodeCompletion(codeCompletion_checkbox->isChecked());
+ configData->setCodeHinting(codeHinting_checkbox->isChecked());
+ configData->setRealtimeParsing(realtimeParsing_checkbox->isChecked());
+
+ configData->storeConfig();
+}
+
+void PHPConfigWidget::slotZendButtonClicked()
+{
+ qWarning( "PHPConfigWidgetBase::slotZendButtonClicked(): Not implemented yet!" );
+}
+
+void PHPConfigWidget::slotAboutClicked()
+{
+ qWarning( "PHPConfigWidget::slotAboutClicked()" );
+ KShellProcess proc("/bin/sh");
+ proc << exe_edit->text();
+ proc << "-m";
+
+ connect( &proc, SIGNAL(receivedStdout (KProcess*, char*, int)),
+ this, SLOT(slotReceivedPHPInfo (KProcess*, char*, int)));
+ proc.start(KProcess::Block,KProcess::Stdout);
+ PHPInfoDlg dlg(this,"phpinfo",true);
+ dlg.php_edit->setText(m_phpInfo);
+ dlg.exec();
+ m_phpInfo = "";
+}
+
+void PHPConfigWidget::slotReceivedPHPInfo (KProcess* /*proc*/, char* buffer, int buflen){
+ m_phpInfo += QCString(buffer,buflen+1);
+}
+
+void PHPConfigWidget::slotPHPExeButtonClicked(){
+ QString exe = KFileDialog::getOpenFileName(QFileInfo(exe_edit->text()).filePath());
+ if (!exe.isEmpty()){
+ exe_edit->setText(exe);
+ }
+}
+
+void PHPConfigWidget::slotPHPIniButtonClicked()
+{
+ QString file = KFileDialog::getOpenFileName(QFileInfo(exe_edit->text()).filePath(), QString("*.ini|INI File (*.ini)"));
+
+ if (!file.isEmpty()){
+ ini_edit->setText(file);
+ }
+}
+
+#include "phpconfigwidget.moc"
diff --git a/languages/php/phpconfigwidget.h b/languages/php/phpconfigwidget.h
new file mode 100644
index 00000000..87bb6ab3
--- /dev/null
+++ b/languages/php/phpconfigwidget.h
@@ -0,0 +1,32 @@
+#ifndef PHPCONFIGWIDGET_H
+#define PHPCONFIGWIDGET_H
+
+#include "phpconfigwidgetbase.h"
+#include <qstring.h>
+class KProcess;
+class PHPConfigData;
+
+class PHPConfigWidget : public PHPConfigWidgetBase
+{
+ Q_OBJECT
+
+public:
+ PHPConfigWidget( PHPConfigData* data,QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~PHPConfigWidget();
+
+public slots:
+ virtual void slotZendButtonClicked();
+ virtual void slotAboutClicked();
+ virtual void slotPHPExeButtonClicked();
+ virtual void slotPHPIniButtonClicked();
+ void accept();
+ void slotReceivedPHPInfo (KProcess* proc, char* buffer, int buflen);
+
+ private:
+ QDomDocument* dom;
+ QString m_phpInfo;
+ PHPConfigData* configData;
+
+};
+
+#endif
diff --git a/languages/php/phpconfigwidgetbase.ui b/languages/php/phpconfigwidgetbase.ui
new file mode 100644
index 00000000..8cfae9dc
--- /dev/null
+++ b/languages/php/phpconfigwidgetbase.ui
@@ -0,0 +1,561 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PHPConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>PHPConfigWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>545</width>
+ <height>510</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>PHP Options</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>TabWidget1</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Genera&amp;l</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup1_2</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Startup</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>useCurrentFile_radio</cstring>
+ </property>
+ <property name="text">
+ <string>Use current file in editor</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>useDefaultFile_radio</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;this file as default:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>useDefaultFile_edit</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox13</cstring>
+ </property>
+ <property name="title">
+ <string>Code Help</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>codeCompletion_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Enable code completion</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>codeHinting_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Enable code &amp;hinting</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox14</cstring>
+ </property>
+ <property name="title">
+ <string>Parser</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_3_3_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>PHP &amp;include path:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>include_path</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>include_path_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>realtimeParsing_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Ena&amp;ble realtime parser</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer11_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>170</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>PixmapLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>In&amp;vocation</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>select_label</cstring>
+ </property>
+ <property name="text">
+ <string>Please select how KDevelop should execute your scripts.</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup3</cstring>
+ </property>
+ <property name="title">
+ <string>Invocation Mode</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>callPHPDirectly_radio</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Ca&amp;lling the PHP interpreter directly</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;font size="+1"&gt;The php executable is called directly. Ideal for developers who want to develop terminal or graphical applications in PHP.
+You need a correctly installed php cgi version.&lt;/font&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter|AlignLeft</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ <property name="vAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>callWebserver_radio</cstring>
+ </property>
+ <property name="text">
+ <string>Using an &amp;existing webserver (local or remote)</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;font size="+1"&gt;Uses an existing webserver. The pages are previewed in
+the internal web browser. Please make sure that the webserver was compiled with PHP support.&lt;/font&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter|AlignLeft</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer18</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>171</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Webserver</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Pro&amp;ject root URL on webserver:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>weburl_edit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>weburl_edit</cstring>
+ </property>
+ </widget>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>Spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Shell</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_3_2</cstring>
+ </property>
+ <property name="text">
+ <string>PHP &amp;executable:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>exe_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>exe_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>exe_button</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>about_button</cstring>
+ </property>
+ <property name="text">
+ <string>About</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="backgroundMode">
+ <enum>PaletteBackground</enum>
+ </property>
+ <property name="text">
+ <string>PHP &amp;Ini File:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ini_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>ini_edit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>phpini_button</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>zend_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Load &amp;Zend extension:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>zend_edit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>zend_button</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>343</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </hbox>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="5423">89504e470d0a1a0a0000000d4948445200000078000000400806000000d14db312000014f649444154789ced9d6d881dd779c77f2a13742edcc24c58c34c90e04e59c18e90c077b1a0bb8e215ec7506d2ca8d649c12b8762af1b48e5b6d0bcd158fe90daca9758fdd2a8812676a08ea50f469b82aa75c0ce2a607bafa9c4bd02891d8144e78217664097cc015fb8c778e0f6c399fbb2ba3377df575bd77f58b4ab997b66cef99f97ff799ee73c77dfd2d2125fe0f38b3f79d02ff00576165f10fc3987f1a05f60a358beb9bfdd796b21d2fffcd27d377d2601504affa9921600adcedf0a40adba07004320babf17f4330c281802913eecf0d14ff76d473d760b7b96e00e914280280884808200cfd3ffd74f8c4af4bf2dd5214da05a6ae0bebe4fa4f7a57f264a979148e2a453a682a457b610600941b062b685109a78612184d8d3a4ef1982976fee6f8ba226d32a16281f03ab2806ee6b35557744c64d856c82fa44a19298962aa0540bd5212651b4125611753f046af55f09e80ed0b9d2eb0ca18a8118d1d76a4258042ba22d8a26c2286015cd3d45f8be07a9a297fdfd6dd3d2849ab626d4143d52a5529ac4468bb0a1909f28e286229431aa090a3dca004d625fd9835d631d18dadd7ba56bea5b99d72c211045075134b1f6c008df7582bba49a60db1605419754a914b15484518b7a28095662e2865a3d5d1a2979bb3af7dcdf5dd4aadf7b842b4856af0956d1c4b45d2ce1307e6cdfae13bd2b0477a65fd3123876414fbd2941715311ae684297ef8648d9590f7940646e04fdc4abeebf82982ed97d845ba6adc92eba8c97776754ef28c11d621d4760164114b532958d1641a4f0ef84049142293d4285c1d6c91cb2dec2363d23bff4bedf95fe496244a200d9d50ec22860d91ef688cba313851d257a47085ebeb9bf2d2c7046b4daeca8d92ea92b522b5883558265cb48c0b14dcac7dccccbea13c5d28d0025d52ecd0afd844b50318208a5e2ee0ce5d81eb6edf1e8635fde11a2b795e00eb166110ae956226c48828f157e3d4636f574b5ada4f62381d3cf4d12dc59228c02307a0dac9462eac9698215c1fce51a62532a6c2be83c504122a1194012a33ed36d621ff4700f94b79de86d696abd6755980fa9ae41200c23fc7a4b8fd644576fc7880548c01c3111a2c50ba75f40350737c0ee011765783bf812c3d0791f01860da60d8944347d542ba41ed4a80735829572fbf0e8d4b609b22d37b95e6725a2a0898d4285bf12134629b1db3d0de74001ce8845184599e40a21281f9be4c2e5e0018bb6be77334c3027104589ba570555c7f717a9dfa91144d36daf54def2166bd355ed8c5a0c6d1694b12288f488ed2ae0dd6cc8041c5b107dec675e764b368e691236e2cded91770429d98689e94ca19a11dcabd2523e4b575f27743de2e6a9f65684d8a628a8d6f6b73142045a15072b2d8295540defa84a1d0efb218babd7b309f6c60e133414aac91edc7669cb9928da88e214341c54b884efd7083e0e881a73eda74ffcd9a648deb037a97aaddd6e25210071b345f56e8c7f57f6c87d401006584558aa648b46cff3083b5bb23d89745b85c0b4cb38eed388a2896c442cfcf62cbffae5efdb9b2975439454afb5db2d620062c9ea513b0c6bec4dd78bdc3d6c02c2148822f8b7f3a6688ffac7714af090497ac8d2b22d7d63cda52bb5099836eed139027f917065918577cf13c5617be6f8dc86d6e57513fc61a5d556498c1002d950040dd55d6b8722015114cc3ee95128167ab6e375a295768e288c09ea2141a4d7fcfe4652803b6211ae04482907cad002ab8cc2c173adcc670044f76282ba36912aa5566fa51298faaa8b77c8d9741d946a110412bf1ea29a6af8562dd11dd13d3a8d1016feadb758fae002a80878a9bd5e92d745f08795565b36638480a8a108a3f5afb52a81a9475c94f239f72fe7b1526bd6baf025813d62e2d82ee56393cc1e9fc48f140beff8f877c3de884ec03d6022ef658f5e9528beffc3ef673e5b1404a669e2d80e9e57e6f4b7c75149994beff854ae07bd8e2404b327ca5cb8f806972e5fda503d3acf70473da68e4d32736292cab590c58f02dd9172db514122700f4d0050bbfe3a8b7f5800e0f0d1efafebd96b52d42117404a4528d7f3a9d5700f5a5cba789eabef5dddd807ef837dc066e6c434a79e9963e2d824177e5bedda7a4dcba256c9269884753f5b1405d35f9fe2f9ef7c8f716f92d7df5e4225e09a7ab8bd75f12d2a1f55b6540fef88c7ccc919661e9fa67647e1df0e878c66854a044e4a72e50fe759f8dd3ca6e5b65ffcbba7d71cc5434556f55abb2d65a81de22a2577831042dba17d3fa7f137806825e2df7ef1064f4c3f8192554effcda4de6818e098f9026b23504dc5fc7f2ef0d4f413c48d2a332726514d855b7200f0ef6ebd1efe2d9fb3af9ce5e51f9f62e2287863ce1a1a452f87aef738e53f9f05e0c2c573fce6e2876b0aaf5c82976fee6f878db0eb3cdf0cb92469448610f877834d14900dd5547c73f69bc42b55a6bfe621841658b51bb56d7b06c08bfff8225e09ec1193926be1dfae211b9b69886cf8b7ebbcf8f773940fadf6836743a194c43d3a4df991694093fce1fb7f1c4a72ee641b4a8952ba32a1dabc69c0322d6423208aa2cceba55209cb5c2d7c948a091b520ba6bc9e9dc00f7efc037e73e18adefec830536041c78429063e2f9b32d3ead541b412e1dfaae28d39b8b6c9c23b97b26f34c01bf310fdb6ef44d1522d64a71e39a8dfad33fff639a69e7a8985f7fc75d9c8bdf22c41bd8a6c44cc5f3ec7a38f9dcdbd3793e06a6d7f5b369653f52736ac1a3b500978a326b55a25b30c210497e6af60994e379eaa1f41dd67feedb778e3cd37323fefdff2a9551639757296c577e733efb16d9bea7f2fa112d155cb5d248adab525cebc7286fadd7a661da230c239e8619902ff56f6f4fcf85727b874e10aa1ccea2c0aff5695f3ff9eaf4116de5d64faa9d388a21808181840a2edfde5474e71f577e7a87c54e1ca3bffd3fec6f16c434826c1b10cbb8db1d5fdabed585cbd9e3d3d7b473c44d1e2d57f5decba0fa1e7e4770f389c79f9e778632e3ff8d1cb99652c7db0c8dc77e608ead9d3b377c4239482f3bfce5e9f674e4cf1eacbaff2ec5f3f9b5b07b3584018f93a62f2b129966e49de787b69d54cd1a9c7f81197b7fee30a2ffec3b3ccbf3d3ff079d990d46e54714cafb743190295289c431394ee4e50bf5b61e19d0b7ce3f899cc7b07d6e0e59bfbdba194a844abb74d4637016924e2108135f5d8144a69754ea2b425416941a79a8adaad80d77eb9c8d4f15398a6995946106aabdad2b56ae675ef908b944a478a3457ffc8a662e1dd2ae6434e6ea39aa68935a2475650cfe9a8a31ed1bdd4c7ab06ebb1f05e8db77e5be3f9e74ee7b655abe9774375d70301b8a39300f8b79772d7e20182e3a64435d3b8e26e84e126908030046651b07c7739f3166fcc236c740cee833f4268f29502e7809359866a2ae230ce1558eea847d868653f03700f58a8669cbd0c19603ee4600a81bf92af23cc871ced64c9a80306984541b0126365698114526ecc39a312700e96114513d594d46e644fff03044bd54a0bd8bacfc53205b21912ad64378c7dd0a51ec4c30be9543a69655eb64c8b200ab2c592019e378eef47b9264ed775f0fdecce619a26ce884d4108fcda907b6c9bb0d11a3ad715d622cf101b5c0ef55aec8da5a3f84ef62c393882a5ec7bd0e6495689dedff9b55aa6815f14058e6db3dcb1486521d1424c0808f23a896313d483cc67d823366ec9cb77111a6099f9f6ebf2c36554524008a8dec871628c7928554049993bcd2bc0342de228cc757698238326d4f5c01cd1010c71237bf91820783bbd2db663e5369e37eaa192825e7f87348c6b6b1b73de76c61b73893ece26df1b73f53ad827e0fad133c26437cee4c4240a315c604d4c1237d710a309b8ae493da8675f3774b449dc6c6dc84aa880c29fa681168d30f39e4143c75a327d9de8b8ef8220bb612626cac4728d0e9580e739d4aee55ba8bca3932c7db4987dcdf3f4c987ac6724bdb34d79e2c93de076efc933d47863a9c01a026180572ab0f0ce42e6f5d28112aeebe95960c348c5670e6f3b73ba30e98c0e41f556b6c03a3c368e6c66afaba085a86d9b782578fdd7af67dee31df1987cb8cce2fbd91dc02db93d81757ff9806b3b0477abd98608436b04530882153f5760d907dda15b1ba5a0fcb08b6a862cbc974df0f8b1718270d37276280609de26a7bd280e175825b74410a40d9bf47eb45b0d4c5370fab9492e5c7c9d7abd9e59c6ec33b3a8441245d93ddf3b3a897f6788c03a64e2dfcc9e61cc624f60d5aed5b20d35a98e08a238b71edea8c3a99365cefef46cae529ffefa0c7e7d8ba14446f6a707aa2e0c812266ab02ebf0a843e0fbf902eb80cbd55a84288adee90543e08e14f00ed94c3eec70e9edf39c7d25db0ce78d9538f3e3335cb97c25737a32474cdc92cbfcbbd5dc9a38230516739c07e587bdaec0cad511631e5000a57ab66443cf5eee010bef90c3e192e0cc8f5e60e177d9a377e6e40c143da4f4371cc32680d6277a0099c56c3bc1409156d1a4e31edc0a4a072d2a57b3b716f6888d655acc9e2c40e2ae7a1325437cbfc2d37f759edaf51ce78101affcf36b00b95b1c6fd4ebda1c72059600ff4ef6da3a5eee09aceacd6c234af96819f780cde9e7c657bd1b498b308af06b6ff1e277f267a0d26889d967bec7c2d5609387e5840ea207ac916c3bc1e0082e5a40a04785b1c95521155879c2a4be52677cfcf0c0d395ea1d6319869f9d7d056774922bef06f8b773c4cf2117a9188ccc8034caa4e3e5ca0bf1e909ac20a71e172e5e60fef2a0e95135d78efd1242f0da4f5fa376471fbadb4c04aa528ae0b61698ee81ec78efcc112c843e67ab2701938d2eff1df75dae0f3861a887251706bcf29357983a3ec7f937abcc7deb30954ab6f37d9505eb3e74b65f41ddcf75ffd9076d4c21081b51aec0ea76c80dc2b66d5efdc96b449fb8f8b7d7e7411a802190514014d5c180f2b1a9ccdb0644d678f9d37d8e69039d73b01bac40a24d7324addcedc766501a2df15ff3ffc5d4f139cefd62290da8cf7f8677d423b893637c48c03b64e3dfcc56dfa228700f78a9c05ada56dbc0e35f9be0576f5c214e5c163fd824b9e8a11706da3ce98d4db0216f9233e21036027d1aced8d8285668fbae7fb336d4d7ba2e18503e5266e65b339c7a668ea51b316ffc62318dc17208ead922ce1c317147c759a8ac21b02ee7ef6d3b026b3b8208445130f1489953cfcce17a532cbcbb4cb022377f3eca10445140ed869e9e271e9bc9bf35eb3fc78feddb1736dc76d808d0e7e83ba1a6eb202cb5efd62ad9aad1344da69e9cca5d734cd3c4322d1d68572e63da2e415df1da2fab44916e1495683bb71016337f39dd3d36031d13a95e8ff282dc85a10fc87963eee0e75b8a9993b3c40a5cf2455869b4c4d4c4a43e9c3e50be4014059669e1963cbc7219128ba55ac8e29b4bba3537bd49d11f5caecd43a2f08e4cf0c2b71fcd8dcdca5dda1ddbd59e25d5d932adf38dd2f8a8f91cf1327d7c8ad7cefd06ff6ef6ba063a1b4e742f66feaa246c2ce91053a3d728c280eaad80a79f1ce7f40f7f3e20ca84018bef87a8245bbc2860b11232fed829c6274e0dbc3f0afc2066f288cdf2ed6c057dfabba7993e3e4794b386b79476dc841f4b5e7f3b444abf17c2945bf3b52184c0afcd53bf5b0143307d626ee8fdb9048f973fdd1737dd76508f11c4e9d85d7baaee09acec9e5f7e6482c5eb01172e567404c3fde823ab13163bd0db0d900dc5f9379772d7d86101e6c280ca8d80caf5ec8368aaa9987daa8c5251aea106c3e2dcaf97b448bbbf8cfe0e67f49dacdca21149089368c5a7f2c10500a69f7a9ea74f1c1e1a5939f4914f3c56d877a5994ed5499caec743a6ea34c81df2a30fdd832ed13dedeaca2460bd8d30ec84c03aca18dae042e07a0e4b1f650b2c1d7c60e707afefc0111e610864a3cee23b67bb53f3ccf139e0d3a19f5bd316fd8de35fd967998e9e2209a1bb1e0fa2bbfdb85dcd3dc2e9945c2d30f6dc01b01e8400d74e63c932608e98148a56e6fabb23ef6308a48c58b8fc2aaa2929953c9e7feed5751d615997b3c12b7958a6b6946892259924a7de9f5c07fa888910167163eb96b21d43c7076d0c71231e1bef66cddb6908611245010bbf3d839211a592c7dc777fb6eedc1eeb1a47baa7786dbfae03f256afc9b02a4f94996ff9999c9844cacd5b6e76039d734e30cc065d463677fa4d74270bfcab5cfdc37950aa4bee131b48f3b0ee66ee901cac08c246d04d15a430e9accba2a8edbbb51c0f4df9e1327193f51d5a7b5048c02b992815e51a5184e910463b77905c1802a514b56b17a85dd7db4defc804cf3ff7ea86b3f26ca8990f1ffd74dfe1a35fe1f757453b58f1811682160a0b9234a34e5130f7dc1cb10cb93fadd0f4f169162bd991077b09a6251086c94bfff4d2c03551145845975a23dcfe4e9a26438da280eafbe7b5191298fe8be79939797a53e91c369d65e7c34aab1dac045d6f06145089895b72f03c3be3e541de532ce59cc0df33487702e3475c4c2b7b8cd66a0161941f83b571e86cb652460437e7bba3d61cb1997de67b3cfb4cbe21632d6c298dd2f2cdfded200a74caa2142ab1864664ee7efaa24d60d792a9e9594f2945706791daf5f96ec872f9916966bff5b75b4eabb42d79b23eacb4da511410f7f9911516ab2d607b3575c283409aca5129c28f6bf8372e75a7e352c963fac4f35b1ab5fdd8d64468bf7fff8fed70c55fd5fbbf20ba0f9db09a4411063582db0b44517a085c08664e9e66f2abb3db9ac772db5319566bfbdbb10c091b51dffa0c50407589feff42762fe92a89423642e27b3eb2e11346da13668fb81c7ef8712626a637b4fd592f762c19e9f24d4d74d488564ddd1a5964c3ff7dc27b7159803e38df94c4f70264c32796cbdd88156bc465e2d834e38f4cef68e6d95d4927fc61a5d596322696418678e9271b062d647b99f4be7735e8a60f963286cf02e2868f52fa0c722b6961152d1cbb8c579ec22b79bb92287c5713827747b594b49a618e525d8bf00e768bf861b25f75d35b2815c22721ad449fc2e82431174260991ea5431e874727773d29f8034be95faded6fb79a21b229899b2a5daffb49eb34ac3e52a90608dfcdfd56fa5e492707740b54846cb52089f47743a47a432502ab68615a2e8e6de396769fd47e3cd0ef6ce860f9e6feb6528ab819239b125448abf34d2899c823fffeebeb415fa7ea3f2edb39cda8527f709212f899ea799112a5ad4f86c0b49c34a3bb875574762da3fb5ad81304df8f0ee12da50957890215f748df0e37dd7d65a8fee3a95d02d36b694e67f1250142870a092128145dec11878230f70ca1f7634f9afcb5f8d8077c39fd49494fa0a5746a7cad4655977c80d67ddf91001916a99cce213aa7eb8d3410c110140c01c24a63ac867d8bca70a7fb83c49e24380bbd462dd0999a1f0cf62e9959f8e2bb0b3fe7f882e0cf39fe17a14b594f9ff48c020000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>about_button</sender>
+ <signal>clicked()</signal>
+ <receiver>PHPConfigWidgetBase</receiver>
+ <slot>slotAboutClicked()</slot>
+ </connection>
+ <connection>
+ <sender>exe_button</sender>
+ <signal>clicked()</signal>
+ <receiver>PHPConfigWidgetBase</receiver>
+ <slot>slotPHPExeButtonClicked()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>TabWidget1</tabstop>
+ <tabstop>useCurrentFile_radio</tabstop>
+ <tabstop>useDefaultFile_edit</tabstop>
+ <tabstop>codeCompletion_checkbox</tabstop>
+ <tabstop>codeHinting_checkbox</tabstop>
+ <tabstop>include_path_edit</tabstop>
+ <tabstop>realtimeParsing_checkbox</tabstop>
+ <tabstop>callPHPDirectly_radio</tabstop>
+ <tabstop>callWebserver_radio</tabstop>
+ <tabstop>weburl_edit</tabstop>
+ <tabstop>exe_edit</tabstop>
+ <tabstop>exe_button</tabstop>
+ <tabstop>ini_edit</tabstop>
+ <tabstop>phpini_button</tabstop>
+ <tabstop>zend_checkbox</tabstop>
+ <tabstop>zend_edit</tabstop>
+ <tabstop>zend_button</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot>slotAboutClicked()</slot>
+ <slot>slotPHPExeButtonClicked()</slot>
+ <slot>slotPHPIniButtonClicked()</slot>
+ <slot>slotZendButtonClicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/php/phperrorview.cpp b/languages/php/phperrorview.cpp
new file mode 100644
index 00000000..011e8b77
--- /dev/null
+++ b/languages/php/phperrorview.cpp
@@ -0,0 +1,422 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "phperrorview.h"
+#include "phpsupportpart.h"
+
+#include <kdevpartcontroller.h>
+#include <kdevmainwindow.h>
+#include <kdevproject.h>
+
+#include <kdeversion.h>
+#include <kparts/part.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/document.h>
+#include <ktexteditor/markinterface.h>
+
+#include <ktexteditor/markinterfaceextension.h>
+#include <ktexteditor/view.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstatusbar.h>
+#include <kurl.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kdialogbase.h>
+
+#include <kconfig.h>
+
+#include <qtimer.h>
+#include <qregexp.h>
+#include <qvbox.h>
+#include <qfileinfo.h>
+#include <qwhatsthis.h>
+#include <qtabbar.h>
+#include <qwidgetstack.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+
+class ProblemItem: public KListViewItem
+{
+public:
+ ProblemItem( QListView* parent, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : KListViewItem( parent, problem, file, line, column ) {}
+
+ ProblemItem( QListViewItem* parent, const QString& problem,
+ const QString& file, const QString& line, const QString& column )
+ : KListViewItem( parent, problem, file, line, column ) {}
+
+ int compare( QListViewItem* item, int column, bool ascending ) const {
+ if( column == 2 || column == 3 ){
+ int a = text( column ).toInt();
+ int b = item->text( column ).toInt();
+ if( a == b )
+ return 0;
+ return( a > b ? 1 : -1 );
+ }
+ return KListViewItem::compare( item, column, ascending );
+ }
+
+};
+
+PHPErrorView::PHPErrorView( PHPSupportPart* part, QWidget* parent, const char* name )
+ : QWidget( parent, name ? name : "problemreporter" ),
+ m_phpSupport( part ),
+ m_document( 0 ),
+ m_markIface( 0 )
+{
+ QWhatsThis::add(this, i18n("<b>Problem reporter</b><p>This window shows various \"problems\" in your project. "
+ "It displays TODO entries, FIXME's and errors reported by a language parser. "
+ "To add a TODO or FIXME entry, just type<br>"
+ "<tt>//@todo my todo</tt><br>"
+ "<tt>//TODO: my todo</tt><br>"
+ "<tt>//FIXME fix this</tt>"));
+
+ m_gridLayout = new QGridLayout(this,2,3);
+
+ m_errorList = new KListView(this);
+ m_fixmeList = new KListView(this);
+ m_todoList = new KListView(this);
+ m_filteredList = new KListView(this);
+ m_currentList = new KListView(this);
+
+ m_filteredList->addColumn( i18n("Level") );
+ m_currentList->addColumn( i18n("Level") );
+
+ //addColumn( i18n("Level") );
+ InitListView(m_errorList);
+ InitListView(m_fixmeList);
+ InitListView(m_todoList);
+ InitListView(m_filteredList);
+ InitListView(m_currentList);
+ m_currentList->removeColumn(1);
+
+ m_widgetStack = new QWidgetStack(this);
+ m_widgetStack->addWidget(m_currentList,0);
+ m_widgetStack->addWidget(m_errorList,1);
+ m_widgetStack->addWidget(m_fixmeList,2);
+ m_widgetStack->addWidget(m_todoList,3);
+ m_widgetStack->addWidget(m_filteredList,4);
+
+ m_tabBar = new QTabBar(this);
+ m_tabBar->insertTab(new QTab(i18n("Current")),0);
+ m_tabBar->insertTab(new QTab(i18n("Errors")),1);
+ m_tabBar->insertTab(new QTab(i18n("Fixme")),2);
+ m_tabBar->insertTab(new QTab(i18n("Todo")),3);
+ m_tabBar->insertTab(new QTab(i18n("Filtered")),4);
+ m_tabBar->setTabEnabled(0,false);
+ m_tabBar->setTabEnabled(4,false);
+
+ m_tabBar->setCurrentTab(0);
+
+ m_filterEdit = new KLineEdit(this);
+
+ QLabel* m_filterLabel = new QLabel(i18n("Lookup:"),this);
+
+ m_gridLayout->addWidget(m_tabBar,0,0);
+ m_gridLayout->addMultiCellWidget(m_widgetStack,1,1,0,2);
+ m_gridLayout->addWidget(m_filterLabel,0,1,Qt::AlignRight);
+ m_gridLayout->addWidget(m_filterEdit,0,2,Qt::AlignLeft);
+
+ connect( m_filterEdit, SIGNAL(returnPressed()), this, SLOT(slotFilter()) );
+ connect( m_filterEdit, SIGNAL(textChanged( const QString & )), this, SLOT(slotFilter()) );
+ connect( m_tabBar, SIGNAL(selected(int)), this, SLOT(slotTabSelected(int)) );
+ connect( part->partController(), SIGNAL(activePartChanged(KParts::Part*)), this, SLOT(slotActivePartChanged(KParts::Part*)) );
+ connect( part->partController(), SIGNAL(partAdded(KParts::Part*)), this, SLOT(slotPartAdded(KParts::Part*)) );
+ connect( part->partController(), SIGNAL(partRemoved(KParts::Part*)), this, SLOT(slotPartRemoved(KParts::Part*)) );
+
+ slotActivePartChanged( part->partController()->activePart() );
+}
+
+void PHPErrorView::slotFilter()
+{
+ if(!m_tabBar->isTabEnabled(4))
+ m_tabBar->setTabEnabled(4,true);
+
+ m_tabBar->tab(4)->setText(i18n("Filtered: %1").arg( m_filterEdit->text() ));
+ m_tabBar->setCurrentTab(4);
+
+ m_filteredList->clear();
+
+ filterList(m_errorList,i18n("Error"));
+ filterList(m_fixmeList,i18n("Fixme"));
+ filterList(m_todoList,i18n("Todo"));
+
+}
+
+void PHPErrorView::filterList(KListView* listview, const QString& level)
+{
+ QListViewItemIterator it( listview );
+ while ( it.current() ) {
+ if ( it.current()->text(3).contains(m_filterEdit->text(),false))
+ new KListViewItem(m_filteredList,level,
+ it.current()->text(0),it.current()->text(1),it.current()->text(2),it.current()->text(3));
+ ++it;
+ }
+}
+
+void PHPErrorView::slotTabSelected( int tabindex )
+{
+ m_widgetStack->raiseWidget(tabindex);
+}
+
+void PHPErrorView::InitListView(KListView* listview)
+{
+ listview->addColumn( i18n("File") );
+ listview->addColumn( i18n("Line") );
+ listview->addColumn( i18n("Column") );
+ listview->addColumn( i18n("Problem") );
+ listview->setAllColumnsShowFocus( TRUE );
+
+ connect( listview, SIGNAL(executed(QListViewItem*)),
+ this, SLOT(slotSelected(QListViewItem*)) );
+
+ connect( listview, SIGNAL(returnPressed(QListViewItem*)),
+ this, SLOT(slotSelected(QListViewItem* )) );
+
+}
+
+PHPErrorView::~PHPErrorView()
+{
+}
+
+void PHPErrorView::slotActivePartChanged( KParts::Part* part )
+{
+ if ( !part ) {
+ m_tabBar->setTabEnabled(0,false);
+ return;
+ }
+
+ if ( m_document )
+ disconnect( m_document, 0, this, 0 );
+
+ m_document = dynamic_cast<KTextEditor::Document*>( part );
+ m_markIface = 0;
+
+ if ( !m_document ) {
+ m_tabBar->setTabEnabled(0,false);
+ return;
+ }
+
+ m_fileName = m_document->url().path();
+
+ initCurrentList();
+
+ m_markIface = dynamic_cast<KTextEditor::MarkInterface*>( part );
+}
+
+void PHPErrorView::removeAllItems( QListView* listview, const QString& filename )
+{
+ QListViewItem* current = listview->firstChild();
+ while( current ){
+ QListViewItem* i = current;
+ current = current->nextSibling();
+
+ if( i->text(0) == filename )
+ delete( i );
+ }
+}
+
+void PHPErrorView::removeAllProblems( const QString& filename )
+{
+ QString relFileName = filename;
+ relFileName.remove(m_phpSupport->project()->projectDirectory());
+
+ kdDebug(9008) << "PHPErrorView::removeAllProblems()" << relFileName << endl;
+
+ if (filename == m_fileName)
+ m_currentList->clear();
+
+ removeAllItems(m_errorList,relFileName);
+ removeAllItems(m_fixmeList,relFileName);
+ removeAllItems(m_todoList,relFileName);
+
+ if ( m_document && m_markIface ) {
+ QPtrList<KTextEditor::Mark> marks = m_markIface->marks();
+ QPtrListIterator<KTextEditor::Mark> it( marks );
+ while( it.current() ) {
+ m_markIface->removeMark( it.current()->line, KTextEditor::MarkInterface::markType07 );
+ ++it;
+ }
+ }
+}
+
+void PHPErrorView::initCurrentList()
+{
+ m_tabBar->setTabEnabled(0,true);
+
+ QString relFileName = m_fileName;
+
+ if (m_phpSupport->project())
+ relFileName.remove(m_phpSupport->project()->projectDirectory());
+
+ m_currentList->clear();
+
+ updateCurrentWith(m_errorList, i18n("Error"),relFileName);
+ updateCurrentWith(m_fixmeList,i18n("Fixme"),relFileName);
+ updateCurrentWith(m_todoList,i18n("Todo"),relFileName);
+}
+
+void PHPErrorView::updateCurrentWith(QListView* listview, const QString& level, const QString& filename)
+{
+ QListViewItemIterator it(listview);
+ while ( it.current() ) {
+ if ( it.current()->text(0) == filename)
+ new QListViewItem(m_currentList,level,it.current()->text(1),it.current()->text(2),it.current()->text(3));
+ ++it;
+ }
+}
+
+void PHPErrorView::slotSelected( QListViewItem* item )
+{
+ bool is_filtered = false;
+ bool is_current = false;
+
+ if (item->listView() == m_filteredList)
+ is_filtered = true;
+ else if(item->listView() == m_currentList)
+ is_current = true;
+
+ KURL url( is_current ? m_fileName : item->text(0 + is_filtered) );
+ int line = item->text( 1 + is_filtered).toInt();
+ m_phpSupport->partController()->editDocument( url, line-1 );
+}
+
+void PHPErrorView::reportProblem( int level, const QString& fileName, int line, const QString& text)
+{
+ int markType = levelToMarkType( level );
+ if ( markType != -1 && m_document && m_markIface && m_fileName == fileName ) {
+ m_markIface->addMark( line, markType );
+ }
+
+ QString msg = text;
+ msg = msg.replace( QRegExp("\n"), "" );
+
+ QString relFileName = fileName;
+ relFileName.remove(m_phpSupport->project()->projectDirectory());
+
+ KListView* list;
+ switch( level )
+ {
+ case Error:
+ case ErrorNoSuchFunction:
+ case ErrorParse:
+ list = m_errorList;
+ m_tabBar->setCurrentTab(m_tabBar->tab(1));
+ break;
+
+ case Warning:
+ list = m_errorList;
+ break;
+
+ case Todo:
+ list = m_todoList;
+ break;
+
+ case Fixme:
+ list = m_fixmeList;
+ break;
+
+ default:
+ list = NULL;
+ break;
+ }
+
+ if (list) {
+ kdDebug(9018) << "PB " << msg << endl;
+ new ProblemItem( list, relFileName, QString::number( line + 1 ), 0, msg );
+ }
+
+ if (fileName == m_fileName)
+ new QListViewItem(m_currentList, levelToString( level ), QString::number( line + 1 ), 0, msg);
+}
+
+void PHPErrorView::slotPartAdded( KParts::Part* part )
+{
+ KTextEditor::MarkInterfaceExtension* iface = dynamic_cast<KTextEditor::MarkInterfaceExtension*>( part );
+
+ if ( !iface )
+ return;
+
+ iface->setPixmap( KTextEditor::MarkInterface::markType07, SmallIcon("stop") );
+}
+
+void PHPErrorView::slotPartRemoved( KParts::Part* part )
+{
+ kdDebug(9007) << "PHPErrorView::slotPartRemoved()" << endl;
+ if ( part == m_document ){
+ m_document = 0;
+ }
+}
+
+QString PHPErrorView::levelToString( int level ) const
+{
+ switch( level )
+ {
+ case ErrorNoSuchFunction:
+ return QString( i18n("Undefined function") );
+
+ case ErrorParse:
+ return QString( i18n("Parse Error") );
+
+ case Error:
+ return QString( i18n("Error") );
+
+ case Warning:
+ return QString( i18n("Warning") );
+
+ case Todo:
+ return QString( i18n("Todo") );
+
+ case Fixme:
+ return QString( i18n("Fixme") );
+
+ default:
+ return QString::null;
+ }
+
+}
+
+int PHPErrorView::levelToMarkType( int level ) const
+{
+ switch( level )
+ {
+ case ErrorNoSuchFunction:
+ case ErrorParse:
+ case Error:
+ return KTextEditor::MarkInterface::markType07;
+
+ case Warning:
+ return -1;
+
+ case Todo:
+ return -1;
+
+ case Fixme:
+ return -1;
+
+ default:
+ return -1;
+ }
+
+}
+
+#include "phperrorview.moc"
diff --git a/languages/php/phperrorview.h b/languages/php/phperrorview.h
new file mode 100644
index 00000000..bc8b0df5
--- /dev/null
+++ b/languages/php/phperrorview.h
@@ -0,0 +1,104 @@
+/*
+ Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef PHPERRORVIEW_H
+#define PHPERRORVIEW_H
+
+#include <klistview.h>
+#include <klineedit.h>
+#include <qguardedptr.h>
+#include "phpfile.h"
+
+class PHPSupportPart;
+class QTimer;
+class QTabBar;
+class QWidgetStack;
+class QGridLayout;
+class KDialogBase;
+class Problem;
+class KURL;
+
+namespace KParts{
+ class Part;
+}
+
+namespace KTextEditor{
+ class MarkInterface;
+ class Document;
+}
+
+
+enum Errors
+{
+ Error = 0,
+ ErrorParse = 1,
+ ErrorNoSuchFunction = 2,
+ Warning = 3,
+ Todo = 4,
+ Fixme = 5
+};
+
+class PHPErrorView: public QWidget {
+Q_OBJECT
+public:
+ PHPErrorView( PHPSupportPart* part, QWidget* parent=0, const char* name=0 );
+ virtual ~PHPErrorView();
+
+ void removeAllProblems( const QString& filename );
+ void reportProblem( int level, const QString& fileName, int line, const QString& text);
+
+private slots:
+ void slotPartAdded( KParts::Part* );
+ void slotPartRemoved( KParts::Part* );
+ void slotActivePartChanged( KParts::Part* );
+ void slotSelected( QListViewItem* );
+ void slotTabSelected( int tabindex );
+ void slotFilter();
+
+private:
+ QString levelToString( int level ) const;
+ int levelToMarkType( int level ) const;
+ void InitListView(KListView* listview);
+ void removeAllItems( QListView* listview, const QString& filename );
+ void filterList(KListView* listview, const QString& level);
+ void updateCurrentWith(QListView* listview, const QString& level, const QString& filename);
+ void initCurrentList();
+
+private:
+ QGridLayout* m_gridLayout;
+ QTabBar* m_tabBar;
+ QWidgetStack* m_widgetStack;
+ KListView* m_currentList;
+ KListView* m_errorList;
+ KListView* m_fixmeList;
+ KListView* m_warningList;
+ KListView* m_todoList;
+ KListView* m_filteredList;
+ KLineEdit* m_filterEdit;
+
+ PHPSupportPart* m_phpSupport;
+ QGuardedPtr<KTextEditor::Document> m_document;
+ KTextEditor::MarkInterface* m_markIface;
+ QTimer* m_timer;
+ QString m_fileName;
+ int m_active;
+ int m_delay;
+};
+
+#endif
diff --git a/languages/php/phpfile.cpp b/languages/php/phpfile.cpp
new file mode 100644
index 00000000..afd741bd
--- /dev/null
+++ b/languages/php/phpfile.cpp
@@ -0,0 +1,639 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kapplication.h>
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+
+#include <urlutil.h>
+#include <kprocess.h>
+#include <kdebug.h>
+
+#include <kdevpartcontroller.h>
+
+#include "phphtmlview.h"
+#include "phperrorview.h"
+
+#include "phpfile.h"
+
+using namespace std;
+
+PHPFile::PHPFile(PHPSupportPart *phpSupport, const QString& fileName)
+{
+ m_fileinfo = new QFileInfo(fileName);
+ m_part = phpSupport;
+ modified = true;
+ inClass = FALSE;
+ inMethod = FALSE;
+
+ /*
+ phpCheckProc = new KShellProcess("/bin/sh");
+ connect(phpCheckProc, SIGNAL(receivedStdout (KProcess*, char*, int)), this, SLOT(slotReceivedPHPCheckStdout (KProcess*, char*, int)));
+ connect(phpCheckProc, SIGNAL(receivedStderr (KProcess*, char*, int)), this, SLOT(slotReceivedPHPCheckStderr (KProcess*, char*, int)));
+ connect(phpCheckProc, SIGNAL(processExited(KProcess*)), this, SLOT(slotPHPCheckExited(KProcess*)));
+ */
+}
+
+PHPFile::~PHPFile()
+{
+ if (m_fileinfo)
+ delete m_fileinfo;
+
+// delete phpCheckProc;
+}
+
+QStringList PHPFile::getContents()
+{
+ return m_contents;
+}
+
+QString PHPFile::fileName() {
+ return m_fileinfo->filePath();
+}
+
+QStringList PHPFile::readFromEditor()
+{
+ QStringList contents;
+
+ kapp->lock();
+ QPtrList<KParts::Part> parts( *m_part->partController()->parts() );
+ QPtrListIterator<KParts::Part> it( parts );
+ while( it.current() ){
+ KTextEditor::Document* doc = dynamic_cast<KTextEditor::Document*>( it.current() );
+ ++it;
+
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( doc );
+ if ( !doc || !editIface || doc->url().path() != fileName() )
+ continue;
+
+ contents = QStringList::split("\n", editIface->text().ascii(), true);
+ break;
+ }
+ kapp->unlock();
+
+ return contents;
+}
+
+QStringList PHPFile::readFromDisk()
+{
+ QStringList contents;
+ QFile f( fileName() );
+
+ if (f.open(IO_ReadOnly)) {
+ QTextStream stream( &f );
+ QStringList list;
+ QString rawline;
+ while (!stream.eof()) {
+ rawline = stream.readLine();
+ contents.append(rawline.stripWhiteSpace().local8Bit());
+ }
+ f.close();
+ }
+ return contents;
+}
+
+bool PHPFile::isModified() {
+ return modified;
+}
+
+void PHPFile::setModified(bool value) {
+ modified = value;
+}
+
+void PHPFile::Analyse() {
+
+ postEvent( new FileParseEvent( Event_StartParse, this->fileName() ) );
+
+ inClass = FALSE;
+ inMethod = FALSE;
+/*
+ m_contents = readFromEditor();
+
+ if (m_contents.isEmpty())
+*/
+ m_contents = readFromDisk();
+
+ ParseSource();
+
+ PHPCheck();
+ modified = false;
+
+ postEvent( new FileParseEvent( Event_EndParse, this->fileName() ) );
+}
+
+bool PHPFile::ParseClass(QString line, int lineNo) {
+ if (line.find("class ", 0, FALSE) == -1)
+ return FALSE;
+
+ QRegExp Class("^[ \t]*(abstract|final|)[ \t]*class[ \t]+([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*(extends[ \t]*([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))?.*$");
+ Class.setCaseSensitive(FALSE);
+
+ if (Class.search(line) != -1) {
+ if (AddClass(Class.cap(2), Class.cap(4), lineNo) == FALSE)
+ return FALSE;
+
+/// @fixme Activate when it exists in ClassModel
+// if (Class.cap(1).lower() == "abstract")
+// SetClass("abstract");
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool PHPFile::ParseFunction(QString line, int lineNo) {
+ if (line.find("function", 0, FALSE) == -1)
+ return FALSE;
+
+ QRegExp function("^[ \t]*(final|abstract|static|)[ \t]*(public|private|protected|)[ \t]*(static|)[ \t]*function[ \t&]*([_a-zA-Z\x7f-\xff][_a-zA-Z0-9\x7f-\xff]*)[ \t]*\\(([_a-zA-Z\x7f-\xff]*[_$, &'\\\"0-9A-Za-z\x7f-\xff\t-=]*)\\).*$");
+ function.setCaseSensitive(FALSE);
+
+ if (function.search(line) != -1) {
+ if (AddFunction(function.cap(4), function.cap(5), lineNo) == FALSE)
+ return FALSE;
+
+ if (function.cap(3).lower() == "static" || function.cap(1).lower() == "static")
+ SetFunction("static");
+
+ if (function.cap(1).lower() == "abstract") {
+ SetFunction("abstract");
+ CloseFunction( lineNo );
+ return FALSE;
+ }
+
+/// @fixme Activate when it exists in FunctionModel
+// if (function.cap(1).lower() == "final")
+// SetFunction("final");
+
+ if (function.cap(2).lower() == "private")
+ SetFunction("private");
+
+ if (function.cap(2).lower() == "public" || function.cap(2).isEmpty())
+ SetFunction("public");
+
+ if (function.cap(2).lower() == "protected")
+ SetFunction("protected");
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool PHPFile::ParseVariable(QString line, int lineNo) {
+ if (line.find("var") == -1 && line.find("public") == -1 && line.find("private") == -1 && line.find("protected") == -1)
+ return FALSE;
+
+ QRegExp variable("^[ \t]*(var|public|private|protected|static)[ \t]*\\$([a-zA-Z_\x7f-\xff][0-9A-Za-z_\x7f-\xff]*)[ \t;=].*$");
+ variable.setCaseSensitive(FALSE);
+
+ if (variable.search(line) != -1) {
+ if (AddVariable(variable.cap(2), "", lineNo) == FALSE)
+ return FALSE;
+
+ if (variable.cap(1).lower() == "private")
+ SetVariable( "private" );
+
+ if (variable.cap(1).lower() == "public" || variable.cap(1).lower() == "var")
+ SetVariable( "public" );
+
+ if (variable.cap(1).lower() == "protected")
+ SetVariable( "protected" );
+
+ if (variable.cap(1).lower() == "static")
+ SetVariable( "static" );
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool PHPFile::ParseThisMember(QString line, int lineNo) {
+ if (line.find("$this->", 0, FALSE) == -1)
+ return FALSE;
+
+ QRegExp createthis;
+ createthis.setCaseSensitive(FALSE);
+
+ createthis.setPattern("\\$this->([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*=[ \t]*([0-9]*)[ \t]*;");
+ if (createthis.search(line) != -1) {
+ if (AddVariable(createthis.cap(1), "integer", lineNo, TRUE) == FALSE)
+ return FALSE;
+ return TRUE;
+ }
+
+ if (line.find("true", 0, FALSE) != -1 || line.find("false", 0, FALSE) != -1) {
+ createthis.setPattern("\\$(this->([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*=[ \t]*(true|false)[ \t]*;");
+ if (createthis.search(line) != -1) {
+ if (AddVariable(createthis.cap(1), "boolean", lineNo, TRUE) == FALSE)
+ return FALSE;
+ return TRUE;
+ }
+ }
+
+ if (line.find("new", 0, FALSE) != -1) {
+ createthis.setPattern("\\$this->([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*=[ \t&]*new[ \t]+([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)");
+ if (createthis.search(line) != -1) {
+ if (AddVariable(createthis.cap(1), createthis.cap(2), lineNo, TRUE) == FALSE)
+ return FALSE;
+ return TRUE;
+ }
+ }
+
+ if (line.find("array", 0, FALSE) != -1) {
+ createthis.setPattern("\\$this->([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*=[ \t&]*(new|)[ \t&]*(array)[ \t]*[\\(;]+");
+ if (createthis.search(line) != -1) {
+ if (AddVariable(createthis.cap(1), "array", lineNo, TRUE) == FALSE)
+ return FALSE;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool PHPFile::ParseMember(QString line, int lineNo) {
+ if (line.find("$", 0, FALSE) == -1)
+ return FALSE;
+
+ /// @todo Ajouter plus de test ....
+
+ QRegExp createmember;
+ createmember.setCaseSensitive(FALSE);
+
+ createmember.setPattern("\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*=[ \t]*([0-9]*)[ \t]*;");
+ if (createmember.search(line) != -1) {
+ if (AddVariable(createmember.cap(1), "integer", lineNo) == FALSE)
+ return FALSE;
+ return TRUE;
+ }
+
+ createmember.setPattern("\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*=[ \t]*[\"']+(.*)[\"']+[ \t]*;");
+ if (createmember.search(line) != -1) {
+ if (AddVariable(createmember.cap(1), "string", lineNo) == FALSE)
+ return FALSE;
+ return TRUE;
+ }
+
+ if (line.find("true", 0, FALSE) != -1 || line.find("false", 0, FALSE) != -1) {
+ createmember.setPattern("\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*=[ \t]*(true|false)[ \t]*;");
+ if (createmember.search(line) != -1) {
+ if (AddVariable(createmember.cap(1), "boolean", lineNo) == FALSE)
+ return FALSE;
+ return TRUE;
+ }
+ }
+
+ if (line.find("new", 0, FALSE) != -1) {
+ createmember.setPattern("\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*=[ \t&]*new[ \t]+([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)");
+ if (createmember.search(line) != -1) {
+ if (AddVariable(createmember.cap(1), createmember.cap(2), lineNo) == FALSE)
+ return FALSE;
+ return TRUE;
+ }
+ }
+
+ if (line.find("array", 0, FALSE) != -1) {
+ createmember.setPattern("\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[ \t]*=[ \t&]*(new|)[ \t&]*(array)[ \t]*[\\(;]+");
+ if (createmember.search(line) != -1) {
+ if (AddVariable(createmember.cap(1), "array", lineNo) == FALSE)
+ return FALSE;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool PHPFile::ParseReturn(QString line, int lineNo) {
+ QString rettype;
+
+ if (line.find("return", 0, FALSE) == -1)
+ return FALSE;
+
+ QRegExp typeex;
+ typeex.setCaseSensitive(FALSE);
+ typeex.setPattern("return[ \t]*(\\(|)([a-zA-Z_\x7f-\xff$][a-zA-Z0-9_\x7f-\xff]*)(\\)|)[ \t]*;");
+
+ if (typeex.search(line) != -1) {
+ QString varname = typeex.cap(2).ascii();
+ rettype = varname;
+
+ if (varname.find("$") == 0) {
+ /// @todo search in variable
+ /*
+ varname = varname.mid(1);
+
+ QValueList<Action *>::ConstIterator it = m_vars.begin();
+ while ( it != m_vars.end() ) {
+ Action *p = *it++;
+
+ if (p->parent() == current && p->name() == varname) {
+ rettype = p->args();
+ }
+ }
+ */
+ } else if (varname == "true" || varname == "false") {
+ rettype = "boolean";
+ } else if (varname == "null") {
+ rettype = "null";
+ }
+
+ if (rettype.find("$") == 0)
+ kdDebug(9018) << "ParseReturn value" << " " << rettype.latin1() << endl;
+ }
+
+ SetFunction("result", rettype);
+ return TRUE;
+}
+
+bool PHPFile::ParseTodo(QString line, int lineNo) {
+ if (line.find("todo", 0, FALSE) == -1)
+ return FALSE;
+
+ QRegExp todo("/[/]+[ \t]*[@]*todo([ \t]*:[ \t]*|[ \t]*)[ \t]*(.*)$");
+ todo.setCaseSensitive(FALSE);
+
+ if (todo.search(line) != -1) {
+ AddTodo( todo.cap(2), lineNo );
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool PHPFile::ParseFixme(QString line, int lineNo) {
+ if (line.find("fixme", 0, FALSE) == -1)
+ return FALSE;
+
+ QRegExp fixme("/[/]+[ \t]*[@]*fixme([ \t]*:[ \t]*|[ \t]*)[ \t]*(.*)$");
+ fixme.setCaseSensitive(FALSE);
+
+ if (fixme.search(line) != -1) {
+ AddFixme( fixme.cap(2), lineNo );
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void PHPFile::ParseSource() {
+ QString line;
+ int lineNo = 0;
+ int bracketOpen = 0;
+ int bracketClose = 0;
+ int bracketFuncOpen = 0;
+ int bracketFuncClose = 0;
+
+ QRegExp includere("^[ \t]*(include|require|include_once|require_once)[ \t]*(\\(|)[ \t]*[\"'](.*)[\"'][ \t]*(\\)|)[ \t]*;$");
+
+ includere.setCaseSensitive(FALSE);
+
+ for ( QStringList::Iterator it = m_contents.begin(); it != m_contents.end(); ++it ) {
+ line = (*it).local8Bit();
+
+ if (!line.isNull()) {
+ if (line.find("include", 0, FALSE) != -1 || line.find("require", 0, FALSE) != -1) {
+ if (includere.search(line) != -1) {
+ QStringList include_path;
+ include_path = include_path.split(":", m_part->getIncludePath());
+ include_path.append(URLUtil::directory(fileName()) + "/");
+ include_path.append("");
+
+ QStringList list = includere.capturedTexts();
+
+ for ( QStringList::Iterator it = include_path.begin(); it != include_path.end(); ++it ) {
+ QString abso = URLUtil::canonicalPath(*it + "/" + list[3]);
+ if (!abso.isNull()) {
+ QString rel = URLUtil::relativePathToFile (m_part->project()->projectDirectory(), abso);
+ postEvent( new FileParseEvent( Event_AddFile, abso ) );
+ }
+ }
+ }
+ }
+
+
+ if ( inMethod == TRUE ) {
+ bracketFuncOpen += line.contains("{");
+ bracketFuncClose += line.contains("}");
+ if (bracketFuncOpen == bracketFuncClose && bracketFuncOpen != 0 && bracketFuncClose != 0) {
+ CloseFunction( lineNo );
+ }
+ }
+
+ if ( inMethod == FALSE ) {
+ bracketOpen += line.contains("{");
+ bracketClose += line.contains("}");
+ if (bracketOpen == bracketClose && bracketOpen != 0 && bracketClose != 0 && inClass == TRUE) {
+ CloseClass( lineNo );
+ }
+ }
+
+ if ( inClass == FALSE ) {
+ if (ParseClass(line, lineNo) == TRUE) {
+ bracketOpen = line.contains("{");
+ bracketClose = line.contains("}");
+ }
+ }
+
+ if ( inClass == TRUE ) {
+ ParseThisMember(line, lineNo);
+ }
+
+ if (ParseFunction(line, lineNo) == TRUE) {
+ bracketFuncOpen = line.contains("{");
+ bracketFuncClose = line.contains("}");
+ }
+
+ if ( inMethod == TRUE )
+ ParseReturn(line, lineNo);
+
+ ParseVariable(line, lineNo);
+ ParseMember(line, lineNo);
+ ParseTodo(line, lineNo);
+ ParseFixme(line, lineNo);
+
+ ++lineNo;
+ }
+ }
+}
+
+void PHPFile::PHPCheck() {
+// int status = 0;
+ m_phpCheckOutput = "";
+
+/// @todo try with kprocess in futur version actually this create zombie
+/*
+ phpCheckProc->clearArguments();
+
+ *phpCheckProc << m_phpSupport->getExePath();
+ *phpCheckProc << "-l -f" << KShellProcess::quote(fileName());
+
+ phpCheckProc->start(KProcess::DontCare, KProcess::All);
+*/
+
+/*
+ char buf[255];
+ FILE *fd = popen(QString(m_phpSupport->getExePath() + " -l -f " + KShellProcess::quote(fileName())).ascii(), "r");
+ while (!feof(fd)) {
+ memset(buf, 0, 255);
+ fgets(buf, 255, fd);
+ m_phpCheckOutput += buf;
+ }
+ pclose(fd);
+
+ ParseStdout(m_phpCheckOutput);
+*/
+}
+
+/*
+void PHPFile::slotReceivedPHPCheckStdout (KProcess* proc, char* buffer, int buflen) {
+ kdDebug(9018) << "slotPHPExeStdout()" << endl;
+ m_phpCheckOutput += QString::fromLocal8Bit(buffer,buflen+1);
+}
+
+void PHPFile::slotReceivedPHPCheckStderr (KProcess* proc, char* buffer, int buflen) {
+ kdDebug(9018) << "slotPHPExeStderr()" << endl;
+ m_phpCheckOutput += QString::fromLocal8Bit(buffer,buflen+1);
+}
+
+void PHPFile::slotPHPCheckExited (KProcess* proc) {
+ kdDebug(v) << "slotPHPExeExited()" << endl;
+}
+*/
+
+void PHPFile::ParseStdout(QString phpOutput) {
+ kdDebug(9018) << "ParseStdout()" << endl;
+ QRegExp parseError("^(<b>|)Parse error(</b>|): parse error, (.*) in (<b>|)(.*)(</b>|) on line (<b>|)(.*)(</b>|).*$");
+ QRegExp undefFunctionError("^(<b>|)Fatal error(</b>|): Call to undefined function: (.*) in (<b>|)(.*)(</b>|) on line (<b>|)(.*)(</b>|).*$");
+ QRegExp warning("^(<b>|)Warning(</b>|): (<b>|)(.*)(</b>|) in (.*) on line (<b>|)(.*)(</b>|).*$");
+ QRegExp generalFatalError("^(<b>|)Fatal error(</b>|): (.*) in (<b>|)(.*)(</b>|) on line (<b>|)(.*)(</b>|).*$");
+
+ QStringList list = QStringList::split("\n", phpOutput);
+ QStringList::Iterator it;
+ for ( it = list.begin(); it != list.end(); ++it ) {
+ if (generalFatalError.search(*it) >= 0) {
+// m_errorview->reportProblem(Error, parseError.cap(5), parseError.cap(8).toInt(), parseError.cap(3));
+ }
+ if(parseError.search(*it) >= 0){
+// m_errorview->reportProblem(ErrorParse, parseError.cap(5), parseError.cap(8).toInt(), parseError.cap(3));
+ }
+ if(undefFunctionError.search(*it) >= 0){
+// m_errorview->reportProblem(ErrorNoSuchFunction, parseError.cap(5), parseError.cap(8).toInt(), parseError.cap(3));
+ }
+ if (warning.search(*it) >= 0){
+// m_errorview->reportProblem(ErrorNoSuchFunction, parseError.cap(6), parseError.cap(8).toInt(), parseError.cap(4));
+ }
+ }
+
+}
+/*
+ClassDom PHPFile::classByName(QString filename, QString classname) {
+ QValueList<ClassDom> CList;
+ QString abso = URLUtil::canonicalPath(filename);
+ ClassList classList = m_model->globalNamespace()->classList();
+
+ ClassList::Iterator classIt;
+ for (classIt = classList.begin(); classIt != classList.end(); ++classIt) {
+ ClassDom nClass = *classIt;
+ if (nClass->name().lower() == classname.lower() && nClass->fileName() == abso)
+ return nClass;
+ }
+ return NULL;
+}
+
+QValueList<ClassDom> PHPFile::classByName(QString classname) {
+ QValueList<ClassDom> CList;
+
+ ClassList classList = m_model->globalNamespace()->classList();
+
+ ClassList::Iterator classIt;
+ for (classIt = classList.begin(); classIt != classList.end(); ++classIt) {
+ ClassDom nClass = *classIt;
+ if (nClass->name().lower() == classname.lower())
+ CList.append( nClass );
+ }
+ return CList;
+}
+*/
+
+void PHPFile::postEvent(FileParseEvent *event) {
+ KApplication::postEvent( m_part, event );
+ usleep(100);
+}
+
+bool PHPFile::AddClass(QString name, QString extends, int start) {
+ postEvent( new FileParseEvent( Event_AddClass, this->fileName(), name, extends, start ) );
+ inClass = TRUE;
+ return TRUE;
+}
+
+bool PHPFile::SetClass(QString arguments) {
+ postEvent( new FileParseEvent( Event_SetClass, this->fileName(), "", arguments ) );
+ return TRUE;
+}
+
+bool PHPFile::CloseClass(int end) {
+ postEvent( new FileParseEvent( Event_CloseClass, this->fileName(), end ) );
+ inClass = FALSE;
+ return TRUE;
+}
+
+bool PHPFile::AddFunction(QString name, QString arguments, int start) {
+ postEvent( new FileParseEvent( Event_AddFunction, this->fileName(), name, arguments, start ) );
+ inMethod = TRUE;
+ return TRUE;
+}
+
+bool PHPFile::SetFunction(QString name, QString arguments) {
+ postEvent( new FileParseEvent( Event_SetFunction, this->fileName(), name, arguments ) );
+ return TRUE;
+}
+
+bool PHPFile::CloseFunction(int end) {
+ postEvent( new FileParseEvent( Event_CloseFunction, this->fileName(), end ) );
+ inMethod = FALSE;
+ return TRUE;
+}
+
+bool PHPFile::AddVariable(QString name, QString type, int position, bool classvar) {
+ postEvent( new FileParseEvent( Event_AddVariable, this->fileName(), name, type, position, classvar ) );
+ return TRUE;
+}
+
+bool PHPFile::SetVariable(QString arguments) {
+ postEvent( new FileParseEvent( Event_SetVariable, this->fileName(), "", arguments ) );
+ return TRUE;
+}
+
+bool PHPFile::AddTodo(QString arguments, int position) {
+ postEvent( new FileParseEvent( Event_AddTodo, this->fileName(), "", arguments, position ) );
+ inClass = TRUE;
+ return TRUE;
+}
+
+bool PHPFile::AddFixme(QString arguments, int position) {
+ postEvent( new FileParseEvent( Event_AddFixme, this->fileName(), "", arguments, position ) );
+ inClass = TRUE;
+ return TRUE;
+}
+
+#include "phpfile.moc"
diff --git a/languages/php/phpfile.h b/languages/php/phpfile.h
new file mode 100644
index 00000000..cb1573f3
--- /dev/null
+++ b/languages/php/phpfile.h
@@ -0,0 +1,119 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef PHPFILE_H
+#define PHPFILE_H
+
+#include <kapplication.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+#include <qthread.h>
+
+#include <urlutil.h>
+#include <kprocess.h>
+#include <kdebug.h>
+
+#include <kdevproject.h>
+#include <kdevlanguagesupport.h>
+#include <kdevpartcontroller.h>
+
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/document.h>
+
+#include "phpsupportpart.h"
+#include "phperrorview.h"
+#include "phpparser.h"
+#include "phpsupport_event.h"
+
+/**
+@author Escuder Nicolas
+*/
+class PHPFile : public QObject {
+Q_OBJECT
+
+public:
+ PHPFile(PHPSupportPart *phpSupport, const QString& fileName);
+ ~PHPFile();
+
+ QStringList getContents();
+
+ bool isModified();
+ void setModified(bool value);
+ QString fileName();
+ void Analyse();
+ void ParseStdout(QString phpOutput);
+/*
+ ClassDom classByName(QString filename, QString classname);
+ QValueList<ClassDom> classByName(QString classname);
+*/
+
+/*
+private slots:
+ void slotReceivedPHPCheckStderr (KProcess* proc, char* buffer, int buflen);
+ void slotReceivedPHPCheckStdout (KProcess* proc, char* buffer, int buflen);
+ void slotPHPCheckExited (KProcess* proc);
+*/
+private:
+ QStringList readFromEditor();
+ QStringList readFromDisk();
+
+ bool ParseClass(QString line, int lineNo);
+ bool ParseFunction(QString line, int lineNo);
+ bool ParseVariable(QString line, int lineNo);
+
+ bool ParseThisMember(QString line, int lineNo);
+ bool ParseMember(QString line, int lineNo);
+ bool ParseReturn(QString line, int lineNo);
+ bool ParseTodo(QString line, int lineNo);
+ bool ParseFixme(QString line, int lineNo);
+
+ void ParseSource();
+ void PHPCheck();
+
+ void postEvent(FileParseEvent *event);
+
+ bool AddClass(QString name, QString extends, int start);
+ bool SetClass(QString arguments);
+ bool CloseClass(int end);
+
+ bool AddFunction(QString name, QString arguments, int start);
+ bool SetFunction(QString name, QString arguments = "");
+ bool CloseFunction(int end);
+
+ bool AddVariable(QString name, QString type, int position, bool classvar = FALSE);
+ bool SetVariable(QString arguments);
+
+ bool AddTodo(QString arguments, int position);
+ bool AddFixme(QString arguments, int position);
+
+ PHPSupportPart *m_part;
+
+ bool modified;
+
+ bool inClass;
+ bool inMethod;
+
+ QFileInfo* m_fileinfo;
+ QStringList m_contents;
+ QString m_phpCheckOutput;
+// KShellProcess* phpCheckProc;
+};
+
+#endif
diff --git a/languages/php/phphtmlview.cpp b/languages/php/phphtmlview.cpp
new file mode 100644
index 00000000..d21a6fa0
--- /dev/null
+++ b/languages/php/phphtmlview.cpp
@@ -0,0 +1,39 @@
+/***************************************************************************
+ phphtmlview.cpp - description
+ -------------------
+ begin : Sat May 26 2001
+ copyright : (C) 2001 by
+ email :
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "phphtmlview.h"
+
+#include "phpsupportpart.h"
+#include "kdevpartcontroller.h"
+
+PHPHTMLView::PHPHTMLView(PHPSupportPart *part):m_part(part) {
+ setOptions(CanOpenInNewWindow);
+}
+PHPHTMLView::~PHPHTMLView(){
+}
+
+void PHPHTMLView::slotDuplicate( )
+{
+ m_part->partController()->showDocument(url(), true);
+}
+
+void PHPHTMLView::slotOpenInNewWindow( const KURL & url )
+{
+ m_part->partController()->showDocument(url, true);
+}
+
+#include "phphtmlview.moc"
diff --git a/languages/php/phphtmlview.h b/languages/php/phphtmlview.h
new file mode 100644
index 00000000..e135cfa7
--- /dev/null
+++ b/languages/php/phphtmlview.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ phphtmlview.h - description
+ -------------------
+ begin : Sat May 26 2001
+ copyright : (C) 2001 by
+ email :
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef PHPHTMLVIEW_H
+#define PHPHTMLVIEW_H
+
+#include <kdevhtmlpart.h>
+
+/**
+ *@author
+ */
+class PHPSupportPart;
+
+class PHPHTMLView : public KDevHTMLPart {
+Q_OBJECT
+public:
+ PHPHTMLView(PHPSupportPart *part);
+ ~PHPHTMLView();
+
+protected slots:
+ virtual void slotDuplicate();
+ virtual void slotOpenInNewWindow(const KURL &url);
+
+private:
+ PHPSupportPart *m_part;
+};
+
+#endif
diff --git a/languages/php/phpinfodlg.ui b/languages/php/phpinfodlg.ui
new file mode 100644
index 00000000..77de8304
--- /dev/null
+++ b/languages/php/phpinfodlg.ui
@@ -0,0 +1,87 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>PHPInfoDlg</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PHPInfoDlg</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>412</width>
+ <height>301</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>PHP Information</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QMultiLineEdit" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>php_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>ok_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>ok_button</sender>
+ <signal>clicked()</signal>
+ <receiver>PHPInfoDlg</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/php/phpnewclassdlg.cpp b/languages/php/phpnewclassdlg.cpp
new file mode 100644
index 00000000..f17034db
--- /dev/null
+++ b/languages/php/phpnewclassdlg.cpp
@@ -0,0 +1,123 @@
+/***************************************************************************
+ phpnewclassdlg.cpp - description
+ -------------------
+ begin : Sat Aug 11 2001
+ copyright : (C) 2001 by Sandy Meier
+ email : smeier@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "phpnewclassdlg.h"
+#include <klineedit.h>
+#include <kcompletion.h>
+#include <kfiledialog.h>
+#include <qtoolbutton.h>
+#include <iostream>
+#include <qregexp.h>
+#include <qtextedit.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kinstance.h>
+#include <kdebug.h>
+
+using namespace std;
+
+PHPNewClassDlg::PHPNewClassDlg(const QStringList& baseClassNames,const QString& directory,QWidget *parent, const char *name) : PHPNewClassDlgBase(parent,name,true) {
+ m_filenameModified = false;
+ KCompletion *comp = new KCompletion();
+ comp->setItems(baseClassNames);
+ m_dirEdit->setText(directory);
+
+ // load the class template if available
+ QString templateFile = KGlobal::instance()->dirs()->findResource("data","kdevphpsupport/newclasstemplate.txt");
+ if(!templateFile.isNull()){
+ QFile file(templateFile);
+ QTextStream stream(&file);
+ if(file.open(IO_ReadOnly)){
+ m_classTemplate->setText(stream.read());
+ file.close();
+ }
+ }
+
+
+ m_baseClassEdit->setCompletionObject( comp ); /// @todo change it to KLineEdit
+ connect(m_baseClassEdit,SIGNAL(returnPressed(const QString&)),comp,SLOT(addItem(const QString&)));
+ connect(m_classNameEdit,SIGNAL(textChanged(const QString&)),
+ this,SLOT(classNameTextChanged(const QString&)));
+ connect(m_fileNameEdit,SIGNAL(textChanged(const QString&)),
+ this,SLOT(fileNameTextChanged(const QString&)));
+ connect(m_dirButton,SIGNAL(clicked()),
+ this,SLOT(slotDirButtonClicked()));
+}
+PHPNewClassDlg::~PHPNewClassDlg(){
+}
+
+void PHPNewClassDlg::slotDirButtonClicked(){
+ QString dir = KFileDialog::getExistingDirectory(m_dirEdit->text(),this);
+ if(!dir.isEmpty()){
+ m_dirEdit->setText(dir);
+ }
+}
+void PHPNewClassDlg::classNameTextChanged(const QString& str){
+ if(!m_filenameModified){
+ m_fileNameEdit->setText(str.lower() + ".inc");
+ }
+}
+
+void PHPNewClassDlg::fileNameTextChanged(const QString&){
+ if(m_fileNameEdit->hasFocus()){
+ m_filenameModified = true;
+ }
+}
+void PHPNewClassDlg::accept(){
+ PHPNewClassDlgBase::accept(); // hide the dialog
+
+ QString text = m_classTemplate->text();
+ QString classDir = m_dirEdit->text();
+ if(!classDir.endsWith("/")) classDir += "/"; // append /
+ QString absFileName = classDir + m_fileNameEdit->text();
+
+ // save the template for the next time
+ QString templateDir = KGlobal::instance()->dirs()->saveLocation("data") + "/kdevphpsupport/";
+ QString templateFile = templateDir + "newclasstemplate.txt";
+ QDir dir(templateDir);
+ if(!dir.exists()){
+ if(!dir.mkdir(templateDir)){
+ kdWarning() << "Error on creating directory for the classtemplate" << templateDir << endl;
+ }
+ }
+ QFile file(templateFile);
+ QTextStream stream(&file);
+
+ if(file.open(IO_WriteOnly)){
+ stream << text; // write
+ file.close();
+ }
+
+ // generate the sourcecode for the class
+ if(m_baseClassEdit->text().isEmpty()){
+ text = text.replace(QRegExp("extends BASECLASS"),"");
+ text = text.replace(QRegExp("BASECLASS\\:\\:BASECLASS\\(\\);"),"");
+ }else{
+ text = text.replace(QRegExp("BASECLASS"),m_baseClassEdit->text());
+ }
+ text = text.replace(QRegExp("CLASSNAME"),m_classNameEdit->text());
+ text = text.replace(QRegExp("FILENAME"),m_fileNameEdit->text().upper());
+ text = text.replace(QRegExp("AUTHOR"),"not implemented");
+
+ file.setName(absFileName);
+ if(file.open(IO_WriteOnly)){
+ stream << text; // write
+ file.close();
+ }
+}
+
+#include "phpnewclassdlg.moc"
diff --git a/languages/php/phpnewclassdlg.h b/languages/php/phpnewclassdlg.h
new file mode 100644
index 00000000..d94bfffb
--- /dev/null
+++ b/languages/php/phpnewclassdlg.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ phpnewclassdlg.h - description
+ -------------------
+ begin : Sat Aug 11 2001
+ copyright : (C) 2001 by Sandy Meier
+ email : smeier@kdevelop.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef PHPNEWCLASSDLG_H
+#define PHPNEWCLASSDLG_H
+
+#include <qwidget.h>
+#include "phpnewclassdlgbase.h"
+
+/**
+ *@author Sandy Meier
+ */
+
+class PHPNewClassDlg : public PHPNewClassDlgBase {
+ Q_OBJECT
+public:
+ PHPNewClassDlg(const QStringList& baseClassNames,const QString& directory,QWidget *parent=0, const char *name=0);
+ ~PHPNewClassDlg();
+ protected slots:
+ void classNameTextChanged(const QString&);
+ void fileNameTextChanged(const QString&);
+ void accept();
+ void slotDirButtonClicked();
+ protected:
+ bool m_filenameModified;
+};
+
+#endif
diff --git a/languages/php/phpnewclassdlgbase.ui b/languages/php/phpnewclassdlgbase.ui
new file mode 100644
index 00000000..5b4df7c1
--- /dev/null
+++ b/languages/php/phpnewclassdlgbase.ui
@@ -0,0 +1,201 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>PHPNewClassDlgBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>m_ClassDLG</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>439</width>
+ <height>386</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>New Class</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Class &amp;name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_classNameEdit</cstring>
+ </property>
+ </widget>
+ <spacer row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="5" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_okButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="5" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_cancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="4" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>m_baseClassEdit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>m_classNameEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Base class:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_baseClassEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Class &amp;template:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_classTemplate</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Directory:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_dirEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;File name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_fileNameEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="2" column="6">
+ <property name="name">
+ <cstring>m_dirButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>m_fileNameEdit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>m_dirEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="4" column="0" rowspan="1" colspan="7">
+ <property name="name">
+ <cstring>m_classTemplate</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;?php
+if (!defined("FILENAME")){
+define("FILENAME",0);
+/*
+* @author AUTHOR
+*/
+
+class CLASSNAME extends BASECLASS {
+ //constructor
+ function CLASSNAME(){
+ BASECLASS::BASECLASS();
+ }
+ }
+}
+?&gt;</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>m_ClassDLG</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>m_cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>m_ClassDLG</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>m_classNameEdit</tabstop>
+ <tabstop>m_baseClassEdit</tabstop>
+ <tabstop>m_fileNameEdit</tabstop>
+ <tabstop>m_dirEdit</tabstop>
+ <tabstop>m_dirButton</tabstop>
+ <tabstop>m_classTemplate</tabstop>
+ <tabstop>m_okButton</tabstop>
+ <tabstop>m_cancelButton</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">klineedit.h</include>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/php/phpparser.cpp b/languages/php/phpparser.cpp
new file mode 100644
index 00000000..b13c5479
--- /dev/null
+++ b/languages/php/phpparser.cpp
@@ -0,0 +1,160 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "phpparser.h"
+#include "phpsupportpart.h"
+#include <urlutil.h>
+
+#include <kapplication.h>
+#include <kdevcore.h>
+#include <kdevproject.h>
+#include <codemodel.h>
+
+#include <qregexp.h>
+#include <kdebug.h>
+
+#include <qfileinfo.h>
+#include <qtextstream.h>
+
+#include <iostream>
+
+#include "phpsupport_event.h"
+
+using namespace std;
+
+PHPParser::PHPParser(PHPSupportPart *part){
+ m_part = part;
+ m_close = false;
+}
+
+PHPParser::~PHPParser(){
+ removeAllFiles();
+}
+
+bool PHPParser::hasFile( const QString& fileName )
+{
+// kdDebug(9018) << "hasFile " << fileName.latin1() << endl;
+ QString abso = URLUtil::canonicalPath(fileName);
+ QMap<QString, PHPFile *>::Iterator it = m_files.find(abso);
+
+ if ( it == m_files.end() )
+ return false;
+ return true;
+}
+
+void PHPParser::addFile( const QString& fileName )
+{
+ QString abso = URLUtil::canonicalPath(fileName);
+
+ if ( hasFile(abso) )
+ return;
+
+ kdDebug(9018) << "addFile " << fileName.latin1() << endl;
+
+ QFileInfo fi( abso );
+ if ((fi.extension().contains("inc") || fi.extension().contains("php") || fi.extension().contains("html") || fi.extension().contains("php3") || !fi.extension()) && !fi.extension().contains("~")) {
+ m_files.insert(abso, new PHPFile(m_part, abso));
+ }
+}
+
+void PHPParser::removeFile( const QString& fileName )
+{
+// kdDebug(9018) << "removeFile " << fileName.latin1() << endl;
+ QString abso = URLUtil::canonicalPath(fileName);
+ QMap<QString, PHPFile *>::Iterator it = m_files.find(abso);
+
+ if ( it != m_files.end()) {
+ PHPFile *file = it.data();
+ m_files.remove( abso );
+ delete( file );
+ file = 0;
+ }
+}
+
+void PHPParser::removeAllFiles()
+{
+ kdDebug(9018) << "removeAllFiles" << endl;
+ QMap<QString, PHPFile *>::Iterator it = m_files.begin();
+
+ while( it != m_files.end() ){
+ PHPFile * file = it.data();
+ ++it;
+ delete( file );
+ file = 0;
+ }
+ m_files.clear();
+}
+
+void PHPParser::reparseFile( const QString& fileName )
+{
+ kdDebug(9018) << "reparseFile" << endl;
+ QString abso = URLUtil::canonicalPath(fileName);
+ QMap<QString, PHPFile *>::Iterator it = m_files.find(abso);
+
+ if ( it != m_files.end()) {
+ PHPFile *file = it.data();
+ file->setModified(true);
+ file = 0;
+ }
+ m_canParse.wakeAll();
+}
+
+void PHPParser::run() {
+ kdDebug(9018) << "run thread " << QThread::currentThread() << endl;
+ QMap<QString, PHPFile *>::Iterator it;
+
+ while ( !m_close ) {
+ m_canParse.wait();
+
+ if ( m_close )
+ break;
+
+ it = m_files.begin();
+
+ while( it != m_files.end() ){
+ PHPFile * file = it.data();
+ if (!m_close) {
+ if ( file->isModified() ) {
+ file->Analyse();
+ it = m_files.begin();
+ } else {
+ ++it;
+ }
+ file = 0;
+ } else {
+ it = m_files.end();
+ }
+ }
+ }
+}
+
+void PHPParser::close()
+{
+ kdDebug(9018) << "closing thread" << endl;
+ m_close = true;
+ m_canParse.wakeAll();
+
+ while (running()) {
+ kapp->processEvents();
+ }
+}
+
+void PHPParser::startParse() {
+ kdDebug(9018) << "startParse" << endl;
+ m_canParse.wakeAll();
+}
diff --git a/languages/php/phpparser.h b/languages/php/phpparser.h
new file mode 100644
index 00000000..c5d7e378
--- /dev/null
+++ b/languages/php/phpparser.h
@@ -0,0 +1,73 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef PHPPARSER_H
+#define PHPPARSER_H
+
+#include <qthread.h>
+
+#if QT_VERSION < 0x030100
+#include <kdevmutex.h>
+#else
+#include <qmutex.h>
+#endif
+
+#include <codemodel.h>
+
+#include <qwaitcondition.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include "phpfile.h"
+
+class KDevCore;
+class PHPSupportPart;
+
+/**
+ *@author Sandy Meier
+ */
+
+class PHPParser: public QThread {
+
+public:
+ PHPParser(PHPSupportPart *part);
+ ~PHPParser();
+
+ void addFile( const QString& fileName );
+ bool hasFile( const QString& fileName );
+ void reparseFile( const QString& fileName );
+ void removeFile( const QString& fileName );
+ void removeAllFiles();
+
+ void run();
+ void close();
+ void startParse();
+
+private:
+ CodeModel* m_model;
+ KDevCore* m_core;
+ PHPSupportPart* m_part;
+
+ QMutex m_mutex;
+ QWaitCondition m_canParse;
+ bool m_close;
+ QMap<QString, PHPFile*> m_files;
+};
+
+
+#endif
diff --git a/languages/php/phpsupport_event.h b/languages/php/phpsupport_event.h
new file mode 100644
index 00000000..4a1a175b
--- /dev/null
+++ b/languages/php/phpsupport_event.h
@@ -0,0 +1,110 @@
+/*
+ Copyright (C) 2003 by Roberto Raggi <roberto@kdevelop.org>
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __phpsupport_events_h
+#define __phpsupport_events_h
+
+#include <qevent.h>
+#include <qvaluelist.h>
+
+#if QT_VERSION < 0x030100
+#include <kdevmutex.h>
+#else
+#include <qmutex.h>
+#endif
+
+enum
+{
+ Event_AddFile = QEvent::User + 1000,
+ Event_StartParse,
+ Event_EndParse,
+ Event_AddClass,
+ Event_SetClass,
+ Event_CloseClass,
+ Event_AddFunction,
+ Event_SetFunction,
+ Event_CloseFunction,
+ Event_AddVariable,
+ Event_SetVariable,
+ Event_AddTodo,
+ Event_AddFixme
+};
+
+class FileParseEvent: public QCustomEvent
+{
+public:
+ FileParseEvent(long event, const QString& fileName )
+ : QCustomEvent(event), m_fileName( fileName )
+ {
+ m_name = "";
+ m_arguments = "";
+ m_position = 0;
+ m_global = FALSE;
+ }
+
+ FileParseEvent(long event, const QString& fileName, int position )
+ : QCustomEvent(event), m_fileName( fileName ), m_position( position )
+ {
+ m_name = "";
+ m_arguments = "";
+ m_global = FALSE;
+ }
+
+ FileParseEvent(long event, const QString& fileName, const QString& name, const QString& arguments )
+ : QCustomEvent(event), m_fileName( fileName ), m_name( name ), m_arguments( arguments )
+ {
+ m_position = 0;
+ m_global = FALSE;
+ }
+
+ FileParseEvent(long event, const QString& fileName, const QString& name, const QString& arguments, int position )
+ : QCustomEvent(event), m_fileName( fileName ), m_name( name ), m_arguments( arguments ), m_position( position )
+ {
+ m_global = FALSE;
+ }
+
+ FileParseEvent(long event, const QString& fileName, const QString& name, const QString& arguments, int position, bool global )
+ : QCustomEvent(event), m_fileName( fileName ), m_name( name ), m_arguments( arguments ), m_position( position ), m_global( global )
+ {
+ }
+
+ ~FileParseEvent()
+ {
+ }
+
+ QString fileName() const { return m_fileName; }
+ QString name() const { return m_name; }
+ QString arguments() const { return m_arguments; }
+ int posititon() const { return m_position; }
+ bool global() const { return m_global; }
+
+private:
+ QString m_fileName;
+ QString m_name;
+ QString m_arguments;
+ QString m_accesstype;
+ int m_position;
+ bool m_global;
+
+private:
+ FileParseEvent( const FileParseEvent& source );
+ void operator = ( const FileParseEvent& source );
+};
+
+#endif // __phpsupport_events_h
diff --git a/languages/php/phpsupportpart.cpp b/languages/php/phpsupportpart.cpp
new file mode 100644
index 00000000..4c4de794
--- /dev/null
+++ b/languages/php/phpsupportpart.cpp
@@ -0,0 +1,751 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+ Copyright (C) 2001 by smeier@kdevelop.org
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "phpsupportpart.h"
+
+#include <iostream>
+
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qpopupmenu.h>
+#include <qprogressbar.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+#include <qthread.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <khtmlview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kregexp.h>
+#include <kstatusbar.h>
+#include <kparts/browserextension.h>
+
+#include <kdevcore.h>
+#include <kdevproject.h>
+#include <kdevmainwindow.h>
+#include <kdevpartcontroller.h>
+#include <codemodel.h>
+#include <domutil.h>
+#include <kdevplugininfo.h>
+#include <kiconloader.h>
+
+#include "phpconfigdata.h"
+#include "phpconfigwidget.h"
+#include "phpcodecompletion.h"
+#include "phpparser.h"
+#include "phpnewclassdlg.h"
+
+
+#include "phphtmlview.h"
+#include "phperrorview.h"
+
+#include "phpsupport_event.h"
+
+using namespace std;
+
+static const KDevPluginInfo data("kdevphpsupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevphpsupport, PHPSupportFactory( data ) )
+
+PHPSupportPart::PHPSupportPart(QObject *parent, const char *name, const QStringList &)
+ : KDevLanguageSupport(&data, parent, name ? name : "PHPSupportPart")
+{
+ m_htmlView = 0;
+ m_parser = 0;
+ phpExeProc = 0;
+ setInstance(PHPSupportFactory::instance());
+
+ setXMLFile("kdevphpsupport.rc");
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+ connect( core(), SIGNAL(projectConfigWidget(KDialogBase*)),
+ this, SLOT(projectConfigWidget(KDialogBase*)) );
+
+ KAction *action;
+
+ action = new KAction( i18n("&Run"), "exec",Key_F9,
+ this, SLOT(slotRun()),
+ actionCollection(), "build_execute" );
+ action->setToolTip(i18n("Run"));
+ action->setWhatsThis(i18n("<b>Run</b><p>Executes script on a terminal or a webserver."));
+
+ action = new KAction( i18n("&New Class..."),0,
+ this, SLOT(slotNewClass()),
+ actionCollection(), "project_new_class" );
+ action->setToolTip(i18n("New class"));
+ action->setWhatsThis(i18n("<b>New class</b><p>Runs New Class wizard."));
+
+ m_phpErrorView = new PHPErrorView(this, 0, "phpErrorWidget");
+ m_phpErrorView->setIcon( SmallIcon("info") );
+
+ QWhatsThis::add(m_phpErrorView, i18n("<b>PHP problems</b><p>This view shows PHP parser warnings, errors, and fatal errors."));
+ mainWindow()->embedOutputView(m_phpErrorView, i18n("Problems"), i18n("Problems"));
+
+ phpExeProc = new KShellProcess("/bin/sh");
+ connect( phpExeProc, SIGNAL(receivedStdout (KProcess*, char*, int)),
+ this, SLOT(slotReceivedPHPExeStdout (KProcess*, char*, int)));
+ connect( phpExeProc, SIGNAL(receivedStderr (KProcess*, char*, int)),
+ this, SLOT(slotReceivedPHPExeStderr (KProcess*, char*, int)));
+ connect( phpExeProc, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotPHPExeExited(KProcess*)));
+
+ m_htmlView = new PHPHTMLView(this);
+ mainWindow()->embedOutputView(m_htmlView->view(), i18n("PHP"), i18n("PHP"));
+ connect( m_htmlView, SIGNAL(started(KIO::Job*)),
+ this, SLOT(slotWebJobStarted(KIO::Job*)));
+
+ configData = new PHPConfigData(projectDom());
+ connect( configData, SIGNAL(configStored()),
+ this, SLOT(slotConfigStored()));
+
+ m_codeCompletion = new PHPCodeCompletion(this, configData);
+
+ new KAction(i18n("Complete Text"), CTRL+Key_Space, m_codeCompletion, SLOT(cursorPositionChanged()), actionCollection(), "edit_complete_text");
+
+ connect( partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part *)));
+ connect( this, SIGNAL(fileParsed( PHPFile* )), this, SLOT(slotfileParsed( PHPFile* )));
+}
+
+PHPSupportPart::~PHPSupportPart()
+{
+ LastClass = NULL;
+ LastMethod = NULL;
+ LastVariable = NULL;
+
+ if ( m_parser ) {
+ m_parser->close() ;
+ delete( m_parser );
+ m_parser = NULL;
+ }
+
+ if ( m_phpErrorView ) {
+ mainWindow()->removeView( m_phpErrorView );
+ delete( m_phpErrorView );
+ m_phpErrorView = NULL;
+ }
+
+ kdDebug(9018) << "remove codeCompletition" << endl;
+ if ( m_codeCompletion )
+ delete( m_codeCompletion );
+
+ kdDebug(9018) << "remove configData" << endl;
+ if ( configData )
+ delete( configData );
+
+ if ( m_htmlView ) {
+ kdDebug(9018) << "remove htmlView" << endl;
+ mainWindow()->removeView( m_htmlView->view() );
+ delete( m_htmlView );
+ m_htmlView = NULL;
+ }
+
+ kdDebug(9018) << "remove phpExec" << endl;
+ if ( phpExeProc )
+ delete( phpExeProc );
+
+ kdDebug(9018) << "finish" << endl;
+}
+
+void PHPSupportPart::slotActivePartChanged(KParts::Part *part) {
+ kdDebug(9018) << "enter slotActivePartChanged" << endl;
+ if (!part || !part->widget())
+ return;
+ m_editInterface = dynamic_cast<KTextEditor::EditInterface*>(part);
+ if (m_editInterface) { // connect to the editor
+ disconnect(part, 0, this, 0 ); // to make sure that it is't connected twice
+ if (configData->getRealtimeParsing()) {
+ connect(part,SIGNAL(textChanged()),this,SLOT(slotTextChanged()));
+ }
+ m_codeCompletion->setActiveEditorPart(part);
+ }
+ kdDebug(9018) << "exit slotActivePartChanged" << endl;
+}
+
+void PHPSupportPart::slotTextChanged() {
+ kdDebug(9018) << "enter text changed" << endl;
+
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ if (!ro_part)
+ return;
+
+ QString fileName = ro_part->url().directory() + "/" + ro_part->url().fileName();
+
+ if (m_parser) {
+ if (m_parser->hasFile( fileName ))
+ m_parser->reparseFile( fileName );
+ }
+}
+
+void PHPSupportPart::slotConfigStored() {
+ // fake a changing, this will read the configuration again and install the connects
+ slotActivePartChanged(partController()->activePart());
+}
+
+void PHPSupportPart::projectConfigWidget(KDialogBase *dlg) {
+ QVBox *vbox = dlg->addVBoxPage(i18n( "PHP Specific" ), i18n("PHP Settings"), BarIcon( "source", KIcon::SizeMedium ));
+ PHPConfigWidget* w = new PHPConfigWidget(configData,vbox, "php config widget");
+ connect( dlg, SIGNAL(okClicked()), w, SLOT(accept()) );
+}
+
+void PHPSupportPart::slotNewClass() {
+ QStringList classNames = sortedNameList( codeModel()->globalNamespace()->classList() );
+ PHPNewClassDlg dlg(classNames,project()->projectDirectory());
+ dlg.exec();
+ }
+
+void PHPSupportPart::slotRun() {
+ configData = new PHPConfigData(projectDom());
+ if (validateConfig()) {
+ mainWindow()->raiseView(m_htmlView->view());
+ PHPConfigData::InvocationMode mode = configData->getInvocationMode() ;
+ if (mode == PHPConfigData::Web) {
+ executeOnWebserver();
+ }
+ else if (mode == PHPConfigData::Shell) {
+ executeInTerminal();
+ }
+ }
+}
+
+bool PHPSupportPart::validateConfig() {
+ if (!configData->validateConfig()) {
+ KMessageBox::information(0,i18n("There is no configuration for executing a PHP file.\nPlease set the correct values in the next dialog."));
+ KDialogBase dlg(KDialogBase::TreeList, i18n("Customize PHP Mode"),
+ KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, 0,
+ "php config dialog");
+
+ QVBox *vbox = dlg.addVBoxPage(i18n("PHP Settings"));
+ PHPConfigWidget* w = new PHPConfigWidget(configData,vbox, "php config widget");
+ connect( &dlg, SIGNAL(okClicked()), w, SLOT(accept()) );
+ dlg.exec();
+ }
+ if (configData->validateConfig()) {
+ return true;
+ }
+ return false;
+}
+
+void PHPSupportPart::executeOnWebserver() {
+ // Save all files once
+ if (partController()->saveAllFiles()==false)
+ return; //user cancelled
+
+ // Figure out the name of the remote file
+ QString weburl = configData->getWebURL();
+ QString file = getExecuteFile();
+
+ // Force KHTMLPart to reload the page
+ KParts::BrowserExtension* be = m_htmlView->browserExtension();
+ if (be) {
+ KParts::URLArgs urlArgs( be->urlArgs() );
+ urlArgs.reload = true;
+ be->setURLArgs( urlArgs );
+ }
+
+ // Acutally do the request
+ m_phpExeOutput="";
+ m_htmlView->openURL(KURL(weburl + file));
+ m_htmlView->show();
+}
+
+QString PHPSupportPart::getExecuteFile() {
+ QString file;
+ PHPConfigData::StartupFileMode mode = configData->getStartupFileMode();
+
+ QString weburl = configData->getWebURL();
+ if (mode == PHPConfigData::Current) {
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ if (ro_part) {
+ if ( configData->getInvocationMode() == PHPConfigData::Web )
+ file = URLUtil::relativePath( project()->projectDirectory(), ro_part->url().path() );
+ else
+ file = ro_part->url().path();
+ }
+ }
+ if (mode == PHPConfigData::Default) {
+ file = configData->getStartupFile();
+ }
+ return file;
+}
+
+void PHPSupportPart::slotWebJobStarted(KIO::Job* job) {
+ if (job && job->className() == QString("KIO::TransferJob")) {
+ kdDebug(9018) << endl << "job started" << job->progressId();
+ KIO::TransferJob *tjob = static_cast<KIO::TransferJob*>(job);
+ connect( tjob, SIGNAL(data(KIO::Job*, const QByteArray&)),
+ this, SLOT(slotWebData(KIO::Job*, const QByteArray&)));
+ connect( tjob, SIGNAL(result(KIO::Job*)),
+ this, SLOT(slotWebResult(KIO::Job*)));
+ }
+}
+
+void PHPSupportPart::slotWebData(KIO::Job* /*job*/,const QByteArray& data) {
+ kdDebug(9018) << "slotWebData()" << endl;
+ QString strData(data);
+ m_phpExeOutput += strData;
+}
+
+void PHPSupportPart::slotWebResult(KIO::Job* /*job*/) {
+ kdDebug(9018) << "slotWebResult()" << endl;
+ QString file = getExecuteFile();
+ PHPFile *pfile = new PHPFile(this, file);
+ pfile->ParseStdout(m_phpExeOutput);
+ delete pfile;
+}
+
+void PHPSupportPart::executeInTerminal() {
+ kdDebug(9018) << "slotExecuteInTerminal()" << endl;
+
+ // Save all files once
+ if (partController()->saveAllFiles()==false)
+ return; //user cancelled
+
+ QString file = getExecuteFile();
+
+ if (m_htmlView == 0) {
+ m_htmlView = new PHPHTMLView(this);
+ mainWindow()->embedOutputView(m_htmlView->view(), i18n("PHP"), i18n("PHP") );
+ }
+
+ m_htmlView->show();
+ m_htmlView->begin();
+
+ m_phpExeOutput = "";
+ phpExeProc->clearArguments();
+ *phpExeProc << configData->getPHPExecPath();
+ *phpExeProc << "-f";
+
+ *phpExeProc << KShellProcess::quote(file);
+ kdDebug(9018) << "" << file.latin1() << endl;
+ phpExeProc->start(KProcess::NotifyOnExit,KProcess::All);
+
+ // core()->gotoDocumentationFile(KURL("http://www.php.net"));
+}
+
+void PHPSupportPart::slotReceivedPHPExeStdout (KProcess* /*proc*/, char* buffer, int buflen) {
+ kdDebug(9018) << "slotPHPExeStdout()" << endl;
+ m_phpExeOutput += QString::fromLocal8Bit(buffer,buflen+1);
+
+ QString buf = buffer;
+ if (configData->getInvocationMode() == PHPConfigData::Shell)
+ buf.replace("\n", "<br>");
+ m_htmlView->write(buf);
+}
+
+void PHPSupportPart::slotReceivedPHPExeStderr (KProcess* /*proc*/, char* buffer, int buflen) {
+ kdDebug(9018) << "slotPHPExeStderr()" << endl;
+ m_phpExeOutput += QString::fromLocal8Bit(buffer,buflen+1);
+
+ QString buf = buffer;
+ if (configData->getInvocationMode() == PHPConfigData::Shell)
+ buf.replace("\n", "<br>");
+ m_htmlView->write(buf);
+}
+
+void PHPSupportPart::slotPHPExeExited (KProcess* /*proc*/) {
+ kdDebug(9018) << "slotPHPExeExited()" << endl;
+ m_htmlView->end();
+ QString file = getExecuteFile();
+ PHPFile *pfile = new PHPFile(this, file);
+ pfile->ParseStdout(m_phpExeOutput);
+ delete pfile;
+}
+
+void PHPSupportPart::projectOpened()
+{
+ kdDebug(9018) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ if (!m_parser) {
+ m_parser = new PHPParser( this );
+ m_parser->start();
+ }
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(500, this, SLOT( initialParse() ) );
+}
+
+void PHPSupportPart::initialParse( )
+{
+ // For debugging
+ if ( !project( ) )
+ {
+ // messagebox ?
+ kdDebug( 9018 ) << "No project" << endl;
+ return ;
+ }
+
+ parseProject( );
+ return ;
+}
+
+void PHPSupportPart::projectClosed()
+{
+ kdDebug(9018) << "projectClosed()" << endl;
+
+ if (m_parser) {
+ m_parser->close() ;
+ delete( m_parser );
+ m_parser = 0;
+ }
+}
+
+bool PHPSupportPart::parseProject()
+{
+ kdDebug(9018) << "parseProject()" << endl;
+ mainWindow() ->statusBar() ->message( i18n( "Updating..." ) );
+
+ kapp->setOverrideCursor( waitCursor );
+
+ _jd = new JobData;
+
+ _jd->files = project()->allFiles();
+
+ QProgressBar* bar = new QProgressBar( _jd->files.count( ), mainWindow( ) ->statusBar( ) );
+ bar->setMinimumWidth( 120 );
+ bar->setCenterIndicator( true );
+ mainWindow()->statusBar()->addWidget( bar );
+ bar->show();
+
+ _jd->progressBar = bar;
+ _jd->it = _jd->files.begin();
+ _jd->dir.setPath( project()->projectDirectory() );
+
+ QTimer::singleShot( 0, this, SLOT( slotParseFiles() ) );
+ return TRUE;
+}
+
+void PHPSupportPart::slotParseFiles()
+{
+ kdDebug(9018) << "slotParseFiles()" << endl;
+
+ kapp->lock();
+
+ if ( _jd->it != _jd->files.end() )
+ {
+ _jd->progressBar->setProgress( _jd->progressBar->progress() + 1 );
+
+ QFileInfo fileInfo( _jd->dir, *( _jd->it ) );
+
+ if ( fileInfo.exists() && fileInfo.isFile() && fileInfo.isReadable() )
+ {
+ QString absFilePath = URLUtil::canonicalPath( fileInfo.absFilePath() );
+
+// if ( isValidSource( absFilePath ) )
+ {
+ if (m_parser)
+ m_parser->addFile( absFilePath );
+ }
+
+ ++( _jd->it );
+ }
+ QTimer::singleShot( 0, this, SLOT( slotParseFiles() ) );
+ }
+ else // finished or interrupted
+ {
+ kapp->restoreOverrideCursor();
+ mainWindow()->statusBar()->removeWidget( _jd->progressBar );
+ mainWindow()->statusBar()->message( i18n( "Done" ), 2000 );
+
+ emit updatedSourceInfo();
+ if (m_parser)
+ m_parser->startParse();
+
+ delete _jd;
+ _jd = 0;
+ }
+
+ kapp->unlock();
+}
+
+void PHPSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug(9018) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QFileInfo fileInfo( project()->projectDirectory(), *it );
+ if (m_parser) {
+ m_parser->addFile( fileInfo.absFilePath() );
+ emit addedSourceInfo( fileInfo.absFilePath() );
+ }
+ }
+}
+
+void PHPSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug(9018) << "removedFilesFromProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QFileInfo fileInfo( project()->projectDirectory(), *it );
+ QString path = fileInfo.absFilePath();
+ if ( codeModel()->hasFile(path) ) {
+ emit aboutToRemoveSourceInfo( path );
+ codeModel()->removeFile( codeModel()->fileByName(path) );
+ }
+ }
+}
+
+void PHPSupportPart::savedFile(const KURL &fileName)
+{
+ kdDebug(9018) << "savedFile()" << fileName.fileName() << endl;
+/// @fixme when activated could cause stop
+/*
+ if (m_parser) {
+ if (m_parser->hasFile( fileName.path() )) {
+ m_parser->reparseFile( fileName.path() );
+ }
+ }
+*/
+}
+
+QString PHPSupportPart::getIncludePath()
+{
+ return configData->getPHPIncludePath();
+}
+
+QString PHPSupportPart::getExePath()
+{
+ return configData->getPHPExecPath();
+}
+
+KDevLanguageSupport::Features PHPSupportPart::features()
+{
+ return Features(Classes | Functions);
+}
+
+KMimeType::List PHPSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "application/x-php" );
+ if ( mime )
+ list << mime;
+
+ mime = KMimeType::mimeType( "text/plain" );
+ if ( mime )
+ list << mime;
+ return list;
+}
+
+void PHPSupportPart::customEvent( QCustomEvent* ev )
+{
+// kdDebug(9018) << "phpSupportPart::customEvent(" << ev->type() << ") " << QThread::currentThread() << endl;
+
+ if ( ev->type() < Event_AddFile || ev->type() > Event_AddFixme )
+ return;
+
+ kapp->lock();
+
+ FileParseEvent* event = (FileParseEvent*) ev;
+ NamespaceDom ns = codeModel()->globalNamespace();
+ FileDom m_file = codeModel()->fileByName( event->fileName() );
+
+ if (!m_file) {
+ m_file = codeModel()->create<FileModel>();
+ m_file->setName( event->fileName() );
+ codeModel()->addFile( m_file );
+ }
+
+ switch (int(ev->type())) {
+ case Event_AddFile:
+ m_parser->addFile( event->fileName() );
+ break;
+
+ case Event_StartParse:
+// kdDebug(9018) << "StartParse " << event->fileName() << endl;
+ LastClass = NULL;
+ LastMethod = NULL;
+ LastVariable = NULL;
+ if ( codeModel()->hasFile( event->fileName() ) ) {
+ emit aboutToRemoveSourceInfo( event->fileName() );
+ codeModel()->removeFile( codeModel()->fileByName( event->fileName() ) );
+ emit removedSourceInfo( event->fileName() );
+ }
+ ErrorView()->removeAllProblems( event->fileName() );
+ break;
+
+ case Event_AddClass:
+ {
+// kdDebug(9018) << "AddClass " << event->name() << endl;
+ ClassDom nClass = codeModel()->create<ClassModel>();
+ nClass->setFileName( event->fileName() );
+ nClass->setName( event->name() );
+ nClass->setStartPosition( event->posititon(), 0);
+
+ m_file->addClass( nClass );
+ if ( event->arguments().isEmpty() != TRUE )
+ nClass->addBaseClass( event->arguments() );
+
+ ns->addClass( nClass );
+ LastClass = nClass;
+ }
+ break;
+
+ case Event_CloseClass:
+ if ( LastClass != NULL ) {
+// kdDebug(9018) << "CloseClass " << LastClass->name() << endl;
+ LastClass->setEndPosition( event->posititon(), 0 );
+ LastClass = NULL;
+ LastMethod = NULL;
+ LastVariable = NULL;
+ }
+ break;
+
+ case Event_AddFunction:
+ {
+// kdDebug(9018) << "AddFunction " << event->name() << endl;
+ FunctionDom nMethod = codeModel()->create<FunctionModel>();
+ nMethod->setFileName( event->fileName() );
+ nMethod->setName( event->name() );
+ nMethod->setStartPosition( event->posititon(), 0 );
+
+ ArgumentDom nArgument;
+ nArgument = codeModel()->create<ArgumentModel>();
+ nArgument->setType(event->arguments().stripWhiteSpace().local8Bit());
+ nMethod->addArgument( nArgument );
+
+ if (LastClass != NULL) {
+ LastClass->addFunction(nMethod);
+ } else {
+ ns->addFunction(nMethod);
+ }
+ LastMethod = nMethod;
+ }
+ break;
+
+ case Event_SetFunction:
+ if ( LastMethod != NULL ) {
+// kdDebug(9018) << "SetFunction " << LastMethod->name() << " " << event->name() << endl;
+ if ( event->name() == "static" )
+ LastMethod->setStatic(true);
+ else if ( event->name() == "abstract" )
+ LastMethod->setAbstract(true);
+ else if ( event->name() == "private" )
+ LastMethod->setAccess(FunctionModel::Private);
+ else if ( event->name() == "public" )
+ LastMethod->setAccess(FunctionModel::Public);
+ else if ( event->name() == "protected" )
+ LastMethod->setAccess(FunctionModel::Protected);
+ else if ( event->name() == "result" ) {
+ QString ret = "";
+ if (event->arguments().lower() == "$this" && LastClass ) {
+ ret = LastClass->name();
+ }
+ LastMethod->setResultType(ret);
+ }
+ }
+ break;
+
+ case Event_CloseFunction:
+ if ( LastMethod != NULL ) {
+// kdDebug(9018) << "CloseFunction " << LastMethod->name() << endl;
+ LastMethod->setEndPosition( event->posititon(), 0 );
+ LastMethod = NULL;
+ LastVariable = NULL;
+ }
+ break;
+
+ case Event_AddVariable:
+ {
+ VariableDom nVariable = codeModel()->create<VariableModel>();
+
+ nVariable->setFileName( event->fileName() );
+ nVariable->setName( event->name() );
+ nVariable->setStartPosition( event->posititon(), 0 );
+ nVariable->setAccess(VariableModel::Public);
+
+ if ( event->arguments().isEmpty() != TRUE )
+ nVariable->setType( event->arguments() );
+
+ if ( LastClass != NULL && ( LastMethod == NULL || event->global() == TRUE ) ) {
+// kdDebug(9018) << "AddVariable To Class " << LastClass->name() << " " << nVariable->name() << endl;
+ LastClass->addVariable(nVariable);
+ } else {
+ if ( LastMethod != NULL ) {
+ kdDebug(9018) << "AddVariable " << LastMethod->name() << " " << nVariable->name() << endl;
+ } else {
+ ns->addVariable(nVariable);
+ }
+ }
+ LastVariable = nVariable;
+ }
+ break;
+
+ case Event_SetVariable:
+ if ( LastVariable != NULL ) {
+// kdDebug(9018) << "SetVariable " << LastVariable->name() << " " << event->arguments() << endl;
+ if ( event->arguments() == "static" )
+ LastVariable->setStatic(true);
+ else if ( event->arguments() == "private" )
+ LastVariable->setAccess(FunctionModel::Private);
+ else if ( event->arguments() == "public" )
+ LastVariable->setAccess(FunctionModel::Public);
+ else if ( event->arguments() == "protected" )
+ LastVariable->setAccess(FunctionModel::Protected);
+ }
+ break;
+
+ case Event_AddTodo:
+ ErrorView()->reportProblem(Todo, event->fileName(), event->posititon(), event->arguments());
+ break;
+
+ case Event_AddFixme:
+ ErrorView()->reportProblem(Fixme, event->fileName(), event->posititon(), event->arguments());
+ break;
+
+ case Event_EndParse:
+// kdDebug(9018) << "EndParse " << event->fileName() << endl;
+ emit addedSourceInfo( event->fileName() );
+ break;
+
+ }
+
+ kapp->unlock();
+ kapp->processEvents();
+}
+
+PHPErrorView *PHPSupportPart::ErrorView( ) {
+ return m_phpErrorView;
+}
+
+PHPParser *PHPSupportPart::Parser( ) {
+ return m_parser;
+}
+
+#include "phpsupportpart.moc"
diff --git a/languages/php/phpsupportpart.h b/languages/php/phpsupportpart.h
new file mode 100644
index 00000000..83478283
--- /dev/null
+++ b/languages/php/phpsupportpart.h
@@ -0,0 +1,133 @@
+/*
+ Copyright (C) 2005 by Nicolas Escuder <n.escuder@intra-links.com>
+ Copyright (C) 2001 by smeier@kdevelop.org
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ version 2, License as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _PHPSUPPORTPART_H_
+#define _PHPSUPPORTPART_H_
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qprogressbar.h>
+
+#include <kdialogbase.h>
+#include "kdevlanguagesupport.h"
+#include <kio/job.h>
+#include <kdevgenericfactory.h>
+
+#include <ktexteditor/editinterface.h>
+
+class QStringList;
+class PHPHTMLView;
+class KShellProcess;
+class KProcess;
+class PHPErrorView;
+class PHPConfigData;
+class PHPCodeCompletion;
+class PHPParser;
+class PHPFile;
+
+class PHPSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+ PHPSupportPart( QObject *parent, const char *name, const QStringList & );
+ ~PHPSupportPart();
+
+ PHPErrorView *ErrorView();
+ PHPParser *Parser( ) ;
+
+ QString getIncludePath();
+ QString getExePath();
+
+ void emitFileParsed( PHPFile *file );
+ virtual void customEvent( QCustomEvent* ev );
+
+protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+private slots:
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void slotRun();
+ void slotNewClass();
+ void projectConfigWidget(KDialogBase *dlg);
+ void slotReceivedPHPExeStderr (KProcess* proc, char* buffer, int buflen);
+ void slotReceivedPHPExeStdout (KProcess* proc, char* buffer, int buflen);
+ void slotPHPExeExited (KProcess* proc);
+ void slotWebData(KIO::Job* job,const QByteArray& data);
+ void slotWebResult(KIO::Job* job);
+ void slotWebJobStarted(KIO::Job* job);
+
+ // Internal
+ void initialParse();
+ void slotParseFiles();
+ bool parseProject();
+
+ void slotActivePartChanged(KParts::Part *part);
+ void slotTextChanged();
+ /* the configuration was written, mostly after a config dialog call
+ -> reorder connects
+ */
+ void slotConfigStored();
+
+private:
+ QString getExecuteFile();
+ void executeOnWebserver();
+ void executeInTerminal();
+ bool validateConfig();
+
+ PHPHTMLView* m_htmlView;
+ PHPErrorView* m_phpErrorView;
+ KShellProcess* phpExeProc;
+ QString m_phpExeOutput;
+ PHPConfigData* configData;
+ PHPCodeCompletion* m_codeCompletion;
+ PHPParser* m_parser;
+ KTextEditor::EditInterface *m_editInterface;
+
+ struct JobData
+ {
+ QDir dir;
+ QGuardedPtr<QProgressBar> progressBar;
+ QStringList::Iterator it;
+ QStringList files;
+ QMap< QString, QPair<uint, uint> > pcs;
+ QDataStream stream;
+ QFile file;
+
+ ~JobData()
+ {
+ delete progressBar;
+ }
+ };
+
+ JobData * _jd;
+
+ ClassDom LastClass;
+ FunctionDom LastMethod;
+ VariableDom LastVariable;
+};
+
+typedef KDevGenericFactory<PHPSupportPart> PHPSupportFactory;
+
+#endif
diff --git a/languages/php/phptemplates b/languages/php/phptemplates
new file mode 100644
index 00000000..3be3d265
--- /dev/null
+++ b/languages/php/phptemplates
@@ -0,0 +1,4 @@
+<!DOCTYPE Templates>
+<Templates>
+ <Template code="&lt;table&gt;&lt;tr&gt;&lt;td&gt;|&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;" name="tab" description="table" suffixes="HTML (html)"/>
+</Templates>
diff --git a/languages/python/Makefile.am b/languages/python/Makefile.am
new file mode 100644
index 00000000..ddebc35d
--- /dev/null
+++ b/languages/python/Makefile.am
@@ -0,0 +1,31 @@
+# Here resides the Python support part.
+# Do not confuse this with the python part responsible for KDevelop scripting
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/languages/lib/designer_integration \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util -I$(top_builddir)/languages/lib/designer_integration \
+ $(all_includes)
+SUBDIRS = app_templates file_templates doc
+
+
+kde_module_LTLIBRARIES = libkdevpythonsupport.la kio_pydoc.la
+
+libkdevpythonsupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevpythonsupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/languages/lib/designer_integration/libdesignerintegration.la
+libkdevpythonsupport_la_SOURCES = pythonsupportpart.cpp pythonconfigwidget.cpp pythonconfigwidgetbase.ui \
+ pythonimplementationwidget.cpp qtdesignerpythonintegration.cpp
+
+kio_pydoc_la_SOURCES = pydoc.cpp
+kio_pydoc_la_LIBADD = $(LIB_KIO)
+kio_pydoc_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+METASOURCES = AUTO
+
+slavedir = $(kde_datadir)/kio_pydoc
+slave_DATA = kde_pydoc.py
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevpythonsupport.desktop pydoc.protocol
+
+rcdir = $(kde_datadir)/kdevpythonsupport
+rc_DATA = kdevpythonsupport.rc
diff --git a/languages/python/README.dox b/languages/python/README.dox
new file mode 100644
index 00000000..77d0f44c
--- /dev/null
+++ b/languages/python/README.dox
@@ -0,0 +1,48 @@
+/** \class PythonSupportPart
+This is a Python support plugin.
+
+Put a more detailed description of your part in these lines. It can span
+over several lines. You can even use some html commands in these lines like:
+<code>This is code</code>, html links <a href="http://somelocation">link text</a>,
+and images.
+
+\authors <a href="mailto:bernd AT kdevelop.org">Bernd Gehrmann</a>
+
+\maintainer <a href="mailto:$EMAIL$">$AUTHOR$</a>
+\maintainer <a href="mailto:2nd maintainer AT provider.com">2nd maintainer full name</a>
+...
+\maintainer <a href="mailto:nth maintainer AT provider.com">nth maintainer full name</a>
+
+\feature Python support
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/python/app_templates/Makefile.am b/languages/python/app_templates/Makefile.am
new file mode 100644
index 00000000..1ca030e1
--- /dev/null
+++ b/languages/python/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = pythonhello pytk pyqt
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/ScriptingLanguageIDE/PythonIDE
+profiles_DATA = python.appwizard
diff --git a/languages/python/app_templates/pyqt/.kdev_ignore b/languages/python/app_templates/pyqt/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/python/app_templates/pyqt/.kdev_ignore
diff --git a/languages/python/app_templates/pyqt/Makefile.am b/languages/python/app_templates/pyqt/Makefile.am
new file mode 100644
index 00000000..ea9502cc
--- /dev/null
+++ b/languages/python/app_templates/pyqt/Makefile.am
@@ -0,0 +1,20 @@
+dataFiles = app.py app.kdevelop fileopen.pyxpm fileprint.pyxpm \
+ filesave.pyxpm app-Makefile.am app-autogen.sh app-configure.ac \
+ documentdetails.ui missing install-sh mkinstalldirs \
+ pyqt-am-preproc.py templates-ui-dialog templates-ui-mainwin \
+ pyqt.png
+templateName = pyqt
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/python/app_templates/pyqt/app-Makefile.am b/languages/python/app_templates/pyqt/app-Makefile.am
new file mode 100644
index 00000000..78df3505
--- /dev/null
+++ b/languages/python/app_templates/pyqt/app-Makefile.am
@@ -0,0 +1,14 @@
+
+EXEEXT=
+
+pyui_files= documentdetails.py
+
+%.py : %.ui
+ pyuic $< >$@
+
+
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.py documentdetails.ui
+
+%{APPNAMELC}$(EXEEXT): $(pyui_files)
+ echo "Done"
diff --git a/languages/python/app_templates/pyqt/app-autogen.sh b/languages/python/app_templates/pyqt/app-autogen.sh
new file mode 100644
index 00000000..b380ddfd
--- /dev/null
+++ b/languages/python/app_templates/pyqt/app-autogen.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+echo "Running aclocal"
+aclocal
+echo "Running autoconf"
+autoconf
+echo "Processing Makefile.am"
+python pyqt-am-preproc.py
+echo "Running automake"
+automake
+echo "Done."
diff --git a/languages/python/app_templates/pyqt/app-configure.ac b/languages/python/app_templates/pyqt/app-configure.ac
new file mode 100644
index 00000000..62903c0f
--- /dev/null
+++ b/languages/python/app_templates/pyqt/app-configure.ac
@@ -0,0 +1,32 @@
+
+AC_INIT
+AM_INIT_AUTOMAKE(testprog,[0.1])
+
+AC_PROG_MAKE_SET
+
+# python interpreter check
+AC_PATH_PROG([PYTHON],[python])
+if test -z "${PYTHON}" ; then
+ AC_MSG_ERROR([you need Python to use this program])
+fi
+
+# PyQT check
+AC_MSG_CHECKING([whether PyQT can be used by Python])
+pyqt_present=no
+cat >pyqttest.py <<END
+import qt
+END
+${PYTHON} pyqttest.py >/dev/null 2>&1 && pyqt_present=yes
+AC_MSG_RESULT([$pyqt_present])
+
+# pyuic check
+AC_PATH_PROG([PYUIC],[pyuic])
+if test -z "${PYUIC}" ; then
+ AC_MSG_ERROR([cannot find pyuic (part of the PyQT package)])
+fi
+AC_SUBST([PYUIC])
+AC_SUBST([PYTHON])
+
+AC_CONFIG_FILES([Makefile])
+
+AC_OUTPUT
diff --git a/languages/python/app_templates/pyqt/app.kdevelop b/languages/python/app_templates/pyqt/app.kdevelop
new file mode 100644
index 00000000..a8fb1726
--- /dev/null
+++ b/languages/python/app_templates/pyqt/app.kdevelop
@@ -0,0 +1,81 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>Python</primarylanguage>
+ <keywords>
+ <keyword>Python</keyword>
+ <keyword>qt</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activedir/>
+ </general>
+ <run>
+ <mainprogram>./%{APPNAMELC}.py</mainprogram>
+ </run>
+ </kdevautoproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ <groups>
+ <group pattern="*.py" name="Python files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ </groups>
+ </kdevfileview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="py"/>
+ <type ext="ui"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/python/app_templates/pyqt/app.py b/languages/python/app_templates/pyqt/app.py
new file mode 100644
index 00000000..ede8dc54
--- /dev/null
+++ b/languages/python/app_templates/pyqt/app.py
@@ -0,0 +1,271 @@
+#!/usr/bin/env python
+
+#############################################################################
+# %{APPNAME} - PyQT application template for KDevelop
+#
+# Translated from C++ qmakeapp.cpp
+# (qmakeapp.cpp - Copyright (C) 1992-2002 Trolltech 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.
+#
+#############################################################################
+
+import sys
+import os.path
+from qt import *
+
+import documentdetails
+
+false = 0
+true = 1
+
+def load_QPixMap(fileName):
+ f = open(os.path.join(sys.path[0],fileName),"r")
+ result = QPixmap(f.readlines())
+ f.close()
+ return result
+
+class %{APPNAME}(QMainWindow):
+ """An application called %{APPNAME}."""
+
+ def __init__(self):
+ QMainWindow.__init__(self, None, "%{APPNAME}")
+ self.initIcons()
+ self.setup()
+ self.initPrinter()
+ self.initToolBar()
+ self.initMenu()
+ self.initMainWidget()
+ self.setCaption(self.appTitle)
+
+ def setup(self):
+
+ self.appTitle = "%{APPNAME} - PyQT Application Example"
+
+ self.menu = [
+ ('&File',
+ [('&New', self.slotNewFile),
+ ('&Open...', self.slotOpenFile, self.openIcon),
+ ('&Save', self.slotSaveFile, self.saveIcon),
+ ('Save &as...', self.slotSaveAs),
+ ('&Print...', self.slotPrint, self.printIcon),
+ ('&Edit details...', self.slotEditDetails),
+ (None,)]),
+ ('&Help',
+ [('&About', self.slotAbout),
+ ('About &QT', self.slotAboutQT),
+ (None, ),
+ ('What\'s this', self.slotWhatsThis)])
+ ]
+
+ self.toolbar = [
+ ("filetools", "file operations", "File Operations",
+ [("fileopen",
+ (self.openIcon, "open file", "Open File", self.slotOpenFile),
+ "<p>Click this button to open a <em>new file</em>. <br>" + \
+ "You can also select the <b>Open</b> command " + \
+ "from the <b>File</b> menu.</p>"),
+ ("filesave",
+ (self.saveIcon, "save file", "Save File", self.slotSaveFile),
+ "<p>Click this button to save the file you " + \
+ "are editing. You will be prompted for a file name.\n" + \
+ "You can also select the <b>Save</b> command " + \
+ "from the <b>File</b> menu.</p>"),
+ ("fileprint",
+ (self.printIcon, "print file", "Print File", self.slotPrint),
+ "Click this button to print the file you " + \
+ "are editing.\n You can also select the Print " + \
+ "command from the File menu."
+ )])]
+
+ self.fileName = ""
+
+
+ def initMainWidget(self):
+ self.editor = QTextEdit(self, "editor")
+ self.editor.setFocus()
+ self.setCentralWidget(self.editor)
+ self.statusBar().message("Ready", 2000)
+ self.resize(450,600)
+
+ def initPrinter(self):
+ self.printer = QPrinter()
+
+ def initIcons(self):
+ self.openIcon = QIconSet( load_QPixMap("fileopen.pyxpm"))
+ self.saveIcon = QIconSet( load_QPixMap("filesave.pyxpm"))
+ self.printIcon = QIconSet( load_QPixMap("fileprint.pyxpm"))
+
+ def initToolBar(self):
+
+ self.toolbars = {}
+ for (toolBarID, toolBarName, toolBarDescr, toolBarButtons) in self.toolbar:
+ self.toolbars[toolBarID] = QToolBar(self, toolBarName)
+ self.toolbars[toolBarID].setLabel(toolBarDescr)
+ for (buttonID, (buttonIcon, buttonName, buttonText, buttonSlot), whatsThisText) in toolBarButtons:
+ toolButton = QToolButton(buttonIcon, buttonText, "", buttonSlot, self.toolbars[toolBarID], buttonName)
+ QWhatsThis.add( toolButton, whatsThisText )
+ self.whatsThisButton = QWhatsThis.whatsThisButton(self.toolbars[toolBarID])
+
+
+ def initMenu(self):
+
+ for (menuName, subMenu) in self.menu:
+ menu = QPopupMenu(self)
+ self.menuBar().insertItem( menuName, menu )
+ for menuOption in subMenu:
+ if len(menuOption)==1:
+ menu.insertSeparator()
+ elif len(menuOption)==2:
+ menu.insertItem( menuOption[0], menuOption[1] )
+ elif len(menuOption)==3:
+ menu.insertItem( menuOption[2], \
+ menuOption[0], \
+ menuOption[1] )
+
+
+
+ def slotNewFile(self):
+ ed = %{APPNAME}()
+ ed.setCaption(self.appTitle)
+ ed.show()
+
+ def slotOpenFile(self):
+ fileName = str(QFileDialog.getOpenFileName("", "", self))
+ print fileName
+ if not fileName=="":
+ self.load(fileName)
+ else:
+ self.statusBar().message("Loading aborted", 2000)
+
+ def slotSaveFile(self):
+ if self.fileName=="":
+ self.saveAs()
+ return
+ self.save()
+
+
+ def slotSaveAs(self):
+ pass
+
+ def slotPrint(self):
+ margin = 10
+ pageno = 1
+ if self.printer.setup(self):
+ self.statusBar().message("Printing...");
+ p = QPainter()
+ if not p.begin(self.printer): return
+
+ p.setFont( self.editor.font() )
+ yPos = 0
+ fontMetrics = p.fontMetrics()
+ metrics = QPaintDeviceMetrics(self.printer)
+ for i in range(self.editor.lines()):
+ if margin + yPos > metrics.height() - margin:
+ pageNo += 1
+ self.statusBar().message("Printing (page " + pageNo + ")...")
+ self.printer.newPage()
+ yPos = 0
+ p.drawText( margin, margin+yPos, \
+ metrics.width(), \
+ fontMetrics.lineSpacing(), \
+ QPainter.ExpandTabs | QPainter.DontClip, \
+ self.editor.text(i) )
+ yPos += fontMetrics.lineSpacing()
+ p.end()
+ self.statusBar().message("Printing completed", 2000)
+ else:
+ self.statusBar().message("Printing aborted", 2000)
+
+ def slotClose(self):
+ pass
+
+ def slotQuit(self):
+ pass
+
+ def slotEditDetails(self):
+ docDet = documentdetails.documentDetails(self)
+ docDet.show()
+
+ def slotWhatsThis(self):
+ self.whatsThis()
+
+ def slotAbout(self):
+ QMessageBox.about(self, self.appTitle, \
+ "This example demonstrates the simple use of\n" + \
+ "QMainWindow, QMenuBar and QToolBar using QT\n" + \
+ "and Python.")
+
+ def slotAboutQT(self):
+ QMessageBox.aboutQt(self, self.appTitle)
+
+ def load(self,fileName):
+ f = open(fileName,"r")
+ if f:
+ self.editor.setText( f.read() )
+ self.editor.setModified(false)
+ self.setCaption(fileName)
+ self.statusBar().message("Loaded document " + fileName, 2000)
+ self.fileName = fileName
+ else:
+ self.statusBar().message("Could not load " + fileName, 5000)
+ return
+
+ def saveAs(self):
+ fileName = str(QFileDialog.getSaveFileName(None, None, self))
+ if fileName!="":
+ self.fileName = fileName
+ self.save()
+ else:
+ self.statusBar().message("Saving aborted", 2000)
+
+ def save(self):
+ if self.fileName=="":
+ self.saveAs()
+ return
+ text = str(self.editor.text())
+ try:
+ f = open(self.fileName, "w")
+ f.write(text)
+ except:
+ self.statusBar().message("Could not write to " + self.fileName)
+ f.close()
+ return
+ f.close()
+ self.editor.setModified(false)
+ self.setCaption(self.fileName)
+ self.statusBar().message( "File " + self.fileName + " saved", 2000)
+
+ def closeEvent(self, closeEvent):
+ if not self.editor.isModified():
+ closeEvent.accept()
+ return
+
+ yesNoCancel = QMessageBox.information(self, self.appTitle,
+ "Do you want to save the changes\n" + \
+ "to the document?", \
+ "Yes", "No", "Cancel",
+ 0, 1)
+ if yesNoCancel == 0:
+ self.save()
+ closeEvent.accept()
+ elif yesNoCancel == 1:
+ closeEvent.accept()
+ else:
+ closeEvent.ignore()
+
+
+
+
+def main(args):
+ app=QApplication(args)
+ mainWindow = %{APPNAME}()
+ mainWindow.show()
+ app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+ app.exec_loop()
+
+
+
+if __name__ == "__main__":
+ main(sys.argv)
diff --git a/languages/python/app_templates/pyqt/documentdetails.ui b/languages/python/app_templates/pyqt/documentdetails.ui
new file mode 100644
index 00000000..130d30ef
--- /dev/null
+++ b/languages/python/app_templates/pyqt/documentdetails.ui
@@ -0,0 +1,80 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>documentDetails</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>documentDetails</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>561</width>
+ <height>555</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Document Details</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Enter details about this document below.</string>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Author</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Name:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>lineEdit1</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Company</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<includes>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/python/app_templates/pyqt/fileopen.pyxpm b/languages/python/app_templates/pyqt/fileopen.pyxpm
new file mode 100644
index 00000000..e90fcfee
--- /dev/null
+++ b/languages/python/app_templates/pyqt/fileopen.pyxpm
@@ -0,0 +1,19 @@
+ 16 13 5 1
+. c #040404
+# c #808304
+a c None
+b c #f3f704
+c c #f3f7f3
+aaaaaaaaa...aaaa
+aaaaaaaa.aaa.a.a
+aaaaaaaaaaaaa..a
+a...aaaaaaaa...a
+.bcb.......aaaaa
+.cbcbcbcbc.aaaaa
+.bcbcbcbcb.aaaaa
+.cbcb...........
+.bcb.#########.a
+.cb.#########.aa
+.b.#########.aaa
+..#########.aaaa
+...........aaaaa
diff --git a/languages/python/app_templates/pyqt/fileprint.pyxpm b/languages/python/app_templates/pyqt/fileprint.pyxpm
new file mode 100644
index 00000000..26f3ca9d
--- /dev/null
+++ b/languages/python/app_templates/pyqt/fileprint.pyxpm
@@ -0,0 +1,21 @@
+ 16 14 6 1
+. c #000000
+# c #848284
+a c #c6c3c6
+b c #ffff00
+c c #ffffff
+d c None
+ddddd.........dd
+dddd.cccccccc.dd
+dddd.c.....c.ddd
+ddd.cccccccc.ddd
+ddd.c.....c....d
+dd.cccccccc.a.a.
+d..........a.a..
+.aaaaaaaaaa.a.a.
+.............aa.
+.aaaaaa###aa.a.d
+.aaaaaabbbaa...d
+.............a.d
+d.aaaaaaaaa.a.dd
+dd...........ddd
diff --git a/languages/python/app_templates/pyqt/filesave.pyxpm b/languages/python/app_templates/pyqt/filesave.pyxpm
new file mode 100644
index 00000000..3f28c25d
--- /dev/null
+++ b/languages/python/app_templates/pyqt/filesave.pyxpm
@@ -0,0 +1,19 @@
+ 14 14 4 1
+. c #040404
+# c #808304
+a c #bfc2bf
+b c None
+..............
+.#.aaaaaaaa.a.
+.#.aaaaaaaa...
+.#.aaaaaaaa.#.
+.#.aaaaaaaa.#.
+.#.aaaaaaaa.#.
+.#.aaaaaaaa.#.
+.##........##.
+.############.
+.##.........#.
+.##......aa.#.
+.##......aa.#.
+.##......aa.#.
+b.............
diff --git a/languages/python/app_templates/pyqt/install-sh b/languages/python/app_templates/pyqt/install-sh
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/python/app_templates/pyqt/install-sh
diff --git a/languages/python/app_templates/pyqt/missing b/languages/python/app_templates/pyqt/missing
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/python/app_templates/pyqt/missing
diff --git a/languages/python/app_templates/pyqt/mkinstalldirs b/languages/python/app_templates/pyqt/mkinstalldirs
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/python/app_templates/pyqt/mkinstalldirs
diff --git a/languages/python/app_templates/pyqt/pyqt b/languages/python/app_templates/pyqt/pyqt
new file mode 100644
index 00000000..24b1b72f
--- /dev/null
+++ b/languages/python/app_templates/pyqt/pyqt
@@ -0,0 +1,10 @@
+# KDE Config file
+[General]
+Name=Python Qt application
+Name[fr]=Une application Qt avec PYTHON
+Icon=pyqt.png
+Category=Python
+Comment=This generates an application framework using Python and Qt
+Comment[fr]=Génère un squelette d'application Qt dans le language PYTHON.
+FileTemplates=py,ShellStyle
+ShowFilesAfterGeneration=APPNAMELC.py
diff --git a/languages/python/app_templates/pyqt/pyqt-am-preproc.py b/languages/python/app_templates/pyqt/pyqt-am-preproc.py
new file mode 100644
index 00000000..dda5e2c3
--- /dev/null
+++ b/languages/python/app_templates/pyqt/pyqt-am-preproc.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+# Preprocess Makefile.am for PyQT project
+# Julian Rockey 2002
+
+# TODO:
+# Test real_lines properly
+# Process Makefile.am's in sub-directories
+
+from __future__ import generators
+import sys
+import re
+
+# function to convert list of lists with continuation chars
+# (bashslashes) to list of actual lines
+def real_lines(m):
+ while len(m)>0:
+ result = ""
+ if m[0][-1]=='\\':
+ while (len(m)>0 and m[0][-1]=='\\'):
+ result += m[0][:-1]
+ m=m[1:]
+ if len(m)>0:
+ result += m[0]
+ m=m[1:]
+ yield result
+
+# check for arguments
+if len(sys.argv)<2:
+ makefile_am = "Makefile.am"
+else:
+ makefile_am = sys.argv[1]
+
+
+# read in Makefile.am
+f = open(makefile_am,"r")
+mf = f.readlines()
+f.close()
+
+# parse for variables
+re_variable = re.compile("^(#kdevelop:[ \t]*)?([A-Za-z][A-Za-z0-9_]*)[ \t]*:?=[ \t]*(.*)$")
+variables = {}
+
+
+for l in real_lines(mf):
+ m = re_variable.match(l)
+ if m!=None:
+ (nowt, lhs, rhs) = m.groups()
+ variables[lhs]=rhs
+
+# look for app sources
+for (var,data) in variables.items():
+ spl = var.split("_",1)
+ spl.append("")
+ (prefix,primary) = (spl[0], spl[1])
+ if primary=="PROGRAMS":
+ target=data
+ if variables.has_key(target + "_SOURCES"):
+ sources = variables[target+"_SOURCES"].split()
+
+# change .ui into .py
+py_sources = []
+for s in sources:
+ py_sources.append(re.sub("\.ui$",".py",s))
+
+# replace dependencies of main target with list of .py sources
+# FIXME escape target
+re_maintarget = re.compile("(" + target + ".*?:).*")
+out = []
+for l in mf:
+ m = re_maintarget.match(l)
+ if m!=None:
+ (tar,)=m.groups()
+ l=tar + " " + " ".join(py_sources) + "\n"
+ out.append(l)
+
+# backup existing Makefile.am
+f = open(makefile_am + "~", "w")
+f.writelines(mf)
+f.close()
+
+# write file
+f = open(makefile_am, "w")
+f.writelines(out)
+f.close()
diff --git a/languages/python/app_templates/pyqt/pyqt.kdevtemplate b/languages/python/app_templates/pyqt/pyqt.kdevtemplate
new file mode 100644
index 00000000..bffbcd8c
--- /dev/null
+++ b/languages/python/app_templates/pyqt/pyqt.kdevtemplate
@@ -0,0 +1,168 @@
+# KDE Config File
+[General]
+Name=Python Qt application
+Name[ca]=Aplicació per a Qt en Python
+Name[da]=Python Qt program
+Name[de]=Python/Qt-Anwendung
+Name[el]=ΕφαÏμογή Python Qt
+Name[es]=Aplicación Qt en Python
+Name[et]=Pythoni Qt rakendus
+Name[eu]=Python Qt aplikazioa
+Name[fa]=کاربرد پیتون Qt
+Name[fr]=Application Qt Python
+Name[ga]=Feidhmchlár Qt Python
+Name[gl]=Aplicación Qt en Python
+Name[hu]=Python/Qt-alapú alkalmazás
+Name[it]=Applicazione Qt Python
+Name[ja]=Python Qt アプリケーション
+Name[nds]=Python Qt-Programm
+Name[ne]=पाइथोन कà¥à¤¯à¥‚ टी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=Python Qt-toepassing
+Name[pl]=Program Qt w Pythonie
+Name[pt]=Aplicação Qt em Python
+Name[pt_BR]=Aplicação Qt em Python
+Name[ru]=Приложение Qt на Python
+Name[sk]=Python Qt aplikácia
+Name[sr]=Python-Qt програм
+Name[sr@Latn]=Python-Qt program
+Name[sv]=Python Qt-program
+Name[tr]=Python Qt Uygulaması
+Name[zh_CN]=Python Qt 应用程åº
+Name[zh_TW]=Python Qt 應用程å¼
+Icon=pyqt.png
+Category=Python
+Comment=This generates an application framework using Python and Qt
+Comment[ca]=Genera una infraestructura d'aplicació usant Python i Qt
+Comment[da]=Dette genererer et programskelet ved brug af Python og Qt
+Comment[de]=Hiermit wird ein Anwendungsgerüst unter Verwendung von Python und Qt erstellt
+Comment[el]=Αυτό δημιουÏγεί ένα πλαίσιο εφαÏμογής χÏησιμοποιώντας τις Python και Qt
+Comment[es]=Genera una infraestructura de aplicación que usa Python y Qt
+Comment[et]=Rakenduse raamistiku loomine Pythoni ja Qt abil
+Comment[eu]=Honek Python eta Qt darabiltzan aplikazioen lan-marko bat sortzen du
+Comment[fa]=یک چارچوب کاربرد با استÙاده از پیتون Ùˆ Qt تولید می‌کند
+Comment[fr]=Génère une infrastructure d'application utilisant Python et Qt
+Comment[ga]=Cruthaíonn sé seo creatlach feidhmchláir le Python agus Qt
+Comment[gl]=Isto xera un contorno de traballo para unha aplicación usando Python e Qt
+Comment[hu]=Létrehoz egy alkalmazás-keretrendszert Python nyelven, a Qt felhasználásával
+Comment[it]=Genera l'infrastruttura applicativa usando Python e Qt
+Comment[ja]=Python 㨠Qt を使ã£ã¦ã‚¢ãƒ—リケーションフレームワークを作æˆã—ã¾ã™
+Comment[nds]=Dit stellt mit Python un Qt en Programmrahmenwark op.
+Comment[ne]=यसले पाइथोन र कà¥à¤¯à¥‚ टी पà¥à¤°à¤¯à¥‹à¤— गरेर अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Dit genereert een toepassingsframework met behulp van Python en Qt
+Comment[pl]=Generuje szablon programu używającego Pythona i Qt
+Comment[pt]=Isto cria a plataforma de uma aplicação que usa o Python e o Qt
+Comment[pt_BR]=Isto cria a plataforma de uma aplicação que usa o Python e o Qt
+Comment[ru]=Создание Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Qt на Python
+Comment[sk]=Vygeneruje aplikaÄný framework používajúci Python a Qt
+Comment[sr]=Прави радни оквир програма кориÑтећи Python и Qt
+Comment[sr@Latn]=Pravi radni okvir programa koristeći Python i Qt
+Comment[sv]=Detta skapar ett programramverk med användning av Python och Qt
+Comment[tr]=Bu Python ve Qt kullanan bir uygulama çatısı yaratır.
+Comment[zh_CN]=这将生æˆä¸€ä¸ªä½¿ç”¨ Python å’Œ Qt 的应用程åºæ¡†æž¶
+Comment[zh_TW]=產生一個使用 Python 與 Qt 的應用程å¼æ¡†æž¶
+FileTemplates=py,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.py
+Archive=pyqt.tar.gz
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.py
+Dest=%{dest}/%{APPNAMELC}.py
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{src}/documentdetails.ui
+Dest=%{dest}/documentdetails.ui
+
+[FILE4]
+Type=install
+Source=%{src}/app-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE5]
+Type=install
+Source=%{src}/app-configure.ac
+Dest=%{dest}/configure.ac
+
+[FILE6]
+Type=install
+Source=%{src}/app-autogen.sh
+Dest=%{dest}/autogen.sh
+
+[FILE7]
+Type=install
+Source=%{src}/mkinstalldirs
+Dest=%{dest}/mkinstalldirs
+
+[FILE8]
+Type=install
+Source=%{src}/missing
+Dest=%{dest}/missing
+
+[FILE9]
+Type=install
+Source=%{src}/install-sh
+Dest=%{dest}/install-sh
+
+[FILE10]
+Type=install
+Source=%{src}/pyqt-am-preproc.py
+Dest=%{dest}/pyqt-am-preproc.py
+
+[FILE11]
+Type=install
+Source=%{src}/fileopen.pyxpm
+Dest=%{dest}/fileopen.pyxpm
+
+[FILE12]
+Type=install
+Source=%{src}/fileprint.pyxpm
+Dest=%{dest}/fileprint.pyxpm
+
+[FILE13]
+Type=install
+Source=%{src}/filesave.pyxpm
+Dest=%{dest}/filesave.pyxpm
+
+[MSG]
+Type=message
+Comment=A Python Qt application was created in %{dest}
+Comment[ca]=Una aplicació per a Qt en Python ha estat creada en %{dest}
+Comment[da]=Et Python Qt program blev oprettet i %{dest}
+Comment[de]=Eine Python/Qt-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή Python Qt δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación Qt en Python ha sido creada en %{dest}
+Comment[et]=Pythoni Qt rakendus loodi asukohta %{dest}
+Comment[eu]=Python eta Qt darabiltzan aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد پیتون Qt در %{dest} ایجاد شد
+Comment[fr]=Une application Qt Python a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár Python Qt i %{dest}
+Comment[gl]=Creouse unha aplicación Qt en Python en %{dest}
+Comment[hu]=Létrejött egy Python/Qt-alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Qt Python in %{dest}
+Comment[ja]=Python Qt アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Python-Qt-Programm opstellt.
+Comment[ne]=पाइथोन कà¥à¤¯à¥‚ टी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Python Qt-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program używający Pythona i Qt został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação Qt em Python em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação Qt em Python em %{dest}
+Comment[ru]=Приложение Qt на Python Ñоздано в %{dest}
+Comment[sk]=Python Qt aplikácia bola vytvorená v %{dest}
+Comment[sr]= Python-Qt програм је направљен у %{dest}
+Comment[sr@Latn]= Python-Qt program je napravljen u %{dest}
+Comment[sv]=Ett Python Qt-program skapades i %{dest}
+Comment[tr]=Bir Python Qt uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个 Python Qt 应用程åº
+Comment[zh_TW]=一個 Python Qt 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/python/app_templates/pyqt/pyqt.png b/languages/python/app_templates/pyqt/pyqt.png
new file mode 100644
index 00000000..207b942f
--- /dev/null
+++ b/languages/python/app_templates/pyqt/pyqt.png
Binary files differ
diff --git a/languages/python/app_templates/pyqt/templates-ui-dialog b/languages/python/app_templates/pyqt/templates-ui-dialog
new file mode 100644
index 00000000..fc2aefce
--- /dev/null
+++ b/languages/python/app_templates/pyqt/templates-ui-dialog
@@ -0,0 +1,20 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>Form1</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>Form1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form1</string>
+ </property>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/python/app_templates/pyqt/templates-ui-mainwin b/languages/python/app_templates/pyqt/templates-ui-mainwin
new file mode 100644
index 00000000..854da009
--- /dev/null
+++ b/languages/python/app_templates/pyqt/templates-ui-mainwin
@@ -0,0 +1,436 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>Form1</class>
+<widget class="QMainWindow">
+ <property name="name">
+ <cstring>Form1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form1</string>
+ </property>
+</widget>
+<menubar>
+ <property name="name">
+ <cstring>menubar</cstring>
+ </property>
+ <item text="&amp;File" name="fileMenu">
+ <action name="fileNewAction"/>
+ <action name="fileOpenAction"/>
+ <action name="fileSaveAction"/>
+ <action name="fileSaveAsAction"/>
+ <separator/>
+ <action name="filePrintAction"/>
+ <separator/>
+ <action name="fileExitAction"/>
+ </item>
+ <item text="&amp;Edit" name="editMenu">
+ <action name="editUndoAction"/>
+ <action name="editRedoAction"/>
+ <separator/>
+ <action name="editCutAction"/>
+ <action name="editCopyAction"/>
+ <action name="editPasteAction"/>
+ <separator/>
+ <action name="editFindAction"/>
+ </item>
+ <item text="&amp;Help" name="helpMenu">
+ <action name="helpContentsAction"/>
+ <action name="helpIndexAction"/>
+ <separator/>
+ <action name="helpAboutAction"/>
+ </item>
+</menubar>
+<toolbars>
+</toolbars>
+<actions>
+ <action>
+ <property name="name">
+ <cstring>fileNewAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image0</iconset>
+ </property>
+ <property name="text">
+ <string>New</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;New</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+N</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileOpenAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image1</iconset>
+ </property>
+ <property name="text">
+ <string>Open</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Open...</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+O</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image2</iconset>
+ </property>
+ <property name="text">
+ <string>Save</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Save</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+S</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Save As</string>
+ </property>
+ <property name="menuText">
+ <string>Save &amp;As...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>filePrintAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image3</iconset>
+ </property>
+ <property name="text">
+ <string>Print</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Print...</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+P</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileExitAction</cstring>
+ </property>
+ <property name="text">
+ <string>Exit</string>
+ </property>
+ <property name="menuText">
+ <string>E&amp;xit</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editUndoAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image4</iconset>
+ </property>
+ <property name="text">
+ <string>Undo</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Undo</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+Z</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editRedoAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image5</iconset>
+ </property>
+ <property name="text">
+ <string>Redo</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Redo</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+Y</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editCutAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image6</iconset>
+ </property>
+ <property name="text">
+ <string>Cut</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Cut</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+X</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editCopyAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image7</iconset>
+ </property>
+ <property name="text">
+ <string>Copy</string>
+ </property>
+ <property name="menuText">
+ <string>C&amp;opy</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+C</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editPasteAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image8</iconset>
+ </property>
+ <property name="text">
+ <string>Paste</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Paste</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+V</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editFindAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image9</iconset>
+ </property>
+ <property name="text">
+ <string>Find</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Find...</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+F</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpContentsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Contents</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Contents...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpIndexAction</cstring>
+ </property>
+ <property name="text">
+ <string>Index</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Index...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpAboutAction</cstring>
+ </property>
+ <property name="text">
+ <string>About</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;About</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+</actions>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="721">789cedd2b10ac2301405d03d5ff148b62056035241fc04c5511087f425a2432b681d44fc777ba329d6b47fe07d19dee50cc9904cd376b3229d896b6deb13131fed85b4bb95e57db75f3e8434869a93d3548e841c13d3fa5c79ecaad9d52404b540351e83caa833c6a03ad4798e41f5a86c30a816f510126ee94d14d52611fb8e2ad49070a4445ca4447ca4446ca444da07fecac7ffd2956ebe64f81ff4c873215e0583a9b0</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="691">789cad914d0ac2301085f739c5d0d915b11a140ae211149782b898448b2e5a41eb42c4bb9b9fa6a67644045f0299978f37134896c27ab5803413979aeaa3067da033a4bb6b59de36dbf95d245282d953182703910c41c3f254ed6d8da6c69193b5dada7c924b6fc9dac2c85b156c51b83eacfe41d0c89defc4dfa2dd7c37fc44b025a179043c4152a4b055f4365414ad0e8901fd94c1ae5e19441da9211c68e7f44098d3074d86019e70a0210c089958df7ffb31134fa13797a8</data>
+ </image>
+ <image name="image2">
+ <data format="XPM.GZ" length="691">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523232520022530543251d2e253d856405bffcbc54105b19c856360003103711c4b530b13082709340dc644310047193c1dcc424d314883958015846190b80ca24262a2721012087349964a030ba69c9c9303d403e9132087b68279388ecff4414193440948c32aa71d86470bb80863258a21b9a0eb0a7905a6b2e006d59a436</data>
+ </image>
+ <image name="image3">
+ <data format="XPM.GZ" length="2509">789c7d944973db461085effa152cf54d956a932089a55239c896572d96bcc4b253390033186ea2488aa416a7f2dfd3db0cbd44e6d340f8f8def43406209e1c742ecf4f3b074ff6d69b7a33711d37ae6f3a077e3b9f3ffcf5f71fffeced675987fecab293edffb6b77fb1e9b8ced9e2ba65c08c00baf2117e2f5c86d02d99e196b9d7ed963df53f2ab3c47789258fa7c26564688d4bf30f23673de113e6ac1719ae9459e27f4d5c893f17ae126f8d2be3ebc87d9dff4e3904f317ccfd5ef23f28b3c45f26963c7e510ec1fc9570157dd81857967f883c90cd8635f3208b8c0b6596f863e17a500fd597fe8744c35afc1be33aef8bff5ad9b5e637cc7993f7f346fca571637c1fb9d0f99f9543b07ab2df453ff9723d0551a1f3d791cb8170573904f3a5bf725034e66f133be96fa44c1246799e4a573495e461a29cfcbbc8e64f8d9df96564f5519e876a1019668975fda05c593d5c25d67a6f945d6ef3bdb08b3ed491eba1e467c6561fcf229bff4ad9b5c6c7ccf530fa8089bdf8136596703fb1f800c23ee5ff548e3e7a636f3c8ddc68bd8ab91926066596b05c5fe359c285b2cf8de5f7ed7296f050b825d6f74763dc1a0f227bcdbf60f679e29789353f5666093f4facfe857208e63f156e93df8bdc16c223e358ff28b2f939735b240eca2ce1678983f0a57208e6bf150ec96f8d83f127e650b084cf85e5a32fdf9d10b0c6c6e44835c9631dfd9ff235b618925ad1e89779278af5750df7681ea40316d8111eef876a79ad977ae773d8257ec8efead629fdeb3ca4ba9ae6e11fcdbbef6aa72b7934ef695702eddf4e631a13d2f4c73cd599e115f533a639bbc173e6788d0b5cf23a314fe915dee01a37df698bb77887f7f8805ff190e64c342fb59fe2333ca2e373d30b7c89aff035bec1634a9e904ef1417faf78866ff1fc275de03b7c4fa3a1553e50fd8f78a2ef0bfcf43fe973bcc4cff805bb74d6a3de0e31b37c9f561fe090c6583a19612e9d1dd179417db1575237191eeafb172b9cd22a7d409a7bcc8f0c4e68f01900ef44090db8547f4ee9a966456732445083078f779a8756dfdf52f19b1cd59c699254e31c46d0703f30b6fa5239a5d27faabc22b78409de838316bdd51fd1377730a531a12bd363c949aa3d936f1a6821e8fda566aef8fe011d612eba860569495a9196721ebe7d7ed0c30dac491b58d2bd21c116b634bf25ddd2fd9dd9f3f6efef7bff0111915e41</data>
+ </image>
+ <image name="image4">
+ <data format="XPM.GZ" length="661">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523232520022630543251d2e253d856405bffcbc54105b19c8563600020b13103711c4b530b1308270f5b082019251068344848c32b23808206494a1e23015890819653db8b81e44255c0659025d460fa70c6e3d78ec814b21b90d052422fb070540f50ebaf84196a9b5e6020011bc73cc</data>
+ </image>
+ <image name="image5">
+ <data format="XPM.GZ" length="661">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523232520022630543251d2e253d856405bffcbc54103b11c8563600020b13105719c4b530b1308270f5b0027acb28278201a64c221c4084136132ca7011885c225c06c91890542256193d98a198327a386570ea49449581bb4d2f114d0624a08c230c50fd4f5cb80da04cad351700f7fd8672</data>
+ </image>
+ <image name="image6">
+ <data format="XPM.GZ" length="661">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523232520022630543251d2e253d856405bffcbc54105b19c856360003103711c6b53002abc40a90649491482ac92863955146d6822ca387474619c9301419a03842825819245bd064129513b1cb242602512216994430d44bc4904984c8c1a5e032897a3019a8144c26518f800c92715864d0ec81ab4dc4701b924fb0850e8a4cad351700fbd07ccb</data>
+ </image>
+ <image name="image7">
+ <data format="XPM.GZ" length="706">789c9d92cb0ac2301045f7f98aa1d915b1da8214c44f505c0ae26226b1e8a20a5a1722febb9924a5af58c19b40e77238a1842431ecb66b881371afb03a2b5027bc41ac1f65f9dc1f562f11a52998bd80793411d114146cae9723cfd2cc7266c395ea9aa75c15d74c65aad05c35d79c727215b91636f6d860c689f40910b4e92147d840b3be39d8416d877c860eb9af478d23919c4b8a7a0ed68eb628e4a04521c7fd46c07138e47448dbf1f32fc767e8d43735741af287d3ced83b782fc5075b18a5a5</data>
+ </image>
+ <image name="image8">
+ <data format="XPM.GZ" length="736">789c7d92d10a82301486eff714c3dd49649984103d42d165105dcce3465d58507611d1bbb773d674aed93f85fd7efb183ab394ef771b9e66ecdecaf60c1c4ef2c6d3fad134cfc371fd62499e7373957c9e4c5832e5c0b7d78bc2b9307331a36055ae960556c05a16656e69e5aaa5355658c202965825566d62176b57b5a64da3f188c084841e0a29a5e831910ef8885e4854501922e8a6b923586a176a8e40051ec1e63b7d0267387c6738424775091d653f98565a858e26c110447107d1886350d4a1c41c3dea7864e87c37f3ce47fc3aee7cd5207ffe90f78a7d0007c6c175</data>
+ </image>
+ <image name="image9">
+ <data format="XPM.GZ" length="2798">789cb5d5594f1b491007f0773e8545bda1d53ff81a7bb4da07830103b603b92059edc34cf78c0ff0812f3051befb5677554f56c24428d2aa78e0a7aeaeea6be0dd41e9f6aa573a78b7b75c25ab91299961b2281dd8f564b2fdfb9fbfbeefed572a25fe291f46a5cafe1f7bfbd7ab9229f567d3cc81fa0caa945d785f78c72ebc2f9dabb10bef9e73ade2c21913e77ae2c28f2fc48d6a947ab7c4b169d6bc8f9ca3aa0b3fbfaf4e35ff4c5cccdf8813db34de1def34e4c3881b3cc38fb7d5a918f78525ff46dcaca9576a23a627715cd3f53e8a131b7b63edecba69fd8d3af41b1496fa6d7153f78f86b8a86f0bcbfe9ec5493d16cfc5695dfad34c6d651ca9f7cffdbd173743fd441cd64f0f85a5fe489c6a3fd4d5613c0d4eeade43b189747c1b2ce3683abbeebadf5a702ae343716c743d53313f1febc7bfa843bf1371581f9d06ebf8581df257e2b01eba57675a5fea19177e7c109cfa712271aceba58938b13a6ec4a13fba62ee27f53fa9b51fe5c1ba7f7f1f71cd85f7545cdcf73ad8f8ef137762de9fd4ef898b7e51b0d63f52877e65b10de3c785657eacced4fe7b77b763236fab36fa3e1ec5a9d5f341b0e4d3526c42bd4ab0eee7505cf4fb28ce1aea6fc146fa7f76e6d3e115fafa5d7112cebf254eeb328e6a70967b9f8b437fba13db4ceb2fc5453f7f5ffcfac2795f046bbd0fe2a2df486c42bd2bb18dd46375e89f89b99fccf7ef2dadbbf0eea8add6bf16db4cbd1067b9de8fafc7b7a1ef13cf6213e50defadd846b9acff569c3574fe833ad7fa5fc57943cfdb9f9f894cd8cf93982748fdb9386f64dee4df97c978ff52ef4c9d69ff9938cff53cfdf7ec5627f5ae576f8fdfcf0721410ac391c222fb753e720c30c408638e3bdcf31c7a3d9fb3279862c631c70316586285f5ae1e727fd8e091f3e678c216cf68e108c768e3e4957ccb2b39e5fc337470ce71814b74d143ffe59ae4ff01ae7825d7f8c0753fe213d7ff8c2ffcfb0deccefc016ef115df380e51460555d4504784069aafe48f798f87885126a04a4409a564c8be92bfc115655cb94c395a34409d8634a231afe7c58ee5ef35d7bae3dc2eddd384a634a339c7032d90efcce7bba225ad38525aa3461b7ae478da75037a5f2758d196525ec93359aedde23882a563ae95edc8cf90529b4ee894c6bcf2844f66e2ce1239cf9afc7755c5fbc9b8479fdabcc71b3aa38ee4d039d7b9a04b1ecb5ebe677ea1964712ead2f9cf8aac1ecfd10a6f79ffdc7b4d7dee92bcfd7be1bd5ff29ccedbbf2f90dbfbfffefdfef873ef5fce01d04a</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>fileNewAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>fileNew()</slot>
+ </connection>
+ <connection>
+ <sender>fileOpenAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>fileOpen()</slot>
+ </connection>
+ <connection>
+ <sender>fileSaveAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>fileSave()</slot>
+ </connection>
+ <connection>
+ <sender>fileSaveAsAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>fileSaveAs()</slot>
+ </connection>
+ <connection>
+ <sender>filePrintAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>filePrint()</slot>
+ </connection>
+ <connection>
+ <sender>fileExitAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>fileExit()</slot>
+ </connection>
+ <connection>
+ <sender>editUndoAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>editUndo()</slot>
+ </connection>
+ <connection>
+ <sender>editRedoAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>editRedo()</slot>
+ </connection>
+ <connection>
+ <sender>editCutAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>editCut()</slot>
+ </connection>
+ <connection>
+ <sender>editCopyAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>editCopy()</slot>
+ </connection>
+ <connection>
+ <sender>editPasteAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>editPaste()</slot>
+ </connection>
+ <connection>
+ <sender>editFindAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>editFind()</slot>
+ </connection>
+ <connection>
+ <sender>helpIndexAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>helpIndex()</slot>
+ </connection>
+ <connection>
+ <sender>helpContentsAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>helpContents()</slot>
+ </connection>
+ <connection>
+ <sender>helpAboutAction</sender>
+ <signal>activated()</signal>
+ <receiver>Form1</receiver>
+ <slot>helpAbout()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>fileNew()</slot>
+ <slot>fileOpen()</slot>
+ <slot>fileSave()</slot>
+ <slot>fileSaveAs()</slot>
+ <slot>filePrint()</slot>
+ <slot>fileExit()</slot>
+ <slot>editUndo()</slot>
+ <slot>editRedo()</slot>
+ <slot>editCut()</slot>
+ <slot>editCopy()</slot>
+ <slot>editPaste()</slot>
+ <slot>editFind()</slot>
+ <slot>helpIndex()</slot>
+ <slot>helpContents()</slot>
+ <slot>helpAbout()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/python/app_templates/python.appwizard b/languages/python/app_templates/python.appwizard
new file mode 100644
index 00000000..82c13adf
--- /dev/null
+++ b/languages/python/app_templates/python.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=pythonhello,pytk,pyqt
diff --git a/languages/python/app_templates/pythonhello/.kdev_ignore b/languages/python/app_templates/pythonhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/python/app_templates/pythonhello/.kdev_ignore
diff --git a/languages/python/app_templates/pythonhello/Makefile.am b/languages/python/app_templates/pythonhello/Makefile.am
new file mode 100644
index 00000000..3d66b1a7
--- /dev/null
+++ b/languages/python/app_templates/pythonhello/Makefile.am
@@ -0,0 +1,15 @@
+dataFiles = app.py app.kdevelop pythonhello.png
+templateName = pythonhello
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/python/app_templates/pythonhello/app.kdevelop b/languages/python/app_templates/pythonhello/app.kdevelop
new file mode 100644
index 00000000..2c494d6a
--- /dev/null
+++ b/languages/python/app_templates/pythonhello/app.kdevelop
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Python</primarylanguage>
+ <keywords>
+ <keyword>Python</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram>%{APPNAMELC}.py</mainprogram>
+ </run>
+ </kdevscriptproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ <groups>
+ <group pattern="*.py" name="Python files" />
+ </groups>
+ </kdevfileview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="py"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/python/app_templates/pythonhello/app.py b/languages/python/app_templates/pythonhello/app.py
new file mode 100644
index 00000000..3257ce62
--- /dev/null
+++ b/languages/python/app_templates/pythonhello/app.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python
+
+def main():
+ print 'Hello world!'
+
+main()
+
diff --git a/languages/python/app_templates/pythonhello/pythonhello b/languages/python/app_templates/pythonhello/pythonhello
new file mode 100644
index 00000000..f1a4f86b
--- /dev/null
+++ b/languages/python/app_templates/pythonhello/pythonhello
@@ -0,0 +1,12 @@
+# KDE Config File
+[General]
+Name=Simple Python script
+Name[fr]=Un simple script de test "Hello world"
+Name[de]=Ein einfaches Python-Script "Hello world"
+Icon=pythonhello.png
+Category=Python
+Comment=This generates a simplistic "Hello world" program in Python
+Comment[fr]=Génère un simple script de test du type "Hello world" dans le language PYTHON.
+Comment[de]=Es wird ein einfaches "Hello world"-Programm in Python erzeugt.
+FileTemplates=py,ShellStyle
+ShowFilesAfterGeneration=APPNAMELC.py
diff --git a/languages/python/app_templates/pythonhello/pythonhello.kdevtemplate b/languages/python/app_templates/pythonhello/pythonhello.kdevtemplate
new file mode 100644
index 00000000..6d52cf8a
--- /dev/null
+++ b/languages/python/app_templates/pythonhello/pythonhello.kdevtemplate
@@ -0,0 +1,107 @@
+# KDE Config File
+[General]
+Name=Simple Python script
+Name[ca]=Simple script en Python
+Name[da]=Simpelt Python script
+Name[de]=Einfaches Python-Skript
+Name[el]=Απλό σενάÏιο Python
+Name[es]=Guión sencillo en Python
+Name[et]=Lihtne Pythoni skript
+Name[eu]=Python script sinplea
+Name[fa]=دست‌نوشتۀ سادۀ پیتون
+Name[fr]=Script Python simple
+Name[ga]=Script shimplí Python
+Name[gl]=Script sinxelo en Python
+Name[hu]=Egyszerű Python-szkript
+Name[it]=Semplice script Python
+Name[ja]=ç°¡å˜ãª Python スクリプト
+Name[nds]=Eenfach Python-Skript
+Name[ne]=साधारण पाइथोन सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ
+Name[nl]=Eenvoudig Python-script
+Name[pl]=Prosty skrypt w Pythonie
+Name[pt]=Programa simples em Python
+Name[pt_BR]=Programa simples em Python
+Name[ru]=ПроÑтой Ñкрипт Python
+Name[sk]=Jednoduchý Python skript
+Name[sr]=ЈедноÑтавна Python Ñкрипта
+Name[sr@Latn]=Jednostavna Python skripta
+Name[sv]=Enkelt Python-skript
+Name[tr]=Basit Python betiÄŸi
+Name[zh_CN]=简å•çš„ Python 脚本
+Name[zh_TW]=簡單的 Python 文稿
+Icon=pythonhello.png
+Category=Python
+Comment=This generates a simplistic "Hello world" program in Python
+Comment[ca]=Genera un simple programa de "Hello world" en Python
+Comment[da]=Dette genererer et simplistisk "Goddag verden" program i Python
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in Python
+Comment[el]=Αυτό δημιουÏγεί ένα απλό Ï€ÏόγÏαμμα "Γεια σου κόσμε" σε Python
+Comment[es]=Genera un sencillo programa «Hola mundo» en Python
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine Pythonis
+Comment[eu]=Honek "Kaixo mundua" programa sinple bat sortzen du Python lengoaian
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در پیتون تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en Python
+Comment[gl]=Isto xera un programa sinxelo "Ola mundo" en Python
+Comment[hu]=Létrehoz egy egyszerű Hello world programot Python nyelven
+Comment[it]=Genera un semplice programma di "Hello world" in Python
+Comment[ja]=ç°¡å˜ãª Hello world プログラムを Python ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm mit Python op.
+Comment[ne]=यसले पाइथोनमा साधारण "हेलà¥à¤²à¥‹ वोलà¥à¤¡" कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Dit genereert een eenvoudig "Hello World"-programma in Python
+Comment[pl]=Generuje prosty program "Witaj świecie" w Pythonie
+Comment[pt]=Isto gera um programa simples "Olá mundo" em Python
+Comment[pt_BR]=Isto gera um programa simples "Olá mundo" em Python
+Comment[ru]=Создание проÑтой программы "Hello world" на Python
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program v Python
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ програм у Python-у
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program u Python-u
+Comment[sv]=Detta skapar ett förenklat "Hello world"-program i Python
+Comment[tr]=Bu, Python'da basit bir "Merhaba Dünya" programı yaratır.
+Comment[zh_CN]=这将生æˆä¸€ä¸ªç®€å•çš„ Python 语言“Hello worldâ€ç¨‹åº
+Comment[zh_TW]=產生一個 Python çš„ç°¡å–® Hello world 程å¼
+FileTemplates=py,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.py
+Archive=pythonhello.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.py
+Dest=%{dest}/%{APPNAMELC}.py
+
+[MSG]
+Type=message
+Comment=A simple python script was created in %{dest}
+Comment[ca]=Un simple script en Python ha estat creat en %{dest}
+Comment[da]=Et simpelt python script blev oprettet i %{dest}
+Comment[de]=Ein einfaches Python-Skript wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό σενάÏιο python δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo programa en Python ha sido creado en %{dest}
+Comment[et]=Lihtne Pythoni skript loodi asukohta %{dest}
+Comment[eu]=Python programa sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک دست‌نوشتۀ سادۀ پیتون در %{dest} ایجاد شد
+Comment[fr]=Un script Python simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh script shimplí Python i %{dest}
+Comment[gl]=Creouse un script sinxelo en python en %{dest}
+Comment[hu]=Létrejött egy egyszerű Python-szkript itt: %{dest}
+Comment[it]=È stato creato un semplice script python in %{dest}
+Comment[ja]=ç°¡å˜ãª python スクリプトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach Python-Skript opstellt.
+Comment[ne]=साधारण पाइथोन सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig Python-script is aangemaakt in %{dest}
+Comment[pl]=Prosty skrypt w Pythonie został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples em Python em %{dest}
+Comment[pt_BR]=Foi criado um programa simples em Python em %{dest}
+Comment[ru]=ПроÑтой Ñкрипт Python Ñоздан в %{dest}
+Comment[sk]=Jednoduchý Python skript bol vytvorený v %{dest}
+Comment[sr]=ЈедноÑтавна python Ñкрипта направљена је у %{dest}
+Comment[sr@Latn]=Jednostavna python skripta napravljena je u %{dest}
+Comment[sv]=Ett enkelt Python-skript skapades i %{dest}
+Comment[tr]=Basit bir python betiği %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简å•çš„ Python 语言脚本
+Comment[zh_TW]=一個簡單的 python 文稿框架已建立於 %{dest}
diff --git a/languages/python/app_templates/pythonhello/pythonhello.png b/languages/python/app_templates/pythonhello/pythonhello.png
new file mode 100644
index 00000000..c27ab24d
--- /dev/null
+++ b/languages/python/app_templates/pythonhello/pythonhello.png
Binary files differ
diff --git a/languages/python/app_templates/pytk/.kdev_ignore b/languages/python/app_templates/pytk/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/python/app_templates/pytk/.kdev_ignore
diff --git a/languages/python/app_templates/pytk/Makefile.am b/languages/python/app_templates/pytk/Makefile.am
new file mode 100644
index 00000000..0639ee15
--- /dev/null
+++ b/languages/python/app_templates/pytk/Makefile.am
@@ -0,0 +1,15 @@
+dataFiles = app.py app.kdevelop pytk.png
+templateName = pytk
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/python/app_templates/pytk/app.kdevelop b/languages/python/app_templates/pytk/app.kdevelop
new file mode 100644
index 00000000..044ea0b7
--- /dev/null
+++ b/languages/python/app_templates/pytk/app.kdevelop
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Python</primarylanguage>
+ <keywords>
+ <keyword>Python</keyword>
+ </keywords>
+ <ignoreparts/>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <activedir></activedir>
+ </general>
+ <run>
+ <mainprogram>%{APPNAMELC}.py</mainprogram>
+ </run>
+ </kdevscriptproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ </tree>
+ <groups>
+ <group pattern="*.py" name="Python files" />
+ </groups>
+ </kdevfileview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="py"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/python/app_templates/pytk/app.py b/languages/python/app_templates/pytk/app.py
new file mode 100644
index 00000000..39f4aa84
--- /dev/null
+++ b/languages/python/app_templates/pytk/app.py
@@ -0,0 +1,4 @@
+from Tkinter import *
+widget = Label(None, text='Hello world!')
+widget.pack()
+widget.mainloop()
diff --git a/languages/python/app_templates/pytk/pytk b/languages/python/app_templates/pytk/pytk
new file mode 100644
index 00000000..36a92c47
--- /dev/null
+++ b/languages/python/app_templates/pytk/pytk
@@ -0,0 +1,12 @@
+# KDE Config File
+[General]
+Name=Simple Python/Tkinter script
+Name[fr]=Un simple Python/Tkinter script de test "Hello world"
+Name[de]=Ein einfaches Python/Tkinter Script « Hello world »
+Icon=pytk.png
+Category=Python
+Comment=This generates a simplistic "Hello world" program in Python/Tkinter
+Comment[fr]=Génère un simple script de test du type "Hello world" dans le language PYTHON/Tkinter.
+Comment[de]=Es wird ein einfaches "Hello world"-Programm in Python/Tkinter erzeugt.
+FileTemplates=py,ShellStyle
+ShowFilesAfterGeneration=APPNAMELC.py
diff --git a/languages/python/app_templates/pytk/pytk.kdevtemplate b/languages/python/app_templates/pytk/pytk.kdevtemplate
new file mode 100644
index 00000000..3756df01
--- /dev/null
+++ b/languages/python/app_templates/pytk/pytk.kdevtemplate
@@ -0,0 +1,107 @@
+# KDE Config File
+[General]
+Name=Simple Python/Tkinter script
+Name[ca]=Simple script en Python/Tkinter
+Name[da]=Simpelt Python/Tkinter script
+Name[de]=Einfaches Python/Tkinter-Skript
+Name[el]=Απλό σενάÏιο Python/Tkinter
+Name[es]=Guión sencillo en Python/Tkinter
+Name[et]=Lihtne Pythoni/Tkinteri skript
+Name[eu]=Python/Tkinter script sinplea
+Name[fa]=دست‌نوشتۀ سادۀ پیتون/Tkinter
+Name[fr]=Script Python / Tkinter simple
+Name[ga]=Script shimplí Python/Tkinter
+Name[gl]=Script sinxelo Python/Tkinter
+Name[hu]=Egyszerű Python/Tkinter-szkript
+Name[it]=Semplice script Python/Tkinter
+Name[ja]=ç°¡å˜ãª Python/Tkinter スクリプト
+Name[nds]=Eenfach Python/Tkinter-Skript
+Name[ne]=साधारण पाइथोन/Tkinter सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ
+Name[nl]=Eenvoudig Python/Tkinter-script
+Name[pl]=Prosty skrypt Python/Tkinter
+Name[pt]=Programa simples em Python/Tkinter
+Name[pt_BR]=Programa simples em Python/Tkinter
+Name[ru]=ПроÑтой Ñкрипт Python/Tkinter
+Name[sk]=Jednoduchý Python/Tkinter skript
+Name[sr]=ЈедноÑтавна Python/Tkinter Ñкрипта
+Name[sr@Latn]=Jednostavna Python/Tkinter skripta
+Name[sv]=Enkelt Python/Tkinter-skript
+Name[tr]=Basit Python/Tkinter betiÄŸi
+Name[zh_CN]=简å•çš„ Python/Tkinter 脚本
+Name[zh_TW]=簡單的 Python/Tkinter 文稿
+Icon=pytk.png
+Category=Python
+Comment=This generates a simplistic "Hello world" program in Python/Tkinter
+Comment[ca]=Genera un simple programa de "Hello world" en Python/Tkinter
+Comment[da]=Dette genererer et simplistisk "Goddag verden" program i Python/Tkinter
+Comment[de]=Erstellt ein einfaches "Hello World"-Programm in Python/Tkinter
+Comment[el]=Αυτό δημιουÏγεί ένα απλό Ï€ÏόγÏαμμα "Γεια σου κόσμε" σε Python/Tkinter
+Comment[es]=Genera un sencillo programa «Hola mundo» en Python/Tkinter
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine Pythonis/Tkinteris
+Comment[eu]="Kaixo mundua" programa sinple bat sortzen du Python/Tkinter-en
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در پیتون/Tkinter تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en Python / Tkinter
+Comment[gl]=Isto xera un programa sinxelo "Ola mundo" en Python/Tkinter
+Comment[hu]=Létrehoz egy egyszerű Hello world programot Python/Tkinter nyelven
+Comment[it]=Genera un semplice programma di "Hello world" in Python/Tkinter
+Comment[ja]=ç°¡å˜ãª Hello world プログラムを Python/Tkinter ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm in Python/Tkinter op.
+Comment[ne]=यसले पाइथोन/Tkinter मा साधारण "हेलà¥à¤²à¥‹ वोलà¥à¤¡" कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Dit genereert een eenvoudig "Hallo Wereld"-programma in Python/Tkinter
+Comment[pl]=Generuje prosty skrypt "Witaj świecie" w Pythonie/Tkinterze
+Comment[pt]=Isto gera um programa simples "Olá mundo" em Python/Tkinter
+Comment[pt_BR]=Isto gera um programa simples "Olá mundo" em Python/Tkinter
+Comment[ru]=Создание проÑтой программы "Hello world" на Python и Tkinter
+Comment[sk]=Vygeneruje jednoduchý "Ahoj svet" program v Python/Tkinter
+Comment[sr]=Прави једноÑтаван „Здраво Ñвете“ у Python/Tkinter-у
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ u Python/Tkinter-u
+Comment[sv]=Detta skapar ett förenklat "Hello world"-program i Python/Tkinter
+Comment[tr]=Bu Python/Tkinter'da basit bir "Merhaba Dünya" programı yaratır.
+Comment[zh_CN]=这将生æˆä¸€ä¸ªç®€å•çš„ Python/Tkinter 语言“Hello worldâ€ç¨‹åº
+Comment[zh_TW]=產生一個簡單的 Python/Tkinter çš„ Hello World 程å¼
+FileTemplates=py,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.py
+Archive=pytk.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.py
+Dest=%{dest}/%{APPNAMELC}.py
+
+[MSG]
+Type=message
+Comment=A simple Python/Tkinter script was created in %{dest}
+Comment[ca]=Un simple script en Python/Tkinter ha estat creat en %{dest}
+Comment[da]=Et simpelt Python/Tkinter script blev oprettet i %{dest}
+Comment[de]=Ein einfaches Python/Tkinter-Skript wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό σενάÏιο Python/Tkinter δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo guión en Python/Tkinter ha sido creado en %{dest}
+Comment[et]=Lihtne Pythoni/Tkinteri skript loodi asukohta %{dest}
+Comment[eu]=Python/Tkinter script sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک دست‌نوشتۀ سادۀ پیتون/Tkinter در %{dest} ایجاد شد
+Comment[fr]=Un script Python / Tkinter simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh script shimplí Python/Tkinter i %{dest}
+Comment[gl]=Creouse un script sinxelo Python/Tkinter en %{dest}
+Comment[hu]=Létrejött egy egyszerű Python/Tkinter-szkript itt: %{dest}
+Comment[it]=È stato creato un semplice script Python/Tkinter in %{dest}
+Comment[ja]=ç°¡å˜ãª Python/Tkinter スクリプトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach Python-/Tkinter-Skript opstellt.
+Comment[ne]=साधारण पाइथोन/Tkinter सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig Python/Tkinter-script is aangemaakt in %{dest}
+Comment[pl]=Prosty skrypt Python/Tkinter został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples em Python/Tkinter em %{dest}
+Comment[pt_BR]=Foi criado um programa simples em Python/Tkinter em %{dest}
+Comment[ru]=ПроÑтой Ñкрипт Python/Tkinter Ñоздан в %{dest}
+Comment[sk]=Jednoduchý Python/Tkinter skript bol vytvorený v %{dest}
+Comment[sr]=ЈедноÑтавна Python/Tkinter Ñкрипта направљена је у %{dest}
+Comment[sr@Latn]=Jednostavna Python/Tkinter skripta napravljena je u %{dest}
+Comment[sv]=Ett enkelt Python/Tkinter-skript skapades i %{dest}
+Comment[tr]=Basit Python/Tkinter betiği %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简å•çš„ Python/Tkinter 脚本
+Comment[zh_TW]=一個簡單的 Python/Tkinter 文稿已建立於 %{dest}
diff --git a/languages/python/app_templates/pytk/pytk.png b/languages/python/app_templates/pytk/pytk.png
new file mode 100644
index 00000000..c8c28f8d
--- /dev/null
+++ b/languages/python/app_templates/pytk/pytk.png
Binary files differ
diff --git a/languages/python/doc/Makefile.am b/languages/python/doc/Makefile.am
new file mode 100644
index 00000000..5159f5f0
--- /dev/null
+++ b/languages/python/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = python.toc python_bugs.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA = python.index
+
diff --git a/languages/python/doc/python.toc b/languages/python/doc/python.toc
new file mode 100644
index 00000000..e5c67dda
--- /dev/null
+++ b/languages/python/doc/python.toc
@@ -0,0 +1,1571 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Python</title>
+<base href="http://docs.python.org"/>
+<tocsect1 name="Tutorial" url="tut/tut.html">
+<tocsect2 name="Front Matter" url="tut/node1.html"/>
+<tocsect2 name="Contents" url="tut/node2.html"/>
+<tocsect2 name="1. Whetting Your Appetite " url="tut/node3.html">
+<tocsect3 name="1.1 Where From Here " url="tut/node3.html#SECTION003100000000000000000"/>
+</tocsect2>
+<tocsect2 name="2. Using the Python Interpreter " url="tut/node4.html">
+<tocsect3 name="2.1 Invoking the Interpreter " url="tut/node4.html#SECTION004100000000000000000">
+<tocsect4 name="2.1.1 Argument Passing " url="tut/node4.html#SECTION004110000000000000000"/>
+<tocsect4 name="2.1.2 Interactive Mode " url="tut/node4.html#SECTION004120000000000000000"/>
+</tocsect3>
+<tocsect3 name="2.2 The Interpreter and Its Environment " url="tut/node4.html#SECTION004200000000000000000">
+<tocsect4 name="2.2.1 Error Handling " url="tut/node4.html#SECTION004210000000000000000"/>
+<tocsect4 name="2.2.2 Executable Python Scripts " url="tut/node4.html#SECTION004220000000000000000"/>
+<tocsect4 name="2.2.3 The Interactive Startup File " url="tut/node4.html#SECTION004230000000000000000"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="3. An Informal Introduction to Python " url="tut/node5.html">
+<tocsect3 name="3.1 Using Python as a Calculator " url="tut/node5.html#SECTION005100000000000000000">
+<tocsect4 name="3.1.1 Numbers " url="tut/node5.html#SECTION005110000000000000000"/>
+<tocsect4 name="3.1.2 Strings " url="tut/node5.html#SECTION005120000000000000000"/>
+<tocsect4 name="3.1.3 Unicode Strings " url="tut/node5.html#SECTION005130000000000000000"/>
+<tocsect4 name="3.1.4 Lists " url="tut/node5.html#SECTION005140000000000000000"/>
+</tocsect3>
+<tocsect3 name="3.2 First Steps Towards Programming " url="tut/node5.html#SECTION005200000000000000000"/>
+</tocsect2>
+<tocsect2 name="4. More Control Flow Tools " url="tut/node6.html">
+<tocsect3 name="4.1 if Statements " url="tut/node6.html#SECTION006100000000000000000"/>
+<tocsect3 name="4.2 for Statements " url="tut/node6.html#SECTION006200000000000000000"/>
+<tocsect3 name="4.3 The range() Function " url="tut/node6.html#SECTION006300000000000000000"/>
+<tocsect3 name="4.5 pass Statements " url="tut/node6.html#SECTION006500000000000000000"/>
+<tocsect3 name="4.6 Defining Functions " url="tut/node6.html#SECTION006600000000000000000"/>
+<tocsect3 name="4.7 More on Defining Functions " url="tut/node6.html#SECTION006700000000000000000">
+<tocsect4 name="4.7.1 Default Argument Values " url="tut/node6.html#SECTION006710000000000000000"/>
+<tocsect4 name="4.7.2 Keyword Arguments " url="tut/node6.html#SECTION006720000000000000000"/>
+<tocsect4 name="4.7.3 Arbitrary Argument Lists " url="tut/node6.html#SECTION006730000000000000000"/>
+<tocsect4 name="4.7.4 Lambda Forms " url="tut/node6.html#SECTION006740000000000000000"/>
+<tocsect4 name="4.7.5 Documentation Strings " url="tut/node6.html#SECTION006750000000000000000"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="5. Data Structures " url="tut/node7.html">
+<tocsect3 name="5.1 More on Lists " url="tut/node7.html#SECTION007100000000000000000">
+<tocsect4 name="5.1.1 Using Lists as Stacks " url="tut/node7.html#SECTION007110000000000000000"/>
+<tocsect4 name="5.1.2 Using Lists as Queues " url="tut/node7.html#SECTION007120000000000000000"/>
+<tocsect4 name="5.1.3 Functional Programming Tools " url="tut/node7.html#SECTION007130000000000000000"/>
+<tocsect4 name="5.1.4 List Comprehensions" url="tut/node7.html#SECTION007140000000000000000"/>
+</tocsect3>
+<tocsect3 name="5.2 The del statement " url="tut/node7.html#SECTION007200000000000000000"/>
+<tocsect3 name="5.3 Tuples and Sequences " url="tut/node7.html#SECTION007300000000000000000"/>
+<tocsect3 name="5.4 Dictionaries " url="tut/node7.html#SECTION007400000000000000000"/>
+<tocsect3 name="5.5 More on Conditions " url="tut/node7.html#SECTION007500000000000000000"/>
+<tocsect3 name="5.6 Comparing Sequences and Other Types " url="tut/node7.html#SECTION007600000000000000000"/>
+</tocsect2>
+<tocsect2 name="6. Modules " url="tut/node8.html">
+<tocsect3 name="6.1 More on Modules " url="tut/node8.html#SECTION008100000000000000000">
+<tocsect4 name="6.1.1 The Module Search Path " url="tut/node8.html#SECTION008110000000000000000"/>
+<tocsect4 name="6.1.2 ``Compiled'' Python files" url="tut/node8.html#SECTION008120000000000000000"/>
+</tocsect3>
+<tocsect3 name="6.2 Standard Modules " url="tut/node8.html#SECTION008200000000000000000"/>
+<tocsect3 name="6.3 The dir() Function " url="tut/node8.html#SECTION008300000000000000000"/>
+<tocsect3 name="6.4 Packages " url="tut/node8.html#SECTION008400000000000000000">
+<tocsect4 name="6.4.1 Importing * From a Package " url="tut/node8.html#SECTION008410000000000000000"/>
+<tocsect4 name="6.4.2 Intra-package References" url="tut/node8.html#SECTION008420000000000000000"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="7. Input and Output " url="tut/node9.html">
+<tocsect3 name="7.1 Fancier Output Formatting " url="tut/node9.html#SECTION009100000000000000000"/>
+<tocsect3 name="7.2 Reading and Writing Files " url="tut/node9.html#SECTION009200000000000000000">
+<tocsect4 name="7.2.1 Methods of File Objects " url="tut/node9.html#SECTION009210000000000000000"/>
+<tocsect4 name="7.2.2 The pickle Module " url="tut/node9.html#SECTION009220000000000000000"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="8. Errors and Exceptions " url="tut/node10.html">
+<tocsect3 name="8.1 Syntax Errors " url="tut/node10.html#SECTION0010100000000000000000"/>
+<tocsect3 name="8.2 Exceptions " url="tut/node10.html#SECTION0010200000000000000000"/>
+<tocsect3 name="8.3 Handling Exceptions " url="tut/node10.html#SECTION0010300000000000000000"/>
+<tocsect3 name="8.4 Raising Exceptions " url="tut/node10.html#SECTION0010400000000000000000"/>
+<tocsect3 name="8.5 User-defined Exceptions " url="tut/node10.html#SECTION0010500000000000000000"/>
+<tocsect3 name="8.6 Defining Clean-up Actions " url="tut/node10.html#SECTION0010600000000000000000"/>
+</tocsect2>
+<tocsect2 name="9. Classes " url="tut/node11.html">
+<tocsect3 name="9.1 A Word About Terminology " url="tut/node11.html#SECTION0011100000000000000000"/>
+<tocsect3 name="9.2 Python Scopes and Name Spaces " url="tut/node11.html#SECTION0011200000000000000000"/>
+<tocsect3 name="9.3 A First Look at Classes " url="tut/node11.html#SECTION0011300000000000000000">
+<tocsect4 name="9.3.1 Class Definition Syntax " url="tut/node11.html#SECTION0011310000000000000000"/>
+<tocsect4 name="9.3.2 Class Objects " url="tut/node11.html#SECTION0011320000000000000000"/>
+<tocsect4 name="9.3.3 Instance Objects " url="tut/node11.html#SECTION0011330000000000000000"/>
+<tocsect4 name="9.3.4 Method Objects " url="tut/node11.html#SECTION0011340000000000000000"/>
+</tocsect3>
+<tocsect3 name="9.4 Random Remarks " url="tut/node11.html#SECTION0011400000000000000000"/>
+<tocsect3 name="9.5 Inheritance " url="tut/node11.html#SECTION0011500000000000000000">
+<tocsect4 name="9.5.1 Multiple Inheritance " url="tut/node11.html#SECTION0011510000000000000000"/>
+</tocsect3>
+<tocsect3 name="9.6 Private Variables " url="tut/node11.html#SECTION0011600000000000000000"/>
+<tocsect3 name="9.7 Odds and Ends " url="tut/node11.html#SECTION0011700000000000000000">
+<tocsect4 name="9.7.1 Exceptions Can Be Classes " url="tut/node11.html#SECTION0011710000000000000000"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="10. What Now? " url="tut/node12.html">
+<tocsect3 name="A.1 Line Editing " url="tut/node13.html#SECTION0013100000000000000000"/>
+<tocsect3 name="A.2 History Substitution " url="tut/node13.html#SECTION0013200000000000000000"/>
+<tocsect3 name="A.3 Key Bindings " url="tut/node13.html#SECTION0013300000000000000000"/>
+<tocsect3 name="A.4 Commentary " url="tut/node13.html#SECTION0013400000000000000000"/>
+</tocsect2>
+<tocsect2 name="About this document ..." url="tut/node14.html"/>
+</tocsect1>
+<tocsect1 name="Language Reference" url="ref/ref.html">
+<tocsect2 name="Front Matter" url="ref/front.html"/>
+<tocsect2 name="Contents" url="ref/contents.html"/>
+<tocsect2 name="1. Introduction" url="ref/introduction.html">
+<tocsect3 name="1.1 Notation" url="ref/notation.html"/>
+</tocsect2>
+<tocsect2 name="2. Lexical analysis" url="ref/lexical.html">
+<tocsect3 name="2.1 Line structure" url="ref/line-structure.html">
+<tocsect4 name="2.1.1 Logical lines" url="ref/logical.html"/>
+<tocsect4 name="2.1.2 Physical lines" url="ref/physical.html"/>
+<tocsect4 name="2.1.3 Comments" url="ref/comments.html"/>
+<tocsect4 name="2.1.4 Explicit line joining" url="ref/explicit-joining.html"/>
+<tocsect4 name="2.1.5 Implicit line joining" url="ref/implicit-joining.html"/>
+<tocsect4 name="2.1.6 Blank lines " url="ref/blank-lines.html"/>
+<tocsect4 name="2.1.7 Indentation" url="ref/indentation.html"/>
+<tocsect4 name="2.1.8 Whitespace between tokens" url="ref/whitespace.html"/>
+</tocsect3>
+<tocsect3 name="2.2 Other tokens" url="ref/other-tokens.html"/>
+<tocsect3 name="2.3 Identifiers and keywords" url="ref/identifiers.html">
+<tocsect4 name="2.3.1 Keywords" url="ref/keywords.html"/>
+<tocsect4 name="2.3.2 Reserved classes of identifiers" url="ref/id-classes.html"/>
+</tocsect3>
+<tocsect3 name="2.4 Literals" url="ref/literals.html">
+<tocsect4 name="2.4.1 String literals" url="ref/strings.html"/>
+<tocsect4 name="2.4.2 String literal concatenation" url="ref/string-catenation.html"/>
+<tocsect4 name="2.4.3 Numeric literals" url="ref/numbers.html"/>
+<tocsect4 name="2.4.4 Integer and long integer literals" url="ref/integers.html"/>
+<tocsect4 name="2.4.5 Floating point literals" url="ref/floating.html"/>
+<tocsect4 name="2.4.6 Imaginary literals" url="ref/imaginary.html"/>
+</tocsect3>
+<tocsect3 name="2.5 Operators" url="ref/operators.html"/>
+<tocsect3 name="2.6 Delimiters" url="ref/delimiters.html"/>
+</tocsect2>
+<tocsect2 name="3. Data model" url="ref/datamodel.html">
+<tocsect3 name="3.1 Objects, values and types" url="ref/objects.html"/>
+<tocsect3 name="3.2 The standard type hierarchy" url="ref/types.html"/>
+<tocsect3 name="3.3 Special method names" url="ref/specialnames.html">
+<tocsect4 name="3.3.1 Basic customization" url="ref/customization.html"/>
+<tocsect4 name="3.3.2 Customizing attribute access" url="ref/attribute-access.html"/>
+<tocsect4 name="3.3.3 Emulating callable objects" url="ref/callable-types.html"/>
+<tocsect4 name="3.3.4 Emulating sequence and mapping types" url="ref/sequence-types.html"/>
+<tocsect4 name="3.3.5 Additional methods for emulation of sequence types " url="ref/sequence-methods.html"/>
+<tocsect4 name="3.3.6 Emulating numeric types" url="ref/numeric-types.html"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="4. Execution model " url="ref/execmodel.html">
+<tocsect3 name="4.1 Code blocks, execution frames, and namespaces " url="ref/execframes.html"/>
+<tocsect3 name="4.2 Exceptions " url="ref/exceptions.html"/>
+</tocsect2>
+<tocsect2 name="5. Expressions" url="ref/expressions.html">
+<tocsect3 name="5.1 Arithmetic conversions" url="ref/conversions.html"/>
+<tocsect3 name="5.2 Atoms" url="ref/atoms.html">
+<tocsect4 name="5.2.1 Identifiers (Names)" url="ref/atom-identifiers.html"/>
+<tocsect4 name="5.2.2 Literals" url="ref/atom-literals.html"/>
+<tocsect4 name="5.2.3 Parenthesized forms" url="ref/parenthesized.html"/>
+<tocsect4 name="5.2.4 List displays" url="ref/lists.html"/>
+<tocsect4 name="5.2.5 Dictionary displays" url="ref/dict.html"/>
+<tocsect4 name="5.2.6 String conversions" url="ref/string-conversions.html"/>
+</tocsect3>
+<tocsect3 name="5.3 Primaries" url="ref/primaries.html">
+<tocsect4 name="5.3.1 Attribute references" url="ref/attribute-references.html"/>
+<tocsect4 name="5.3.2 Subscriptions" url="ref/subscriptions.html"/>
+<tocsect4 name="5.3.3 Slicings" url="ref/slicings.html"/>
+<tocsect4 name="5.3.4 Calls" url="ref/calls.html"/>
+</tocsect3>
+<tocsect3 name="5.4 The power operator" url="ref/power.html"/>
+<tocsect3 name="5.5 Unary arithmetic operations " url="ref/unary.html"/>
+<tocsect3 name="5.6 Binary arithmetic operations" url="ref/binary.html"/>
+<tocsect3 name="5.7 Shifting operations" url="ref/shifting.html"/>
+<tocsect3 name="5.8 Binary bit-wise operations" url="ref/bitwise.html"/>
+<tocsect3 name="5.9 Comparisons" url="ref/comparisons.html"/>
+<tocsect3 name="5.10 Boolean operations" url="ref/lambda.html"/>
+<tocsect3 name="5.11 Expression lists" url="ref/exprlists.html"/>
+<tocsect3 name="5.12 Summary" url="ref/summary.html"/>
+</tocsect2>
+<tocsect2 name="6. Simple statements " url="ref/simple.html">
+<tocsect3 name="6.1 Expression statements " url="ref/exprstmts.html"/>
+<tocsect3 name="6.2 Assert statements " url="ref/assert.html"/>
+<tocsect3 name="6.3 Assignment statements " url="ref/assignment.html">
+<tocsect4 name="6.3.1 Augmented Assignment statements " url="ref/augassign.html"/>
+</tocsect3>
+<tocsect3 name="6.4 The pass statement " url="ref/pass.html"/>
+<tocsect3 name="6.5 The del statement " url="ref/del.html"/>
+<tocsect3 name="6.6 The print statement " url="ref/print.html"/>
+<tocsect3 name="6.7 The return statement " url="ref/return.html"/>
+<tocsect3 name="6.8 The raise statement " url="ref/raise.html"/>
+<tocsect3 name="6.9 The break statement " url="ref/break.html"/>
+<tocsect3 name="6.10 The continue statement " url="ref/continue.html"/>
+<tocsect3 name="6.11 The import statement " url="ref/import.html"/>
+<tocsect3 name="6.12 The global statement " url="ref/global.html"/>
+<tocsect3 name="6.13 The exec statement " url="ref/exec.html"/>
+</tocsect2>
+<tocsect2 name="7. Compound statements" url="ref/compound.html">
+<tocsect3 name="7.1 The if statement" url="ref/if.html"/>
+<tocsect3 name="7.2 The while statement" url="ref/while.html"/>
+<tocsect3 name="7.3 The for statement" url="ref/for.html"/>
+<tocsect3 name="7.4 The try statement" url="ref/try.html"/>
+<tocsect3 name="7.5 Function definitions" url="ref/function.html"/>
+<tocsect3 name="7.6 Class definitions" url="ref/class.html"/>
+</tocsect2>
+<tocsect2 name="8. Top-level components" url="ref/top-level.html">
+<tocsect3 name="8.1 Complete Python programs" url="ref/programs.html"/>
+<tocsect3 name="8.2 File input" url="ref/file-input.html"/>
+<tocsect3 name="8.3 Interactive input" url="ref/interactive.html"/>
+<tocsect3 name="8.4 Expression input" url="ref/expression-input.html"/>
+</tocsect2>
+<tocsect2 name="Index" url="ref/genindex.html"/>
+<tocsect2 name="About this document ..." url="ref/about.html"/>
+</tocsect1>
+<tocsect1 name="Extending and Embedding" url="ext/ext.html">
+<tocsect2 name="Front Matter" url="ext/front.html"/>
+<tocsect2 name="Contents" url="ext/contents.html"/>
+<tocsect2 name="1. Extending Python with C or C++ " url="ext/intro.html">
+<tocsect3 name="1.1 A Simple Example " url="ext/simpleExample.html"/>
+<tocsect3 name="1.2 Intermezzo: Errors and Exceptions " url="ext/errors.html"/>
+<tocsect3 name="1.3 Back to the Example " url="ext/backToExample.html"/>
+<tocsect3 name="1.4 The Module's Method Table and Initialization Function " url="ext/methodTable.html"/>
+<tocsect3 name="1.5 Compilation and Linkage " url="ext/compilation.html"/>
+<tocsect3 name="1.6 Calling Python Functions from C " url="ext/callingPython.html"/>
+<tocsect3 name="1.7 Format Strings for PyArg_ParseTuple() " url="ext/parseTuple.html"/>
+<tocsect3 name="1.8 Keyword Parsing with PyArg_ParseTupleAndKeywords() " url="ext/parseTupleAndKeywords.html"/>
+<tocsect3 name="1.9 The Py_BuildValue() Function " url="ext/buildValue.html"/>
+<tocsect3 name="1.10 Reference Counts " url="ext/refcounts.html">
+<tocsect4 name="1.10.1 Reference Counting in Python " url="ext/refcountsInPython.html"/>
+<tocsect4 name="1.10.2 Ownership Rules " url="ext/ownershipRules.html"/>
+<tocsect4 name="1.10.3 Thin Ice " url="ext/thinIce.html"/>
+<tocsect4 name="1.10.4 NULL Pointers " url="ext/nullPointers.html"/>
+</tocsect3>
+<tocsect3 name="1.11 Writing Extensions in C++ " url="ext/cplusplus.html"/>
+<tocsect3 name="1.12 Providing a C API for an Extension Module " url="ext/using-cobjects.html"/>
+</tocsect2>
+<tocsect2 name="2. Building C and C++ Extensions on Unix " url="ext/building-on-unix.html">
+<tocsect3 name="2.1 Building Custom Interpreters " url="ext/custom-interps.html"/>
+<tocsect3 name="2.2 Module Definition Options " url="ext/module-defn-options.html"/>
+<tocsect3 name="2.3 Example " url="ext/module-defn-example.html"/>
+<tocsect3 name="2.4 Distributing your extension modules " url="ext/distributing.html"/>
+</tocsect2>
+<tocsect2 name="3. Building C and C++ Extensions on Windows " url="ext/building-on-windows.html">
+<tocsect3 name="3.1 A Cookbook Approach " url="ext/win-cookbook.html"/>
+<tocsect3 name="3.2 Differences Between Unix and Windows " url="ext/dynamic-linking.html"/>
+<tocsect3 name="3.3 Using DLLs in Practice " url="ext/win-dlls.html"/>
+</tocsect2>
+<tocsect2 name="4. Embedding Python in Another Application " url="ext/embedding.html">
+<tocsect3 name="4.1 Embedding Python in C++ " url="ext/embeddingInCplusplus.html"/>
+<tocsect3 name="4.2 Linking Requirements " url="ext/link-reqs.html"/>
+</tocsect2>
+<tocsect2 name="A. Reporting Bugs" url="ext/reporting-bugs.html"/>
+<tocsect2 name="About this document ..." url="ext/about.html"/>
+</tocsect1>
+<tocsect1 name="Python/C API Reference" url="api/api.html">
+<tocsect2 name="Front Matter" url="api/front.html"/>
+<tocsect2 name="Contents" url="api/contents.html"/>
+<tocsect2 name="1. Introduction " url="api/intro.html">
+<tocsect3 name="1.1 Include Files " url="api/includes.html"/>
+<tocsect3 name="1.2 Objects, Types and Reference Counts " url="api/objects.html">
+<tocsect4 name="1.2.1 Reference Counts " url="api/refcounts.html"/>
+<tocsect4 name="1.2.2 Types " url="api/types.html"/>
+</tocsect3>
+<tocsect3 name="1.3 Exceptions " url="api/exceptions.html"/>
+<tocsect3 name="1.4 Embedding Python " url="api/embedding.html"/>
+</tocsect2>
+<tocsect2 name="2. The Very High Level Layer " url="api/veryhigh.html"/>
+<tocsect2 name="3. Reference Counting " url="api/countingRefs.html"/>
+<tocsect2 name="4. Exception Handling " url="api/exceptionHandling.html">
+<tocsect3 name="4.1 Standard Exceptions " url="api/standardExceptions.html"/>
+<tocsect3 name="4.2 Deprecation of String Exceptions" url="api/node15.html"/>
+</tocsect2>
+<tocsect2 name="5. Utilities " url="api/utilities.html">
+<tocsect3 name="5.1 OS Utilities " url="api/os.html"/>
+<tocsect3 name="5.2 Process Control " url="api/processControl.html"/>
+<tocsect3 name="5.3 Importing Modules " url="api/importing.html"/>
+</tocsect2>
+<tocsect2 name="6. Abstract Objects Layer " url="api/abstract.html">
+<tocsect3 name="6.1 Object Protocol " url="api/object.html"/>
+<tocsect3 name="6.2 Number Protocol " url="api/number.html"/>
+<tocsect3 name="6.3 Sequence Protocol " url="api/sequence.html"/>
+<tocsect3 name="6.4 Mapping Protocol " url="api/mapping.html"/>
+</tocsect2>
+<tocsect2 name="7. Concrete Objects Layer " url="api/concrete.html">
+<tocsect3 name="7.1 Fundamental Objects " url="api/fundamental.html">
+<tocsect4 name="7.1.1 Type Objects " url="api/typeObjects.html"/>
+<tocsect4 name="7.1.2 The None Object " url="api/noneObject.html"/>
+</tocsect3>
+<tocsect3 name="7.2 Sequence Objects " url="api/sequenceObjects.html">
+<tocsect4 name="7.2.1 String Objects " url="api/stringObjects.html"/>
+<tocsect4 name="7.2.2 Unicode Objects " url="api/unicodeObjects.html"/>
+<tocsect4 name="7.2.3 Buffer Objects " url="api/bufferObjects.html"/>
+<tocsect4 name="7.2.4 Tuple Objects " url="api/tupleObjects.html"/>
+<tocsect4 name="7.2.5 List Objects " url="api/listObjects.html"/>
+</tocsect3>
+<tocsect3 name="7.3 Mapping Objects " url="api/mapObjects.html">
+<tocsect4 name="7.3.1 Dictionary Objects " url="api/dictObjects.html"/>
+</tocsect3>
+<tocsect3 name="7.4 Numeric Objects " url="api/numericObjects.html">
+<tocsect4 name="7.4.1 Plain Integer Objects " url="api/intObjects.html"/>
+<tocsect4 name="7.4.2 Long Integer Objects " url="api/longObjects.html"/>
+<tocsect4 name="7.4.3 Floating Point Objects " url="api/floatObjects.html"/>
+<tocsect4 name="7.4.4 Complex Number Objects " url="api/complexObjects.html"/>
+</tocsect3>
+<tocsect3 name="7.5 Other Objects " url="api/otherObjects.html">
+<tocsect4 name="7.5.1 File Objects " url="api/fileObjects.html"/>
+<tocsect4 name="7.5.2 Module Objects " url="api/moduleObjects.html"/>
+<tocsect4 name="7.5.3 CObjects " url="api/cObjects.html"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="8. Initialization, Finalization, and Threads " url="api/initialization.html">
+<tocsect3 name="8.1 Thread State and the Global Interpreter Lock " url="api/threads.html"/>
+</tocsect2>
+<tocsect2 name="9. Memory Management " url="api/memory.html">
+<tocsect3 name="9.1 Overview " url="api/memoryOverview.html"/>
+<tocsect3 name="9.2 Memory Interface " url="api/memoryInterface.html"/>
+<tocsect3 name="9.3 Examples " url="api/memoryExamples.html"/>
+</tocsect2>
+<tocsect2 name="10. Defining New Object Types " url="api/newTypes.html">
+<tocsect3 name="10.1 Common Object Structures " url="api/common-structs.html"/>
+<tocsect3 name="10.2 Mapping Object Structures " url="api/mapping-structs.html"/>
+<tocsect3 name="10.3 Number Object Structures " url="api/number-structs.html"/>
+<tocsect3 name="10.4 Sequence Object Structures " url="api/sequence-structs.html"/>
+<tocsect3 name="10.5 Buffer Object Structures " url="api/buffer-structs.html"/>
+</tocsect2>
+<tocsect2 name="A. Reporting Bugs" url="api/reporting-bugs.html"/>
+<tocsect2 name="Index" url="api/genindex.html"/>
+<tocsect2 name="About this document ..." url="api/about.html"/>
+</tocsect1>
+<tocsect1 name="Library" url="lib/lib.html">
+<tocsect2 name="Front Matter" url="lib/front.html"/>
+<tocsect2 name="Contents" url="lib/contents.html"/>
+<tocsect2 name="1. Introduction" url="lib/intro.html"/>
+<tocsect2 name="2. Built-in Types, Exceptions and Functions" url="lib/builtin.html">
+<tocsect3 name="2.1 Built-in Types " url="lib/types.html">
+<tocsect4 name="2.1.1 Truth Value Testing " url="lib/truth.html"/>
+<tocsect4 name="2.1.2 Boolean Operations " url="lib/boolean.html"/>
+<tocsect4 name="2.1.3 Comparisons " url="lib/comparisons.html"/>
+<tocsect4 name="2.1.4 Numeric Types " url="lib/typesnumeric.html"/>
+<tocsect4 name="2.1.5 Sequence Types " url="lib/typesseq.html"/>
+<tocsect4 name="2.1.6 Mapping Types " url="lib/typesmapping.html"/>
+<tocsect4 name="2.1.7 Other Built-in Types " url="lib/typesother.html"/>
+<tocsect4 name="2.1.8 Special Attributes " url="lib/specialattrs.html"/>
+</tocsect3>
+<tocsect3 name="2.2 Built-in Exceptions" url="lib/module-exceptions.html"/>
+<tocsect3 name="2.3 Built-in Functions " url="lib/built-in-funcs.html"/>
+</tocsect2>
+<tocsect2 name="3. Python Runtime Services " url="lib/python.html">
+<tocsect3 name="3.1 sys -- System-specific parameters and functions" url="lib/module-sys.html"/>
+<tocsect3 name="3.2 gc -- Garbage Collector interface" url="lib/module-gc.html"/>
+<tocsect3 name="3.3 atexit -- Exit handlers" url="lib/module-atexit.html">
+<tocsect4 name="3.3.1 atexit Example " url="lib/atexit-example.html"/>
+</tocsect3>
+<tocsect3 name="3.4 types -- Names for all built-in types" url="lib/module-types.html"/>
+<tocsect3 name="3.5 UserDict -- Class wrapper for dictionary objects" url="lib/module-UserDict.html"/>
+<tocsect3 name="3.6 UserList -- Class wrapper for list objects" url="lib/module-UserList.html"/>
+<tocsect3 name="3.7 UserString -- Class wrapper for string objects" url="lib/module-UserString.html"/>
+<tocsect3 name="3.8 operator -- Standard operators as functions." url="lib/module-operator.html"/>
+<tocsect3 name="3.9 traceback -- Print or retrieve a stack traceback" url="lib/module-traceback.html">
+<tocsect4 name="3.9.1 Traceback Example " url="lib/traceback-example.html"/>
+</tocsect3>
+<tocsect3 name="3.10 linecache -- Random access to text lines" url="lib/module-linecache.html"/>
+<tocsect3 name="3.11 pickle -- Python object serialization" url="lib/module-pickle.html">
+<tocsect4 name="3.11.1 Example " url="lib/pickle-example.html"/>
+</tocsect3>
+<tocsect3 name="3.12 cPickle -- Alternate implementation of pickle" url="lib/module-cPickle.html"/>
+<tocsect3 name="3.13 copy_reg -- Register pickle support functions" url="lib/module-copyreg.html"/>
+<tocsect3 name="3.14 shelve -- Python object persistence" url="lib/module-shelve.html"/>
+<tocsect3 name="3.15 copy -- Shallow and deep copy operations" url="lib/module-copy.html"/>
+<tocsect3 name="3.16 marshal -- Alternate Python object serialization" url="lib/module-marshal.html"/>
+<tocsect3 name="3.17 imp -- Access the import internals" url="lib/module-imp.html">
+<tocsect4 name="3.17.1 Examples" url="lib/examples-imp.html"/>
+</tocsect3>
+<tocsect3 name="3.18 code -- Interpreter base classes" url="lib/module-code.html">
+<tocsect4 name="3.18.1 Interactive Interpreter Objects " url="lib/interpreter-objects.html"/>
+<tocsect4 name="3.18.2 Interactive Console Objects " url="lib/console-objects.html"/>
+</tocsect3>
+<tocsect3 name="3.19 codeop -- Compile Python code" url="lib/module-codeop.html"/>
+<tocsect3 name="3.20 pprint -- Data pretty printer" url="lib/module-pprint.html">
+<tocsect4 name="3.20.1 PrettyPrinter Objects" url="lib/PrettyPrinter_Objects.html"/>
+</tocsect3>
+<tocsect3 name="3.21 repr -- Alternate repr() implementation" url="lib/module-repr.html">
+<tocsect4 name="3.21.1 Repr Objects " url="lib/Repr-objects.html"/>
+<tocsect4 name="3.21.2 Subclassing Repr Objects " url="lib/subclassing-reprs.html"/>
+</tocsect3>
+<tocsect3 name="3.22 new -- Creation of runtime internal objects" url="lib/module-new.html"/>
+<tocsect3 name="3.23 site -- Site-specific configuration hook" url="lib/module-site.html"/>
+<tocsect3 name="3.24 user -- User-specific configuration hook" url="lib/module-user.html"/>
+<tocsect3 name="3.25 __builtin__ -- Built-in functions" url="lib/module-builtin.html"/>
+<tocsect3 name="3.26 __main__ -- Top-level script environment" url="lib/module-main.html"/>
+</tocsect2>
+<tocsect2 name="4. String Services" url="lib/strings.html">
+<tocsect3 name="4.1 string -- Common string operations" url="lib/module-string.html"/>
+<tocsect3 name="4.2 re -- Regular expression operations" url="lib/module-re.html">
+<tocsect4 name="4.2.1 Regular Expression Syntax " url="lib/re-syntax.html"/>
+<tocsect4 name="4.2.2 Matching vs. Searching " url="lib/matching-searching.html"/>
+<tocsect4 name="4.2.3 Module Contents" url="lib/Contents_of_Module_re.html"/>
+<tocsect4 name="4.2.4 Regular Expression Objects " url="lib/re-objects.html"/>
+<tocsect4 name="4.2.5 Match Objects " url="lib/match-objects.html"/>
+</tocsect3>
+<tocsect3 name="4.3 struct -- Interpret strings as packed binary data" url="lib/module-struct.html"/>
+<tocsect3 name="4.4 fpformat -- Floating point conversions" url="lib/module-fpformat.html"/>
+<tocsect3 name="4.5 StringIO -- Read and write strings as files" url="lib/module-StringIO.html"/>
+<tocsect3 name="4.6 cStringIO -- Faster version of StringIO" url="lib/module-cStringIO.html"/>
+<tocsect3 name="4.7 codecs -- Codec registry and base classes" url="lib/module-codecs.html">
+<tocsect4 name="4.7.1 Codec Base Classes" url="lib/node80.html"/>
+</tocsect3>
+<tocsect3 name="4.8 unicodedata -- Unicode Database" url="lib/module-unicodedata.html"/>
+</tocsect2>
+<tocsect2 name="5. Miscellaneous Services" url="lib/misc.html">
+<tocsect3 name="5.1 math -- Mathematical functions" url="lib/module-math.html"/>
+<tocsect3 name="5.2 cmath -- Mathematical functions for complex numbers" url="lib/module-cmath.html"/>
+<tocsect3 name="5.3 random -- Generate pseudo-random numbers" url="lib/module-random.html">
+<tocsect4 name="5.3.1 The Random Number Generator Interface " url="lib/rng-objects.html"/>
+</tocsect3>
+<tocsect3 name="5.4 whrandom -- Pseudo-random number generator" url="lib/module-whrandom.html"/>
+<tocsect3 name="5.5 bisect -- Array bisection algorithm" url="lib/module-bisect.html">
+<tocsect4 name="5.5.1 Example" url="lib/bisect-example.html"/>
+</tocsect3>
+<tocsect3 name="5.6 array -- Efficient arrays of numeric values" url="lib/module-array.html"/>
+<tocsect3 name="5.7 ConfigParser -- Configuration file parser" url="lib/module-ConfigParser.html">
+<tocsect4 name="5.7.1 ConfigParser Objects " url="lib/ConfigParser-objects.html"/>
+</tocsect3>
+<tocsect3 name="5.8 fileinput -- Iterate over lines from multiple input streams" url="lib/module-fileinput.html"/>
+<tocsect3 name="5.9 calendar -- General calendar-related functions" url="lib/module-calendar.html"/>
+<tocsect3 name="5.10 cmd -- Support for line-oriented command interpreters" url="lib/module-cmd.html">
+<tocsect4 name="5.10.1 Cmd Objects" url="lib/Cmd-objects.html"/>
+</tocsect3>
+<tocsect3 name="5.11 shlex -- Simple lexical analysis" url="lib/module-shlex.html">
+<tocsect4 name="5.11.1 shlex Objects " url="lib/shlex-objects.html"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="6. Generic Operating System Services " url="lib/allos.html">
+<tocsect3 name="6.1 os -- Miscellaneous OS interfaces" url="lib/module-os.html">
+<tocsect4 name="6.1.1 Process Parameters " url="lib/os-procinfo.html"/>
+<tocsect4 name="6.1.2 File Object Creation " url="lib/os-newstreams.html"/>
+<tocsect4 name="6.1.3 File Descriptor Operations " url="lib/os-fd-ops.html"/>
+<tocsect4 name="6.1.4 Files and Directories " url="lib/os-file-dir.html"/>
+<tocsect4 name="6.1.5 Process Management " url="lib/os-process.html"/>
+<tocsect4 name="6.1.6 Miscellaneous System Information " url="lib/os-path.html"/>
+</tocsect3>
+<tocsect3 name="6.2 os.path -- Common pathname manipulations" url="lib/module-os.path.html"/>
+<tocsect3 name="6.3 dircache -- Cached directory listings" url="lib/module-dircache.html"/>
+<tocsect3 name="6.4 stat -- Interpreting stat() results" url="lib/module-stat.html"/>
+<tocsect3 name="6.5 statcache -- An optimization of os.stat()" url="lib/module-statcache.html"/>
+<tocsect3 name="6.6 statvfs -- Constants used with os.statvfs()" url="lib/module-statvfs.html"/>
+<tocsect3 name="6.7 filecmp -- File and Directory Comparisons" url="lib/module-filecmp.html">
+<tocsect4 name="6.7.1 The dircmp class " url="lib/dircmp-objects.html"/>
+</tocsect3>
+<tocsect3 name="6.8 popen2 -- Subprocesses with accessible I/O streams" url="lib/module-popen2.html">
+<tocsect4 name="6.8.1 Popen3 and Popen4 Objects " url="lib/popen3-objects.html"/>
+</tocsect3>
+<tocsect3 name="6.9 time -- Time access and conversions" url="lib/module-time.html"/>
+<tocsect3 name="6.10 sched -- Event scheduler" url="lib/module-sched.html">
+<tocsect4 name="6.10.1 Scheduler Objects " url="lib/scheduler-objects.html"/>
+</tocsect3>
+<tocsect3 name="6.11 getpass -- Portable password input" url="lib/module-getpass.html"/>
+<tocsect3 name="6.12 curses -- Terminal handling for character-cell displays" url="lib/module-curses.html">
+<tocsect4 name="6.12.1 Functions " url="lib/curses-functions.html"/>
+<tocsect4 name="6.12.2 Window Objects " url="lib/curses-window-objects.html"/>
+<tocsect4 name="6.12.3 Constants" url="lib/node128.html"/>
+</tocsect3>
+<tocsect3 name="6.13 curses.textpad -- Text input widget for curses programs" url="lib/module-curses.textpad.html">
+<tocsect4 name="6.13.1 Textbox objects " url="lib/curses-textpad-objects.html"/>
+</tocsect3>
+<tocsect3 name="6.14 curses.wrapper -- Terminal handler for curses programs" url="lib/module-curses.wrapper.html"/>
+<tocsect3 name="6.15 curses.ascii -- Utilities for ASCII characters" url="lib/module-curses.ascii.html"/>
+<tocsect3 name="6.16 getopt -- Parser for command line options" url="lib/module-getopt.html"/>
+<tocsect3 name="6.17 tempfile -- Generate temporary file names" url="lib/module-tempfile.html"/>
+<tocsect3 name="6.18 errno -- Standard errno system symbols" url="lib/module-errno.html"/>
+<tocsect3 name="6.19 glob -- Unix style pathname pattern expansion" url="lib/module-glob.html"/>
+<tocsect3 name="6.20 fnmatch -- Unix filename pattern matching" url="lib/module-fnmatch.html"/>
+<tocsect3 name="6.21 shutil -- High-level file operations" url="lib/module-shutil.html">
+<tocsect4 name="6.21.1 Example " url="lib/shutil-example.html"/>
+</tocsect3>
+<tocsect3 name="6.22 locale -- Internationalization services" url="lib/module-locale.html">
+<tocsect4 name="6.22.1 Background, details, hints, tips and caveats" url="lib/node141.html"/>
+<tocsect4 name="6.22.2 For extension writers and programs that embed Python" url="lib/embedding-locale.html"/>
+</tocsect3>
+<tocsect3 name="6.23 gettext -- Multilingual internationalization services" url="lib/module-gettext.html">
+<tocsect4 name="6.23.1 GNU gettext API" url="lib/node144.html"/>
+<tocsect4 name="6.23.2 Class-based API" url="lib/node145.html"/>
+<tocsect4 name="6.23.3 Internationalizing your programs and modules" url="lib/node150.html"/>
+<tocsect4 name="6.23.4 Acknowledgments" url="lib/node155.html"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="7. Optional Operating System Services" url="lib/someos.html">
+<tocsect3 name="7.1 signal -- Set handlers for asynchronous events" url="lib/module-signal.html">
+<tocsect4 name="7.1.1 Example" url="lib/Signal_Example.html"/>
+</tocsect3>
+<tocsect3 name="7.2 socket -- Low-level networking interface" url="lib/module-socket.html">
+<tocsect4 name="7.2.1 Socket Objects " url="lib/socket-objects.html"/>
+<tocsect4 name="7.2.2 Example " url="lib/socket-example.html"/>
+</tocsect3>
+<tocsect3 name="7.3 select -- Waiting for I/O completion" url="lib/module-select.html">
+<tocsect4 name="7.3.1 Polling Objects " url="lib/poll-objects.html"/>
+</tocsect3>
+<tocsect3 name="7.4 thread -- Multiple threads of control" url="lib/module-thread.html"/>
+<tocsect3 name="7.5 threading -- Higher-level threading interface" url="lib/module-threading.html">
+<tocsect4 name="7.5.1 Lock Objects " url="lib/lock-objects.html"/>
+<tocsect4 name="7.5.2 RLock Objects " url="lib/rlock-objects.html"/>
+<tocsect4 name="7.5.3 Condition Objects " url="lib/condition-objects.html"/>
+<tocsect4 name="7.5.4 Semaphore Objects " url="lib/semaphore-objects.html"/>
+<tocsect4 name="7.5.5 Event Objects " url="lib/event-objects.html"/>
+<tocsect4 name="7.5.6 Thread Objects " url="lib/thread-objects.html"/>
+</tocsect3>
+<tocsect3 name="7.6 mutex -- Mutual exclusion support" url="lib/module-mutex.html">
+<tocsect4 name="7.6.1 Mutex Objects " url="lib/mutex-objects.html"/>
+</tocsect3>
+<tocsect3 name="7.7 Queue -- A synchronized queue class" url="lib/module-Queue.html">
+<tocsect4 name="7.7.1 Queue Objects" url="lib/QueueObjects.html"/>
+</tocsect3>
+<tocsect3 name="7.8 mmap -- Memory-mapped file support" url="lib/module-mmap.html"/>
+<tocsect3 name="7.9 anydbm -- Generic access to DBM-style databases" url="lib/module-anydbm.html"/>
+<tocsect3 name="7.10 dumbdbm -- Portable DBM implementation" url="lib/module-dumbdbm.html"/>
+<tocsect3 name="7.11 dbhash -- DBM-style interface to the BSD database library" url="lib/module-dbhash.html">
+<tocsect4 name="7.11.1 Database Objects " url="lib/dbhash-objects.html"/>
+</tocsect3>
+<tocsect3 name="7.12 whichdb -- Guess which DBM module created a database" url="lib/module-whichdb.html"/>
+<tocsect3 name="7.13 bsddb -- Interface to Berkeley DB library" url="lib/module-bsddb.html">
+<tocsect4 name="7.13.1 Hash, BTree and Record Objects " url="lib/bsddb-objects.html"/>
+</tocsect3>
+<tocsect3 name="7.14 zlib -- Compression compatible with gzip" url="lib/module-zlib.html"/>
+<tocsect3 name="7.15 gzip -- Support for gzip files" url="lib/module-gzip.html"/>
+<tocsect3 name="7.16 zipfile -- Work with ZIP archives" url="lib/module-zipfile.html">
+<tocsect4 name="7.16.1 ZipFile Objects " url="lib/zipfile-objects.html"/>
+<tocsect4 name="7.16.2 PyZipFile Objects " url="lib/pyzipfile-objects.html"/>
+<tocsect4 name="7.16.3 ZipInfo Objects " url="lib/zipinfo-objects.html"/>
+</tocsect3>
+<tocsect3 name="7.17 readline -- GNU readline interface" url="lib/module-readline.html">
+<tocsect4 name="7.17.1 Example " url="lib/readline-example.html"/>
+</tocsect3>
+<tocsect3 name="7.18 rlcompleter -- Completion function for GNU readline" url="lib/module-rlcompleter.html">
+<tocsect4 name="7.18.1 Completer Objects " url="lib/completer-objects.html"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="8. Unix Specific Services" url="lib/unix.html">
+<tocsect3 name="8.1 posix -- The most common POSIX system calls" url="lib/module-posix.html">
+<tocsect4 name="8.1.1 Large File Support " url="lib/posix-large-files.html"/>
+<tocsect4 name="8.1.2 Module Contents " url="lib/posix-contents.html"/>
+</tocsect3>
+<tocsect3 name="8.2 pwd -- The password database" url="lib/module-pwd.html"/>
+<tocsect3 name="8.3 grp -- The group database" url="lib/module-grp.html"/>
+<tocsect3 name="8.4 crypt -- Function to check Unix passwords" url="lib/module-crypt.html"/>
+<tocsect3 name="8.5 dl -- Call C functions in shared objects" url="lib/module-dl.html">
+<tocsect4 name="8.5.1 Dl Objects " url="lib/dl-objects.html"/>
+</tocsect3>
+<tocsect3 name="8.6 dbm -- Simple ``database'' interface" url="lib/module-dbm.html"/>
+<tocsect3 name="8.7 gdbm -- GNU's reinterpretation of dbm" url="lib/module-gdbm.html"/>
+<tocsect3 name="8.8 termios -- POSIX style tty control" url="lib/module-termios.html">
+<tocsect4 name="8.8.1 Example" url="lib/termios_Example.html"/>
+</tocsect3>
+<tocsect3 name="8.9 TERMIOS -- Constants used with the termios module" url="lib/module-TERMIOSuppercase.html"/>
+<tocsect3 name="8.10 tty -- Terminal control functions" url="lib/module-tty.html"/>
+<tocsect3 name="8.11 pty -- Pseudo-terminal utilities" url="lib/module-pty.html"/>
+<tocsect3 name="8.12 fcntl -- The fcntl() and ioctl() system calls" url="lib/module-fcntl.html"/>
+<tocsect3 name="8.13 pipes -- Interface to shell pipelines" url="lib/module-pipes.html">
+<tocsect4 name="8.13.1 Template Objects " url="lib/template-objects.html"/>
+</tocsect3>
+<tocsect3 name="8.14 posixfile -- File-like objects with locking support" url="lib/module-posixfile.html"/>
+<tocsect3 name="8.15 resource -- Resource usage information" url="lib/module-resource.html">
+<tocsect4 name="8.15.1 Resource Limits" url="lib/node215.html"/>
+<tocsect4 name="8.15.2 Resource Usage" url="lib/node216.html"/>
+</tocsect3>
+<tocsect3 name="8.16 nis -- Interface to Sun's NIS (Yellow Pages)" url="lib/module-nis.html"/>
+<tocsect3 name="8.17 syslog -- Unix syslog library routines" url="lib/module-syslog.html"/>
+<tocsect3 name="8.18 commands -- Utilities for running commands" url="lib/module-commands.html"/>
+</tocsect2>
+<tocsect2 name="9. The Python Debugger" url="lib/module-pdb.html">
+<tocsect3 name="9.1 Debugger Commands " url="lib/debugger-commands.html"/>
+<tocsect3 name="9.2 How It Works" url="lib/node222.html"/>
+</tocsect2>
+<tocsect2 name="10. The Python Profiler " url="lib/profile.html">
+<tocsect3 name="10.1 Introduction to the profiler" url="lib/Profiler_Introduction.html"/>
+<tocsect3 name="10.2 How Is This Profiler Different From The Old Profiler?" url="lib/Profiler_Changes.html"/>
+<tocsect3 name="10.3 Instant Users Manual " url="lib/profile-instant.html"/>
+<tocsect3 name="10.4 What Is Deterministic Profiling?" url="lib/Deterministic_Profiling.html"/>
+<tocsect3 name="10.5 Reference Manual" url="lib/module-profile.html">
+<tocsect4 name="10.5.1 The Stats Class " url="lib/profile-stats.html"/>
+</tocsect3>
+<tocsect3 name="10.6 Limitations " url="lib/profile-limits.html"/>
+<tocsect3 name="10.7 Calibration " url="lib/profile-calibration.html"/>
+<tocsect3 name="10.8 Extensions -- Deriving Better Profilers" url="lib/Profiler_Extensions.html">
+<tocsect4 name="10.8.1 OldProfile Class " url="lib/profile-old.html"/>
+<tocsect4 name="10.8.2 HotProfile Class " url="lib/profile-HotProfile.html"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="11. Internet Protocols and Support " url="lib/internet.html">
+<tocsect3 name="11.1 webbrowser -- Convenient Web-browser controller" url="lib/module-webbrowser.html">
+<tocsect4 name="11.1.1 Browser Controller Objects " url="lib/browser-controllers.html"/>
+</tocsect3>
+<tocsect3 name="11.2 cgi -- Common Gateway Interface support." url="lib/module-cgi.html">
+<tocsect4 name="11.2.1 Introduction" url="lib/cgi-intro.html"/>
+<tocsect4 name="11.2.2 Using the cgi module" url="lib/Using_the_cgi_module.html"/>
+<tocsect4 name="11.2.3 Old classes" url="lib/node241.html"/>
+<tocsect4 name="11.2.4 Functions" url="lib/Functions_in_cgi_module.html"/>
+<tocsect4 name="11.2.5 Caring about security" url="lib/node243.html"/>
+<tocsect4 name="11.2.6 Installing your CGI script on a Unix system" url="lib/node244.html"/>
+<tocsect4 name="11.2.7 Testing your CGI script" url="lib/node245.html"/>
+<tocsect4 name="11.2.8 Debugging CGI scripts" url="lib/node246.html"/>
+<tocsect4 name="11.2.9 Common problems and solutions" url="lib/node247.html"/>
+</tocsect3>
+<tocsect3 name="11.3 urllib -- Open arbitrary resources by URL" url="lib/module-urllib.html">
+<tocsect4 name="11.3.1 URLopener Objects " url="lib/urlopener-objs.html"/>
+<tocsect4 name="11.3.2 Examples" url="lib/Urllib_Examples.html"/>
+</tocsect3>
+<tocsect3 name="11.4 httplib -- HTTP protocol client" url="lib/module-httplib.html">
+<tocsect4 name="11.4.1 HTTP Objects" url="lib/node252.html"/>
+<tocsect4 name="11.4.2 Examples" url="lib/HTTP_Examples.html"/>
+</tocsect3>
+<tocsect3 name="11.5 ftplib -- FTP protocol client" url="lib/module-ftplib.html">
+<tocsect4 name="11.5.1 FTP Objects " url="lib/ftp-objects.html"/>
+</tocsect3>
+<tocsect3 name="11.6 gopherlib -- Gopher protocol client" url="lib/module-gopherlib.html"/>
+<tocsect3 name="11.7 poplib -- POP3 protocol client" url="lib/module-poplib.html">
+<tocsect4 name="11.7.1 POP3 Objects " url="lib/pop3-objects.html"/>
+<tocsect4 name="11.7.2 POP3 Example " url="lib/pop3-example.html"/>
+</tocsect3>
+<tocsect3 name="11.8 imaplib -- IMAP4 protocol client" url="lib/module-imaplib.html">
+<tocsect4 name="11.8.1 IMAP4 Objects " url="lib/imap4-objects.html"/>
+<tocsect4 name="11.8.2 IMAP4 Example " url="lib/imap4-example.html"/>
+</tocsect3>
+<tocsect3 name="11.9 nntplib -- NNTP protocol client" url="lib/module-nntplib.html">
+<tocsect4 name="11.9.1 NNTP Objects " url="lib/nntp-objects.html"/>
+</tocsect3>
+<tocsect3 name="11.10 smtplib -- SMTP protocol client" url="lib/module-smtplib.html">
+<tocsect4 name="11.10.1 SMTP Objects " url="lib/SMTP-objects.html"/>
+<tocsect4 name="11.10.2 SMTP Example " url="lib/SMTP-example.html"/>
+</tocsect3>
+<tocsect3 name="11.11 telnetlib -- Telnet client" url="lib/module-telnetlib.html">
+<tocsect4 name="11.11.1 Telnet Objects " url="lib/telnet-objects.html"/>
+<tocsect4 name="11.11.2 Telnet Example " url="lib/telnet-example.html"/>
+</tocsect3>
+<tocsect3 name="11.12 urlparse -- Parse URLs into components" url="lib/module-urlparse.html"/>
+<tocsect3 name="11.13 SocketServer -- A framework for network servers" url="lib/module-SocketServer.html"/>
+<tocsect3 name="11.14 BaseHTTPServer -- Basic HTTP server" url="lib/module-BaseHTTPServer.html"/>
+<tocsect3 name="11.15 SimpleHTTPServer -- Simple HTTP request handler" url="lib/module-SimpleHTTPServer.html"/>
+<tocsect3 name="11.16 CGIHTTPServer -- CGI-capable HTTP request handler" url="lib/module-CGIHTTPServer.html"/>
+<tocsect3 name="11.17 Cookie -- HTTP state management" url="lib/module-Cookie.html">
+<tocsect4 name="11.17.1 Cookie Objects " url="lib/cookie-objects.html"/>
+<tocsect4 name="11.17.2 Morsel Objects " url="lib/morsel-objects.html"/>
+<tocsect4 name="11.17.3 Example " url="lib/cookie-example.html"/>
+</tocsect3>
+<tocsect3 name="11.18 asyncore -- Asynchronous socket handler" url="lib/module-asyncore.html">
+<tocsect4 name="11.18.1 Example basic HTTP client " url="lib/asyncore-example.html"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="12. Internet Data Handling " url="lib/netdata.html">
+<tocsect3 name="12.1 formatter -- Generic output formatting" url="lib/module-formatter.html">
+<tocsect4 name="12.1.1 The Formatter Interface " url="lib/formatter-interface.html"/>
+<tocsect4 name="12.1.2 Formatter Implementations " url="lib/formatter-impls.html"/>
+<tocsect4 name="12.1.3 The Writer Interface " url="lib/writer-interface.html"/>
+<tocsect4 name="12.1.4 Writer Implementations " url="lib/writer-impls.html"/>
+</tocsect3>
+<tocsect3 name="12.2 rfc822 -- Parse RFC 822 mail headers" url="lib/module-rfc822.html">
+<tocsect4 name="12.2.1 Message Objects " url="lib/message-objects.html"/>
+<tocsect4 name="12.2.2 AddressList Objects " url="lib/addresslist-objects.html"/>
+</tocsect3>
+<tocsect3 name="12.3 mimetools -- Tools for parsing MIME messages" url="lib/module-mimetools.html">
+<tocsect4 name="12.3.1 Additional Methods of Message Objects " url="lib/mimetools-message-objects.html"/>
+</tocsect3>
+<tocsect3 name="12.4 MimeWriter -- Generic MIME file writer" url="lib/module-MimeWriter.html">
+<tocsect4 name="12.4.1 MimeWriter Objects " url="lib/MimeWriter-objects.html"/>
+</tocsect3>
+<tocsect3 name="12.5 multifile -- Support for files containing distinct parts" url="lib/module-multifile.html">
+<tocsect4 name="12.5.1 MultiFile Objects " url="lib/MultiFile-objects.html"/>
+<tocsect4 name="12.5.2 MultiFile Example " url="lib/multifile-example.html"/>
+</tocsect3>
+<tocsect3 name="12.6 binhex -- Encode and decode binhex4 files" url="lib/module-binhex.html">
+<tocsect4 name="12.6.1 Notes " url="lib/binhex-notes.html"/>
+</tocsect3>
+<tocsect3 name="12.7 uu -- Encode and decode uuencode files" url="lib/module-uu.html"/>
+<tocsect3 name="12.8 binascii -- Convert between binary and ASCII" url="lib/module-binascii.html"/>
+<tocsect3 name="12.9 xdrlib -- Encode and decode XDR data" url="lib/module-xdrlib.html">
+<tocsect4 name="12.9.1 Packer Objects " url="lib/xdr-packer-objects.html"/>
+<tocsect4 name="12.9.2 Unpacker Objects " url="lib/xdr-unpacker-objects.html"/>
+<tocsect4 name="12.9.3 Exceptions " url="lib/xdr-exceptions.html"/>
+</tocsect3>
+<tocsect3 name="12.10 mailcap -- Mailcap file handling." url="lib/module-mailcap.html"/>
+<tocsect3 name="12.11 mimetypes -- Map filenames to MIME types" url="lib/module-mimetypes.html"/>
+<tocsect3 name="12.12 base64 -- Encode and decode MIME base64 data" url="lib/module-base64.html"/>
+<tocsect3 name="12.13 quopri -- Encode and decode MIME quoted-printable data" url="lib/module-quopri.html"/>
+<tocsect3 name="12.14 mailbox -- Read various mailbox formats" url="lib/module-mailbox.html">
+<tocsect4 name="12.14.1 Mailbox Objects " url="lib/mailbox-objects.html"/>
+</tocsect3>
+<tocsect3 name="12.15 mhlib -- Access to MH mailboxes" url="lib/module-mhlib.html">
+<tocsect4 name="12.15.1 MH Objects " url="lib/mh-objects.html"/>
+<tocsect4 name="12.15.2 Folder Objects " url="lib/mh-folder-objects.html"/>
+<tocsect4 name="12.15.3 Message Objects " url="lib/mh-message-objects.html"/>
+</tocsect3>
+<tocsect3 name="12.16 mimify -- MIME processing of mail messages" url="lib/module-mimify.html"/>
+<tocsect3 name="12.17 netrc -- netrc file processing" url="lib/module-netrc.html">
+<tocsect4 name="12.17.1 netrc Objects " url="lib/netrc-objects.html"/>
+</tocsect3>
+<tocsect3 name="12.18 robotparser -- Parser for robots.txt" url="lib/module-robotparser.html"/>
+</tocsect2>
+<tocsect2 name="13. Structured Markup Processing Tools " url="lib/markup.html">
+<tocsect3 name="13.1 sgmllib -- Simple SGML parser" url="lib/module-sgmllib.html"/>
+<tocsect3 name="13.2 htmllib -- A parser for HTML documents" url="lib/module-htmllib.html">
+<tocsect4 name="13.2.1 HTMLParser Objects " url="lib/html-parser-objects.html"/>
+</tocsect3>
+<tocsect3 name="13.3 htmlentitydefs -- Definitions of HTML general entities" url="lib/module-htmlentitydefs.html"/>
+<tocsect3 name="13.4 xml.parsers.expat -- Fast XML parsing using the Expat library" url="lib/module-xml.parsers.expat.html">
+<tocsect4 name="13.4.1 Example " url="lib/expat-example.html"/>
+<tocsect4 name="13.4.2 Expat error constants " url="lib/expat-errors.html"/>
+</tocsect3>
+<tocsect3 name="13.5 xml.sax -- Support for SAX2 parsers" url="lib/module-xml.sax.html">
+<tocsect4 name="13.5.1 SAXException Objects " url="lib/sax-exception-objects.html"/>
+</tocsect3>
+<tocsect3 name="13.6 xml.sax.handler -- Base classes for SAX handlers" url="lib/module-xml.sax.handler.html">
+<tocsect4 name="13.6.1 ContentHandler Objects " url="lib/content-handler-objects.html"/>
+<tocsect4 name="13.6.2 DTDHandler Objects " url="lib/dtd-handler-objects.html"/>
+<tocsect4 name="13.6.3 EntityResolver Objects " url="lib/entity-resolver-objects.html"/>
+</tocsect3>
+<tocsect3 name="13.7 xml.sax.saxutils -- SAX Utilities" url="lib/module-xml.sax.saxutils.html"/>
+<tocsect3 name="13.8 xml.sax.xmlreader -- Interface for XML parsers" url="lib/module-xml.sax.xmlreader.html">
+<tocsect4 name="13.8.1 XMLReader Objects " url="lib/xmlreader-objects.html"/>
+<tocsect4 name="13.8.2 IncrementalParser Objects " url="lib/incremental-parser-objects.html"/>
+<tocsect4 name="13.8.3 Locator Objects " url="lib/locator-objects.html"/>
+<tocsect4 name="13.8.4 InputSource Objects " url="lib/input-source-objects.html"/>
+<tocsect4 name="13.8.5 AttributesImpl Objects " url="lib/attributes-impl-objects.html"/>
+<tocsect4 name="13.8.6 AttributesNSImpl Objects " url="lib/attributes-ns-impl-objects.html"/>
+</tocsect3>
+<tocsect3 name="13.9 xmllib -- A parser for XML documents" url="lib/module-xmllib.html">
+<tocsect4 name="13.9.1 XML Namespaces " url="lib/xml-namespace.html"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="14. Multimedia Services" url="lib/mmedia.html">
+<tocsect3 name="14.1 audioop -- Manipulate raw audio data" url="lib/module-audioop.html"/>
+<tocsect3 name="14.2 imageop -- Manipulate raw image data" url="lib/module-imageop.html"/>
+<tocsect3 name="14.3 aifc -- Read and write AIFF and AIFC files" url="lib/module-aifc.html"/>
+<tocsect3 name="14.4 sunau -- Read and write Sun AU files" url="lib/module-sunau.html">
+<tocsect4 name="14.4.1 AU_read Objects " url="lib/au-read-objects.html"/>
+<tocsect4 name="14.4.2 AU_write Objects " url="lib/au-write-objects.html"/>
+</tocsect3>
+<tocsect3 name="14.5 wave -- Read and write WAV files" url="lib/module-wave.html">
+<tocsect4 name="14.5.1 Wave_read Objects " url="lib/Wave-read-objects.html"/>
+<tocsect4 name="14.5.2 Wave_write Objects " url="lib/Wave-write-objects.html"/>
+</tocsect3>
+<tocsect3 name="14.6 chunk -- Read IFF chunked data" url="lib/module-chunk.html"/>
+<tocsect3 name="14.7 colorsys -- Conversions between color systems" url="lib/module-colorsys.html"/>
+<tocsect3 name="14.8 rgbimg -- Read and write ``SGI RGB'' files" url="lib/module-rgbimg.html"/>
+<tocsect3 name="14.9 imghdr -- Determine the type of an image" url="lib/module-imghdr.html"/>
+<tocsect3 name="14.10 sndhdr -- Determine type of sound file" url="lib/module-sndhdr.html"/>
+</tocsect2>
+<tocsect2 name="15. Cryptographic Services" url="lib/crypto.html">
+<tocsect3 name="15.1 md5 -- MD5 message digest algorithm" url="lib/module-md5.html"/>
+<tocsect3 name="15.2 sha -- SHA message digest algorithm" url="lib/module-sha.html"/>
+<tocsect3 name="15.3 mpz -- GNU arbitrary magnitude integers" url="lib/module-mpz.html"/>
+<tocsect3 name="15.4 rotor -- Enigma-like encryption and decryption" url="lib/module-rotor.html"/>
+</tocsect2>
+<tocsect2 name="16. Restricted Execution " url="lib/restricted.html">
+<tocsect3 name="16.1 rexec -- Restricted execution framework" url="lib/module-rexec.html">
+<tocsect4 name="16.1.1 An example" url="lib/node366.html"/>
+</tocsect3>
+<tocsect3 name="16.2 Bastion -- Restricting access to objects" url="lib/module-Bastion.html"/>
+</tocsect2>
+<tocsect2 name="17. Python Language Services " url="lib/language.html">
+<tocsect3 name="17.1 parser -- Access Python parse trees" url="lib/module-parser.html">
+<tocsect4 name="17.1.1 Creating AST Objects " url="lib/Creating_ASTs.html"/>
+<tocsect4 name="17.1.2 Converting AST Objects " url="lib/Converting_ASTs.html"/>
+<tocsect4 name="17.1.3 Queries on AST Objects " url="lib/Querying_ASTs.html"/>
+<tocsect4 name="17.1.4 Exceptions and Error Handling " url="lib/AST_Errors.html"/>
+<tocsect4 name="17.1.5 AST Objects " url="lib/AST_Objects.html"/>
+<tocsect4 name="17.1.6 Examples " url="lib/AST_Examples.html"/>
+</tocsect3>
+<tocsect3 name="17.2 symbol -- Constants used with Python parse trees" url="lib/module-symbol.html"/>
+<tocsect3 name="17.3 token -- Constants used with Python parse trees" url="lib/module-token.html"/>
+<tocsect3 name="17.4 keyword -- Testing for Python keywords" url="lib/module-keyword.html"/>
+<tocsect3 name="17.5 tokenize -- Tokenizer for Python source" url="lib/module-tokenize.html"/>
+<tocsect3 name="17.6 tabnanny -- Detection of ambiguous indentation" url="lib/module-tabnanny.html"/>
+<tocsect3 name="17.7 pyclbr -- Python class browser support" url="lib/module-pyclbr.html">
+<tocsect4 name="17.7.1 Class Descriptor Objects " url="lib/pyclbr-class-objects.html"/>
+</tocsect3>
+<tocsect3 name="17.8 py_compile -- Compile Python source files" url="lib/module-pycompile.html"/>
+<tocsect3 name="17.9 compileall -- Byte-compile Python libraries" url="lib/module-compileall.html"/>
+<tocsect3 name="17.10 dis -- Disassembler for Python byte code" url="lib/module-dis.html">
+<tocsect4 name="17.10.1 Python Byte Code Instructions" url="lib/bytecodes.html"/>
+</tocsect3>
+</tocsect2>
+<tocsect2 name="18. SGI IRIX Specific Services" url="lib/sgi.html">
+<tocsect3 name="18.1 al -- Audio functions on the SGI" url="lib/module-al.html">
+<tocsect4 name="18.1.1 Configuration Objects " url="lib/al-config-objects.html"/>
+<tocsect4 name="18.1.2 Port Objects " url="lib/al-port-objects.html"/>
+</tocsect3>
+<tocsect3 name="18.2 AL -- Constants used with the al module" url="lib/module-al-constants.html"/>
+<tocsect3 name="18.3 cd -- CD-ROM access on SGI systems" url="lib/module-cd.html">
+<tocsect4 name="18.3.1 Player Objects" url="lib/player-objects.html"/>
+<tocsect4 name="18.3.2 Parser Objects" url="lib/cd-parser-objects.html"/>
+</tocsect3>
+<tocsect3 name="18.4 fl -- FORMS library interface for GUI applications" url="lib/module-fl.html">
+<tocsect4 name="18.4.1 Functions Defined in Module fl" url="lib/FL_Functions.html"/>
+<tocsect4 name="18.4.2 Form Objects" url="lib/form-objects.html"/>
+<tocsect4 name="18.4.3 FORMS Objects" url="lib/forms-objects.html"/>
+</tocsect3>
+<tocsect3 name="18.5 FL -- Constants used with the fl module" url="lib/module-fl-constants.html"/>
+<tocsect3 name="18.6 flp -- Functions for loading stored FORMS designs" url="lib/module-flp.html"/>
+<tocsect3 name="18.7 fm -- Font Manager interface" url="lib/module-fm.html"/>
+<tocsect3 name="18.8 gl -- Graphics Library interface" url="lib/module-gl.html"/>
+<tocsect3 name="18.9 DEVICE -- Constants used with the gl module" url="lib/module-DEVICE.html"/>
+<tocsect3 name="18.10 GL -- Constants used with the gl module" url="lib/module-gl-constants.html"/>
+<tocsect3 name="18.11 imgfile -- Support for SGI imglib files" url="lib/module-imgfile.html"/>
+<tocsect3 name="18.12 jpeg -- Read and write JPEG files" url="lib/module-jpeg.html"/>
+</tocsect2>
+<tocsect2 name="19. SunOS Specific Services" url="lib/sunos.html">
+<tocsect3 name="19.1 sunaudiodev -- Access to Sun audio hardware" url="lib/module-sunaudiodev.html">
+<tocsect4 name="19.1.1 Audio Device Objects " url="lib/audio-device-objects.html"/>
+</tocsect3>
+<tocsect3 name="19.2 SUNAUDIODEV -- Constants used with sunaudiodev" url="lib/module-sunaudiodev-constants.html"/>
+</tocsect2>
+<tocsect2 name="20. MS Windows Specific Services" url="lib/node413.html">
+<tocsect3 name="20.1 msvcrt - Useful routines from the MS VC++ runtime" url="lib/module-msvcrt.html">
+<tocsect4 name="20.1.1 File Operations " url="lib/msvcrt-files.html"/>
+<tocsect4 name="20.1.2 Console I/O " url="lib/msvcrt-console.html"/>
+<tocsect4 name="20.1.3 Other Functions " url="lib/msvcrt-other.html"/>
+</tocsect3>
+<tocsect3 name="20.2 _winreg - Windows registry access" url="lib/module--winreg.html">
+<tocsect4 name="20.2.1 Registry handle objects " url="lib/handle-object.html"/>
+</tocsect3>
+<tocsect3 name="20.3 winsound -- Sound-playing interface for Windows" url="lib/module-winsound.html"/>
+</tocsect2>
+<tocsect2 name="A. Undocumented Modules " url="lib/undoc.html">
+<tocsect3 name="A.1 Frameworks" url="lib/node422.html"/>
+<tocsect3 name="A.2 Miscellaneous useful utilities" url="lib/node423.html"/>
+<tocsect3 name="A.3 Platform specific modules" url="lib/node424.html"/>
+<tocsect3 name="A.4 Multimedia" url="lib/node425.html"/>
+<tocsect3 name="A.5 Obsolete " url="lib/obsolete-modules.html"/>
+<tocsect3 name="A.6 SGI-specific Extension modules" url="lib/node427.html"/>
+</tocsect2>
+<tocsect2 name="B. Reporting Bugs" url="lib/reporting-bugs.html"/>
+<tocsect2 name="Module Index" url="lib/modindex.html"/>
+<tocsect2 name="Index" url="lib/genindex.html"/>
+<tocsect2 name="About this document ..." url="lib/about.html"/>
+</tocsect1>
+
+<index>
+<entry name="__abs__() (numeric object method)" url="ref/numeric-types.html#l2h-209"/>
+<entry name="__add__() (numeric object method)" url="ref/numeric-types.html#l2h-183"/>
+<entry name="__add__() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="__and__() (numeric object method)" url="ref/numeric-types.html#l2h-192"/>
+<entry name="__bases__ (class attribute)" url="ref/types.html#l2h-47"/>
+<entry name="__builtin__ (built-in module)" url="ref/execframes.html#l2h-247"/>
+<entry name="__builtins__" url="ref/exec.html#l2h-399"/>
+<entry name="__call__() (object method)" url="ref/callable-types.html#l2h-163"/>
+<entry name="__class__ (instance attribute)" url="ref/types.html#l2h-49"/>
+<entry name="__cmp__() (object method)" url="ref/customization.html#l2h-137"/>
+<entry name="__coerce__() (numeric object method)" url="ref/sequence-types.html#l2h-170"/>
+<entry name="__complex__() (numeric object method)" url="ref/numeric-types.html#l2h-211"/>
+<entry name="__contains__() (sequence object method)" url="ref/sequence-methods.html#l2h-182"/>
+<entry name="__debug__" url="ref/assert.html#l2h-340"/>
+<entry name="__del__() (object method)" url="ref/customization.html#l2h-134"/>
+<entry name="__delattr__() (object method)" url="ref/attribute-access.html#l2h-162"/>
+<entry name="__delitem__() (mapping object method)" url="ref/sequence-types.html#l2h-176"/>
+<entry name="__delslice__() (sequence object method)" url="ref/sequence-methods.html#l2h-181"/>
+<entry name="__dict__ (class attribute)" url="ref/types.html#l2h-47"/>
+<entry name="__dict__ (instance attribute)" url="ref/types.html#l2h-49"/>
+<entry name="__dict__ (module attribute)" url="ref/types.html#l2h-43"/>
+<entry name="__div__() (numeric object method)" url="ref/numeric-types.html#l2h-186"/>
+<entry name="__divmod__() (numeric object method)" url="ref/numeric-types.html#l2h-188"/>
+<entry name="__doc__ (class attribute)" url="ref/types.html#l2h-47"/>
+<entry name="__doc__ (function attribute)" url="ref/types.html#l2h-35"/>
+<entry name="__doc__ (module attribute)" url="ref/types.html#l2h-45"/>
+<entry name="__file__ (module attribute)" url="ref/types.html#l2h-45"/>
+<entry name="__float__() (numeric object method)" url="ref/numeric-types.html#l2h-214"/>
+<entry name="__getattr__() (object method)" url="ref/attribute-access.html#l2h-156"/>
+<entry name="__getitem__() (mapping object method)" url="ref/specialnames.html#l2h-132"/>
+<entry name="__getslice__() (sequence object method)" url="ref/sequence-methods.html#l2h-179"/>
+<entry name="__hash__() (object method)" url="ref/customization.html#l2h-139"/>
+<entry name="__hex__() (numeric object method)" url="ref/numeric-types.html#l2h-216"/>
+<entry name="__iadd__() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="__import__() (built-in function)" url="ref/import.html#l2h-394"/>
+<entry name="__imul__() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="__init__() (object method)" url="ref/types.html#l2h-41"/>
+<entry name="__init__.py" url="ref/import.html#l2h-393"/>
+<entry name="__int__() (numeric object method)" url="ref/numeric-types.html#l2h-212"/>
+<entry name="__invert__() (numeric object method)" url="ref/numeric-types.html#l2h-210"/>
+<entry name="__len__() (mapping object method)" url="ref/customization.html#l2h-144"/>
+<entry name="__long__() (numeric object method)" url="ref/numeric-types.html#l2h-213"/>
+<entry name="__lshift__() (numeric object method)" url="ref/numeric-types.html#l2h-190"/>
+<entry name="__main__ (built-in module)" url="ref/execframes.html#l2h-235"/>
+<entry name="__members__ (built-in object attribute)" url="ref/types.html#l2h-31"/>
+<entry name="__methods__ (built-in object attribute)" url="ref/types.html#l2h-31"/>
+<entry name="__mod__() (numeric object method)" url="ref/numeric-types.html#l2h-187"/>
+<entry name="__module__ (class attribute)" url="ref/types.html#l2h-47"/>
+<entry name="__mul__() (numeric object method)" url="ref/numeric-types.html#l2h-185"/>
+<entry name="__mul__() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="__name__ (class attribute)" url="ref/types.html#l2h-47"/>
+<entry name="__name__ (function attribute)" url="ref/types.html#l2h-35"/>
+<entry name="__name__ (module attribute)" url="ref/types.html#l2h-45"/>
+<entry name="__neg__() (numeric object method)" url="ref/numeric-types.html#l2h-207"/>
+<entry name="__nonzero__() (object method)" url="ref/customization.html#l2h-142"/>
+<entry name="__oct__() (numeric object method)" url="ref/numeric-types.html#l2h-215"/>
+<entry name="__or__() (numeric object method)" url="ref/numeric-types.html#l2h-194"/>
+<entry name="__pos__() (numeric object method)" url="ref/numeric-types.html#l2h-208"/>
+<entry name="__pow__() (numeric object method)" url="ref/numeric-types.html#l2h-189"/>
+<entry name="__radd__() (numeric object method)" url="ref/numeric-types.html#l2h-195"/>
+<entry name="__radd__() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="__rand__() (numeric object method)" url="ref/numeric-types.html#l2h-204"/>
+<entry name="__rcmp__() (object method)" url="ref/customization.html#l2h-138"/>
+<entry name="__rdiv__() (numeric object method)" url="ref/numeric-types.html#l2h-198"/>
+<entry name="__rdivmod__() (numeric object method)" url="ref/numeric-types.html#l2h-200"/>
+<entry name="__repr__() (object method)" url="ref/customization.html#l2h-135"/>
+<entry name="__rlshift__() (numeric object method)" url="ref/numeric-types.html#l2h-202"/>
+<entry name="__rmod__() (numeric object method)" url="ref/numeric-types.html#l2h-199"/>
+<entry name="__rmul__() (numeric object method)" url="ref/numeric-types.html#l2h-197"/>
+<entry name="__rmul__() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="__ror__() (numeric object method)" url="ref/numeric-types.html#l2h-206"/>
+<entry name="__rpow__() (numeric object method)" url="ref/numeric-types.html#l2h-201"/>
+<entry name="__rrshift__() (numeric object method)" url="ref/numeric-types.html#l2h-203"/>
+<entry name="__rshift__() (numeric object method)" url="ref/numeric-types.html#l2h-191"/>
+<entry name="__rsub__() (numeric object method)" url="ref/numeric-types.html#l2h-196"/>
+<entry name="__rxor__() (numeric object method)" url="ref/numeric-types.html#l2h-205"/>
+<entry name="__setattr__() (object method)" url="ref/attribute-access.html#l2h-158"/>
+<entry name="__setitem__() (mapping object method)" url="ref/sequence-types.html#l2h-175"/>
+<entry name="__setslice__() (sequence object method)" url="ref/sequence-methods.html#l2h-180"/>
+<entry name="__str__() (object method)" url="ref/customization.html#l2h-136"/>
+<entry name="__sub__() (numeric object method)" url="ref/numeric-types.html#l2h-184"/>
+<entry name="__xor__() (numeric object method)" url="ref/numeric-types.html#l2h-193"/>
+<entry name="abs() (built-in function)" url="ref/numeric-types.html#l2h-224"/>
+<entry name="addition" url="ref/binary.html#l2h-311"/>
+<entry name="and, bit-wise" url="ref/bitwise.html#l2h-316"/>
+<entry name="and operator" url="ref/lambda.html#l2h-326"/>
+<entry name="anonmymous, function" url="ref/lambda.html#l2h-328"/>
+<entry name="append() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="argument, function" url="ref/types.html#l2h-102"/>
+<entry name="arithmetic, conversion" url="ref/conversions.html#l2h-260"/>
+<entry name="arithmetic, operation, binary" url="ref/binary.html#l2h-307"/>
+<entry name="arithmetic, operation, unary" url="ref/unary.html#l2h-302"/>
+<entry name="array (standard module)" url="ref/types.html#l2h-94"/>
+<entry name="ASCII" url="ref/notation.html#l2h-2"/>
+<entry name="assert statement" url="ref/assert.html#l2h-338"/>
+<entry name="AssertionError exception" url="ref/assert.html#l2h-341"/>
+<entry name="assertions, debugging" url="ref/assert.html#l2h-339"/>
+<entry name="assignment, attribute" url="ref/assignment.html#l2h-343"/>
+<entry name="assignment, augmented" url="ref/augassign.html#l2h-354"/>
+<entry name="assignment, class attribute" url="ref/types.html#l2h-112"/>
+<entry name="assignment (continued), class instance attribute" url="ref/types.html#l2h-115"/>
+<entry name="assignment (continued), slicing" url="ref/assignment.html#l2h-353"/>
+<entry name="assignment (continued), statement" url="ref/types.html#l2h-92"/>
+<entry name="assignment (continued), subscription" url="ref/assignment.html#l2h-350"/>
+<entry name="assignment (continued), target list" url="ref/assignment.html#l2h-346"/>
+<entry name="atom" url="ref/atoms.html#l2h-261"/>
+<entry name="attribute" url="ref/types.html#l2h-69"/>
+<entry name="assignment" url="ref/assignment.html#l2h-343"/>
+<entry name="assignment, class" url="ref/types.html#l2h-112"/>
+<entry name="assignment, class instance" url="ref/types.html#l2h-115"/>
+<entry name="class" url="ref/types.html#l2h-111"/>
+<entry name="class instance" url="ref/types.html#l2h-114"/>
+<entry name="deletion" url="ref/del.html#l2h-360"/>
+<entry name="generic special" url="ref/types.html#l2h-69"/>
+<entry name="reference" url="ref/attribute-references.html#l2h-282"/>
+<entry name="special" url="ref/types.html#l2h-69"/>
+<entry name="AttributeError exception" url="ref/attribute-references.html#l2h-283"/>
+<entry name="augmented, assignment" url="ref/augassign.html#l2h-354"/>
+<entry name="augmented, back-quotes" url="ref/customization.html#l2h-149"/>
+<entry name="augmented, backslash character" url="ref/explicit-joining.html#l2h-7"/>
+<entry name="backward, quotes" url="ref/customization.html#l2h-149"/>
+<entry name="binary, arithmetic operation" url="ref/binary.html#l2h-307"/>
+<entry name="binary, bit-wise operation" url="ref/bitwise.html#l2h-315"/>
+<entry name="binding, global name" url="ref/global.html#l2h-396"/>
+<entry name="binding, name" url="ref/execframes.html#l2h-241"/>
+<entry name="bit-wise, and" url="ref/bitwise.html#l2h-316"/>
+<entry name="bit-wise, operation, binary" url="ref/bitwise.html#l2h-315"/>
+<entry name="bit-wise, operation, unary" url="ref/unary.html#l2h-302"/>
+<entry name="bit-wise, or" url="ref/bitwise.html#l2h-318"/>
+<entry name="bit-wise, xor" url="ref/bitwise.html#l2h-317"/>
+<entry name="blank line" url="ref/blank-lines.html#l2h-8"/>
+<entry name="block, code" url="ref/execframes.html#l2h-238"/>
+<entry name="block, BNF" url="ref/notation.html#l2h-1"/>
+<entry name="Boolean, operation" url="ref/lambda.html#l2h-324"/>
+<entry name="break statement" url="ref/break.html#l2h-375"/>
+<entry name="bsddb (standard module)" url="ref/types.html#l2h-100"/>
+<entry name="built-in, method" url="ref/types.html#l2h-107"/>
+<entry name="built-in, module" url="ref/import.html#l2h-386"/>
+<entry name="built-in, name" url="ref/atom-identifiers.html#l2h-263"/>
+<entry name="built-in function, call" url="ref/calls.html#l2h-298"/>
+<entry name="built-in function object" url="ref/types.html#l2h-106"/>
+<entry name="built-in method, call" url="ref/calls.html#l2h-298"/>
+<entry name="built-in method object" url="ref/types.html#l2h-107"/>
+<entry name="byte" url="ref/types.html#l2h-85"/>
+<entry name="bytecode" url="ref/types.html#l2h-124"/>
+<entry name="C" url="ref/strings.html#l2h-17"/>
+<entry name="language" url="ref/types.html#l2h-68"/>
+<entry name="call" url="ref/calls.html#l2h-293"/>
+<entry name="built-in function" url="ref/calls.html#l2h-298"/>
+<entry name="built-in method" url="ref/calls.html#l2h-298"/>
+<entry name="class instance" url="ref/calls.html#l2h-300"/>
+<entry name="class object" url="ref/types.html#l2h-108"/>
+<entry name="function" url="ref/types.html#l2h-102"/>
+<entry name="instance" url="ref/callable-types.html#l2h-164"/>
+<entry name="method" url="ref/calls.html#l2h-298"/>
+<entry name="procedure" url="ref/exprstmts.html#l2h-337"/>
+<entry name="user-defined function" url="ref/calls.html#l2h-297"/>
+<entry name="callable object" url="ref/types.html#l2h-101"/>
+<entry name="chaining, comparisons" url="ref/comparisons.html#l2h-321"/>
+<entry name="character" url="ref/types.html#l2h-85"/>
+<entry name="character set" url="ref/types.html#l2h-86"/>
+<entry name="chr() (built-in function)" url="ref/types.html#l2h-83"/>
+<entry name="class, attribute" url="ref/types.html#l2h-111"/>
+<entry name="class, attribute assignment" url="ref/types.html#l2h-112"/>
+<entry name="class, constructor" url="ref/customization.html#l2h-145"/>
+<entry name="class, definition" url="ref/return.html#l2h-370"/>
+<entry name="class, instance" url="ref/types.html#l2h-114"/>
+<entry name="class, name" url="ref/class.html#l2h-434"/>
+<entry name="class instance, attribute" url="ref/types.html#l2h-114"/>
+<entry name="class instance, attribute assignment" url="ref/types.html#l2h-115"/>
+<entry name="class instance, call" url="ref/calls.html#l2h-300"/>
+<entry name="class instance object" url="ref/types.html#l2h-108"/>
+<entry name="class object" url="ref/types.html#l2h-108"/>
+<entry name="call" url="ref/types.html#l2h-108"/>
+<entry name="clause" url="ref/compound.html#l2h-403"/>
+<entry name="clear() (mapping object method)" url="ref/sequence-types.html#l2h-166"/>
+<entry name="cmp() (built-in function)" url="ref/customization.html#l2h-152"/>
+<entry name="co_argcount (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_code (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_consts (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_filename (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_firstlineno (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_flags (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_lnotab (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_name (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_names (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_nlocals (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_stacksize (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="co_varnames (code object attribute)" url="ref/types.html#l2h-57"/>
+<entry name="code, block" url="ref/execframes.html#l2h-238"/>
+<entry name="code block" url="ref/execframes.html#l2h-232"/>
+<entry name="code object" url="ref/types.html#l2h-124"/>
+<entry name="comma" url="ref/parenthesized.html#l2h-270"/>
+<entry name="trailing" url="ref/exprlists.html#l2h-331"/>
+<entry name="command line" url="ref/programs.html#l2h-439"/>
+<entry name="comment" url="ref/comments.html#l2h-6"/>
+<entry name="comparison" url="ref/comparisons.html#l2h-319"/>
+<entry name="string" url="ref/types.html#l2h-86"/>
+<entry name="comparisons" url="ref/customization.html#l2h-152"/>
+<entry name="chaining" url="ref/comparisons.html#l2h-321"/>
+<entry name="compile() (built-in function)" url="ref/global.html#l2h-397"/>
+<entry name="complex, number" url="ref/types.html#l2h-78"/>
+<entry name="complex() (built-in function)" url="ref/numeric-types.html#l2h-225"/>
+<entry name="complex literal" url="ref/numbers.html#l2h-20"/>
+<entry name="complex object" url="ref/types.html#l2h-78"/>
+<entry name="compound, statement" url="ref/compound.html#l2h-402"/>
+<entry name="comprehensions, list" url="ref/lists.html#l2h-271"/>
+<entry name="constant" url="ref/literals.html#l2h-13"/>
+<entry name="constructor, class" url="ref/customization.html#l2h-145"/>
+<entry name="container" url="ref/objects.html#l2h-29"/>
+<entry name="continue statement" url="ref/continue.html#l2h-380"/>
+<entry name="conversion, arithmetic" url="ref/conversions.html#l2h-260"/>
+<entry name="conversion, string" url="ref/customization.html#l2h-149"/>
+<entry name="copy() (mapping object method)" url="ref/sequence-types.html#l2h-166"/>
+<entry name="count() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="dangling, else" url="ref/compound.html#l2h-406"/>
+<entry name="data" url="ref/objects.html#l2h-24"/>
+<entry name="type" url="ref/types.html#l2h-68"/>
+<entry name="type, immutable" url="ref/atom-literals.html#l2h-267"/>
+<entry name="datum" url="ref/dict.html#l2h-275"/>
+<entry name="dbm (standard module)" url="ref/types.html#l2h-98"/>
+<entry name="debugging, assertions" url="ref/assert.html#l2h-339"/>
+<entry name="decimal literal" url="ref/numbers.html#l2h-20"/>
+<entry name="DEDENT token" url="ref/indentation.html#l2h-10"/>
+<entry name="default, parameter value" url="ref/function.html#l2h-430"/>
+<entry name="definition, class" url="ref/return.html#l2h-370"/>
+<entry name="definition, function" url="ref/return.html#l2h-370"/>
+<entry name="del statement" url="ref/types.html#l2h-92"/>
+<entry name="delete" url="ref/types.html#l2h-92"/>
+<entry name="deletion, attribute" url="ref/del.html#l2h-360"/>
+<entry name="deletion, target" url="ref/del.html#l2h-358"/>
+<entry name="deletion, target list" url="ref/del.html#l2h-358"/>
+<entry name="delimiters" url="ref/delimiters.html#l2h-22"/>
+<entry name="destructor" url="ref/customization.html#l2h-146"/>
+<entry name="dictionary, display" url="ref/dict.html#l2h-274"/>
+<entry name="dictionary object" url="ref/types.html#l2h-96"/>
+<entry name="display, dictionary" url="ref/dict.html#l2h-274"/>
+<entry name="display, list" url="ref/lists.html#l2h-271"/>
+<entry name="display, tuple" url="ref/parenthesized.html#l2h-270"/>
+<entry name="division" url="ref/binary.html#l2h-309"/>
+<entry name="divmod() (built-in function)" url="ref/numeric-types.html#l2h-218"/>
+<entry name="documentation string" url="ref/types.html#l2h-125"/>
+<entry name="EBCDIC" url="ref/types.html#l2h-86"/>
+<entry name="elif, keyword" url="ref/if.html#l2h-408"/>
+<entry name="Ellipsis" url="ref/types.html#l2h-71"/>
+<entry name="Ellipsis object" url="ref/types.html#l2h-71"/>
+<entry name="else, dangling" url="ref/compound.html#l2h-406"/>
+<entry name="else, keyword" url="ref/break.html#l2h-377"/>
+<entry name="empty, list" url="ref/lists.html#l2h-273"/>
+<entry name="empty, tuple" url="ref/types.html#l2h-91"/>
+<entry name="error handling" url="ref/exceptions.html#l2h-255"/>
+<entry name="errors" url="ref/exceptions.html#l2h-255"/>
+<entry name="escape sequence" url="ref/strings.html#l2h-17"/>
+<entry name="eval() (built-in function)" url="ref/global.html#l2h-397"/>
+<entry name="exc_info (in module sys)" url="ref/types.html#l2h-63"/>
+<entry name="exc_traceback (in module sys)" url="ref/types.html#l2h-63"/>
+<entry name="exc_type (in module sys)" url="ref/try.html#l2h-419"/>
+<entry name="exc_value (in module sys)" url="ref/try.html#l2h-419"/>
+<entry name="except, keyword" url="ref/try.html#l2h-421"/>
+<entry name="exception" url="ref/exceptions.html#l2h-250"/>
+<entry name="AssertionError" url="ref/assert.html#l2h-341"/>
+<entry name="AttributeError" url="ref/attribute-references.html#l2h-283"/>
+<entry name="handler" url="ref/types.html#l2h-127"/>
+<entry name="ImportError" url="ref/import.html#l2h-387"/>
+<entry name="NameError" url="ref/atom-identifiers.html#l2h-264"/>
+<entry name="exception (continued), raising" url="ref/raise.html#l2h-373"/>
+<entry name="exception (continued), RuntimeError" url="ref/print.html#l2h-367"/>
+<entry name="exception (continued), SyntaxError" url="ref/import.html#l2h-387"/>
+<entry name="exception (continued), TypeError" url="ref/unary.html#l2h-306"/>
+<entry name="exception (continued), ValueError" url="ref/shifting.html#l2h-314"/>
+<entry name="exception (continued), ZeroDivisionError" url="ref/binary.html#l2h-309"/>
+<entry name="exception handler" url="ref/exceptions.html#l2h-255"/>
+<entry name="exclusive, or" url="ref/bitwise.html#l2h-317"/>
+<entry name="exec statement" url="ref/execframes.html#l2h-249"/>
+<entry name="execfile() (built-in function)" url="ref/global.html#l2h-397"/>
+<entry name="execution, frame" url="ref/execframes.html#l2h-237"/>
+<entry name="execution, restricted" url="ref/execframes.html#l2h-248"/>
+<entry name="execution, stack" url="ref/types.html#l2h-127"/>
+<entry name="execution model" url="ref/execmodel.html#l2h-231"/>
+<entry name="expression" url="ref/expressions.html#l2h-257"/>
+<entry name="lambda" url="ref/lambda.html#l2h-328"/>
+<entry name="list" url="ref/exprlists.html#l2h-329"/>
+<entry name="statement" url="ref/exprstmts.html#l2h-334"/>
+<entry name="extended, slicing" url="ref/slicings.html#l2h-292"/>
+<entry name="extended print statement" url="ref/print.html#l2h-368"/>
+<entry name="extension, filename" url="ref/import.html#l2h-386"/>
+<entry name="extension, module" url="ref/types.html#l2h-68"/>
+<entry name="extension, f_back (frame attribute)" url="ref/types.html#l2h-59"/>
+<entry name="extension, f_builtins (frame attribute)" url="ref/types.html#l2h-59"/>
+<entry name="extension, f_code (frame attribute)" url="ref/types.html#l2h-59"/>
+<entry name="extension, f_exc_traceback (frame attribute)" url="ref/types.html#l2h-61"/>
+<entry name="extension, f_exc_type (frame attribute)" url="ref/types.html#l2h-61"/>
+<entry name="extension, f_exc_value (frame attribute)" url="ref/types.html#l2h-61"/>
+<entry name="extension, f_globals (frame attribute)" url="ref/types.html#l2h-59"/>
+<entry name="extension, f_lasti (frame attribute)" url="ref/types.html#l2h-59"/>
+<entry name="extension, f_lineno (frame attribute)" url="ref/types.html#l2h-59"/>
+<entry name="extension, f_locals (frame attribute)" url="ref/types.html#l2h-59"/>
+<entry name="extension, f_restricted (frame attribute)" url="ref/types.html#l2h-59"/>
+<entry name="extension, f_trace (frame attribute)" url="ref/types.html#l2h-61"/>
+<entry name="extension, file object" url="ref/types.html#l2h-117"/>
+<entry name="filename, extension" url="ref/import.html#l2h-386"/>
+<entry name="finally, keyword" url="ref/return.html#l2h-371"/>
+<entry name="float() (built-in function)" url="ref/numeric-types.html#l2h-228"/>
+<entry name="floating point, number" url="ref/types.html#l2h-77"/>
+<entry name="floating point literal" url="ref/numbers.html#l2h-20"/>
+<entry name="floating point object" url="ref/types.html#l2h-77"/>
+<entry name="for statement" url="ref/break.html#l2h-376"/>
+<entry name="form, lambda" url="ref/lambda.html#l2h-328"/>
+<entry name="frame, execution" url="ref/execframes.html#l2h-237"/>
+<entry name="frame object" url="ref/types.html#l2h-126"/>
+<entry name="from, keyword" url="ref/import.html#l2h-385"/>
+<entry name="from statement" url="ref/execframes.html#l2h-249"/>
+<entry name="func_code (function attribute)" url="ref/types.html#l2h-35"/>
+<entry name="func_defaults (function attribute)" url="ref/types.html#l2h-35"/>
+<entry name="func_doc (function attribute)" url="ref/types.html#l2h-35"/>
+<entry name="func_globals (function attribute)" url="ref/types.html#l2h-35"/>
+<entry name="function, anonmymous" url="ref/lambda.html#l2h-328"/>
+<entry name="function, argument" url="ref/types.html#l2h-102"/>
+<entry name="function, call" url="ref/types.html#l2h-102"/>
+<entry name="function, call, user-defined" url="ref/calls.html#l2h-297"/>
+<entry name="function, definition" url="ref/return.html#l2h-370"/>
+<entry name="function, name" url="ref/function.html#l2h-429"/>
+<entry name="function, user-defined" url="ref/types.html#l2h-103"/>
+<entry name="function object" url="ref/types.html#l2h-103"/>
+<entry name="garbage collection" url="ref/objects.html#l2h-28"/>
+<entry name="gdbm (standard module)" url="ref/types.html#l2h-99"/>
+<entry name="generic, special attribute" url="ref/types.html#l2h-69"/>
+<entry name="get() (mapping object method)" url="ref/sequence-types.html#l2h-166"/>
+<entry name="global, name" url="ref/atom-identifiers.html#l2h-263"/>
+<entry name="global, name binding" url="ref/global.html#l2h-396"/>
+<entry name="global (continued), namespace" url="ref/types.html#l2h-104"/>
+<entry name="global statement" url="ref/execframes.html#l2h-246"/>
+<entry name="globals() (built-in function)" url="ref/exec.html#l2h-400"/>
+<entry name="grammar" url="ref/notation.html#l2h-1"/>
+<entry name="grouping" url="ref/indentation.html#l2h-9"/>
+<entry name="handle an exception" url="ref/exceptions.html#l2h-254"/>
+<entry name="handler, exception" url="ref/types.html#l2h-127"/>
+<entry name="has_key() (mapping object method)" url="ref/sequence-types.html#l2h-166"/>
+<entry name="hash() (built-in function)" url="ref/customization.html#l2h-155"/>
+<entry name="hash character" url="ref/comments.html#l2h-6"/>
+<entry name="hex() (built-in function)" url="ref/numeric-types.html#l2h-230"/>
+<entry name="hexadecimal literal" url="ref/numbers.html#l2h-20"/>
+<entry name="hierarchical, module names" url="ref/import.html#l2h-391"/>
+<entry name="hierarchy, type" url="ref/types.html#l2h-68"/>
+<entry name="hierarchy, id() (built-in function)" url="ref/objects.html#l2h-25"/>
+<entry name="hierarchy, identifier" url="ref/identifiers.html#l2h-11"/>
+<entry name="identity, test" url="ref/comparisons.html#l2h-323"/>
+<entry name="identity of an object" url="ref/objects.html#l2h-27"/>
+<entry name="if statement" url="ref/if.html#l2h-407"/>
+<entry name="im_class (method attribute)" url="ref/types.html#l2h-39"/>
+<entry name="im_func (method attribute)" url="ref/types.html#l2h-37"/>
+<entry name="im_self (method attribute)" url="ref/types.html#l2h-37"/>
+<entry name="imaginary literal" url="ref/numbers.html#l2h-20"/>
+<entry name="immutable, data type" url="ref/atom-literals.html#l2h-267"/>
+<entry name="immutable, object" url="ref/atom-literals.html#l2h-267"/>
+<entry name="immutable object" url="ref/objects.html#l2h-27"/>
+<entry name="immutable sequence object" url="ref/types.html#l2h-82"/>
+<entry name="import statement" url="ref/types.html#l2h-109"/>
+<entry name="ImportError exception" url="ref/import.html#l2h-387"/>
+<entry name="importing, module" url="ref/import.html#l2h-385"/>
+<entry name="in, keyword" url="ref/for.html#l2h-414"/>
+<entry name="in operator" url="ref/comparisons.html#l2h-322"/>
+<entry name="inclusive, or" url="ref/bitwise.html#l2h-318"/>
+<entry name="INDENT token" url="ref/indentation.html#l2h-10"/>
+<entry name="indentation" url="ref/indentation.html#l2h-9"/>
+<entry name="index() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="index operation" url="ref/types.html#l2h-80"/>
+<entry name="inheritance" url="ref/class.html#l2h-434"/>
+<entry name="initialization, module" url="ref/import.html#l2h-387"/>
+<entry name="input" url="ref/expression-input.html#l2h-440"/>
+<entry name="raw" url="ref/expression-input.html#l2h-445"/>
+<entry name="input() (built-in function)" url="ref/expression-input.html#l2h-444"/>
+<entry name="insert() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="instance, call" url="ref/callable-types.html#l2h-164"/>
+<entry name="instance, class" url="ref/types.html#l2h-114"/>
+<entry name="instance object" url="ref/types.html#l2h-108"/>
+<entry name="int() (built-in function)" url="ref/numeric-types.html#l2h-226"/>
+<entry name="integer" url="ref/types.html#l2h-90"/>
+<entry name="representation" url="ref/types.html#l2h-76"/>
+<entry name="integer literal" url="ref/numbers.html#l2h-20"/>
+<entry name="integer object" url="ref/types.html#l2h-73"/>
+<entry name="interactive mode" url="ref/programs.html#l2h-438"/>
+<entry name="internal type" url="ref/types.html#l2h-123"/>
+<entry name="interpreter" url="ref/top-level.html#l2h-435"/>
+<entry name="inversion" url="ref/unary.html#l2h-305"/>
+<entry name="invocation" url="ref/types.html#l2h-102"/>
+<entry name="is not operator" url="ref/comparisons.html#l2h-323"/>
+<entry name="is operator" url="ref/comparisons.html#l2h-323"/>
+<entry name="item, sequence" url="ref/subscriptions.html#l2h-286"/>
+<entry name="item, string" url="ref/subscriptions.html#l2h-287"/>
+<entry name="item selection" url="ref/types.html#l2h-80"/>
+<entry name="items() (mapping object method)" url="ref/sequence-types.html#l2h-166"/>
+<entry name="key" url="ref/dict.html#l2h-275"/>
+<entry name="key/datum pair" url="ref/dict.html#l2h-275"/>
+<entry name="keys() (mapping object method)" url="ref/sequence-types.html#l2h-166"/>
+<entry name="keyword" url="ref/keywords.html#l2h-12"/>
+<entry name="elif" url="ref/if.html#l2h-408"/>
+<entry name="keyword (continued), else" url="ref/break.html#l2h-377"/>
+<entry name="keyword (continued), except" url="ref/try.html#l2h-421"/>
+<entry name="keyword (continued), finally" url="ref/return.html#l2h-371"/>
+<entry name="keyword (continued), from" url="ref/import.html#l2h-385"/>
+<entry name="keyword (continued), in" url="ref/for.html#l2h-414"/>
+<entry name="lambda, expression" url="ref/lambda.html#l2h-328"/>
+<entry name="lambda, form" url="ref/lambda.html#l2h-328"/>
+<entry name="language, C" url="ref/types.html#l2h-68"/>
+<entry name="language, Pascal" url="ref/for.html#l2h-416"/>
+<entry name="last_traceback (in module sys)" url="ref/types.html#l2h-63"/>
+<entry name="leading whitespace" url="ref/indentation.html#l2h-9"/>
+<entry name="len() (built-in function)" url="ref/types.html#l2h-79"/>
+<entry name="lexical analysis" url="ref/lexical.html#l2h-3"/>
+<entry name="lexical definitions" url="ref/notation.html#l2h-2"/>
+<entry name="line continuation" url="ref/explicit-joining.html#l2h-7"/>
+<entry name="line joining" url="ref/logical.html#l2h-5"/>
+<entry name="line structure" url="ref/line-structure.html#l2h-4"/>
+<entry name="list, assignment, target" url="ref/assignment.html#l2h-346"/>
+<entry name="list, comprehensions" url="ref/lists.html#l2h-271"/>
+<entry name="list, deletion target" url="ref/del.html#l2h-358"/>
+<entry name="list (continued), display" url="ref/lists.html#l2h-271"/>
+<entry name="list (continued), empty" url="ref/lists.html#l2h-273"/>
+<entry name="list (continued), expression" url="ref/exprlists.html#l2h-329"/>
+<entry name="list (continued), target" url="ref/assignment.html#l2h-345"/>
+<entry name="list object" url="ref/types.html#l2h-93"/>
+<entry name="literal" url="ref/literals.html#l2h-13"/>
+<entry name="local, namespace" url="ref/execframes.html#l2h-244"/>
+<entry name="locals() (built-in function)" url="ref/exec.html#l2h-400"/>
+<entry name="logical line" url="ref/logical.html#l2h-5"/>
+<entry name="long() (built-in function)" url="ref/numeric-types.html#l2h-227"/>
+<entry name="long integer literal" url="ref/numbers.html#l2h-20"/>
+<entry name="long integer object" url="ref/types.html#l2h-75"/>
+<entry name="loop, over mutable sequence" url="ref/for.html#l2h-417"/>
+<entry name="loop, statement" url="ref/break.html#l2h-376"/>
+<entry name="loop control, target" url="ref/break.html#l2h-378"/>
+<entry name="loop control, makefile() (socket method)" url="ref/types.html#l2h-53"/>
+<entry name="mangling, name" url="ref/atom-identifiers.html#l2h-265"/>
+<entry name="mapping object" url="ref/types.html#l2h-95"/>
+<entry name="membership, test" url="ref/comparisons.html#l2h-322"/>
+<entry name="method, built-in" url="ref/types.html#l2h-107"/>
+<entry name="method, call" url="ref/calls.html#l2h-298"/>
+<entry name="method, user-defined" url="ref/types.html#l2h-105"/>
+<entry name="method object" url="ref/types.html#l2h-105"/>
+<entry name="minus" url="ref/unary.html#l2h-303"/>
+<entry name="module, built-in" url="ref/import.html#l2h-386"/>
+<entry name="module, extension" url="ref/types.html#l2h-68"/>
+<entry name="module, importing" url="ref/import.html#l2h-385"/>
+<entry name="module, initialization" url="ref/import.html#l2h-387"/>
+<entry name="module (continued), name" url="ref/import.html#l2h-386"/>
+<entry name="module (continued), names, hierarchical" url="ref/import.html#l2h-391"/>
+<entry name="module (continued), namespace" url="ref/types.html#l2h-110"/>
+<entry name="module (continued), search path" url="ref/import.html#l2h-386"/>
+<entry name="module (continued), user-defined" url="ref/import.html#l2h-386"/>
+<entry name="module object" url="ref/types.html#l2h-109"/>
+<entry name="modules (in module sys)" url="ref/import.html#l2h-383"/>
+<entry name="modulo" url="ref/binary.html#l2h-310"/>
+<entry name="multiplication" url="ref/binary.html#l2h-308"/>
+<entry name="mutable object" url="ref/objects.html#l2h-27"/>
+<entry name="mutable sequence, loop over" url="ref/for.html#l2h-417"/>
+<entry name="mutable sequence object" url="ref/types.html#l2h-92"/>
+<entry name="name" url="ref/identifiers.html#l2h-11"/>
+<entry name="binding" url="ref/execframes.html#l2h-241"/>
+<entry name="binding, global" url="ref/global.html#l2h-396"/>
+<entry name="built-in" url="ref/atom-identifiers.html#l2h-263"/>
+<entry name="class" url="ref/class.html#l2h-434"/>
+<entry name="function" url="ref/function.html#l2h-429"/>
+<entry name="global" url="ref/atom-identifiers.html#l2h-263"/>
+<entry name="mangling" url="ref/atom-identifiers.html#l2h-265"/>
+<entry name="module" url="ref/import.html#l2h-386"/>
+<entry name="rebinding" url="ref/execframes.html#l2h-242"/>
+<entry name="unbinding" url="ref/execframes.html#l2h-243"/>
+<entry name="NameError exception" url="ref/atom-identifiers.html#l2h-264"/>
+<entry name="names, hierarchical module" url="ref/import.html#l2h-391"/>
+<entry name="names, private" url="ref/atom-identifiers.html#l2h-265"/>
+<entry name="namespace" url="ref/execframes.html#l2h-232"/>
+<entry name="global" url="ref/types.html#l2h-104"/>
+<entry name="namespace (continued), local" url="ref/execframes.html#l2h-244"/>
+<entry name="namespace (continued), module" url="ref/types.html#l2h-110"/>
+<entry name="negation" url="ref/unary.html#l2h-303"/>
+<entry name="newline, suppression" url="ref/print.html#l2h-365"/>
+<entry name="NEWLINE token" url="ref/logical.html#l2h-5"/>
+<entry name="None" url="ref/types.html#l2h-70"/>
+<entry name="None object" url="ref/types.html#l2h-70"/>
+<entry name="not in operator" url="ref/comparisons.html#l2h-322"/>
+<entry name="not operator" url="ref/lambda.html#l2h-325"/>
+<entry name="notation" url="ref/notation.html#l2h-1"/>
+<entry name="null, operation" url="ref/pass.html#l2h-356"/>
+<entry name="number" url="ref/numbers.html#l2h-20"/>
+<entry name="complex" url="ref/types.html#l2h-78"/>
+<entry name="floating point" url="ref/types.html#l2h-77"/>
+<entry name="numeric literal" url="ref/numbers.html#l2h-20"/>
+<entry name="numeric object" url="ref/types.html#l2h-72"/>
+<entry name="object" url="ref/objects.html#l2h-24"/>
+<entry name="built-in function" url="ref/types.html#l2h-106"/>
+<entry name="built-in method" url="ref/types.html#l2h-107"/>
+<entry name="callable" url="ref/types.html#l2h-101"/>
+<entry name="class" url="ref/types.html#l2h-108"/>
+<entry name="class instance" url="ref/types.html#l2h-108"/>
+<entry name="code" url="ref/types.html#l2h-124"/>
+<entry name="complex" url="ref/types.html#l2h-78"/>
+<entry name="dictionary" url="ref/types.html#l2h-96"/>
+<entry name="Ellipsis" url="ref/types.html#l2h-71"/>
+<entry name="file" url="ref/types.html#l2h-117"/>
+<entry name="floating point" url="ref/types.html#l2h-77"/>
+<entry name="frame" url="ref/types.html#l2h-126"/>
+<entry name="function" url="ref/types.html#l2h-103"/>
+<entry name="immutable" url="ref/types.html#l2h-82"/>
+<entry name="immutable sequence" url="ref/types.html#l2h-82"/>
+<entry name="instance" url="ref/types.html#l2h-108"/>
+<entry name="integer" url="ref/types.html#l2h-73"/>
+<entry name="list" url="ref/types.html#l2h-93"/>
+<entry name="long integer" url="ref/types.html#l2h-75"/>
+<entry name="mapping" url="ref/types.html#l2h-95"/>
+<entry name="method" url="ref/types.html#l2h-105"/>
+<entry name="module" url="ref/types.html#l2h-109"/>
+<entry name="mutable" url="ref/types.html#l2h-92"/>
+<entry name="mutable sequence" url="ref/types.html#l2h-92"/>
+<entry name="None" url="ref/types.html#l2h-70"/>
+<entry name="numeric" url="ref/types.html#l2h-72"/>
+<entry name="plain integer" url="ref/types.html#l2h-74"/>
+<entry name="recursive" url="ref/string-conversions.html#l2h-279"/>
+<entry name="sequence" url="ref/types.html#l2h-80"/>
+<entry name="slice" url="ref/sequence-types.html#l2h-178"/>
+<entry name="string" url="ref/types.html#l2h-85"/>
+<entry name="object (continued), traceback" url="ref/types.html#l2h-127"/>
+<entry name="object (continued), tuple" url="ref/types.html#l2h-91"/>
+<entry name="object (continued), unicode" url="ref/types.html#l2h-90"/>
+<entry name="object (continued), user-defined function" url="ref/types.html#l2h-103"/>
+<entry name="object (continued), user-defined method" url="ref/types.html#l2h-105"/>
+<entry name="oct() (built-in function)" url="ref/numeric-types.html#l2h-229"/>
+<entry name="octal literal" url="ref/numbers.html#l2h-20"/>
+<entry name="open() (built-in function)" url="ref/types.html#l2h-118"/>
+<entry name="operation, binary arithmetic" url="ref/binary.html#l2h-307"/>
+<entry name="operation, binary bit-wise" url="ref/bitwise.html#l2h-315"/>
+<entry name="operation, Boolean" url="ref/lambda.html#l2h-324"/>
+<entry name="operation, null" url="ref/pass.html#l2h-356"/>
+<entry name="operation, shifting" url="ref/shifting.html#l2h-313"/>
+<entry name="operation, unary arithmetic" url="ref/unary.html#l2h-302"/>
+<entry name="operation, unary bit-wise" url="ref/unary.html#l2h-302"/>
+<entry name="operator, and" url="ref/lambda.html#l2h-326"/>
+<entry name="operator, in" url="ref/comparisons.html#l2h-322"/>
+<entry name="operator, is" url="ref/comparisons.html#l2h-323"/>
+<entry name="operator, is not" url="ref/comparisons.html#l2h-323"/>
+<entry name="operator, not" url="ref/lambda.html#l2h-325"/>
+<entry name="operator, not in" url="ref/comparisons.html#l2h-322"/>
+<entry name="operator, or" url="ref/lambda.html#l2h-327"/>
+<entry name="operator, precedence" url="ref/summary.html#l2h-332"/>
+<entry name="operators" url="ref/operators.html#l2h-21"/>
+<entry name="or, bit-wise" url="ref/bitwise.html#l2h-318"/>
+<entry name="or, exclusive" url="ref/bitwise.html#l2h-317"/>
+<entry name="or, inclusive" url="ref/bitwise.html#l2h-318"/>
+<entry name="or operator" url="ref/lambda.html#l2h-327"/>
+<entry name="ord() (built-in function)" url="ref/types.html#l2h-84"/>
+<entry name="output" url="ref/exprstmts.html#l2h-337"/>
+<entry name="standard" url="ref/exprstmts.html#l2h-337"/>
+<entry name="OverflowError (built-in exception)" url="ref/types.html#l2h-33"/>
+<entry name="packages" url="ref/import.html#l2h-392"/>
+<entry name="parameter, value, default" url="ref/function.html#l2h-430"/>
+<entry name="parenthesized form" url="ref/parenthesized.html#l2h-268"/>
+<entry name="parser" url="ref/lexical.html#l2h-3"/>
+<entry name="Pascal, language" url="ref/for.html#l2h-416"/>
+<entry name="pass statement" url="ref/pass.html#l2h-355"/>
+<entry name="path, module search" url="ref/import.html#l2h-386"/>
+<entry name="physical line" url="ref/logical.html#l2h-5"/>
+<entry name="plain integer literal" url="ref/numbers.html#l2h-20"/>
+<entry name="plain integer object" url="ref/types.html#l2h-74"/>
+<entry name="plus" url="ref/unary.html#l2h-304"/>
+<entry name="pop() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="popen() (in module os)" url="ref/types.html#l2h-51"/>
+<entry name="pow() (built-in function)" url="ref/numeric-types.html#l2h-219"/>
+<entry name="precedence, operator" url="ref/summary.html#l2h-332"/>
+<entry name="primary" url="ref/primaries.html#l2h-281"/>
+<entry name="print statement" url="ref/customization.html#l2h-151"/>
+<entry name="private, names" url="ref/atom-identifiers.html#l2h-265"/>
+<entry name="procedure, call" url="ref/exprstmts.html#l2h-337"/>
+<entry name="program" url="ref/programs.html#l2h-436"/>
+<entry name="quotes, backward" url="ref/customization.html#l2h-149"/>
+<entry name="quotes (continued), reverse" url="ref/customization.html#l2h-149"/>
+<entry name="quotes (continued), raise an exception" url="ref/exceptions.html#l2h-253"/>
+<entry name="quotes (continued), raise statement" url="ref/raise.html#l2h-372"/>
+<entry name="raising, exception" url="ref/raise.html#l2h-373"/>
+<entry name="range() (built-in function)" url="ref/for.html#l2h-416"/>
+<entry name="raw input" url="ref/expression-input.html#l2h-445"/>
+<entry name="raw string" url="ref/strings.html#l2h-16"/>
+<entry name="raw_input() (built-in function)" url="ref/expression-input.html#l2h-445"/>
+<entry name="readline() (file method)" url="ref/expression-input.html#l2h-442"/>
+<entry name="rebinding, name" url="ref/execframes.html#l2h-242"/>
+<entry name="recursive object" url="ref/string-conversions.html#l2h-279"/>
+<entry name="reference, attribute" url="ref/attribute-references.html#l2h-282"/>
+<entry name="reference, reference counting" url="ref/objects.html#l2h-28"/>
+<entry name="reference, remove() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="reference, repr() (built-in function)" url="ref/customization.html#l2h-148"/>
+<entry name="representation, integer" url="ref/types.html#l2h-76"/>
+<entry name="reserved word" url="ref/keywords.html#l2h-12"/>
+<entry name="restricted, execution" url="ref/execframes.html#l2h-248"/>
+<entry name="return statement" url="ref/return.html#l2h-369"/>
+<entry name="reverse, quotes" url="ref/customization.html#l2h-149"/>
+<entry name="reverse() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="RuntimeError exception" url="ref/print.html#l2h-367"/>
+<entry name="search, path, module" url="ref/import.html#l2h-386"/>
+<entry name="sequence, item" url="ref/subscriptions.html#l2h-286"/>
+<entry name="sequence object" url="ref/types.html#l2h-80"/>
+<entry name="shifting, operation" url="ref/shifting.html#l2h-313"/>
+<entry name="simple, statement" url="ref/simple.html#l2h-333"/>
+<entry name="singleton, tuple" url="ref/types.html#l2h-91"/>
+<entry name="slice" url="ref/slicings.html#l2h-288"/>
+<entry name="slice() (built-in function)" url="ref/types.html#l2h-130"/>
+<entry name="slice object" url="ref/sequence-types.html#l2h-178"/>
+<entry name="slicing" url="ref/types.html#l2h-81"/>
+<entry name="assignment" url="ref/assignment.html#l2h-353"/>
+<entry name="extended" url="ref/slicings.html#l2h-292"/>
+<entry name="sort() (sequence object method)" url="ref/sequence-types.html#l2h-168"/>
+<entry name="space" url="ref/indentation.html#l2h-9"/>
+<entry name="special, attribute" url="ref/types.html#l2h-69"/>
+<entry name="special, attribute, generic" url="ref/types.html#l2h-69"/>
+<entry name="stack, execution" url="ref/types.html#l2h-127"/>
+<entry name="stack, trace" url="ref/types.html#l2h-127"/>
+<entry name="standard, output" url="ref/exprstmts.html#l2h-337"/>
+<entry name="Standard C" url="ref/strings.html#l2h-17"/>
+<entry name="standard input" url="ref/programs.html#l2h-439"/>
+<entry name="start (slice object attribute)" url="ref/types.html#l2h-67"/>
+<entry name="statement, assert" url="ref/assert.html#l2h-338"/>
+<entry name="statement, assignment" url="ref/types.html#l2h-92"/>
+<entry name="statement, assignment, augmented" url="ref/augassign.html#l2h-354"/>
+<entry name="statement, break" url="ref/break.html#l2h-375"/>
+<entry name="statement, compound" url="ref/compound.html#l2h-402"/>
+<entry name="statement, continue" url="ref/continue.html#l2h-380"/>
+<entry name="statement, del" url="ref/types.html#l2h-92"/>
+<entry name="statement, exec" url="ref/execframes.html#l2h-249"/>
+<entry name="statement, expression" url="ref/exprstmts.html#l2h-334"/>
+<entry name="statement, for" url="ref/break.html#l2h-376"/>
+<entry name="statement, from" url="ref/execframes.html#l2h-249"/>
+<entry name="statement, global" url="ref/execframes.html#l2h-246"/>
+<entry name="statement, if" url="ref/if.html#l2h-407"/>
+<entry name="statement, import" url="ref/types.html#l2h-109"/>
+<entry name="statement (continued), loop" url="ref/break.html#l2h-376"/>
+<entry name="statement (continued), pass" url="ref/pass.html#l2h-355"/>
+<entry name="statement (continued), print" url="ref/customization.html#l2h-151"/>
+<entry name="statement (continued), raise" url="ref/raise.html#l2h-372"/>
+<entry name="statement (continued), return" url="ref/return.html#l2h-369"/>
+<entry name="statement (continued), simple" url="ref/simple.html#l2h-333"/>
+<entry name="statement (continued), try" url="ref/types.html#l2h-129"/>
+<entry name="statement (continued), while" url="ref/break.html#l2h-376"/>
+<entry name="statement grouping" url="ref/indentation.html#l2h-9"/>
+<entry name="stderr (in module sys)" url="ref/types.html#l2h-55"/>
+<entry name="stdin (in module sys)" url="ref/types.html#l2h-55"/>
+<entry name="stdio" url="ref/types.html#l2h-122"/>
+<entry name="stdout (in module sys)" url="ref/types.html#l2h-55"/>
+<entry name="step (slice object attribute)" url="ref/types.html#l2h-67"/>
+<entry name="stop (slice object attribute)" url="ref/types.html#l2h-67"/>
+<entry name="str() (built-in function)" url="ref/customization.html#l2h-150"/>
+<entry name="string, comparison" url="ref/types.html#l2h-86"/>
+<entry name="string, conversion" url="ref/customization.html#l2h-149"/>
+<entry name="string, item" url="ref/subscriptions.html#l2h-287"/>
+<entry name="string literal" url="ref/strings.html#l2h-14"/>
+<entry name="string object" url="ref/types.html#l2h-85"/>
+<entry name="subscription" url="ref/types.html#l2h-80"/>
+<entry name="assignment" url="ref/assignment.html#l2h-350"/>
+<entry name="subtraction" url="ref/binary.html#l2h-312"/>
+<entry name="suite" url="ref/compound.html#l2h-403"/>
+<entry name="suppression, newline" url="ref/print.html#l2h-365"/>
+<entry name="syntax" url="ref/notation.html#l2h-1"/>
+<entry name="SyntaxError exception" url="ref/import.html#l2h-387"/>
+<entry name="sys (built-in module)" url="ref/print.html#l2h-366"/>
+<entry name="sys.exc_info" url="ref/types.html#l2h-128"/>
+<entry name="sys.exc_traceback" url="ref/types.html#l2h-128"/>
+<entry name="sys.last_traceback" url="ref/types.html#l2h-128"/>
+<entry name="sys.modules" url="ref/import.html#l2h-386"/>
+<entry name="sys.stderr" url="ref/types.html#l2h-121"/>
+<entry name="sys.stdin" url="ref/types.html#l2h-119"/>
+<entry name="sys.stdout" url="ref/types.html#l2h-120"/>
+<entry name="tab" url="ref/indentation.html#l2h-9"/>
+<entry name="target" url="ref/assignment.html#l2h-345"/>
+<entry name="deletion" url="ref/del.html#l2h-358"/>
+<entry name="list" url="ref/assignment.html#l2h-345"/>
+<entry name="list assignment" url="ref/assignment.html#l2h-346"/>
+<entry name="list, deletion" url="ref/del.html#l2h-358"/>
+<entry name="loop control" url="ref/break.html#l2h-378"/>
+<entry name="tb_frame (traceback attribute)" url="ref/types.html#l2h-65"/>
+<entry name="tb_lasti (traceback attribute)" url="ref/types.html#l2h-65"/>
+<entry name="tb_lineno (traceback attribute)" url="ref/types.html#l2h-65"/>
+<entry name="tb_next (traceback attribute)" url="ref/types.html#l2h-65"/>
+<entry name="termination model" url="ref/exceptions.html#l2h-256"/>
+<entry name="test, identity" url="ref/comparisons.html#l2h-323"/>
+<entry name="test, membership" url="ref/comparisons.html#l2h-322"/>
+<entry name="token" url="ref/lexical.html#l2h-3"/>
+<entry name="trace, stack" url="ref/types.html#l2h-127"/>
+<entry name="trace, traceback object" url="ref/types.html#l2h-127"/>
+<entry name="trailing, comma" url="ref/exprlists.html#l2h-331"/>
+<entry name="triple-quoted string" url="ref/strings.html#l2h-16"/>
+<entry name="try statement" url="ref/types.html#l2h-129"/>
+<entry name="tuple, display" url="ref/parenthesized.html#l2h-270"/>
+<entry name="tuple, empty" url="ref/types.html#l2h-91"/>
+<entry name="tuple, singleton" url="ref/types.html#l2h-91"/>
+<entry name="tuple object" url="ref/types.html#l2h-91"/>
+<entry name="type" url="ref/types.html#l2h-68"/>
+<entry name="data" url="ref/types.html#l2h-68"/>
+<entry name="hierarchy" url="ref/types.html#l2h-68"/>
+<entry name="immutable data" url="ref/atom-literals.html#l2h-267"/>
+<entry name="type() (built-in function)" url="ref/objects.html#l2h-26"/>
+<entry name="type of an object" url="ref/objects.html#l2h-27"/>
+<entry name="TypeError exception" url="ref/unary.html#l2h-306"/>
+<entry name="types, internal" url="ref/types.html#l2h-123"/>
+<entry name="unary, arithmetic operation" url="ref/unary.html#l2h-302"/>
+<entry name="unary, bit-wise operation" url="ref/unary.html#l2h-302"/>
+<entry name="unbinding, name" url="ref/execframes.html#l2h-243"/>
+<entry name="unichr() (built-in function)" url="ref/types.html#l2h-87"/>
+<entry name="Unicode" url="ref/types.html#l2h-90"/>
+<entry name="unicode() (built-in function)" url="ref/types.html#l2h-89"/>
+<entry name="unicode object" url="ref/types.html#l2h-90"/>
+<entry name="UNIX" url="ref/programs.html#l2h-439"/>
+<entry name="unreachable object" url="ref/objects.html#l2h-28"/>
+<entry name="unrecognized escape sequence" url="ref/strings.html#l2h-19"/>
+<entry name="update() (mapping object method)" url="ref/sequence-types.html#l2h-166"/>
+<entry name="user-defined, function" url="ref/types.html#l2h-103"/>
+<entry name="user-defined, function call" url="ref/calls.html#l2h-297"/>
+<entry name="user-defined, method" url="ref/types.html#l2h-105"/>
+<entry name="user-defined, module" url="ref/import.html#l2h-386"/>
+<entry name="user-defined function object" url="ref/types.html#l2h-103"/>
+<entry name="user-defined method object" url="ref/types.html#l2h-105"/>
+<entry name="value, default parameter" url="ref/function.html#l2h-430"/>
+<entry name="value of an object" url="ref/objects.html#l2h-27"/>
+<entry name="ValueError exception" url="ref/shifting.html#l2h-314"/>
+<entry name="values, writing" url="ref/exprstmts.html#l2h-337"/>
+<entry name="values() (mapping object method)" url="ref/sequence-types.html#l2h-166"/>
+<entry name="while statement" url="ref/break.html#l2h-376"/>
+<entry name="whitespace" url="ref/indentation.html#l2h-9"/>
+<entry name="writing, values" url="ref/exprstmts.html#l2h-337"/>
+<entry name="xor, bit-wise" url="ref/bitwise.html#l2h-317"/>
+<entry name="xor, ZeroDivisionError exception" url="ref/binary.html#l2h-309"/>
+</index>
+</kdeveloptoc>
+
diff --git a/languages/python/doc/python_bugs.toc b/languages/python/doc/python_bugs.toc
new file mode 100644
index 00000000..0b2a5196
--- /dev/null
+++ b/languages/python/doc/python_bugs.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Python bugs</title>
+<base href="http://sourceforge.net/"/>
+<tocsect1 name="Query" url="tracker/?group_id=5470&amp;atid=105470">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/python/file_templates/Makefile.am b/languages/python/file_templates/Makefile.am
new file mode 100644
index 00000000..0846fdf2
--- /dev/null
+++ b/languages/python/file_templates/Makefile.am
@@ -0,0 +1,4 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = py
+
+
diff --git a/languages/python/file_templates/py b/languages/python/file_templates/py
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/python/file_templates/py
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/python/kde_pydoc.py b/languages/python/kde_pydoc.py
new file mode 100755
index 00000000..0516f172
--- /dev/null
+++ b/languages/python/kde_pydoc.py
@@ -0,0 +1,131 @@
+#!/usr/bin/env python
+"""
+"""
+
+__author__ = "David Nolden<david.kde@art-master.de>, Ka-Ping Yee <ping@lfw.org>"
+__version__ = "6 April 2006"
+
+import sys, imp, os, stat, re, types, cgi
+from repr import Repr
+from string import expandtabs, find, join, lower, split, strip, rstrip
+import pydoc
+
+
+
+
+def cleanlinks(string):
+ """Changes the links to work with the pydoc:-notation"""
+ finalstring = ""
+ string = str(string).replace(".html","")
+ pos = 0
+ mark = "<a href=\""
+ l = len(mark)
+ while(pos != -1):
+ opos = pos
+ pos = string.find(mark, pos)
+ if(pos == -1):
+ finalstring += string[opos:]
+ break
+ finalstring += string[opos:pos+l]
+ pos+=l
+ if(string[pos] == '#' or string.find(":/",pos, pos+10) != -1): #leave local jumps or external references untouched
+ continue
+ finalstring += "pydoc:"
+ if(string[pos] == "." and string[pos+1] == "\""):
+ pos += 1
+ finalstring += "modules"
+
+ return finalstring
+
+
+#This maximum depth was introduced because the program needs a very long time to
+#complete the task in big file-system-trees(like my home), and can be invoked by a simple pydoc:.
+#and cannot be stopped through the browser(just by killing python)
+__maxdepth = 4
+
+def writedocs(path, pkgpath='', depth=0, notprocessed=[]):
+ if(path == "/."):
+ writedoc(path)
+ return
+ depth+=1
+
+ if os.path.isdir(path):
+ if(depth > __maxdepth):
+ notprocessed.append(path)
+ return
+ dir = path
+ for file in os.listdir(dir):
+ path = os.path.join(dir, file)
+ if os.path.isdir(path):
+ writedocs(path, file + '.' + pkgpath, depth)
+ if os.path.isfile(path):
+ writedocs(path, pkgpath, depth)
+ if os.path.isfile(path):
+ modname = pydoc.inspect.getmodulename(path)
+ if modname:
+ writedoc(pkgpath + modname)
+
+ if(depth == 1):
+ if(len(notprocessed) != 0):
+ print "<br> the following paths were not processed because they are deeper than the maximum depth of " + str(__maxdepth) + ":<br>"
+ for x in notprocessed:
+ print cgi.escape(x) + " <br>"
+
+def writedoc(key,top=False):
+ """Write HTML documentation to a file in the current directory."""
+ if(type(key) == str and (key == "modules" or key == "/.")):
+ heading = pydoc.html.heading(
+ '<br><big><big><strong>&nbsp;'
+ 'Python: Index of Modules'
+ '</strong></big></big>',
+ '#ffffff', '#7799ee')
+ builtins = []
+ for name in sys.builtin_module_names:
+ builtins.append('<a href="%s">%s</a>' % (cgi.escape(name,quote=True), cgi.escape(name)))
+ indices = ['<p>Built-in modules: ' + cgi.escape(join(builtins, ', '))]
+ seen = {}
+ for dir in pydoc.pathdirs():
+ indices.append(pydoc.html.index(dir, seen))
+ print cleanlinks(heading + join(indices))
+ return
+
+ if(type(key) != types.ModuleType):
+ object = pydoc.locate(key)
+ if(object == None and top):
+ print "could not locate module/object for key " + \
+ cgi.escape(key) + "<br><a href=\"pydoc:modules\">go to index</a>";
+ else:
+ object = key
+
+ if object:
+ print cleanlinks(pydoc.html.page(pydoc.describe(object), pydoc.html.document(object)))
+
+
+
+if __name__ == '__main__':
+ import getopt
+ class BadUsage: pass
+
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], 'k:p:w')
+
+ print "<html>"
+ print "<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
+ print "</head><body>"
+
+ if args:
+ for arg in args:
+ try:
+ if os.path.isdir(arg): writedocs(arg)
+
+ if os.path.isfile(arg):
+ arg = pydoc.importfile(arg)
+ writedoc(arg, True)
+ except pydoc.ErrorDuringImport, value:
+ print 'problem in %s - %s' % (
+ cgi.escape(value.filename), cgi.escape(value.exc))
+ else:
+ raise BadUsage
+
+ except (getopt.error, BadUsage):
+ print "need parameters\n"
diff --git a/languages/python/kdevpythonsupport.desktop b/languages/python/kdevpythonsupport.desktop
new file mode 100644
index 00000000..9f15e39f
--- /dev/null
+++ b/languages/python/kdevpythonsupport.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Python Support
+Comment[ca]=Suport per a Python
+Comment[da]=Python-understøttelse
+Comment[de]=Unterstützung für Python
+Comment[el]=ΥποστήÏιξη Python
+Comment[es]=Soporte para Python
+Comment[et]=Pythoni toetus
+Comment[eu]=Python euskarria
+Comment[fa]=پشتیبانی پیتون
+Comment[fr]=Prise en charge du langage PYTHON
+Comment[ga]=Tacaíocht Python
+Comment[gl]=Soporte para Python
+Comment[hi]=पायथन समरà¥à¤¥à¤¨
+Comment[hu]=Python-támogatás
+Comment[is]=Python stuðningur
+Comment[it]=Supporto per Python
+Comment[ja]=Python サãƒãƒ¼ãƒˆ
+Comment[nds]=Ünnerstütten för Python
+Comment[ne]=पाइथोन समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor Python
+Comment[pl]=Obsługa Pythona
+Comment[pt]=Suporte a Python
+Comment[pt_BR]=Suporte ao Python
+Comment[ru]=Поддержка Ñзыка Python
+Comment[sk]=Python podpora
+Comment[sl]=Podpora za Python
+Comment[sr]=Подршка за Python
+Comment[sr@Latn]=Podrška za Python
+Comment[sv]=Python-stöd
+Comment[ta]=பைதான௠ஆதரவà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони Python
+Comment[tr]=Python DesteÄŸi
+Comment[zh_CN]=Python 支æŒ
+Comment[zh_TW]=Python 支æ´
+Name=KDevPythonSupport
+Name[da]=KDevelop Python-understøttelse
+Name[de]=Unterstützung für Python (KDevelop)
+Name[hi]=के-डेव-पायथन-समरà¥à¤¥à¤¨
+Name[nds]=Python-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaPythona
+Name[sk]=KDev Python podpora
+Name[sv]=KDevelop Python-stöd
+Name[ta]=கெடெவ௠பைதான௠ஆதரவà¯
+Name[tg]=ÐÑ€Ó£ намудани забони Python
+Name[zh_TW]=KDevelop Python 支æ´
+GenericName=Python Support
+GenericName[ca]=Suport per a Python
+GenericName[da]=Python-understøttelse
+GenericName[de]=Unterstützung für Python
+GenericName[el]=ΥποστήÏιξη Python
+GenericName[es]=Soporte para Python
+GenericName[et]=Pythoni toetus
+GenericName[eu]=Python euskarria
+GenericName[fa]=پشتیبانی پیتون
+GenericName[fr]=Prise en charge du langage PYTHON
+GenericName[ga]=Tacaíocht Python
+GenericName[gl]=Soporte para Python
+GenericName[hi]=पायथन समरà¥à¤¥à¤¨
+GenericName[hu]=Python-támogatás
+GenericName[it]=Supporto per Python
+GenericName[ja]=Python サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för Python
+GenericName[ne]=पाइथोन समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor Python
+GenericName[pl]=Obsługa Pythona
+GenericName[pt]=Suporte a Python
+GenericName[pt_BR]=Suporte ao Python
+GenericName[ru]=Поддержка Ñзыка Python
+GenericName[sk]=Python podpora
+GenericName[sl]=Podpora za Python
+GenericName[sr]=Подршка за Python
+GenericName[sr@Latn]=Podrška za Python
+GenericName[sv]=Python-stöd
+GenericName[ta]=பைதான௠ஆதரவà¯
+GenericName[tg]=ÐÑ€Ó£ намудани забони Python
+GenericName[tr]=Python DesteÄŸi
+GenericName[zh_CN]=Python 支æŒ
+GenericName[zh_TW]=Python 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevpythonsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Python
diff --git a/languages/python/kdevpythonsupport.rc b/languages/python/kdevpythonsupport.rc
new file mode 100644
index 00000000..d19011b8
--- /dev/null
+++ b/languages/python/kdevpythonsupport.rc
@@ -0,0 +1,16 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevPythonSupport" version="3">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_exec" />
+ <Action name="build_runinterpreter" />
+ <Action name="build_execstring" />
+ </Menu>
+ <Menu name="help">
+ <Action name="help_pydoc"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="buildToolBar">
+ <Action name="build_exec" group="build_operations" />
+</ToolBar>
+</kpartgui>
diff --git a/languages/python/pydoc.cpp b/languages/python/pydoc.cpp
new file mode 100644
index 00000000..79f184d7
--- /dev/null
+++ b/languages/python/pydoc.cpp
@@ -0,0 +1,113 @@
+#include "pydoc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <qtextstream.h>
+#include <kstandarddirs.h>
+#include <kinstance.h>
+#include <kprocess.h>
+#include <kdeversion.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+using namespace KIO;
+
+
+PydocProtocol::PydocProtocol(const QCString &pool, const QCString &app)
+ : SlaveBase("pydoc", pool, app), key()
+{
+ python = KGlobal::dirs()->findExe("python");
+ script = locate("data", "kio_pydoc/kde_pydoc.py");
+}
+
+
+PydocProtocol::~PydocProtocol()
+{}
+
+
+void PydocProtocol::get(const KURL& url)
+{
+ mimeType("text/html");
+ key = url.path();
+
+ QString cmd = KProcess::quote(python);
+ cmd += " ";
+ cmd += KProcess::quote(script);
+ cmd += " -w ";
+ cmd += KProcess::quote(key);
+
+ FILE *fd = popen(cmd.local8Bit().data(), "r");
+ char buffer[4096];
+ QByteArray array;
+
+ while (!feof(fd)) {
+ int n = fread(buffer, 1, 2048, fd);
+ if (n == -1) {
+ pclose(fd);
+ return;
+ }
+ array.setRawData(buffer, n);
+ data(array);
+ array.resetRawData(buffer, n);
+ }
+
+ pclose(fd);
+ finished();
+}
+
+
+void PydocProtocol::mimetype(const KURL&)
+{
+ mimeType( "text/html" );
+ finished();
+}
+
+
+QCString PydocProtocol::errorMessage()
+{
+ return QCString( "<html><body bgcolor=\"#FFFFFF\">" + i18n("Error in pydoc").local8Bit() + "</body></html>" );
+}
+
+
+void PydocProtocol::stat(const KURL &/*url*/)
+{
+ UDSAtom uds_atom;
+ uds_atom.m_uds = KIO::UDS_FILE_TYPE;
+ uds_atom.m_long = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
+
+ UDSEntry uds_entry;
+ uds_entry.append(uds_atom);
+
+ statEntry(uds_entry);
+ finished();
+}
+
+
+void PydocProtocol::listDir(const KURL &url)
+{
+ error( KIO::ERR_CANNOT_ENTER_DIRECTORY, url.path() );
+}
+
+
+extern "C" {
+
+ int kdemain(int argc, char **argv)
+ {
+ KInstance instance( "kio_pydoc" );
+ KGlobal::locale()->setMainCatalogue("kdevelop");
+
+ if (argc != 4) {
+ fprintf(stderr, "Usage: kio_pydoc protocol domain-socket1 domain-socket2\n");
+ exit(-1);
+ }
+
+ PydocProtocol slave(argv[2], argv[3]);
+ slave.dispatchLoop();
+
+ return 0;
+ }
+
+}
diff --git a/languages/python/pydoc.h b/languages/python/pydoc.h
new file mode 100644
index 00000000..e17a257a
--- /dev/null
+++ b/languages/python/pydoc.h
@@ -0,0 +1,30 @@
+#ifndef _PYDOC_H_
+#define _PYDOC_H_
+
+#include <qobject.h>
+#include <kio/slavebase.h>
+
+
+class PydocProtocol : public KIO::SlaveBase
+{
+public:
+ PydocProtocol(const QCString &pool, const QCString &app);
+ virtual ~PydocProtocol();
+
+ virtual void get(const KURL& url);
+ virtual void stat(const KURL& url);
+ virtual void mimetype(const KURL& url);
+ virtual void listDir(const KURL& url);
+
+protected:
+ void decodeURL(const KURL &url);
+ void decodePath(QString path);
+ QCString errorMessage();
+
+private:
+ QString python;
+ QString script;
+ QString key;
+};
+
+#endif
diff --git a/languages/python/pydoc.protocol b/languages/python/pydoc.protocol
new file mode 100644
index 00000000..4801357f
--- /dev/null
+++ b/languages/python/pydoc.protocol
@@ -0,0 +1,9 @@
+[Protocol]
+exec=kio_pydoc
+protocol=pydoc
+input=none
+output=filesystem
+reading=true
+listing=Name
+determineMimetypeFromExtension=false
+Icon=help
diff --git a/languages/python/pythonconfigwidget.cpp b/languages/python/pythonconfigwidget.cpp
new file mode 100644
index 00000000..87472477
--- /dev/null
+++ b/languages/python/pythonconfigwidget.cpp
@@ -0,0 +1,38 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "pythonconfigwidget.h"
+
+#include <qcheckbox.h>
+#include <klineedit.h>
+#include "domutil.h"
+
+
+PythonConfigWidget::PythonConfigWidget(QDomDocument &projectDom,
+ QWidget *parent, const char *name)
+ : PythonConfigWidgetBase(parent, name), dom(projectDom)
+{
+ interpreter_edit->setText(DomUtil::readEntry(dom, "/kdevpythonsupport/run/interpreter"));
+ terminal_box->setChecked(DomUtil::readBoolEntry(dom, "/kdevpythonsupport/run/terminal"));
+}
+
+
+PythonConfigWidget::~PythonConfigWidget()
+{}
+
+
+void PythonConfigWidget::accept()
+{
+ DomUtil::writeEntry(dom, "/kdevpythonsupport/run/interpreter", interpreter_edit->text());
+ DomUtil::writeBoolEntry(dom, "/kdevpythonsupport/run/terminal", terminal_box->isChecked());
+}
+
+#include "pythonconfigwidget.moc"
diff --git a/languages/python/pythonconfigwidget.h b/languages/python/pythonconfigwidget.h
new file mode 100644
index 00000000..22708c29
--- /dev/null
+++ b/languages/python/pythonconfigwidget.h
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PYTHONCONFIGWIDGET_H_
+#define _PYTHONCONFIGWIDGET_H_
+
+#include "pythonconfigwidgetbase.h"
+#include <qdom.h>
+
+
+class PythonConfigWidget : public PythonConfigWidgetBase
+{
+ Q_OBJECT
+
+public:
+ PythonConfigWidget( QDomDocument &projectDom, QWidget *parent=0, const char *name=0 );
+ ~PythonConfigWidget();
+
+public slots:
+ void accept();
+
+private:
+ QDomDocument &dom;
+};
+
+#endif
diff --git a/languages/python/pythonconfigwidgetbase.ui b/languages/python/pythonconfigwidgetbase.ui
new file mode 100644
index 00000000..d3228822
--- /dev/null
+++ b/languages/python/pythonconfigwidgetbase.ui
@@ -0,0 +1,121 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PythonConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>python_config_widget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Python</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>interpreter_label</cstring>
+ </property>
+ <property name="text">
+ <string>Python &amp;interpreter:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>interpreter_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>interpreter_edit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>terminal_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Execute programs in a terminal</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/python/pythonimplementationwidget.cpp b/languages/python/pythonimplementationwidget.cpp
new file mode 100644
index 00000000..151fe9c3
--- /dev/null
+++ b/languages/python/pythonimplementationwidget.cpp
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * 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. *
+ ***************************************************************************/
+#include "pythonimplementationwidget.h"
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include <filetemplate.h>
+#include <kdevlanguagesupport.h>
+#include <kdevproject.h>
+
+PythonImplementationWidget::PythonImplementationWidget(KDevLanguageSupport* part,
+ QWidget* parent, const char* name, bool modal)
+ : ImplementationWidget(part, parent, name, modal)
+{
+}
+
+
+PythonImplementationWidget::~PythonImplementationWidget()
+{
+}
+
+
+QStringList PythonImplementationWidget::createClassFiles()
+{
+// QString template_py = "require '$BASEFILENAME$'\n\nclass $CLASSNAME$ < $BASECLASSNAME$\n\n def initialize(*k)\n super(*k)\n end\n\nend\n";
+ QString template_py = "from qt import *\nfrom $BASEFILENAME$ import *\nclass $CLASSNAME$($BASECLASSNAME$):\n\n def __init__(self,parent,name):\n $BASECLASSNAME$.__init__(self,parent,name)\n \n\n\n";
+
+ QFileInfo formInfo(m_formName);
+ template_py.replace(QRegExp("\\$BASEFILENAME\\$"), formInfo.baseName()+".py");
+ template_py.replace(QRegExp("\\$CLASSNAME\\$"), classNameEdit->text());
+ template_py.replace(QRegExp("\\$BASECLASSNAME\\$"), m_baseClassName);
+
+ template_py = FileTemplate::read(m_part, "py") + template_py;
+
+ QString file_py = fileNameEdit->text() + ".py";
+ if (!m_part->project()->activeDirectory().isEmpty())
+ file_py = m_part->project()->activeDirectory() + "/" + file_py;
+ QFile file(QDir::cleanDirPath(m_part->project()->projectDirectory() + "/" + file_py));
+ if (!file.open(IO_WriteOnly)) {
+ KMessageBox::error(0, i18n("Cannot write to file"));
+ return QStringList();
+ }
+ QTextStream stream(&file);
+ stream << template_py;
+ file.close();
+
+ QStringList files;
+ files.append(file_py);
+ return files;
+}
+
+#include "pythonimplementationwidget.moc"
diff --git a/languages/python/pythonimplementationwidget.h b/languages/python/pythonimplementationwidget.h
new file mode 100644
index 00000000..abae4a4c
--- /dev/null
+++ b/languages/python/pythonimplementationwidget.h
@@ -0,0 +1,37 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifndef PYTHONIMPLEMENTATIONWIDGET_H
+#define PYTHONIMPLEMENTATIONWIDGET_H
+
+#include <implementationwidget.h>
+
+class PythonImplementationWidget : public ImplementationWidget
+{
+Q_OBJECT
+public:
+ PythonImplementationWidget(KDevLanguageSupport* part, QWidget* parent = 0, const char* name = 0, bool modal = true);
+
+ ~PythonImplementationWidget();
+
+ virtual QStringList createClassFiles();
+
+};
+
+#endif
diff --git a/languages/python/pythonsupportpart.cpp b/languages/python/pythonsupportpart.cpp
new file mode 100644
index 00000000..1b0e76da
--- /dev/null
+++ b/languages/python/pythonsupportpart.cpp
@@ -0,0 +1,410 @@
+/***************************************************************************
+ * Copyright (C) 2001-2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "pythonsupportpart.h"
+#include "pythonconfigwidget.h"
+
+#include <kdevcore.h>
+#include <kdevproject.h>
+#include <kdevappfrontend.h>
+#include <kdevpartcontroller.h>
+#include <codemodel.h>
+#include <domutil.h>
+
+#include <qfileinfo.h>
+#include <qpopupmenu.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <qvbox.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdialogbase.h>
+#include <kdevgenericfactory.h>
+#include <kdevplugininfo.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <qregexp.h>
+
+#include "qtdesignerpythonintegration.h"
+#include "pythonimplementationwidget.h"
+
+typedef KDevGenericFactory<PythonSupportPart> PythonSupportFactory;
+static const KDevPluginInfo data("kdevpythonsupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevpythonsupport, PythonSupportFactory( data ) )
+
+PythonSupportPart::PythonSupportPart(QObject *parent, const char *name, const QStringList &)
+ : KDevLanguageSupport(&data, parent, name ? name : "PythonSupportPart")
+{
+ setInstance(PythonSupportFactory::instance());
+
+ setXMLFile("kdevpythonsupport.rc");
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+ connect( core(), SIGNAL(projectConfigWidget(KDialogBase*)),
+ this, SLOT(projectConfigWidget(KDialogBase*)) );
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+
+ KAction *action;
+
+ action = new KAction( i18n("Execute Program"), "exec", 0,
+ this, SLOT(slotExecute()),
+ actionCollection(), "build_exec" );
+ action->setToolTip( i18n("Execute program") );
+ action->setWhatsThis(i18n("<b>Execute program</b><p>Runs the Python program."));
+
+ action = new KAction( i18n("Execute String..."), "exec", 0,
+ this, SLOT(slotExecuteString()),
+ actionCollection(), "build_execstring" );
+ action->setToolTip( i18n("Execute string") );
+ action->setWhatsThis(i18n("<b>Execute String</b><p>Executes a string as Python code."));
+
+ action = new KAction( i18n("Start Python Interpreter"), "exec", 0,
+ this, SLOT(slotStartInterpreter()),
+ actionCollection(), "build_runinterpreter" );
+ action->setToolTip( i18n("Start Python interpreter") );
+ action->setWhatsThis(i18n("<b>Start python interpreter</b><p>Starts the Python interpreter without a program"));
+
+ action = new KAction( i18n("Python Documentation..."), 0,
+ this, SLOT(slotPydoc()),
+ actionCollection(), "help_pydoc" );
+ action->setToolTip( i18n("Python documentation") );
+ action->setWhatsThis(i18n("<b>Python documentation</b><p>Shows a Python documentation page."));
+}
+
+
+PythonSupportPart::~PythonSupportPart()
+{}
+
+
+void PythonSupportPart::contextMenu(QPopupMenu *popup, const Context *context)
+{
+ if (context->hasType(Context::FileContext)){
+ const FileContext *fc = static_cast<const FileContext*>(context);
+ //this is a .ui file and only selection contains only one such file
+ KURL url = fc->urls().first();
+ if (url.fileName().endsWith(".ui"))
+ {
+ m_contextFileName = url.fileName();
+ int id = popup->insertItem(i18n("Create or Select Implementation..."), this, SLOT(slotCreateSubclass()));
+ popup->setWhatsThis(id, i18n("<b>Create or select implementation</b><p>Creates or selects a subclass of selected form for use with integrated KDevDesigner."));
+ }
+ }
+}
+
+
+void PythonSupportPart::projectConfigWidget(KDialogBase *dlg)
+{
+ QVBox *vbox = dlg->addVBoxPage(i18n("Python"));
+ PythonConfigWidget *w = new PythonConfigWidget(*projectDom(), vbox, "python config widget");
+ connect( dlg, SIGNAL(okClicked()), w, SLOT(accept()) );
+}
+
+
+void PythonSupportPart::projectOpened()
+{
+ kdDebug(9014) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(0, this, SLOT(initialParse()));
+}
+
+
+void PythonSupportPart::projectClosed()
+{
+}
+
+
+void PythonSupportPart::maybeParse(const QString fileName)
+{
+ QFileInfo fi(fileName);
+ if (fi.extension() == "py") {
+
+ if( codeModel()->hasFile(fileName) ){
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+
+ parse( fileName );
+ }
+}
+
+
+void PythonSupportPart::initialParse()
+{
+ kdDebug(9014) << "initialParse()" << endl;
+
+ if (project()) {
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it) {
+ kdDebug(9014) << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+ maybeParse(project()->projectDirectory() + "/" + *it);
+ }
+
+ emit updatedSourceInfo();
+ kapp->restoreOverrideCursor();
+ } else {
+ kdDebug(9014) << "No project" << endl;
+ }
+}
+
+
+void PythonSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug(9014) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ maybeParse( fileName );
+ emit addedSourceInfo( fileName );
+ }
+
+ //emit updatedSourceInfo();
+}
+
+
+void PythonSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug(9014) << "removedFilesFromProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+
+ if( codeModel()->hasFile(fileName) ){
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+ }
+
+ //emit updatedSourceInfo();
+}
+
+
+void PythonSupportPart::savedFile(const KURL &fileName)
+{
+ kdDebug(9014) << "savedFile()" << endl;
+
+ if (project()->allFiles().contains(fileName.path().mid ( project()->projectDirectory().length() + 1 ))) {
+ maybeParse(fileName.path());
+ emit addedSourceInfo( fileName.path() );
+ }
+}
+
+
+KDevLanguageSupport::Features PythonSupportPart::features()
+{
+ return Features(Classes | Functions);
+}
+
+
+KMimeType::List PythonSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "text/x-python" );
+ if( mime )
+ list << mime;
+
+ mime = KMimeType::mimeType( "application/x-python" );
+ if( mime )
+ list << mime;
+
+ return list;
+}
+
+void PythonSupportPart::parse(const QString &fileName)
+{
+ QFile f(QFile::encodeName(fileName));
+ if (!f.open(IO_ReadOnly))
+ return;
+ QTextStream stream(&f);
+
+ QRegExp classre("^[ \t]*class[ \t]+([A-Za-z0-9_]+)[ \t]*(\\(([A-Za-z0-9_, \t]+)\\))?.*$");
+ QRegExp methodre("^[ \t]*def[ \t]+([A-Za-z0-9_]+).*$");
+
+ FileDom m_file = codeModel()->create<FileModel>();
+ m_file->setName( fileName );
+
+ ClassDom lastClass;
+ QString rawline;
+ QCString line;
+ int lineNo = 0;
+ while (!stream.atEnd()) {
+ rawline = stream.readLine();
+ line = rawline.stripWhiteSpace().local8Bit();
+ if (classre.search(line) != -1) {
+
+ lastClass = codeModel()->create<ClassModel>();
+ lastClass->setName(classre.cap(1));
+ lastClass->setFileName( fileName );
+ lastClass->setStartPosition( lineNo, 0 );
+
+ QStringList parentList = QStringList::split(",", classre.cap(3));
+ QStringList::ConstIterator it;
+ for (it = parentList.begin(); it != parentList.end(); ++it) {
+ QString baseName = (*it).stripWhiteSpace();
+ kdDebug(9014) << "Add parent" << baseName << endl;
+ lastClass->addBaseClass( baseName );
+ }
+
+ if (m_file->hasClass(lastClass->name())) {
+ ClassDom old = m_file->classByName( lastClass->name() )[ 0 ];
+ old->setFileName( lastClass->fileName() );
+
+ int line, col;
+ lastClass->getStartPosition( &line, &col );
+ old->setStartPosition( line, col );
+
+ lastClass = old;
+ } else {
+ kdDebug(9014) << "Add class " << lastClass->name() << endl;
+ m_file->addClass( lastClass );
+ }
+
+ } else if (methodre.search(line) != -1 ) {
+
+ FunctionDom method = codeModel()->create<FunctionModel>();
+ method->setName(methodre.cap(1));
+ method->setFileName( fileName );
+ method->setStartPosition( lineNo, 0 );
+
+ if (lastClass && rawline.left(3) != "def") {
+ if( !lastClass->hasFunction(method->name()) )
+ lastClass->addFunction( method );
+ QStringList scope;
+ scope << lastClass->name();
+ method->setScope( scope );
+
+ } else if( !m_file->hasFunction(method->name()) ){
+ m_file->addFunction( method );
+ lastClass = 0;
+ }
+ }
+ ++lineNo;
+ }
+
+ f.close();
+
+ codeModel()->addFile( m_file );
+}
+
+
+QString PythonSupportPart::interpreter()
+{
+ QString prog = DomUtil::readEntry(*projectDom(), "/kdevpythonsupport/run/interpreter");
+ if (prog.isEmpty())
+ prog = "python";
+
+ return prog;
+}
+
+
+void PythonSupportPart::startApplication(const QString &program)
+{
+ bool inTerminal = DomUtil::readBoolEntry(*projectDom(), "/kdevpythonsupport/run/terminal");
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), program, inTerminal);
+}
+
+
+void PythonSupportPart::slotExecute()
+{
+ QString program = project()->mainProgram();
+ QString cmd = interpreter() + " " + program;
+ startApplication(cmd);
+}
+
+
+void PythonSupportPart::slotStartInterpreter()
+{
+ startApplication(interpreter());
+}
+
+
+void PythonSupportPart::slotExecuteString()
+{
+ bool ok;
+ QString cmd = KInputDialog::getText(i18n("String to Execute"), i18n("String to execute:"), QString::null, &ok, 0);
+ if (ok) {
+ cmd.prepend("'");
+ cmd.append("'");
+ startApplication(cmd);
+ }
+}
+
+
+void PythonSupportPart::slotPydoc()
+{
+ bool ok;
+ QString key = KInputDialog::getText(i18n("Show Python Documentation"), i18n("Show Python documentation on keyword:"), "", &ok, 0);
+ if (ok && !key.isEmpty()) {
+ QString url = "pydoc:";
+ url += key;
+ partController()->showDocument(KURL(url));
+ }
+}
+
+KDevDesignerIntegration *PythonSupportPart::designer(KInterfaceDesigner::DesignerType type)
+{
+ KDevDesignerIntegration *des = 0;
+ switch (type)
+ {
+ case KInterfaceDesigner::QtDesigner:
+ des = m_designers[type];
+ if (des == 0)
+ {
+ PythonImplementationWidget *impl = new PythonImplementationWidget(this);
+ des = new QtDesignerPythonIntegration(this, impl);
+ des->loadSettings(*project()->projectDom(),
+ "kdevpythonsupport/designerintegration");
+ m_designers[type] = des;
+ }
+ break;
+ case KInterfaceDesigner::Glade:
+ break;
+ }
+ return des;
+
+}
+
+void PythonSupportPart::slotCreateSubclass()
+{
+ QFileInfo fi(m_contextFileName);
+ kdDebug(9014) << k_funcinfo << " file: " << m_contextFileName << " ext: " << fi.extension(false) << endl;
+ if (fi.extension(false) != "ui")
+ return;
+ QtDesignerPythonIntegration *des = dynamic_cast<QtDesignerPythonIntegration*>(designer(KInterfaceDesigner::QtDesigner));
+ if (des)
+ {
+ kdDebug(9014) << "ok: " << des << endl;
+ kdDebug(9014) << "have impl: " << des->selectImplementation(m_contextFileName);
+ }
+ kdDebug(9014) << "end: " << des << endl;
+}
+
+#include "pythonsupportpart.moc"
diff --git a/languages/python/pythonsupportpart.h b/languages/python/pythonsupportpart.h
new file mode 100644
index 00000000..ad2085e5
--- /dev/null
+++ b/languages/python/pythonsupportpart.h
@@ -0,0 +1,66 @@
+/***************************************************************************
+ * Copyright (C) 2001-2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PYTHONSUPPORTPART_H_
+#define _PYTHONSUPPORTPART_H_
+
+
+#include "kdevlanguagesupport.h"
+
+class KDialogBase;
+class QStringList;
+class QPopupMenu;
+class Context;
+
+class PythonSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+ PythonSupportPart( QObject *parent, const char *name, const QStringList & );
+ ~PythonSupportPart();
+
+ virtual KDevDesignerIntegration *designer(KInterfaceDesigner::DesignerType type);
+
+public slots:
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void slotCreateSubclass();
+
+protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+private slots:
+ void projectConfigWidget(KDialogBase *dlg);
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void slotExecute();
+ void slotExecuteString();
+ void slotStartInterpreter();
+
+ // Internal
+ void initialParse();
+ void slotPydoc();
+
+private:
+ QString interpreter();
+ void startApplication(const QString &program);
+ void maybeParse(const QString fileName);
+ void parse(const QString &fileName);
+
+ QMap<KInterfaceDesigner::DesignerType, KDevDesignerIntegration*> m_designers;
+ QString m_contextFileName;
+};
+
+#endif
diff --git a/languages/python/qtdesignerpythonintegration.cpp b/languages/python/qtdesignerpythonintegration.cpp
new file mode 100644
index 00000000..5a47d810
--- /dev/null
+++ b/languages/python/qtdesignerpythonintegration.cpp
@@ -0,0 +1,97 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * 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. *
+ ***************************************************************************/
+#include "qtdesignerpythonintegration.h"
+
+#include <qpair.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/viewcursorinterface.h>
+
+#include <domutil.h>
+#include <kdevpartcontroller.h>
+#include <kdevcreatefile.h>
+#include <kdevlanguagesupport.h>
+
+#include "codemodel_utils.h"
+#include "implementationwidget.h"
+
+QtDesignerPythonIntegration::QtDesignerPythonIntegration(KDevLanguageSupport* part, ImplementationWidget* impl)
+ :QtDesignerIntegration(part, impl, false, 0)
+{
+}
+
+
+QtDesignerPythonIntegration::~QtDesignerPythonIntegration()
+{
+}
+
+
+void QtDesignerPythonIntegration::addFunctionToClass(KInterfaceDesigner::Function function, ClassDom klass)
+{
+ m_part->partController()->editDocument( KURL( klass->fileName() ) );
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( m_part->partController()->activePart() );
+ if( !editIface ){
+ /// @todo show messagebox
+// QDialog::accept();
+ return;
+ }
+
+ kdDebug(9014) << "===============" << endl;
+
+ int line, column;
+ klass->getStartPosition( &line, &column );
+
+ // compute the insertion point
+ QPair<int,int> point;
+ point.first = line + 1;
+ point.second = column;
+
+ const FunctionList functionList = klass->functionList();
+ if (functionList.count() > 0)
+ {
+ int funEndLine, funEndColumn;
+ functionList.first()->getEndPosition(&funEndLine, &funEndColumn);
+ point.second = funEndColumn;
+ }
+
+ QString func = function.function;
+ func.replace("()", "");
+ QString str = " def " + func + "(self):\n\n";
+
+ kdDebug(9014) << "insert " << str << " into " << point.first << endl;
+
+ editIface->insertText(point.first, 0 /*pt.second*/, str );
+
+ KTextEditor::View *activeView = dynamic_cast<KTextEditor::View*>( m_part->partController()->activePart()->widget() );
+ if (activeView)
+ {
+ KTextEditor::ViewCursorInterface* cursor = dynamic_cast<KTextEditor::ViewCursorInterface*>(activeView );
+ if (cursor)
+ cursor->setCursorPositionReal(point.first, 4);
+ }
+}
+
+#include "qtdesignerpythonintegration.moc"
diff --git a/languages/python/qtdesignerpythonintegration.h b/languages/python/qtdesignerpythonintegration.h
new file mode 100644
index 00000000..8ac5d5be
--- /dev/null
+++ b/languages/python/qtdesignerpythonintegration.h
@@ -0,0 +1,37 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifndef QTDESIGNERPYTHONINTEGRATION_H
+#define QTDESIGNERPYTHONINTEGRATION_H
+
+#include <qtdesignerintegration.h>
+
+class QtDesignerPythonIntegration : public QtDesignerIntegration
+{
+Q_OBJECT
+public:
+ QtDesignerPythonIntegration(KDevLanguageSupport* part, ImplementationWidget* impl);
+
+ ~QtDesignerPythonIntegration();
+
+ virtual void addFunctionToClass(KInterfaceDesigner::Function function, ClassDom klass);
+
+};
+
+#endif
diff --git a/languages/ruby/Makefile.am b/languages/ruby/Makefile.am
new file mode 100644
index 00000000..1b5fb83b
--- /dev/null
+++ b/languages/ruby/Makefile.am
@@ -0,0 +1,31 @@
+#Here resides the Ruby support part.
+
+INCLUDES = -I$(top_srcdir)/languages/lib/designer_integration \
+ -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/extensions \
+ -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ -I$(top_builddir)/languages/lib/designer_integration $(all_includes)
+SUBDIRS = app_templates file_templates doc debugger
+
+
+kde_module_LTLIBRARIES = libkdevrubysupport.la
+libkdevrubysupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevrubysupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/languages/lib/designer_integration/libdesignerintegration.la $(top_builddir)/lib/util/libkdevutil.la
+
+libkdevrubysupport_la_SOURCES = rubysupport_part.cpp rubyconfigwidgetbase.ui \
+ rubyconfigwidget.cpp qtdesignerrubyintegration.cpp rubyimplementationwidget.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevrubysupport.desktop
+
+templatedir = ${kde_datadir}/kdevabbrev/templates
+template_DATA = rubytemplates
+
+rcdir = $(kde_datadir)/kdevrubysupport
+rc_DATA = kdevrubysupport.rc
+
+picsdirdir = $(kde_datadir)/kdevrubysupport/pics
+picsdir_DATA = ruby_config.png ruby_run.png
+noinst_HEADERS = qtdesignerrubyintegration.h rubyimplementationwidget.h
diff --git a/languages/ruby/README b/languages/ruby/README
new file mode 100644
index 00000000..731741e1
--- /dev/null
+++ b/languages/ruby/README
@@ -0,0 +1,3 @@
+Please read the on-line, automaticaly updated KDevelop API documentation at:
+http://www.kdevelop.org
+or read the README.dox file.
diff --git a/languages/ruby/README.dox b/languages/ruby/README.dox
new file mode 100644
index 00000000..aaa8823b
--- /dev/null
+++ b/languages/ruby/README.dox
@@ -0,0 +1,43 @@
+/** \class RubySupportPart
+This is a Ruby support plugin
+
+\authors <a href="mailto:marek AT janukowicz.net">Marek Janukowicz</a>
+
+\maintainer <a href="mailto:marek AT janukowicz.net">Marek Janukowicz</a>
+
+\feature Ruby language support
+\feature .rb template for New File
+\feature Ruby project template for Application Wizard
+\feature "Run" option in menu
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/ruby/app_templates/Makefile.am b/languages/ruby/app_templates/Makefile.am
new file mode 100644
index 00000000..52239564
--- /dev/null
+++ b/languages/ruby/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = rubyhello qtruby qtrubyapp dcopservice kapp kxt rails qtruby4app
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/ScriptingLanguageIDE/RubyIDE
+profiles_DATA = ruby.appwizard
diff --git a/languages/ruby/app_templates/dcopservice/Makefile.am b/languages/ruby/app_templates/dcopservice/Makefile.am
new file mode 100644
index 00000000..441e9ceb
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = dcopservice.desktop app.cpp app-configure.in.in \
+ src-Makefile.am main.rb dcopservice.rb dcopservice.kdevelop \
+ subdirs
+templateName = dcopserviceruby
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/dcopservice/app-configure.in.in b/languages/ruby/app_templates/dcopservice/app-configure.in.in
new file mode 100644
index 00000000..5d41e618
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/app-configure.in.in
@@ -0,0 +1,51 @@
+#MIN_CONFIG(3.0.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, 0.1)
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+AC_PROG_MAKE_SET
+
+# ruby interpreter check
+AC_PATH_PROG([RUBY],[ruby])
+if test -z "${RUBY}" ; then
+ AC_MSG_ERROR([you need Ruby to use this program])
+fi
+
+AC_CHECK_PROG(RUBY, ruby, ruby)
+
+if test -z "$RUBY"; then
+ DO_NOT_COMPILE="$DO_NOT_COMPILE qtruby"
+else
+ AC_MSG_CHECKING(for ruby dirs)
+ RUBY_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
+ RUBY_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
+ RUBY_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
+ RUBY_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
+ RUBY_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`
+ AC_MSG_RESULT([archdir $RUBY_ARCHDIR, sitearchdir $RUBY_SITEARCHDIR, sitedir $RUBY_SITEDIR, libdir $RUBY_LIBDIR, librubyarg $RUBY_LIBRUBYARG])
+ AC_SUBST(RUBY_ARCHDIR)
+ AC_SUBST(RUBY_SITEARCHDIR)
+ AC_SUBST(RUBY_SITEDIR)
+ AC_SUBST(RUBY_LIBDIR)
+ AC_SUBST(RUBY_LIBRUBYARG)
+fi
+
+# Korundum check
+AC_MSG_CHECKING([whether Korundum is installed])
+korundum_present=no
+cat >korundumtest.rb <<END
+require 'Korundum'
+END
+${RUBY} korundumtest.rb >/dev/null 2>&1 && korundum_present=yes
+AC_MSG_RESULT([$korundum_present])
+
+# rbuic check
+AC_PATH_PROG([RBUIC],[rbuic])
+if test -z "${RBUIC}" ; then
+ AC_MSG_ERROR([cannot find rbuic (part of the QtRuby package)])
+fi
+AC_SUBST([RBUIC])
+AC_SUBST([RUBY])
+
+
diff --git a/languages/ruby/app_templates/dcopservice/app.cpp b/languages/ruby/app_templates/dcopservice/app.cpp
new file mode 100644
index 00000000..8d6af02d
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/app.cpp
@@ -0,0 +1,30 @@
+#include <ruby.h>
+
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <kinstance.h>
+#include <kstandarddirs.h>
+
+int main(int argc, char **argv) {
+ KInstance * instance = new KInstance("%{APPNAMELC}");
+ QString appdir = ::locate("data", "%{APPNAMELC}/main.rb", instance);
+ delete instance;
+ if (appdir.isNull()) {
+ qFatal("Error: Can't find \"%{APPNAMELC}/main.rb\"\n");
+ }
+ QFileInfo program(appdir);
+
+ char ** rubyargs = (char **) calloc(argc+4, sizeof(char *));
+ rubyargs[0] = strdup(argv[0]);
+ rubyargs[1] = strdup("-KU");
+ rubyargs[2] = strdup(QString("-C%1").arg(program.dirPath()).latin1());
+ rubyargs[3] = strdup(QString("-I%1").arg(program.dirPath()).latin1());
+ rubyargs[4] = strdup(program.fileName().latin1());
+ for (int i = 1; i < argc; i++) {
+ rubyargs[i+4] = argv[i];
+ }
+
+ ruby_init();
+ ruby_options(argc+4, rubyargs);
+ ruby_run();
+}
diff --git a/languages/ruby/app_templates/dcopservice/dcopservice.desktop b/languages/ruby/app_templates/dcopservice/dcopservice.desktop
new file mode 100644
index 00000000..2ee5220f
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopservice.desktop
@@ -0,0 +1,43 @@
+[Desktop Entry]
+Type=Service
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+X-DCOP-ServiceType=Unique
+X-KDE-StartupNotify=false
+Comment=Template for dcop services
+Comment[br]=Patrom evit servijoù dcop
+Comment[ca]=Plantilla per als serveis dcop
+Comment[cy]=Patrymlun ar gyfer gwasanaethau dcop
+Comment[da]=Skabelon for DCOP-tjenester
+Comment[de]=Vorlage für DCOP-Dienste
+Comment[el]=ΠÏότυπο για υπηÏεσίες dcop
+Comment[es]=Plantilla para servicios DCOP
+Comment[et]=DCOP-teenuste mall
+Comment[eu]=DCOP zerbitzuentzako plantilla
+Comment[fa]=قالب برای خدمات dcop
+Comment[fr]=Modèle pour les services DCOP
+Comment[ga]=Teimpléad i gcomhair seirbhísí DCOP
+Comment[gl]=Modelo para servizos dcop
+Comment[hi]=डीसीओपी सेवाओं के लिठटेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ
+Comment[hu]=Sablon DCOP-szolgáltatásokhoz
+Comment[is]=Snið fyrir dcop þjónustur
+Comment[it]=Modello per servizi dcop
+Comment[ja]=dcop サービスã®ãŸã‚ã®ãƒ†ãƒ³ãƒ—レート
+Comment[nds]=Vörlaag för DCOP-Deensten
+Comment[ne]=dcop सेवाका लागि टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ
+Comment[nl]=Sjabloon voor DCOP-services
+Comment[pl]=Szablon dla usług dcop
+Comment[pt]=Modelo para serviços dcop
+Comment[pt_BR]=Modelo para serviços dcop
+Comment[ru]=Шаблон Ð´Ð»Ñ ÑервиÑов DCOP
+Comment[sk]=Šablóna pre DCOP služby
+Comment[sl]=Predloga za storitve DCOP
+Comment[sr]=Шаблон за dcop ÑервиÑе
+Comment[sr@Latn]=Å ablon za dcop servise
+Comment[sv]=Mall för DCOP-tjänster
+Comment[ta]=டிகாபà¯à®šà¯‡à®µà¯ˆà®•à¯à®•à®¾à®© மாதரி உரà¯
+Comment[tg]=Қолиб барои хидмадгори DCOP
+Comment[tr]=dcop hizmetleri için şablon
+Comment[zh_CN]=dcop æœåŠ¡æ¨¡æ¿
+Comment[zh_TW]=DCOP æœå‹™æ¨£æœ¬
+
diff --git a/languages/ruby/app_templates/dcopservice/dcopservice.kdevelop b/languages/ruby/app_templates/dcopservice/dcopservice.kdevelop
new file mode 100644
index 00000000..f4e274da
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopservice.kdevelop
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activedir/>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Sources" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <charactercoding>3</charactercoding>
+ <mainprogram>src/main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/ruby/app_templates/dcopservice/dcopservice.rb b/languages/ruby/app_templates/dcopservice/dcopservice.rb
new file mode 100644
index 00000000..94a03ec9
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopservice.rb
@@ -0,0 +1,37 @@
+
+class %{APPNAME} < KDE::DCOPObject
+
+ k_dcop 'QString string(int)',
+ 'QStringList list()',
+ 'void add(QString)',
+ 'bool remove(QString)',
+ 'bool exit()'
+
+ def initialize()
+ super("serviceInterface")
+ puts "Starting new service... "
+ @list = []
+ end
+
+ def string(idx)
+ return @list[idx]
+ end
+
+ def list()
+ return @list
+ end
+
+ def add(arg)
+ puts "Adding " + arg + " to the list"
+ @list << arg
+ end
+
+ def remove(arg)
+ @list.delete(arg) ? true : false
+ end
+
+ def exit()
+ $kapp.quit()
+ return true
+ end
+end
diff --git a/languages/ruby/app_templates/dcopservice/dcopserviceruby.kdevtemplate b/languages/ruby/app_templates/dcopservice/dcopserviceruby.kdevtemplate
new file mode 100644
index 00000000..adf9c172
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopserviceruby.kdevtemplate
@@ -0,0 +1,199 @@
+# KDE Config File
+[General]
+Name=DCOP Service
+Name[br]=Servij DCOP
+Name[ca]=Servei DCOP
+Name[de]=DCOP-Dienst
+Name[el]=ΥπηÏεσία DCOP
+Name[es]=Servicio DCOP
+Name[et]=DCOP-teenus
+Name[eu]=DCOP zerbitzua
+Name[fa]=خدمت DCOP
+Name[fr]=Service DCOP
+Name[ga]=Seirbhís DCOP
+Name[gl]=Servizo DCOP
+Name[hu]=DCOP-szolgáltatás
+Name[it]=Servizio DCOP
+Name[ja]=DCOP サービス
+Name[nds]=DCOP-Deenst
+Name[ne]=DCOP सेवा
+Name[nl]=DCOP-service
+Name[pl]=Usługa DCOP
+Name[pt]=Serviço de DCOP
+Name[pt_BR]=Serviço DCOP
+Name[ru]=Ð¡ÐµÑ€Ð²Ð¸Ñ DCOP
+Name[sk]=DCOP služba
+Name[sr]=DCOP ÑервиÑ
+Name[sr@Latn]=DCOP servis
+Name[sv]=DCOP-tjänst
+Name[tr]=DCOP Hizmeti
+Name[zh_CN]=DCOP æœåŠ¡
+Name[zh_TW]=DCOP æœå‹™
+Icon=kdcop.png
+Category=Ruby/KDE
+Comment=Generates a framework for a KDE DCOP service and client access library.
+Comment[ca]=Genera una infraestructura per a un servei DCOP de KDE i la biblioteca d'accés del client.
+Comment[da]=Genererer et skelet for en KDE dcop-tjeneste og klientadgangsbibliotek.
+Comment[de]=Erstellt das Grundgerüst für einen KDE-DCOP-Dienst und eine Bibliothek für den Client-Zugriff.
+Comment[el]=ΔημιουÏγεί ένα πλαίσιο για μια υπηÏεσία KDE DCOP και μια βιβλιοθήκη Ï€Ïόσβασης πελάτη.
+Comment[es]=Genera una infraestructura para un servicio DCOP de KDE y una biblioteca de acceso cliente.
+Comment[et]=KDE DCOP-teenuse raamistiku ja kliendi ligipääsu teegi loomine.
+Comment[eu]=KDE-ren DCOP zerbitzu baterako lan-marko bat eta bezero liburutegi bat sortzen ditu.
+Comment[fa]=چارچوبی برای خدمت KDE DCOP و کتابخانۀ دستیابی کارخواه تولید می‌کند.
+Comment[fr]=Génère une infrastructure pour un service DCOP KDE et une bibliothèque d'accès client.
+Comment[ga]=Cruthaigh creatlach do sheirbhís DCOP KDE agus leabharlann rochtana cliaint.
+Comment[gl]=Xera un contorno de traballo para un servizo DCOP de KDE e unha biblioteca de acceso para clientes.
+Comment[hu]=Létrehoz egy alap KDE DCOP-szolgáltatást és klienselérési programkönyvtárat.
+Comment[it]=Genera l'infrastruttura per un servizio DCOP di KDE e una libreria per l'accesso da client.
+Comment[ja]=KDE DCOP サービスã¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚¢ã‚¯ã‚»ã‚¹ãƒ©ã‚¤ãƒ–ラリã®ãŸã‚ã®ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã‚’作æˆã—ã¾ã™
+Comment[nds]=Stellt en Rahmenwark för en KDE-DCOP-Deenst un en Clienttogriep-Bibliotheek op.
+Comment[ne]=KDE DCOP सेवा र गà¥à¤°à¤¾à¤¹à¤• पहà¥à¤à¤š लाइबà¥à¤°à¥‡à¤°à¥€à¤•à¤¾ लागि फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤• उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Genereert een framework voor een KDE DCOP-service- en client-bibliotheek.
+Comment[pl]=Generuje schemat dla usługi KDE DCOP i biblioteki dostępu użytkownika.
+Comment[pt]=Gera a plataforma para um serviço de DCOP do KDE e a biblioteca de acesso dos clientes.
+Comment[pt_BR]=Gera a plataforma para um serviço de DCOP do KDE e a biblioteca de acesso dos clientes.
+Comment[ru]=Создание ÑервиÑа DCOP и библиотеки клиента.
+Comment[sk]=Vygeneruje framework pre KDE DCOP službu a klientskú prístupovú knižnicu.
+Comment[sr]=Прави једноÑтаван радни оквир за KDE DCOP ÑÐµÑ€Ð²Ð¸Ñ Ð¸ приÑтупну библиотеку клијента.
+Comment[sr@Latn]=Pravi jednostavan radni okvir za KDE DCOP servis i pristupnu biblioteku klijenta.
+Comment[sv]=Skapar ett ramverk för en KDE DCOP-tjänst och klientåtkomstbibliotek.
+Comment[tr]=Bir KDE DCOP hizmeti ve istemci erişim kütüphanesi için bir çatı yaratır.
+Comment[zh_CN]=生æˆä¸€ä¸ª KDE DCOP æœåŠ¡å’Œå®¢æˆ·è®¿é—®åº“的框架。
+Comment[zh_TW]=產生一個 KDE DCOP æœå‹™çš„架構,以åŠå®¢æˆ¶ç«¯å­˜å–的函å¼åº«ã€‚
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/src/main.rb
+Archive=dcopserviceruby.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/dcopservice.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE9]
+Type=install
+Source=%{src}/app-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/dcopservice.rb
+Dest=%{dest}/src/%{APPNAMELC}.rb
+
+[FILE13]
+Type=install
+Source=%{src}/dcopservice.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE14]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/src/main.rb
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[MSG]
+Type=message
+Comment=A KDE DCOP Service was created in %{dest}
+Comment[ca]=Un servei DCOP de KDE ha estat creada en %{dest}
+Comment[da]=En KDE DCOP tjeneste blev oprettet i %{dest}
+Comment[de]=Ein KDE-DCOP-Dienst wurde in %{dest} erstellt.
+Comment[el]=Μια υπηÏεσία KDE DCOP δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un servicio DCOP de KDE ha sido creado en %{dest}
+Comment[et]=KDE DCOP-teenus loodi asukohta %{dest}
+Comment[eu]=KDE-ren DCOP zerbitzu bat sortu da hemen: %{dest}
+Comment[fa]=یک خدمت KDE DCOP در %{dest} ایجاد شد
+Comment[fr]=Un service DCOP KDE a été créé dans %{dest}
+Comment[ga]=Cruthaíodh Seirbhís DCOP KDE i %{dest}
+Comment[gl]=Creouse un servizo DCOP de KDE en %{dest}
+Comment[hu]=Létrejött egy KDE DCOP-szolgáltatás itt: %{dest}
+Comment[it]=È stato creato un servizio DCOP di KDE in %{dest}
+Comment[ja]=KDE DCOP サービスを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en KDE-DCOP-Deenst opstellt
+Comment[ne]=KDE DCOP सेवा %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een DCOP-service is aangemaakt in %{dest}
+Comment[pl]=Usługa KDE DCOP została utworzona w %{dest}
+Comment[pt]=Foi criado um serviço de DCOP do KDE em %{dest}
+Comment[pt_BR]=Foi criado um serviço de DCOP do KDE em %{dest}
+Comment[ru]=Ð¡ÐµÑ€Ð²Ð¸Ñ DCOP Ñоздан в %{dest}
+Comment[sk]=KDE DCOP služba bola vytvorená v %{dest}
+Comment[sl]=Storitev DCOP za KDE je bila ustvarjena v %{dest}
+Comment[sr]=KDE DCOP ÑÐµÑ€Ð²Ð¸Ñ Ð½Ð°Ð¿Ñ€Ð°Ð²Ñ™ÐµÐ½ је у %{dest}
+Comment[sr@Latn]=KDE DCOP servis napravljen je u %{dest}
+Comment[sv]=En KDE DCOP-tjänst skapades i %{dest}
+Comment[tr]=Bir KDE DCOP Hizmeti %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了一个 KDE DCOP æœåŠ¡
+Comment[zh_TW]=KDE DCOP æœå‹™å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/ruby/app_templates/dcopservice/dcopserviceruby.png b/languages/ruby/app_templates/dcopservice/dcopserviceruby.png
new file mode 100644
index 00000000..2cb4f1f3
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopserviceruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/dcopservice/main.rb b/languages/ruby/app_templates/dcopservice/main.rb
new file mode 100644
index 00000000..3122b087
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/main.rb
@@ -0,0 +1,30 @@
+require 'Korundum'
+require '%{APPNAMELC}.rb'
+
+description = I18N_NOOP("A KDE DCOP Application")
+version = "0.1"
+options = []
+
+KDE::Locale.mainCatalogue = "kdelibs"
+aboutdata = KDE::AboutData.new("%{APPNAMELC}", I18N_NOOP("KDE"),
+ version, description,
+ KDE::AboutData.License_GPL, "(C) %{YEAR}, %{AUTHOR}")
+aboutdata.addAuthor("%{AUTHOR}",I18N_NOOP("Developer"),"%{EMAIL}")
+
+KDE::CmdLineArgs.init( ARGV, aboutdata )
+KDE::CmdLineArgs.addCmdLineOptions( options )
+KDE::UniqueApplication.addCmdLineOptions()
+
+if !KDE::UniqueApplication.start
+ puts "%{APPNAMELC} is already running!"
+ exit(0)
+end
+
+app = KDE::UniqueApplication.new
+puts "starting %{APPNAMELC} "
+# This app is started automatically, no need for session management
+app.disableSessionManagement
+service = %{APPNAME}.new
+puts "starting %{APPNAMELC} "
+app.exec
+
diff --git a/languages/ruby/app_templates/dcopservice/src-Makefile.am b/languages/ruby/app_templates/dcopservice/src-Makefile.am
new file mode 100644
index 00000000..220c58e3
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/src-Makefile.am
@@ -0,0 +1,15 @@
+INCLUDES = $(all_includes) -I$(RUBY_ARCHDIR)
+
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_LDFLAGS = $(all_libraries) $(KDE_RPATH) -L$(RUBY_LIBDIR)
+%{APPNAMELC}_LDADD = $(LIB_KIO) $(RUBY_LIBRUBYARG)
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+METASOURCES = AUTO
+
+rubysrc_DATA = main.rb %{APPNAMELC}.rb
+rubysrcdir = $(kde_datadir)/%{APPNAMELC}
+
+service_DATA = %{APPNAMELC}.desktop
+servicedir = $(kde_servicesdir)
+
diff --git a/languages/ruby/app_templates/dcopservice/subdirs b/languages/ruby/app_templates/dcopservice/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/ruby/app_templates/kapp/Makefile.am b/languages/ruby/app_templates/kapp/Makefile.am
new file mode 100644
index 00000000..20cf1f3f
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = app_client.rb appiface.rb app.rb appview.rb main.rb pref.rb app.cpp \
+ appui.rc app.desktop app.kdevelop app-Makefile.am app-configure.in.in \
+ src-Makefile.am subdirs README
+
+templateName = kappruby
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/kapp/README b/languages/ruby/app_templates/kapp/README
new file mode 100644
index 00000000..f04a5635
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/README
@@ -0,0 +1,81 @@
+-----------------------------------------------
+Kde application framework template quickstart
+Author: Thomas Nagy
+Date: 2004-03-22
+-----------------------------------------------
+
+This README file explains you basic things for starting with
+this application template.
+
+
+** Building and installing **
+
+* Build the configure script by "make -f Makefile.cvs"
+
+* To clean, use "make clean", and to clean everything
+(remove the makefiles, etc), use "make distclean"
+
+* To distribute your program, try "make dist".
+This will make a compact tarball archive of your release with the
+necessary scripts inside.
+
+* Modifying the auto-tools scripts
+for automake scripts there is an excellent tutorial there :
+http://developer.kde.org/documentation/other/makefile_am_howto.html
+
+* Simplify your life : install the project in your home directory for
+testing purposes.
+./configure --prefix=/home/user/dummyfolder/
+In the end when you finished the development you can
+rm -rf /home/user/dummyfolder/
+without fear.
+
+
+** Technologies **
+
+* Build the menus of your application easily
+kde applications now use an xml file (*ui.rc file) to build the menus.
+This allow a great customization of the application. However, when
+programming the menu is shown only after a "make install"
+
+For more details, consult :
+http://devel-home.kde.org/~larrosa/tutorial/p9.html
+http://developer.kde.org/documentation/tutorials/xmlui/preface.html
+
+* Use KConfig XT to create your configuration dialogs and make
+them more maintainable.
+
+For more details, consult :
+http://developer.kde.org/documentation/tutorials/kconfigxt/kconfigxt.html
+
+* With KParts, you can embed other kde components in your program, or make your program
+embeddable in other apps. For example, the kmplayer kpart can be called to play videos
+in your app.
+
+For more details, consult :
+http://www-106.ibm.com/developerworks/library/l-kparts/
+http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html
+
+* With dcop, you can control your app from other applications
+Make sure to include K_DCOP and a kdcop: section in your .h file
+http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html
+
+
+** Documentation **
+
+* For the translations :
+1. Download a patched gettext which can be found at:
+ http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/
+2. Install that gettext in ~/bin/
+3. cd ~/yourproject, export PATH=~/bin:$PATH, export
+KDEDIR=/where_your_KDE3_is
+4. make -f admin/Makefile.common package-messages
+5. make package-messages
+6. Translate the po files (not the pot!!) with kbabel or xemacs
+
+* Do not forget to write the documentation for your kde app
+edit the documentation template index.docbook in doc/
+
+
+
diff --git a/languages/ruby/app_templates/kapp/app-Makefile.am b/languages/ruby/app_templates/kapp/app-Makefile.am
new file mode 100644
index 00000000..bfe1c599
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app-Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = $(TOPSUBDIRS)
diff --git a/languages/ruby/app_templates/kapp/app-configure.in.in b/languages/ruby/app_templates/kapp/app-configure.in.in
new file mode 100644
index 00000000..7d849466
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app-configure.in.in
@@ -0,0 +1,45 @@
+#MIN_CONFIG(3.0.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, 0.1)
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+AC_PROG_MAKE_SET
+
+AC_CHECK_PROG(RUBY, ruby, ruby)
+
+if test -z "$RUBY"; then
+ DO_NOT_COMPILE="$DO_NOT_COMPILE qtruby"
+else
+ AC_MSG_CHECKING(for ruby dirs)
+ RUBY_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
+ RUBY_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
+ RUBY_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
+ RUBY_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
+ RUBY_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`
+ AC_MSG_RESULT([archdir $RUBY_ARCHDIR, sitearchdir $RUBY_SITEARCHDIR, sitedir $RUBY_SITEDIR, libdir $RUBY_LIBDIR, librubyarg $RUBY_LIBRUBYARG])
+ AC_SUBST(RUBY_ARCHDIR)
+ AC_SUBST(RUBY_SITEARCHDIR)
+ AC_SUBST(RUBY_SITEDIR)
+ AC_SUBST(RUBY_LIBDIR)
+ AC_SUBST(RUBY_LIBRUBYARG)
+fi
+
+# Korundum check
+AC_MSG_CHECKING([whether Korundum is installed])
+korundum_present=no
+cat >korundumtest.rb <<END
+require 'Korundum'
+END
+${RUBY} korundumtest.rb >/dev/null 2>&1 && korundum_present=yes
+AC_MSG_RESULT([$korundum_present])
+
+# rbuic check
+AC_PATH_PROG([RBUIC],[rbuic])
+if test -z "${RBUIC}" ; then
+ AC_MSG_ERROR([cannot find rbuic (part of the QtRuby package)])
+fi
+AC_SUBST([RBUIC])
+AC_SUBST([RUBY])
+
+
diff --git a/languages/ruby/app_templates/kapp/app.cpp b/languages/ruby/app_templates/kapp/app.cpp
new file mode 100644
index 00000000..8d6af02d
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app.cpp
@@ -0,0 +1,30 @@
+#include <ruby.h>
+
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <kinstance.h>
+#include <kstandarddirs.h>
+
+int main(int argc, char **argv) {
+ KInstance * instance = new KInstance("%{APPNAMELC}");
+ QString appdir = ::locate("data", "%{APPNAMELC}/main.rb", instance);
+ delete instance;
+ if (appdir.isNull()) {
+ qFatal("Error: Can't find \"%{APPNAMELC}/main.rb\"\n");
+ }
+ QFileInfo program(appdir);
+
+ char ** rubyargs = (char **) calloc(argc+4, sizeof(char *));
+ rubyargs[0] = strdup(argv[0]);
+ rubyargs[1] = strdup("-KU");
+ rubyargs[2] = strdup(QString("-C%1").arg(program.dirPath()).latin1());
+ rubyargs[3] = strdup(QString("-I%1").arg(program.dirPath()).latin1());
+ rubyargs[4] = strdup(program.fileName().latin1());
+ for (int i = 1; i < argc; i++) {
+ rubyargs[i+4] = argv[i];
+ }
+
+ ruby_init();
+ ruby_options(argc+4, rubyargs);
+ ruby_run();
+}
diff --git a/languages/ruby/app_templates/kapp/app.desktop b/languages/ruby/app_templates/kapp/app.desktop
new file mode 100644
index 00000000..c8e5c86a
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app.desktop
@@ -0,0 +1,44 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=ruby %{APPNAMELC}/main.rb %i -caption "%c"
+Icon=%{APPNAMELC}
+Type=Application
+X-DocPath=%{APPNAMELC}/%{APPNAMELC}.html
+Comment=A KDE KPart Application
+Comment[br]=Ur meziant Kpart evit KDE
+Comment[ca]=Una aplicació KPart per al KDE
+Comment[cy]=Cymhwysiad KPart KDE
+Comment[da]=Et KDE KPart-program
+Comment[de]=Eine auf der Komponententechnik KPart basierende KDE-Anwendung
+Comment[el]=Μια εφαÏμογή KPart του KDE
+Comment[es]=Una aplicación KPart de KDE
+Comment[et]=KDE KPart rakendus
+Comment[eu]=KDE KPart aplikazio bat
+Comment[fa]=یک کاربرد KDE KPart
+Comment[fr]=Une application KPart pour KDE
+Comment[ga]=Feidhmchlár KPart KDE
+Comment[gl]=Unha aplicación KPart de KDE
+Comment[hi]=à¤à¤• केडीई के-पारà¥à¤Ÿ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=KPart-alapú KDE-alkalmazás
+Comment[is]=KDE KPart forrit
+Comment[it]=Applicazione KPart di KDE
+Comment[ja]=KDE KPart アプリケーション
+Comment[lt]=KDE KPart programa
+Comment[nds]=En KPart-Deelprogramm för KDE
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ केडीई KPart अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een KDE KPart-toepassing
+Comment[pl]=Osadzalny element KPart KDE
+Comment[pt]=Uma Aplicação KPart do KDE
+Comment[pt_BR]=Um Aplicativo KPart do KDE
+Comment[ru]=Приложение KPart Ð´Ð»Ñ KDE
+Comment[sk]=KDE KPart aplikácia
+Comment[sl]=Program KPart za KDE
+Comment[sr]=KDE KPart програм
+Comment[sr@Latn]=KDE KPart program
+Comment[sv]=Ett KDE Kpart-program
+Comment[ta]=கெடி கெபாரà¯à®Ÿà¯ பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Ба кор андохтани KPart барои KDE
+Comment[tr]=Bir KDE KPart Uygulaması
+Comment[zh_CN]=一个 KDE KPart 应用程åº
+Comment[zh_TW]=KDE KPart 應用程å¼
+Terminal=false
diff --git a/languages/ruby/app_templates/kapp/app.kdevelop b/languages/ruby/app_templates/kapp/app.kdevelop
new file mode 100644
index 00000000..3a1efdd9
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app.kdevelop
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activedir/>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ </kdevautoproject>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwindows_bugs</toc>
+ </ignoretocs>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ <type ext="ui"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <charactercoding>3</charactercoding>
+ <mainprogram>src/main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/kapp/app.rb b/languages/ruby/app_templates/kapp/app.rb
new file mode 100644
index 00000000..470b0136
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app.rb
@@ -0,0 +1,216 @@
+=begin
+ This class serves as the main window for %{APPNAME}. It handles the
+ menus, toolbars, and status bars.
+
+ @short Main window class
+ @author %{AUTHOR} <%{EMAIL}>
+ @version %{VERSION}
+=end
+
+class %{APPNAMESC} < KDE::MainWindow
+
+ slots 'fileNew()',
+ 'fileOpen()',
+ 'fileSave()',
+ 'fileSaveAs()',
+ 'filePrint()',
+ 'optionsPreferences()',
+ 'changeStatusbar(const QString&)',
+ 'changeCaption(const QString&)'
+
+ def initialize()
+ super( nil, "%{APPNAMESC}" )
+ @view = %{APPNAMESC}View.new(self)
+ @printer = nil
+ # accept dnd
+ setAcceptDrops(true)
+
+ # tell the KDE::MainWindow that this is indeed the main widget
+ setCentralWidget(@view)
+
+ # then, setup our actions
+ setupActions()
+
+ # and a status bar
+ statusBar().show()
+
+ # Apply the create the main window and ask the mainwindow to
+ # automatically save settings if changed: window size, toolbar
+ # position, icon size, etc. Also to add actions for the statusbar
+ # toolbar, and keybindings if necessary.
+ setupGUI();
+
+ # allow the view to change the statusbar and caption
+ connect(@view, SIGNAL('signalChangeStatusbar(const QString&)'),
+ self, SLOT('changeStatusbar(const QString&)'))
+ connect(@view, SIGNAL('signalChangeCaption(const QString&)'),
+ self, SLOT('changeCaption(const QString&)'))
+
+ end
+
+
+ def load(url)
+ target = ""
+ # the below code is what you should normally do. in this
+ # example when, we want the url to our own. you probably
+ # want to use this code instead for your app
+
+ if false
+ # download the contents
+ if KIO::NetAccess.download(url, target, self)
+ # set our caption
+ setCaption(url.url)
+
+ # load in the file (target is always local)
+ @view.openURL(KDE::URL.new(target))
+
+ # and remove the temp file
+ KIO::NetAccess.removeTempFile(target)
+ end
+ end
+
+ setCaption(url.prettyURL())
+ @view.openURL(url)
+ end
+
+ def setupActions()
+ KDE::StdAction.openNew(self, SLOT('fileNew()'), actionCollection())
+ KDE::StdAction.open(self, SLOT('fileOpen()'), actionCollection())
+ KDE::StdAction.save(self, SLOT('fileSave()'), actionCollection())
+ KDE::StdAction.saveAs(self, SLOT('fileSaveAs()'), actionCollection())
+ KDE::StdAction.print(self, SLOT('filePrint()'), actionCollection())
+ KDE::StdAction.quit($kapp, SLOT('quit()'), actionCollection())
+
+ KDE::StdAction.preferences(self, SLOT('optionsPreferences()'), actionCollection())
+
+ # this doesn't do anything useful. it's just here to illustrate
+ # how to insert a custom menu and menu item
+ custom = KDE::Action.new(i18n("Cus&tom Menuitem"), KDE::Shortcut.new(),
+ self, SLOT('optionsPreferences()'),
+ actionCollection(), "custom_action")
+ end
+
+ def saveProperties(config)
+ # the 'config' object points to the session managed
+ # config file. anything you write here will be available
+ # later when this app is restored
+
+ if !@view.currentURL().empty?
+ config.writeEntry("lastURL", @view.currentURL())
+ end
+ end
+
+ def readProperties(config)
+ # the 'config' object points to the session managed
+ # config file. This function is automatically called whenever
+ # the app is being restored. read in here whatever you wrote
+ # in 'saveProperties'
+
+ url = config.readPathEntry("lastURL")
+
+ if !url.empty?
+ @view.openURL(KDE::URL.new(url))
+ end
+ end
+
+ def dragEnterEvent(event)
+ # accept uri drops only
+ event.accept(KDE::URLDrag.canDecode(event))
+ end
+
+ def dropEvent(event)
+ # This is a very simplistic implementation of a drop event. we
+ # will only accept a dropped URL. the Qt dnd code can do *much*
+ # much more, so please read the docs there
+ urls = []
+
+ # see if we can decode a URI.. if not, just ignore it
+ if KDE::URLDrag.decode(event, urls) && !urls.empty?
+ # okay, we have a URI.. process it
+ url = urls.shift
+
+ # load in the file
+ load(url)
+ end
+ end
+
+ def fileNew()
+ # This slot is called whenever the File.New menu is selected,
+ # the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ # button is clicked
+
+ # create a new window
+ %{APPNAMESC}.new.show()
+ end
+
+ def fileOpen()
+ # This slot is called whenever the File.Open menu is selected,
+ # the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
+ # button is clicked
+
+ # This brings up the generic open dialog
+ url = KDE::URLRequesterDlg.getURL(nil, self, i18n("Open Location") )
+
+ # standard filedialog
+ url = KDE::FileDialog.getOpenURL(nil, nil, self, i18n("Open Location"))
+ if !url.empty?
+ @view.openURL(url)
+ end
+ end
+
+ def fileSave()
+ # This slot is called whenever the File.Save menu is selected,
+ # the Save shortcut is pressed (usually CTRL+S) or the Save toolbar
+ # button is clicked
+
+ # save the current file
+ end
+
+ def fileSaveAs()
+ # This slot is called whenever the File.Save As menu is selected,
+ file_url = KDE::FileDialog.getSaveURL()
+ if !file_url.empty? && file_url.valid?
+ # save your info, here
+ end
+ end
+
+ def filePrint()
+ # This slot is called whenever the File.Print menu is selected,
+ # the Print shortcut is pressed (usually CTRL+P) or the Print toolbar
+ # button is clicked
+ if @printer.nil? then @printer = KDE::Printer.new end
+ if @printer.setup(self)
+ # setup the printer. with Qt, you always "print" to a
+ # Qt::Painter.. whether the output medium is a pixmap, a screen,
+ # or paper
+ p = Qt::Painter.new
+ p.begin(@printer)
+
+ # we let our view do the actual printing
+ metrics = Qt::PaintDeviceMetrics.new(@printer)
+ @view.print(p, metrics.height(), metrics.width())
+
+ # and send the result to the printer
+ p.end()
+ end
+ end
+
+ def optionsPreferences()
+ # popup some sort of preference dialog, here
+ dlg = %{APPNAMESC}Preferences.new
+ if dlg.exec()
+ # redo your settings
+ end
+ end
+
+ def changeStatusbar(text)
+ # display the text on the statusbar
+ statusBar().message(text)
+ end
+
+ def changeCaption(text)
+ # display the text on the caption
+ setCaption(text)
+ end
+
+end
diff --git a/languages/ruby/app_templates/kapp/app_client.rb b/languages/ruby/app_templates/kapp/app_client.rb
new file mode 100644
index 00000000..b08e9b21
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app_client.rb
@@ -0,0 +1,18 @@
+require 'Korundum'
+include KDE
+
+about = AboutData.new("%{APPNAMELC}_client", "%{APPNAME} client", "0.1")
+CmdLineArgs.init(ARGV, about)
+
+app = Application.new
+
+# get our DCOP client and attach so that we may use it
+client = app.dcopClient
+client.attach
+
+# do a 'send' for now
+dcopRef = DCOPRef.new("%{APPNAMELC}", "%{APPNAMESC}Iface")
+dcopRef.openURL("http://www.kde.org")
+
+app.exec
+
diff --git a/languages/ruby/app_templates/kapp/appiface.rb b/languages/ruby/app_templates/kapp/appiface.rb
new file mode 100644
index 00000000..a8be16b5
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/appiface.rb
@@ -0,0 +1,14 @@
+class %{APPNAMESC}Iface < KDE::DCOPObject
+
+ k_dcop 'void openURL(QString)'
+
+ def initialize(app)
+ super("%{APPNAMESC}Iface")
+ @app = app
+ end
+
+ def openURL(url)
+ @app.openURL(url)
+ end
+end
+
diff --git a/languages/ruby/app_templates/kapp/appui.rc b/languages/ruby/app_templates/kapp/appui.rc
new file mode 100644
index 00000000..ceb4f14e
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="custom"><text>C&amp;ustom</text>
+ <Action name="custom_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/ruby/app_templates/kapp/appview.rb b/languages/ruby/app_templates/kapp/appview.rb
new file mode 100644
index 00000000..bc5b5140
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/appview.rb
@@ -0,0 +1,103 @@
+
+=begin
+ This is the main view class for %{APPNAME}. Most of the non-menu,
+ non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ here.
+
+ This %{APPNAMELC} uses an HTML component as an example.
+
+ @short Main view
+ @author %{AUTHOR} <%{EMAIL}>
+ @version %{VERSION}
+=end
+class %{APPNAMESC}View < Qt::Widget
+
+ #
+ # Use this signal to change the content of the statusbar
+ #
+ signals 'signalChangeStatusbar(const QString&)'
+
+ #
+ # Use this signal to change the content of the caption
+ #
+ signals 'signalChangeCaption(const QString&)'
+
+ slots 'slotOnURL(const QString&)',
+ 'slotSetTitle(const QString&)'
+
+ def initialize(parent)
+ super(parent)
+
+ # keep a reference to the DCOP Interface so it doesn't get gc'd
+ @dcop = %{APPNAMESC}Iface.new(self)
+
+ # setup our layout manager to automatically add our widgets
+ top_layout = Qt::HBoxLayout.new(self)
+ top_layout.setAutoAdd(true)
+
+ # we want to look for all components that satisfy our needs. the
+ # trader will actually search through *all* registered KDE
+ # applications and components -- not just KParts. So we have to
+ # specify two things: a service type and a constraint
+ #
+ # the service type is like a mime type. we say that we want all
+ # applications and components that can handle HTML -- 'text/html'
+ #
+ # however, by itself, this will return such things as Netscape..
+ # not what we wanted. so we constrain it by saying that the
+ # string 'KParts/ReadOnlyPart' must be found in the ServiceTypes
+ # field. with this, only components of the type we want will be
+ # returned.
+ offers = KDE::Trader.self().query("text/html", "'KParts/ReadOnlyPart' in ServiceTypes")
+
+ factory = nil
+ # in theory, we only care about the first one.. but let's try all
+ # offers just in when the first can't be loaded for some reason
+ offers.each do |ptr|
+ # we now know that our offer can handle HTML and is a part.
+ # since it is a part, it must also have a library... let's try to
+ # load that now
+ factory = KDE::LibLoader.self().factory( ptr.library() )
+ if ! factory.nil?
+ @html = factory.create(self, ptr.name(), "KParts::ReadOnlyPart")
+ break
+ end
+ end
+
+ # if our factory is invalid, then we never found our component
+ # and we might as well just exit now
+ if factory.nil?
+ KDE::MessageBox.error(self, i18n("Could not find a suitable HTML component"))
+ return
+ end
+
+ connect(@html, SIGNAL('setWindowCaption(const QString&)'),
+ self, SLOT('slotSetTitle(const QString&)'))
+ connect(@html, SIGNAL('setStatusBarText(const QString&)'),
+ self, SLOT('slotOnURL(const QString&)'))
+
+ end
+
+
+ def print(p, height, width)
+ # do the actual printing, here
+ # p.drawText(etc..)
+ end
+
+ def currentURL()
+ return @html.url().url()
+ end
+
+ def openURL(url)
+ @html.openURL(KDE::URL.new(url))
+ end
+
+ def slotOnURL(url)
+ emit signalChangeStatusbar(url)
+ end
+
+ def slotSetTitle(title)
+ emit signalChangeCaption(title)
+ end
+
+end
diff --git a/languages/ruby/app_templates/kapp/kappruby.kdevtemplate b/languages/ruby/app_templates/kapp/kappruby.kdevtemplate
new file mode 100644
index 00000000..490d7591
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/kappruby.kdevtemplate
@@ -0,0 +1,238 @@
+# KDE Config File
+[General]
+Name=Application framework
+Name[ca]=Infraestructura d'aplicacions
+Name[da]=Programskelet
+Name[de]=Anwendungsgrundgerüst
+Name[el]=Πλαίσιο εφαÏμογής
+Name[es]=Infraestructura de aplicación
+Name[et]=Rakenduse raamistik
+Name[eu]=Aplikazioen lan-markoa
+Name[fa]=چارچوب کاربرد
+Name[fr]=Infrastructure d'application
+Name[ga]=Creatlach feidhmchláir
+Name[gl]=Entorno de traballo para aplicación
+Name[hu]=Alkalmazás-keretrendszer
+Name[it]=Infrastruttura applicativa
+Name[ja]=アプリケーションフレームワーク
+Name[nds]=Programmrahmenwark
+Name[ne]=अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— फà¥à¤°à¥‡à¤®à¤µà¤°à¥à¤•
+Name[nl]=Applicationframework
+Name[pl]=Szablon programu
+Name[pt]=Plataforma de aplicações
+Name[pt_BR]=Plataforma de aplicações
+Name[ru]=Приложение KDE
+Name[sk]=AplikaÄný framework
+Name[sl]=Ogrodje programa
+Name[sr]=Радни оквир програма
+Name[sr@Latn]=Radni okvir programa
+Name[sv]=Programramverk
+Name[tr]=Uygulama Çatısı
+Name[zh_CN]=应用程åºæ¡†æž¶
+Name[zh_TW]=應用程å¼æ¡†æž¶
+Icon=kapp.png
+Category=Ruby/KDE
+Comment=Generates a simple Korundum application with one toplevel window, menus and toolbars. A DCOP interface is also provided, so that your application can provide a scripting interface
+Comment[ca]=Genera una simple aplicació Korundum amb una finestra principal, menús i barres d'eines. També es proveeix la interfície DCOP, de manera que la vostra aplicació podrà proveir d'una interfície per a scripts
+Comment[da]=Generere et simpelt Korundum program med et vindue på topniveau, menuer og værktøjslinjer. Der sørges også for en DCOP-grænseflade, så dit program kan give en script-grænseflade
+Comment[de]=Erstellt eine einfache Korundum-Anwendung mit einem Toplevel-Fenster, Menüs und Werkzeugleisten. Dazu kommt eine DCOP-Schnittstelle, so dass Ihre Anwendung eine Schnittstelle für Skripte anbieten kann.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή Korundum με ένα ανώτεÏο παÏάθυÏο, Î¼ÎµÎ½Î¿Ï ÎºÎ±Î¹ γÏαμμές εÏγαλείων. ΠÏοσφέÏεται επίσης μια διασÏνδεση DCOP, έτσι ώστε η εφαÏμογή σας να Ï€ÏοσφέÏει ένα πεÏιβάλλον γÏαφής σεναÏίων
+Comment[es]=Genera una sencilla aplicación Korundum con una ventana principal, menús y barras de herramientas. También se proporciona una interfaz DCOP para que su aplicación pueda proporcionar una interfaz para guiones de órdenes.
+Comment[et]=Lihtsa Korundumi rakenduse loomine ühe tipptaseme akna, menüüde ja tööriistaribadega. Lisatakse ka DCOP-liides, mis võimaldab rakendusel pakkuda skriptikeelte toetust
+Comment[eu]=Goi-mailako lehio bat, menuak eta tresna-barrak dituen Korundum aplikazio sinple bat sortzen du . DCOP interfazea ere sortzen du, eta beraz, zure aplikazioak script-interfaze bat eskainiko du
+Comment[fa]=یک کاربرد سادۀ Korundum با یک پنجرۀ سطح بالا، گزینگان Ùˆ میله ابزارها تولید می‌کند. همچنین یک واسط DCOP Ùراهم است. بنابراین، کاربرد شما یک واسط دست‌نوشته‌ای را می‌تواند Ùراهم کند
+Comment[fr]=Génère une application Korundum simple comprenant une fenêtre de premier niveau, des menus et des barres d'outils. Une interface DCOP est également fournie, afin que votre application puisse offrir une interface de scriptage
+Comment[gl]=Xera unha aplicación sinxela Korundum cunha fiestra, menús e barras de ferramentas. Proporciónase tamén unha interface DCOP de modo que a súa aplicación poida ofrecer unha interface de scripting.
+Comment[hu]=Létrehoz egy egyszerű Korundum-alkalmazást egy főablakkal, menükkel és eszköztárakkal. DCOP-felület is tartozik az alkalmazáshoz, így könnyen kialakítható hozzá szkriptelési felület.
+Comment[it]=Genera una semplice applicazione Korundum con una finestra toplevel, menu e barre degli strumenti. È anche fornita un'interfaccia DCOP, così che l'applicazione può fornire una interfaccia di scripting
+Comment[nds]=Stellt en eenfach Korundum-Programm mit een böverst Finster, Menüs un Warktüüchbalkens op. Ok warrt noch en DCOP-Koppelsteed praatstellt, so dat Dien Programm en Skriptkoppelsteed anbeden kann.
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ उचà¥à¤š तह सञà¥à¤à¥à¤¯à¤¾à¤², मेनॠर उपकरणपटà¥à¤Ÿà¥€à¤¸à¤à¤— साधारण Korundum अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤› । DCOP इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸ पनि पà¥à¤°à¤¦à¤¾à¤¨ गरिनà¥à¤›, जसले गरà¥à¤¦à¤¾ तपाईà¤à¤•à¥‹ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤¿à¤™ इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨ सकà¥à¤› ।
+Comment[nl]=Dit genereert een eenvoudige Korundum-toepassing met één toplevel window, menu's en toolbars. Een DCOP-interface wordt ook aangeleverd, zodat uw toepassing een scripting interface kan aanleveren.
+Comment[pl]=Generuje prosty program Korundum z jednym oknem, menu i paskami narzędzi. Dostępny jest także interfejs DCOP, więc Twój program może umożliwiać korzystanie ze skryptów
+Comment[pt]=Gera uma aplicação Korundum simples com uma janela de topo, menus e barras de ferramentas. Também é fornecida uma interface de DCOP, para que a sua aplicação possa oferecer uma interface de programação
+Comment[pt_BR]=Gera uma aplicação Korundum simples com uma janela de topo, menus e barras de ferramentas. Também é fornecida uma interface de DCOP, para que a sua aplicação possa oferecer uma interface de programação
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Korundum Ñ Ð¾ÐºÐ½Ð¾Ð¼, меню, панелÑми инÑтрументов и ÑервиÑом DCOP
+Comment[sk]=Vygeneruje jednoduchú Korundum aplikáciu s jedným oknom, menu a panelom nástrojov. Taktiež bude poskytnuté DCOP rozhranie, takže aj aplikáciamôže poskytnúť skriptovacie rozhranie
+Comment[sr]=Прави једноÑтаван Korundum програм Ñа једним прозором највишег нивоа, менијима и тракама Ñа алатом. Дат је и DCOP интерфејÑ, тако да ваш програм може да омогући Ñкриптовање
+Comment[sr@Latn]=Pravi jednostavan Korundum program sa jednim prozorom najvišeg nivoa, menijima i trakama sa alatom. Dat je i DCOP interfejs, tako da vaš program može da omogući skriptovanje
+Comment[sv]=Skapar ett enkelt Korundum-program med ett toppnivåfönster, menyer och verktygsrader. Ett DCOP-gränssnitt tillhandahålls också, så att programmet kan tillhandahålla ett skriptgränssnitt.
+Comment[tr]=Bir üst seviye penceresi, menüleri ve araç çubukları olan basit bir Korundum uygulaması yaratır. Uygulamanızın bir betik arayüzü sağlayabilmesi için bir DCOP arayüzü de sağlanmıştır.
+Comment[zh_TW]=產生一個簡單的 Korundum 應用程å¼ï¼Œå…§å«é ‚層視窗ã€é¸å–®èˆ‡å·¥å…·åˆ—。å¦å¤–æ供一個 DCOP 介é¢ï¼Œè®“您的應用程å¼å¯ä»¥ä½¿ç”¨æ–‡ç¨¿ä»‹é¢ã€‚
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.rb
+Archive=kappruby.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{src}/app-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE13]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE14]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE16]
+Type=install
+Source=%{src}/app.rb
+Dest=%{dest}/src/%{APPNAMELC}.rb
+
+[FILE17]
+Type=install
+Source=%{src}/appview.rb
+Dest=%{dest}/src/%{APPNAMELC}view.rb
+
+[FILE18]
+Type=install
+Source=%{src}/appiface.rb
+Dest=%{dest}/src/%{APPNAMELC}iface.rb
+
+[FILE19]
+Type=install
+Source=%{src}/app_client.rb
+Dest=%{dest}/src/%{APPNAMELC}_client.rb
+
+[FILE20]
+Type=install
+Source=%{src}/pref.rb
+Dest=%{dest}/src/pref.rb
+
+[FILE21]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/src/main.rb
+
+[FILE22]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE23]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/src/README
+
+[MSG]
+Type=message
+Comment=A Korundum Application was created at %{dest}
+Comment[ca]=Una aplicació Korundum ha estat creada a %{dest}
+Comment[da]=Et Korundum program blev oprettet i %{dest}
+Comment[de]=Eine Korundum-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή Korundum δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación Korundum ha sido creada en %{dest}
+Comment[et]=Korundumi rakendus loodi asukohta %{dest}
+Comment[eu]=Korundum aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد Korundum در %{dest} ایجاد شد
+Comment[fr]=Une application Korundum a été créée dans %{dest}
+Comment[ga]=Cruthaíodh Feidhmchlár Korundum ag %{dest}
+Comment[gl]=Creouse unha aplicación Korundum en %{dest}
+Comment[hu]=Létrejött egy Korundum-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Korundum in %{dest}
+Comment[ja]=Korundum アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Korundum-Programm opstellt.
+Comment[ne]=Korundum अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Korundum-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program Korundum został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação Korundum em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação Korundum em %{dest}
+Comment[ru]=Приложение Korundum Ñоздано в %{dest}
+Comment[sk]=Korundum aplikácia bola vytvorená v %{dest}
+Comment[sr]=Korundum програм је направљен у %{dest}
+Comment[sr@Latn]=Korundum program je napravljen u %{dest}
+Comment[sv]=Ett Korundum-program skapades i %{dest}
+Comment[tr]=Bir Korundum Uygulaması %{dest} içinde yaratıldı.
+Comment[zh_TW]=一個 Korundum 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/ruby/app_templates/kapp/kappruby.png b/languages/ruby/app_templates/kapp/kappruby.png
new file mode 100644
index 00000000..913ebb87
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/kappruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/kapp/main.rb b/languages/ruby/app_templates/kapp/main.rb
new file mode 100644
index 00000000..31d5e868
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/main.rb
@@ -0,0 +1,40 @@
+#!/usr/bin/env ruby
+
+require 'Korundum'
+
+require '%{APPNAMELC}iface.rb'
+require '%{APPNAMELC}.rb'
+require '%{APPNAMELC}view.rb'
+require 'pref.rb'
+
+description = I18N_NOOP("A KDE Application")
+version = "%{VERSION}"
+options = [ [ "+[URL]", I18N_NOOP( "Document to open" ), "" ] ]
+
+about = KDE::AboutData.new("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KDE::AboutData.License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", nil, nil, "%{EMAIL}")
+about.addAuthor( "%{AUTHOR}", nil, "%{EMAIL}" )
+KDE::CmdLineArgs.init(ARGV, about)
+KDE::CmdLineArgs.addCmdLineOptions(options)
+app = KDE::Application.new
+
+# see if we are starting with session management
+if app.restored?
+ RESTORE(%{APPNAMESC})
+else
+ # no session.. just start up normally
+ args = KDE::CmdLineArgs.parsedArgs
+ if args.count == 0
+ widget = %{APPNAMESC}.new
+ widget.show
+ else
+ for i in 0...args.count do
+ widget = %{APPNAMESC}.new
+ widget.show
+ widget.load(args.url(i))
+ end
+ end
+end
+
+app.exec
+
diff --git a/languages/ruby/app_templates/kapp/pref.rb b/languages/ruby/app_templates/kapp/pref.rb
new file mode 100644
index 00000000..98669ad2
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/pref.rb
@@ -0,0 +1,38 @@
+
+class %{APPNAMESC}Preferences < KDE::DialogBase
+
+ def initialize()
+ super(TreeList, i18n("%{APPNAMESC} Preferences"),
+ Help|Default|Ok|Apply|Cancel, Ok)
+ # this is the base class for your preferences dialog. it is now
+ # a Treelist dialog.. but there are a number of other
+ # possibilities (including Tab, Swallow, and just Plain)
+ frame = addPage(i18n("First Page"), i18n("Page One Options"))
+ @pageOne = %{APPNAMESC}PrefPageOne.new(frame)
+
+ frame = addPage(i18n("Second Page"), i18n("Page Two Options"))
+ @pageTwo = %{APPNAMESC}PrefPageTwo.new(frame)
+ end
+end
+
+class %{APPNAMESC}PrefPageOne < Qt::Frame
+
+ def initialize(parent)
+ super(parent)
+ layout = Qt::HBoxLayout.new(self)
+ layout.setAutoAdd(true)
+
+ Qt::Label.new(i18n("Add something here"), self)
+ end
+end
+
+class %{APPNAMESC}PrefPageTwo < Qt::Frame
+
+ def initialize(parent)
+ super(parent)
+ layout = Qt::HBoxLayout.new(self)
+ layout.setAutoAdd(true)
+
+ Qt::Label.new(i18n("Add something here"), self)
+ end
+end
diff --git a/languages/ruby/app_templates/kapp/src-Makefile.am b/languages/ruby/app_templates/kapp/src-Makefile.am
new file mode 100644
index 00000000..d27aa6b3
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/src-Makefile.am
@@ -0,0 +1,43 @@
+## Makefile.am for %{APPNAMELC}
+
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes) -I$(RUBY_ARCHDIR)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries) $(KDE_RPATH) -L$(RUBY_LIBDIR)
+
+# the libraries to link against.
+%{APPNAMELC}_LDADD = $(LIB_KFILE) $(LIB_KDEPRINT) $(RUBY_LIBRUBYARG)
+
+# which sources should be compiled for %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+KDE_ICON = AUTO
+
+# this is where the kdelnk file will go
+kdelnkdir = $(kde_appsdir)/Utilities
+kdelnk_DATA = %{APPNAMELC}.desktop
+
+# this is where the XML-GUI resource file goes
+rcdir = $(kde_datadir)/%{APPNAMELC}
+rc_DATA = %{APPNAMELC}ui.rc
+
+rubysrc_DATA = main.rb %{APPNAMELC}.rb %{APPNAMELC}_client.rb %{APPNAMELC}iface.rb \
+ %{APPNAMELC}view.rb pref.rb
+
+rubysrcdir = $(kde_datadir)/%{APPNAMELC}
+
+rubyui_DATA =
+
+rubyuidir = $(kde_datadir)/%{APPNAMELC}
+
+%.rb: %.ui
+ $(RBUIC) -tr ${UIC_TR} -kde $< -o $@
+
diff --git a/languages/ruby/app_templates/kapp/subdirs b/languages/ruby/app_templates/kapp/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/ruby/app_templates/kxt/Makefile.am b/languages/ruby/app_templates/kxt/Makefile.am
new file mode 100644
index 00000000..b642b88b
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/Makefile.am
@@ -0,0 +1,20 @@
+dataFiles = app.rb main.rb prefs.rb app.cpp appview.rb appview_base.ui prefs-base.ui \
+ appui.rc app.desktop kxtruby.png app.kdevelop \
+ app-Makefile.am app-configure.in.in \
+ app.kcfg settings.kcfgc src-Makefile.am subdirs README
+
+templateName = kxtruby
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/kxt/README b/languages/ruby/app_templates/kxt/README
new file mode 100644
index 00000000..490ddab8
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/README
@@ -0,0 +1,38 @@
+KConfig XT Ruby template quick start
+Author: Anne-Marie Mahfouf
+Date: 2006-12-12
+-----------------------------------------------
+
+This README file explains you some basic things for starting with
+this application template, a KConfig XT Ruby template.
+-----------------------------------------------
+
+-- REQUIREMENTS --
+you need
+- Qt version might be 3.3.4 or 3.3.5.
+- kdelibs 3.5 and kdelibs headers 3.5 (devel package) in order to build this template.
+- Korundum either from your distribution or from the kdebindings module or also
+from
+http://rubyforge.org/projects/korundum/.
+
+-----------------------------------------------
+
+-- BUILD --
+In KDevelop Build menu choose:
+Run automake & friends
+Run Configure
+Build Project
+Install (or Install as root)
+-----------------------------------------------
+
+-- RUN --
+You will see that the Build menu in KDevelop is now adapted to Ruby.
+In the Build menu, choose
+Run or use Shift + F9 to see your project running.
+
+-----------------------------------------------
+
+-- RELEVANT LINK --
+http://developer.kde.org/language-bindings/ruby/index.html
+
+In KDevelop Documentation, you can find a Ruby tutorial. \ No newline at end of file
diff --git a/languages/ruby/app_templates/kxt/app-Makefile.am b/languages/ruby/app_templates/kxt/app-Makefile.am
new file mode 100644
index 00000000..bfe1c599
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app-Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = $(TOPSUBDIRS)
diff --git a/languages/ruby/app_templates/kxt/app-configure.in.in b/languages/ruby/app_templates/kxt/app-configure.in.in
new file mode 100644
index 00000000..7d849466
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app-configure.in.in
@@ -0,0 +1,45 @@
+#MIN_CONFIG(3.0.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, 0.1)
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+AC_PROG_MAKE_SET
+
+AC_CHECK_PROG(RUBY, ruby, ruby)
+
+if test -z "$RUBY"; then
+ DO_NOT_COMPILE="$DO_NOT_COMPILE qtruby"
+else
+ AC_MSG_CHECKING(for ruby dirs)
+ RUBY_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
+ RUBY_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
+ RUBY_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
+ RUBY_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
+ RUBY_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`
+ AC_MSG_RESULT([archdir $RUBY_ARCHDIR, sitearchdir $RUBY_SITEARCHDIR, sitedir $RUBY_SITEDIR, libdir $RUBY_LIBDIR, librubyarg $RUBY_LIBRUBYARG])
+ AC_SUBST(RUBY_ARCHDIR)
+ AC_SUBST(RUBY_SITEARCHDIR)
+ AC_SUBST(RUBY_SITEDIR)
+ AC_SUBST(RUBY_LIBDIR)
+ AC_SUBST(RUBY_LIBRUBYARG)
+fi
+
+# Korundum check
+AC_MSG_CHECKING([whether Korundum is installed])
+korundum_present=no
+cat >korundumtest.rb <<END
+require 'Korundum'
+END
+${RUBY} korundumtest.rb >/dev/null 2>&1 && korundum_present=yes
+AC_MSG_RESULT([$korundum_present])
+
+# rbuic check
+AC_PATH_PROG([RBUIC],[rbuic])
+if test -z "${RBUIC}" ; then
+ AC_MSG_ERROR([cannot find rbuic (part of the QtRuby package)])
+fi
+AC_SUBST([RBUIC])
+AC_SUBST([RUBY])
+
+
diff --git a/languages/ruby/app_templates/kxt/app.cpp b/languages/ruby/app_templates/kxt/app.cpp
new file mode 100644
index 00000000..8d6af02d
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.cpp
@@ -0,0 +1,30 @@
+#include <ruby.h>
+
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <kinstance.h>
+#include <kstandarddirs.h>
+
+int main(int argc, char **argv) {
+ KInstance * instance = new KInstance("%{APPNAMELC}");
+ QString appdir = ::locate("data", "%{APPNAMELC}/main.rb", instance);
+ delete instance;
+ if (appdir.isNull()) {
+ qFatal("Error: Can't find \"%{APPNAMELC}/main.rb\"\n");
+ }
+ QFileInfo program(appdir);
+
+ char ** rubyargs = (char **) calloc(argc+4, sizeof(char *));
+ rubyargs[0] = strdup(argv[0]);
+ rubyargs[1] = strdup("-KU");
+ rubyargs[2] = strdup(QString("-C%1").arg(program.dirPath()).latin1());
+ rubyargs[3] = strdup(QString("-I%1").arg(program.dirPath()).latin1());
+ rubyargs[4] = strdup(program.fileName().latin1());
+ for (int i = 1; i < argc; i++) {
+ rubyargs[i+4] = argv[i];
+ }
+
+ ruby_init();
+ ruby_options(argc+4, rubyargs);
+ ruby_run();
+}
diff --git a/languages/ruby/app_templates/kxt/app.desktop b/languages/ruby/app_templates/kxt/app.desktop
new file mode 100644
index 00000000..8b36e6e0
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.desktop
@@ -0,0 +1,40 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+Icon=%{APPNAMELC}
+Type=Application
+Comment=A simple KDE Application
+Comment[br]=Ur meziant eeun evit KDE
+Comment[ca]=Una simple aplicació per al KDE
+Comment[da]=Et simpelt KDE program
+Comment[de]=Eine einfache KDE-Anwendung
+Comment[el]=Μια απλή εφαÏμογή του KDE
+Comment[es]=Una aplicación de KDE sencilla
+Comment[et]=Lihtne KDE rakendus
+Comment[eu]=KDE aplikazio simple bat
+Comment[fa]=یک کاربرد سادۀ KDE
+Comment[fr]=Une application simple pour KDE
+Comment[ga]=Feidhmchlár Simplí KDE
+Comment[gl]=Unha aplicación KDE sinxela
+Comment[hi]=à¤à¤• सादा केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[hu]=Egyszerű KDE-alkalmazás
+Comment[is]=Einfalt KDE forrit
+Comment[it]=Una semplice applicazione KDE
+Comment[ja]=ç°¡å˜ãª KDE アプリケーション
+Comment[nds]=En eenfach KDE-Programm
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Comment[nl]=Een eenvoudige KDE-toepassing
+Comment[pl]=Prosty program KDE
+Comment[pt]=Uma aplicação simples do KDE
+Comment[pt_BR]=Um simples Aplicativo do KDE
+Comment[ru]=ПроÑтое приложение KDE
+Comment[sk]=Jednoduchá KDE aplikácia
+Comment[sl]=Preprost program za KDE
+Comment[sr]=ЈедноÑтаван KDE програм
+Comment[sr@Latn]=Jednostavan KDE program
+Comment[sv]=Ett enkelt KDE-program
+Comment[ta]=ஒர௠சாதாரண கெடிஇ பயனà¯à®ªà®¾à®Ÿà¯
+Comment[tg]=Гузориши оддиKDE
+Comment[tr]=Basit bir KDE Uygulaması
+Comment[zh_CN]=一个简å•çš„ KDE 应用程åº
+Comment[zh_TW]=簡單的 KDE 應用程å¼
diff --git a/languages/ruby/app_templates/kxt/app.kcfg b/languages/ruby/app_templates/kxt/app.kcfg
new file mode 100644
index 00000000..d5325b92
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.kcfg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="%{APPNAME}rc"/>
+ <group name="Preferences">
+ <entry name="col_background" type="Color">
+ <label>color of the background</label>
+ <default>black</default>
+ </entry>
+ <entry name="col_foreground" type="Color">
+ <label>color of the foreground</label>
+ <default>yellow</default>
+ </entry>
+ <entry name="val_time" type="Int">
+ <label>size of a ball</label>
+ <default>2</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/languages/ruby/app_templates/kxt/app.kdevelop b/languages/ruby/app_templates/kxt/app.kdevelop
new file mode 100644
index 00000000..3a1efdd9
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.kdevelop
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activedir/>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ </kdevautoproject>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwindows_bugs</toc>
+ </ignoretocs>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ <type ext="ui"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <charactercoding>3</charactercoding>
+ <mainprogram>src/main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/kxt/app.rb b/languages/ruby/app_templates/kxt/app.rb
new file mode 100644
index 00000000..39da5345
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.rb
@@ -0,0 +1,94 @@
+=begin
+ This class serves as the main window for %{APPNAME}. It handles the
+ menus, toolbars, and status bars.
+
+ @short Main window class
+ @author %{AUTHOR} <%{EMAIL}>
+ @version %{VERSION}
+=end
+
+class %{APPNAMESC} < KDE::MainWindow
+
+ slots 'fileNew()',
+ 'optionsPreferences()',
+ 'newToolbarConfig()',
+ 'changeStatusbar(const QString&)',
+ 'changeCaption(const QString&)'
+
+ def initialize()
+ super( nil, "%{APPNAMESC}" )
+ Settings.instance.readConfig
+ @view = %{APPNAMESC}View.new(self)
+ @printer = nil
+
+ # accept dnd
+ setAcceptDrops(true)
+
+ # tell the KDE::MainWindow that this is indeed the main widget
+ setCentralWidget(@view)
+
+ # then, setup our actions
+ setupActions()
+
+ # and a status bar
+ statusBar().show()
+
+ # Apply the create the main window and ask the mainwindow to
+ # automatically save settings if changed: window size, toolbar
+ # position, icon size, etc. Also to add actions for the statusbar
+ # toolbar, and keybindings if necessary.
+ setupGUI();
+
+ # allow the view to change the statusbar and caption
+ connect(@view, SIGNAL('signalChangeStatusbar(const QString&)'),
+ self, SLOT('changeStatusbar(const QString&)'))
+ connect(@view, SIGNAL('signalChangeCaption(const QString&)'),
+ self, SLOT('changeCaption(const QString&)'))
+
+ end
+
+ def setupActions()
+ KDE::StdAction.openNew(self, SLOT('fileNew()'), actionCollection())
+ KDE::StdAction.quit($kapp, SLOT('quit()'), actionCollection())
+
+ KDE::StdAction.preferences(self, SLOT('optionsPreferences()'), actionCollection())
+
+ # this doesn't do anything useful. it's just here to illustrate
+ # how to insert a custom menu and menu item
+ custom = KDE::Action.new(i18n("Swi&tch Colors"), KDE::Shortcut.new(),
+ @view, SLOT('switchColors()'),
+ actionCollection(), "switch_action")
+ end
+
+ def fileNew()
+ # This slot is called whenever the File.New menu is selected,
+ # the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ # button is clicked
+
+ # create a new window
+ %{APPNAMESC}.new.show()
+ end
+
+ def optionsPreferences()
+ # The preference dialog is derived from prefs-base.ui which is subclassed into Prefs
+ #
+ # compare the names of the widgets in the .ui file
+ # to the names of the variables in the .kcfg file
+ dialog = KDE::ConfigDialog.new(self, "settings", Settings.instance, KDE::DialogBase::Swallow)
+ dialog.addPage(Prefs.new(), i18n("General"), "package_settings")
+ connect(dialog, SIGNAL('settingsChanged()'), @view, SLOT('settingsChanged()'))
+ dialog.show()
+
+ end
+
+ def changeStatusbar(text)
+ # display the text on the statusbar
+ statusBar().message(text)
+ end
+
+ def changeCaption(text)
+ # display the text on the caption
+ setCaption(text)
+ end
+
+end
diff --git a/languages/ruby/app_templates/kxt/appui.rc b/languages/ruby/app_templates/kxt/appui.rc
new file mode 100644
index 00000000..06549878
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="move"><text>&amp;Move</text>
+ <Action name="switch_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/ruby/app_templates/kxt/appview.rb b/languages/ruby/app_templates/kxt/appview.rb
new file mode 100644
index 00000000..391f4c37
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/appview.rb
@@ -0,0 +1,55 @@
+
+=begin
+ This is the main view class for %{APPNAME}. Most of the non-menu,
+ non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ here.
+
+ This %{APPNAMELC} uses an HTML component as an example.
+
+ @short Main view
+ @author %{AUTHOR} <%{EMAIL}>
+ @version %{VERSION}
+=end
+class %{APPNAMESC}View < %{APPNAMESC}view_base
+
+ #
+ # Use this signal to change the content of the statusbar
+ #
+ signals 'signalChangeStatusbar(const QString&)'
+
+ #
+ # Use this signal to change the content of the caption
+ #
+ signals 'signalChangeCaption(const QString&)'
+
+ slots 'switchColors()',
+ 'settingsChanged()'
+
+ def initialize(parent)
+ super(parent)
+
+ settingsChanged()
+ end
+
+ def switchColors()
+ color = Settings.instance.col_background
+ Settings.instance.setCol_background( Settings.instance.col_foreground )
+ Settings.instance.setCol_foreground( color )
+
+ settingsChanged()
+ end
+
+ def settingsChanged()
+ sillyLabel.setPaletteBackgroundColor( Settings.instance.col_background )
+ sillyLabel.setPaletteForegroundColor( Settings.instance.col_foreground )
+ # i18n : internationallization
+ sillyLabel.setText( i18n("This project is %d days old" % Settings.instance.val_time) )
+
+ emit signalChangeStatusbar( i18n("Settings changed") )
+ end
+
+ def slotSetTitle(title)
+ emit signalChangeCaption(title)
+ end
+
+end
diff --git a/languages/ruby/app_templates/kxt/appview_base.ui b/languages/ruby/app_templates/kxt/appview_base.ui
new file mode 100644
index 00000000..78009d08
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/appview_base.ui
@@ -0,0 +1,33 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>%{APPNAME}view_base</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>%{APPNAMESC}view_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>268</width>
+ <height>164</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>%{APPNAMESC}_base</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>sillyLabel</cstring>
+ </property>
+ <property name="text">
+ <string>hello, world</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/ruby/app_templates/kxt/kxtruby.kdevtemplate b/languages/ruby/app_templates/kxt/kxtruby.kdevtemplate
new file mode 100644
index 00000000..fd2a5c1a
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/kxtruby.kdevtemplate
@@ -0,0 +1,251 @@
+# KDE Config File
+[General]
+
+Name=KConfig XT application
+Name[ca]=Aplicació KConfig XT
+Name[da]=KConfig XT program
+Name[de]=KConfigXT-Anwendung
+Name[el]=ΕφαÏμογή KConfig XT
+Name[es]=Aplicación KConfig XT
+Name[et]=KConfig XT rakendus
+Name[eu]=KConfig XT aplikazioa
+Name[fa]=کاربرد KConfig XT
+Name[fr]=Application KConfig XT
+Name[ga]=Feidhmchlár XT KConfig
+Name[gl]=Aplicación KConfig XT
+Name[hu]=KConfig XT-alapú alkalmazás
+Name[it]=Applicazione KConfig XT
+Name[ja]=KConfig XT アプリケーション
+Name[nds]=KConfig-XT-Programm
+Name[ne]=KConfig XT अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=KConfig XT-toepassing
+Name[pl]=Program KConfig XT
+Name[pt]=Aplicação do KConfig XT
+Name[pt_BR]=Aplicação do KConfig XT
+Name[ru]=Приложение KDE Ñ KConfig XT
+Name[sk]=KConfig XT aplikácia
+Name[sr]=KConfig XT програм
+Name[sr@Latn]=KConfig XT program
+Name[sv]=KConfig XT-program
+Name[tr]=KConfig XT uygulaması
+Name[zh_CN]=KConfig XT 应用程åº
+Name[zh_TW]=KConfig XT 應用程å¼
+Category=Ruby/KDE
+Icon=kxtruby.png
+Comment=Generates a simple KDE application with one widget and a configuration dialog
+Comment[ca]=Genera una simple aplicació per al KDE amb un estri i un diàleg de configuració
+Comment[da]=Genererer et simpelt KDE-program med en kontrol og en indstillingsdialog
+Comment[de]=Erstellt eine einfache KDE-Anwendung mit einem Widget und einem Einstellungsdialog.
+Comment[el]=ΔημιουÏγεί μια απλή εφαÏμογή KDE με ένα γÏαφικό συστατικό, ένα διάλογο ÏÏθμισης
+Comment[en_GB]=Generates a simple KDE application with one widget and a configuration dialogue
+Comment[es]=Genera una sencilla aplicación para KDE con una ventana y un diálogo de configuración
+Comment[et]=Lihtsa KDE rakenduse loomine ühe vidina ja seadistustedialoogiga.
+Comment[eu]=Trepeta bat eta konfigurazio elkarrizketa-koadro bat duen KDE aplikazio sinple bat sortzen du
+Comment[fa]=یک کاربرد سادۀ KDE، با یک عنصر و یک محاورۀ پیکربندی تولید می‌کند
+Comment[fr]=Génère une application KDE simple comprenant un seul élément graphique (widget) et une boîte de dialogue de configuration
+Comment[ga]=Cruthaíonn sé seo feidhmchlár simplí KDE le giuirléid amháin agus dialóg chumraíochta
+Comment[gl]=Xera unha aplicación KDE sinxela cunha compoñente e un diálogo de configuración
+Comment[hu]=Létrehoz egy egyszerű KDE-alkalmazást egy grafikus elemmel és egy beállítóablakkal
+Comment[it]=Genera una semplice applicazione KDE con un elemento grafico e una finestra di configurazione
+Comment[ja]=一ã¤ã®ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆã¨è¨­å®šãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’å«ã‚€ç°¡å˜ãª KDE アプリケーションを作æˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach KDE-Programm mit een Element un en Instelldialoog op
+Comment[ne]=à¤à¤‰à¤Ÿà¤¾ विगेट र कनà¥à¤«à¤¿à¤—रेसन संवादसà¤à¤— साधारण केडीई अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudige KDE-toepassing met één widget en een configuratiedialoog
+Comment[pl]=Generuje prosty program KDE z jednym widgetem i oknem konfiguracyjnym
+Comment[pt]=Gera uma aplicação simples do KDE com uma janela principal e outra para configuração
+Comment[pt_BR]=Gera uma aplicação simples do KDE com uma janela principal e outra para configuração
+Comment[ru]=Создание Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ KDE Ñ Ð¾ÐºÐ½Ð¾Ð¼ конфигурации
+Comment[sk]=Vygeneruje jednoduchú KDE aplikáciu s jedným oknom a konfiguraÄným dialógom
+Comment[sr]=Прави једноÑтаван KDE програм Ñа једном контролом и дијалогом за подешавање
+Comment[sr@Latn]=Pravi jednostavan KDE program sa jednom kontrolom i dijalogom za podešavanje
+Comment[sv]=Skapar ett enkelt KDE-program med en grafisk komponent och en inställningsdialogruta
+Comment[tr]=Bir parçacığı ve ayar penceresi olan basit bir KDE uygulaması yaratır.
+Comment[zh_CN]=生æˆå¸¦ä¸€ä¸ªéƒ¨ä»¶å’Œä¸€ä¸ªé…置对è¯æ¡†çš„ç®€å• KDE 应用程åº
+Comment[zh_TW]=產生一個簡單的 KDE 應用程å¼ï¼Œå…§å«ä¸€å€‹å…ƒä»¶èˆ‡ä¸€å€‹è¨­å®šå°è©±æ¡†ã€‚
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.rb,%{dest}/src/README
+Archive=kxtruby.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{src}/app-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE13]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE14]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE16]
+Type=install
+Source=%{src}/app.rb
+Dest=%{dest}/src/%{APPNAMELC}.rb
+
+[FILE17]
+Type=install
+Source=%{src}/appview.rb
+Dest=%{dest}/src/%{APPNAMELC}view.rb
+
+[FILE18]
+Type=install
+Source=%{src}/appview_base.ui
+Dest=%{dest}/src/appview_base.ui
+
+[FILE19]
+Type=install
+Source=%{src}/prefs-base.ui
+Dest=%{dest}/src/prefs-base.ui
+
+[FILE20]
+Type=install
+Source=%{src}/prefs.rb
+Dest=%{dest}/src/prefs.rb
+
+[FILE21]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/src/main.rb
+
+[FILE22]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE23]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/src/README
+
+[FILE24]
+Type=install
+Source=%{src}/app.kcfg
+Dest=%{dest}/src/%{APPNAMELC}.kcfg
+
+[FILE25]
+Type=install
+Source=%{src}/settings.kcfgc
+Dest=%{dest}/src/settings.kcfgc
+
+[MSG]
+Type=message
+Comment=A Korundum KConfig XT Application was created at %{dest}
+Comment[ca]=Una aplicació Korundum amb KConfig XT ha estat creada a %{dest}
+Comment[da]=Et Korundum KConfig XT program blev oprettet i %{dest}
+Comment[de]=Eine Korundum-KConfig-XT-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή Korundum KConfig XT δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación Korundum con KConfig XT ha sido creada en %{dest}
+Comment[et]=Korundumi KConfig XT rakendus loodi asukohta %{dest}
+Comment[eu]=Korundum KConfig XT aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد Korundum KConfig XT در %{dest} ایجاد شد
+Comment[fr]=Une application KConfig XT Korundum a été créée dans %{dest}
+Comment[ga]=Cruthaíodh Feidhmchlár Korundum KConfig XT ag %{dest}
+Comment[gl]=Creouse unha aplicación KConfig XT con Korundum en %{dest}
+Comment[hu]=Létrejött egy Korundum-alapú KConfig XT-s alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Korundum KConfig XT in %{dest}
+Comment[ja]=Korundum KConfig XT アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en Korundum/KConfig-XT-Programm opstellt.
+Comment[ne]=Korundum KConfig XT अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een Korundum KConfig XT-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program Korundum KConfig XT został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação Korundum com KConfig XT em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação Korundum com KConfig XT em %{dest}
+Comment[ru]=Приложение Korundum Ñ KConfig XT Ñоздано в %{dest}
+Comment[sk]=Korundim KConfig XT aplikácia bola vytvorená v %{dest}
+Comment[sr]=Korundum KConfig XT програм направљен је у %{dest}
+Comment[sr@Latn]=Korundum KConfig XT program napravljen je u %{dest}
+Comment[sv]=Ett Korundum KConfig XT-program skapades i %{dest}
+Comment[tr]=Bir Korundum KConfig XT uygulaması %{dest} içinde yaratıldı.
+Comment[zh_TW]=一個 Korundum KConfig XT 應用程å¼å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/ruby/app_templates/kxt/kxtruby.png b/languages/ruby/app_templates/kxt/kxtruby.png
new file mode 100644
index 00000000..419dfa33
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/kxtruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/kxt/main.rb b/languages/ruby/app_templates/kxt/main.rb
new file mode 100644
index 00000000..930bff4f
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/main.rb
@@ -0,0 +1,41 @@
+#!/usr/bin/env ruby
+
+require 'Korundum'
+
+require '%{APPNAMELC}.rb'
+require 'prefs-base.rb'
+require 'prefs.rb'
+require 'settings.rb'
+require 'appview_base.rb'
+require '%{APPNAMELC}view.rb'
+
+description = I18N_NOOP("A KDE Application")
+version = "%{VERSION}"
+options = [ [ "+[URL]", I18N_NOOP( "Document to open" ), "" ] ]
+
+about = KDE::AboutData.new("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KDE::AboutData.License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", nil, nil, "%{EMAIL}")
+about.addAuthor( "%{AUTHOR}", nil, "%{EMAIL}" )
+KDE::CmdLineArgs.init(ARGV, about)
+KDE::CmdLineArgs.addCmdLineOptions(options)
+app = KDE::Application.new
+
+# see if we are starting with session management
+if app.restored?
+ RESTORE(%{APPNAMESC})
+else
+ # no session.. just start up normally
+ args = KDE::CmdLineArgs.parsedArgs
+ if args.count == 0
+ widget = %{APPNAMESC}.new
+ widget.show
+ else
+ for i in 0...args.count do
+ widget = %{APPNAMESC}.new
+ widget.show
+ end
+ end
+end
+
+app.exec
+
diff --git a/languages/ruby/app_templates/kxt/prefs-base.ui b/languages/ruby/app_templates/kxt/prefs-base.ui
new file mode 100644
index 00000000..5c0fc860
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/prefs-base.ui
@@ -0,0 +1,127 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>Prefs_base</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Prefs_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>282</width>
+ <height>156</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Background color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_col_background</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Project age:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Foreground color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="1" column="1">
+ <property name="name">
+ <cstring>kcfg_col_foreground</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox" row="2" column="1">
+ <property name="name">
+ <cstring>kcfg_val_time</cstring>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/ruby/app_templates/kxt/prefs.rb b/languages/ruby/app_templates/kxt/prefs.rb
new file mode 100644
index 00000000..1469687e
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/prefs.rb
@@ -0,0 +1,7 @@
+
+class Prefs < Prefs_base
+
+ def initialize()
+ super()
+ end
+end
diff --git a/languages/ruby/app_templates/kxt/previewruby.png b/languages/ruby/app_templates/kxt/previewruby.png
new file mode 100644
index 00000000..e235c9cf
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/previewruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/kxt/settings.kcfgc b/languages/ruby/app_templates/kxt/settings.kcfgc
new file mode 100644
index 00000000..384510cd
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/settings.kcfgc
@@ -0,0 +1,6 @@
+# Code generation options for kconfig_compiler
+File=%{APPNAMELC}.kcfg
+ClassName=Settings
+Singleton=true
+Mutators=col_background,col_foreground
+# will create the necessary code for setting those variables
diff --git a/languages/ruby/app_templates/kxt/src-Makefile.am b/languages/ruby/app_templates/kxt/src-Makefile.am
new file mode 100644
index 00000000..a8170abc
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/src-Makefile.am
@@ -0,0 +1,48 @@
+## Makefile.am for %{APPNAMELC}
+
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes) -I$(RUBY_ARCHDIR)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries) $(KDE_RPATH) -L$(RUBY_LIBDIR)
+
+# the libraries to link against.
+%{APPNAMELC}_LDADD = $(LIB_KFILE) $(LIB_KDEPRINT) $(RUBY_LIBRUBYARG)
+
+# which sources should be compiled for %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+KDE_ICON = AUTO
+
+# this is where the kdelnk file will go
+kdelnkdir = $(kde_appsdir)/Utilities
+kdelnk_DATA = %{APPNAMELC}.desktop
+
+# this is where the XML-GUI resource file goes
+rcdir = $(kde_datadir)/%{APPNAMELC}
+rc_DATA = %{APPNAMELC}ui.rc
+
+rubysrc_DATA = main.rb %{APPNAMELC}.rb %{APPNAMELC}view.rb prefs.rb \
+ appview_base.rb prefs-base.rb settings.rb
+
+rubysrcdir = $(kde_datadir)/%{APPNAMELC}
+
+rubyui_DATA = appview_base.ui prefs-base.ui
+
+rubyuidir = $(kde_datadir)/%{APPNAMELC}
+
+%.rb: %.ui
+ $(RBUIC) -tr ${UIC_TR} -kde $< -o $@
+
+RBKCONFIG_COMPILER = rbkconfig_compiler
+
+settings.rb: %{APPNAMELC}.kcfg settings.kcfgc
+ $(RBKCONFIG_COMPILER) ./%{APPNAMELC}.kcfg ./settings.kcfgc
+
diff --git a/languages/ruby/app_templates/kxt/subdirs b/languages/ruby/app_templates/kxt/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/ruby/app_templates/qtruby/.kdev_ignore b/languages/ruby/app_templates/qtruby/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/.kdev_ignore
diff --git a/languages/ruby/app_templates/qtruby/Makefile.am b/languages/ruby/app_templates/qtruby/Makefile.am
new file mode 100644
index 00000000..68b7bd82
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.rb app.kdevelop app-Makefile app.filelist README
+templateName = qtruby
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/qtruby/README b/languages/ruby/app_templates/qtruby/README
new file mode 100644
index 00000000..34e85c43
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/README
@@ -0,0 +1,29 @@
+QtRuby Hello World template quick start
+Author: Anne-Marie Mahfouf
+Date: 2006-12-05
+-----------------------------------------------
+
+This README file explains you some basic things for starting with
+this application template, a simple QtRuby Hello world template.
+-----------------------------------------------
+
+-- REQUIREMENTS --
+you need
+- Qt version might be 3.3.4 or 3.3.5.
+- kdelibs 3.5 and kdelibs headers 3.5 (devel package) in order to build this template.
+- qtruby either from your distribution or from the kdebindings module or also from
+http://rubyforge.org/projects/korundum/.
+If you use the kdebindings module you need to build kdebindings/smoke/qt and then kdebindings/qtruby.
+
+-----------------------------------------------
+
+-- RUN --
+You will see that the Build menu in KDevelop is now adapted to Ruby.
+In the Build menu, choose Run or use Shift + F9 to see your project running.
+
+-----------------------------------------------
+
+-- RELEVANT LINK --
+http://developer.kde.org/language-bindings/ruby/index.html
+
+In KDevelop Documentation, you can find a Ruby tutorial. \ No newline at end of file
diff --git a/languages/ruby/app_templates/qtruby/app-Makefile b/languages/ruby/app_templates/qtruby/app-Makefile
new file mode 100644
index 00000000..13da2847
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/app-Makefile
@@ -0,0 +1,7 @@
+uis := $(wildcard *.ui)
+
+all: $(uis)
+ @for name in $^; do rbuic $$name > `echo $$name | awk -F '\\\.ui$' '{ print $$1 }' 2> /dev/null`.rb; echo "Running rbuic on $$name"; done
+
+clean: $(uis)
+ @for name in $^; do rm -f `echo $$name | awk -F '\\\.ui$' '{ print $$1 }' 2> /dev/null`.rb; done
diff --git a/languages/ruby/app_templates/qtruby/app.filelist b/languages/ruby/app_templates/qtruby/app.filelist
new file mode 100644
index 00000000..202beb22
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/app.filelist
@@ -0,0 +1,2 @@
+# KDevelop Custom Project File List
+%{APPNAMELC}.rb
diff --git a/languages/ruby/app_templates/qtruby/app.kdevelop b/languages/ruby/app_templates/qtruby/app.kdevelop
new file mode 100644
index 00000000..ec464627
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/app.kdevelop
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevcustomproject>
+ <general>
+ <activedir/>
+ </general>
+ </kdevcustomproject>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwindows_bugs</toc>
+ </ignoretocs>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ <type ext="ui"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <mainprogram>./%{APPNAMELC}.rb</mainprogram>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/qtruby/app.rb b/languages/ruby/app_templates/qtruby/app.rb
new file mode 100755
index 00000000..da817328
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/app.rb
@@ -0,0 +1,12 @@
+#!/usr/bin/env ruby
+
+require 'Qt'
+
+app = Qt::Application.new(ARGV)
+widget = Qt::Widget.new
+widget.setGeometry(50, 500, 400, 400)
+widget.caption = "Hello World!"
+
+app.mainWidget = widget
+widget.show
+app.exec
diff --git a/languages/ruby/app_templates/qtruby/qtruby.kdevtemplate b/languages/ruby/app_templates/qtruby/qtruby.kdevtemplate
new file mode 100644
index 00000000..6e7328ac
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/qtruby.kdevtemplate
@@ -0,0 +1,114 @@
+# KDE Config File
+[General]
+Name=QtRuby Hello World
+Name[ca]=Hello World en QtRuby
+Name[da]=QtRuby Goddag verden
+Name[de]=QtRuby-"Hello World"-Programm
+Name[el]=Γεια σου κόσμε QtRuby
+Name[es]=«Hola mundo» en QtRuby
+Name[et]=QtRuby "Tere, maailm"
+Name[eu]=QtRuby "Kaixo mundua" programa
+Name[fr]=« Bonjour monde » en QtRuby
+Name[gl]=Ola mundo en QtRuby
+Name[hu]=QtRuby-alapú Hello world program
+Name[it]="Hello World" con QtRuby
+Name[nds]=QtRuby-"Moin Welt"
+Name[ne]=QtRuby हेलà¥à¤²à¥‹ वोलà¥à¤¡
+Name[pl]="Witaj świecie" w QtRuby
+Name[pt]=Olá Mundo em QtRuby
+Name[pt_BR]=Olá Mundo em QtRuby
+Name[ru]=Hello World на QtRuby
+Name[sk]=QtRuby Ahoj svet
+Name[sr]=„Здраво Ñвете“ у QtRuby-ју
+Name[sr@Latn]=„Zdravo svete“ u QtRuby-ju
+Name[tr]=QtRuby Merhaba Dünya
+Category=Ruby/Qt
+Comment=This generates a simple QtRuby Hello World application
+Comment[ca]=Genera una simple aplicació de Hello World en QtRuby
+Comment[da]=Dette generere et simpelt QtRuby Goddag verden program
+Comment[de]=Erstellt eine einfache auf QtRuby basierende "Hello World"-Anwendung
+Comment[el]=Αυτό δημιουÏγεί μια απλή εφαÏμογή Γεια σου κόσμε σε QtRuby
+Comment[es]=Genera una sencilla aplicación «Hola mundo» en QtRuby
+Comment[et]=Lihtsa QtRuby "Tere, maailm" rakenduse loomine
+Comment[eu]=Honek QtRuby "Kaixo mundua" aplikazio sinple bat sortzen du
+Comment[fa]=یک کاربرد سادۀ QtRuby Hello World تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en QtRuby
+Comment[gl]=Isto xera unha aplicación sinxela Ola mundo QtRuby
+Comment[hu]=Létrehoz egy egyszerű QtRuby-alapú Hello world programot
+Comment[it]=Genera una semplice applicazione di "Hello World" con QtRuby
+Comment[ja]=ç°¡å˜ãª QtRuby Hello World アプリケーションを作æˆã—ã¾ã™
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm mit QtRuby op.
+Comment[ne]=यसले साधारण QtRuby हेलà¥à¤²à¥‹ वोलà¥à¤¡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Dit genereert een eenvoudige QtRuby Hello World-toepassing
+Comment[pl]=Generuje prosty program "Witaj świecie" w QtRuby
+Comment[pt]=Isto gera uma aplicação Olá Mundo simples em QtRuby
+Comment[pt_BR]=Isto gera uma aplicação Olá Mundo simples em QtRuby
+Comment[ru]=Создание проÑтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Hello World на QtRuby
+Comment[sk]=Vygeneruje jednoduchú QtRuby Ahoj svet aplikáciu
+Comment[sr]=Ово прави једноÑтаван „Здраво Ñвете“ у QtRuby-ју
+Comment[sr@Latn]=Ovo pravi jednostavan „Zdravo svete“ u QtRuby-ju
+Comment[sv]=Detta skapar ett enkelt Hello World-program i QtRuby
+Comment[tr]=Bu basit bir QtRuby Merhaba Dünya uygulaması yaratır.
+Comment[zh_TW]=產生一個簡單的 QtRuby Hello World 應用程å¼
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.rb,%{dest}/README
+Icon=qtruby.png
+Archive=qtruby.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.rb
+Dest=%{dest}/%{APPNAMELC}.rb
+
+[FILE3]
+Type=install
+Source=%{src}/app-Makefile
+Dest=%{dest}/Makefile
+
+[FILE4]
+Type=install
+Source=%{src}/app.filelist
+Dest=%{dest}/%{APPNAMELC}.kdevelop.filelist
+
+[FILE5]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/README
+
+[MSG]
+Type=message
+Comment=A simple QtRuby application was created in %{dest}
+Comment[ca]=Una simple aplicació en QtRuby ha estat creada en %{dest}
+Comment[da]=Et simpelt QtRuby program blev oprettet i %{dest}
+Comment[de]=Eine einfache QtRuby-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια απλή εφαÏμογή QtRuby δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una sencilla aplicación en QtRuby ha sido creada en %{dest}
+Comment[et]=Lihtne KQtRuby rakendus loodi asukohta %{dest}
+Comment[eu]=QtRuby aplikazio sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد سادۀ QtRuby در %{dest} ایجاد شد
+Comment[fr]=Une application QtRuby simple a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár simplí QtRuby i %{dest}
+Comment[gl]=Creouse unha aplicación sinxela QtRuby en %{dest}
+Comment[hu]=Létrejött egy egyszerű QtRuby-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata una semplice applicazione QtRuby in %{dest}
+Comment[ja]=ç°¡å˜ãª QtRuby アプリケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach QtRuby-Programm opstellt.
+Comment[ne]=साधारण QtRuby अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudige QtRuby-toepassing is aangemaakt in %{dest}
+Comment[pl]=Prosty program w QtRuby został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação simples de QtRuby em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação simples de QtRuby em %{dest}
+Comment[ru]=ПроÑтое приложение QtRuby Ñоздано в %{dest}
+Comment[sk]=Jednoduchá QtRuby aplikácia bola vytvorená v %{dest}
+Comment[sr]=ЈедноÑтаван QtRuby програм направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan QtRuby program napravljen je u %{dest}
+Comment[sv]=Ett enkelt QtRuby-program skapades i %{dest}
+Comment[tr]=Basit bir QtRuby uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简å•çš„ QtRuby 应用程åº
+Comment[zh_TW]=一個簡單的 QtRuby 應用程å¼æ¡†æž¶å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/ruby/app_templates/qtruby/qtruby.png b/languages/ruby/app_templates/qtruby/qtruby.png
new file mode 100644
index 00000000..63935461
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/qtruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/qtruby4app/Makefile.am b/languages/ruby/app_templates/qtruby4app/Makefile.am
new file mode 100644
index 00000000..2bdc1ef9
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/Makefile.am
@@ -0,0 +1,20 @@
+dataFiles = main.rb qtruby4app.rb qtruby4app.png qtruby4app.kdevelop \
+ application.qrc ReadMe filesave.xpm fileopen.xpm filenew.xpm \
+ editcopy.xpm editpaste.xpm editcut.xpm app-Makefile app.filelist
+
+templateName = qtruby4app
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
+
diff --git a/languages/ruby/app_templates/qtruby4app/ReadMe b/languages/ruby/app_templates/qtruby4app/ReadMe
new file mode 100644
index 00000000..da28297a
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/ReadMe
@@ -0,0 +1,6 @@
+READ THIS IN ORDER TO Run THE QtRuby4 APPLICATION
+-------------------------------------------------
+
+Click the 'Build Project' button to generate the qrc_application.rb
+file from the application.qrc resource with the rbrcc tool.
+
diff --git a/languages/ruby/app_templates/qtruby4app/app-Makefile b/languages/ruby/app_templates/qtruby4app/app-Makefile
new file mode 100644
index 00000000..3b3e7944
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/app-Makefile
@@ -0,0 +1,18 @@
+qrcs := $(wildcard *.qrc)
+uis := $(wildcard *.ui)
+
+all: gen_qrcs gen_uis
+
+gen_qrcs: $(qrcs)
+ @for name in $^; do rbrcc $$name > `echo $$name | awk -F '\\\.qrc$$' '{ printf("qrc_%s", $$1) }' 2> /dev/null`.rb; echo "Running rbrcc on $$name"; done
+
+gen_uis: $(uis)
+ @for name in $^; do rbuic4 $$name > `echo $$name | awk -F '\\\.ui$$' '{ print $$1 }' 2> /dev/null`.rb; echo "Running rbuic4 on $$name"; done
+
+clean: clean_qrcs clean_uis
+
+clean_qrcs: $(qrcs)
+ @for name in $^; do rm -f `echo $$name | awk -F '\\\.qrc$$' '{ printf("qrc_%s", $$1) }' 2> /dev/null`.rb; done
+
+clean_uis: $(uis)
+ @for name in $^; do rm -f `echo $$name | awk -F '\\\.ui$$' '{ print $$1 }' 2> /dev/null`.rb; done
diff --git a/languages/ruby/app_templates/qtruby4app/app.filelist b/languages/ruby/app_templates/qtruby4app/app.filelist
new file mode 100644
index 00000000..339e6998
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/app.filelist
@@ -0,0 +1,3 @@
+# KDevelop Custom Project File List
+main.rb
+%{APPNAMELC}.rb
diff --git a/languages/ruby/app_templates/qtruby4app/application.qrc b/languages/ruby/app_templates/qtruby4app/application.qrc
new file mode 100644
index 00000000..c35b0695
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/application.qrc
@@ -0,0 +1,10 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>editcopy.xpm</file>
+ <file>editcut.xpm</file>
+ <file>filenew.xpm</file>
+ <file>fileopen.xpm</file>
+ <file>editpaste.xpm</file>
+ <file>filesave.xpm</file>
+</qresource>
+</RCC> \ No newline at end of file
diff --git a/languages/ruby/app_templates/qtruby4app/editcopy.xpm b/languages/ruby/app_templates/qtruby4app/editcopy.xpm
new file mode 100644
index 00000000..8350ed0e
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/editcopy.xpm
@@ -0,0 +1,193 @@
+/* XPM */
+static char *editcopy[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 155 2",
+" c black",
+". c #191000",
+"X c #221700",
+"o c #2E2300",
+"O c #452E00",
+"+ c #433200",
+"@ c #493000",
+"# c #553800",
+"$ c #5D4600",
+"% c #6B5000",
+"& c #724B00",
+"* c #7D5E00",
+"= c #6E694F",
+"- c #7E795F",
+"; c #865900",
+": c #8A5C00",
+"> c #8B6800",
+", c #936200",
+"< c #926D00",
+"1 c #926B1A",
+"2 c #967000",
+"3 c #9B721D",
+"4 c #9B7625",
+"5 c #9E792A",
+"6 c #A47C00",
+"7 c #AA7D00",
+"8 c #A1761A",
+"9 c #A57816",
+"0 c #A4791D",
+"q c #AD8200",
+"w c #B28500",
+"e c #AE8530",
+"r c #B99626",
+"t c #97906D",
+"y c #B18D48",
+"u c #B49049",
+"i c #B89542",
+"p c #BA9C4D",
+"a c #BD9E52",
+"s c #BFA053",
+"d c #B8AE78",
+"f c #BEB47E",
+"g c #C49300",
+"h c #C89600",
+"j c #C19D2C",
+"k c #C1A43F",
+"l c #C09E4E",
+"z c #CFB457",
+"x c #C9B159",
+"c c #CAB573",
+"v c #D4BF7C",
+"b c #FFDF62",
+"n c #FFE064",
+"m c #FFE16D",
+"M c #FFE372",
+"N c #FFE479",
+"B c #A19D8E",
+"V c #ABA89A",
+"C c #BEB580",
+"Z c #BDB488",
+"A c #B8B496",
+"S c #AEADAA",
+"D c #B3AFA1",
+"F c #BCBBB6",
+"G c #BFBFB9",
+"H c #C0B680",
+"J c #C4BA85",
+"K c #C6BD8B",
+"L c #CBB589",
+"P c #C8BE88",
+"I c #C3BC90",
+"U c #CBC18C",
+"Y c #CCC493",
+"T c #D7CB8C",
+"R c #DAC786",
+"E c #D8C789",
+"W c #DAC98B",
+"Q c #D0C690",
+"! c #D4CA94",
+"~ c #D4CC9B",
+"^ c #D8CE98",
+"/ c #DCD29C",
+"( c #C6C3B7",
+") c #C8C6BE",
+"_ c #D5C5A5",
+"` c #DBC8A1",
+"' c #DBD4A2",
+"] c #DED9AE",
+"[ c #D9D5B1",
+"{ c #E0CC82",
+"} c #E8D98B",
+"| c #E8D991",
+" . c #E1D7A1",
+".. c #E5DBA5",
+"X. c #E4DCAB",
+"o. c #E8DDAA",
+"O. c #E1DCB2",
+"+. c #E1DCB8",
+"@. c #FFE683",
+"#. c #FFE78A",
+"$. c #FFE885",
+"%. c #FFE88D",
+"&. c #FFE992",
+"*. c #FFEC9D",
+"=. c #FFF09F",
+"-. c #ECE2AC",
+";. c #E5E0B6",
+":. c #E5E1B8",
+">. c #EBE4B6",
+",. c #EAE5BC",
+"<. c #F0E5A8",
+"1. c #FFEDA3",
+"2. c #FFEDA9",
+"3. c #F1E8B8",
+"4. c #FFEFB1",
+"5. c #FFF1A5",
+"6. c #FFF2AD",
+"7. c #FFF2B4",
+"8. c #FFF2BC",
+"9. c #CAC8C2",
+"0. c #D6D4CB",
+"q. c #DFDAC5",
+"w. c #D4D2D0",
+"e. c #E0D7C5",
+"r. c #E4DAC3",
+"t. c #E8DEC7",
+"y. c #E0DFD3",
+"u. c #E6E2C2",
+"i. c #E8E1C5",
+"p. c #EBE3CB",
+"a. c #EEE9C2",
+"s. c #E8E6DC",
+"d. c #F3EDC3",
+"f. c #F2EDCB",
+"g. c #F7F2CD",
+"h. c #FFF3C3",
+"j. c #FFF4CA",
+"k. c #FFF8C5",
+"l. c #FFF8CD",
+"z. c #FDF5D2",
+"x. c #FFF7D8",
+"c. c #FFF9D4",
+"v. c #FFF9DC",
+"b. c #E9E8E7",
+"n. c #F3EFE3",
+"m. c #F2F0E3",
+"M. c #F4F2EA",
+"N. c #FBF7E6",
+"B. c #FEF9E3",
+"V. c #FFFBEC",
+"C. c #F4F4F3",
+"Z. c #F8F7F6",
+"A. c #FEFCF4",
+"S. c #FEFEFC",
+"D. c None",
+/* pixels */
+"D.D.D.D.D.D.D.D.D.D.D.D.h g g g g g g g g g g w * D.D.D.D.D.",
+"D.D.D.D.D.D.D.D.D.D.D.D.g z.z.g.g.g.g.g.g.z.g.R 2 D.D.D.D.D.",
+"D.D.D.D.D.D.D.D.D.D.D.D.g z.d.3.3.3.3.3.3.>.f.g.z < D.D.D.D.",
+"D.D.D.D.D., : ; , : : : 7 a i a R -.-.-.-.' m.u.g.j > D.D.D.",
+"D.D.D.D., u y y L L L L ` t.t.e.e v -.-.-.Y b.S.+.d.q D.D.D.",
+"D.D.D.D., S.S.S.S.S.S.S.S.Z.b.S.e.i W o.o.K w.S.A.u.q D.D.D.",
+"D.D.D.D., S.S.S.A.S.S.S.S.M.w.S.S._ a E ..K 0.S.S.q.7 D.D.D.",
+"D.D.D.D., S.A.V.A.A.A.V.A.n.9.S.S.C._ a ..Y t = - A 6 D.D.D.",
+"D.D.D.D., A.A.V.A.V.V.V.A.n.9.S.S.S.Z.3 ' ' K Z A ] 7 D.D.D.",
+"D.D.D.D., A.V.B.V.V.B.V.V.n.( F S S G 5 ' | / / X.f.q D.D.D.",
+"D.D.D.D., A.V.x.B.x.V.B.N.B.e.D B V ) 3 / / ^ ^ ' a.q D.D.D.",
+"D.D.D.D., V.N.N.B.B.B.v.v.N.z.p.i.p.n.8 ^ / ! Q ' a.q D.D.D.",
+"D.D.D.D., B.B.x.v.x.z.j.j.x.z.z.c.B.B.0 ! ! ! ^ ' ,.q D.D.D.",
+"D.D.D.D., B.h.h.z.z.x.x.z.z.z.h.j.x.v.0 ! Q Y ! ~ ,.q D.D.D.",
+"D.D.D.D., v.c.k.x.h.j.j.j.z.8.h.k.j.v.0 U T U U ~ ,.q D.D.D.",
+"D.D.D.D., v.k.z.h.h.h.j.8.j.h.h.j.k.v.0 U U U U Y ;.q D.D.D.",
+"D.D.D.D., x.h.8.8.h.j.8.8.4.h.4.8.h.x.8 P H P P ~ ;.q D.D.D.",
+"D.D.D.D., v.h.4.4.8.8.4.1.z.h.8.4.h.c.8 H J H J Y ;.q D.D.D.",
+"D.D.D.D., c.2.z.j.4.*.1.1.8.2.2.*.2.l.8 J J H J U ] q D.D.D.",
+"D.D.D.D., l.h.2.4.4.1.%.1.&.2.4.8.7.k.8 f d f H U ] q D.D.D.",
+"D.D.D.D., z.8.#.1.4.1.*.1.1.1.*.N 4.l.8 f f C K ~ :.q D.D.D.",
+"D.D.D.D., 8.&.4.#.%.4.&.@.#.%.%.&.2.l.8 K K Y ~ ] ,.6 D.D.D.",
+"D.D.D.D., h.&.#.*.1.1.%.N N #.&.*.1.l.0 ' ] T x r 6 % D.D.D.",
+"D.D.D.D., 4.4.%.*.#.b &.N M b M 2.1.k.9 k 7 > $ o D.D.D.",
+"D.D.D.D., 7.&.N 5.&.N @.*.b N M N =.k., + D.D.D.",
+"D.D.D.D., 6.N N M M &.#.N 2.$.%.8.6.<.& D.D.D.D.D.",
+"D.D.D.D., 5.&.7.n $.m M 1.7.7.o.c 5 & @ D.D.D.D.D.D.D.D.D.",
+"D.D.D.D., 7.*.m %.=.&.7.} p 1 % # X D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D., 6.5.5.5.| a 1 & + . D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D., 6.-.a 1 & O . D.D.D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D.; : % O . D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D. D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D."
+};
diff --git a/languages/ruby/app_templates/qtruby4app/editcut.xpm b/languages/ruby/app_templates/qtruby4app/editcut.xpm
new file mode 100644
index 00000000..9a118931
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/editcut.xpm
@@ -0,0 +1,252 @@
+/* XPM */
+static char *editcut[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 214 2",
+" c #000000",
+". c #0B0B0B",
+"X c #181300",
+"o c #1D190B",
+"O c #131313",
+"+ c #1B1B1B",
+"@ c #211E11",
+"# c #26231A",
+"$ c #2A2513",
+"% c #2E2912",
+"& c #2E2A19",
+"* c #372E0B",
+"= c #302A12",
+"- c #312C1B",
+"; c #3A320F",
+": c #3C3415",
+"> c #3C351B",
+", c #232323",
+"< c #2B2922",
+"1 c #2C2C2C",
+"2 c #302E26",
+"3 c #353120",
+"4 c #3F3B2D",
+"5 c #313131",
+"6 c #3A3A3A",
+"7 c #423814",
+"8 c #493E17",
+"9 c #413D2F",
+"0 c #423F32",
+"q c #4F4319",
+"w c #5C4A00",
+"e c #5F4F0D",
+"r c #514410",
+"t c #554813",
+"y c #4E472C",
+"u c #444136",
+"i c #4A483F",
+"p c #534B2B",
+"a c #504B37",
+"s c #514C3A",
+"d c #654F04",
+"f c #604F0B",
+"g c #665200",
+"h c #675509",
+"j c #6B5405",
+"k c #6C5807",
+"l c #6C590B",
+"z c #745B04",
+"x c #715D0A",
+"c c #7B5B02",
+"v c #625B3B",
+"b c #7E6815",
+"n c #6C643E",
+"m c #4D4B42",
+"M c #494949",
+"N c #504D43",
+"B c #54534C",
+"V c #515151",
+"C c #5D5B54",
+"Z c #656048",
+"A c #736A44",
+"S c #726C54",
+"D c #77725B",
+"F c #696968",
+"G c gray50",
+"H c #826203",
+"J c #806609",
+"K c #836907",
+"L c #8D6A03",
+"P c #9A6F00",
+"I c #9B7005",
+"U c #9E730E",
+"Y c #9C7511",
+"T c #85732C",
+"R c #88783B",
+"E c #AE7C00",
+"W c #A87B13",
+"Q c #847B53",
+"! c #827D64",
+"~ c #9C862E",
+"^ c #A98A1F",
+"/ c #B28D0A",
+"( c #B88D00",
+") c #B2821A",
+"_ c #B18E1B",
+"` c #B3941C",
+"' c #A88E2C",
+"] c #A28C36",
+"[ c #AE9224",
+"{ c #89815E",
+"} c #87826D",
+"| c #858174",
+" . c #888370",
+".. c #8E8A7D",
+"X. c #928C71",
+"o. c #A28E44",
+"O. c #AA9F74",
+"+. c #B9A456",
+"@. c #BDA85B",
+"#. c #B2A068",
+"$. c #C28700",
+"%. c #CC8E00",
+"&. c #C29A00",
+"*. c #C4962F",
+"=. c #CCA100",
+"-. c #D6A800",
+";. c #D1AC1B",
+":. c #DDB31A",
+">. c #D2A922",
+",. c #D4AE2B",
+"<. c #DBA12E",
+"1. c #DBA433",
+"2. c #DDB428",
+"3. c #D2B23B",
+"4. c #E6A200",
+"5. c #E8A509",
+"6. c #EAAF00",
+"7. c #EFAC1E",
+"8. c #F5A100",
+"9. c #FFAD02",
+"0. c #FCAF0D",
+"q. c #FCB005",
+"w. c #FFB60C",
+"e. c #FFBD00",
+"r. c #FFBD16",
+"t. c #E3B432",
+"y. c #E8BF3C",
+"u. c #F6BE2F",
+"i. c #C6A949",
+"p. c #D9A948",
+"a. c #D8AB52",
+"s. c #DBBA45",
+"d. c #C5B162",
+"f. c #ECB74D",
+"g. c #EFB841",
+"h. c #EFBE4A",
+"j. c #EABA55",
+"k. c #FDC006",
+"l. c #FFC10B",
+"z. c #FFC800",
+"x. c #FFC90D",
+"c. c #FAC113",
+"v. c #FBC11C",
+"b. c #FDC910",
+"n. c #EDC233",
+"m. c #F5C32D",
+"M. c #FFC728",
+"N. c #F4C537",
+"B. c #F6C63A",
+"V. c #F5CB36",
+"C. c #FFD73D",
+"Z. c #E9C659",
+"A. c #EAC85A",
+"S. c #FFDA4B",
+"D. c #FFDD5D",
+"F. c #E9CD6B",
+"G. c #FFD560",
+"H. c #FFE06C",
+"J. c gray56",
+"K. c #959595",
+"L. c gray62",
+"P. c #A6A18A",
+"I. c #A8A69E",
+"U. c #AEA895",
+"Y. c #B3AC8F",
+"T. c #B8AF8B",
+"R. c #B4AD96",
+"E. c #B8B199",
+"W. c #A4A4A4",
+"Q. c #AAAAAA",
+"!. c #B0ADA3",
+"~. c #BBB6A3",
+"^. c #B1B1B1",
+"/. c #B9B9B6",
+"(. c #BBBBBA",
+"). c #C5BC9D",
+"_. c #C2BCA2",
+"`. c #C1BEB5",
+"'. c #D2C38E",
+"]. c #DCC78C",
+"[. c #C7C0A7",
+"{. c #C7C2AE",
+"}. c #C7C3B2",
+"|. c #C5C2B8",
+" X c #CAC6B6",
+".X c #CBC9BE",
+"XX c #D9D3BB",
+"oX c #E6D08A",
+"OX c #E7DEBD",
+"+X c #ECDEB3",
+"@X c #FFF0B9",
+"#X c #C5C5C5",
+"$X c #CECCC7",
+"%X c #D0CEC5",
+"&X c #D0CFC8",
+"*X c #D2D1CB",
+"=X c #DBD6C5",
+"-X c #DBD7C9",
+";X c #D3D3D1",
+":X c #DBDBDB",
+">X c #E5E1D6",
+",X c #E5E3DA",
+"<X c #E8E5D9",
+"1X c #EDEADC",
+"2X c #FEF6DE",
+"3X c #E6E6E6",
+"4X c #E9E7E2",
+"5X c #E9E8E4",
+"6X c #EDECEA",
+"7X c #F2F1EB",
+"8X c #F1F1F1",
+"9X c #F8F7F4",
+"0X c #F9F8F8",
+"qX c None",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqX5 5 5 1 , qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 V /.&XQ.F 1 , qXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 _.D.S.H.@X&X6 . qXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 S.=.w g &.C...+ qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 -.' + o t z.d., qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX5 C V.@.+ 3 :.3., qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX5 '.b.F.6 , 1 s.,., qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX1 b ( n.OXE.E.F.^ + qXqXqXqXqXqXqXqX5 5 1 , ",
+"qXqXqXqXqXqXqX l x K A.oXoXZ.i., qXqXqXqXqXqX5 V &X0X6X, ",
+"qXqXqXqXqXqXqX 8 ( c.v.k.N.1 qXqXqXqX5 V $X0X0X9XXX, ",
+"qXqXqXqXqXqXqXqX O t 6.e.e.k.S O 5 5 V $X8X8X8X1XD : O ",
+"qXqXqXqXqXqXqXqXqXqX 3 J e.G.7X#.+ . 5 C |.3X3X5X4X_.4 % ",
+"qXqXqXqXqXqXqXqXqXqX q ].0X0X+X, B }.:X:X:X:X=XS & o ",
+"qXqXqXqXqXqXqXqXqXqXqX + M 8X8X7XU.Q.#X*X*X*XR.< % qX",
+"qXqXqXqXqXqXqXqXqXqXqXqX, 1 X6XW.G Q.L.^.{.Z @ . qXqX",
+"qXqXqXqXqXqXqXqXqXqX5 5 m P.W.:X6 . 3X/.X., @ qXqXqXqX",
+"qXqXqXqXqXqXqX5 5 5 n +.R.W.J.K.W.^.:X:X1Xm + qXqXqXqXqX",
+"qXqXqXqXqX5 5 i o.y.v.q./ P.I.} | R.&X*X;X8X ., qXqXqXqXqXqX",
+"qXqX5 5 5 R 3.M.5.E L 7.4._ 0 + O + i ).#X#X5X~., O qXqXqXqX",
+"qX5 u ] m.r.%.H r : , t.0.P 7 $ , { `.(.;X-X, + qXqXqX",
+"5 u 2.w.$.k t o , ~ h.P l , u T.^.#X<XN , qXqX",
+"5 >.9.U r . . , T B.*.x qX + , Q !.Q.<XC , qX",
+"p q.1.> . + 1 [ m.p.k . qXqXqXqX , u O.W.;X! + ",
+"4 8.j.` p 5 y ;.u.a.d % qXqXqXqXqXqX O , A P._., ",
+"1 x <.f.m.x.b.y.a.g ; qXqXqXqXqXqXqXqX + 0 v O ",
+" - h c W W W W z : qXqXqXqXqXqXqXqXqXqX . . ",
+" * e l l f X qXqXqXqXqXqXqXqXqXqXqXqXqX ",
+"qX qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX qX",
+"qXqXqX qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
diff --git a/languages/ruby/app_templates/qtruby4app/editpaste.xpm b/languages/ruby/app_templates/qtruby4app/editpaste.xpm
new file mode 100644
index 00000000..c29ad36b
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/editpaste.xpm
@@ -0,0 +1,295 @@
+/* XPM */
+static char *editpaste[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c black",
+". c #0D0900",
+"X c #191000",
+"o c #221700",
+"O c #2A1B00",
+"+ c #332200",
+"@ c #3E2900",
+"# c #3A2804",
+"$ c #4D3300",
+"% c #4B3E15",
+"& c #44391B",
+"* c #543800",
+"= c #5A3B00",
+"- c #4D4015",
+"; c #524E25",
+": c #5A4F2C",
+"> c #524E3D",
+", c #58562F",
+"< c #53503E",
+"1 c #5E623B",
+"2 c #634100",
+"3 c #684500",
+"4 c #6E4900",
+"5 c #614F11",
+"6 c #685416",
+"7 c #734C00",
+"8 c #784F00",
+"9 c #755B00",
+"0 c #7C5200",
+"q c #7C5A00",
+"w c #7B570F",
+"e c #69562F",
+"r c #786600",
+"t c #7F6A00",
+"y c #766300",
+"u c #60613F",
+"i c #7C6422",
+"p c #545143",
+"a c #54524B",
+"s c gray32",
+"d c #5D5D57",
+"f c #616641",
+"g c #67695D",
+"h c #6B734D",
+"j c #6C7553",
+"k c #616261",
+"l c #686A64",
+"z c #6B7162",
+"x c #727272",
+"c c #003DFF",
+"v c #0043FF",
+"b c #004BFF",
+"n c #0053FF",
+"m c #015AFF",
+"M c #0063FF",
+"N c #046DFF",
+"B c #0865FF",
+"V c #0378FF",
+"C c #1663FF",
+"Z c #1576FF",
+"A c #2678FF",
+"S c #6F7B84",
+"D c #77856D",
+"F c #7B8B75",
+"G c #0083FF",
+"H c #0197FF",
+"J c #0B92FF",
+"K c #1385FF",
+"L c #01A5FF",
+"P c #0DB5FF",
+"I c #3096FF",
+"U c #2DADFF",
+"Y c #2FBCFF",
+"T c #22C6FF",
+"R c #2AC5FF",
+"E c #30D0FF",
+"W c #38D5FF",
+"Q c #4493F1",
+"! c #5F83FF",
+"~ c #5F8AFF",
+"^ c #5290E4",
+"/ c #5F92FF",
+"( c #4CAAFE",
+") c #40B8FF",
+"_ c #779DCB",
+"` c #6693E2",
+"' c #6290FF",
+"] c #649DFF",
+"[ c #71A6E5",
+"{ c #79A4FF",
+"} c #7FB3FF",
+"| c #68B8F3",
+" . c #42DCFF",
+".. c #47E0FF",
+"X. c #58E9FF",
+"o. c #64C0EB",
+"O. c #6ADFEF",
+"+. c #825600",
+"@. c #845A00",
+"#. c #8B5C00",
+"$. c #905F00",
+"%. c #8C6103",
+"&. c #876807",
+"*. c #8A6111",
+"=. c #886E1B",
+"-. c #887600",
+";. c #8C7A00",
+":. c #936200",
+">. c #986800",
+",. c #926C22",
+"<. c #987A3F",
+"1. c #A07200",
+"2. c #A27511",
+"3. c #A97D15",
+"4. c #A77B14",
+"5. c #998712",
+"6. c #A68000",
+"7. c #A78F00",
+"8. c #AD8016",
+"9. c #AC9600",
+"0. c #BB8F00",
+"q. c #A99B2A",
+"w. c #B9A000",
+"e. c #B3A63C",
+"r. c #958D43",
+"t. c #988F44",
+"y. c #9A9346",
+"u. c #9F9948",
+"i. c #8B897C",
+"p. c #958F6F",
+"a. c #98937B",
+"s. c #A68443",
+"d. c #B08C41",
+"f. c #AF9462",
+"g. c #B39864",
+"h. c #B2A850",
+"j. c #BDB355",
+"k. c #C3972F",
+"l. c #C5A400",
+"z. c #CCAC00",
+"x. c #D7BB00",
+"c. c #CCA030",
+"v. c #CBB43E",
+"b. c #E4AD0C",
+"n. c #ECB600",
+"m. c #EDB900",
+"M. c #F2BB00",
+"N. c #C1B84C",
+"B. c #C1B757",
+"V. c #C5BB58",
+"C. c #C9BE5A",
+"Z. c #C2A978",
+"A. c #DFC000",
+"S. c #FDCB00",
+"D. c #F6C300",
+"F. c #FFD100",
+"G. c #FEDB00",
+"H. c #FFDF0E",
+"J. c #F5D500",
+"K. c #FBCD39",
+"L. c #FFE832",
+"P. c #FFE432",
+"I. c #CEC25C",
+"U. c #D7C648",
+"Y. c #DDC74B",
+"T. c #D0C55E",
+"R. c #D3C85F",
+"E. c #D5C960",
+"W. c #DDD264",
+"Q. c #E0CA4C",
+"!. c #E7D14E",
+"~. c #EFDA51",
+"^. c #F4D050",
+"/. c #F9D452",
+"(. c #FEDD53",
+"). c #E2D765",
+"_. c #E9DD69",
+"`. c #E6DD68",
+"'. c #FDDB6E",
+"]. c #FFEE4F",
+"[. c #FEE354",
+"{. c #FEEA55",
+"}. c #F7E153",
+"|. c #FFF056",
+" X c #ECE16A",
+".X c #F1E56D",
+"XX c #F7EA6F",
+"oX c #F7EB70",
+"OX c #F9EC70",
+"+X c #FEF372",
+"@X c #979486",
+"#X c gray60",
+"$X c #969596",
+"%X c #8AA193",
+"&X c #82A89B",
+"*X c #8CAEA3",
+"=X c #86A7A9",
+"-X c #8BA2B1",
+";X c #ACA580",
+":X c #A5A291",
+">X c #B3AF98",
+",X c #B8B7AF",
+"<X c #B3B2AB",
+"1X c #B1B1B1",
+"2X c #A6B8FF",
+"3X c #88DEE0",
+"4X c #8BF0FE",
+"5X c #A4CFC6",
+"6X c #BFD5FF",
+"7X c #BFDCFF",
+"8X c #C2AD82",
+"9X c #CBB489",
+"0X c #D2BF9B",
+"qX c #D1C19F",
+"wX c #C8C4AA",
+"eX c #CFCBB7",
+"rX c #D8C7A6",
+"tX c #D2C2A3",
+"yX c #D5CCB3",
+"uX c #DAD1A1",
+"iX c #DDD5BB",
+"pX c #D7D1B3",
+"aX c #ECE5BB",
+"sX c #F5EBB5",
+"dX c #F5ECBC",
+"fX c #F8EEB8",
+"gX c #FCF2BC",
+"hX c #CBCBCB",
+"jX c #D8D6C7",
+"kX c #DDDDDD",
+"lX c #E4DAC2",
+"zX c #ECE6C7",
+"xX c #EBE6D9",
+"cX c #E9E3D0",
+"vX c #F5EDC4",
+"bX c #F6EFC9",
+"nX c #F0EBD5",
+"mX c #F3EFDB",
+"MX c #FCF3C5",
+"NX c #FCF4CA",
+"BX c #F7F0CA",
+"VX c #F6F0D2",
+"CX c #F9F3D3",
+"ZX c #F9F4DC",
+"AX c #FFF8D4",
+"SX c #FFF9DB",
+"DX c #E7E7E4",
+"FX c #EBEBE9",
+"GX c #F1EDE1",
+"HX c #F9F6E5",
+"JX c #FDF9E4",
+"KX c #FEFBEB",
+"LX c #F6F2E6",
+"PX c #FEFCF3",
+"IX c #FEFDFD",
+"UX c #F4F4F3",
+"YX c None",
+/* pixels */
+"YXYXYXYXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYX:.:.+ IXIXIXIXIXIXIXIXFX# +.7 YXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX>.k.c.6 FXkXkXkXDXkXkXkXx i b.>.+ YXYXYXYXYXYXYXYXYXYX",
+"YXYXYX:.'.K.=.hX1X1X1X1X1X1X1Xd &.0.%.* 7 #.#.:.$.#.2 YXYXYX",
+"YXYXYX:./.M.%.$Xk k d s s s e w >.2.d.s.Z.9XrXlXxX0X7 YXYXYX",
+"YXYXYX:.^.M.1.: % % - % 5 6 &.GXIXIXPXPXPXPXPXLXIXIXg.3 YXYX",
+"YXYX#X:.^.m.v.y.r.r.r.r.h.h.2.IXPXPXKXKXPXKXHXxXUXIXIXf.4 YX",
+"YXYX#X:.^.m.Y.I.B.j.j.j.V.I.4.PXKXJXKXJXKXKXmXjXFXIXIXUX+. YX",
+"YXYX#X:.^.m.Y.E.I.j.j.j.I.R.8.PXKXSXJXJXJXSXnXeXDXIXIXUX<. YX",
+"YXYXYX:./.M.!.W.R.I.T.R.E.W.8.UXJXJXSXSXSXSXnXeX:X@Xi.<X7 ",
+"YXYXYX:./.D.~._.`.W.W.W.W. X8.PXJXSXAXSXSXSXVXjX>X@X@X,X4 ",
+"YXYXYX:.(.S.}..X X X X X X X8.PXSXAXAXAXAXAXNXzXpXwXwXjX7 ",
+"YXYXYX:.(.S.[.OXOXOXoXoXt.; O s a p p p p a.AXMXvXaXzXGX+. ",
+"YXYXYX:.(.S.[.+X+X+XOX+X; 7X2X] / / ~ ! 2Xp MXNXNXNXSXKX+. YX",
+"YXYXYX:.(.F.|.+X+X+X+X+Xy., _ A m b v c ! p MXMXgXMXAXKX+. YX",
+"YXYXYX:.(.F.|.+X+X+X+X+X+Xj.& ^ B n b v ' < gXMXgXgXNXKX+. YX",
+"YXYXYX:.(.F.U.W.+X+X+X+X).y.g Q N m n b ~ < gXgXgXgXAXJXq YX",
+"YXYXYX:.[.l.j j y.I.j.r.1 =X( K N M m b ~ < gXgXgXgXNXKX+. YX",
+"YXYXYX:.[.t 5X4X&XD F =X| U J G V Z A C / < fXgXgXgXMXHX+. YX",
+"YXYXYX:.[.l.h 3XX...W T P L H K I [ S ` { < fXfXfXfXMXKX+. YX",
+"YXYXYX:.[.G.e.1 *XO...E R Y Y | -Xd Z.k 6X> fXfXfXfXBXJX+. YX",
+"YXYXYX:.[.G.{.`.u.1 F &X*X%Xz l a.uXfXp.> p.sXsXsXfXBXJX+. YX",
+"YXYXYX:.{.G.|.+X+X XN.q.5.7.q cXvXsXsXsXsXsXsXsXsXsXBXKX+. YX",
+"YXYXYX:.|.G.].|.L.H.G.G.G.A.1.JXvXsXsXsXsXsXsXsXfXdXCXPX+. YX",
+"YXYXYX:.{.G.G.G.G.G.x.w.;.t :.HXdXsXsXsXsXsXdXvXBXZXLXtX= YX",
+"YXYXYX:.{.G.J.x.9.;.r 9 q 0 #.KXvXsXaXsXvXBXCXHXiXg.*.= O YX",
+"YXYXYX:.L.9.-.y 9 q 0 = + #.HXbXdXbXVXZXcX8X,.3 $ . YX",
+"YXYXYX%.z.9 q 7 * o $.PXZXmXmX0Xs.0 $ X YX",
+"YXYXYX8 0 = o :.IXpXg.*.= O YXYXYXYX",
+"YXYXYX YXYX@.#.2 @ . YXYXYXYXYXYX",
+"YXYXYX YXYXYXYXYX YXYXYXYXYXYXYXYXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX YXYXYXYXYXYXYXYXYXYXYXYX"
+};
diff --git a/languages/ruby/app_templates/qtruby4app/filenew.xpm b/languages/ruby/app_templates/qtruby4app/filenew.xpm
new file mode 100644
index 00000000..85efceb2
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/filenew.xpm
@@ -0,0 +1,216 @@
+/* XPM */
+static char *filenew[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 178 2",
+" c black",
+". c #191000",
+"X c #221700",
+"o c #452E00",
+"O c #4A3100",
+"+ c #4E3400",
+"@ c #553800",
+"# c #604000",
+"$ c #6A4600",
+"% c #6D4800",
+"& c #704A00",
+"* c #724C00",
+"= c #744C00",
+"- c #764E00",
+"; c #785000",
+": c #805500",
+"> c #815500",
+", c #835700",
+"< c #865900",
+"1 c #875A00",
+"2 c #8A5B00",
+"3 c #8A5C00",
+"4 c #8B5C00",
+"5 c #8C5D00",
+"6 c #8D5D00",
+"7 c #8F5E00",
+"8 c #805911",
+"9 c #905F00",
+"0 c #906000",
+"q c #926000",
+"w c #946200",
+"e c #956300",
+"r c #966400",
+"t c #976400",
+"y c #956913",
+"u c #926C22",
+"i c #9B7732",
+"p c #B18D48",
+"a c #B28E49",
+"s c #B4904A",
+"d c #BAA373",
+"f c #A1A195",
+"g c #ABAB9F",
+"h c #ADADAB",
+"j c #AFAFAB",
+"k c #B3B3A6",
+"l c #BCBCB8",
+"z c #BFBFBC",
+"x c #CBB489",
+"c c #CBB58A",
+"v c #CDB78B",
+"b c #CAB891",
+"n c #C9BB9E",
+"m c #CEBEA2",
+"M c #C6C6BC",
+"N c #D9C8A8",
+"B c #E8E1BA",
+"V c #E8E1BB",
+"C c #FEFFA1",
+"Z c #FFFFA0",
+"A c #FEFFA3",
+"S c #FEFFA4",
+"D c #FEFFA6",
+"F c #FEFFA8",
+"G c #FEFFA9",
+"H c #FFFFA8",
+"J c #FEFFAA",
+"K c #FEFFAB",
+"L c #FFFFAB",
+"P c #FEFFAC",
+"I c #FFFFAC",
+"U c #FEFFAE",
+"Y c #FEFFAF",
+"T c #FEFFB0",
+"R c #FEFFB1",
+"E c #FFFFB0",
+"W c #FEFFB4",
+"Q c #FEFFB5",
+"! c #FFFFB4",
+"~ c #FEFFB8",
+"^ c #FEFFB9",
+"/ c #FFFFB8",
+"( c #FFFFB9",
+") c #FEFFBB",
+"_ c #FFFFBA",
+"` c #FEFFBD",
+"' c #FFFFBD",
+"] c #FEFFBE",
+"[ c #FFFFBE",
+"{ c #C8C8C1",
+"} c #CACAC4",
+"| c #CBCBC6",
+" . c #DBD2C1",
+".. c #DEDFCF",
+"X. c #D4D4D1",
+"o. c #E1D5C1",
+"O. c #E3D9C3",
+"+. c #E5DCCC",
+"@. c #E8E8D3",
+"#. c #ECECD7",
+"$. c #F0EBDA",
+"%. c #FEFFC2",
+"&. c #FEFFC3",
+"*. c #FFFFC2",
+"=. c #FEFFC7",
+"-. c #FFFFC7",
+";. c #FEFFCB",
+":. c #FEFFCC",
+">. c #FFFFCC",
+",. c #FEFFCE",
+"<. c #FEFFD0",
+"1. c #FEFFD1",
+"2. c #FFFFD0",
+"3. c #FFFFD1",
+"4. c #FFFFD3",
+"5. c #FEFFD5",
+"6. c #FFFFD5",
+"7. c #FEFFD6",
+"8. c #FEFFD7",
+"9. c #FFFFD6",
+"0. c #FFFFD8",
+"q. c #FEFFDA",
+"w. c #FFFFDA",
+"e. c #FFFFDB",
+"r. c #FFFFDC",
+"t. c #FEFFDE",
+"y. c #FEFFDF",
+"u. c #FFFFDE",
+"i. c #FFFFDF",
+"p. c #E9E9E7",
+"a. c #F3F3E9",
+"s. c #F3F3EB",
+"d. c #F5F5E8",
+"f. c #F8F8E3",
+"g. c #FEFFE0",
+"h. c LightYellow",
+"j. c #FFFFE1",
+"k. c #FEFFE3",
+"l. c #FFFFE3",
+"z. c #FDFEE7",
+"x. c #FEFFE4",
+"c. c #FEFFE5",
+"v. c #FFFFE4",
+"b. c #FBFBE9",
+"n. c #FEFFE8",
+"m. c #FFFFE8",
+"M. c #FFFFE9",
+"N. c #FFFFEA",
+"B. c #FEFFEC",
+"V. c #FEFFED",
+"C. c #FFFFEC",
+"Z. c #FFFFED",
+"A. c #FEFFEF",
+"S. c #F4F4F0",
+"D. c #F4F4F3",
+"F. c #F5F5F4",
+"G. c #F8F8F6",
+"H. c ivory",
+"J. c #FFFFF1",
+"K. c #FEFFF3",
+"L. c #FFFFF3",
+"P. c #FEFFF4",
+"I. c #FFFFF4",
+"U. c #FEFFF7",
+"Y. c #FFFFF6",
+"T. c #FFFFF7",
+"R. c #FBFBFB",
+"E. c #FFFFF8",
+"W. c #FFFFF9",
+"Q. c #FFFFFA",
+"!. c #FFFFFB",
+"~. c gray99",
+"^. c #FEFFFD",
+"/. c #FFFFFC",
+"(. c #FFFFFD",
+"). c #FFFFFE",
+"_. c gray100",
+"`. c None",
+/* pixels */
+"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.`.w 2 1 w 4 4 4 6 w 9 6 - `.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.r s p p c c c c N O.+.o.y # `.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.r ).).).).).).).).F.p.). .& o `.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w ).E.).E.).E.E.E.S.X.).R.n $ + `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w E.Y.Y.E.Y.E.E.E.a.| ).).D.m % `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w E.Y.Y.J.Y.J.Y.Y.a.| ).).).D.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w Y.J.J.J.J.J.J.J.a.M l h h { ; `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w Y.B.B.B.N.N.B.B.b...k f h } ; `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w J.N.N.N.N.N.N.N.l.f.#.@.#.a.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w J.l.l.l.l.l.l.l.l.l.l.l.l.J.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w J.r.l.l.r.l.r.l.r.l.r.l.r.J.1 `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w B.r.r.q.q.q.q.q.q.r.q.q.r.B.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w N.5.5.5.5.q.5.5.5.5.5.5.5.B., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w N.<.<.<.<.<.<.<.5.<.<.<.<.N., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w l.,.;.;.;.,.;.,.;.,.;.;.;.l., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w l.-.-.-.-.-.-.;.-.-.-.-.;.l.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w l.-.%.%.%.%.%.%.%.%.%.%.%.l., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w r.' ' ' ' ' ) ' ' ' ' ' ' r., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w r.) ) W ) ) ) ) ) ) W ) ) q., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w q.W W W W W W W W W W W W q., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w 5.Y Y W Y Y Y Y Y Y Y Y Y 5., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w 5.J J J Y J Y Y J Y J J Y q., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w 5.J J D J J D J D J W ) ,.$.- `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w <.Z D D Z D J Y ' ,.B b i - O `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w <.Z Z Z Y ) <.B d u & @ X `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w ,.J ) ,.B d y & o . `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w Y.V d u & o . `.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.1 4 & o . `.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`. `.`.`.`.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`. `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`."
+};
diff --git a/languages/ruby/app_templates/qtruby4app/fileopen.xpm b/languages/ruby/app_templates/qtruby4app/fileopen.xpm
new file mode 100644
index 00000000..a6c33b62
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/fileopen.xpm
@@ -0,0 +1,295 @@
+/* XPM */
+static char *fileopen[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c black",
+". c #0B0900",
+"X c #130E00",
+"o c #161100",
+"O c #231A00",
+"+ c #352600",
+"@ c #3B311C",
+"# c #433100",
+"$ c #4F3B00",
+"% c #4A3E16",
+"& c #4A3D22",
+"* c #4D421A",
+"= c #54420D",
+"- c #4E4529",
+"; c #484338",
+": c #484233",
+"> c #5B4B24",
+", c #624500",
+"< c #674D00",
+"1 c #6D4D00",
+"2 c #6E4F17",
+"3 c #6D5200",
+"4 c #775500",
+"5 c #745B0F",
+"6 c #795200",
+"7 c #7A5A00",
+"8 c #715C18",
+"9 c #764B0A",
+"0 c #6C5423",
+"q c #6D592E",
+"w c #785E27",
+"e c #735626",
+"r c #665736",
+"t c #7A631D",
+"y c #7A672E",
+"u c #776535",
+"i c #5C5956",
+"p c #78704F",
+"a c #75726E",
+"s c #8D4F00",
+"d c #815700",
+"f c #835A00",
+"g c #8A5C00",
+"h c #866400",
+"j c #966100",
+"k c #956F00",
+"l c #9C6100",
+"z c #9D7500",
+"x c #856B2A",
+"c c #8C752A",
+"v c #8C723B",
+"b c #977939",
+"n c #A45D00",
+"m c #A26100",
+"M c #AA680D",
+"N c #AB6700",
+"B c #A07700",
+"V c #A57B00",
+"C c #AB7A00",
+"Z c #AA7300",
+"A c #AF721A",
+"S c #B87E00",
+"D c #B57B00",
+"F c #B0731A",
+"G c #B47C26",
+"H c #B77E28",
+"J c #897F59",
+"K c #977C40",
+"L c #927F58",
+"P c #807A6C",
+"I c #9C821D",
+"U c #9F8A35",
+"Y c #AC8000",
+"T c #B28500",
+"R c #B68800",
+"E c #BB8B00",
+"W c #A78337",
+"Q c #A28B31",
+"! c #AF9535",
+"~ c #B58E3A",
+"^ c #B88633",
+"/ c #B49936",
+"( c #BCA039",
+") c #998445",
+"_ c #978657",
+"` c #8B8264",
+"' c #8E8572",
+"] c #978864",
+"[ c #978C75",
+"{ c #9F9072",
+"} c #A38845",
+"| c #A48952",
+" . c #AA965C",
+".. c #A89156",
+"X. c #B5934D",
+"o. c #B39D45",
+"O. c #B49755",
+"+. c #AB984A",
+"@. c #AD9A65",
+"#. c #A79778",
+"$. c #A59874",
+"%. c #A29B7A",
+"&. c #A79775",
+"*. c #BDA959",
+"=. c #B3A46C",
+"-. c #B1A07F",
+";. c #B5A97A",
+":. c #BEB37B",
+">. c #C49200",
+",. c #C89500",
+"<. c #CC9800",
+"1. c #C69812",
+"2. c #D2A31C",
+"3. c #C2A63E",
+"4. c #D7AE37",
+"5. c #C29840",
+"6. c #C29B4E",
+"7. c #C2A641",
+"8. c #C6AA43",
+"9. c #C8AC45",
+"0. c #CBAF49",
+"q. c #CAA746",
+"w. c #C4A158",
+"e. c #CAA65D",
+"r. c #CEA857",
+"t. c #CFA95A",
+"y. c #C5AC50",
+"u. c #CDB14B",
+"i. c #CBB358",
+"p. c #CAB152",
+"a. c #D2AB59",
+"s. c #D1B54D",
+"d. c #D4B951",
+"f. c #D6BC5B",
+"g. c #DDB45E",
+"h. c #D9BD56",
+"j. c #D2B753",
+"k. c #DAAB48",
+"l. c #CEAE69",
+"z. c #CCAD67",
+"x. c #CCB662",
+"c. c #CAB26B",
+"v. c #C8B66B",
+"b. c #CEB775",
+"n. c #CEBE7F",
+"m. c #D3AD66",
+"M. c #D5BE64",
+"N. c #D4BF6D",
+"B. c #E4B34B",
+"V. c #E0B75F",
+"C. c #E1B85F",
+"Z. c #E4BA61",
+"A. c #E9BE63",
+"S. c #DDC159",
+"D. c #DAC269",
+"F. c #D4C176",
+"G. c #D8C67F",
+"H. c #E1C55D",
+"J. c #EFC05D",
+"K. c #F1C15E",
+"L. c #E0C264",
+"P. c #E5C961",
+"I. c #EDC164",
+"U. c #E9CD65",
+"Y. c #EFD36B",
+"T. c #F2C564",
+"R. c #F6C868",
+"E. c #F8C760",
+"W. c #FBCC6A",
+"Q. c #FDCB63",
+"!. c #F1D56D",
+"~. c #FFD06C",
+"^. c #F5D972",
+"/. c #FED175",
+"(. c #FADE77",
+"). c #E4C87A",
+"_. c #FEE27C",
+"`. c #8F9192",
+"'. c #9A9A96",
+"]. c #A79F83",
+"[. c #ADA583",
+"{. c #A7A399",
+"}. c #BBAC86",
+"|. c #BDB088",
+" X c #BBB298",
+".X c #A7A8A6",
+"XX c #ADAEB0",
+"oX c #B5B6B4",
+"OX c #BABCBC",
+"+X c #C6B38E",
+"@X c #D3BE80",
+"#X c #D0BC95",
+"$X c #C6BFA6",
+"%X c #C5C29D",
+"&X c #D2C283",
+"*X c #DAC789",
+"=X c #DBCA8B",
+"-X c #D5C489",
+";X c #DBCD94",
+":X c #D6C699",
+">X c #CFC8B1",
+",X c #C8C6B7",
+"<X c #D1C9A6",
+"1X c #DBD3BA",
+"2X c #E1C981",
+"3X c #E0CD91",
+"4X c #ECD686",
+"5X c #EBD69E",
+"6X c #FED682",
+"7X c #FED88B",
+"8X c #FEDC95",
+"9X c #E3CEA3",
+"0X c #EED9A9",
+"qX c #E7DCB9",
+"wX c #F4DDAF",
+"eX c #FFE68A",
+"rX c #FFE893",
+"tX c #FFEA9F",
+"yX c #FFE2A5",
+"uX c #FFE3AC",
+"iX c #FFECA7",
+"pX c #FFEDAE",
+"aX c #F1E0B6",
+"sX c #FDE5B4",
+"dX c #FFEEB4",
+"fX c #F8E5BB",
+"gX c #FFF0BC",
+"hX c #C5C7C8",
+"jX c #C7C8CA",
+"kX c #CCCECF",
+"lX c #CCCAC0",
+"zX c #CDCED0",
+"xX c #D1D1CF",
+"cX c #D1D3D4",
+"vX c #D6D8DA",
+"bX c #DADCDE",
+"nX c #DCDEE0",
+"mX c #DEE0E2",
+"MX c #E7DEC2",
+"NX c #EBE1C5",
+"BX c #F4E9C3",
+"VX c #F7EACE",
+"CX c #FEEAC3",
+"ZX c #FAEBCA",
+"AX c #FFF1C1",
+"SX c #FFF3CC",
+"DX c #FFF6DA",
+"FX c #E1E3E5",
+"GX c #E4E6E8",
+"HX c #E7E9EA",
+"JX c #E8E6E0",
+"KX c #E9EAEC",
+"LX c #ECEEF0",
+"PX c #EEF0F2",
+"IX c #F8F4E8",
+"UX c #F1F3F5",
+"YX c None",
+/* pixels */
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX V E <.,.T YXYXYXYXYXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX< E 2.aXCXVXE 3 E <.E YXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX R ,.5XCX8XQ.wX<.1.$.OX<. YXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX R >.L.ZXyXT.K.E.wX ..XKXKXR YXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYX V E 4.ZXsXW.K.I.Z.O.{.KXUXUXMXk YXYX",
+"YXYXYXYXYXYX R E 7 YX< E 2.aXsX6XC.T.Z.w.[ xXUXUXUXUX2X3 YXYX",
+"YXYXYXYX R >.).5X,.T ,.5XCX8XK.T.A.a.] OXUXUXUXUXUXUX2.O YXYX",
+"YXYX Y E Z.ZXsX7XsX0XCXyXR.K.I.V._ .XUXUXUXUXUXLXKXJXV D N S 7 ",
+" z E 4.fXsX/.K.~./.6X~.I.I.C...'.KXUXPXPXPXLXKXGXbXl.N m.SXm.D ",
+" E 0XgX7XE.W.W.~.~.R.I.Z.w.' bXUXUXUXPXPXLXmXbX$X) ~ aXSXpXBXn ",
+" <.CXT.Q.~.W.W.R.I.A.t._ hXUXUXUXUXPXLXGXnX,X .t XAXSXeX4Xl.Z ",
+" <.sXB.W.W.W.T.A.g._ oXUXUXUXUXUXLXLXmXcX=.5 $.BXgXeX!.D.3Xm + ",
+" <.sXB.R.R.A.V.| {.KXUXUXUXUXLXKXGXvX|.c u qXdXgX^.U.f.3XH f ",
+" <.sXB.T.Z.m.[ nXUXUXUXUXPXKXHXbX,X) e <XdXiX_.S.u.P.F.t.h ",
+" <.sXk.Z.r.K jXUXUXUXPXLXKXmXcX@.5 %.DXiX_.Y.S.d.h.D.*Xl X ",
+" <.wXq.r.X.r UXUXPXPXKXmXvX|.y _ NXdXrX!.S.d.h.d.f.=XF 4 YX",
+" ,.0X5.X.) a PXPXKXGXnX>X) y >XAXAX_.S.h.h.u.s.d.F.6.g YX",
+" >.9X~ } u '.LXKXmXxX .5 [.IXAX_.!.S.h.h.d.8.s.D.n.j YXYX",
+" >.:XW v & kXmXvX;.t ] BXAXrX!.U.u.S.9.u.3.7.i.;XM 1 YXYXYX",
+" E #Xb u : nXcX_ u 1XSXgX^.U.H.S.d.8.s.d.u.b.-XG g YXYXYXYX",
+" R +Xc r a zX[.= -XdX_.U.d.P.h.d.u.3.8.N.=Xw.l 1 YXYXYXYX",
+" T }.x > `.oX> %.*.S.S.h.S.7.d.h.0.p.n.c.M d . YXYXYXYXYX",
+" C ].w @ XXu p *.( h.S.s.u.u.u.p.N.*X^ g + YXYXYXYXYXYX",
+" Z &.e ; ` * :.o.S.S.S.u.( 9.x.&XX.j , YXYXYXYXYXYX",
+" B { 0 i % [.o.u.S.d.h.9.M.&Xz.M 6 YXYXYXYXYXYXYXYX",
+" z { 0 - J *./ S.9.d.i.G.&XF g O YXYXYXYXYXYXYXYXYXYX",
+" z $.2 w =.! s.d.p.N.;X^ l , YXYXYXYXYXYXYXYXYXYXYX",
+" B &.9 ;.Q / j.x.@Xl.m 6 YXYXYXYXYXYXYXYXYXYXYXYXYX",
+" h W @.+.I y.&Xb.F 7 O YXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+" $ s %XU F.=X^ j # YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+" g O.<Xe.l 1 YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+" o f n d . YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX"
+};
diff --git a/languages/ruby/app_templates/qtruby4app/filesave.xpm b/languages/ruby/app_templates/qtruby4app/filesave.xpm
new file mode 100644
index 00000000..86ea7d63
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/filesave.xpm
@@ -0,0 +1,295 @@
+/* XPM */
+static char *filesave[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c #000000",
+". c #06060A",
+"X c #09090D",
+"o c #0B0B16",
+"O c #101022",
+"+ c #1E1E28",
+"@ c #181829",
+"# c #151F3A",
+"$ c #1A263F",
+"% c #1D2A3F",
+"& c #272730",
+"* c #2E2E3F",
+"= c #212140",
+"- c #212E41",
+"; c #2F2F41",
+": c #292A4A",
+"> c #23224B",
+", c #262353",
+"< c #292655",
+"1 c #2B2C54",
+"2 c #2C2C5B",
+"3 c #293746",
+"4 c #2D304F",
+"5 c #243243",
+"6 c #2E315D",
+"7 c #363647",
+"8 c #303E4A",
+"9 c #30325E",
+"0 c #3C3C53",
+"q c #2E2E60",
+"w c #2F3160",
+"e c #302E63",
+"r c #313164",
+"t c #363861",
+"y c #353868",
+"u c #384650",
+"i c #284F6B",
+"p c #2D547B",
+"a c #3B486A",
+"s c #36597D",
+"d c #3D5D7C",
+"f c #4C4C4C",
+"g c #40405A",
+"h c #414E56",
+"j c #4B585E",
+"k c #49545E",
+"l c #555555",
+"z c #4D4D6B",
+"x c #434675",
+"c c #4B5660",
+"v c #4F5962",
+"b c #41517E",
+"n c #4B507D",
+"m c #515C67",
+"M c #505D6E",
+"N c #5C5D7D",
+"B c #546066",
+"V c #54626D",
+"C c #5B646D",
+"Z c #55677A",
+"A c #556B78",
+"S c #5D6772",
+"D c #6B6B6B",
+"F c #646464",
+"G c #616C73",
+"H c #63707D",
+"J c #6B7679",
+"K c gray45",
+"L c #00418E",
+"P c #004494",
+"I c #004894",
+"U c #044F98",
+"Y c #03509B",
+"T c #0A5198",
+"R c #13579C",
+"E c #185DA1",
+"W c #285888",
+"Q c #2B6094",
+"! c #396D9A",
+"~ c #336A96",
+"^ c #3D719B",
+"/ c #226EB8",
+"( c #326EA8",
+") c #326BA3",
+"_ c #3673AE",
+"` c #3A76B4",
+"' c #0B6FD1",
+"] c #0F75D8",
+"[ c #1479DA",
+"{ c #1B7CDC",
+"} c #466481",
+"| c #42749C",
+" . c #4A799E",
+".. c #506A84",
+"X. c #5F678D",
+"o. c #576391",
+"O. c #5A6592",
+"+. c #5F6893",
+"@. c #5B738B",
+"#. c #507DA1",
+"$. c #626283",
+"%. c #636A94",
+"&. c #656F98",
+"*. c #657A8F",
+"=. c #6B7299",
+"-. c #717191",
+";. c #797998",
+":. c #687BA6",
+">. c #2281DC",
+",. c #3F81C0",
+"<. c #3988D7",
+"1. c #2785E1",
+"2. c #2E8AE3",
+"3. c #368FE5",
+"4. c #3690E6",
+"5. c #3D93E7",
+"6. c #3D94E9",
+"7. c #57839E",
+"8. c #4787BC",
+"9. c #5480A1",
+"0. c #5B84A3",
+"q. c #6E8496",
+"w. c #6E8B9A",
+"e. c #7D848E",
+"r. c #728597",
+"t. c #738598",
+"y. c #768899",
+"u. c #7B8B9B",
+"i. c #6489A5",
+"p. c #698EA7",
+"a. c #6D8FA9",
+"s. c #6E81AB",
+"d. c #7683A6",
+"f. c #768CB7",
+"g. c #7395AD",
+"h. c #7C96B0",
+"j. c #4086CA",
+"k. c #4986C3",
+"l. c #4284C3",
+"z. c #498ED2",
+"x. c #4D95DB",
+"c. c #548DC5",
+"v. c #5D92C8",
+"b. c #5593C9",
+"n. c #5097DE",
+"m. c #5198DE",
+"M. c #4296E7",
+"N. c #4895E2",
+"B. c #4B99E5",
+"V. c #4A9CEB",
+"C. c #4599EB",
+"Z. c #529DE6",
+"A. c #589EE2",
+"S. c #54A1EB",
+"D. c #5AA1E6",
+"F. c #5AA5EB",
+"G. c #5EA8EF",
+"H. c #53A3F1",
+"J. c #5EAAF2",
+"K. c #6699CB",
+"L. c #799BC8",
+"P. c #7EA6C9",
+"I. c #60A2E5",
+"U. c #65A7E8",
+"Y. c #6BABE9",
+"T. c #68ADF2",
+"R. c #67B0F5",
+"E. c #6DB3F6",
+"W. c #70ADEA",
+"Q. c #75B0E9",
+"!. c #7CB5EB",
+"~. c #73B9F8",
+"^. c #7BBDFB",
+"/. c #7CBAF6",
+"(. c gray55",
+"). c #828899",
+"_. c #84949E",
+"`. c #918E8A",
+"'. c #949494",
+"]. c #8F8FA9",
+"[. c #8997A5",
+"{. c #8A9AA9",
+"}. c #9A9BAF",
+"|. c #9399A9",
+" X c #9FAAB5",
+".X c #A29E9B",
+"XX c #A7A7A7",
+"oX c #ABABAB",
+"OX c #A3A3B4",
+"+X c #A8A8B7",
+"@X c #A3ABB3",
+"#X c #B4B5B5",
+"$X c #B0B0BC",
+"%X c #B7B9BC",
+"&X c #BBB7B3",
+"*X c #BBBBBB",
+"=X c #82B1DB",
+"-X c #81B7EC",
+";X c #88BBED",
+":X c #86BAED",
+">X c #AEBBC8",
+",X c #A6BDCD",
+"<X c #BBBCC3",
+"1X c #81C1F6",
+"2X c #83C2FA",
+"3X c #89C4FA",
+"4X c #8CC8FC",
+"5X c #95C2EF",
+"6X c #93CBFD",
+"7X c #9BCFFF",
+"8X c #97D0FC",
+"9X c #9CD3FE",
+"0X c #BEC0C1",
+"qX c #A3C7E7",
+"wX c #A2CAF1",
+"eX c #A1D4FF",
+"rX c #A3D8FF",
+"tX c #AADBFF",
+"yX c #B0D1F2",
+"uX c #BDD9F4",
+"iX c #AAE0FF",
+"pX c #B3E1FF",
+"aX c #B9E6FF",
+"sX c #BEE9FF",
+"dX c #C4C4C4",
+"fX c #C6C5CD",
+"gX c #C6C8CB",
+"hX c #CAC7C4",
+"jX c #CAC8C6",
+"kX c #CBCCCB",
+"lX c #D1D0CE",
+"zX c #D3D3D3",
+"xX c #D4D7D9",
+"cX c #D8D8D7",
+"vX c #DBDBDB",
+"bX c #C4ECFF",
+"nX c #C9E0F6",
+"mX c #C4F5FF",
+"MX c #CCF2FF",
+"NX c #D5E6F7",
+"BX c #DDEBF9",
+"VX c #DCFDFF",
+"CX c #D3F1F5",
+"ZX c #E1E0DE",
+"AX c #E4E3E3",
+"SX c #E4E7EA",
+"DX c #E7E8E9",
+"FX c #E8E6E4",
+"GX c #EDE9E5",
+"HX c #EBEBEB",
+"JX c #E7EEF5",
+"KX c #EAF2FA",
+"LX c #F1EEEA",
+"PX c #F3F3F3",
+"IX c #F4F8FC",
+"UX c #FDFDFC",
+"YX c None",
+/* pixels */
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXy y e 6 6 2 < < , , 1 YXYX",
+"YXYXYX2 < , , q w 2 e r r r w e w r e 2 6 1 6 s :.f.L.y YXYX",
+"YXYXYXx d.s.:.a # $ $ % - 5 3 8 u h k B S J ).,XF.b.7.r YXYX",
+"YXYXYX&.mX~.8.V #X#X%XdXfXzXxXvXZXZXDXFXFXDXLXDX>.U i 9 YXYX",
+"YXYXYXo.2X] L C UXDXcXzXkXkXkXjXjXdXdX%X%X&X%X*XN.' ~ 6 YXYX",
+"YXYXYXo.1X] P k hXoXXXXXoXoX#X#X*X%X&X%X%XdXkXxXx.[ ~ 6 YXYX",
+"YXYXYXO.3X[ I m FXkXjXjXkXkXkXkXkXkXzXzXzXcXZXSXx.{ ! 6 YXYX",
+"YXYXYXo.3X{ I S UXvXxXzXkXkXkXkXkXjXdX*X%X#X&X%XZ.1.^ 9 YXYX",
+"YXYXYXO.4X>.U j jX#X#X#X%XdXdXkXzXkXzXzXcXvXDXJXA.1.| 6 YXYX",
+"YXYXYXO.6X>.T V PXZXZXZXAXSXDXDXFXHXDXHXHXHXHXSXI.2.| 9 YXYX",
+"YXYXYXO.6X2.T G UXLXDXDXAXZXZXAXZXvXcXzXkXkXkXgXY.3. .6 YXYX",
+"YXYXYXO.9X4.R m zXdXdXkXzXvXAXDXHXLXPXPXIXUXUXUXQ.6. .9 YXYX",
+"YXYXYXO.9X5.R H UXIXUXUXUXUXUXUXUXUXUXUXIXKXJXBX-XC.#.9 YXYX",
+"YXYXYXO.eXM./ h.UXUXIXKXBXNXnXuXyXwX5X:X!.Y.Y.Y.D.H.9.6 YXYX",
+"YXYXYX+.rXB.<.x.Q.;X-XQ.Y.U.U.D.Z.Z.B.B.C.V.V.B.B.T.0.9 YXYX",
+"YXYXYX+.tXB.N.B.B.B.B.C.V.V.H.H.H.D.N.z.8._ ( <.D.R.0.9 YXYX",
+"YXYXYX+.tXS.Z.F.D.m.z.l.` ) Q W p s } @.r.[. X>XG.E.0.9 YXYX",
+"YXYXYX+.pXU.m.) p d ..*.u.|.+X<XzXZXGXLXGXZXzXjX/.~.p.r YXYX",
+"YXYXYX%.aXT.k.*.GXlX&X.X`..XhXlXzXvXvXvXvXxXkXgX2X^.a.w YXYX",
+"YXYXYX%.aXE.k.r.LXoXl f l F *XlXzXvXvXvXvXcXzXgX4X:Xa.w YXYX",
+"YXYXYX%.bX~.c.y.LX'.f D K D 0XkXzXvXvXvXvXvXzXfX6X4Xg.9 YXYX",
+"YXYXYX%.bX^.c.y.LX'.l D K D 0XlXzXcXvXvXvXxXkXkX9X6Xw.r YXYX",
+"YXYXYX%.bX2Xv.u.LX'.l K K K 0XlXzXcXvXvXvXvXkXfX9XP.M = YXYX",
+"YXYXYX%.bX2XK.u.LX'.l K K D 0XlXxXcXvXZXvXxXzXkXqXZ : . YXYX",
+"YXYXYX%.MX6XK.u.LX'.f F D D 0XkXzXcXvXvXvXvXcXkX_.: o YXYX",
+"YXYXYX%.MX6XK.u.LXXX(.XX&XdXkXzXvXZXDXAXzX<X+X}.N O YXYX",
+"YXYXYX%.VXiX=X{.FXzXkXkXjXdX<X$XOX].;.$.z 0 7 & X YXYXYX",
+"YXYXYX=.CXq.A ).fX+X|.).-.N z 0 * + o YXYXYXYX",
+"YXYXYXn $.t 6 , 4 0 * + . YXYXYXYXYXYX",
+"YXYXYX> @ o YXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX"
+};
diff --git a/languages/ruby/app_templates/qtruby4app/main.rb b/languages/ruby/app_templates/qtruby4app/main.rb
new file mode 100644
index 00000000..7b5aaf60
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/main.rb
@@ -0,0 +1,10 @@
+require 'Qt4'
+require '%{APPNAMELC}.rb'
+require 'qrc_application.rb'
+
+app = Qt::Application.new(ARGV)
+mw = %{APPNAME}.new
+mw.show
+app.exec
+
+
diff --git a/languages/ruby/app_templates/qtruby4app/qrc_application.rb b/languages/ruby/app_templates/qtruby4app/qrc_application.rb
new file mode 100644
index 00000000..b2bd7673
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qrc_application.rb
@@ -0,0 +1,2281 @@
+#****************************************************************************
+#** Ruby Resource object code
+#**
+#** Created: Mon Dec 3 14:03:30 2007
+#** by: The Ruby Resource Compiler for Qt version 4.3.0
+#**
+#** WARNING! All changes made in this file will be lost!
+#****************************************************************************/
+
+class QCleanupResources__dest_class__
+ def self.qt_resource_data
+ return @@qt_resource_data
+ end
+
+ def self.qt_resource_name
+ return @@qt_resource_name
+ end
+
+ def self.qt_resource_struct
+ return @@qt_resource_struct
+ end
+
+@@qt_resource_data = [
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/fileopen.xpm
+ 0x0,0x0,0x18,0xf9,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x66,0x69,0x6c,0x65,0x6f,0x70,0x65,0x6e,0x5b,0x5d,
+ 0x20,0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,
+ 0x72,0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,
+ 0x73,0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,
+ 0x33,0x32,0x20,0x33,0x32,0x20,0x32,0x35,0x37,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x63,0x20,0x62,0x6c,0x61,0x63,0x6b,0x22,0x2c,0xa,0x22,0x2e,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x42,0x30,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x58,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x33,0x30,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x36,0x31,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x4f,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x33,0x31,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x2b,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x35,0x32,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x42,0x33,0x31,0x31,0x43,0x22,0x2c,0xa,0x22,0x23,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x33,0x33,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x24,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x46,0x33,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x41,0x33,0x45,0x31,0x36,0x22,0x2c,0xa,0x22,0x26,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x41,0x33,0x44,0x32,0x32,0x22,0x2c,0xa,0x22,0x2a,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x44,0x34,0x32,0x31,0x41,0x22,0x2c,0xa,0x22,0x3d,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x34,0x34,0x32,0x30,0x44,0x22,0x2c,0xa,0x22,0x2d,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x45,0x34,0x35,0x32,0x39,0x22,0x2c,0xa,0x22,0x3b,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x38,0x34,0x33,0x33,0x38,0x22,0x2c,0xa,0x22,0x3a,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x38,0x34,0x32,0x33,0x33,0x22,0x2c,0xa,0x22,0x3e,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x42,0x34,0x42,0x32,0x34,0x22,0x2c,0xa,0x22,0x2c,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x32,0x34,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x3c,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x37,0x34,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x31,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x44,0x34,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x32,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x45,0x34,0x46,0x31,0x37,0x22,0x2c,0xa,0x22,0x33,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x44,0x35,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x34,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x37,0x35,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x35,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x34,0x35,0x42,0x30,0x46,0x22,0x2c,0xa,0x22,0x36,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x39,0x35,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x41,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x31,0x35,0x43,0x31,0x38,0x22,0x2c,0xa,0x22,0x39,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x36,0x34,0x42,0x30,0x41,0x22,0x2c,0xa,0x22,0x30,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x43,0x35,0x34,0x32,0x33,0x22,0x2c,0xa,0x22,0x71,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x44,0x35,0x39,0x32,0x45,0x22,0x2c,0xa,0x22,0x77,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x38,0x35,0x45,0x32,0x37,0x22,0x2c,0xa,0x22,0x65,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x33,0x35,0x36,0x32,0x36,0x22,0x2c,0xa,0x22,0x72,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x36,0x35,0x37,0x33,0x36,0x22,0x2c,0xa,0x22,0x74,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x41,0x36,0x33,0x31,0x44,0x22,0x2c,0xa,0x22,0x79,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x41,0x36,0x37,0x32,0x45,0x22,0x2c,0xa,0x22,0x75,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x37,0x36,0x35,0x33,0x35,0x22,0x2c,0xa,0x22,0x69,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x43,0x35,0x39,0x35,0x36,0x22,0x2c,0xa,0x22,0x70,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x38,0x37,0x30,0x34,0x46,0x22,0x2c,0xa,0x22,0x61,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x35,0x37,0x32,0x36,0x45,0x22,0x2c,0xa,0x22,0x73,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x44,0x34,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x64,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x31,0x35,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x66,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x33,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x67,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x41,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x68,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x36,0x36,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x6a,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x36,0x36,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x6b,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x35,0x36,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x6c,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x36,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x7a,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x44,0x37,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x78,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x35,0x36,0x42,0x32,0x41,0x22,0x2c,0xa,0x22,0x63,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x37,0x35,0x32,0x41,0x22,0x2c,0xa,0x22,0x76,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x37,0x32,0x33,0x42,0x22,0x2c,0xa,0x22,0x62,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x37,0x39,0x33,0x39,0x22,0x2c,0xa,0x22,0x6e,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x34,0x35,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x6d,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x36,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x4d,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x36,0x38,0x30,0x44,0x22,0x2c,0xa,0x22,0x4e,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x36,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x42,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x30,0x37,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x56,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x35,0x37,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x43,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x37,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x5a,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x37,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x41,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x46,0x37,0x32,0x31,0x41,0x22,0x2c,0xa,0x22,0x53,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x37,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x44,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x37,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x46,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x30,0x37,0x33,0x31,0x41,0x22,0x2c,0xa,0x22,0x47,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x37,0x43,0x32,0x36,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x37,0x37,0x45,0x32,0x38,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x39,0x37,0x46,0x35,0x39,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x37,0x43,0x34,0x30,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x37,0x46,0x35,0x38,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x30,0x37,0x41,0x36,0x43,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x38,0x32,0x31,0x44,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x46,0x38,0x41,0x33,0x35,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x43,0x38,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x38,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x36,0x38,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x38,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x38,0x33,0x33,0x37,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x38,0x42,0x33,0x31,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x46,0x39,0x35,0x33,0x35,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x38,0x45,0x33,0x41,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x38,0x36,0x33,0x33,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x39,0x39,0x33,0x36,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x43,0x41,0x30,0x33,0x39,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x39,0x38,0x34,0x34,0x35,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x38,0x36,0x35,0x37,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x42,0x38,0x32,0x36,0x34,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x45,0x38,0x35,0x37,0x32,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x38,0x38,0x36,0x34,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x38,0x43,0x37,0x35,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x46,0x39,0x30,0x37,0x32,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x38,0x38,0x34,0x35,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x34,0x38,0x39,0x35,0x32,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x39,0x36,0x35,0x43,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x38,0x39,0x31,0x35,0x36,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x39,0x33,0x34,0x44,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x39,0x44,0x34,0x35,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x39,0x37,0x35,0x35,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x39,0x38,0x34,0x41,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x39,0x41,0x36,0x35,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x39,0x37,0x37,0x38,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x35,0x39,0x38,0x37,0x34,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x39,0x42,0x37,0x41,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x39,0x37,0x37,0x35,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x41,0x39,0x35,0x39,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x41,0x34,0x36,0x43,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x31,0x41,0x30,0x37,0x46,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x41,0x39,0x37,0x41,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x42,0x33,0x37,0x42,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x39,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x39,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x39,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x39,0x38,0x31,0x32,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x41,0x33,0x31,0x43,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x41,0x36,0x33,0x45,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x37,0x41,0x45,0x33,0x37,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x39,0x38,0x34,0x30,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x39,0x42,0x34,0x45,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x41,0x36,0x34,0x31,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x41,0x41,0x34,0x33,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x41,0x43,0x34,0x35,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x41,0x46,0x34,0x39,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x41,0x37,0x34,0x36,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x41,0x31,0x35,0x38,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x41,0x36,0x35,0x44,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x41,0x38,0x35,0x37,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x46,0x41,0x39,0x35,0x41,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x41,0x43,0x35,0x30,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x44,0x42,0x31,0x34,0x42,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x42,0x33,0x35,0x38,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x42,0x31,0x35,0x32,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x41,0x42,0x35,0x39,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x42,0x35,0x34,0x44,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x42,0x39,0x35,0x31,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x42,0x43,0x35,0x42,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x42,0x34,0x35,0x45,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x39,0x42,0x44,0x35,0x36,0x22,0x2c,0xa,0x22,0x6a,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x42,0x37,0x35,0x33,0x22,0x2c,0xa,0x22,0x6b,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x41,0x42,0x34,0x38,0x22,0x2c,0xa,0x22,0x6c,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x41,0x45,0x36,0x39,0x22,0x2c,0xa,0x22,0x7a,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x41,0x44,0x36,0x37,0x22,0x2c,0xa,0x22,0x78,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x42,0x36,0x36,0x32,0x22,0x2c,0xa,0x22,0x63,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x42,0x32,0x36,0x42,0x22,0x2c,0xa,0x22,0x76,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x42,0x36,0x36,0x42,0x22,0x2c,0xa,0x22,0x62,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x42,0x37,0x37,0x35,0x22,0x2c,0xa,0x22,0x6e,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x42,0x45,0x37,0x46,0x22,0x2c,0xa,0x22,0x6d,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x41,0x44,0x36,0x36,0x22,0x2c,0xa,0x22,0x4d,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x42,0x45,0x36,0x34,0x22,0x2c,0xa,0x22,0x4e,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x42,0x46,0x36,0x44,0x22,0x2c,0xa,0x22,0x42,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x42,0x33,0x34,0x42,0x22,0x2c,0xa,0x22,0x56,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x42,0x37,0x35,0x46,0x22,0x2c,0xa,0x22,0x43,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x42,0x38,0x35,0x46,0x22,0x2c,0xa,0x22,0x5a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x42,0x41,0x36,0x31,0x22,0x2c,0xa,0x22,0x41,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x42,0x45,0x36,0x33,0x22,0x2c,0xa,0x22,0x53,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x43,0x31,0x35,0x39,0x22,0x2c,0xa,0x22,0x44,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x43,0x32,0x36,0x39,0x22,0x2c,0xa,0x22,0x46,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x43,0x31,0x37,0x36,0x22,0x2c,0xa,0x22,0x47,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x43,0x36,0x37,0x46,0x22,0x2c,0xa,0x22,0x48,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x43,0x35,0x35,0x44,0x22,0x2c,0xa,0x22,0x4a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x43,0x30,0x35,0x44,0x22,0x2c,0xa,0x22,0x4b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x43,0x31,0x35,0x45,0x22,0x2c,0xa,0x22,0x4c,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x43,0x32,0x36,0x34,0x22,0x2c,0xa,0x22,0x50,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x35,0x43,0x39,0x36,0x31,0x22,0x2c,0xa,0x22,0x49,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x44,0x43,0x31,0x36,0x34,0x22,0x2c,0xa,0x22,0x55,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x43,0x44,0x36,0x35,0x22,0x2c,0xa,0x22,0x59,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x44,0x33,0x36,0x42,0x22,0x2c,0xa,0x22,0x54,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x32,0x43,0x35,0x36,0x34,0x22,0x2c,0xa,0x22,0x52,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x36,0x43,0x38,0x36,0x38,0x22,0x2c,0xa,0x22,0x45,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x38,0x43,0x37,0x36,0x30,0x22,0x2c,0xa,0x22,0x57,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x42,0x43,0x43,0x36,0x41,0x22,0x2c,0xa,0x22,0x51,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x43,0x42,0x36,0x33,0x22,0x2c,0xa,0x22,0x21,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x44,0x35,0x36,0x44,0x22,0x2c,0xa,0x22,0x7e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x30,0x36,0x43,0x22,0x2c,0xa,0x22,0x5e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x44,0x39,0x37,0x32,0x22,0x2c,0xa,0x22,0x2f,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x31,0x37,0x35,0x22,0x2c,0xa,0x22,0x28,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x41,0x44,0x45,0x37,0x37,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x43,0x38,0x37,0x41,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x45,0x32,0x37,0x43,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x46,0x39,0x31,0x39,0x32,0x22,0x2c,0xa,0x22,0x27,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x41,0x39,0x41,0x39,0x36,0x22,0x2c,0xa,0x22,0x5d,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x39,0x46,0x38,0x33,0x22,0x2c,0xa,0x22,0x5b,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x41,0x35,0x38,0x33,0x22,0x2c,0xa,0x22,0x7b,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x41,0x33,0x39,0x39,0x22,0x2c,0xa,0x22,0x7d,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x41,0x43,0x38,0x36,0x22,0x2c,0xa,0x22,0x7c,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x42,0x30,0x38,0x38,0x22,0x2c,0xa,0x22,0x20,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x42,0x32,0x39,0x38,0x22,0x2c,0xa,0x22,0x2e,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x41,0x38,0x41,0x36,0x22,0x2c,0xa,0x22,0x58,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x41,0x45,0x42,0x30,0x22,0x2c,0xa,0x22,0x6f,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x42,0x36,0x42,0x34,0x22,0x2c,0xa,0x22,0x4f,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x41,0x42,0x43,0x42,0x43,0x22,0x2c,0xa,0x22,0x2b,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x42,0x33,0x38,0x45,0x22,0x2c,0xa,0x22,0x40,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x42,0x45,0x38,0x30,0x22,0x2c,0xa,0x22,0x23,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x30,0x42,0x43,0x39,0x35,0x22,0x2c,0xa,0x22,0x24,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x42,0x46,0x41,0x36,0x22,0x2c,0xa,0x22,0x25,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x43,0x32,0x39,0x44,0x22,0x2c,0xa,0x22,0x26,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x43,0x32,0x38,0x33,0x22,0x2c,0xa,0x22,0x2a,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x43,0x37,0x38,0x39,0x22,0x2c,0xa,0x22,0x3d,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x43,0x41,0x38,0x42,0x22,0x2c,0xa,0x22,0x2d,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x43,0x34,0x38,0x39,0x22,0x2c,0xa,0x22,0x3b,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x43,0x44,0x39,0x34,0x22,0x2c,0xa,0x22,0x3a,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x43,0x36,0x39,0x39,0x22,0x2c,0xa,0x22,0x3e,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x46,0x43,0x38,0x42,0x31,0x22,0x2c,0xa,0x22,0x2c,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x43,0x36,0x42,0x37,0x22,0x2c,0xa,0x22,0x3c,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x43,0x39,0x41,0x36,0x22,0x2c,0xa,0x22,0x31,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x44,0x33,0x42,0x41,0x22,0x2c,0xa,0x22,0x32,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x43,0x39,0x38,0x31,0x22,0x2c,0xa,0x22,0x33,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x43,0x44,0x39,0x31,0x22,0x2c,0xa,0x22,0x34,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x44,0x36,0x38,0x36,0x22,0x2c,0xa,0x22,0x35,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x44,0x36,0x39,0x45,0x22,0x2c,0xa,0x22,0x36,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x36,0x38,0x32,0x22,0x2c,0xa,0x22,0x37,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x38,0x38,0x42,0x22,0x2c,0xa,0x22,0x38,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x43,0x39,0x35,0x22,0x2c,0xa,0x22,0x39,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x33,0x43,0x45,0x41,0x33,0x22,0x2c,0xa,0x22,0x30,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x45,0x44,0x39,0x41,0x39,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x44,0x43,0x42,0x39,0x22,0x2c,0xa,0x22,0x77,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x44,0x44,0x41,0x46,0x22,0x2c,0xa,0x22,0x65,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x36,0x38,0x41,0x22,0x2c,0xa,0x22,0x72,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x38,0x39,0x33,0x22,0x2c,0xa,0x22,0x74,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x41,0x39,0x46,0x22,0x2c,0xa,0x22,0x79,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x32,0x41,0x35,0x22,0x2c,0xa,0x22,0x75,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x33,0x41,0x43,0x22,0x2c,0xa,0x22,0x69,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x43,0x41,0x37,0x22,0x2c,0xa,0x22,0x70,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x44,0x41,0x45,0x22,0x2c,0xa,0x22,0x61,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x45,0x30,0x42,0x36,0x22,0x2c,0xa,0x22,0x73,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x45,0x35,0x42,0x34,0x22,0x2c,0xa,0x22,0x64,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x45,0x42,0x34,0x22,0x2c,0xa,0x22,0x66,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x38,0x45,0x35,0x42,0x42,0x22,0x2c,0xa,0x22,0x67,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x30,0x42,0x43,0x22,0x2c,0xa,0x22,0x68,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x43,0x37,0x43,0x38,0x22,0x2c,0xa,0x22,0x6a,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x37,0x43,0x38,0x43,0x41,0x22,0x2c,0xa,0x22,0x6b,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x43,0x45,0x43,0x46,0x22,0x2c,0xa,0x22,0x6c,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x43,0x41,0x43,0x30,0x22,0x2c,0xa,0x22,0x7a,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x44,0x43,0x45,0x44,0x30,0x22,0x2c,0xa,0x22,0x78,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x44,0x31,0x43,0x46,0x22,0x2c,0xa,0x22,0x63,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x44,0x33,0x44,0x34,0x22,0x2c,0xa,0x22,0x76,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x44,0x38,0x44,0x41,0x22,0x2c,0xa,0x22,0x62,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x44,0x43,0x44,0x45,0x22,0x2c,0xa,0x22,0x6e,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x43,0x44,0x45,0x45,0x30,0x22,0x2c,0xa,0x22,0x6d,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x45,0x45,0x30,0x45,0x32,0x22,0x2c,0xa,0x22,0x4d,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x44,0x45,0x43,0x32,0x22,0x2c,0xa,0x22,0x4e,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x45,0x31,0x43,0x35,0x22,0x2c,0xa,0x22,0x42,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x45,0x39,0x43,0x33,0x22,0x2c,0xa,0x22,0x56,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x45,0x41,0x43,0x45,0x22,0x2c,0xa,0x22,0x43,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x45,0x41,0x43,0x33,0x22,0x2c,0xa,0x22,0x5a,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x41,0x45,0x42,0x43,0x41,0x22,0x2c,0xa,0x22,0x41,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x31,0x43,0x31,0x22,0x2c,0xa,0x22,0x53,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x33,0x43,0x43,0x22,0x2c,0xa,0x22,0x44,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x36,0x44,0x41,0x22,0x2c,0xa,0x22,0x46,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x45,0x33,0x45,0x35,0x22,0x2c,0xa,0x22,0x47,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x45,0x36,0x45,0x38,0x22,0x2c,0xa,0x22,0x48,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x45,0x39,0x45,0x41,0x22,0x2c,0xa,0x22,0x4a,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x45,0x36,0x45,0x30,0x22,0x2c,0xa,0x22,0x4b,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x45,0x41,0x45,0x43,0x22,0x2c,0xa,0x22,0x4c,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x45,0x45,0x46,0x30,0x22,0x2c,0xa,0x22,0x50,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x45,0x46,0x30,0x46,0x32,0x22,0x2c,0xa,0x22,0x49,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x38,0x46,0x34,0x45,0x38,0x22,0x2c,0xa,0x22,0x55,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x46,0x33,0x46,0x35,0x22,0x2c,0xa,0x22,0x59,0x58,0x20,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,
+ 0x6c,0x73,0x20,0x2a,0x2f,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x56,
+ 0x20,0x45,0x20,0x3c,0x2e,0x2c,0x2e,0x54,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x3c,
+ 0x20,0x45,0x20,0x32,0x2e,0x61,0x58,0x43,0x58,0x56,0x58,0x45,0x20,0x33,0x20,0x45,
+ 0x20,0x3c,0x2e,0x45,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,
+ 0x20,0x52,0x20,0x2c,0x2e,0x35,0x58,0x43,0x58,0x38,0x58,0x51,0x2e,0x77,0x58,0x3c,
+ 0x2e,0x31,0x2e,0x24,0x2e,0x4f,0x58,0x3c,0x2e,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,
+ 0x20,0x52,0x20,0x3e,0x2e,0x4c,0x2e,0x5a,0x58,0x79,0x58,0x54,0x2e,0x4b,0x2e,0x45,
+ 0x2e,0x77,0x58,0x20,0x2e,0x2e,0x58,0x4b,0x58,0x4b,0x58,0x52,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,
+ 0x20,0x56,0x20,0x45,0x20,0x34,0x2e,0x5a,0x58,0x73,0x58,0x57,0x2e,0x4b,0x2e,0x49,
+ 0x2e,0x5a,0x2e,0x4f,0x2e,0x7b,0x2e,0x4b,0x58,0x55,0x58,0x55,0x58,0x4d,0x58,0x6b,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x52,0x20,0x45,0x20,0x37,0x20,0x59,
+ 0x58,0x3c,0x20,0x45,0x20,0x32,0x2e,0x61,0x58,0x73,0x58,0x36,0x58,0x43,0x2e,0x54,
+ 0x2e,0x5a,0x2e,0x77,0x2e,0x5b,0x20,0x78,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x32,0x58,0x33,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x52,0x20,0x3e,0x2e,0x29,0x2e,0x35,
+ 0x58,0x2c,0x2e,0x54,0x20,0x2c,0x2e,0x35,0x58,0x43,0x58,0x38,0x58,0x4b,0x2e,0x54,
+ 0x2e,0x41,0x2e,0x61,0x2e,0x5d,0x20,0x4f,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x32,0x2e,0x4f,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x20,0x20,0x59,0x20,0x45,0x20,0x5a,0x2e,0x5a,
+ 0x58,0x73,0x58,0x37,0x58,0x73,0x58,0x30,0x58,0x43,0x58,0x79,0x58,0x52,0x2e,0x4b,
+ 0x2e,0x49,0x2e,0x56,0x2e,0x5f,0x20,0x2e,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x4c,0x58,0x4b,0x58,0x4a,0x58,0x56,0x20,0x44,0x20,0x4e,0x20,0x53,
+ 0x20,0x37,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x7a,0x20,0x45,0x20,0x34,0x2e,0x66,
+ 0x58,0x73,0x58,0x2f,0x2e,0x4b,0x2e,0x7e,0x2e,0x2f,0x2e,0x36,0x58,0x7e,0x2e,0x49,
+ 0x2e,0x49,0x2e,0x43,0x2e,0x2e,0x2e,0x27,0x2e,0x4b,0x58,0x55,0x58,0x50,0x58,0x50,
+ 0x58,0x50,0x58,0x4c,0x58,0x4b,0x58,0x47,0x58,0x62,0x58,0x6c,0x2e,0x4e,0x20,0x6d,
+ 0x2e,0x53,0x58,0x6d,0x2e,0x44,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x45,0x20,0x30,
+ 0x58,0x67,0x58,0x37,0x58,0x45,0x2e,0x57,0x2e,0x57,0x2e,0x7e,0x2e,0x7e,0x2e,0x52,
+ 0x2e,0x49,0x2e,0x5a,0x2e,0x77,0x2e,0x27,0x20,0x62,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x50,0x58,0x50,0x58,0x4c,0x58,0x6d,0x58,0x62,0x58,0x24,0x58,0x29,0x20,0x7e,
+ 0x20,0x61,0x58,0x53,0x58,0x70,0x58,0x42,0x58,0x6e,0x20,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x3c,0x2e,0x43,0x58,0x54,0x2e,0x51,0x2e,0x7e,0x2e,0x57,0x2e,0x57,0x2e,0x52,
+ 0x2e,0x49,0x2e,0x41,0x2e,0x74,0x2e,0x5f,0x20,0x68,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x50,0x58,0x4c,0x58,0x47,0x58,0x6e,0x58,0x2c,0x58,0x20,0x2e,0x74,
+ 0x20,0x20,0x58,0x41,0x58,0x53,0x58,0x65,0x58,0x34,0x58,0x6c,0x2e,0x5a,0x20,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x3c,0x2e,0x73,0x58,0x42,0x2e,0x57,0x2e,0x57,0x2e,0x57,
+ 0x2e,0x54,0x2e,0x41,0x2e,0x67,0x2e,0x5f,0x20,0x6f,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x4c,0x58,0x4c,0x58,0x6d,0x58,0x63,0x58,0x3d,0x2e,0x35,
+ 0x20,0x24,0x2e,0x42,0x58,0x67,0x58,0x65,0x58,0x21,0x2e,0x44,0x2e,0x33,0x58,0x6d,
+ 0x20,0x2b,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x3c,0x2e,0x73,0x58,0x42,0x2e,0x52,
+ 0x2e,0x52,0x2e,0x41,0x2e,0x56,0x2e,0x7c,0x20,0x7b,0x2e,0x4b,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x4c,0x58,0x4b,0x58,0x47,0x58,0x76,0x58,0x7c,0x2e,0x63,
+ 0x20,0x75,0x20,0x71,0x58,0x64,0x58,0x67,0x58,0x5e,0x2e,0x55,0x2e,0x66,0x2e,0x33,
+ 0x58,0x48,0x20,0x66,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x3c,0x2e,0x73,
+ 0x58,0x42,0x2e,0x54,0x2e,0x5a,0x2e,0x6d,0x2e,0x5b,0x20,0x6e,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x50,0x58,0x4b,0x58,0x48,0x58,0x62,0x58,0x2c,0x58,0x29,
+ 0x20,0x65,0x20,0x3c,0x58,0x64,0x58,0x69,0x58,0x5f,0x2e,0x53,0x2e,0x75,0x2e,0x50,
+ 0x2e,0x46,0x2e,0x74,0x2e,0x68,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x3c,0x2e,0x73,0x58,0x6b,0x2e,0x5a,0x2e,0x72,0x2e,0x4b,0x20,0x6a,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x50,0x58,0x4c,0x58,0x4b,0x58,0x6d,0x58,0x63,0x58,0x40,
+ 0x2e,0x35,0x20,0x25,0x2e,0x44,0x58,0x69,0x58,0x5f,0x2e,0x59,0x2e,0x53,0x2e,0x64,
+ 0x2e,0x68,0x2e,0x44,0x2e,0x2a,0x58,0x6c,0x20,0x58,0x20,0x20,0x20,0x20,0x20,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x3c,0x2e,0x77,0x58,0x71,0x2e,0x72,0x2e,0x58,0x2e,0x72,
+ 0x20,0x55,0x58,0x55,0x58,0x50,0x58,0x50,0x58,0x4b,0x58,0x6d,0x58,0x76,0x58,0x7c,
+ 0x2e,0x79,0x20,0x5f,0x20,0x4e,0x58,0x64,0x58,0x72,0x58,0x21,0x2e,0x53,0x2e,0x64,
+ 0x2e,0x68,0x2e,0x64,0x2e,0x66,0x2e,0x3d,0x58,0x46,0x20,0x34,0x20,0x20,0x20,0x20,
+ 0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x2c,0x2e,0x30,0x58,0x35,0x2e,0x58,
+ 0x2e,0x29,0x20,0x61,0x20,0x50,0x58,0x50,0x58,0x4b,0x58,0x47,0x58,0x6e,0x58,0x3e,
+ 0x58,0x29,0x20,0x79,0x20,0x3e,0x58,0x41,0x58,0x41,0x58,0x5f,0x2e,0x53,0x2e,0x68,
+ 0x2e,0x68,0x2e,0x75,0x2e,0x73,0x2e,0x64,0x2e,0x46,0x2e,0x36,0x2e,0x67,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x3e,0x2e,0x39,
+ 0x58,0x7e,0x20,0x7d,0x20,0x75,0x20,0x27,0x2e,0x4c,0x58,0x4b,0x58,0x6d,0x58,0x78,
+ 0x58,0x20,0x2e,0x35,0x20,0x5b,0x2e,0x49,0x58,0x41,0x58,0x5f,0x2e,0x21,0x2e,0x53,
+ 0x2e,0x68,0x2e,0x68,0x2e,0x64,0x2e,0x38,0x2e,0x73,0x2e,0x44,0x2e,0x6e,0x2e,0x6a,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x3e,0x2e,0x3a,0x58,0x57,0x20,0x76,0x20,0x26,0x20,0x6b,0x58,0x6d,0x58,0x76,
+ 0x58,0x3b,0x2e,0x74,0x20,0x5d,0x20,0x42,0x58,0x41,0x58,0x72,0x58,0x21,0x2e,0x55,
+ 0x2e,0x75,0x2e,0x53,0x2e,0x39,0x2e,0x75,0x2e,0x33,0x2e,0x37,0x2e,0x69,0x2e,0x3b,
+ 0x58,0x4d,0x20,0x31,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x45,0x20,0x23,0x58,0x62,0x20,0x75,0x20,0x3a,0x20,0x6e,
+ 0x58,0x63,0x58,0x5f,0x20,0x75,0x20,0x31,0x58,0x53,0x58,0x67,0x58,0x5e,0x2e,0x55,
+ 0x2e,0x48,0x2e,0x53,0x2e,0x64,0x2e,0x38,0x2e,0x73,0x2e,0x64,0x2e,0x75,0x2e,0x62,
+ 0x2e,0x2d,0x58,0x47,0x20,0x67,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x52,0x20,0x2b,0x58,0x63,0x20,0x72,
+ 0x20,0x61,0x20,0x7a,0x58,0x5b,0x2e,0x3d,0x20,0x2d,0x58,0x64,0x58,0x5f,0x2e,0x55,
+ 0x2e,0x64,0x2e,0x50,0x2e,0x68,0x2e,0x64,0x2e,0x75,0x2e,0x33,0x2e,0x38,0x2e,0x4e,
+ 0x2e,0x3d,0x58,0x77,0x2e,0x6c,0x20,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x54,0x20,0x7d,
+ 0x2e,0x78,0x20,0x3e,0x20,0x60,0x2e,0x6f,0x58,0x3e,0x20,0x25,0x2e,0x2a,0x2e,0x53,
+ 0x2e,0x53,0x2e,0x68,0x2e,0x53,0x2e,0x37,0x2e,0x64,0x2e,0x68,0x2e,0x30,0x2e,0x70,
+ 0x2e,0x6e,0x2e,0x63,0x2e,0x4d,0x20,0x64,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x43,0x20,0x5d,0x2e,0x77,0x20,0x40,0x20,0x58,0x58,0x75,0x20,0x70,0x20,0x2a,
+ 0x2e,0x28,0x20,0x68,0x2e,0x53,0x2e,0x73,0x2e,0x75,0x2e,0x75,0x2e,0x75,0x2e,0x70,
+ 0x2e,0x4e,0x2e,0x2a,0x58,0x5e,0x20,0x67,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x5a,0x20,0x26,0x2e,0x65,0x20,0x3b,0x20,0x60,0x20,0x2a,
+ 0x20,0x3a,0x2e,0x6f,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x75,0x2e,0x28,0x20,0x39,
+ 0x2e,0x78,0x2e,0x26,0x58,0x58,0x2e,0x6a,0x20,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x42,0x20,0x7b,0x20,0x30,0x20,0x69,
+ 0x20,0x25,0x20,0x5b,0x2e,0x6f,0x2e,0x75,0x2e,0x53,0x2e,0x64,0x2e,0x68,0x2e,0x39,
+ 0x2e,0x4d,0x2e,0x26,0x58,0x7a,0x2e,0x4d,0x20,0x36,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x7a,0x20,0x7b,
+ 0x20,0x30,0x20,0x2d,0x20,0x4a,0x20,0x2a,0x2e,0x2f,0x20,0x53,0x2e,0x39,0x2e,0x64,
+ 0x2e,0x69,0x2e,0x47,0x2e,0x26,0x58,0x46,0x20,0x67,0x20,0x4f,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x7a,0x20,0x24,0x2e,0x32,0x20,0x77,0x20,0x3d,0x2e,0x21,0x20,0x73,0x2e,0x64,
+ 0x2e,0x70,0x2e,0x4e,0x2e,0x3b,0x58,0x5e,0x20,0x6c,0x20,0x2c,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x42,0x20,0x26,0x2e,0x39,0x20,0x3b,0x2e,0x51,0x20,0x2f,
+ 0x20,0x6a,0x2e,0x78,0x2e,0x40,0x58,0x6c,0x2e,0x6d,0x20,0x36,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x68,0x20,0x57,0x20,0x40,0x2e,0x2b,
+ 0x2e,0x49,0x20,0x79,0x2e,0x26,0x58,0x62,0x2e,0x46,0x20,0x37,0x20,0x4f,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x24,0x20,0x73,
+ 0x20,0x25,0x58,0x55,0x20,0x46,0x2e,0x3d,0x58,0x5e,0x20,0x6a,0x20,0x23,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x20,0x67,0x20,0x4f,0x2e,0x3c,0x58,0x65,0x2e,0x6c,0x20,0x31,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x6f,0x20,0x66,0x20,0x6e,0x20,0x64,0x20,0x2e,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/filesave.xpm
+ 0x0,0x0,0x18,0xf9,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x66,0x69,0x6c,0x65,0x73,0x61,0x76,0x65,0x5b,0x5d,
+ 0x20,0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,
+ 0x72,0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,
+ 0x73,0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,
+ 0x33,0x32,0x20,0x33,0x32,0x20,0x32,0x35,0x37,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x63,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x2e,
+ 0x20,0x20,0x63,0x20,0x23,0x30,0x36,0x30,0x36,0x30,0x41,0x22,0x2c,0xa,0x22,0x58,
+ 0x20,0x20,0x63,0x20,0x23,0x30,0x39,0x30,0x39,0x30,0x44,0x22,0x2c,0xa,0x22,0x6f,
+ 0x20,0x20,0x63,0x20,0x23,0x30,0x42,0x30,0x42,0x31,0x36,0x22,0x2c,0xa,0x22,0x4f,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x30,0x31,0x30,0x32,0x32,0x22,0x2c,0xa,0x22,0x2b,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x45,0x31,0x45,0x32,0x38,0x22,0x2c,0xa,0x22,0x40,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x38,0x31,0x38,0x32,0x39,0x22,0x2c,0xa,0x22,0x23,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x35,0x31,0x46,0x33,0x41,0x22,0x2c,0xa,0x22,0x24,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x41,0x32,0x36,0x33,0x46,0x22,0x2c,0xa,0x22,0x25,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x44,0x32,0x41,0x33,0x46,0x22,0x2c,0xa,0x22,0x26,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x37,0x32,0x37,0x33,0x30,0x22,0x2c,0xa,0x22,0x2a,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x45,0x32,0x45,0x33,0x46,0x22,0x2c,0xa,0x22,0x3d,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x31,0x32,0x31,0x34,0x30,0x22,0x2c,0xa,0x22,0x2d,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x31,0x32,0x45,0x34,0x31,0x22,0x2c,0xa,0x22,0x3b,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x46,0x32,0x46,0x34,0x31,0x22,0x2c,0xa,0x22,0x3a,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x39,0x32,0x41,0x34,0x41,0x22,0x2c,0xa,0x22,0x3e,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x33,0x32,0x32,0x34,0x42,0x22,0x2c,0xa,0x22,0x2c,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x36,0x32,0x33,0x35,0x33,0x22,0x2c,0xa,0x22,0x3c,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x39,0x32,0x36,0x35,0x35,0x22,0x2c,0xa,0x22,0x31,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x42,0x32,0x43,0x35,0x34,0x22,0x2c,0xa,0x22,0x32,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x43,0x32,0x43,0x35,0x42,0x22,0x2c,0xa,0x22,0x33,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x39,0x33,0x37,0x34,0x36,0x22,0x2c,0xa,0x22,0x34,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x44,0x33,0x30,0x34,0x46,0x22,0x2c,0xa,0x22,0x35,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x34,0x33,0x32,0x34,0x33,0x22,0x2c,0xa,0x22,0x36,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x45,0x33,0x31,0x35,0x44,0x22,0x2c,0xa,0x22,0x37,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x36,0x33,0x36,0x34,0x37,0x22,0x2c,0xa,0x22,0x38,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x30,0x33,0x45,0x34,0x41,0x22,0x2c,0xa,0x22,0x39,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x30,0x33,0x32,0x35,0x45,0x22,0x2c,0xa,0x22,0x30,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x43,0x33,0x43,0x35,0x33,0x22,0x2c,0xa,0x22,0x71,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x45,0x32,0x45,0x36,0x30,0x22,0x2c,0xa,0x22,0x77,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x46,0x33,0x31,0x36,0x30,0x22,0x2c,0xa,0x22,0x65,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x30,0x32,0x45,0x36,0x33,0x22,0x2c,0xa,0x22,0x72,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x31,0x33,0x31,0x36,0x34,0x22,0x2c,0xa,0x22,0x74,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x36,0x33,0x38,0x36,0x31,0x22,0x2c,0xa,0x22,0x79,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x35,0x33,0x38,0x36,0x38,0x22,0x2c,0xa,0x22,0x75,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x38,0x34,0x36,0x35,0x30,0x22,0x2c,0xa,0x22,0x69,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x38,0x34,0x46,0x36,0x42,0x22,0x2c,0xa,0x22,0x70,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x44,0x35,0x34,0x37,0x42,0x22,0x2c,0xa,0x22,0x61,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x42,0x34,0x38,0x36,0x41,0x22,0x2c,0xa,0x22,0x73,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x36,0x35,0x39,0x37,0x44,0x22,0x2c,0xa,0x22,0x64,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x44,0x35,0x44,0x37,0x43,0x22,0x2c,0xa,0x22,0x66,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x43,0x34,0x43,0x34,0x43,0x22,0x2c,0xa,0x22,0x67,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x30,0x34,0x30,0x35,0x41,0x22,0x2c,0xa,0x22,0x68,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x31,0x34,0x45,0x35,0x36,0x22,0x2c,0xa,0x22,0x6a,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x42,0x35,0x38,0x35,0x45,0x22,0x2c,0xa,0x22,0x6b,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x39,0x35,0x34,0x35,0x45,0x22,0x2c,0xa,0x22,0x6c,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x35,0x35,0x35,0x35,0x35,0x22,0x2c,0xa,0x22,0x7a,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x44,0x34,0x44,0x36,0x42,0x22,0x2c,0xa,0x22,0x78,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x33,0x34,0x36,0x37,0x35,0x22,0x2c,0xa,0x22,0x63,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x42,0x35,0x36,0x36,0x30,0x22,0x2c,0xa,0x22,0x76,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x46,0x35,0x39,0x36,0x32,0x22,0x2c,0xa,0x22,0x62,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x31,0x35,0x31,0x37,0x45,0x22,0x2c,0xa,0x22,0x6e,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x42,0x35,0x30,0x37,0x44,0x22,0x2c,0xa,0x22,0x6d,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x31,0x35,0x43,0x36,0x37,0x22,0x2c,0xa,0x22,0x4d,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x30,0x35,0x44,0x36,0x45,0x22,0x2c,0xa,0x22,0x4e,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x43,0x35,0x44,0x37,0x44,0x22,0x2c,0xa,0x22,0x42,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x34,0x36,0x30,0x36,0x36,0x22,0x2c,0xa,0x22,0x56,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x34,0x36,0x32,0x36,0x44,0x22,0x2c,0xa,0x22,0x43,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x42,0x36,0x34,0x36,0x44,0x22,0x2c,0xa,0x22,0x5a,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x35,0x36,0x37,0x37,0x41,0x22,0x2c,0xa,0x22,0x41,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x35,0x36,0x42,0x37,0x38,0x22,0x2c,0xa,0x22,0x53,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x44,0x36,0x37,0x37,0x32,0x22,0x2c,0xa,0x22,0x44,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x42,0x36,0x42,0x36,0x42,0x22,0x2c,0xa,0x22,0x46,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x34,0x36,0x34,0x36,0x34,0x22,0x2c,0xa,0x22,0x47,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x31,0x36,0x43,0x37,0x33,0x22,0x2c,0xa,0x22,0x48,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x33,0x37,0x30,0x37,0x44,0x22,0x2c,0xa,0x22,0x4a,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x42,0x37,0x36,0x37,0x39,0x22,0x2c,0xa,0x22,0x4b,
+ 0x20,0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x34,0x35,0x22,0x2c,0xa,0x22,0x4c,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x30,0x34,0x31,0x38,0x45,0x22,0x2c,0xa,0x22,0x50,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x30,0x34,0x34,0x39,0x34,0x22,0x2c,0xa,0x22,0x49,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x30,0x34,0x38,0x39,0x34,0x22,0x2c,0xa,0x22,0x55,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x34,0x34,0x46,0x39,0x38,0x22,0x2c,0xa,0x22,0x59,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x33,0x35,0x30,0x39,0x42,0x22,0x2c,0xa,0x22,0x54,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x41,0x35,0x31,0x39,0x38,0x22,0x2c,0xa,0x22,0x52,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x33,0x35,0x37,0x39,0x43,0x22,0x2c,0xa,0x22,0x45,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x38,0x35,0x44,0x41,0x31,0x22,0x2c,0xa,0x22,0x57,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x38,0x35,0x38,0x38,0x38,0x22,0x2c,0xa,0x22,0x51,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x42,0x36,0x30,0x39,0x34,0x22,0x2c,0xa,0x22,0x21,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x39,0x36,0x44,0x39,0x41,0x22,0x2c,0xa,0x22,0x7e,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x33,0x36,0x41,0x39,0x36,0x22,0x2c,0xa,0x22,0x5e,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x44,0x37,0x31,0x39,0x42,0x22,0x2c,0xa,0x22,0x2f,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x32,0x36,0x45,0x42,0x38,0x22,0x2c,0xa,0x22,0x28,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x32,0x36,0x45,0x41,0x38,0x22,0x2c,0xa,0x22,0x29,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x32,0x36,0x42,0x41,0x33,0x22,0x2c,0xa,0x22,0x5f,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x36,0x37,0x33,0x41,0x45,0x22,0x2c,0xa,0x22,0x60,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x41,0x37,0x36,0x42,0x34,0x22,0x2c,0xa,0x22,0x27,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x42,0x36,0x46,0x44,0x31,0x22,0x2c,0xa,0x22,0x5d,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x46,0x37,0x35,0x44,0x38,0x22,0x2c,0xa,0x22,0x5b,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x34,0x37,0x39,0x44,0x41,0x22,0x2c,0xa,0x22,0x7b,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x42,0x37,0x43,0x44,0x43,0x22,0x2c,0xa,0x22,0x7d,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x36,0x36,0x34,0x38,0x31,0x22,0x2c,0xa,0x22,0x7c,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x37,0x34,0x39,0x43,0x22,0x2c,0xa,0x22,0x20,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x41,0x37,0x39,0x39,0x45,0x22,0x2c,0xa,0x22,0x2e,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x36,0x41,0x38,0x34,0x22,0x2c,0xa,0x22,0x58,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x46,0x36,0x37,0x38,0x44,0x22,0x2c,0xa,0x22,0x6f,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x37,0x36,0x33,0x39,0x31,0x22,0x2c,0xa,0x22,0x4f,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x36,0x35,0x39,0x32,0x22,0x2c,0xa,0x22,0x2b,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x46,0x36,0x38,0x39,0x33,0x22,0x2c,0xa,0x22,0x40,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x42,0x37,0x33,0x38,0x42,0x22,0x2c,0xa,0x22,0x23,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x37,0x44,0x41,0x31,0x22,0x2c,0xa,0x22,0x24,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x32,0x36,0x32,0x38,0x33,0x22,0x2c,0xa,0x22,0x25,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x33,0x36,0x41,0x39,0x34,0x22,0x2c,0xa,0x22,0x26,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x36,0x46,0x39,0x38,0x22,0x2c,0xa,0x22,0x2a,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x37,0x41,0x38,0x46,0x22,0x2c,0xa,0x22,0x3d,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x42,0x37,0x32,0x39,0x39,0x22,0x2c,0xa,0x22,0x2d,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x31,0x37,0x31,0x39,0x31,0x22,0x2c,0xa,0x22,0x3b,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x39,0x37,0x39,0x39,0x38,0x22,0x2c,0xa,0x22,0x3a,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x38,0x37,0x42,0x41,0x36,0x22,0x2c,0xa,0x22,0x3e,0x2e,
+ 0x20,0x63,0x20,0x23,0x32,0x32,0x38,0x31,0x44,0x43,0x22,0x2c,0xa,0x22,0x2c,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x46,0x38,0x31,0x43,0x30,0x22,0x2c,0xa,0x22,0x3c,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x39,0x38,0x38,0x44,0x37,0x22,0x2c,0xa,0x22,0x31,0x2e,
+ 0x20,0x63,0x20,0x23,0x32,0x37,0x38,0x35,0x45,0x31,0x22,0x2c,0xa,0x22,0x32,0x2e,
+ 0x20,0x63,0x20,0x23,0x32,0x45,0x38,0x41,0x45,0x33,0x22,0x2c,0xa,0x22,0x33,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x36,0x38,0x46,0x45,0x35,0x22,0x2c,0xa,0x22,0x34,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x36,0x39,0x30,0x45,0x36,0x22,0x2c,0xa,0x22,0x35,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x44,0x39,0x33,0x45,0x37,0x22,0x2c,0xa,0x22,0x36,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x44,0x39,0x34,0x45,0x39,0x22,0x2c,0xa,0x22,0x37,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x37,0x38,0x33,0x39,0x45,0x22,0x2c,0xa,0x22,0x38,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x37,0x38,0x37,0x42,0x43,0x22,0x2c,0xa,0x22,0x39,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x38,0x30,0x41,0x31,0x22,0x2c,0xa,0x22,0x30,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x42,0x38,0x34,0x41,0x33,0x22,0x2c,0xa,0x22,0x71,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x45,0x38,0x34,0x39,0x36,0x22,0x2c,0xa,0x22,0x77,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x45,0x38,0x42,0x39,0x41,0x22,0x2c,0xa,0x22,0x65,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x44,0x38,0x34,0x38,0x45,0x22,0x2c,0xa,0x22,0x72,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x32,0x38,0x35,0x39,0x37,0x22,0x2c,0xa,0x22,0x74,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x38,0x35,0x39,0x38,0x22,0x2c,0xa,0x22,0x79,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x36,0x38,0x38,0x39,0x39,0x22,0x2c,0xa,0x22,0x75,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x42,0x38,0x42,0x39,0x42,0x22,0x2c,0xa,0x22,0x69,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x34,0x38,0x39,0x41,0x35,0x22,0x2c,0xa,0x22,0x70,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x39,0x38,0x45,0x41,0x37,0x22,0x2c,0xa,0x22,0x61,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x44,0x38,0x46,0x41,0x39,0x22,0x2c,0xa,0x22,0x73,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x45,0x38,0x31,0x41,0x42,0x22,0x2c,0xa,0x22,0x64,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x36,0x38,0x33,0x41,0x36,0x22,0x2c,0xa,0x22,0x66,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x36,0x38,0x43,0x42,0x37,0x22,0x2c,0xa,0x22,0x67,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x39,0x35,0x41,0x44,0x22,0x2c,0xa,0x22,0x68,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x39,0x36,0x42,0x30,0x22,0x2c,0xa,0x22,0x6a,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x30,0x38,0x36,0x43,0x41,0x22,0x2c,0xa,0x22,0x6b,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x39,0x38,0x36,0x43,0x33,0x22,0x2c,0xa,0x22,0x6c,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x38,0x34,0x43,0x33,0x22,0x2c,0xa,0x22,0x7a,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x39,0x38,0x45,0x44,0x32,0x22,0x2c,0xa,0x22,0x78,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x44,0x39,0x35,0x44,0x42,0x22,0x2c,0xa,0x22,0x63,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x38,0x44,0x43,0x35,0x22,0x2c,0xa,0x22,0x76,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x44,0x39,0x32,0x43,0x38,0x22,0x2c,0xa,0x22,0x62,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x35,0x39,0x33,0x43,0x39,0x22,0x2c,0xa,0x22,0x6e,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x39,0x37,0x44,0x45,0x22,0x2c,0xa,0x22,0x6d,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x31,0x39,0x38,0x44,0x45,0x22,0x2c,0xa,0x22,0x4d,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x39,0x36,0x45,0x37,0x22,0x2c,0xa,0x22,0x4e,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x38,0x39,0x35,0x45,0x32,0x22,0x2c,0xa,0x22,0x42,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x42,0x39,0x39,0x45,0x35,0x22,0x2c,0xa,0x22,0x56,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x41,0x39,0x43,0x45,0x42,0x22,0x2c,0xa,0x22,0x43,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x35,0x39,0x39,0x45,0x42,0x22,0x2c,0xa,0x22,0x5a,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x32,0x39,0x44,0x45,0x36,0x22,0x2c,0xa,0x22,0x41,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x38,0x39,0x45,0x45,0x32,0x22,0x2c,0xa,0x22,0x53,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x41,0x31,0x45,0x42,0x22,0x2c,0xa,0x22,0x44,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x41,0x31,0x45,0x36,0x22,0x2c,0xa,0x22,0x46,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x41,0x35,0x45,0x42,0x22,0x2c,0xa,0x22,0x47,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x45,0x41,0x38,0x45,0x46,0x22,0x2c,0xa,0x22,0x48,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x33,0x41,0x33,0x46,0x31,0x22,0x2c,0xa,0x22,0x4a,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x45,0x41,0x41,0x46,0x32,0x22,0x2c,0xa,0x22,0x4b,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x36,0x39,0x39,0x43,0x42,0x22,0x2c,0xa,0x22,0x4c,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x39,0x39,0x42,0x43,0x38,0x22,0x2c,0xa,0x22,0x50,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x45,0x41,0x36,0x43,0x39,0x22,0x2c,0xa,0x22,0x49,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x30,0x41,0x32,0x45,0x35,0x22,0x2c,0xa,0x22,0x55,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x41,0x37,0x45,0x38,0x22,0x2c,0xa,0x22,0x59,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x42,0x41,0x42,0x45,0x39,0x22,0x2c,0xa,0x22,0x54,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x38,0x41,0x44,0x46,0x32,0x22,0x2c,0xa,0x22,0x52,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x37,0x42,0x30,0x46,0x35,0x22,0x2c,0xa,0x22,0x45,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x44,0x42,0x33,0x46,0x36,0x22,0x2c,0xa,0x22,0x57,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x30,0x41,0x44,0x45,0x41,0x22,0x2c,0xa,0x22,0x51,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x35,0x42,0x30,0x45,0x39,0x22,0x2c,0xa,0x22,0x21,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x42,0x35,0x45,0x42,0x22,0x2c,0xa,0x22,0x7e,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x42,0x39,0x46,0x38,0x22,0x2c,0xa,0x22,0x5e,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x42,0x42,0x44,0x46,0x42,0x22,0x2c,0xa,0x22,0x2f,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x42,0x41,0x46,0x36,0x22,0x2c,0xa,0x22,0x28,0x2e,
+ 0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x35,0x35,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x38,0x38,0x39,0x39,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x34,0x39,0x34,0x39,0x45,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x31,0x38,0x45,0x38,0x41,0x22,0x2c,0xa,0x22,0x27,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x34,0x39,0x34,0x39,0x34,0x22,0x2c,0xa,0x22,0x5d,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x46,0x38,0x46,0x41,0x39,0x22,0x2c,0xa,0x22,0x5b,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x39,0x39,0x37,0x41,0x35,0x22,0x2c,0xa,0x22,0x7b,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x41,0x39,0x41,0x41,0x39,0x22,0x2c,0xa,0x22,0x7d,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x41,0x39,0x42,0x41,0x46,0x22,0x2c,0xa,0x22,0x7c,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x33,0x39,0x39,0x41,0x39,0x22,0x2c,0xa,0x22,0x20,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x46,0x41,0x41,0x42,0x35,0x22,0x2c,0xa,0x22,0x2e,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x39,0x45,0x39,0x42,0x22,0x2c,0xa,0x22,0x58,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x41,0x37,0x41,0x37,0x22,0x2c,0xa,0x22,0x6f,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x41,0x42,0x41,0x42,0x22,0x2c,0xa,0x22,0x4f,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x41,0x33,0x42,0x34,0x22,0x2c,0xa,0x22,0x2b,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x38,0x41,0x38,0x42,0x37,0x22,0x2c,0xa,0x22,0x40,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x41,0x42,0x42,0x33,0x22,0x2c,0xa,0x22,0x23,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x42,0x35,0x42,0x35,0x22,0x2c,0xa,0x22,0x24,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x30,0x42,0x30,0x42,0x43,0x22,0x2c,0xa,0x22,0x25,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x37,0x42,0x39,0x42,0x43,0x22,0x2c,0xa,0x22,0x26,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x42,0x37,0x42,0x33,0x22,0x2c,0xa,0x22,0x2a,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x2c,0xa,0x22,0x3d,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x42,0x31,0x44,0x42,0x22,0x2c,0xa,0x22,0x2d,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x31,0x42,0x37,0x45,0x43,0x22,0x2c,0xa,0x22,0x3b,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x42,0x42,0x45,0x44,0x22,0x2c,0xa,0x22,0x3a,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x36,0x42,0x41,0x45,0x44,0x22,0x2c,0xa,0x22,0x3e,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x42,0x42,0x43,0x38,0x22,0x2c,0xa,0x22,0x2c,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x36,0x42,0x44,0x43,0x44,0x22,0x2c,0xa,0x22,0x3c,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x42,0x43,0x43,0x33,0x22,0x2c,0xa,0x22,0x31,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x31,0x43,0x31,0x46,0x36,0x22,0x2c,0xa,0x22,0x32,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x33,0x43,0x32,0x46,0x41,0x22,0x2c,0xa,0x22,0x33,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x39,0x43,0x34,0x46,0x41,0x22,0x2c,0xa,0x22,0x34,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x43,0x38,0x46,0x43,0x22,0x2c,0xa,0x22,0x35,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x35,0x43,0x32,0x45,0x46,0x22,0x2c,0xa,0x22,0x36,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x33,0x43,0x42,0x46,0x44,0x22,0x2c,0xa,0x22,0x37,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x42,0x43,0x46,0x46,0x46,0x22,0x2c,0xa,0x22,0x38,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x44,0x30,0x46,0x43,0x22,0x2c,0xa,0x22,0x39,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x44,0x33,0x46,0x45,0x22,0x2c,0xa,0x22,0x30,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x43,0x30,0x43,0x31,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x43,0x37,0x45,0x37,0x22,0x2c,0xa,0x22,0x77,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x43,0x41,0x46,0x31,0x22,0x2c,0xa,0x22,0x65,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x31,0x44,0x34,0x46,0x46,0x22,0x2c,0xa,0x22,0x72,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x44,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x74,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x44,0x42,0x46,0x46,0x22,0x2c,0xa,0x22,0x79,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x30,0x44,0x31,0x46,0x32,0x22,0x2c,0xa,0x22,0x75,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x44,0x39,0x46,0x34,0x22,0x2c,0xa,0x22,0x69,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x45,0x30,0x46,0x46,0x22,0x2c,0xa,0x22,0x70,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x45,0x31,0x46,0x46,0x22,0x2c,0xa,0x22,0x61,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x39,0x45,0x36,0x46,0x46,0x22,0x2c,0xa,0x22,0x73,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x45,0x39,0x46,0x46,0x22,0x2c,0xa,0x22,0x64,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x43,0x34,0x43,0x34,0x22,0x2c,0xa,0x22,0x66,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x43,0x35,0x43,0x44,0x22,0x2c,0xa,0x22,0x67,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x43,0x38,0x43,0x42,0x22,0x2c,0xa,0x22,0x68,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x43,0x37,0x43,0x34,0x22,0x2c,0xa,0x22,0x6a,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x43,0x38,0x43,0x36,0x22,0x2c,0xa,0x22,0x6b,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x43,0x43,0x43,0x42,0x22,0x2c,0xa,0x22,0x6c,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x44,0x30,0x43,0x45,0x22,0x2c,0xa,0x22,0x7a,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x44,0x33,0x44,0x33,0x22,0x2c,0xa,0x22,0x78,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x44,0x37,0x44,0x39,0x22,0x2c,0xa,0x22,0x63,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x44,0x38,0x44,0x37,0x22,0x2c,0xa,0x22,0x76,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x44,0x42,0x44,0x42,0x22,0x2c,0xa,0x22,0x62,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x45,0x43,0x46,0x46,0x22,0x2c,0xa,0x22,0x6e,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x39,0x45,0x30,0x46,0x36,0x22,0x2c,0xa,0x22,0x6d,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x46,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x4d,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x46,0x32,0x46,0x46,0x22,0x2c,0xa,0x22,0x4e,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x45,0x36,0x46,0x37,0x22,0x2c,0xa,0x22,0x42,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x45,0x42,0x46,0x39,0x22,0x2c,0xa,0x22,0x56,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x43,0x46,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x43,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x46,0x31,0x46,0x35,0x22,0x2c,0xa,0x22,0x5a,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x45,0x30,0x44,0x45,0x22,0x2c,0xa,0x22,0x41,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x45,0x33,0x45,0x33,0x22,0x2c,0xa,0x22,0x53,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x45,0x37,0x45,0x41,0x22,0x2c,0xa,0x22,0x44,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x45,0x38,0x45,0x39,0x22,0x2c,0xa,0x22,0x46,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x45,0x36,0x45,0x34,0x22,0x2c,0xa,0x22,0x47,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x44,0x45,0x39,0x45,0x35,0x22,0x2c,0xa,0x22,0x48,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x45,0x42,0x45,0x42,0x22,0x2c,0xa,0x22,0x4a,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x45,0x45,0x46,0x35,0x22,0x2c,0xa,0x22,0x4b,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x46,0x32,0x46,0x41,0x22,0x2c,0xa,0x22,0x4c,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x45,0x45,0x45,0x41,0x22,0x2c,0xa,0x22,0x50,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x33,0x46,0x33,0x46,0x33,0x22,0x2c,0xa,0x22,0x49,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x46,0x38,0x46,0x43,0x22,0x2c,0xa,0x22,0x55,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x46,0x44,0x46,0x43,0x22,0x2c,0xa,0x22,0x59,0x58,0x20,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,
+ 0x6c,0x73,0x20,0x2a,0x2f,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x79,0x20,0x79,0x20,0x65,0x20,0x36,
+ 0x20,0x36,0x20,0x32,0x20,0x3c,0x20,0x3c,0x20,0x2c,0x20,0x2c,0x20,0x31,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x32,0x20,0x3c,0x20,0x2c,0x20,0x2c,0x20,0x71,0x20,0x77,0x20,0x32,0x20,0x65,
+ 0x20,0x72,0x20,0x72,0x20,0x72,0x20,0x77,0x20,0x65,0x20,0x77,0x20,0x72,0x20,0x65,
+ 0x20,0x32,0x20,0x36,0x20,0x31,0x20,0x36,0x20,0x73,0x20,0x3a,0x2e,0x66,0x2e,0x4c,
+ 0x2e,0x79,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x78,0x20,0x64,0x2e,0x73,0x2e,0x3a,0x2e,0x61,0x20,0x23,
+ 0x20,0x24,0x20,0x24,0x20,0x25,0x20,0x2d,0x20,0x35,0x20,0x33,0x20,0x38,0x20,0x75,
+ 0x20,0x68,0x20,0x6b,0x20,0x42,0x20,0x53,0x20,0x4a,0x20,0x29,0x2e,0x2c,0x58,0x46,
+ 0x2e,0x62,0x2e,0x37,0x2e,0x72,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x26,0x2e,0x6d,0x58,0x7e,0x2e,0x38,
+ 0x2e,0x56,0x20,0x23,0x58,0x23,0x58,0x25,0x58,0x64,0x58,0x66,0x58,0x7a,0x58,0x78,
+ 0x58,0x76,0x58,0x5a,0x58,0x5a,0x58,0x44,0x58,0x46,0x58,0x46,0x58,0x44,0x58,0x4c,
+ 0x58,0x44,0x58,0x3e,0x2e,0x55,0x20,0x69,0x20,0x39,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x6f,0x2e,0x32,
+ 0x58,0x5d,0x20,0x4c,0x20,0x43,0x20,0x55,0x58,0x44,0x58,0x63,0x58,0x7a,0x58,0x6b,
+ 0x58,0x6b,0x58,0x6b,0x58,0x6a,0x58,0x6a,0x58,0x64,0x58,0x64,0x58,0x25,0x58,0x25,
+ 0x58,0x26,0x58,0x25,0x58,0x2a,0x58,0x4e,0x2e,0x27,0x20,0x7e,0x20,0x36,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x6f,0x2e,0x31,0x58,0x5d,0x20,0x50,0x20,0x6b,0x20,0x68,0x58,0x6f,0x58,0x58,
+ 0x58,0x58,0x58,0x6f,0x58,0x6f,0x58,0x23,0x58,0x23,0x58,0x2a,0x58,0x25,0x58,0x26,
+ 0x58,0x25,0x58,0x25,0x58,0x64,0x58,0x6b,0x58,0x78,0x58,0x78,0x2e,0x5b,0x20,0x7e,
+ 0x20,0x36,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x33,0x58,0x5b,0x20,0x49,0x20,0x6d,0x20,0x46,
+ 0x58,0x6b,0x58,0x6a,0x58,0x6a,0x58,0x6b,0x58,0x6b,0x58,0x6b,0x58,0x6b,0x58,0x6b,
+ 0x58,0x6b,0x58,0x7a,0x58,0x7a,0x58,0x7a,0x58,0x63,0x58,0x5a,0x58,0x53,0x58,0x78,
+ 0x2e,0x7b,0x20,0x21,0x20,0x36,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x6f,0x2e,0x33,0x58,0x7b,0x20,0x49,
+ 0x20,0x53,0x20,0x55,0x58,0x76,0x58,0x78,0x58,0x7a,0x58,0x6b,0x58,0x6b,0x58,0x6b,
+ 0x58,0x6b,0x58,0x6b,0x58,0x6a,0x58,0x64,0x58,0x2a,0x58,0x25,0x58,0x23,0x58,0x26,
+ 0x58,0x25,0x58,0x5a,0x2e,0x31,0x2e,0x5e,0x20,0x39,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x34,
+ 0x58,0x3e,0x2e,0x55,0x20,0x6a,0x20,0x6a,0x58,0x23,0x58,0x23,0x58,0x23,0x58,0x25,
+ 0x58,0x64,0x58,0x64,0x58,0x6b,0x58,0x7a,0x58,0x6b,0x58,0x7a,0x58,0x7a,0x58,0x63,
+ 0x58,0x76,0x58,0x44,0x58,0x4a,0x58,0x41,0x2e,0x31,0x2e,0x7c,0x20,0x36,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x4f,0x2e,0x36,0x58,0x3e,0x2e,0x54,0x20,0x56,0x20,0x50,0x58,0x5a,0x58,0x5a,
+ 0x58,0x5a,0x58,0x41,0x58,0x53,0x58,0x44,0x58,0x44,0x58,0x46,0x58,0x48,0x58,0x44,
+ 0x58,0x48,0x58,0x48,0x58,0x48,0x58,0x48,0x58,0x53,0x58,0x49,0x2e,0x32,0x2e,0x7c,
+ 0x20,0x39,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x36,0x58,0x32,0x2e,0x54,0x20,0x47,0x20,0x55,
+ 0x58,0x4c,0x58,0x44,0x58,0x44,0x58,0x41,0x58,0x5a,0x58,0x5a,0x58,0x41,0x58,0x5a,
+ 0x58,0x76,0x58,0x63,0x58,0x7a,0x58,0x6b,0x58,0x6b,0x58,0x6b,0x58,0x67,0x58,0x59,
+ 0x2e,0x33,0x2e,0x20,0x2e,0x36,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x39,0x58,0x34,0x2e,0x52,
+ 0x20,0x6d,0x20,0x7a,0x58,0x64,0x58,0x64,0x58,0x6b,0x58,0x7a,0x58,0x76,0x58,0x41,
+ 0x58,0x44,0x58,0x48,0x58,0x4c,0x58,0x50,0x58,0x50,0x58,0x49,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x51,0x2e,0x36,0x2e,0x20,0x2e,0x39,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x39,
+ 0x58,0x35,0x2e,0x52,0x20,0x48,0x20,0x55,0x58,0x49,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x49,
+ 0x58,0x4b,0x58,0x4a,0x58,0x42,0x58,0x2d,0x58,0x43,0x2e,0x23,0x2e,0x39,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x4f,0x2e,0x65,0x58,0x4d,0x2e,0x2f,0x20,0x68,0x2e,0x55,0x58,0x55,0x58,0x49,
+ 0x58,0x4b,0x58,0x42,0x58,0x4e,0x58,0x6e,0x58,0x75,0x58,0x79,0x58,0x77,0x58,0x35,
+ 0x58,0x3a,0x58,0x21,0x2e,0x59,0x2e,0x59,0x2e,0x59,0x2e,0x44,0x2e,0x48,0x2e,0x39,
+ 0x2e,0x36,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x2b,0x2e,0x72,0x58,0x42,0x2e,0x3c,0x2e,0x78,0x2e,0x51,
+ 0x2e,0x3b,0x58,0x2d,0x58,0x51,0x2e,0x59,0x2e,0x55,0x2e,0x55,0x2e,0x44,0x2e,0x5a,
+ 0x2e,0x5a,0x2e,0x42,0x2e,0x42,0x2e,0x43,0x2e,0x56,0x2e,0x56,0x2e,0x42,0x2e,0x42,
+ 0x2e,0x54,0x2e,0x30,0x2e,0x39,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x2b,0x2e,0x74,0x58,0x42,0x2e,0x4e,
+ 0x2e,0x42,0x2e,0x42,0x2e,0x42,0x2e,0x42,0x2e,0x43,0x2e,0x56,0x2e,0x56,0x2e,0x48,
+ 0x2e,0x48,0x2e,0x48,0x2e,0x44,0x2e,0x4e,0x2e,0x7a,0x2e,0x38,0x2e,0x5f,0x20,0x28,
+ 0x20,0x3c,0x2e,0x44,0x2e,0x52,0x2e,0x30,0x2e,0x39,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x2b,0x2e,0x74,
+ 0x58,0x53,0x2e,0x5a,0x2e,0x46,0x2e,0x44,0x2e,0x6d,0x2e,0x7a,0x2e,0x6c,0x2e,0x60,
+ 0x20,0x29,0x20,0x51,0x20,0x57,0x20,0x70,0x20,0x73,0x20,0x7d,0x20,0x40,0x2e,0x72,
+ 0x2e,0x5b,0x2e,0x20,0x58,0x3e,0x58,0x47,0x2e,0x45,0x2e,0x30,0x2e,0x39,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x2b,0x2e,0x70,0x58,0x55,0x2e,0x6d,0x2e,0x29,0x20,0x70,0x20,0x64,0x20,0x2e,
+ 0x2e,0x2a,0x2e,0x75,0x2e,0x7c,0x2e,0x2b,0x58,0x3c,0x58,0x7a,0x58,0x5a,0x58,0x47,
+ 0x58,0x4c,0x58,0x47,0x58,0x5a,0x58,0x7a,0x58,0x6a,0x58,0x2f,0x2e,0x7e,0x2e,0x70,
+ 0x2e,0x72,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x61,0x58,0x54,0x2e,0x6b,0x2e,0x2a,0x2e,0x47,
+ 0x58,0x6c,0x58,0x26,0x58,0x2e,0x58,0x60,0x2e,0x2e,0x58,0x68,0x58,0x6c,0x58,0x7a,
+ 0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x78,0x58,0x6b,0x58,0x67,0x58,0x32,
+ 0x58,0x5e,0x2e,0x61,0x2e,0x77,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x61,0x58,0x45,0x2e,0x6b,
+ 0x2e,0x72,0x2e,0x4c,0x58,0x6f,0x58,0x6c,0x20,0x66,0x20,0x6c,0x20,0x46,0x20,0x2a,
+ 0x58,0x6c,0x58,0x7a,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x63,0x58,0x7a,
+ 0x58,0x67,0x58,0x34,0x58,0x3a,0x58,0x61,0x2e,0x77,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x62,
+ 0x58,0x7e,0x2e,0x63,0x2e,0x79,0x2e,0x4c,0x58,0x27,0x2e,0x66,0x20,0x44,0x20,0x4b,
+ 0x20,0x44,0x20,0x30,0x58,0x6b,0x58,0x7a,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x76,
+ 0x58,0x76,0x58,0x7a,0x58,0x66,0x58,0x36,0x58,0x34,0x58,0x67,0x2e,0x39,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x25,0x2e,0x62,0x58,0x5e,0x2e,0x63,0x2e,0x79,0x2e,0x4c,0x58,0x27,0x2e,0x6c,
+ 0x20,0x44,0x20,0x4b,0x20,0x44,0x20,0x30,0x58,0x6c,0x58,0x7a,0x58,0x63,0x58,0x76,
+ 0x58,0x76,0x58,0x76,0x58,0x78,0x58,0x6b,0x58,0x6b,0x58,0x39,0x58,0x36,0x58,0x77,
+ 0x2e,0x72,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x62,0x58,0x32,0x58,0x76,0x2e,0x75,0x2e,0x4c,
+ 0x58,0x27,0x2e,0x6c,0x20,0x4b,0x20,0x4b,0x20,0x4b,0x20,0x30,0x58,0x6c,0x58,0x7a,
+ 0x58,0x63,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x6b,0x58,0x66,0x58,0x39,
+ 0x58,0x50,0x2e,0x4d,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x62,0x58,0x32,0x58,0x4b,
+ 0x2e,0x75,0x2e,0x4c,0x58,0x27,0x2e,0x6c,0x20,0x4b,0x20,0x4b,0x20,0x44,0x20,0x30,
+ 0x58,0x6c,0x58,0x78,0x58,0x63,0x58,0x76,0x58,0x5a,0x58,0x76,0x58,0x78,0x58,0x7a,
+ 0x58,0x6b,0x58,0x71,0x58,0x5a,0x20,0x3a,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x4d,
+ 0x58,0x36,0x58,0x4b,0x2e,0x75,0x2e,0x4c,0x58,0x27,0x2e,0x66,0x20,0x46,0x20,0x44,
+ 0x20,0x44,0x20,0x30,0x58,0x6b,0x58,0x7a,0x58,0x63,0x58,0x76,0x58,0x76,0x58,0x76,
+ 0x58,0x76,0x58,0x63,0x58,0x6b,0x58,0x5f,0x2e,0x3a,0x20,0x6f,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x25,0x2e,0x4d,0x58,0x36,0x58,0x4b,0x2e,0x75,0x2e,0x4c,0x58,0x58,0x58,0x28,
+ 0x2e,0x58,0x58,0x26,0x58,0x64,0x58,0x6b,0x58,0x7a,0x58,0x76,0x58,0x5a,0x58,0x44,
+ 0x58,0x41,0x58,0x7a,0x58,0x3c,0x58,0x2b,0x58,0x7d,0x2e,0x4e,0x20,0x4f,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x56,0x58,0x69,0x58,0x3d,0x58,0x7b,0x2e,0x46,
+ 0x58,0x7a,0x58,0x6b,0x58,0x6b,0x58,0x6a,0x58,0x64,0x58,0x3c,0x58,0x24,0x58,0x4f,
+ 0x58,0x5d,0x2e,0x3b,0x2e,0x24,0x2e,0x7a,0x20,0x30,0x20,0x37,0x20,0x26,0x20,0x58,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3d,0x2e,0x43,0x58,0x71,0x2e,0x41,
+ 0x20,0x29,0x2e,0x66,0x58,0x2b,0x58,0x7c,0x2e,0x29,0x2e,0x2d,0x2e,0x4e,0x20,0x7a,
+ 0x20,0x30,0x20,0x2a,0x20,0x2b,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x6e,0x20,0x24,
+ 0x2e,0x74,0x20,0x36,0x20,0x2c,0x20,0x34,0x20,0x30,0x20,0x2a,0x20,0x2b,0x20,0x2e,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x3e,0x20,0x40,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/editcopy.xpm
+ 0x0,0x0,0x12,0x99,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x65,0x64,0x69,0x74,0x63,0x6f,0x70,0x79,0x5b,0x5d,
+ 0x20,0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,
+ 0x72,0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,
+ 0x73,0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,
+ 0x33,0x32,0x20,0x33,0x32,0x20,0x31,0x35,0x35,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x63,0x20,0x62,0x6c,0x61,0x63,0x6b,0x22,0x2c,0xa,0x22,0x2e,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x39,0x31,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x58,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x32,0x31,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x45,0x32,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x4f,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x35,0x32,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x2b,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x33,0x33,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x39,0x33,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x23,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x35,0x33,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x24,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x44,0x34,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x42,0x35,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x26,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x32,0x34,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x2a,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x44,0x35,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x3d,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x45,0x36,0x39,0x34,0x46,0x22,0x2c,0xa,0x22,0x2d,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x45,0x37,0x39,0x35,0x46,0x22,0x2c,0xa,0x22,0x3b,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x36,0x35,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x3a,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x41,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x3e,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x42,0x36,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x2c,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x33,0x36,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x3c,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x36,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x31,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x36,0x42,0x31,0x41,0x22,0x2c,0xa,0x22,0x32,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x36,0x37,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x33,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x42,0x37,0x32,0x31,0x44,0x22,0x2c,0xa,0x22,0x34,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x42,0x37,0x36,0x32,0x35,0x22,0x2c,0xa,0x22,0x35,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x45,0x37,0x39,0x32,0x41,0x22,0x2c,0xa,0x22,0x36,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x34,0x37,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x37,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x31,0x37,0x36,0x31,0x41,0x22,0x2c,0xa,0x22,0x39,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x35,0x37,0x38,0x31,0x36,0x22,0x2c,0xa,0x22,0x30,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x34,0x37,0x39,0x31,0x44,0x22,0x2c,0xa,0x22,0x71,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x38,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x77,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x38,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x65,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x38,0x35,0x33,0x30,0x22,0x2c,0xa,0x22,0x72,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x39,0x39,0x36,0x32,0x36,0x22,0x2c,0xa,0x22,0x74,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x39,0x30,0x36,0x44,0x22,0x2c,0xa,0x22,0x79,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x31,0x38,0x44,0x34,0x38,0x22,0x2c,0xa,0x22,0x75,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x39,0x30,0x34,0x39,0x22,0x2c,0xa,0x22,0x69,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x39,0x35,0x34,0x32,0x22,0x2c,0xa,0x22,0x70,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x41,0x39,0x43,0x34,0x44,0x22,0x2c,0xa,0x22,0x61,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x39,0x45,0x35,0x32,0x22,0x2c,0xa,0x22,0x73,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x46,0x41,0x30,0x35,0x33,0x22,0x2c,0xa,0x22,0x64,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x41,0x45,0x37,0x38,0x22,0x2c,0xa,0x22,0x66,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x42,0x34,0x37,0x45,0x22,0x2c,0xa,0x22,0x67,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x39,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x68,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x39,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x6a,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x31,0x39,0x44,0x32,0x43,0x22,0x2c,0xa,0x22,0x6b,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x31,0x41,0x34,0x33,0x46,0x22,0x2c,0xa,0x22,0x6c,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x30,0x39,0x45,0x34,0x45,0x22,0x2c,0xa,0x22,0x7a,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x46,0x42,0x34,0x35,0x37,0x22,0x2c,0xa,0x22,0x78,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x39,0x42,0x31,0x35,0x39,0x22,0x2c,0xa,0x22,0x63,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x42,0x35,0x37,0x33,0x22,0x2c,0xa,0x22,0x76,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x42,0x46,0x37,0x43,0x22,0x2c,0xa,0x22,0x62,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x46,0x36,0x32,0x22,0x2c,0xa,0x22,0x6e,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x30,0x36,0x34,0x22,0x2c,0xa,0x22,0x6d,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x31,0x36,0x44,0x22,0x2c,0xa,0x22,0x4d,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x33,0x37,0x32,0x22,0x2c,0xa,0x22,0x4e,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x34,0x37,0x39,0x22,0x2c,0xa,0x22,0x42,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x31,0x39,0x44,0x38,0x45,0x22,0x2c,0xa,0x22,0x56,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x41,0x38,0x39,0x41,0x22,0x2c,0xa,0x22,0x43,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x42,0x35,0x38,0x30,0x22,0x2c,0xa,0x22,0x5a,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x42,0x34,0x38,0x38,0x22,0x2c,0xa,0x22,0x41,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x42,0x34,0x39,0x36,0x22,0x2c,0xa,0x22,0x53,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x41,0x44,0x41,0x41,0x22,0x2c,0xa,0x22,0x44,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x41,0x46,0x41,0x31,0x22,0x2c,0xa,0x22,0x46,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x43,0x42,0x42,0x42,0x36,0x22,0x2c,0xa,0x22,0x47,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x46,0x42,0x46,0x42,0x39,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x30,0x42,0x36,0x38,0x30,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x42,0x41,0x38,0x35,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x42,0x44,0x38,0x42,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x42,0x35,0x38,0x39,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x42,0x45,0x38,0x38,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x33,0x42,0x43,0x39,0x30,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x43,0x31,0x38,0x43,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x43,0x34,0x39,0x33,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x37,0x43,0x42,0x38,0x43,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x43,0x37,0x38,0x36,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x43,0x37,0x38,0x39,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x43,0x39,0x38,0x42,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x30,0x43,0x36,0x39,0x30,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x43,0x41,0x39,0x34,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x43,0x43,0x39,0x42,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x43,0x45,0x39,0x38,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x43,0x44,0x32,0x39,0x43,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x43,0x33,0x42,0x37,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x43,0x36,0x42,0x45,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x43,0x35,0x41,0x35,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x43,0x38,0x41,0x31,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x44,0x34,0x41,0x32,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x45,0x44,0x39,0x41,0x45,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x39,0x44,0x35,0x42,0x31,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x43,0x43,0x38,0x32,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x44,0x39,0x38,0x42,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x44,0x39,0x39,0x31,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x44,0x37,0x41,0x31,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x35,0x44,0x42,0x41,0x35,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x44,0x43,0x41,0x42,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x44,0x44,0x41,0x41,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x44,0x43,0x42,0x32,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x44,0x43,0x42,0x38,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x36,0x38,0x33,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x37,0x38,0x41,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x38,0x38,0x35,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x38,0x38,0x44,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x39,0x39,0x32,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x43,0x39,0x44,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x30,0x39,0x46,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x45,0x32,0x41,0x43,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x35,0x45,0x30,0x42,0x36,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x35,0x45,0x31,0x42,0x38,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x45,0x34,0x42,0x36,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x45,0x35,0x42,0x43,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x30,0x45,0x35,0x41,0x38,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x44,0x41,0x33,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x44,0x41,0x39,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x45,0x38,0x42,0x38,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x46,0x42,0x31,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x31,0x41,0x35,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x32,0x41,0x44,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x32,0x42,0x34,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x32,0x42,0x43,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x43,0x38,0x43,0x32,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x44,0x34,0x43,0x42,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x46,0x44,0x41,0x43,0x35,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x44,0x32,0x44,0x30,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x44,0x37,0x43,0x35,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x44,0x41,0x43,0x33,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x44,0x45,0x43,0x37,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x44,0x46,0x44,0x33,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x36,0x45,0x32,0x43,0x32,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x45,0x31,0x43,0x35,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x45,0x33,0x43,0x42,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x45,0x45,0x39,0x43,0x32,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x45,0x36,0x44,0x43,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x33,0x45,0x44,0x43,0x33,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x32,0x45,0x44,0x43,0x42,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x46,0x32,0x43,0x44,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x33,0x43,0x33,0x22,0x2c,0xa,0x22,0x6a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x34,0x43,0x41,0x22,0x2c,0xa,0x22,0x6b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x38,0x43,0x35,0x22,0x2c,0xa,0x22,0x6c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x38,0x43,0x44,0x22,0x2c,0xa,0x22,0x7a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x46,0x35,0x44,0x32,0x22,0x2c,0xa,0x22,0x78,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x37,0x44,0x38,0x22,0x2c,0xa,0x22,0x63,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x39,0x44,0x34,0x22,0x2c,0xa,0x22,0x76,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x39,0x44,0x43,0x22,0x2c,0xa,0x22,0x62,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x45,0x38,0x45,0x37,0x22,0x2c,0xa,0x22,0x6e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x33,0x45,0x46,0x45,0x33,0x22,0x2c,0xa,0x22,0x6d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x32,0x46,0x30,0x45,0x33,0x22,0x2c,0xa,0x22,0x4d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x46,0x32,0x45,0x41,0x22,0x2c,0xa,0x22,0x4e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x42,0x46,0x37,0x45,0x36,0x22,0x2c,0xa,0x22,0x42,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x39,0x45,0x33,0x22,0x2c,0xa,0x22,0x56,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x42,0x45,0x43,0x22,0x2c,0xa,0x22,0x43,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x46,0x34,0x46,0x33,0x22,0x2c,0xa,0x22,0x5a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x38,0x46,0x37,0x46,0x36,0x22,0x2c,0xa,0x22,0x41,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x43,0x46,0x34,0x22,0x2c,0xa,0x22,0x53,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x45,0x46,0x43,0x22,0x2c,0xa,0x22,0x44,0x2e,0x20,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,
+ 0x6c,0x73,0x20,0x2a,0x2f,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x68,
+ 0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,
+ 0x20,0x67,0x20,0x67,0x20,0x77,0x20,0x2a,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x67,0x20,0x7a,0x2e,0x7a,0x2e,0x67,0x2e,0x67,0x2e,0x67,0x2e,0x67,
+ 0x2e,0x67,0x2e,0x67,0x2e,0x7a,0x2e,0x67,0x2e,0x52,0x20,0x32,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x67,0x20,0x7a,0x2e,0x64,0x2e,0x33,0x2e,0x33,
+ 0x2e,0x33,0x2e,0x33,0x2e,0x33,0x2e,0x33,0x2e,0x3e,0x2e,0x66,0x2e,0x67,0x2e,0x7a,
+ 0x20,0x3c,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x3a,
+ 0x20,0x3b,0x20,0x2c,0x20,0x3a,0x20,0x3a,0x20,0x3a,0x20,0x37,0x20,0x61,0x20,0x69,
+ 0x20,0x61,0x20,0x52,0x20,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x27,0x20,0x6d,
+ 0x2e,0x75,0x2e,0x67,0x2e,0x6a,0x20,0x3e,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x75,0x20,0x79,0x20,0x79,0x20,0x4c,0x20,0x4c,0x20,0x4c,0x20,0x4c,0x20,0x60,
+ 0x20,0x74,0x2e,0x74,0x2e,0x65,0x2e,0x65,0x20,0x76,0x20,0x2d,0x2e,0x2d,0x2e,0x2d,
+ 0x2e,0x59,0x20,0x62,0x2e,0x53,0x2e,0x2b,0x2e,0x64,0x2e,0x71,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x53,
+ 0x2e,0x53,0x2e,0x53,0x2e,0x5a,0x2e,0x62,0x2e,0x53,0x2e,0x65,0x2e,0x69,0x20,0x57,
+ 0x20,0x6f,0x2e,0x6f,0x2e,0x4b,0x20,0x77,0x2e,0x53,0x2e,0x41,0x2e,0x75,0x2e,0x71,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x41,
+ 0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x4d,0x2e,0x77,0x2e,0x53,0x2e,0x53,
+ 0x2e,0x5f,0x20,0x61,0x20,0x45,0x20,0x2e,0x2e,0x4b,0x20,0x30,0x2e,0x53,0x2e,0x53,
+ 0x2e,0x71,0x2e,0x37,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x53,0x2e,0x41,
+ 0x2e,0x56,0x2e,0x41,0x2e,0x41,0x2e,0x41,0x2e,0x56,0x2e,0x41,0x2e,0x6e,0x2e,0x39,
+ 0x2e,0x53,0x2e,0x53,0x2e,0x43,0x2e,0x5f,0x20,0x61,0x20,0x2e,0x2e,0x59,0x20,0x74,
+ 0x20,0x3d,0x20,0x2d,0x20,0x41,0x20,0x36,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x41,0x2e,0x41,0x2e,0x56,0x2e,0x41,0x2e,0x56,0x2e,0x56,0x2e,0x56,0x2e,0x41,
+ 0x2e,0x6e,0x2e,0x39,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x5a,0x2e,0x33,0x20,0x27,
+ 0x20,0x27,0x20,0x4b,0x20,0x5a,0x20,0x41,0x20,0x5d,0x20,0x37,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x41,0x2e,0x56,0x2e,0x42,0x2e,0x56,0x2e,0x56,0x2e,0x42,
+ 0x2e,0x56,0x2e,0x56,0x2e,0x6e,0x2e,0x28,0x20,0x46,0x20,0x53,0x20,0x53,0x20,0x47,
+ 0x20,0x35,0x20,0x27,0x20,0x7c,0x20,0x2f,0x20,0x2f,0x20,0x58,0x2e,0x66,0x2e,0x71,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x41,0x2e,0x56,0x2e,0x78,0x2e,0x42,
+ 0x2e,0x78,0x2e,0x56,0x2e,0x42,0x2e,0x4e,0x2e,0x42,0x2e,0x65,0x2e,0x44,0x20,0x42,
+ 0x20,0x56,0x20,0x29,0x20,0x33,0x20,0x2f,0x20,0x2f,0x20,0x5e,0x20,0x5e,0x20,0x27,
+ 0x20,0x61,0x2e,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x56,0x2e,0x4e,
+ 0x2e,0x4e,0x2e,0x42,0x2e,0x42,0x2e,0x42,0x2e,0x76,0x2e,0x76,0x2e,0x4e,0x2e,0x7a,
+ 0x2e,0x70,0x2e,0x69,0x2e,0x70,0x2e,0x6e,0x2e,0x38,0x20,0x5e,0x20,0x2f,0x20,0x21,
+ 0x20,0x51,0x20,0x27,0x20,0x61,0x2e,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x42,0x2e,0x42,0x2e,0x78,0x2e,0x76,0x2e,0x78,0x2e,0x7a,0x2e,0x6a,0x2e,0x6a,
+ 0x2e,0x78,0x2e,0x7a,0x2e,0x7a,0x2e,0x63,0x2e,0x42,0x2e,0x42,0x2e,0x30,0x20,0x21,
+ 0x20,0x21,0x20,0x21,0x20,0x5e,0x20,0x27,0x20,0x2c,0x2e,0x71,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x42,0x2e,0x68,0x2e,0x68,0x2e,0x7a,0x2e,0x7a,0x2e,0x78,
+ 0x2e,0x78,0x2e,0x7a,0x2e,0x7a,0x2e,0x7a,0x2e,0x68,0x2e,0x6a,0x2e,0x78,0x2e,0x76,
+ 0x2e,0x30,0x20,0x21,0x20,0x51,0x20,0x59,0x20,0x21,0x20,0x7e,0x20,0x2c,0x2e,0x71,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x76,0x2e,0x63,0x2e,0x6b,0x2e,0x78,
+ 0x2e,0x68,0x2e,0x6a,0x2e,0x6a,0x2e,0x6a,0x2e,0x7a,0x2e,0x38,0x2e,0x68,0x2e,0x6b,
+ 0x2e,0x6a,0x2e,0x76,0x2e,0x30,0x20,0x55,0x20,0x54,0x20,0x55,0x20,0x55,0x20,0x7e,
+ 0x20,0x2c,0x2e,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x76,0x2e,0x6b,
+ 0x2e,0x7a,0x2e,0x68,0x2e,0x68,0x2e,0x68,0x2e,0x6a,0x2e,0x38,0x2e,0x6a,0x2e,0x68,
+ 0x2e,0x68,0x2e,0x6a,0x2e,0x6b,0x2e,0x76,0x2e,0x30,0x20,0x55,0x20,0x55,0x20,0x55,
+ 0x20,0x55,0x20,0x59,0x20,0x3b,0x2e,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x78,0x2e,0x68,0x2e,0x38,0x2e,0x38,0x2e,0x68,0x2e,0x6a,0x2e,0x38,0x2e,0x38,
+ 0x2e,0x34,0x2e,0x68,0x2e,0x34,0x2e,0x38,0x2e,0x68,0x2e,0x78,0x2e,0x38,0x20,0x50,
+ 0x20,0x48,0x20,0x50,0x20,0x50,0x20,0x7e,0x20,0x3b,0x2e,0x71,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x76,0x2e,0x68,0x2e,0x34,0x2e,0x34,0x2e,0x38,0x2e,0x38,
+ 0x2e,0x34,0x2e,0x31,0x2e,0x7a,0x2e,0x68,0x2e,0x38,0x2e,0x34,0x2e,0x68,0x2e,0x63,
+ 0x2e,0x38,0x20,0x48,0x20,0x4a,0x20,0x48,0x20,0x4a,0x20,0x59,0x20,0x3b,0x2e,0x71,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x63,0x2e,0x32,0x2e,0x7a,0x2e,0x6a,
+ 0x2e,0x34,0x2e,0x2a,0x2e,0x31,0x2e,0x31,0x2e,0x38,0x2e,0x32,0x2e,0x32,0x2e,0x2a,
+ 0x2e,0x32,0x2e,0x6c,0x2e,0x38,0x20,0x4a,0x20,0x4a,0x20,0x48,0x20,0x4a,0x20,0x55,
+ 0x20,0x5d,0x20,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x6c,0x2e,0x68,
+ 0x2e,0x32,0x2e,0x34,0x2e,0x34,0x2e,0x31,0x2e,0x25,0x2e,0x31,0x2e,0x26,0x2e,0x32,
+ 0x2e,0x34,0x2e,0x38,0x2e,0x37,0x2e,0x6b,0x2e,0x38,0x20,0x66,0x20,0x64,0x20,0x66,
+ 0x20,0x48,0x20,0x55,0x20,0x5d,0x20,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x7a,0x2e,0x38,0x2e,0x23,0x2e,0x31,0x2e,0x34,0x2e,0x31,0x2e,0x2a,0x2e,0x31,
+ 0x2e,0x31,0x2e,0x31,0x2e,0x2a,0x2e,0x4e,0x20,0x34,0x2e,0x6c,0x2e,0x38,0x20,0x66,
+ 0x20,0x66,0x20,0x43,0x20,0x4b,0x20,0x7e,0x20,0x3a,0x2e,0x71,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x38,0x2e,0x26,0x2e,0x34,0x2e,0x23,0x2e,0x25,0x2e,0x34,
+ 0x2e,0x26,0x2e,0x40,0x2e,0x23,0x2e,0x25,0x2e,0x25,0x2e,0x26,0x2e,0x32,0x2e,0x6c,
+ 0x2e,0x38,0x20,0x4b,0x20,0x4b,0x20,0x59,0x20,0x7e,0x20,0x5d,0x20,0x2c,0x2e,0x36,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x68,0x2e,0x26,0x2e,0x23,0x2e,0x2a,
+ 0x2e,0x31,0x2e,0x31,0x2e,0x25,0x2e,0x4e,0x20,0x4e,0x20,0x23,0x2e,0x26,0x2e,0x2a,
+ 0x2e,0x31,0x2e,0x6c,0x2e,0x30,0x20,0x27,0x20,0x5d,0x20,0x54,0x20,0x78,0x20,0x72,
+ 0x20,0x36,0x20,0x25,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x34,0x2e,0x34,
+ 0x2e,0x25,0x2e,0x2a,0x2e,0x23,0x2e,0x62,0x20,0x26,0x2e,0x4e,0x20,0x4d,0x20,0x62,
+ 0x20,0x4d,0x20,0x32,0x2e,0x31,0x2e,0x6b,0x2e,0x39,0x20,0x6b,0x20,0x37,0x20,0x3e,
+ 0x20,0x24,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x37,0x2e,0x26,0x2e,0x4e,0x20,0x35,0x2e,0x26,0x2e,0x4e,0x20,0x40,0x2e,0x2a,
+ 0x2e,0x62,0x20,0x4e,0x20,0x4d,0x20,0x4e,0x20,0x3d,0x2e,0x6b,0x2e,0x2c,0x20,0x2b,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x36,0x2e,0x4e,0x20,0x4e,0x20,0x4d,0x20,0x4d,0x20,0x26,
+ 0x2e,0x23,0x2e,0x4e,0x20,0x32,0x2e,0x24,0x2e,0x25,0x2e,0x38,0x2e,0x36,0x2e,0x3c,
+ 0x2e,0x26,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x35,0x2e,0x26,0x2e,0x37,0x2e,0x6e,
+ 0x20,0x24,0x2e,0x6d,0x20,0x4d,0x20,0x31,0x2e,0x37,0x2e,0x37,0x2e,0x6f,0x2e,0x63,
+ 0x20,0x35,0x20,0x26,0x20,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x37,0x2e,0x2a,
+ 0x2e,0x6d,0x20,0x25,0x2e,0x3d,0x2e,0x26,0x2e,0x37,0x2e,0x7d,0x20,0x70,0x20,0x31,
+ 0x20,0x25,0x20,0x23,0x20,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x36,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x7c,0x20,0x61,0x20,0x31,0x20,0x26,
+ 0x20,0x2b,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x36,0x2e,0x2d,0x2e,0x61,0x20,0x31,0x20,0x26,0x20,0x4f,
+ 0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x3b,0x20,0x3a,0x20,0x25,0x20,0x4f,0x20,0x2e,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/filenew.xpm
+ 0x0,0x0,0x14,0x9,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x66,0x69,0x6c,0x65,0x6e,0x65,0x77,0x5b,0x5d,0x20,
+ 0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,0x72,
+ 0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,0x73,
+ 0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,0x33,
+ 0x32,0x20,0x33,0x32,0x20,0x31,0x37,0x38,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,0x20,
+ 0x20,0x63,0x20,0x62,0x6c,0x61,0x63,0x6b,0x22,0x2c,0xa,0x22,0x2e,0x20,0x20,0x63,
+ 0x20,0x23,0x31,0x39,0x31,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x58,0x20,0x20,0x63,
+ 0x20,0x23,0x32,0x32,0x31,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,0x20,0x63,
+ 0x20,0x23,0x34,0x35,0x32,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x4f,0x20,0x20,0x63,
+ 0x20,0x23,0x34,0x41,0x33,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x2b,0x20,0x20,0x63,
+ 0x20,0x23,0x34,0x45,0x33,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x20,0x20,0x63,
+ 0x20,0x23,0x35,0x35,0x33,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x23,0x20,0x20,0x63,
+ 0x20,0x23,0x36,0x30,0x34,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x24,0x20,0x20,0x63,
+ 0x20,0x23,0x36,0x41,0x34,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x20,0x20,0x63,
+ 0x20,0x23,0x36,0x44,0x34,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x26,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x30,0x34,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x2a,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x32,0x34,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x3d,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x34,0x34,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x2d,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x36,0x34,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x3b,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x38,0x35,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x3a,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x30,0x35,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x3e,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x31,0x35,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x2c,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x33,0x35,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x3c,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x36,0x35,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x31,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x37,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x32,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x41,0x35,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x33,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x41,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x34,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x42,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x35,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x43,0x35,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x36,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x44,0x35,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x46,0x35,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x30,0x35,0x39,0x31,0x31,0x22,0x2c,0xa,0x22,0x39,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x30,0x35,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x30,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x30,0x36,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x71,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x32,0x36,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x77,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x34,0x36,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x65,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x35,0x36,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x72,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x36,0x36,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x74,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x37,0x36,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x79,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x35,0x36,0x39,0x31,0x33,0x22,0x2c,0xa,0x22,0x75,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x32,0x36,0x43,0x32,0x32,0x22,0x2c,0xa,0x22,0x69,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x42,0x37,0x37,0x33,0x32,0x22,0x2c,0xa,0x22,0x70,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x31,0x38,0x44,0x34,0x38,0x22,0x2c,0xa,0x22,0x61,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x32,0x38,0x45,0x34,0x39,0x22,0x2c,0xa,0x22,0x73,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x34,0x39,0x30,0x34,0x41,0x22,0x2c,0xa,0x22,0x64,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x41,0x41,0x33,0x37,0x33,0x22,0x2c,0xa,0x22,0x66,0x20,0x20,0x63,
+ 0x20,0x23,0x41,0x31,0x41,0x31,0x39,0x35,0x22,0x2c,0xa,0x22,0x67,0x20,0x20,0x63,
+ 0x20,0x23,0x41,0x42,0x41,0x42,0x39,0x46,0x22,0x2c,0xa,0x22,0x68,0x20,0x20,0x63,
+ 0x20,0x23,0x41,0x44,0x41,0x44,0x41,0x42,0x22,0x2c,0xa,0x22,0x6a,0x20,0x20,0x63,
+ 0x20,0x23,0x41,0x46,0x41,0x46,0x41,0x42,0x22,0x2c,0xa,0x22,0x6b,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x33,0x42,0x33,0x41,0x36,0x22,0x2c,0xa,0x22,0x6c,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x43,0x42,0x43,0x42,0x38,0x22,0x2c,0xa,0x22,0x7a,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x46,0x42,0x46,0x42,0x43,0x22,0x2c,0xa,0x22,0x78,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x42,0x34,0x38,0x39,0x22,0x2c,0xa,0x22,0x63,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x42,0x35,0x38,0x41,0x22,0x2c,0xa,0x22,0x76,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x44,0x42,0x37,0x38,0x42,0x22,0x2c,0xa,0x22,0x62,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x41,0x42,0x38,0x39,0x31,0x22,0x2c,0xa,0x22,0x6e,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x39,0x42,0x42,0x39,0x45,0x22,0x2c,0xa,0x22,0x6d,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x45,0x42,0x45,0x41,0x32,0x22,0x2c,0xa,0x22,0x4d,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x36,0x43,0x36,0x42,0x43,0x22,0x2c,0xa,0x22,0x4e,0x20,0x20,0x63,
+ 0x20,0x23,0x44,0x39,0x43,0x38,0x41,0x38,0x22,0x2c,0xa,0x22,0x42,0x20,0x20,0x63,
+ 0x20,0x23,0x45,0x38,0x45,0x31,0x42,0x41,0x22,0x2c,0xa,0x22,0x56,0x20,0x20,0x63,
+ 0x20,0x23,0x45,0x38,0x45,0x31,0x42,0x42,0x22,0x2c,0xa,0x22,0x43,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x31,0x22,0x2c,0xa,0x22,0x5a,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x41,0x30,0x22,0x2c,0xa,0x22,0x41,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x33,0x22,0x2c,0xa,0x22,0x53,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x34,0x22,0x2c,0xa,0x22,0x44,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x36,0x22,0x2c,0xa,0x22,0x46,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x38,0x22,0x2c,0xa,0x22,0x47,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x39,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x41,0x38,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x41,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x42,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x41,0x42,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x43,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x41,0x43,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x45,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x46,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x30,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x31,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x30,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x34,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x35,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x34,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x38,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x39,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x38,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x39,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x42,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x41,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x44,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x44,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x45,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x45,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x38,0x43,0x38,0x43,0x31,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x41,0x43,0x41,0x43,0x34,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x43,0x42,0x43,0x36,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,0x63,
+ 0x20,0x23,0x44,0x42,0x44,0x32,0x43,0x31,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,0x63,
+ 0x20,0x23,0x44,0x45,0x44,0x46,0x43,0x46,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,0x63,
+ 0x20,0x23,0x44,0x34,0x44,0x34,0x44,0x31,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x31,0x44,0x35,0x43,0x31,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x33,0x44,0x39,0x43,0x33,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x35,0x44,0x43,0x43,0x43,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x38,0x45,0x38,0x44,0x33,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x43,0x45,0x43,0x44,0x37,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x30,0x45,0x42,0x44,0x41,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x32,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x33,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x43,0x32,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x37,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x43,0x37,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x42,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x43,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x43,0x43,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x45,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x30,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x31,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x30,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x31,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x33,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x35,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x35,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x36,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x37,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x36,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x38,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x41,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x41,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x42,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x43,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x45,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x46,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x45,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x46,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x39,0x45,0x39,0x45,0x37,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x33,0x46,0x33,0x45,0x39,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x33,0x46,0x33,0x45,0x42,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x35,0x46,0x35,0x45,0x38,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x38,0x46,0x38,0x45,0x33,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x30,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,0x63,
+ 0x20,0x4c,0x69,0x67,0x68,0x74,0x59,0x65,0x6c,0x6c,0x6f,0x77,0x22,0x2c,0xa,0x22,
+ 0x6a,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x31,0x22,0x2c,0xa,0x22,
+ 0x6b,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x33,0x22,0x2c,0xa,0x22,
+ 0x6c,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x33,0x22,0x2c,0xa,0x22,
+ 0x7a,0x2e,0x20,0x63,0x20,0x23,0x46,0x44,0x46,0x45,0x45,0x37,0x22,0x2c,0xa,0x22,
+ 0x78,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x34,0x22,0x2c,0xa,0x22,
+ 0x63,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x35,0x22,0x2c,0xa,0x22,
+ 0x76,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x34,0x22,0x2c,0xa,0x22,
+ 0x62,0x2e,0x20,0x63,0x20,0x23,0x46,0x42,0x46,0x42,0x45,0x39,0x22,0x2c,0xa,0x22,
+ 0x6e,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x38,0x22,0x2c,0xa,0x22,
+ 0x6d,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x38,0x22,0x2c,0xa,0x22,
+ 0x4d,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x39,0x22,0x2c,0xa,0x22,
+ 0x4e,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x41,0x22,0x2c,0xa,0x22,
+ 0x42,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x43,0x22,0x2c,0xa,0x22,
+ 0x56,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x44,0x22,0x2c,0xa,0x22,
+ 0x43,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x43,0x22,0x2c,0xa,0x22,
+ 0x5a,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x44,0x22,0x2c,0xa,0x22,
+ 0x41,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x46,0x22,0x2c,0xa,0x22,
+ 0x53,0x2e,0x20,0x63,0x20,0x23,0x46,0x34,0x46,0x34,0x46,0x30,0x22,0x2c,0xa,0x22,
+ 0x44,0x2e,0x20,0x63,0x20,0x23,0x46,0x34,0x46,0x34,0x46,0x33,0x22,0x2c,0xa,0x22,
+ 0x46,0x2e,0x20,0x63,0x20,0x23,0x46,0x35,0x46,0x35,0x46,0x34,0x22,0x2c,0xa,0x22,
+ 0x47,0x2e,0x20,0x63,0x20,0x23,0x46,0x38,0x46,0x38,0x46,0x36,0x22,0x2c,0xa,0x22,
+ 0x48,0x2e,0x20,0x63,0x20,0x69,0x76,0x6f,0x72,0x79,0x22,0x2c,0xa,0x22,0x4a,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x31,0x22,0x2c,0xa,0x22,0x4b,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x46,0x33,0x22,0x2c,0xa,0x22,0x4c,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x33,0x22,0x2c,0xa,0x22,0x50,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x46,0x34,0x22,0x2c,0xa,0x22,0x49,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x34,0x22,0x2c,0xa,0x22,0x55,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x46,0x37,0x22,0x2c,0xa,0x22,0x59,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x36,0x22,0x2c,0xa,0x22,0x54,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x37,0x22,0x2c,0xa,0x22,0x52,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x42,0x46,0x42,0x46,0x42,0x22,0x2c,0xa,0x22,0x45,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x38,0x22,0x2c,0xa,0x22,0x57,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x39,0x22,0x2c,0xa,0x22,0x51,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x41,0x22,0x2c,0xa,0x22,0x21,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x42,0x22,0x2c,0xa,0x22,0x7e,0x2e,
+ 0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x39,0x39,0x22,0x2c,0xa,0x22,0x5e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x46,0x44,0x22,0x2c,0xa,0x22,0x2f,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x43,0x22,0x2c,0xa,0x22,0x28,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x44,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x45,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,
+ 0x63,0x20,0x67,0x72,0x61,0x79,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,
+ 0x6c,0x73,0x20,0x2a,0x2f,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x77,0x20,0x32,0x20,0x31,0x20,0x77,0x20,0x34,0x20,0x34,0x20,0x34,0x20,0x36,
+ 0x20,0x77,0x20,0x39,0x20,0x36,0x20,0x2d,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x72,0x20,0x73,0x20,0x70,0x20,0x70,0x20,0x63,0x20,0x63,0x20,0x63,
+ 0x20,0x63,0x20,0x4e,0x20,0x4f,0x2e,0x2b,0x2e,0x6f,0x2e,0x79,0x20,0x23,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x72,0x20,0x29,0x2e,0x29,0x2e,0x29,0x2e,0x29,
+ 0x2e,0x29,0x2e,0x29,0x2e,0x29,0x2e,0x29,0x2e,0x46,0x2e,0x70,0x2e,0x29,0x2e,0x20,
+ 0x2e,0x26,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x29,0x2e,0x45,
+ 0x2e,0x29,0x2e,0x45,0x2e,0x29,0x2e,0x45,0x2e,0x45,0x2e,0x45,0x2e,0x53,0x2e,0x58,
+ 0x2e,0x29,0x2e,0x52,0x2e,0x6e,0x20,0x24,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x45,0x2e,0x59,0x2e,0x59,0x2e,0x45,0x2e,0x59,0x2e,0x45,0x2e,0x45,0x2e,0x45,
+ 0x2e,0x61,0x2e,0x7c,0x20,0x29,0x2e,0x29,0x2e,0x44,0x2e,0x6d,0x20,0x25,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x45,0x2e,0x59,0x2e,0x59,0x2e,0x4a,0x2e,0x59,0x2e,0x4a,
+ 0x2e,0x59,0x2e,0x59,0x2e,0x61,0x2e,0x7c,0x20,0x29,0x2e,0x29,0x2e,0x29,0x2e,0x44,
+ 0x2e,0x3e,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x59,0x2e,0x4a,0x2e,0x4a,0x2e,0x4a,
+ 0x2e,0x4a,0x2e,0x4a,0x2e,0x4a,0x2e,0x4a,0x2e,0x61,0x2e,0x4d,0x20,0x6c,0x20,0x68,
+ 0x20,0x68,0x20,0x7b,0x20,0x3b,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x59,0x2e,0x42,
+ 0x2e,0x42,0x2e,0x42,0x2e,0x4e,0x2e,0x4e,0x2e,0x42,0x2e,0x42,0x2e,0x62,0x2e,0x2e,
+ 0x2e,0x6b,0x20,0x66,0x20,0x68,0x20,0x7d,0x20,0x3b,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x4a,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,
+ 0x2e,0x6c,0x2e,0x66,0x2e,0x23,0x2e,0x40,0x2e,0x23,0x2e,0x61,0x2e,0x3e,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x4a,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,
+ 0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x4a,
+ 0x2e,0x3e,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x4a,0x2e,0x72,0x2e,0x6c,0x2e,0x6c,
+ 0x2e,0x72,0x2e,0x6c,0x2e,0x72,0x2e,0x6c,0x2e,0x72,0x2e,0x6c,0x2e,0x72,0x2e,0x6c,
+ 0x2e,0x72,0x2e,0x4a,0x2e,0x31,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x42,0x2e,0x72,
+ 0x2e,0x72,0x2e,0x71,0x2e,0x71,0x2e,0x71,0x2e,0x71,0x2e,0x71,0x2e,0x71,0x2e,0x72,
+ 0x2e,0x71,0x2e,0x71,0x2e,0x72,0x2e,0x42,0x2e,0x3e,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x4e,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x71,0x2e,0x35,0x2e,0x35,
+ 0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x42,0x2e,0x2c,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x4e,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,
+ 0x2e,0x3c,0x2e,0x3c,0x2e,0x35,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,0x2e,0x4e,
+ 0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x6c,0x2e,0x2c,0x2e,0x3b,0x2e,0x3b,
+ 0x2e,0x3b,0x2e,0x2c,0x2e,0x3b,0x2e,0x2c,0x2e,0x3b,0x2e,0x2c,0x2e,0x3b,0x2e,0x3b,
+ 0x2e,0x3b,0x2e,0x6c,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x6c,0x2e,0x2d,
+ 0x2e,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x3b,0x2e,0x2d,0x2e,0x2d,
+ 0x2e,0x2d,0x2e,0x2d,0x2e,0x3b,0x2e,0x6c,0x2e,0x3e,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x6c,0x2e,0x2d,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,
+ 0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x6c,0x2e,0x2c,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x72,0x2e,0x27,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x27,
+ 0x20,0x29,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x72,
+ 0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x72,0x2e,0x29,0x20,0x29,0x20,0x57,
+ 0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x57,0x20,0x29,
+ 0x20,0x29,0x20,0x71,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x71,0x2e,0x57,
+ 0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,
+ 0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x71,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x35,0x2e,0x59,0x20,0x59,0x20,0x57,0x20,0x59,0x20,0x59,0x20,0x59,0x20,0x59,
+ 0x20,0x59,0x20,0x59,0x20,0x59,0x20,0x59,0x20,0x59,0x20,0x35,0x2e,0x2c,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x35,0x2e,0x4a,0x20,0x4a,0x20,0x4a,0x20,0x59,0x20,0x4a,
+ 0x20,0x59,0x20,0x59,0x20,0x4a,0x20,0x59,0x20,0x4a,0x20,0x4a,0x20,0x59,0x20,0x71,
+ 0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x35,0x2e,0x4a,0x20,0x4a,0x20,0x44,
+ 0x20,0x4a,0x20,0x4a,0x20,0x44,0x20,0x4a,0x20,0x44,0x20,0x4a,0x20,0x57,0x20,0x29,
+ 0x20,0x2c,0x2e,0x24,0x2e,0x2d,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x3c,0x2e,0x5a,
+ 0x20,0x44,0x20,0x44,0x20,0x5a,0x20,0x44,0x20,0x4a,0x20,0x59,0x20,0x27,0x20,0x2c,
+ 0x2e,0x42,0x20,0x62,0x20,0x69,0x20,0x2d,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x3c,0x2e,0x5a,0x20,0x5a,0x20,0x5a,0x20,0x59,0x20,0x29,0x20,0x3c,0x2e,0x42,
+ 0x20,0x64,0x20,0x75,0x20,0x26,0x20,0x40,0x20,0x58,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x2c,0x2e,0x4a,0x20,0x29,0x20,0x2c,0x2e,0x42,0x20,0x64,
+ 0x20,0x79,0x20,0x26,0x20,0x6f,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x59,0x2e,0x56,0x20,0x64,0x20,0x75,
+ 0x20,0x26,0x20,0x6f,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x31,0x20,0x34,0x20,0x26,
+ 0x20,0x6f,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/editpaste.xpm
+ 0x0,0x0,0x18,0xf8,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x65,0x64,0x69,0x74,0x70,0x61,0x73,0x74,0x65,0x5b,
+ 0x5d,0x20,0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,
+ 0x20,0x72,0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,
+ 0x72,0x73,0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,
+ 0x22,0x33,0x32,0x20,0x33,0x32,0x20,0x32,0x35,0x37,0x20,0x32,0x22,0x2c,0xa,0x22,
+ 0x20,0x20,0x20,0x63,0x20,0x62,0x6c,0x61,0x63,0x6b,0x22,0x2c,0xa,0x22,0x2e,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x44,0x30,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x58,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x39,0x31,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x32,0x31,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x4f,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x41,0x31,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x2b,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x33,0x32,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x45,0x32,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x23,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x41,0x32,0x38,0x30,0x34,0x22,0x2c,0xa,0x22,0x24,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x44,0x33,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x42,0x33,0x45,0x31,0x35,0x22,0x2c,0xa,0x22,0x26,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x34,0x33,0x39,0x31,0x42,0x22,0x2c,0xa,0x22,0x2a,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x33,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x3d,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x33,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x2d,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x44,0x34,0x30,0x31,0x35,0x22,0x2c,0xa,0x22,0x3b,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x32,0x34,0x45,0x32,0x35,0x22,0x2c,0xa,0x22,0x3a,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x34,0x46,0x32,0x43,0x22,0x2c,0xa,0x22,0x3e,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x32,0x34,0x45,0x33,0x44,0x22,0x2c,0xa,0x22,0x2c,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x38,0x35,0x36,0x32,0x46,0x22,0x2c,0xa,0x22,0x3c,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x33,0x35,0x30,0x33,0x45,0x22,0x2c,0xa,0x22,0x31,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x45,0x36,0x32,0x33,0x42,0x22,0x2c,0xa,0x22,0x32,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x33,0x34,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x33,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x38,0x34,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x34,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x45,0x34,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x35,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x31,0x34,0x46,0x31,0x31,0x22,0x2c,0xa,0x22,0x36,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x38,0x35,0x34,0x31,0x36,0x22,0x2c,0xa,0x22,0x37,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x34,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x38,0x34,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x39,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x35,0x35,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x30,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x35,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x71,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x77,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x42,0x35,0x37,0x30,0x46,0x22,0x2c,0xa,0x22,0x65,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x39,0x35,0x36,0x32,0x46,0x22,0x2c,0xa,0x22,0x72,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x38,0x36,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x74,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x46,0x36,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x79,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x36,0x36,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x75,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x30,0x36,0x31,0x33,0x46,0x22,0x2c,0xa,0x22,0x69,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x36,0x34,0x32,0x32,0x22,0x2c,0xa,0x22,0x70,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x35,0x31,0x34,0x33,0x22,0x2c,0xa,0x22,0x61,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x35,0x32,0x34,0x42,0x22,0x2c,0xa,0x22,0x73,0x20,
+ 0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x33,0x32,0x22,0x2c,0xa,0x22,0x64,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x44,0x35,0x44,0x35,0x37,0x22,0x2c,0xa,0x22,0x66,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x31,0x36,0x36,0x34,0x31,0x22,0x2c,0xa,0x22,0x67,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x37,0x36,0x39,0x35,0x44,0x22,0x2c,0xa,0x22,0x68,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x42,0x37,0x33,0x34,0x44,0x22,0x2c,0xa,0x22,0x6a,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x43,0x37,0x35,0x35,0x33,0x22,0x2c,0xa,0x22,0x6b,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x31,0x36,0x32,0x36,0x31,0x22,0x2c,0xa,0x22,0x6c,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x38,0x36,0x41,0x36,0x34,0x22,0x2c,0xa,0x22,0x7a,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x42,0x37,0x31,0x36,0x32,0x22,0x2c,0xa,0x22,0x78,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x32,0x37,0x32,0x37,0x32,0x22,0x2c,0xa,0x22,0x63,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x33,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x76,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x34,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x62,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x34,0x42,0x46,0x46,0x22,0x2c,0xa,0x22,0x6e,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x35,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x6d,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x31,0x35,0x41,0x46,0x46,0x22,0x2c,0xa,0x22,0x4d,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x36,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x4e,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x34,0x36,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x42,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x38,0x36,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x56,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x33,0x37,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x43,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x36,0x36,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x5a,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x35,0x37,0x36,0x46,0x46,0x22,0x2c,0xa,0x22,0x41,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x36,0x37,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x53,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x46,0x37,0x42,0x38,0x34,0x22,0x2c,0xa,0x22,0x44,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x37,0x38,0x35,0x36,0x44,0x22,0x2c,0xa,0x22,0x46,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x42,0x38,0x42,0x37,0x35,0x22,0x2c,0xa,0x22,0x47,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x38,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x31,0x39,0x37,0x46,0x46,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x42,0x39,0x32,0x46,0x46,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x33,0x38,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x31,0x41,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x44,0x42,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x30,0x39,0x36,0x46,0x46,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x44,0x41,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x46,0x42,0x43,0x46,0x46,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x32,0x43,0x36,0x46,0x46,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x41,0x43,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x30,0x44,0x30,0x46,0x46,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x38,0x44,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x34,0x39,0x33,0x46,0x31,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x46,0x38,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x46,0x38,0x41,0x46,0x46,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x32,0x39,0x30,0x45,0x34,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x46,0x39,0x32,0x46,0x46,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x43,0x41,0x41,0x46,0x45,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x30,0x42,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x37,0x39,0x44,0x43,0x42,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x36,0x39,0x33,0x45,0x32,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x32,0x39,0x30,0x46,0x46,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x34,0x39,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x31,0x41,0x36,0x45,0x35,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x39,0x41,0x34,0x46,0x46,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x46,0x42,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x38,0x42,0x38,0x46,0x33,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,
+ 0x63,0x20,0x23,0x34,0x32,0x44,0x43,0x46,0x46,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,
+ 0x63,0x20,0x23,0x34,0x37,0x45,0x30,0x46,0x46,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,
+ 0x63,0x20,0x23,0x35,0x38,0x45,0x39,0x46,0x46,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,
+ 0x63,0x20,0x23,0x36,0x34,0x43,0x30,0x45,0x42,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,
+ 0x63,0x20,0x23,0x36,0x41,0x44,0x46,0x45,0x46,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x35,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x34,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x42,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x30,0x35,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x36,0x31,0x30,0x33,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x37,0x36,0x38,0x30,0x37,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x41,0x36,0x31,0x31,0x31,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x36,0x45,0x31,0x42,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x37,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x37,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x33,0x36,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x38,0x36,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x36,0x43,0x32,0x32,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x38,0x37,0x41,0x33,0x46,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x30,0x37,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x37,0x35,0x31,0x31,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x39,0x37,0x44,0x31,0x35,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x37,0x42,0x31,0x34,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x39,0x38,0x37,0x31,0x32,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x36,0x38,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x38,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x38,0x30,0x31,0x36,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x43,0x39,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x38,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x39,0x39,0x42,0x32,0x41,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x39,0x41,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x41,0x36,0x33,0x43,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x35,0x38,0x44,0x34,0x33,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x38,0x38,0x46,0x34,0x34,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x41,0x39,0x33,0x34,0x36,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x46,0x39,0x39,0x34,0x38,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x42,0x38,0x39,0x37,0x43,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x35,0x38,0x46,0x36,0x46,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x38,0x39,0x33,0x37,0x42,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x36,0x38,0x34,0x34,0x33,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x30,0x38,0x43,0x34,0x31,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x46,0x39,0x34,0x36,0x32,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x39,0x38,0x36,0x34,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x41,0x38,0x35,0x30,0x22,0x2c,0xa,0x22,0x6a,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x42,0x33,0x35,0x35,0x22,0x2c,0xa,0x22,0x6b,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x33,0x39,0x37,0x32,0x46,0x22,0x2c,0xa,0x22,0x6c,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x41,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x7a,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x41,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x78,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x37,0x42,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x63,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x41,0x30,0x33,0x30,0x22,0x2c,0xa,0x22,0x76,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x42,0x34,0x33,0x45,0x22,0x2c,0xa,0x22,0x62,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x41,0x44,0x30,0x43,0x22,0x2c,0xa,0x22,0x6e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x42,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x6d,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x44,0x42,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x4d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x32,0x42,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x4e,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x31,0x42,0x38,0x34,0x43,0x22,0x2c,0xa,0x22,0x42,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x31,0x42,0x37,0x35,0x37,0x22,0x2c,0xa,0x22,0x56,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x42,0x42,0x35,0x38,0x22,0x2c,0xa,0x22,0x43,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x39,0x42,0x45,0x35,0x41,0x22,0x2c,0xa,0x22,0x5a,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x41,0x39,0x37,0x38,0x22,0x2c,0xa,0x22,0x41,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x46,0x43,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x53,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x43,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x44,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x36,0x43,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x46,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x47,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x48,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x46,0x30,0x45,0x22,0x2c,0xa,0x22,0x4a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x44,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x4b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x42,0x43,0x44,0x33,0x39,0x22,0x2c,0xa,0x22,0x4c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x38,0x33,0x32,0x22,0x2c,0xa,0x22,0x50,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x34,0x33,0x32,0x22,0x2c,0xa,0x22,0x49,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x43,0x32,0x35,0x43,0x22,0x2c,0xa,0x22,0x55,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x37,0x43,0x36,0x34,0x38,0x22,0x2c,0xa,0x22,0x59,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x43,0x37,0x34,0x42,0x22,0x2c,0xa,0x22,0x54,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x30,0x43,0x35,0x35,0x45,0x22,0x2c,0xa,0x22,0x52,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x43,0x38,0x35,0x46,0x22,0x2c,0xa,0x22,0x45,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x43,0x39,0x36,0x30,0x22,0x2c,0xa,0x22,0x57,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x44,0x32,0x36,0x34,0x22,0x2c,0xa,0x22,0x51,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x43,0x41,0x34,0x43,0x22,0x2c,0xa,0x22,0x21,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x44,0x31,0x34,0x45,0x22,0x2c,0xa,0x22,0x7e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x44,0x41,0x35,0x31,0x22,0x2c,0xa,0x22,0x5e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x44,0x30,0x35,0x30,0x22,0x2c,0xa,0x22,0x2f,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x39,0x44,0x34,0x35,0x32,0x22,0x2c,0xa,0x22,0x28,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x44,0x35,0x33,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x32,0x44,0x37,0x36,0x35,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x44,0x44,0x36,0x39,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x36,0x44,0x44,0x36,0x38,0x22,0x2c,0xa,0x22,0x27,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x44,0x42,0x36,0x45,0x22,0x2c,0xa,0x22,0x5d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x45,0x34,0x46,0x22,0x2c,0xa,0x22,0x5b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x45,0x33,0x35,0x34,0x22,0x2c,0xa,0x22,0x7b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x45,0x41,0x35,0x35,0x22,0x2c,0xa,0x22,0x7d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x45,0x31,0x35,0x33,0x22,0x2c,0xa,0x22,0x7c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x30,0x35,0x36,0x22,0x2c,0xa,0x22,0x20,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x45,0x31,0x36,0x41,0x22,0x2c,0xa,0x22,0x2e,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x45,0x35,0x36,0x44,0x22,0x2c,0xa,0x22,0x58,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x45,0x41,0x36,0x46,0x22,0x2c,0xa,0x22,0x6f,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x45,0x42,0x37,0x30,0x22,0x2c,0xa,0x22,0x4f,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x39,0x45,0x43,0x37,0x30,0x22,0x2c,0xa,0x22,0x2b,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x33,0x37,0x32,0x22,0x2c,0xa,0x22,0x40,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x39,0x34,0x38,0x36,0x22,0x2c,0xa,0x22,0x23,0x58,0x20,
+ 0x63,0x20,0x67,0x72,0x61,0x79,0x36,0x30,0x22,0x2c,0xa,0x22,0x24,0x58,0x20,0x63,
+ 0x20,0x23,0x39,0x36,0x39,0x35,0x39,0x36,0x22,0x2c,0xa,0x22,0x25,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x41,0x41,0x31,0x39,0x33,0x22,0x2c,0xa,0x22,0x26,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x32,0x41,0x38,0x39,0x42,0x22,0x2c,0xa,0x22,0x2a,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x43,0x41,0x45,0x41,0x33,0x22,0x2c,0xa,0x22,0x3d,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x36,0x41,0x37,0x41,0x39,0x22,0x2c,0xa,0x22,0x2d,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x42,0x41,0x32,0x42,0x31,0x22,0x2c,0xa,0x22,0x3b,0x58,0x20,0x63,
+ 0x20,0x23,0x41,0x43,0x41,0x35,0x38,0x30,0x22,0x2c,0xa,0x22,0x3a,0x58,0x20,0x63,
+ 0x20,0x23,0x41,0x35,0x41,0x32,0x39,0x31,0x22,0x2c,0xa,0x22,0x3e,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x33,0x41,0x46,0x39,0x38,0x22,0x2c,0xa,0x22,0x2c,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x38,0x42,0x37,0x41,0x46,0x22,0x2c,0xa,0x22,0x3c,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x33,0x42,0x32,0x41,0x42,0x22,0x2c,0xa,0x22,0x31,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x31,0x42,0x31,0x42,0x31,0x22,0x2c,0xa,0x22,0x32,0x58,0x20,0x63,
+ 0x20,0x23,0x41,0x36,0x42,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x33,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x38,0x44,0x45,0x45,0x30,0x22,0x2c,0xa,0x22,0x34,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x42,0x46,0x30,0x46,0x45,0x22,0x2c,0xa,0x22,0x35,0x58,0x20,0x63,
+ 0x20,0x23,0x41,0x34,0x43,0x46,0x43,0x36,0x22,0x2c,0xa,0x22,0x36,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x46,0x44,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x37,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x46,0x44,0x43,0x46,0x46,0x22,0x2c,0xa,0x22,0x38,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x32,0x41,0x44,0x38,0x32,0x22,0x2c,0xa,0x22,0x39,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x42,0x34,0x38,0x39,0x22,0x2c,0xa,0x22,0x30,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x32,0x42,0x46,0x39,0x42,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x31,0x43,0x31,0x39,0x46,0x22,0x2c,0xa,0x22,0x77,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x38,0x43,0x34,0x41,0x41,0x22,0x2c,0xa,0x22,0x65,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x46,0x43,0x42,0x42,0x37,0x22,0x2c,0xa,0x22,0x72,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x38,0x43,0x37,0x41,0x36,0x22,0x2c,0xa,0x22,0x74,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x32,0x43,0x32,0x41,0x33,0x22,0x2c,0xa,0x22,0x79,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x35,0x43,0x43,0x42,0x33,0x22,0x2c,0xa,0x22,0x75,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x41,0x44,0x31,0x41,0x31,0x22,0x2c,0xa,0x22,0x69,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x44,0x44,0x35,0x42,0x42,0x22,0x2c,0xa,0x22,0x70,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x37,0x44,0x31,0x42,0x33,0x22,0x2c,0xa,0x22,0x61,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x43,0x45,0x35,0x42,0x42,0x22,0x2c,0xa,0x22,0x73,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x35,0x45,0x42,0x42,0x35,0x22,0x2c,0xa,0x22,0x64,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x35,0x45,0x43,0x42,0x43,0x22,0x2c,0xa,0x22,0x66,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x38,0x45,0x45,0x42,0x38,0x22,0x2c,0xa,0x22,0x67,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x43,0x46,0x32,0x42,0x43,0x22,0x2c,0xa,0x22,0x68,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x43,0x42,0x43,0x42,0x22,0x2c,0xa,0x22,0x6a,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x38,0x44,0x36,0x43,0x37,0x22,0x2c,0xa,0x22,0x6b,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x44,0x44,0x44,0x44,0x44,0x22,0x2c,0xa,0x22,0x6c,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x34,0x44,0x41,0x43,0x32,0x22,0x2c,0xa,0x22,0x7a,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x43,0x45,0x36,0x43,0x37,0x22,0x2c,0xa,0x22,0x78,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x42,0x45,0x36,0x44,0x39,0x22,0x2c,0xa,0x22,0x63,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x39,0x45,0x33,0x44,0x30,0x22,0x2c,0xa,0x22,0x76,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x35,0x45,0x44,0x43,0x34,0x22,0x2c,0xa,0x22,0x62,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x36,0x45,0x46,0x43,0x39,0x22,0x2c,0xa,0x22,0x6e,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x30,0x45,0x42,0x44,0x35,0x22,0x2c,0xa,0x22,0x6d,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x33,0x45,0x46,0x44,0x42,0x22,0x2c,0xa,0x22,0x4d,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x43,0x46,0x33,0x43,0x35,0x22,0x2c,0xa,0x22,0x4e,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x43,0x46,0x34,0x43,0x41,0x22,0x2c,0xa,0x22,0x42,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x37,0x46,0x30,0x43,0x41,0x22,0x2c,0xa,0x22,0x56,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x36,0x46,0x30,0x44,0x32,0x22,0x2c,0xa,0x22,0x43,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x39,0x46,0x33,0x44,0x33,0x22,0x2c,0xa,0x22,0x5a,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x39,0x46,0x34,0x44,0x43,0x22,0x2c,0xa,0x22,0x41,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x38,0x44,0x34,0x22,0x2c,0xa,0x22,0x53,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x39,0x44,0x42,0x22,0x2c,0xa,0x22,0x44,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x37,0x45,0x37,0x45,0x34,0x22,0x2c,0xa,0x22,0x46,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x42,0x45,0x42,0x45,0x39,0x22,0x2c,0xa,0x22,0x47,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x31,0x45,0x44,0x45,0x31,0x22,0x2c,0xa,0x22,0x48,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x39,0x46,0x36,0x45,0x35,0x22,0x2c,0xa,0x22,0x4a,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x44,0x46,0x39,0x45,0x34,0x22,0x2c,0xa,0x22,0x4b,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x42,0x45,0x42,0x22,0x2c,0xa,0x22,0x4c,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x36,0x46,0x32,0x45,0x36,0x22,0x2c,0xa,0x22,0x50,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x43,0x46,0x33,0x22,0x2c,0xa,0x22,0x49,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x44,0x46,0x44,0x22,0x2c,0xa,0x22,0x55,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x34,0x46,0x34,0x46,0x33,0x22,0x2c,0xa,0x22,0x59,0x58,0x20,0x63,
+ 0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,0x6c,
+ 0x73,0x20,0x2a,0x2f,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x3a,0x2e,0x3a,0x2e,0x2b,0x20,0x49,0x58,0x49,0x58,0x49,0x58,0x49,0x58,
+ 0x49,0x58,0x49,0x58,0x49,0x58,0x49,0x58,0x46,0x58,0x23,0x20,0x2b,0x2e,0x37,0x20,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3e,0x2e,0x6b,0x2e,0x63,0x2e,0x36,0x20,0x46,0x58,0x6b,0x58,
+ 0x6b,0x58,0x6b,0x58,0x44,0x58,0x6b,0x58,0x6b,0x58,0x6b,0x58,0x78,0x20,0x69,0x20,
+ 0x62,0x2e,0x3e,0x2e,0x2b,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x27,0x2e,0x4b,0x2e,0x3d,0x2e,
+ 0x68,0x58,0x31,0x58,0x31,0x58,0x31,0x58,0x31,0x58,0x31,0x58,0x31,0x58,0x31,0x58,
+ 0x64,0x20,0x26,0x2e,0x30,0x2e,0x25,0x2e,0x2a,0x20,0x37,0x20,0x23,0x2e,0x23,0x2e,
+ 0x3a,0x2e,0x24,0x2e,0x23,0x2e,0x32,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x2f,0x2e,
+ 0x4d,0x2e,0x25,0x2e,0x24,0x58,0x6b,0x20,0x6b,0x20,0x64,0x20,0x73,0x20,0x73,0x20,
+ 0x73,0x20,0x65,0x20,0x77,0x20,0x3e,0x2e,0x32,0x2e,0x64,0x2e,0x73,0x2e,0x5a,0x2e,
+ 0x39,0x58,0x72,0x58,0x6c,0x58,0x78,0x58,0x30,0x58,0x37,0x20,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x5e,0x2e,0x4d,0x2e,0x31,0x2e,0x3a,0x20,0x25,0x20,0x25,0x20,0x2d,0x20,
+ 0x25,0x20,0x35,0x20,0x36,0x20,0x26,0x2e,0x47,0x58,0x49,0x58,0x49,0x58,0x50,0x58,
+ 0x50,0x58,0x50,0x58,0x50,0x58,0x50,0x58,0x4c,0x58,0x49,0x58,0x49,0x58,0x67,0x2e,
+ 0x33,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x23,0x58,0x3a,0x2e,0x5e,0x2e,0x6d,0x2e,0x76,0x2e,0x79,0x2e,0x72,0x2e,
+ 0x72,0x2e,0x72,0x2e,0x72,0x2e,0x68,0x2e,0x68,0x2e,0x32,0x2e,0x49,0x58,0x50,0x58,
+ 0x50,0x58,0x4b,0x58,0x4b,0x58,0x50,0x58,0x4b,0x58,0x48,0x58,0x78,0x58,0x55,0x58,
+ 0x49,0x58,0x49,0x58,0x66,0x2e,0x34,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x23,0x58,0x3a,0x2e,0x5e,0x2e,0x6d,0x2e,0x59,0x2e,
+ 0x49,0x2e,0x42,0x2e,0x6a,0x2e,0x6a,0x2e,0x6a,0x2e,0x56,0x2e,0x49,0x2e,0x34,0x2e,
+ 0x50,0x58,0x4b,0x58,0x4a,0x58,0x4b,0x58,0x4a,0x58,0x4b,0x58,0x4b,0x58,0x6d,0x58,
+ 0x6a,0x58,0x46,0x58,0x49,0x58,0x49,0x58,0x55,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x23,0x58,0x3a,0x2e,0x5e,0x2e,
+ 0x6d,0x2e,0x59,0x2e,0x45,0x2e,0x49,0x2e,0x6a,0x2e,0x6a,0x2e,0x6a,0x2e,0x49,0x2e,
+ 0x52,0x2e,0x38,0x2e,0x50,0x58,0x4b,0x58,0x53,0x58,0x4a,0x58,0x4a,0x58,0x4a,0x58,
+ 0x53,0x58,0x6e,0x58,0x65,0x58,0x44,0x58,0x49,0x58,0x49,0x58,0x55,0x58,0x3c,0x2e,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x2f,0x2e,0x4d,0x2e,0x21,0x2e,0x57,0x2e,0x52,0x2e,0x49,0x2e,0x54,0x2e,
+ 0x52,0x2e,0x45,0x2e,0x57,0x2e,0x38,0x2e,0x55,0x58,0x4a,0x58,0x4a,0x58,0x53,0x58,
+ 0x53,0x58,0x53,0x58,0x53,0x58,0x6e,0x58,0x65,0x58,0x3a,0x58,0x40,0x58,0x69,0x2e,
+ 0x3c,0x58,0x37,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x2f,0x2e,0x44,0x2e,0x7e,0x2e,0x5f,0x2e,0x60,0x2e,
+ 0x57,0x2e,0x57,0x2e,0x57,0x2e,0x57,0x2e,0x20,0x58,0x38,0x2e,0x50,0x58,0x4a,0x58,
+ 0x53,0x58,0x41,0x58,0x53,0x58,0x53,0x58,0x53,0x58,0x56,0x58,0x6a,0x58,0x3e,0x58,
+ 0x40,0x58,0x40,0x58,0x2c,0x58,0x34,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,0x53,0x2e,0x7d,0x2e,
+ 0x2e,0x58,0x20,0x58,0x20,0x58,0x20,0x58,0x20,0x58,0x20,0x58,0x20,0x58,0x38,0x2e,
+ 0x50,0x58,0x53,0x58,0x41,0x58,0x41,0x58,0x41,0x58,0x41,0x58,0x41,0x58,0x4e,0x58,
+ 0x7a,0x58,0x70,0x58,0x77,0x58,0x77,0x58,0x6a,0x58,0x37,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,
+ 0x53,0x2e,0x5b,0x2e,0x4f,0x58,0x4f,0x58,0x4f,0x58,0x6f,0x58,0x6f,0x58,0x74,0x2e,
+ 0x3b,0x20,0x4f,0x20,0x73,0x20,0x61,0x20,0x70,0x20,0x70,0x20,0x70,0x20,0x70,0x20,
+ 0x61,0x2e,0x41,0x58,0x4d,0x58,0x76,0x58,0x61,0x58,0x7a,0x58,0x47,0x58,0x2b,0x2e,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x28,0x2e,0x53,0x2e,0x5b,0x2e,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x4f,0x58,
+ 0x2b,0x58,0x3b,0x20,0x37,0x58,0x32,0x58,0x5d,0x20,0x2f,0x20,0x2f,0x20,0x7e,0x20,
+ 0x21,0x20,0x32,0x58,0x70,0x20,0x4d,0x58,0x4e,0x58,0x4e,0x58,0x4e,0x58,0x53,0x58,
+ 0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,0x46,0x2e,0x7c,0x2e,0x2b,0x58,0x2b,0x58,
+ 0x2b,0x58,0x2b,0x58,0x2b,0x58,0x79,0x2e,0x2c,0x20,0x5f,0x20,0x41,0x20,0x6d,0x20,
+ 0x62,0x20,0x76,0x20,0x63,0x20,0x21,0x20,0x70,0x20,0x4d,0x58,0x4d,0x58,0x67,0x58,
+ 0x4d,0x58,0x41,0x58,0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,0x46,0x2e,0x7c,0x2e,
+ 0x2b,0x58,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x6a,0x2e,0x26,0x20,
+ 0x5e,0x20,0x42,0x20,0x6e,0x20,0x62,0x20,0x76,0x20,0x27,0x20,0x3c,0x20,0x67,0x58,
+ 0x4d,0x58,0x67,0x58,0x67,0x58,0x4e,0x58,0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,
+ 0x46,0x2e,0x55,0x2e,0x57,0x2e,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x29,0x2e,
+ 0x79,0x2e,0x67,0x20,0x51,0x20,0x4e,0x20,0x6d,0x20,0x6e,0x20,0x62,0x20,0x7e,0x20,
+ 0x3c,0x20,0x67,0x58,0x67,0x58,0x67,0x58,0x67,0x58,0x41,0x58,0x4a,0x58,0x71,0x20,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x5b,0x2e,0x6c,0x2e,0x6a,0x20,0x6a,0x20,0x79,0x2e,0x49,0x2e,0x6a,0x2e,
+ 0x72,0x2e,0x31,0x20,0x3d,0x58,0x28,0x20,0x4b,0x20,0x4e,0x20,0x4d,0x20,0x6d,0x20,
+ 0x62,0x20,0x7e,0x20,0x3c,0x20,0x67,0x58,0x67,0x58,0x67,0x58,0x67,0x58,0x4e,0x58,
+ 0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x5b,0x2e,0x74,0x20,0x35,0x58,0x34,0x58,0x26,0x58,
+ 0x44,0x20,0x46,0x20,0x3d,0x58,0x7c,0x20,0x55,0x20,0x4a,0x20,0x47,0x20,0x56,0x20,
+ 0x5a,0x20,0x41,0x20,0x43,0x20,0x2f,0x20,0x3c,0x20,0x66,0x58,0x67,0x58,0x67,0x58,
+ 0x67,0x58,0x4d,0x58,0x48,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x5b,0x2e,0x6c,0x2e,0x68,0x20,
+ 0x33,0x58,0x58,0x2e,0x2e,0x2e,0x57,0x20,0x54,0x20,0x50,0x20,0x4c,0x20,0x48,0x20,
+ 0x4b,0x20,0x49,0x20,0x5b,0x20,0x53,0x20,0x60,0x20,0x7b,0x20,0x3c,0x20,0x66,0x58,
+ 0x66,0x58,0x66,0x58,0x66,0x58,0x4d,0x58,0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x5b,0x2e,
+ 0x47,0x2e,0x65,0x2e,0x31,0x20,0x2a,0x58,0x4f,0x2e,0x2e,0x2e,0x45,0x20,0x52,0x20,
+ 0x59,0x20,0x59,0x20,0x7c,0x20,0x2d,0x58,0x64,0x20,0x5a,0x2e,0x6b,0x20,0x36,0x58,
+ 0x3e,0x20,0x66,0x58,0x66,0x58,0x66,0x58,0x66,0x58,0x42,0x58,0x4a,0x58,0x2b,0x2e,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x5b,0x2e,0x47,0x2e,0x7b,0x2e,0x60,0x2e,0x75,0x2e,0x31,0x20,0x46,0x20,
+ 0x26,0x58,0x2a,0x58,0x25,0x58,0x7a,0x20,0x6c,0x20,0x61,0x2e,0x75,0x58,0x66,0x58,
+ 0x70,0x2e,0x3e,0x20,0x70,0x2e,0x73,0x58,0x73,0x58,0x73,0x58,0x66,0x58,0x42,0x58,
+ 0x4a,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x7b,0x2e,0x47,0x2e,0x7c,0x2e,0x2b,0x58,0x2b,0x58,
+ 0x20,0x58,0x4e,0x2e,0x71,0x2e,0x35,0x2e,0x37,0x2e,0x71,0x20,0x63,0x58,0x76,0x58,
+ 0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,
+ 0x73,0x58,0x42,0x58,0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x7c,0x2e,0x47,0x2e,0x5d,0x2e,
+ 0x7c,0x2e,0x4c,0x2e,0x48,0x2e,0x47,0x2e,0x47,0x2e,0x47,0x2e,0x41,0x2e,0x31,0x2e,
+ 0x4a,0x58,0x76,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,
+ 0x73,0x58,0x66,0x58,0x64,0x58,0x43,0x58,0x50,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x7b,0x2e,
+ 0x47,0x2e,0x47,0x2e,0x47,0x2e,0x47,0x2e,0x47,0x2e,0x78,0x2e,0x77,0x2e,0x3b,0x2e,
+ 0x74,0x20,0x3a,0x2e,0x48,0x58,0x64,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,
+ 0x73,0x58,0x64,0x58,0x76,0x58,0x42,0x58,0x5a,0x58,0x4c,0x58,0x74,0x58,0x3d,0x20,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x7b,0x2e,0x47,0x2e,0x4a,0x2e,0x78,0x2e,0x39,0x2e,0x3b,0x2e,0x72,0x20,
+ 0x39,0x20,0x71,0x20,0x30,0x20,0x23,0x2e,0x4b,0x58,0x76,0x58,0x73,0x58,0x61,0x58,
+ 0x73,0x58,0x76,0x58,0x42,0x58,0x43,0x58,0x48,0x58,0x69,0x58,0x67,0x2e,0x2a,0x2e,
+ 0x3d,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x4c,0x2e,0x39,0x2e,0x2d,0x2e,0x79,0x20,0x39,0x20,
+ 0x71,0x20,0x30,0x20,0x3d,0x20,0x2b,0x20,0x20,0x20,0x23,0x2e,0x48,0x58,0x62,0x58,
+ 0x64,0x58,0x62,0x58,0x56,0x58,0x5a,0x58,0x63,0x58,0x38,0x58,0x2c,0x2e,0x33,0x20,
+ 0x24,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x7a,0x2e,0x39,0x20,0x71,0x20,
+ 0x37,0x20,0x2a,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x2e,
+ 0x50,0x58,0x5a,0x58,0x6d,0x58,0x6d,0x58,0x30,0x58,0x73,0x2e,0x30,0x20,0x24,0x20,
+ 0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x38,0x20,0x30,0x20,
+ 0x3d,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x3a,0x2e,0x49,0x58,0x70,0x58,0x67,0x2e,0x2a,0x2e,0x3d,0x20,0x4f,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x59,0x58,0x59,0x58,0x40,0x2e,0x23,0x2e,0x32,0x20,0x40,0x20,0x2e,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/editcut.xpm
+ 0x0,0x0,0x16,0x47,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x65,0x64,0x69,0x74,0x63,0x75,0x74,0x5b,0x5d,0x20,
+ 0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,0x72,
+ 0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,0x73,
+ 0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,0x33,
+ 0x32,0x20,0x33,0x32,0x20,0x32,0x31,0x34,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x2e,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x42,0x30,0x42,0x30,0x42,0x22,0x2c,0xa,0x22,0x58,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x38,0x31,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x44,0x31,0x39,0x30,0x42,0x22,0x2c,0xa,0x22,0x4f,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x33,0x31,0x33,0x31,0x33,0x22,0x2c,0xa,0x22,0x2b,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x42,0x31,0x42,0x31,0x42,0x22,0x2c,0xa,0x22,0x40,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x31,0x31,0x45,0x31,0x31,0x22,0x2c,0xa,0x22,0x23,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x36,0x32,0x33,0x31,0x41,0x22,0x2c,0xa,0x22,0x24,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x41,0x32,0x35,0x31,0x33,0x22,0x2c,0xa,0x22,0x25,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x45,0x32,0x39,0x31,0x32,0x22,0x2c,0xa,0x22,0x26,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x45,0x32,0x41,0x31,0x39,0x22,0x2c,0xa,0x22,0x2a,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x37,0x32,0x45,0x30,0x42,0x22,0x2c,0xa,0x22,0x3d,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x30,0x32,0x41,0x31,0x32,0x22,0x2c,0xa,0x22,0x2d,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x31,0x32,0x43,0x31,0x42,0x22,0x2c,0xa,0x22,0x3b,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x41,0x33,0x32,0x30,0x46,0x22,0x2c,0xa,0x22,0x3a,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x43,0x33,0x34,0x31,0x35,0x22,0x2c,0xa,0x22,0x3e,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x43,0x33,0x35,0x31,0x42,0x22,0x2c,0xa,0x22,0x2c,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x33,0x32,0x33,0x32,0x33,0x22,0x2c,0xa,0x22,0x3c,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x42,0x32,0x39,0x32,0x32,0x22,0x2c,0xa,0x22,0x31,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x43,0x32,0x43,0x32,0x43,0x22,0x2c,0xa,0x22,0x32,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x30,0x32,0x45,0x32,0x36,0x22,0x2c,0xa,0x22,0x33,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x35,0x33,0x31,0x32,0x30,0x22,0x2c,0xa,0x22,0x34,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x46,0x33,0x42,0x32,0x44,0x22,0x2c,0xa,0x22,0x35,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x31,0x33,0x31,0x33,0x31,0x22,0x2c,0xa,0x22,0x36,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x41,0x33,0x41,0x33,0x41,0x22,0x2c,0xa,0x22,0x37,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x33,0x38,0x31,0x34,0x22,0x2c,0xa,0x22,0x38,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x39,0x33,0x45,0x31,0x37,0x22,0x2c,0xa,0x22,0x39,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x31,0x33,0x44,0x32,0x46,0x22,0x2c,0xa,0x22,0x30,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x33,0x46,0x33,0x32,0x22,0x2c,0xa,0x22,0x71,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x46,0x34,0x33,0x31,0x39,0x22,0x2c,0xa,0x22,0x77,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x43,0x34,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x65,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x46,0x34,0x46,0x30,0x44,0x22,0x2c,0xa,0x22,0x72,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x31,0x34,0x34,0x31,0x30,0x22,0x2c,0xa,0x22,0x74,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x35,0x34,0x38,0x31,0x33,0x22,0x2c,0xa,0x22,0x79,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x45,0x34,0x37,0x32,0x43,0x22,0x2c,0xa,0x22,0x75,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x34,0x34,0x31,0x33,0x36,0x22,0x2c,0xa,0x22,0x69,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x41,0x34,0x38,0x33,0x46,0x22,0x2c,0xa,0x22,0x70,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x33,0x34,0x42,0x32,0x42,0x22,0x2c,0xa,0x22,0x61,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x34,0x42,0x33,0x37,0x22,0x2c,0xa,0x22,0x73,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x31,0x34,0x43,0x33,0x41,0x22,0x2c,0xa,0x22,0x64,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x34,0x46,0x30,0x34,0x22,0x2c,0xa,0x22,0x66,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x30,0x34,0x46,0x30,0x42,0x22,0x2c,0xa,0x22,0x67,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x36,0x35,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x68,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x37,0x35,0x35,0x30,0x39,0x22,0x2c,0xa,0x22,0x6a,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x42,0x35,0x34,0x30,0x35,0x22,0x2c,0xa,0x22,0x6b,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x43,0x35,0x38,0x30,0x37,0x22,0x2c,0xa,0x22,0x6c,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x43,0x35,0x39,0x30,0x42,0x22,0x2c,0xa,0x22,0x7a,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x34,0x35,0x42,0x30,0x34,0x22,0x2c,0xa,0x22,0x78,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x31,0x35,0x44,0x30,0x41,0x22,0x2c,0xa,0x22,0x63,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x42,0x35,0x42,0x30,0x32,0x22,0x2c,0xa,0x22,0x76,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x32,0x35,0x42,0x33,0x42,0x22,0x2c,0xa,0x22,0x62,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x45,0x36,0x38,0x31,0x35,0x22,0x2c,0xa,0x22,0x6e,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x43,0x36,0x34,0x33,0x45,0x22,0x2c,0xa,0x22,0x6d,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x44,0x34,0x42,0x34,0x32,0x22,0x2c,0xa,0x22,0x4d,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x39,0x34,0x39,0x34,0x39,0x22,0x2c,0xa,0x22,0x4e,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x34,0x44,0x34,0x33,0x22,0x2c,0xa,0x22,0x42,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x35,0x33,0x34,0x43,0x22,0x2c,0xa,0x22,0x56,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x31,0x35,0x31,0x35,0x31,0x22,0x2c,0xa,0x22,0x43,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x44,0x35,0x42,0x35,0x34,0x22,0x2c,0xa,0x22,0x5a,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x36,0x30,0x34,0x38,0x22,0x2c,0xa,0x22,0x41,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x36,0x41,0x34,0x34,0x22,0x2c,0xa,0x22,0x53,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x32,0x36,0x43,0x35,0x34,0x22,0x2c,0xa,0x22,0x44,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x37,0x37,0x32,0x35,0x42,0x22,0x2c,0xa,0x22,0x46,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x39,0x36,0x39,0x36,0x38,0x22,0x2c,0xa,0x22,0x47,0x20,
+ 0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x35,0x30,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x36,0x32,0x30,0x33,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x30,0x36,0x36,0x30,0x39,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x33,0x36,0x39,0x30,0x37,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x44,0x36,0x41,0x30,0x33,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x41,0x36,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x42,0x37,0x30,0x30,0x35,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x45,0x37,0x33,0x30,0x45,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x37,0x35,0x31,0x31,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x35,0x37,0x33,0x32,0x43,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x37,0x38,0x33,0x42,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x37,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x38,0x37,0x42,0x31,0x33,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x34,0x37,0x42,0x35,0x33,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x37,0x44,0x36,0x34,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x38,0x36,0x32,0x45,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x39,0x38,0x41,0x31,0x46,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x38,0x44,0x30,0x41,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x38,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x38,0x32,0x31,0x41,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x31,0x38,0x45,0x31,0x42,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x39,0x34,0x31,0x43,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x38,0x38,0x45,0x32,0x43,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x38,0x43,0x33,0x36,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x39,0x32,0x32,0x34,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x39,0x38,0x31,0x35,0x45,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x37,0x38,0x32,0x36,0x44,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x35,0x38,0x31,0x37,0x34,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x38,0x33,0x37,0x30,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x45,0x38,0x41,0x37,0x44,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x38,0x43,0x37,0x31,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x38,0x45,0x34,0x34,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x39,0x46,0x37,0x34,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x39,0x41,0x34,0x35,0x36,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x41,0x38,0x35,0x42,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x41,0x30,0x36,0x38,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x38,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x38,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x39,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x39,0x36,0x32,0x46,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x41,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x41,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x41,0x43,0x31,0x42,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x42,0x33,0x31,0x41,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x41,0x39,0x32,0x32,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x41,0x45,0x32,0x42,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x41,0x31,0x32,0x45,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x41,0x34,0x33,0x33,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x42,0x34,0x32,0x38,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x42,0x32,0x33,0x42,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x36,0x41,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x41,0x35,0x30,0x39,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x41,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x41,0x43,0x31,0x45,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x41,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x41,0x44,0x30,0x32,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x43,0x41,0x46,0x30,0x44,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x43,0x42,0x30,0x30,0x35,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x42,0x36,0x30,0x43,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x42,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x42,0x44,0x31,0x36,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x33,0x42,0x34,0x33,0x32,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x42,0x46,0x33,0x43,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x36,0x42,0x45,0x32,0x46,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x41,0x39,0x34,0x39,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x39,0x41,0x39,0x34,0x38,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x41,0x42,0x35,0x32,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x42,0x41,0x34,0x35,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x42,0x31,0x36,0x32,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x42,0x37,0x34,0x44,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x42,0x38,0x34,0x31,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x42,0x45,0x34,0x41,0x22,0x2c,0xa,0x22,0x6a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x42,0x41,0x35,0x35,0x22,0x2c,0xa,0x22,0x6b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x43,0x30,0x30,0x36,0x22,0x2c,0xa,0x22,0x6c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x43,0x31,0x30,0x42,0x22,0x2c,0xa,0x22,0x7a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x43,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x78,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x43,0x39,0x30,0x44,0x22,0x2c,0xa,0x22,0x63,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x41,0x43,0x31,0x31,0x33,0x22,0x2c,0xa,0x22,0x76,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x42,0x43,0x31,0x31,0x43,0x22,0x2c,0xa,0x22,0x62,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x43,0x39,0x31,0x30,0x22,0x2c,0xa,0x22,0x6e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x44,0x43,0x32,0x33,0x33,0x22,0x2c,0xa,0x22,0x6d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x43,0x33,0x32,0x44,0x22,0x2c,0xa,0x22,0x4d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x43,0x37,0x32,0x38,0x22,0x2c,0xa,0x22,0x4e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x43,0x35,0x33,0x37,0x22,0x2c,0xa,0x22,0x42,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x36,0x43,0x36,0x33,0x41,0x22,0x2c,0xa,0x22,0x56,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x43,0x42,0x33,0x36,0x22,0x2c,0xa,0x22,0x43,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x37,0x33,0x44,0x22,0x2c,0xa,0x22,0x5a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x43,0x36,0x35,0x39,0x22,0x2c,0xa,0x22,0x41,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x43,0x38,0x35,0x41,0x22,0x2c,0xa,0x22,0x53,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x41,0x34,0x42,0x22,0x2c,0xa,0x22,0x44,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x44,0x35,0x44,0x22,0x2c,0xa,0x22,0x46,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x43,0x44,0x36,0x42,0x22,0x2c,0xa,0x22,0x47,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x35,0x36,0x30,0x22,0x2c,0xa,0x22,0x48,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x30,0x36,0x43,0x22,0x2c,0xa,0x22,0x4a,0x2e,0x20,
+ 0x63,0x20,0x67,0x72,0x61,0x79,0x35,0x36,0x22,0x2c,0xa,0x22,0x4b,0x2e,0x20,0x63,
+ 0x20,0x23,0x39,0x35,0x39,0x35,0x39,0x35,0x22,0x2c,0xa,0x22,0x4c,0x2e,0x20,0x63,
+ 0x20,0x67,0x72,0x61,0x79,0x36,0x32,0x22,0x2c,0xa,0x22,0x50,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x36,0x41,0x31,0x38,0x41,0x22,0x2c,0xa,0x22,0x49,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x38,0x41,0x36,0x39,0x45,0x22,0x2c,0xa,0x22,0x55,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x45,0x41,0x38,0x39,0x35,0x22,0x2c,0xa,0x22,0x59,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x33,0x41,0x43,0x38,0x46,0x22,0x2c,0xa,0x22,0x54,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x38,0x41,0x46,0x38,0x42,0x22,0x2c,0xa,0x22,0x52,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x34,0x41,0x44,0x39,0x36,0x22,0x2c,0xa,0x22,0x45,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x38,0x42,0x31,0x39,0x39,0x22,0x2c,0xa,0x22,0x57,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x34,0x41,0x34,0x41,0x34,0x22,0x2c,0xa,0x22,0x51,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x2c,0xa,0x22,0x21,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x30,0x41,0x44,0x41,0x33,0x22,0x2c,0xa,0x22,0x7e,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x42,0x42,0x36,0x41,0x33,0x22,0x2c,0xa,0x22,0x5e,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x31,0x42,0x31,0x42,0x31,0x22,0x2c,0xa,0x22,0x2f,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x39,0x42,0x39,0x42,0x36,0x22,0x2c,0xa,0x22,0x28,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x42,0x42,0x42,0x42,0x41,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x35,0x42,0x43,0x39,0x44,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x32,0x42,0x43,0x41,0x32,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x31,0x42,0x45,0x42,0x35,0x22,0x2c,0xa,0x22,0x27,0x2e,0x20,0x63,0x20,
+ 0x23,0x44,0x32,0x43,0x33,0x38,0x45,0x22,0x2c,0xa,0x22,0x5d,0x2e,0x20,0x63,0x20,
+ 0x23,0x44,0x43,0x43,0x37,0x38,0x43,0x22,0x2c,0xa,0x22,0x5b,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x37,0x43,0x30,0x41,0x37,0x22,0x2c,0xa,0x22,0x7b,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x37,0x43,0x32,0x41,0x45,0x22,0x2c,0xa,0x22,0x7d,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x37,0x43,0x33,0x42,0x32,0x22,0x2c,0xa,0x22,0x7c,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x35,0x43,0x32,0x42,0x38,0x22,0x2c,0xa,0x22,0x20,0x58,0x20,0x63,0x20,
+ 0x23,0x43,0x41,0x43,0x36,0x42,0x36,0x22,0x2c,0xa,0x22,0x2e,0x58,0x20,0x63,0x20,
+ 0x23,0x43,0x42,0x43,0x39,0x42,0x45,0x22,0x2c,0xa,0x22,0x58,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x39,0x44,0x33,0x42,0x42,0x22,0x2c,0xa,0x22,0x6f,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x36,0x44,0x30,0x38,0x41,0x22,0x2c,0xa,0x22,0x4f,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x37,0x44,0x45,0x42,0x44,0x22,0x2c,0xa,0x22,0x2b,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x43,0x44,0x45,0x42,0x33,0x22,0x2c,0xa,0x22,0x40,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x46,0x46,0x30,0x42,0x39,0x22,0x2c,0xa,0x22,0x23,0x58,0x20,0x63,0x20,
+ 0x23,0x43,0x35,0x43,0x35,0x43,0x35,0x22,0x2c,0xa,0x22,0x24,0x58,0x20,0x63,0x20,
+ 0x23,0x43,0x45,0x43,0x43,0x43,0x37,0x22,0x2c,0xa,0x22,0x25,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x30,0x43,0x45,0x43,0x35,0x22,0x2c,0xa,0x22,0x26,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x30,0x43,0x46,0x43,0x38,0x22,0x2c,0xa,0x22,0x2a,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x32,0x44,0x31,0x43,0x42,0x22,0x2c,0xa,0x22,0x3d,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x42,0x44,0x36,0x43,0x35,0x22,0x2c,0xa,0x22,0x2d,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x42,0x44,0x37,0x43,0x39,0x22,0x2c,0xa,0x22,0x3b,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x33,0x44,0x33,0x44,0x31,0x22,0x2c,0xa,0x22,0x3a,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x42,0x44,0x42,0x44,0x42,0x22,0x2c,0xa,0x22,0x3e,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x35,0x45,0x31,0x44,0x36,0x22,0x2c,0xa,0x22,0x2c,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x35,0x45,0x33,0x44,0x41,0x22,0x2c,0xa,0x22,0x3c,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x38,0x45,0x35,0x44,0x39,0x22,0x2c,0xa,0x22,0x31,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x44,0x45,0x41,0x44,0x43,0x22,0x2c,0xa,0x22,0x32,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x45,0x46,0x36,0x44,0x45,0x22,0x2c,0xa,0x22,0x33,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x36,0x45,0x36,0x45,0x36,0x22,0x2c,0xa,0x22,0x34,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x39,0x45,0x37,0x45,0x32,0x22,0x2c,0xa,0x22,0x35,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x39,0x45,0x38,0x45,0x34,0x22,0x2c,0xa,0x22,0x36,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x44,0x45,0x43,0x45,0x41,0x22,0x2c,0xa,0x22,0x37,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x32,0x46,0x31,0x45,0x42,0x22,0x2c,0xa,0x22,0x38,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x22,0x2c,0xa,0x22,0x39,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x38,0x46,0x37,0x46,0x34,0x22,0x2c,0xa,0x22,0x30,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x39,0x46,0x38,0x46,0x38,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,0x63,0x20,
+ 0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,0x6c,0x73,
+ 0x20,0x2a,0x2f,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x35,
+ 0x20,0x31,0x20,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x56,
+ 0x20,0x2f,0x2e,0x26,0x58,0x51,0x2e,0x46,0x20,0x31,0x20,0x2c,0x20,0x20,0x20,0x20,
+ 0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x35,0x20,0x5f,0x2e,0x44,0x2e,0x53,0x2e,0x48,0x2e,0x40,0x58,0x26,0x58,0x36,
+ 0x20,0x2e,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x53,0x2e,0x3d,0x2e,0x77,0x20,0x67,0x20,0x26,
+ 0x2e,0x43,0x2e,0x2e,0x2e,0x2b,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x2d,0x2e,0x27,0x20,0x2b,
+ 0x20,0x6f,0x20,0x74,0x20,0x7a,0x2e,0x64,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x43,0x20,0x56,
+ 0x2e,0x40,0x2e,0x2b,0x20,0x20,0x20,0x33,0x20,0x3a,0x2e,0x33,0x2e,0x2c,0x20,0x20,
+ 0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,
+ 0x20,0x27,0x2e,0x62,0x2e,0x46,0x2e,0x36,0x20,0x2c,0x20,0x31,0x20,0x73,0x2e,0x2c,
+ 0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x31,0x20,0x62,0x20,0x28,0x20,0x6e,0x2e,0x4f,0x58,0x45,0x2e,0x45,
+ 0x2e,0x46,0x2e,0x5e,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x31,
+ 0x20,0x2c,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x6c,0x20,0x78,0x20,0x4b,0x20,0x41,
+ 0x2e,0x6f,0x58,0x6f,0x58,0x5a,0x2e,0x69,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x56,0x20,0x26,
+ 0x58,0x30,0x58,0x36,0x58,0x2c,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x38,0x20,0x28,0x20,0x63,0x2e,0x76,0x2e,0x6b,0x2e,0x4e,0x2e,0x31,0x20,0x20,
+ 0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x56,0x20,0x24,
+ 0x58,0x30,0x58,0x30,0x58,0x39,0x58,0x58,0x58,0x2c,0x20,0x20,0x20,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x20,0x20,0x20,0x20,0x4f,0x20,0x74,0x20,0x36,0x2e,0x65,0x2e,0x65,0x2e,0x6b,
+ 0x2e,0x53,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x35,0x20,0x35,0x20,0x56,0x20,0x24,
+ 0x58,0x38,0x58,0x38,0x58,0x38,0x58,0x31,0x58,0x44,0x20,0x3a,0x20,0x4f,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x33,0x20,0x4a,0x20,0x65,
+ 0x2e,0x47,0x2e,0x37,0x58,0x23,0x2e,0x2b,0x20,0x2e,0x20,0x35,0x20,0x43,0x20,0x7c,
+ 0x2e,0x33,0x58,0x33,0x58,0x35,0x58,0x34,0x58,0x5f,0x2e,0x34,0x20,0x25,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,
+ 0x20,0x71,0x20,0x5d,0x2e,0x30,0x58,0x30,0x58,0x2b,0x58,0x2c,0x20,0x42,0x20,0x7d,
+ 0x2e,0x3a,0x58,0x3a,0x58,0x3a,0x58,0x3a,0x58,0x3d,0x58,0x53,0x20,0x26,0x20,0x6f,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x20,0x20,0x2b,0x20,0x4d,0x20,0x38,0x58,0x38,0x58,0x37,0x58,0x55,
+ 0x2e,0x51,0x2e,0x23,0x58,0x2a,0x58,0x2a,0x58,0x2a,0x58,0x52,0x2e,0x3c,0x20,0x25,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x2c,0x20,0x31,0x20,0x20,0x58,0x36,
+ 0x58,0x57,0x2e,0x47,0x20,0x51,0x2e,0x4c,0x2e,0x5e,0x2e,0x7b,0x2e,0x5a,0x20,0x40,
+ 0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,
+ 0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x6d,0x20,0x50,
+ 0x2e,0x57,0x2e,0x3a,0x58,0x36,0x20,0x2e,0x20,0x33,0x58,0x2f,0x2e,0x58,0x2e,0x2c,
+ 0x20,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x35,0x20,0x6e,0x20,0x2b,
+ 0x2e,0x52,0x2e,0x57,0x2e,0x4a,0x2e,0x4b,0x2e,0x57,0x2e,0x5e,0x2e,0x3a,0x58,0x3a,
+ 0x58,0x31,0x58,0x6d,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x69,0x20,0x6f,0x2e,0x79,
+ 0x2e,0x76,0x2e,0x71,0x2e,0x2f,0x20,0x50,0x2e,0x49,0x2e,0x7d,0x20,0x7c,0x20,0x52,
+ 0x2e,0x26,0x58,0x2a,0x58,0x3b,0x58,0x38,0x58,0x20,0x2e,0x2c,0x20,0x20,0x20,0x20,
+ 0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x35,0x20,0x52,0x20,0x33,0x2e,0x4d,
+ 0x2e,0x35,0x2e,0x45,0x20,0x4c,0x20,0x37,0x2e,0x34,0x2e,0x5f,0x20,0x30,0x20,0x2b,
+ 0x20,0x4f,0x20,0x2b,0x20,0x69,0x20,0x29,0x2e,0x23,0x58,0x23,0x58,0x35,0x58,0x7e,
+ 0x2e,0x2c,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x35,0x20,0x75,0x20,0x5d,0x20,0x6d,0x2e,0x72,
+ 0x2e,0x25,0x2e,0x48,0x20,0x72,0x20,0x3a,0x20,0x2c,0x20,0x74,0x2e,0x30,0x2e,0x50,
+ 0x20,0x37,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x20,0x2c,0x20,0x7b,0x20,0x60,
+ 0x2e,0x28,0x2e,0x3b,0x58,0x2d,0x58,0x2c,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x35,0x20,0x75,0x20,0x32,0x2e,0x77,
+ 0x2e,0x24,0x2e,0x6b,0x20,0x74,0x20,0x6f,0x20,0x20,0x20,0x2c,0x20,0x7e,0x20,0x68,
+ 0x2e,0x50,0x20,0x6c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x2c,0x20,0x75,0x20,0x54,0x2e,0x5e,0x2e,0x23,0x58,0x3c,0x58,0x4e,0x20,0x2c,
+ 0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x35,0x20,0x3e,
+ 0x2e,0x39,0x2e,0x55,0x20,0x72,0x20,0x2e,0x20,0x20,0x20,0x2e,0x20,0x2c,0x20,0x54,
+ 0x20,0x42,0x2e,0x2a,0x2e,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x2b,0x20,0x2c,0x20,0x51,0x20,0x21,0x2e,0x51,
+ 0x2e,0x3c,0x58,0x43,0x20,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x70,0x20,0x71,0x2e,0x31,0x2e,0x3e,0x20,0x2e,0x20,0x20,0x20,0x2b,0x20,0x31,
+ 0x20,0x5b,0x20,0x6d,0x2e,0x70,0x2e,0x6b,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x2c,
+ 0x20,0x75,0x20,0x4f,0x2e,0x57,0x2e,0x3b,0x58,0x21,0x20,0x2b,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x34,0x20,0x38,0x2e,0x6a,0x2e,0x60,0x20,0x70,0x20,0x35,
+ 0x20,0x79,0x20,0x3b,0x2e,0x75,0x2e,0x61,0x2e,0x64,0x20,0x25,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x4f,0x20,0x2c,0x20,0x41,0x20,0x50,0x2e,0x5f,0x2e,0x2c,
+ 0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x31,0x20,0x78,0x20,0x3c,0x2e,0x66,
+ 0x2e,0x6d,0x2e,0x78,0x2e,0x62,0x2e,0x79,0x2e,0x61,0x2e,0x67,0x20,0x3b,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x2b,0x20,0x30,
+ 0x20,0x76,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x2d,
+ 0x20,0x68,0x20,0x63,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x7a,0x20,0x3a,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x2e,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,
+ 0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x2a,0x20,0x65,0x20,0x6c,0x20,0x6c,0x20,0x66,
+ 0x20,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x22,0xa,0x7d,0x3b,0xa,
+ ]
+
+@@qt_resource_name = [
+ # fileopen.xpm
+ 0x0,0xc,
+ 0xb,0x21,0x7,0xad,
+ 0x0,0x66,
+ 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x6f,0x0,0x70,0x0,0x65,0x0,0x6e,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # filesave.xpm
+ 0x0,0xc,
+ 0x5,0x68,0x6,0x4d,
+ 0x0,0x66,
+ 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x73,0x0,0x61,0x0,0x76,0x0,0x65,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # editcopy.xpm
+ 0x0,0xc,
+ 0xb,0xe,0x4a,0x2d,
+ 0x0,0x65,
+ 0x0,0x64,0x0,0x69,0x0,0x74,0x0,0x63,0x0,0x6f,0x0,0x70,0x0,0x79,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # filenew.xpm
+ 0x0,0xb,
+ 0x4,0x14,0x5a,0xed,
+ 0x0,0x66,
+ 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x6e,0x0,0x65,0x0,0x77,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # editpaste.xpm
+ 0x0,0xd,
+ 0xd,0xc9,0x33,0xcd,
+ 0x0,0x65,
+ 0x0,0x64,0x0,0x69,0x0,0x74,0x0,0x70,0x0,0x61,0x0,0x73,0x0,0x74,0x0,0x65,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # editcut.xpm
+ 0x0,0xb,
+ 0xa,0x10,0x3e,0x2d,
+ 0x0,0x65,
+ 0x0,0x64,0x0,0x69,0x0,0x74,0x0,0x63,0x0,0x75,0x0,0x74,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ ]
+
+@@qt_resource_struct = [
+ # :
+ 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x1,
+ # :/filenew.xpm
+ 0x0,0x0,0x0,0x5a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x44,0x97,
+ # :/filesave.xpm
+ 0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x18,0xfd,
+ # :/editcut.xpm
+ 0x0,0x0,0x0,0x96,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x71,0xa0,
+ # :/editcopy.xpm
+ 0x0,0x0,0x0,0x3c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x31,0xfa,
+ # :/fileopen.xpm
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,
+ # :/editpaste.xpm
+ 0x0,0x0,0x0,0x76,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x58,0xa4,
+]
+
+ def self.qInitResources_application()
+ Qt.qRegisterResourceData(0x01, QCleanupResources__dest_class__.qt_resource_struct.pack("C*"), QCleanupResources__dest_class__.qt_resource_name.pack("C*"), QCleanupResources__dest_class__.qt_resource_data.pack("C*"))
+ return 1
+ end
+ def self.qCleanupResources_application()
+ Qt.qUnregisterResourceData(0x01, QCleanupResources__dest_class__.qt_resource_struct.pack("C*"), QCleanupResources__dest_class__.qt_resource_name.pack("C*"), QCleanupResources__dest_class__.qt_resource_data.pack("C*"))
+ return 1
+ end
+
+end
+
+QCleanupResources__dest_class__.qInitResources_application()
diff --git a/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevelop b/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevelop
new file mode 100644
index 00000000..4afe7bca
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevelop
@@ -0,0 +1,83 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevcustomproject>
+ <general>
+ <activedir/>
+ </general>
+ </kdevcustomproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <workspace>
+ <openfiles/>
+ </workspace>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="rb" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <mainprogram>./main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevtemplate b/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevtemplate
new file mode 100644
index 00000000..bd778450
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevtemplate
@@ -0,0 +1,166 @@
+# KDE Config File
+[General]
+Name=QtRuby4 Application
+Name[ca]=Aplicació en QtRuby4
+Name[da]=QtRuby4-program
+Name[de]=QtRuby4-Anwendung
+Name[el]=ΕφαÏμογή QtRuby4
+Name[es]=Aplicación en QtRuby4
+Name[et]=QtRuby4 rakendus
+Name[hu]=QtRuby4-alapú alkalmazás
+Name[it]=Applicazione QtRuby4
+Name[nds]=QtRuby4-Programm
+Name[nl]=QtRuby4-programma
+Name[pl]=Program w QtRuby
+Name[pt]=Aplicação em QtRuby4
+Name[pt_BR]=Aplicativo QtRuby4
+Name[ru]=Приложение QtRuby4
+Name[sk]=QtRuby4 Aplikácia
+Name[sr]=QtRuby4 програм
+Name[sr@Latn]=QtRuby4 program
+Name[sv]=QtRuby 4-program
+Name[zh_TW]=QtRuby4 應用程å¼
+Icon=qtruby4app.png
+Category=Ruby/Qt
+Category[fr]=Ruby/Qt
+Comment=Generate a QtRuby4 based application (crossplatform compatible) - Needs QtRuby4
+Comment[ca]=Genera una aplicació basada en QtRuby4 (compatible plataforma creuada) - Necessita QtRuby4
+Comment[da]=Genererer et QtRuby4-baseret program (krydsplatformskompatibelt) - kræver QtRuby4
+Comment[de]=Erstellt eine auf QtRuby4 basierende Anwendung (plattformunabhängig). - Benötigt QtRuby4.
+Comment[el]=ΔημιουÏγία μιας εφαÏμογής βασισμένης στην QtRuby4 (πολλαπλών πλατφόÏμων) - Απαιτείται η QtRuby4
+Comment[es]=Genera una aplicación basada en QtRuby4 (con compatibilidad multiplataforma) - Necesita QtRuby4
+Comment[et]=Rakenduse loomine QtRuby4 põhjal (multiplatvormne) - vajalik on QtRuby4
+Comment[hu]=Létrehoz egy QtRuby4-alapú, keresztfordításra is alkalmas alkalmazást - QtRuby4-et igényel
+Comment[it]=Genera un'applicazione basata su QtRuby4 (compatibile multipiattaforma) - serve QtRuby4
+Comment[nds]=Stellt en op QRubyt4 opbuut Programm op (över Bedriefümgeven weg kompatibel) - QtRuby4 deit noot
+Comment[nl]=Genereer een QtRuby4-gebaseerd programma (crossplatform-compatible) - heeft QtRuby4 nodig
+Comment[pl]=Generuje program używający QtRuby4 (wieloplatformowy) - wymaga QtRuby4
+Comment[pt]=Gera uma aplicação baseada no QtRuby4 (compatível com várias plataformas) - Necessita do QtRuby4
+Comment[pt_BR]=Gera uma aplicação baseada no QtRuby4 (compatível com várias plataformas) - Necessita do QtRuby4
+Comment[ru]=Создание кроÑÑплатформенного Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Qt 4 на Ruby. Требует QtRuby4.
+Comment[sk]=Vygeneruje aplikáciu založenú na QtRuby4 (multiplatformovo kompatibilnú) - vyžaduje QtRuby4
+Comment[sr]=Прави програм на оÑнови QtRuby4 (прекоплатформÑки компатибилан) — захтева QtRuby4
+Comment[sr@Latn]=Pravi program na osnovi QtRuby4 (prekoplatformski kompatibilan) — zahteva QtRuby4
+Comment[sv]=Skapar ett QtRuby 4-baserat program (fungerar på andra plattformar). Kräver QtRuby 4.
+Comment[zh_TW]=產生一個 QtRuby4 為基礎的應用程å¼ï¼ˆè·¨å¹³å°ç›¸å®¹ï¼‰â”€éœ€è¦ QtRuby4
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.rb,%{dest}/ReadMe
+Archive=qtruby4app.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/qtruby4app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/main.rb
+
+[FILE3]
+Type=install
+Source=%{src}/qtruby4app.rb
+Dest=%{dest}/%{APPNAMELC}.rb
+
+[FILE4]
+Type=install
+Source=%{src}/app-Makefile
+Dest=%{dest}/Makefile
+
+[FILE5]
+Type=install
+Source=%{src}/fileopen.xpm
+Dest=%{dest}/fileopen.xpm
+
+[FILE6]
+Type=install
+Source=%{src}/filesave.xpm
+Dest=%{dest}/filesave.xpm
+
+[FILE7]
+Type=install
+Source=%{src}/filenew.xpm
+Dest=%{dest}/filenew.xpm
+
+[FILE8]
+Type=install
+Source=%{src}/editcopy.xpm
+Dest=%{dest}/editcopy.xpm
+
+[FILE9]
+Type=install
+Source=%{src}/editpaste.xpm
+Dest=%{dest}/editpaste.xpm
+
+[FILE10]
+Type=install
+Source=%{src}/editcut.xpm
+Dest=%{dest}/editcut.xpm
+
+[FILE11]
+Type=install
+Source=%{src}/application.qrc
+Dest=%{dest}/application.qrc
+
+[FILE12]
+Type=install
+Source=%{src}/ReadMe
+Dest=%{dest}/ReadMe
+
+[FILE13]
+Type=install
+Source=%{src}/app.filelist
+Dest=%{dest}/%{APPNAMELC}.kdevelop.filelist
+
+[MSG]
+Type=message
+Comment=A QtRuby4 based application was created in %{dest}
+Comment[ca]=Una aplicació basada en QtRuby4 ha estat creada en %{dest}
+Comment[da]=Et QtRuby4-baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf QtRuby4 basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μία εφαÏμογή βασισμένη στην QtRuby4 δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación basada en QtRuby4 ha sido creada en %{dest}
+Comment[et]=Rakendus QtRuby4 põhjal loodi asukohta %{dest}
+Comment[hu]=Létrejött egy QtRuby4-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su QtRuby4 in %{dest}
+Comment[nds]=In %{dest} wöör en op QtRuby4 opbuut Programm opstellt.
+Comment[nl]=Een QtRuby4-gebaseerd programma is aangemaakt in %{dest}
+Comment[pl]=Program używający QtRuby4 został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada em QtRuby4 em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada em QtRuby4 em %{dest}
+Comment[ru]=Приложение QtRuby4 Ñоздано в %{dest}
+Comment[sk]=QtRuby4 aplikácia bola vytvorená v %{dest}
+Comment[sr]=QtRuby4 програм је направљен у %{dest}
+Comment[sr@Latn]=QtRuby4 program je napravljen u %{dest}
+Comment[sv]=Ett program baserat på QtRuby 4 skapades i %{dest}
+Comment[zh_TW]=一個 QtRuby4 為基礎的應用程å¼æ¡†æž¶å·²å»ºç«‹æ–¼ %{dest}
+
+Comment=
+
+[DESIGNER]
+Type=value
+ValueType=QString
+Value=DESIGNER
+Comment=Absolute Path for Designer (Qt4).
+Comment[ca]=Ruta absoluta per a Designer (Qt4).
+Comment[da]=Absolut søgesti til Designer (Qt4).
+Comment[de]=Absoluter Pfad für Designer (Qt4).
+Comment[el]=Απόλυτη διαδÏομή για τον Σχεδιαστή (Qt4).
+Comment[es]=Ruta completa para Designer (Qt4).
+Comment[et]=Disaineri (Qt4) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour Designer (Qt4).
+Comment[hu]=A Designer (Qt4) teljes elérési útja
+Comment[it]=Percorso assoluto del Designer (Qt4).
+Comment[ja]=Designer (Qt4) ã®çµ¶å¯¾ãƒ‘ス
+Comment[nds]=Afsluut Padd för Designer (Qt4)
+Comment[nl]=Absoluut pad naar Designer (Qt4).
+Comment[pl]=Ścieżka bezwzględna do Designera (Qt4).
+Comment[pt]=Localização Absoluta do Designer (Qt4).
+Comment[pt_BR]=Localização Absoluta do Designer (Qt4).
+Comment[ru]=Полный путь к Designer (Qt 4).
+Comment[sk]=Absolútna cesta ku Designer (Qt4).
+Comment[sr]=ÐпÑолутна путања до Designer-а (Qt4).
+Comment[sr@Latn]=Apsolutna putanja do Designer-a (Qt4).
+Comment[sv]=Absolut sökväg till Designer (Qt4).
+Comment[zh_TW]=設計家(Qt4)的絕å°è·¯å¾‘
+Default=
diff --git a/languages/ruby/app_templates/qtruby4app/qtruby4app.png b/languages/ruby/app_templates/qtruby4app/qtruby4app.png
new file mode 100644
index 00000000..96a7e0bf
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qtruby4app.png
Binary files differ
diff --git a/languages/ruby/app_templates/qtruby4app/qtruby4app.rb b/languages/ruby/app_templates/qtruby4app/qtruby4app.rb
new file mode 100644
index 00000000..58dfa10a
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qtruby4app.rb
@@ -0,0 +1,263 @@
+
+class %{APPNAME} < Qt::MainWindow
+
+ slots :newFile,
+ :open,
+ :save,
+ :saveAs,
+ :about,
+ :documentWasModified
+
+ def initialize
+ super
+ @textEdit = Qt::TextEdit.new
+ setCentralWidget(@textEdit)
+
+ createActions()
+ createMenus()
+ createToolBars()
+ createStatusBar()
+
+ readSettings()
+
+ connect(@textEdit.document, SIGNAL(:contentsChanged),
+ self, SLOT(:documentWasModified))
+
+ setCurrentFile("")
+ end
+
+ def closeEvent(event)
+ if maybeSave
+ writeSettings
+ event.accept
+ else
+ event.ignore
+ end
+ end
+
+ def newFile()
+ if maybeSave
+ @textEdit.clear
+ setCurrentFile("")
+ end
+ end
+
+ def open()
+ if maybeSave
+ fileName = Qt::FileDialog.getOpenFileName(self)
+ if !fileName.nil?
+ loadFile(fileName)
+ end
+ end
+ end
+
+ def save()
+ if @curFile.nil?
+ return saveAs()
+ else
+ return saveFile(@curFile);
+ end
+ end
+
+ def saveAs()
+ fileName = Qt::FileDialog.getSaveFileName(self)
+ if fileName.nil?
+ return false
+ end
+
+ return saveFile(fileName)
+ end
+
+ def about()
+ Qt::MessageBox.about(self, tr("About Application"),
+ tr("The <b>Application</b> example demonstrates how to " \
+ "write modern GUI applications using Qt, with a menu bar, " \
+ "toolbars, and a status bar."))
+ end
+
+ def documentWasModified()
+ setWindowModified(true)
+ end
+
+ def createActions()
+ @newAct = Qt::Action.new(Qt::Icon.new(":/filenew.xpm"), tr("&New"), self)
+ @newAct.shortcut = tr("Ctrl+N")
+ @newAct.statusTip = tr("Create a new file")
+ connect(@newAct, SIGNAL(:triggered), self, SLOT(:newFile))
+
+ @openAct = Qt::Action.new(Qt::Icon.new(":/fileopen.xpm"), tr("&Open..."), self)
+ @openAct.shortcut = tr("Ctrl+O")
+ @openAct.statusTip = tr("Open an existing file")
+ connect(@openAct, SIGNAL(:triggered), self, SLOT(:open))
+
+ @saveAct = Qt::Action.new(Qt::Icon.new(":/filesave.xpm"), tr("&Save"), self)
+ @saveAct.shortcut = tr("Ctrl+S")
+ @saveAct.statusTip = tr("Save the document to disk")
+ connect(@saveAct, SIGNAL(:triggered), self, SLOT(:save))
+
+ @saveAsAct = Qt::Action.new(tr("Save &As..."), self)
+ @saveAsAct.statusTip = tr("Save the document under a new name")
+ connect(@saveAsAct, SIGNAL(:triggered), self, SLOT(:saveAs))
+
+ @exitAct = Qt::Action.new(tr("E&xit"), self)
+ @exitAct.shortcut = tr("Ctrl+Q")
+ @exitAct.statusTip = tr("Exit the application")
+ connect(@exitAct, SIGNAL(:triggered), self, SLOT(:close))
+
+ @cutAct = Qt::Action.new(Qt::Icon.new(":/editcut.xpm"), tr("Cu&t"), self)
+ @cutAct.shortcut = tr("Ctrl+X")
+ @cutAct.statusTip = tr("Cut the current selection's contents to the " \
+ "clipboard")
+ connect(@cutAct, SIGNAL(:triggered), @textEdit, SLOT(:cut))
+
+ @copyAct = Qt::Action.new(Qt::Icon.new(":/editcopy.xpm"), tr("&Copy"), self)
+ @copyAct.shortcut = tr("Ctrl+C")
+ @copyAct.statusTip = tr("Copy the current selection's contents to the " \
+ "clipboard")
+ connect(@copyAct, SIGNAL(:triggered), @textEdit, SLOT(:copy))
+
+ @pasteAct = Qt::Action.new(Qt::Icon.new(":/editpaste.xpm"), tr("&Paste"), self)
+ @pasteAct.shortcut = tr("Ctrl+V")
+ @pasteAct.statusTip = tr("Paste the clipboard's contents into the current " \
+ "selection")
+ connect(@pasteAct, SIGNAL(:triggered), @textEdit, SLOT(:paste))
+
+ @aboutAct = Qt::Action.new(tr("&About"), self)
+ @aboutAct.statusTip = tr("Show the application's About box")
+ connect(@aboutAct, SIGNAL(:triggered), self, SLOT(:about))
+
+ @aboutQtAct = Qt::Action.new(tr("About &Qt"), self)
+ @aboutQtAct.statusTip = tr("Show the Qt library's About box")
+ connect(@aboutQtAct, SIGNAL(:triggered), $qApp, SLOT(:aboutQt))
+
+ @cutAct.setEnabled(false)
+ @copyAct.setEnabled(false)
+ connect(@textEdit, SIGNAL('copyAvailable(bool)'),
+ @cutAct, SLOT('setEnabled(bool)'))
+ connect(@textEdit, SIGNAL('copyAvailable(bool)'),
+ @copyAct, SLOT('setEnabled(bool)'))
+ end
+
+ def createMenus()
+ @fileMenu = menuBar().addMenu(tr("&File"))
+ @fileMenu.addAction(@newAct)
+ @fileMenu.addAction(@openAct)
+ @fileMenu.addAction(@saveAct)
+ @fileMenu.addAction(@saveAsAct)
+ @fileMenu.addSeparator()
+ @fileMenu.addAction(@exitAct)
+
+ @editMenu = menuBar.addMenu(tr("&Edit"))
+ @editMenu.addAction(@cutAct)
+ @editMenu.addAction(@copyAct)
+ @editMenu.addAction(@pasteAct)
+
+ menuBar.addSeparator()
+
+ @helpMenu = menuBar().addMenu(tr("&Help"))
+ @helpMenu.addAction(@aboutAct)
+ @helpMenu.addAction(@aboutQtAct)
+ end
+
+ def createToolBars()
+ @fileToolBar = addToolBar(tr("File"))
+ @fileToolBar.addAction(@newAct)
+ @fileToolBar.addAction(@openAct)
+ @fileToolBar.addAction(@saveAct)
+
+ @editToolBar = addToolBar(tr("Edit"))
+ @editToolBar.addAction(@cutAct)
+ @editToolBar.addAction(@copyAct)
+ @editToolBar.addAction(@pasteAct)
+ end
+
+ def createStatusBar()
+ statusBar.showMessage(tr("Ready"))
+ end
+
+ def readSettings()
+ settings = Qt::Settings.new("Trolltech", "Application Example")
+ pos = settings.value("pos", Qt::Variant.new(Qt::Point.new(200, 200))).toPoint()
+ size = settings.value("size", Qt::Variant.new(Qt::Size.new(400, 400))).toSize()
+ resize(size)
+ move(pos)
+ end
+
+ def writeSettings()
+ settings = Qt::Settings.new("Trolltech", "Application Example")
+ settings.setValue("pos", Qt::Variant.new(pos()))
+ settings.setValue("size", Qt::Variant.new(size()))
+ end
+
+ def maybeSave()
+ if @textEdit.document.modified?
+ ret = Qt::MessageBox.warning(self, tr("Application"),
+ tr("The document has been modified.\n" \
+ "Do you want to save your changes?"),
+ Qt::MessageBox::Yes | Qt::MessageBox::Default,
+ Qt::MessageBox::No,
+ Qt::MessageBox::Cancel | Qt::MessageBox::Escape)
+ if ret == Qt::MessageBox::Yes
+ return save()
+ elsif ret == Qt::MessageBox::Cancel
+ return false
+ end
+ end
+ return true
+ end
+
+ def loadFile(fileName)
+ file = Qt::File.new(fileName)
+ if !file.open(Qt::File::ReadOnly | Qt::File::Text)
+ Qt::MessageBox.warning( self, tr("Application"),
+ tr("Cannot read file %s\n%s." % [fileName, file.errorString]) )
+ return
+ end
+
+ inf = Qt::TextStream.new(file)
+ Qt::Application.overrideCursor = Qt::Cursor.new(Qt::WaitCursor)
+ @textEdit.setPlainText(inf.readAll)
+ Qt::Application.restoreOverrideCursor()
+
+ setCurrentFile(fileName)
+ statusBar.showMessage(tr("File loaded"), 2000)
+ end
+
+ def saveFile(fileName)
+ file = Qt::File.new(fileName)
+ if !file.open(Qt::File::WriteOnly | Qt::File::Text)
+ Qt::MessageBox.warning(self, tr("Application"),
+ tr("Cannot write file %s\n%s." % [fileName, file.errorString]) )
+ return false
+ end
+
+ outf = Qt::TextStream.new(file)
+ Qt::Application.overrideCursor = Qt::Cursor.new(Qt::WaitCursor)
+ outf << @textEdit.toPlainText()
+ Qt::Application.restoreOverrideCursor()
+ outf.flush
+
+ setCurrentFile(fileName)
+ statusBar().showMessage(tr("File saved"), 2000)
+ return true
+ end
+
+ def setCurrentFile(fileName)
+ @curFile = fileName;
+ @textEdit.document().modified = false
+ setWindowModified(false)
+
+ shownName = ""
+ if @curFile.nil?
+ shownName = "untitled.txt"
+ else
+ shownName = strippedName(@curFile)
+ end
+
+ setWindowTitle(tr("%s[*] - %s" % [shownName, tr("Application")]))
+ end
+
+ def strippedName(fullFileName)
+ return Qt::FileInfo.new(fullFileName).fileName()
+ end
+end \ No newline at end of file
diff --git a/languages/ruby/app_templates/qtrubyapp/Makefile.am b/languages/ruby/app_templates/qtrubyapp/Makefile.am
new file mode 100644
index 00000000..7fc1c803
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = main.rb qtrubyapp.rb qtrubyapp.png qtrubyapp.kdevelop \
+ filesave.xpm fileopen.xpm fileprint.xpm app.filelist app-Makefile README
+
+templateName = qtrubyapp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/qtrubyapp/README b/languages/ruby/app_templates/qtrubyapp/README
new file mode 100644
index 00000000..9468893b
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/README
@@ -0,0 +1,29 @@
+QtRuby App template quick start
+Author: Anne-Marie Mahfouf
+Date: 2006-12-05
+-----------------------------------------------
+
+This README file explains you some basic things for starting with
+this application template.
+-----------------------------------------------
+
+-- REQUIREMENTS --
+you need
+- Qt version might be 3.3.4 or 3.3.5.
+- kdelibs 3.5 and kdelibs headers 3.5 (devel package) in order to build this template.
+- qtruby either from your distribution or from the kdebindings module or also from
+http://rubyforge.org/projects/korundum/.
+If you use the kdebindings module you need to build kdebindings/smoke/qt and then kdebindings/qtruby.
+
+-----------------------------------------------
+
+-- RUN --
+You will see that the Build menu in KDevelop is now adapted to Ruby.
+In the Build menu, choose Run or use Shift + F9 to see your project running.
+
+-----------------------------------------------
+
+-- RELEVANT LINK --
+http://developer.kde.org/language-bindings/ruby/index.html
+
+In KDevelop Documentation, you can find a Ruby tutorial. \ No newline at end of file
diff --git a/languages/ruby/app_templates/qtrubyapp/app-Makefile b/languages/ruby/app_templates/qtrubyapp/app-Makefile
new file mode 100644
index 00000000..88b5556e
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/app-Makefile
@@ -0,0 +1,7 @@
+uis := $(wildcard *.ui)
+
+all: $(uis)
+ @for name in $^; do rbuic $$name > `echo $$name | awk -F '\\\.ui$$' '{ print $$1 }' 2> /dev/null`.rb; echo "Running rbuic on $$name"; done
+
+clean: $(uis)
+ @for name in $^; do rm -f `echo $$name | awk -F '\\\.ui$$' '{ print $$1 }' 2> /dev/null`.rb; done
diff --git a/languages/ruby/app_templates/qtrubyapp/app.filelist b/languages/ruby/app_templates/qtrubyapp/app.filelist
new file mode 100644
index 00000000..339e6998
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/app.filelist
@@ -0,0 +1,3 @@
+# KDevelop Custom Project File List
+main.rb
+%{APPNAMELC}.rb
diff --git a/languages/ruby/app_templates/qtrubyapp/fileopen.xpm b/languages/ruby/app_templates/qtrubyapp/fileopen.xpm
new file mode 100644
index 00000000..880417ee
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/languages/ruby/app_templates/qtrubyapp/fileprint.xpm b/languages/ruby/app_templates/qtrubyapp/fileprint.xpm
new file mode 100644
index 00000000..6ada912f
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/fileprint.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *fileprint[] = {
+" 16 14 6 1",
+". c #000000",
+"# c #848284",
+"a c #c6c3c6",
+"b c #ffff00",
+"c c #ffffff",
+"d c None",
+"ddddd.........dd",
+"dddd.cccccccc.dd",
+"dddd.c.....c.ddd",
+"ddd.cccccccc.ddd",
+"ddd.c.....c....d",
+"dd.cccccccc.a.a.",
+"d..........a.a..",
+".aaaaaaaaaa.a.a.",
+".............aa.",
+".aaaaaa###aa.a.d",
+".aaaaaabbbaa...d",
+".............a.d",
+"d.aaaaaaaaa.a.dd",
+"dd...........ddd"
+};
diff --git a/languages/ruby/app_templates/qtrubyapp/filesave.xpm b/languages/ruby/app_templates/qtrubyapp/filesave.xpm
new file mode 100644
index 00000000..bd6870f4
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/filesave.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *filesave[] = {
+" 14 14 4 1",
+". c #040404",
+"# c #808304",
+"a c #bfc2bf",
+"b c None",
+"..............",
+".#.aaaaaaaa.a.",
+".#.aaaaaaaa...",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".##........##.",
+".############.",
+".##.........#.",
+".##......aa.#.",
+".##......aa.#.",
+".##......aa.#.",
+"b............."
+};
diff --git a/languages/ruby/app_templates/qtrubyapp/main.rb b/languages/ruby/app_templates/qtrubyapp/main.rb
new file mode 100644
index 00000000..6f4bceae
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/main.rb
@@ -0,0 +1,10 @@
+require 'Qt'
+require '%{APPNAMELC}.rb'
+
+a = Qt::Application.new( ARGV )
+mw = %{APPNAMESC}.new
+mw.caption = "%{APPNAMESC}"
+mw.show
+a.connect( a, SIGNAL('lastWindowClosed()'), a, SLOT('quit()') )
+a.exec
+
diff --git a/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevelop b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevelop
new file mode 100644
index 00000000..4afe7bca
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevelop
@@ -0,0 +1,83 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevcustomproject>
+ <general>
+ <activedir/>
+ </general>
+ </kdevcustomproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <workspace>
+ <openfiles/>
+ </workspace>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="rb" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <mainprogram>./main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevtemplate b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevtemplate
new file mode 100644
index 00000000..5fd82925
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevtemplate
@@ -0,0 +1,140 @@
+# KDE Config File
+[General]
+Name=QtRuby Application
+Name[ca]=Aplicació en QtRuby
+Name[da]=QtRuby-program
+Name[de]=QtRuby-Anwendung
+Name[el]=ΕφαÏμογή QtRuby
+Name[es]=Aplicación en QtRuby
+Name[et]=QtRuby rakendus
+Name[eu]=QtRuby aplikazioa
+Name[fa]=کاربرد QtRuby
+Name[fr]=Application QtRuby
+Name[ga]=Feidhmchlár QtRuby
+Name[gl]=Aplicación QtRuby
+Name[hu]=QtRuby-alapú alkalmazás
+Name[it]=Applicazione QtRuby
+Name[ja]=QtRuby アプリケーション
+Name[nds]=QtRuby-Programm
+Name[ne]=QtRuby अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—
+Name[nl]=QtRuby-toepassing
+Name[pl]=Program w QtRuby
+Name[pt]=Aplicação em QtRuby
+Name[pt_BR]=Aplicativo QtRuby
+Name[ru]=Приложение QtRuby
+Name[sk]=QtRuby Aplikácia
+Name[sr]=QtRuby програм
+Name[sr@Latn]=QtRuby program
+Name[sv]=QtRuby-program
+Name[tr]=QtRuby Uygulaması
+Name[zh_CN]=QtRuby 应用程åº
+Name[zh_TW]=QtRuby 應用程å¼
+Icon=qtrubyapp.png
+Category=Ruby/Qt
+Category[fr]=Ruby/Qt
+Comment=Generate a QtRuby based application (crossplatform compatible)
+Comment[ca]=Genera una aplicació basada en QtRuby (multi plataforma)
+Comment[da]=Genererer et QtRuby baseret program (krydsplatform kompatibelt)
+Comment[de]=Erstellt eine auf QtRuby basierende Anwendung (plattformunabhängig)
+Comment[el]=ΔημιουÏγία μιας εφαÏμογής βασισμένης σε QtRuby (συμβατή με πολλαπλές πλατφόÏμες)
+Comment[es]=Genera una aplicación basada en QtRuby (compatible multiplataforma)
+Comment[et]=Rakenduse loomine QtRuby põhjal (mitmeplatvormne)
+Comment[eu]=Sortu QtRuby lengoaian oinarritutako aplikazioa (plataforma gurutzatuekin bateragarria)
+Comment[fa]=یک کاربرد بر مبنای QtRuby تولید می‌کند )همساز بین سکویی(
+Comment[fr]=Génèrer une application basée sur QtRuby (compatible multi-plateforme)
+Comment[gl]=Xera unha aplicación baseada en QtRuby (compatibilidade multiplataforma)
+Comment[hu]=Létrehoz egy QtRuby-alapú, keresztfordításra is megfelelő alkalmazást
+Comment[it]=Genera un'applicazione basata su QtRuby (compatibile multipiattaforma)
+Comment[ja]=QtRuby ベースã®ã‚¢ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ä½œæˆ (クロスプラットフォーム)
+Comment[nds]=Stellt en op QtRuby opbuut Programm op (över Bedriefümgeven weg kompatibel)
+Comment[ne]= QtRuby आधारित अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— (कà¥à¤°à¤¸à¤ªà¥à¤²à¤¾à¤Ÿà¤«à¤°à¥à¤® उपयà¥à¤•à¥à¤¤) उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Genereert een QtRuby-toepassing (crossplatform compatible)
+Comment[pl]=Generuj program używający QtRuby (wieloplatformowy)
+Comment[pt]=Gera uma aplicação baseada em QtRuby (compatível com várias plataformas)
+Comment[pt_BR]=Gera um aplicativo baseado no QtRuby (compatível com várias plataformas)
+Comment[ru]=Создание кроÑÑплатформенного Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° QtRuby
+Comment[sk]=Vygeneruje QtRuby aplikáciu (multiplatformovo kompatibilnú)
+Comment[sr]=Прави програм на оÑнову QtRuby-ја (прекоплатформÑки компатибилан)
+Comment[sr@Latn]=Pravi program na osnovu QtRuby-ja (prekoplatformski kompatibilan)
+Comment[sv]=Skapa ett program baserat på QtRuby (fungerar på andra plattformar)
+Comment[tr]=QtRuby tabanlı bir uygulama yarat (platformlararası geçimli)
+Comment[zh_TW]=產生一個 QtRuby 為基礎的應用程å¼ï¼ˆè·¨å¹³å°ç›¸å®¹ï¼‰
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.rb,%{dest}/README
+Archive=qtrubyapp.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/qtrubyapp.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/main.rb
+
+[FILE3]
+Type=install
+Source=%{src}/qtrubyapp.rb
+Dest=%{dest}/%{APPNAMELC}.rb
+
+[FILE4]
+Type=install
+Source=%{src}/fileopen.xpm
+Dest=%{dest}/fileopen.xpm
+
+[FILE5]
+Type=install
+Source=%{src}/filesave.xpm
+Dest=%{dest}/filesave.xpm
+
+[FILE6]
+Type=install
+Source=%{src}/fileprint.xpm
+Dest=%{dest}/fileprint.xpm
+
+[FILE7]
+Type=install
+Source=%{src}/app-Makefile
+Dest=%{dest}/Makefile
+
+[FILE8]
+Type=install
+Source=%{src}/app.filelist
+Dest=%{dest}/%{APPNAMELC}.kdevelop.filelist
+
+[FILE9]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/README
+
+[MSG]
+Type=message
+Comment=A QtRuby based application was created in %{dest}
+Comment[ca]=Una aplicació basada en QtRuby ha estat creada en %{dest}
+Comment[da]=Et QtRuby baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf QtRuby basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαÏμογή βασισμένη σε QtRuby δημιουÏγήθηκε στο %{dest}
+Comment[es]=Una aplicación basada en QtRuby ha sido creada en %{dest}
+Comment[et]=Rakendus QtRuby põhjal loodi asukohta %{dest}
+Comment[eu]=QtRuby lengoaian oinarritutako aplikazioa sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد بر مبنای QtRuby در %{dest} ایجاد شد
+Comment[fr]=Une application basée sur QtRuby a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár bunaithe ar QtRuby i %{dest}
+Comment[gl]=Creouse unha aplicación baseada en QtRuby en %{dest}
+Comment[hu]=Létrejött egy QtRuby-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su QtRuby in %{dest}
+Comment[ja]=QtRuby ベースã®ã‚¢ãƒ—リケーションを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en op QtRuby opbuut Programm opstellt.
+Comment[ne]=QtRuby आधारित अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een QtRuby-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program używający QtRuby został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada em QtRuby em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada em QtRuby em %{dest}
+Comment[ru]=Приложение QtRuby Ñоздано в %{dest}
+Comment[sk]=QtRuby aplikácia bola vytvorená v %{dest}
+Comment[sr]=QtRuby програм је направљен у %{dest}
+Comment[sr@Latn]=QtRuby program je napravljen u %{dest}
+Comment[sv]=Ett program baserat på QtRuby skapades i %{dest}
+Comment[tr]=Bir QtRuby tabanlı uygulama %{dest} içinde yaratıldı.
+Comment[zh_TW]=一個 QtRuby 為基礎的應用程å¼æ¡†æž¶å·²å»ºç«‹æ–¼ %{dest}
diff --git a/languages/ruby/app_templates/qtrubyapp/qtrubyapp.png b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.png
new file mode 100644
index 00000000..10f7ecec
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.png
Binary files differ
diff --git a/languages/ruby/app_templates/qtrubyapp/qtrubyapp.rb b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.rb
new file mode 100644
index 00000000..18ecdc3f
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.rb
@@ -0,0 +1,253 @@
+class %{APPNAMESC} < Qt::MainWindow
+
+ slots 'newDoc()',
+ 'choose()',
+ 'load( const QString& )',
+ 'save()',
+ 'saveAs()',
+ 'print()',
+ 'about()',
+ 'aboutQt()'
+
+ def initialize()
+ super( nil, "%{APPNAMESC}", WDestructiveClose )
+ @printer = Qt::Printer.new
+
+ fileTools = Qt::ToolBar.new( self, "file operations" )
+ fileTools.setLabel( tr("File Operations") )
+
+ openIcon = Qt::Pixmap.new( "fileopen.xpm" )
+ fileOpen = Qt::ToolButton.new( Qt::IconSet.new(openIcon), tr("Open File"), nil,
+ self, SLOT('choose()'), fileTools, "open file" )
+
+ saveIcon = Qt::Pixmap.new( "filesave.xpm" )
+ fileSave = Qt::ToolButton.new( Qt::IconSet.new(saveIcon), tr("Save File"), nil,
+ self, SLOT('save()'), fileTools, "save file" )
+
+ printIcon = Qt::Pixmap.new( "fileprint.xpm" )
+ filePrint = Qt::ToolButton.new( Qt::IconSet.new(printIcon), tr("Print File"), nil,
+ self, SLOT('print()'), fileTools, "print file" )
+
+
+ Qt::WhatsThis.whatsThisButton( fileTools )
+
+ fileOpenText = tr('<p><img source="fileopen"> ' +
+ "Click this button to open a <em>new file</em>. <br>" +
+ "You can also select the <b>Open</b> command " +
+ "from the <b>File</b> menu.</p>")
+
+ Qt::WhatsThis.add( fileOpen, fileOpenText )
+
+ Qt::MimeSourceFactory.defaultFactory().setPixmap( "fileopen", openIcon )
+
+ fileSaveText = tr("<p>Click this button to save the file you " +
+ "are editing. You will be prompted for a file name.\n" +
+ "You can also select the <b>Save</b> command " +
+ "from the <b>File</b> menu.</p>")
+
+ Qt::WhatsThis.add( fileSave, fileSaveText )
+
+ filePrintText = tr("Click this button to print the file you " +
+ "are editing.\n You can also select the Print " +
+ "command from the File menu.")
+
+ Qt::WhatsThis.add( filePrint, filePrintText )
+
+
+ file = Qt::PopupMenu.new( self )
+ menuBar().insertItem( tr("&File"), file )
+
+
+ file.insertItem( tr("&New"), self, SLOT('newDoc()'), Qt::KeySequence.new(CTRL+Key_N) )
+
+ id = file.insertItem( Qt::IconSet.new(openIcon), tr("&Open..."),
+ self, SLOT('choose()'), Qt::KeySequence.new(CTRL+Key_O) )
+ file.setWhatsThis( id, fileOpenText )
+
+ id = file.insertItem( Qt::IconSet.new(saveIcon), tr("&Save"),
+ self, SLOT('save()'), Qt::KeySequence.new(CTRL+Key_S) )
+ file.setWhatsThis( id, fileSaveText )
+
+ id = file.insertItem( tr("Save &As..."), self, SLOT('saveAs()') )
+ file.setWhatsThis( id, fileSaveText )
+
+ file.insertSeparator()
+
+ id = file.insertItem( Qt::IconSet.new(printIcon), tr("&Print..."),
+ self, SLOT('print()'), Qt::KeySequence.new(CTRL+Key_P) )
+ file.setWhatsThis( id, filePrintText )
+
+ file.insertSeparator()
+
+ file.insertItem( tr("&Close"), self, SLOT('close()'), Qt::KeySequence.new(CTRL+Key_W) )
+
+ file.insertItem( tr("&Quit"), $qApp, SLOT( 'closeAllWindows()' ), Qt::KeySequence.new(CTRL+Key_Q) )
+
+ menuBar().insertSeparator()
+
+ help = Qt::PopupMenu.new( self )
+ menuBar().insertItem( tr("&Help"), help )
+
+ help.insertItem( tr("&About"), self, SLOT('about()'), Qt::KeySequence.new(Key_F1) )
+ help.insertItem( tr("About &Qt"), self, SLOT('aboutQt()') )
+ help.insertSeparator()
+ help.insertItem( tr("What's &This"), self, SLOT('whatsThis()'), Qt::KeySequence.new(SHIFT+Key_F1) )
+
+ @e = Qt::TextEdit.new( self, "editor" )
+ @e.setFocus()
+ setCentralWidget( @e )
+ statusBar().message( tr("Ready"), 2000 )
+
+ resize( 450, 600 )
+ end
+
+ private
+
+ def newDoc()
+ ed = %{APPNAMESC}.new
+ ed.setCaption(tr("Qt Example - Application"))
+ ed.show()
+ end
+
+ def choose()
+ fn = Qt::FileDialog.getOpenFileName( nil, nil,
+ self)
+ if !fn.nil?
+ load( fn )
+ else
+ statusBar().message( tr("Loading aborted"), 2000 )
+ end
+ end
+
+
+ def load( filename )
+ f = Qt::File.new( filename )
+ if !f.open( Qt::IO_ReadOnly )
+ return
+ end
+
+ ts = Qt::TextStream.new( f )
+ @e.setText( ts.read() )
+ @e.setModified( false )
+ setCaption( filename )
+ statusBar().message( tr("Loaded document %s" % filename), 2000 )
+ end
+
+
+ def save()
+ if @filename.nil?
+ saveAs()
+ return
+ end
+
+ text = @e.text()
+ f = Qt::File.new( @filename )
+ if !f.open( Qt::IO_WriteOnly )
+ statusBar().message( tr("Could not write to %s" % @filename),
+ 2000 )
+ return
+ end
+
+ t = Qt::TextStream.new( f )
+ t << text
+ f.close()
+
+ @e.setModified( false )
+
+ setCaption( @filename )
+
+ statusBar().message( tr( "File %s saved" % @filename ), 2000 )
+ end
+
+
+ def saveAs()
+ fn = Qt::FileDialog.getSaveFileName( nil, nil,
+ self )
+ if !fn.nil?
+ @filename = fn
+ save()
+ else
+ statusBar().message( tr("Saving aborted"), 2000 )
+ end
+ end
+
+
+ def print()
+ # ###### Rewrite to use Qt::SimpleRichText to print here as well
+ margin = 10
+ pageNo = 1
+
+ if @printer.setup(self) # @printer dialog
+ statusBar().message( tr("Printing...") )
+ p = Qt::Painter.new
+ if !p.begin( @printer ) # paint on @printer
+ return
+ end
+
+ p.setFont( @e.font() )
+ yPos = 0 # y-position for each line
+ fm = p.fontMetrics()
+ metrics = Qt::PaintDeviceMetrics.new( @printer ) # need width/height
+ # of @printer surface
+ for i in 0...@e.lines() do
+ if margin + yPos > metrics.height() - margin
+ msg = "Printing (page "
+ msg += pageNo.to_s
+ pageNo += 1
+ msg += ")..."
+ statusBar().message( msg )
+ @printer.newPage() # no more room on self page
+ yPos = 0 # back to top of page
+ end
+ p.drawText( margin, margin + yPos,
+ metrics.width(), fm.lineSpacing(),
+ ExpandTabs | DontClip,
+ @e.text( i ) )
+ yPos = yPos + fm.lineSpacing()
+ end
+ p.end() # send job to @printer
+ statusBar().message( tr("Printing completed"), 2000 )
+ else
+ statusBar().message( tr("Printing aborted"), 2000 )
+ end
+ end
+
+ protected
+
+ def closeEvent( ce )
+ if !@e.modified?
+ ce.accept()
+ return
+ end
+
+ case Qt::MessageBox.information( self, tr("Qt Application Example"),
+ tr("Do you want to save the changes" +
+ " to the document?"),
+ tr("Yes"), tr("No"), tr("Cancel"),
+ 0, 1 )
+ when 0
+ save()
+ ce.accept()
+ when 1
+ ce.accept()
+ when 2
+ ce.ignore()
+ else # just for sanity
+ ce.ignore()
+ end
+ end
+
+ private
+
+ def about()
+ Qt::MessageBox.about( self, tr("Qt Application Example"),
+ tr("This example demonstrates simple use of " +
+ "Qt::MainWindow,\nQt::MenuBar and Qt::ToolBar."))
+ end
+
+
+ def aboutQt()
+ Qt::MessageBox.aboutQt( self, tr("Qt Application Example") )
+ end
+
+end
diff --git a/languages/ruby/app_templates/rails/CMakeLists.txt b/languages/ruby/app_templates/rails/CMakeLists.txt
new file mode 100644
index 00000000..34da0fde
--- /dev/null
+++ b/languages/ruby/app_templates/rails/CMakeLists.txt
@@ -0,0 +1,20 @@
+
+
+#original Makefile.am contents follow:
+
+#dataFiles = app.rb app.kdevelop
+#templateName= rubyhello
+#
+#### no need to change below:
+#template_DATA = $(templateName).kdevtemplate
+#templatedir = ${appwizarddatadir}/templates
+#
+#appwizarddatadir = ${kde_datadir}/kdevappwizard
+#$(templateName).tar.gz:
+# $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+# $(GZIP) -9 $(templateName).tar
+#
+#archivedir = ${appwizarddatadir}
+#archive_DATA = $(templateName).tar.gz ${templateName}.png
+#
+#CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/ruby/app_templates/rails/Makefile.am b/languages/ruby/app_templates/rails/Makefile.am
new file mode 100644
index 00000000..49d77bdd
--- /dev/null
+++ b/languages/ruby/app_templates/rails/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.kdevelop
+templateName= rails
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/rails/app.kdevelop b/languages/ruby/app_templates/rails/app.kdevelop
new file mode 100644
index 00000000..c02c2057
--- /dev/null
+++ b/languages/ruby/app_templates/rails/app.kdevelop
@@ -0,0 +1,107 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <includepatterns>*.rb,*.rhtml,*.rxml,*.rjs,*.css,*.js,*.html.erb,*.js.rjs,*.xml.builder</includepatterns>
+ <excludepatterns>*~</excludepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Scripts" />
+ <group pattern="*.css" name="StyleSheets" />
+ <group pattern="*.js" name="JavaScripts" />
+ <group pattern="*.rhtml,*.html.erb" name="Views" />
+ <group pattern="*.rxml,*.xml.builder" name="BuilderTemplates" />
+ <group pattern="*.rjs,*.js.rjs" name="Ruby JavaScript" />
+ <group pattern="*.yml" name="Config" />
+ <group pattern="*.gif,*.jpg,*.png,*.ico" name="Images" />
+ <group pattern="*.html,*.cgi,*.fcgi,*.txt" name="Public" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ <type ext="rhtml"/>
+ <type ext="html.erb"/>
+ <type ext="rxml"/>
+ <type ext="xml.builder"/>
+ <type ext="rjs"/>
+ <type ext="js.rjs"/>
+ <type ext="css"/>
+ <type ext="js"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <shell>%{dest}/script/console</shell>
+ <terminal>false</terminal>
+ <mainprogram>script/server</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/rails/rails.kdevtemplate b/languages/ruby/app_templates/rails/rails.kdevtemplate
new file mode 100644
index 00000000..e377e1c4
--- /dev/null
+++ b/languages/ruby/app_templates/rails/rails.kdevtemplate
@@ -0,0 +1,72 @@
+# KDE Config File
+[General]
+Name=Ruby On Rails
+Name[de]=Ruby on Rails
+Name[ne]=रूबि अन रेलà¥à¤¸
+Name[sv]=Ruby on Rails
+Icon=rails.png
+Category=Ruby
+Comment=This generates a Ruby On Rails project
+Comment[ca]=Genera un projecte Ruby On Rails
+Comment[da]=Dette genererer et Ruby On Rails projekt
+Comment[de]=Erstellt ein einfaches Ruby-on-Rails-Projekt
+Comment[el]=ΔημιουÏγεί ένα έÏγο Ruby On Rails
+Comment[es]=Genera un proyecto Ruby On Rails
+Comment[et]=Lihtsa Ruby On Rails projekti loomine
+Comment[eu]=Ruby On Rails proiektu bat sortzen du.
+Comment[fa]=یک پروژۀ Ruby On Rails تولید می‌کند
+Comment[fr]=Génère un projet Ruby On Rails
+Comment[gl]=Isto xera un proxecto de Ruby On Rails
+Comment[hu]=Létrehoz egy Ruby On Rails-projektet
+Comment[it]=Genera un progetto Ruby On Rails
+Comment[ja]=Ruby On Rails プロジェクトを作æˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach "Ruby-On-Rails"-Projekt op
+Comment[ne]=यसले रूबि अन रेलà¥à¤¸ परियोजना उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een Ruby On Rails-project.
+Comment[pl]=Generuje projekt Ruby On Rails
+Comment[pt]=Gera um projecto de Ruby On Rails
+Comment[pt_BR]=Gera um projecto de Ruby On Rails
+Comment[ru]=Создание проекта на Ruby On Rails
+Comment[sk]=Vygeneruje Ruby On Rails projekt
+Comment[sr]=Прави једноÑтаван Ruby On Rails пројекат
+Comment[sr@Latn]=Pravi jednostavan Ruby On Rails projekat
+Comment[sv]=Det här skapar ett Ruby on Rails-projekt
+Comment[zh_TW]=產生一個 Ruby On Rails 專案
+FileTemplates=rb,ShellStyle,rhtml,XMLStyle,html.erb,XMLStyle,rxml,XMLStyle,xml.builder,XMLStyle,rjs,ShellStyle,js.rjs,ShellStyle,css,CPPStyle,js,CPPStyle
+ShowFilesAfterGeneration=%{dest}/script/server
+Archive=rails.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MSG]
+Type=message
+Comment=A Ruby On Rails project created in %{dest}
+Comment[ca]=A simple projecte Ruby On Rails ha estat creat en %{dest}
+Comment[da]=Et Ruby On Rails projekt oprettet i %{dest}
+Comment[de]=Ein einfaches Ruby-on-Rails-Project wurde in %{dest} erstellt.
+Comment[el]=Ένα έÏγο Ruby On Rails δημιουÏγήθηκε στο %{dest}.
+Comment[es]=Un proyecto de Ruby On Rails ha sido creado en %{dest}.
+Comment[et]=Lihtne Ruby On Rails projekt loodi asukohta %{dest}.
+Comment[eu]=Ruby On Rails proiektu bat sortu da hemen: %{dest}.
+Comment[fa]=یک پروژۀ Ruby On Rails در %{dest} ایجاد شد
+Comment[fr]=Un projet Ruby On Rails a été créé dans %{dest}
+Comment[gl]=Creouse un proxecto de Ruby On Rails en %{dest}
+Comment[hu]=Létrejött egy Ruby On Rails-projekt itt: %{dest}
+Comment[it]=È stato creato un progetto Ruby On Rails in %{dest}
+Comment[ja]=Ruby On Rails プロジェクトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach "Ruby-On-Rails"-Projekt opstellt.
+Comment[ne]=रूबि अन रेलà¥à¤¸ परियोजना %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरिनà¥à¤›
+Comment[nl]=Een eenvoudig Ruby On Rails-project is aangemaakt in %{dest}.
+Comment[pl]=Projekt Ruby On Rails stworzony w %{dest}
+Comment[pt]=Foi criado um projecto de Ruby on Rails em %{dest}
+Comment[pt_BR]=Foi criado um projecto de Ruby on Rails em %{dest}
+Comment[ru]=Проект на Ruby On Rails Ñоздан в %{dest}
+Comment[sk]=Ruby On Rails projekt bol vytvorený v %{dest}
+Comment[sr]=Ruby On Rails пројекат направљен је у %{dest}
+Comment[sr@Latn]=Ruby On Rails projekat napravljen je u %{dest}
+Comment[sv]=Ett Ruby on Rails-projekt skapades i %{dest}
+Comment[zh_TW]=一個 Ruby On Rails 專案已建立於 %{dest}
diff --git a/languages/ruby/app_templates/rails/rails.png b/languages/ruby/app_templates/rails/rails.png
new file mode 100644
index 00000000..26d02009
--- /dev/null
+++ b/languages/ruby/app_templates/rails/rails.png
Binary files differ
diff --git a/languages/ruby/app_templates/ruby.appwizard b/languages/ruby/app_templates/ruby.appwizard
new file mode 100644
index 00000000..726daeed
--- /dev/null
+++ b/languages/ruby/app_templates/ruby.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=rubyhello,qtruby,qtrubyapp,dcopserviceruby,kappruby,kxtruby,rails
diff --git a/languages/ruby/app_templates/rubyhello/.kdev_ignore b/languages/ruby/app_templates/rubyhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/.kdev_ignore
diff --git a/languages/ruby/app_templates/rubyhello/Makefile.am b/languages/ruby/app_templates/rubyhello/Makefile.am
new file mode 100644
index 00000000..ecb3e535
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.rb app.kdevelop
+templateName= rubyhello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/ruby/app_templates/rubyhello/app.kdevelop b/languages/ruby/app_templates/rubyhello/app.kdevelop
new file mode 100644
index 00000000..2d1d24c5
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/app.kdevelop
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <includepatterns>*.rb</includepatterns>
+ <excludepatterns>*~</excludepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Scripts" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <mainprogram>./%{APPNAMELC}.rb</mainprogram>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ </run>
+ </kdevrubysupport>
+
+</kdevelop>
diff --git a/languages/ruby/app_templates/rubyhello/app.rb b/languages/ruby/app_templates/rubyhello/app.rb
new file mode 100644
index 00000000..c3bc962d
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/app.rb
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+
+puts "Hello world"
diff --git a/languages/ruby/app_templates/rubyhello/rubyhello b/languages/ruby/app_templates/rubyhello/rubyhello
new file mode 100644
index 00000000..4581605d
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/rubyhello
@@ -0,0 +1,9 @@
+# KDE Config File
+[General]
+Name=Simple Ruby script
+Name[fr]=Un simple script de test « Hello world »
+Category=Ruby
+Comment=This generates a simplistic 'Hello world' program in Ruby
+Comment[fr]=Génère un simple script de test du type « Hello world » dans le language RUBY.
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=APPNAMELC.rb
diff --git a/languages/ruby/app_templates/rubyhello/rubyhello.kdevtemplate b/languages/ruby/app_templates/rubyhello/rubyhello.kdevtemplate
new file mode 100644
index 00000000..3612becb
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/rubyhello.kdevtemplate
@@ -0,0 +1,105 @@
+# KDE Config File
+[General]
+Name=Simple Ruby script
+Name[ca]=Simple script en Ruby
+Name[da]=Simpelt Ruby script
+Name[de]=Einfaches Ruby-Skript
+Name[el]=Απλό σενάÏιο Ruby
+Name[es]=Guión sencillo en Ruby
+Name[et]=Lihtne Ruby skript
+Name[eu]=Ruby script sinple bat
+Name[fa]=دست‌نوشتۀ سادۀ رابی
+Name[fr]=Script Ruby simple
+Name[ga]=Script shimplí Ruby
+Name[gl]=Script sinxelo en Ruby
+Name[hu]=Egyszerű Ruby-szkript
+Name[it]=Semplice script Ruby
+Name[ja]=ç°¡å˜ãª Ruby スクリプト
+Name[nds]=Eenfach Ruby-Skript
+Name[ne]=साधारण रूबि सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ
+Name[nl]=Eenvoudig Ruby-script
+Name[pl]=Prosty skrypt w języku Ruby
+Name[pt]=Programa simples em Ruby
+Name[pt_BR]=Programa simples em Ruby
+Name[ru]=ПроÑтой Ñкрипт Ruby
+Name[sk]=Jednoduchý Ruby skript
+Name[sr]=ЈедноÑтавна Ruby Ñкрипта
+Name[sr@Latn]=Jednostavna Ruby skripta
+Name[sv]=Enkelt Ruby-skript
+Name[tg]=Скрипти Ruby оддӣ
+Name[tr]=Basit Ruby BetiÄŸi
+Name[zh_CN]=简å•çš„ Ruyb 脚本
+Name[zh_TW]=簡單 Ruby 文稿
+Category=Ruby
+Comment=This generates a simplistic 'Hello world' program in Ruby
+Comment[ca]=Genera un simple programa de 'Hello world' en Ruby
+Comment[da]=Dette genererer et simplistisk 'Goddag verden' program i Ruby
+Comment[de]=Erstellt ein einfaches "Hello World"'-Programm in Ruby
+Comment[el]=Αυτό δημιουÏγεί ένα απλό Ï€ÏόγÏαμμα 'Γεια σου κόσμε' σε Ruby
+Comment[es]=Genera un sencillo programa «Hola mundo» en Ruby
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine Rubys
+Comment[eu]=Honek "Kaixo mundua" programa sinple bat sortzen du Ruby lengoaian
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در رابی تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en Ruby
+Comment[gl]=Isto xera un programa sinxelo 'Ola mundo' en Ruby
+Comment[hu]=Létrehoz egy egyszerű 'Hello world' programot Rubyban
+Comment[it]=Genera un semplice programma di "Hello world" in Ruby
+Comment[ja]=ç°¡å˜ãª Hello world プログラムを Ruby ã§ä½œæˆã—ã¾ã™
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm in Ruby op.
+Comment[ne]=यसले रूबिमा साधारण 'हेलà¥à¤²à¥‹ वोलà¥à¤¡' कारà¥à¤¯à¤•à¥à¤°à¤® उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Dit genereert een eenvoudig Hello World-programma in Ruby
+Comment[pl]=Generuje prosty program "Witaj świecie" w języku Ruby
+Comment[pt]=Isto gera um programa simples 'Olá mundo' em Ruby
+Comment[pt_BR]=Isto gera um programa simples 'Olá mundo' em Ruby
+Comment[ru]=Создание проÑтой программы 'Hello world' на Ruby
+Comment[sk]=Vygeneruje jednoduchý Ahoj svet program v Ruby
+Comment[sr]=Ово прави једноÑтаван „Здраво Ñвете“ у Ruby-ју
+Comment[sr@Latn]=Ovo pravi jednostavan „Zdravo svete“ u Ruby-ju
+Comment[sv]=Detta skapar ett förenklat 'Hello world'-program i Ruby
+Comment[tr]=Bu Ruby'de basit bir "Merhaba Dünya" programı yaratır.
+Comment[zh_TW]=產生一個簡單的 Ruby çš„ Hello world 程å¼
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.rb
+Archive=rubyhello.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.rb
+Dest=%{dest}/%{APPNAMELC}.rb
+
+[MSG]
+Type=message
+Comment=A simple ruby script was created in %{dest}
+Comment[ca]=Un simple script en Ruby ha estat creat en %{dest}
+Comment[da]=Et simpelt ruby script blev oprettet i %{dest}
+Comment[de]=Ein einfaches Ruby-Skript wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό σενάÏιο ruby δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo guión en Ruby ha sido creado en %{dest}
+Comment[et]=Lihtne Ruby skript loodi asukohta %{dest}
+Comment[eu]=Ruby script sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک دست‌نوشتۀ سادۀ رابی در %{dest} ایجاد شد
+Comment[fr]=Un script Ruby simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh script shimplí ruby i %{dest}
+Comment[gl]=Creouse un scrip sinxelo en ruby en %{dest}
+Comment[hu]=Létrejött egy egyszerű Ruby-szkript itt: %{dest}
+Comment[it]=È stato creato un semplice script ruby in %{dest}
+Comment[ja]=ç°¡å˜ãª ruby スクリプトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach Ruby-Skript opstellt.
+Comment[ne]=साधारण रूबि सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig Ruby-script is aangemaakt in %{dest}
+Comment[pl]=Prosty skrypt w języku Ruby został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples em Ruby em %{dest}
+Comment[pt_BR]=Foi criado um programa simples em Ruby em %{dest}
+Comment[ru]=ПроÑтой Ñкрипт Ruby Ñоздан в %{dest}
+Comment[sk]=Jednoduchý Ruby skript bol vytvorený v %{dest}
+Comment[sr]=ЈедноÑтавна ruby Ñкрипта направљена је у %{dest}
+Comment[sr@Latn]=Jednostavna ruby skripta napravljena je u %{dest}
+Comment[sv]=Ett enkelt Ruby-skript skapades i %{dest}
+Comment[tr]=Basit bir Ruby betiği %{dest} içinde yaratıldı.
+Comment[zh_TW]=一個簡單的 ruby 文稿已建立於 %{dest}
diff --git a/languages/ruby/app_templates/rubyhello/rubyhello.png b/languages/ruby/app_templates/rubyhello/rubyhello.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/rubyhello.png
Binary files differ
diff --git a/languages/ruby/debugger/Makefile.am b/languages/ruby/debugger/Makefile.am
new file mode 100644
index 00000000..f4c512c2
--- /dev/null
+++ b/languages/ruby/debugger/Makefile.am
@@ -0,0 +1,25 @@
+# Here resides the debugger part.
+
+INCLUDES = -I$(top_srcdir)/languages/lib/debugger \
+ -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/util \
+ -I$(top_srcdir)/lib/widgets $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevrbdebugger.la
+libkdevrbdebugger_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevrbdebugger_la_LIBADD = $(top_builddir)/lib/libkdevelop.la $(top_builddir)/lib/widgets/libkdevwidgets.la $(LIB_KHTML) \
+ $(top_builddir)/languages/lib/debugger/liblang_debugger.la
+
+libkdevrbdebugger_la_SOURCES = debuggerpart.cpp dbgcontroller.cpp rdbcontroller.cpp dbgcommand.cpp rdbcommand.cpp rdbparser.cpp stty.cpp breakpoint.cpp variablewidget.cpp rdbbreakpointwidget.cpp framestackwidget.cpp dbgpsdlg.cpp dbgtoolbar.cpp rdboutputwidget.cpp rdbtable.cpp
+
+METASOURCES = AUTO
+KDE_ICON = AUTO
+
+rubysrc_DATA = debuggee.rb
+rubysrcdir = $(kde_datadir)/kdevrbdebugger
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevrbdebugger.desktop
+
+rcdir = $(kde_datadir)/kdevrbdebugger
+rc_DATA = kdevrbdebugger.rc
+noinst_HEADERS = rdbtable.h
diff --git a/languages/ruby/debugger/breakpoint.cpp b/languages/ruby/debugger/breakpoint.cpp
new file mode 100644
index 00000000..f210e359
--- /dev/null
+++ b/languages/ruby/debugger/breakpoint.cpp
@@ -0,0 +1,343 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "breakpoint.h"
+
+#include <klocale.h>
+
+#include <qfileinfo.h>
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qregexp.h>
+#include <qstring.h>
+
+#include <stdio.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+static int BPKey_ = 0;
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+Breakpoint::Breakpoint(bool temporary, bool enabled)
+ : s_pending_(true),
+ s_actionAdd_(true),
+ s_actionClear_(false),
+ s_actionModify_(false),
+ s_actionDie_(false),
+ s_dbgProcessing_(false),
+ s_enabled_(enabled),
+ s_temporary_(temporary),
+ s_changedEnable_(false),
+ key_(BPKey_++),
+ active_(-1)
+{
+}
+
+/***************************************************************************/
+
+Breakpoint::~Breakpoint()
+{
+}
+
+/***************************************************************************/
+
+QString Breakpoint::dbgRemoveCommand() const
+{
+// if (dbgId_>0)
+// return QString("delete %1").arg(dbgId_); // gdb command - not translatable
+
+ return QString();
+}
+
+/***************************************************************************/
+
+// called when debugger ends
+void Breakpoint::reset()
+{
+ dbgId_ = -1;
+ s_pending_ = true;
+ s_actionAdd_ = true; // waiting for the debugger to start
+ s_actionClear_ = false;
+ s_changedEnable_ = !s_enabled_;
+ s_actionModify_ = s_changedEnable_;
+ s_dbgProcessing_ = false;
+// hits_ = 0;
+ active_ = -1;
+}
+
+/***************************************************************************/
+
+void Breakpoint::setActive(int active, int id)
+{
+ active_ = active;
+ dbgId_ = id;
+
+ if (s_pending_ && !(s_actionAdd_ && s_actionModify_)) {
+ s_pending_ = false;
+ s_actionModify_ = false;
+ }
+
+ s_actionAdd_ = false;
+ s_actionClear_ = false;
+ s_actionDie_ = false;
+ s_dbgProcessing_ = false;
+
+ if (!s_actionModify_) {
+ s_changedEnable_ = false;
+ }
+}
+
+/***************************************************************************/
+
+QString Breakpoint::statusDisplay(int activeFlag) const
+{
+ QString status="";
+ if (!s_enabled_)
+ status = i18n("Disabled");
+ else
+ if (s_pending_)
+ {
+ if (s_actionAdd_)
+ status = i18n("Pending (add)");
+ if (s_actionClear_)
+ status = i18n("Pending (clear)");
+ if (s_actionModify_)
+ status = i18n("Pending (modify)");
+ }
+ else
+ if (isActive(activeFlag))
+ status = i18n("Active");
+
+ return status;
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+FilePosBreakpoint::FilePosBreakpoint(const QString &fileName, int lineNum,
+ bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled),
+ fileName_(fileName),
+ lineNo_(lineNum)
+{
+}
+
+/***************************************************************************/
+
+FilePosBreakpoint::~FilePosBreakpoint()
+{
+}
+
+/***************************************************************************/
+
+QString FilePosBreakpoint::dbgSetCommand() const
+{
+ QString cmdStr;
+ if (fileName_.isEmpty())
+ cmdStr = QString("break %1").arg(lineNo_); // gdb command - not translatable
+ else {
+ cmdStr = QString("break %1:%2").arg(fileName_).arg(lineNo_);
+ }
+
+ if (isTemporary())
+ cmdStr = "t"+cmdStr; // gdb command
+
+ return cmdStr;
+}
+
+/***************************************************************************/
+
+bool FilePosBreakpoint::match(const Breakpoint *brkpt) const
+{
+ // simple case
+ if (this == brkpt)
+ return true;
+
+ // Type case
+ const FilePosBreakpoint* check = dynamic_cast<const FilePosBreakpoint*>(brkpt);
+ if (!check)
+ return false;
+
+ // member case
+ return ( (fileName_ == check->fileName_) &&
+ (lineNo_ == check->lineNo_));
+}
+
+/***************************************************************************/
+
+QString FilePosBreakpoint::location(bool compact)
+{
+ if (compact)
+ return QFileInfo(fileName_).fileName()+":"+QString::number(lineNo_);
+
+ return fileName_+":"+QString::number(lineNo_);
+}
+
+/***************************************************************************/
+
+void FilePosBreakpoint::setLocation(const QString& location)
+{
+ QRegExp regExp1("(.*):(\\d+)$");
+ regExp1.setMinimal(true);
+ if ( regExp1.search(location, 0) >= 0 )
+ {
+ QString t = regExp1.cap(1);
+ QString dirPath = QFileInfo(t).dirPath();
+ if ( dirPath == "." )
+ fileName_ = QFileInfo(fileName_).dirPath()+"/"+regExp1.cap(1);
+ else
+ fileName_ = regExp1.cap(1);
+
+ lineNo_ = regExp1.cap(2).toInt();
+ }
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+Watchpoint::Watchpoint(const QString& varName, bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled),
+ varName_(varName)
+{
+}
+
+/***************************************************************************/
+
+Watchpoint::~Watchpoint()
+{
+}
+
+/***************************************************************************/
+
+QString Watchpoint::dbgSetCommand() const
+{
+ return QString("watch ")+varName_; // gdb command - not translatable
+}
+
+/***************************************************************************/
+
+bool Watchpoint::match(const Breakpoint* brkpt) const
+{
+ // simple case
+ if (this == brkpt)
+ return true;
+
+ // Type case
+ const Watchpoint *watch = dynamic_cast<const Watchpoint*>(brkpt);
+ if (watch == 0)
+ return false;
+
+ // member case
+ return (varName_ == watch->varName_);
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+Catchpoint::Catchpoint(const QString& varName, bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled),
+ varName_(varName)
+{
+}
+
+/***************************************************************************/
+
+Catchpoint::~Catchpoint()
+{
+}
+
+/***************************************************************************/
+
+QString Catchpoint::dbgSetCommand() const
+{
+ return QString("catch ")+varName_; // gdb command - not translatable
+}
+
+/***************************************************************************/
+
+bool Catchpoint::match(const Breakpoint* brkpt) const
+{
+ // simple case
+ if (this == brkpt)
+ return true;
+
+ // Type case
+ const Catchpoint *check = dynamic_cast<const Catchpoint*>(brkpt);
+ if (check == 0)
+ return false;
+
+ // member case
+ return (varName_ == check->varName_);
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+FunctionBreakpoint::FunctionBreakpoint(const QString& functionName, bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled),
+ m_functionName(functionName)
+{
+}
+
+/***************************************************************************/
+
+FunctionBreakpoint::~FunctionBreakpoint()
+{
+}
+
+/***************************************************************************/
+
+QString FunctionBreakpoint::dbgSetCommand() const
+{
+ return QString("break ")+m_functionName; // gdb command - not translatable
+}
+
+/***************************************************************************/
+
+bool FunctionBreakpoint::match(const Breakpoint* brkpt) const
+{
+ // simple case
+ if (this == brkpt)
+ return true;
+
+ // Type case
+ const FunctionBreakpoint *check = dynamic_cast<const FunctionBreakpoint*>(brkpt);
+ if (!check)
+ return false;
+
+ // member case
+ return (m_functionName == check->m_functionName);
+}
+
+
+}
diff --git a/languages/ruby/debugger/breakpoint.h b/languages/ruby/debugger/breakpoint.h
new file mode 100644
index 00000000..e45e3856
--- /dev/null
+++ b/languages/ruby/debugger/breakpoint.h
@@ -0,0 +1,214 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _BREAKPOINT_H_
+#define _BREAKPOINT_H_
+
+#include <klocale.h>
+
+#include <qstring.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+enum BP_TYPES
+{
+ BP_TYPE_Invalid,
+ BP_TYPE_FilePos,
+ BP_TYPE_Watchpoint,
+ BP_TYPE_Catchpoint,
+ BP_TYPE_Function
+};
+
+class Breakpoint
+{
+public:
+ Breakpoint(bool temporary=false, bool enabled=true);
+ virtual ~Breakpoint();
+
+ virtual QString dbgSetCommand() const = 0;
+ virtual QString dbgRemoveCommand() const;
+ virtual bool match(const Breakpoint* brkpt) const = 0;
+ virtual void reset();
+
+ void setActive(int active, int id);
+ bool isActive(int active) const { return (active_ == active) ||
+ (s_pending_ && !s_actionClear_); }
+ void setEnabled(bool enabled) { s_changedEnable_ = (s_enabled_ != enabled);
+ s_enabled_ = enabled; }
+ bool isEnabled() const { return s_enabled_; }
+ void setTemporary(bool temporary) { s_temporary_ = temporary; }
+ bool isTemporary() const { return s_temporary_; }
+
+ bool changedEnable() const { return s_changedEnable_; }
+
+ void setPending(bool pending) { s_pending_ = pending; }
+ bool isPending() const { return s_pending_; }
+ void setActionAdd(bool actionAdd) { s_actionDie_ = false;
+ s_actionAdd_ = actionAdd; }
+ bool isActionAdd() const { return s_actionAdd_; }
+ void setActionClear(bool actionClear) { s_actionClear_ = actionClear; }
+ bool isActionClear() const { return s_actionClear_; }
+ void setActionModify(bool actionModify) { s_actionDie_ = false;
+ s_actionModify_ = actionModify; }
+ bool isActionModify() const { return s_actionModify_; }
+ void setDbgProcessing(bool dbgProcessing) { s_dbgProcessing_ = dbgProcessing; }
+ bool isDbgProcessing() const { return s_dbgProcessing_; }
+ void setActionDie() { s_actionDie_ = true;
+ s_actionClear_ = false; }
+ bool isActionDie() const { return s_actionDie_; }
+
+ int key() const { return key_; }
+ void setDbgId(int dbgId) { dbgId_ = dbgId; }
+ int dbgId() const { return dbgId_; }
+
+ virtual QString statusDisplay(int activeFlag) const;
+ virtual BP_TYPES type() const { return BP_TYPE_Invalid; }
+ virtual QString displayType() const { return i18n( "Invalid" ); }
+
+ virtual QString location(bool compact=true) = 0;
+ virtual void setLocation(const QString& ) = 0;
+ virtual bool isValid() const = 0;
+
+private:
+ bool s_pending_ :1;
+ bool s_actionAdd_ :1;
+ bool s_actionClear_ :1;
+ bool s_actionModify_ :1;
+ bool s_actionDie_ :1;
+ bool s_dbgProcessing_ :1;
+ bool s_enabled_ :1;
+ bool s_temporary_ :1;
+ bool s_changedEnable_ :1;
+
+ int dbgId_; // assigned by gdb
+
+ int key_; // internal unique key
+ int active_; // counter incremented on receipt of all BP's
+
+ int ignoreCount_;
+ QString condition_;
+// QString type_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class FilePosBreakpoint : public Breakpoint
+{
+public:
+ FilePosBreakpoint(const QString &fileName, int lineNum,
+ bool temporary=false, bool enabled=true);
+ virtual ~FilePosBreakpoint();
+ virtual QString dbgSetCommand() const;
+ virtual bool match(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_FilePos; }
+ QString displayType() const { return i18n( "File:line" ); }
+ void setFileName(const QString& fileName) { fileName_ = fileName; }
+ QString fileName() const { return fileName_; }
+ void setLineNum(int lineNum) { lineNo_ = lineNum; }
+ int lineNum() const { return lineNo_; }
+ QString location(bool compact=true);
+ void setLocation(const QString& location);
+ bool isValid() const { return lineNo_>0 && !fileName_.isEmpty(); }
+
+private:
+ QString fileName_;
+ int lineNo_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class Watchpoint : public Breakpoint
+{
+public:
+ Watchpoint(const QString &varName, bool temporary=false, bool enabled=true);
+ virtual ~Watchpoint();
+ virtual QString dbgSetCommand() const;
+ bool match(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_Watchpoint; }
+ QString displayType() const { return i18n("Watchpoint"); }
+ void setVarName(const QString& varName) { varName_ = varName; }
+ QString varName() const { return varName_; }
+ QString location(bool) { return varName_; }
+ void setLocation(const QString& location) { varName_ = location; }
+ bool isValid() const { return !varName_.isEmpty(); }
+
+private:
+ QString varName_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class Catchpoint : public Breakpoint
+{
+public:
+ Catchpoint(const QString &varName, bool temporary=false, bool enabled=true);
+ virtual ~Catchpoint();
+ virtual QString dbgSetCommand() const;
+ bool match(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_Catchpoint; }
+ QString displayType() const { return i18n("Catchpoint"); }
+ void setVarName(const QString& varName) { varName_ = varName; }
+ QString varName() const { return varName_; }
+ QString location(bool) { return varName_; }
+ void setLocation(const QString& location) { varName_ = location; }
+ bool isValid() const { return !varName_.isEmpty(); }
+
+private:
+ QString varName_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class FunctionBreakpoint : public Breakpoint
+{
+public:
+ FunctionBreakpoint(const QString &functionName, bool temporary=false, bool enabled=true);
+ virtual ~FunctionBreakpoint();
+ virtual QString dbgSetCommand() const;
+ bool match(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_Function; }
+ QString displayType() const { return i18n("Method()"); }
+ void setfunctionName(const QString& functionName) { m_functionName = functionName; }
+ QString functionName() const { return m_functionName; }
+ QString location(bool) { return m_functionName; };
+ void setLocation(const QString& location) { m_functionName = location; }
+ bool isValid() const { return !m_functionName.isEmpty(); }
+
+private:
+ QString m_functionName;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/dbgcommand.cpp b/languages/ruby/debugger/dbgcommand.cpp
new file mode 100644
index 00000000..6c6a24ec
--- /dev/null
+++ b/languages/ruby/debugger/dbgcommand.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "dbgcommand.h"
+
+#include <qstring.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+namespace RDBDebugger
+{
+
+
+DbgCommand::DbgCommand(const QCString& command, bool isRunCmd, bool isInfoCmd) :
+ command_(command),
+ isRunCmd_(isRunCmd),
+ isInfoCmd_(isInfoCmd),
+ sent_(false),
+ waitForReply_(true)
+{
+ cmdBuffer_ = command_+"\n";
+}
+
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
diff --git a/languages/ruby/debugger/dbgcommand.h b/languages/ruby/debugger/dbgcommand.h
new file mode 100644
index 00000000..32ec7f7a
--- /dev/null
+++ b/languages/ruby/debugger/dbgcommand.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef DBGCOMMAND_H
+#define DBGCOMMAND_H
+
+#include <qstring.h>
+
+/**
+ * @author John Birch
+ */
+
+namespace RDBDebugger
+{
+
+class DbgCommand
+{
+public:
+ DbgCommand(const QCString& command, bool isRunCmd, bool isInfoCmd);
+ virtual ~DbgCommand() {};
+
+ virtual QCString& cmdToSend() { sent_ = true; return cmdBuffer_; }
+ virtual int cmdLength() { return cmdBuffer_.length(); }
+
+ QCString rawDbgCommand() const { return command_; }
+ bool isARunCmd() const { return isRunCmd_;}
+ bool isAnInfoCmd() const { return isInfoCmd_; }
+ bool moreToSend() const { return !sent_; }
+ bool expectReply() const { return waitForReply_; }
+
+protected:
+ QCString cmdBuffer_;
+ QCString command_;
+ bool isRunCmd_;
+ bool isInfoCmd_;
+ bool sent_;
+ bool waitForReply_;
+};
+
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+#endif
diff --git a/languages/ruby/debugger/dbgcontroller.cpp b/languages/ruby/debugger/dbgcontroller.cpp
new file mode 100644
index 00000000..7ee560b7
--- /dev/null
+++ b/languages/ruby/debugger/dbgcontroller.cpp
@@ -0,0 +1,46 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "dbgcontroller.h"
+#include <kprocess.h>
+
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+DbgController::DbgController()
+ : dbgProcess_(0)
+{
+}
+
+/***************************************************************************/
+
+DbgController::~DbgController()
+{
+ delete dbgProcess_;
+}
+
+/***************************************************************************/
+
+}
+
+#include "dbgcontroller.moc"
diff --git a/languages/ruby/debugger/dbgcontroller.h b/languages/ruby/debugger/dbgcontroller.h
new file mode 100644
index 00000000..13ee4382
--- /dev/null
+++ b/languages/ruby/debugger/dbgcontroller.h
@@ -0,0 +1,161 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DBGCONTROLLER_H_
+#define _DBGCONTROLLER_H_
+
+#include <qobject.h>
+#include <domutil.h>
+
+class KProcess;
+class QString;
+class QStrList;
+
+namespace RDBDebugger
+{
+
+class Breakpoint;
+class DbgCommand;
+class LazyFetchItem;
+class VarItem;
+
+/***************************************************************************/
+/**
+ * @author jbb
+ */
+/***************************************************************************/
+// sigh - namespace's don't work on some of the older compilers
+enum DBGStateFlags
+{
+ s_dbgNotStarted = 1 << 0,
+ s_appNotStarted = 1 << 1,
+ s_appBusy = 1 << 2,
+ s_waitForWrite = 1 << 3,
+ s_programExited = 1 << 4,
+ s_silent = 1 << 5,
+ s_fetchLocals = 1 << 6,
+ s_viewBT = 1 << 7,
+ s_viewBP = 1 << 8,
+ s_attached = 1 << 9,
+ s_fetchGlobals = 1 << 10,
+ s_waitTimer = 1 << 11,
+ s_shuttingDown = 1 << 12,
+ s_viewThreads = 1 << 13
+};
+
+
+enum RttiValues {
+ RTTI_WATCH_ROOT = 1001,
+ RTTI_GLOBAL_ROOT = 1002,
+ RTTI_VAR_FRAME_ROOT = 1003,
+ RTTI_LAZY_FETCH_ITEM = 1004,
+ RTTI_VAR_ITEM = 1005,
+ RTTI_WATCH_VAR_ITEM = 1006,
+ RTTI_THREAD_STACK_ITEM = 1007,
+ RTTI_FRAME_STACK_ITEM = 1008
+};
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class DbgController : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ DbgController();
+ virtual ~DbgController();
+
+ virtual bool stateIsOn( int state ) = 0;
+
+protected:
+ virtual void queueCmd(DbgCommand *cmd, bool executeNext) = 0;
+ virtual void parse(char *str) = 0;
+
+public slots:
+ virtual void configure() = 0;
+
+ /**
+ * Start the debugger
+ * \param ruby_interpreter shell
+ * \param character_coding -K option
+ * \param run_directory Directory from where the program should be run
+ * \param debuggee_path Absolute path to debuggee.rb debugger script
+ * \param application Absolute path to application
+ * \param run_arguments Command line arguments to be passed to the application
+ * \param show_constants Show ruby constants in the variables view
+ */
+ virtual void slotStart(const QString& ruby_interpreter,
+ const QString& character_coding,
+ const QString& run_directory,
+ const QString& debuggee_path,
+ const QString& application,
+ const QString& run_arguments,
+ bool show_constants,
+ bool trace_into_ruby) = 0;
+
+ virtual void slotStopDebugger() = 0;
+
+ virtual void slotRun() = 0;
+ virtual void slotRunUntil(const QString &fileName, int lineNum) = 0;
+ virtual void slotStepInto() = 0;
+ virtual void slotStepOver() = 0;
+ virtual void slotStepOutOff() = 0;
+
+ virtual void slotBreakInto() = 0;
+ virtual void slotBPState(const Breakpoint&) = 0;
+
+
+ virtual void slotExpandItem(VarItem *parent,
+ const QCString &userRequest) = 0;
+ virtual void slotSelectFrame(int frame, int thread,
+ const QString& frameName) = 0;
+ virtual void slotFetchGlobals(bool fetch) = 0;
+
+protected slots:
+ virtual void slotDbgStdout(KProcess *proc, char *buf, int buflen) = 0;
+ virtual void slotDbgStderr(KProcess*, char*, int) {} ;
+ virtual void slotDbgWroteStdin(KProcess *proc) = 0;
+ virtual void slotDbgProcessExited(KProcess *proc) = 0;
+
+ virtual void slotAcceptConnection(int passive_socket) = 0;
+ virtual void slotReadFromSocket(int socket) = 0;
+
+signals:
+ void gotoSourcePosition (const QString &fileName, int lineNum);
+ void rawRDBBreakpointList (char *buf);
+ void rawRDBBreakpointSet (char *buf, int key);
+ void ttyStdout (const char *output);
+ void ttyStderr (const char *output);
+ void rdbStdout (const char *output);
+ void rdbStderr (const char *output);
+ void showStepInSource (const QString &fileName, int lineNum, const QString &address);
+ void dbgStatus (const QString &status, int statusFlag);
+
+protected:
+ KProcess *dbgProcess_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/dbgpsdlg.cpp b/languages/ruby/debugger/dbgpsdlg.cpp
new file mode 100644
index 00000000..83dd1666
--- /dev/null
+++ b/languages/ruby/debugger/dbgpsdlg.cpp
@@ -0,0 +1,170 @@
+/***************************************************************************
+ begin : Mon Sep 20 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "dbgpsdlg.h"
+
+#include <kbuttonbox.h>
+#include <kdialog.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kprocess.h>
+#include <kstdguiitem.h>
+#include <kdeversion.h>
+
+#include <qframe.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qtoolbutton.h>
+#include <qpushbutton.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+namespace RDBDebugger
+{
+
+/***************************************************************************/
+
+// Display a list of processes for the user to select one
+// only display processes that they can do something with so if the user
+// is root then display all processes
+// For use with the internal debugger, but this dialog doesn't know anything
+// about why it's doing it.
+
+Dbg_PS_Dialog::Dbg_PS_Dialog(QWidget *parent, const char *name)
+ : KDialog(parent, name, true), // modal
+ psProc_(0),
+ pids_(new QListBox(this)),
+ heading_(new QLabel(" ", this)),
+ pidLines_(QString())
+{
+ setCaption(i18n("Attach to Process"));
+
+ QBoxLayout *topLayout = new QVBoxLayout(this, 5);
+
+ heading_->setFont(KGlobalSettings::fixedFont());
+ heading_->setFrameStyle(QFrame::Panel|QFrame::Sunken);
+ heading_->setMaximumHeight(heading_->sizeHint().height());
+// heading_->setMinimumSize(heading_->sizeHint());
+ topLayout->addWidget(heading_, 5);
+
+ topLayout->addWidget(pids_, 5);
+ pids_->setFont(KGlobalSettings::fixedFont());
+
+ KButtonBox *buttonbox = new KButtonBox(this, Qt::Horizontal, 5);
+ QPushButton *ok = buttonbox->addButton(KStdGuiItem::ok());
+ buttonbox->addStretch();
+ QPushButton *cancel = buttonbox->addButton(KStdGuiItem::cancel());
+ buttonbox->layout();
+ topLayout->addWidget(buttonbox);
+
+ connect(ok, SIGNAL(clicked()), SLOT(accept()));
+ connect(cancel, SIGNAL(clicked()), SLOT(reject()));
+
+ psProc_ = new KShellProcess("/bin/sh");
+ #ifdef USE_SOLARIS
+ *psProc_ << "ps";
+ *psProc_ << "-opid";
+ *psProc_ << "-otty";
+ *psProc_ << "-os";
+ *psProc_ << "-otime";
+ *psProc_ << "-oargs";
+ pidCmd_ = "ps -opid -otty -os -otime -oargs";
+
+ if (getuid() == 0) {
+ *psProc_ << "-e";
+ pidCmd_ += " -e";
+ }
+ #else
+ *psProc_ << "ps";
+ *psProc_ << "x";
+ pidCmd_ = "ps x";
+
+ if (getuid() == 0) {
+ *psProc_ << "a";
+ pidCmd_ += " a";
+ }
+ #endif
+
+ connect( psProc_, SIGNAL(processExited(KProcess *)), SLOT(slotProcessExited()) );
+ connect( psProc_, SIGNAL(receivedStdout(KProcess *, char *, int)), SLOT(slotReceivedOutput(KProcess *, char *, int)) );
+ psProc_->start(KProcess::NotifyOnExit, KProcess::Stdout);
+
+ // Default display to 40 chars wide, default height is okay
+ resize( ((KGlobalSettings::fixedFont()).pointSize())*40, height());
+ topLayout->activate();
+}
+
+/***************************************************************************/
+
+Dbg_PS_Dialog::~Dbg_PS_Dialog()
+{
+ delete psProc_;
+}
+
+/***************************************************************************/
+
+int Dbg_PS_Dialog::pidSelected()
+{
+ QString pidText = pids_->text(pids_->currentItem());
+ if (!pidText.isEmpty())
+ return atoi(pidText.latin1());
+
+ return 0;
+}
+
+/***************************************************************************/
+
+void Dbg_PS_Dialog::slotReceivedOutput(KProcess */*proc*/, char *buffer, int buflen)
+{
+ pidLines_ += QString::fromLocal8Bit(buffer, buflen+1);
+}
+
+/***************************************************************************/
+
+void Dbg_PS_Dialog::slotProcessExited()
+{
+ delete psProc_;
+ psProc_ = 0;
+
+ pidLines_ += '\n';
+
+ int start = pidLines_.find('\n', 0); // Skip the first line (header line)
+ int pos;
+ if (start != -1)
+ heading_->setText(pidLines_.left(start));
+ while ( (pos = pidLines_.find('\n', start)) != -1) {
+ QString item = pidLines_.mid(start, pos-start);
+ if (!item.isEmpty()) {
+ if (item.find(pidCmd_) == -1)
+ pids_->insertItem(item);
+ }
+
+ start = pos+1;
+ }
+}
+
+}
+
+/***************************************************************************/
+#include "dbgpsdlg.moc"
diff --git a/languages/ruby/debugger/dbgpsdlg.h b/languages/ruby/debugger/dbgpsdlg.h
new file mode 100644
index 00000000..641f7aa5
--- /dev/null
+++ b/languages/ruby/debugger/dbgpsdlg.h
@@ -0,0 +1,60 @@
+/***************************************************************************
+ begin : Mon Sep 20 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DBGPSDLG_H_
+#define _DBGPSDLG_H_
+
+#include <kdialog.h>
+
+class QListBox;
+class KProcess;
+class QLabel;
+
+namespace RDBDebugger
+{
+
+/***************************************************************************/
+
+class Dbg_PS_Dialog : public KDialog
+{
+ Q_OBJECT
+
+public:
+ Dbg_PS_Dialog( QWidget *parent=0, const char *name=0 );
+ ~Dbg_PS_Dialog();
+
+ int pidSelected();
+
+private slots:
+ void slotReceivedOutput(KProcess *proc, char *buffer, int buflen);
+ void slotProcessExited();
+
+private:
+ KProcess* psProc_;
+ QListBox* pids_;
+ QLabel* heading_;
+ QString pidLines_;
+ QString pidCmd_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/dbgtoolbar.cpp b/languages/ruby/debugger/dbgtoolbar.cpp
new file mode 100644
index 00000000..702c8e83
--- /dev/null
+++ b/languages/ruby/debugger/dbgtoolbar.cpp
@@ -0,0 +1,483 @@
+/***************************************************************************
+ begin : Thu Dec 23 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "dbgtoolbar.h"
+#include "debuggerpart.h"
+#include "dbgcontroller.h"
+
+#include <kdockwindow.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kstandarddirs.h>
+#include <kwin.h>
+#include <kwinmodule.h>
+
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// Implements a floating toolbar for the debugger.
+
+// Unfortunately, I couldn't get the KToolBar to work nicely when it
+// was floating, so I was forced to write these classes. I'm not sure whether
+// I didn't try hard enough or ... and I've forgotten what the problems were
+// now.
+
+// The problem with using this is that it will not dock as a normal toolbar.
+// I'm not convince that this is a real problem though.
+
+// So, if you can get it to work as a KToolBar, and it works well when the
+// app is running, then all these classes can be removed.
+
+// This code is very specific to the internal debugger in kdevelop.
+
+namespace RDBDebugger
+{
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// This just allows the user to click on the toolbar and drag it somewhere else.
+// I would have preferred to use normal decoration on the toolbar and removed
+// the iconify, close, etc buttons from the window title but again I kept running
+// into problems. Instead, I used no decoration and this class. Also this looks
+// similar to the KToolBar floating style.
+class DbgMoveHandle : public QFrame
+{
+public:
+ DbgMoveHandle(DbgToolBar *parent=0, const char * name=0, WFlags f=0);
+ virtual ~DbgMoveHandle();
+
+ virtual void mousePressEvent(QMouseEvent *e);
+ virtual void mouseReleaseEvent(QMouseEvent *e);
+ virtual void mouseMoveEvent(QMouseEvent *e);
+
+private:
+ DbgToolBar* toolBar_;
+ QPoint offset_;
+ bool moving_;
+};
+
+// **************************************************************************
+
+DbgMoveHandle::DbgMoveHandle(DbgToolBar *parent, const char * name, WFlags f)
+ : QFrame(parent, name, f),
+ toolBar_(parent),
+ offset_(QPoint(0,0)),
+ moving_(false)
+{
+ setFrameStyle(QFrame::Panel|QFrame::Raised);
+ setFixedHeight(12);
+}
+
+// **************************************************************************
+
+DbgMoveHandle::~DbgMoveHandle()
+{
+}
+
+// **************************************************************************
+
+void DbgMoveHandle::mousePressEvent(QMouseEvent *e)
+{
+ QFrame::mousePressEvent(e);
+ if (moving_)
+ return;
+
+ if (e->button() == RightButton) {
+ KPopupMenu *menu = new KPopupMenu(this);
+ menu->insertTitle(i18n("Debug Toolbar"));
+ menu->insertItem(i18n("Dock to Panel"),
+ parent(), SLOT(slotDock()));
+ menu->insertItem(i18n("Dock to Panel && Iconify KDevelop"),
+ parent(), SLOT(slotIconifyAndDock()));
+ menu->popup(e->globalPos());
+ } else {
+ moving_ = true;
+ offset_ = parentWidget()->pos() - e->globalPos();
+ setFrameStyle(QFrame::Panel|QFrame::Sunken);
+ QApplication::setOverrideCursor(QCursor(sizeAllCursor));
+ setPalette(QPalette(colorGroup().background()));
+ repaint();
+ }
+}
+
+// **************************************************************************
+
+void DbgMoveHandle::mouseReleaseEvent(QMouseEvent *e)
+{
+ QFrame::mouseReleaseEvent(e);
+ moving_ = false;
+ offset_ = QPoint(0,0);
+ setFrameStyle(QFrame::Panel|QFrame::Raised);
+ QApplication::restoreOverrideCursor();
+ setPalette(QPalette(colorGroup().background()));
+ repaint();
+}
+
+// **************************************************************************
+
+void DbgMoveHandle::mouseMoveEvent(QMouseEvent *e)
+{
+ QFrame::mouseMoveEvent(e);
+ if (!moving_)
+ return;
+
+ toolBar_->move(e->globalPos() + offset_);
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// This class adds text _and_ a pixmap to a button. Why doesn't QPushButton
+// support that? It only allowed text _or_ pixmap.
+class DbgButton : public QPushButton
+{
+public:
+ DbgButton(const QPixmap &pixmap, const QString &text,
+ DbgToolBar *parent, const char *name=0);
+ virtual ~DbgButton() {};
+ void drawButtonLabel(QPainter *painter);
+ QSize sizeHint() const;
+
+private:
+ QPixmap pixmap_;
+};
+
+// **************************************************************************
+
+DbgButton::DbgButton(const QPixmap& pixmap, const QString& text,
+ DbgToolBar* parent, const char* name)
+ : QPushButton(parent, name),
+ pixmap_(pixmap)
+{
+ setText(text);
+}
+
+// **************************************************************************
+
+void DbgButton::drawButtonLabel(QPainter *painter)
+{
+ // We always have a pixmap (today...)
+ // Centre it if there's no text
+
+ bool hasText = !text().isEmpty();
+ int x = ((hasText ? height() : width()) - pixmap_.width()) / 2;
+ int y = (height() - pixmap_.height()) / 2;
+ painter->drawPixmap(x, y, pixmap_);
+
+ if (hasText) {
+ painter->setPen(colorGroup().text());
+ painter->drawText(height()+2, 0, width()-(height()+2), height(), AlignLeft|AlignVCenter, text());
+ }
+}
+
+// **************************************************************************
+
+QSize DbgButton::sizeHint() const
+{
+ if (text().isEmpty())
+ return pixmap_.size();
+ else
+ return QPushButton::sizeHint();
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+DbgDocker::DbgDocker(QWidget* parent, DbgToolBar* toolBar, const QPixmap& pixmap) :
+ KSystemTray(parent, "DbgDocker"),
+ toolBar_(toolBar)
+{
+ setPixmap(pixmap);
+ QToolTip::add( this, i18n("KDevelop ruby debugger: Click to execute one line of code (\"step\")") );
+}
+
+// **************************************************************************
+
+void DbgDocker::mousePressEvent(QMouseEvent *e)
+{
+ if (!rect().contains( e->pos()))
+ return;
+
+ switch (e->button()) {
+ case LeftButton:
+ {
+ // Not really a click, but it'll hold for the time being !!!
+ emit clicked();
+ break;
+ }
+ case RightButton:
+ {
+ KPopupMenu* menu = new KPopupMenu(this);
+ menu->insertTitle(i18n("Debug Toolbar"));
+ menu->insertItem(i18n("Activate"), toolBar_, SLOT(slotUndock()));
+ menu->insertItem(i18n("Activate (KDevelop gets focus)"), toolBar_, SLOT(slotActivateAndUndock()));
+ menu->popup(e->globalPos());
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+DbgToolBar::DbgToolBar(RubyDebuggerPart* part,
+ QWidget* parent, const char* name)
+ : QFrame(0, name),
+ part_(part),
+ activeWindow_(0),
+ winModule_(0),
+ bKDevFocus_(0),
+ bPrevFocus_(0),
+ appIsActive_(false),
+ docked_(false),
+ docker_(0),
+ dockWindow_(new KSystemTray(parent))
+{
+ winModule_ = new KWinModule(this);
+ docker_ = new DbgDocker(parent, this, BarIcon("dbgnext"));
+ connect(docker_, SIGNAL(clicked()), part_, SLOT(slotStepOver()));
+
+ // Must have noFocus set so that we can see what window was active.
+ // see slotDbgKdevFocus() for more comments
+ // I do not want the user to be able to "close" this widget. If we have any
+ // decoration then they can and that is bad.
+ // This widget is closed when the debugger finishes i.e. they press "Stop"
+
+ // Do we need NoFocus???
+ KWin::setState(winId(), NET::StaysOnTop | NET::Modal | NET::SkipTaskbar);
+// KWin::setType(winId(), NET::Override); // So it has no decoration
+ KWin::setType(winId(), NET::Dock);
+
+ setFocusPolicy(NoFocus);
+ setFrameStyle( QFrame::Box | QFrame::Plain );
+ setLineWidth(4);
+ setMidLineWidth(0);
+
+ QBoxLayout* topLayout = new QVBoxLayout(this);
+
+ QBoxLayout* nextLayout = new QHBoxLayout();
+ QBoxLayout* stepLayout = new QHBoxLayout();
+ QBoxLayout* focusLayout = new QHBoxLayout();
+
+ DbgMoveHandle* moveHandle= new DbgMoveHandle(this);
+
+ QPushButton* bRun = new DbgButton(BarIcon("dbgrun"), i18n("Run"), this);
+ QPushButton* bInterrupt = new DbgButton(BarIcon("player_pause"), i18n("Interrupt"), this);
+ QPushButton* bNext = new DbgButton(BarIcon("dbgnext"), i18n("Step Over"), this);
+ QPushButton* bStep = new DbgButton(BarIcon("dbgstep"), i18n("Step Into"), this);
+ QPushButton* bFinish = new DbgButton(BarIcon("dbgstepout"), i18n("Step Out"), this);
+ QPushButton* bRunTo = new DbgButton(BarIcon("dbgrunto"), i18n("Run to Cursor"), this);
+ bPrevFocus_ = new DbgButton(BarIcon("dbgmemview"), QString::null, this);
+ bKDevFocus_ = new DbgButton(BarIcon("kdevelop"), QString::null, this);
+
+ connect(bRun, SIGNAL(clicked()), part_, SLOT(slotRun()));
+ connect(bInterrupt, SIGNAL(clicked()), part_, SLOT(slotPause()));
+ connect(bNext, SIGNAL(clicked()), part_, SLOT(slotStepOver()));
+ connect(bStep, SIGNAL(clicked()), part_, SLOT(slotStepInto()));
+ connect(bFinish, SIGNAL(clicked()), part_, SLOT(slotStepOut()));
+ connect(bRunTo, SIGNAL(clicked()), part_, SLOT(slotRunToCursor()));
+ connect(bKDevFocus_, SIGNAL(clicked()), this, SLOT(slotKdevFocus()));
+ connect(bPrevFocus_, SIGNAL(clicked()), this, SLOT(slotPrevFocus()));
+
+ QToolTip::add( bRun, i18n("Continue with application execution, may start the application") );
+ QToolTip::add( bInterrupt, i18n("Interrupt the application execution") );
+ QToolTip::add( bNext, i18n("Execute one line of code, but run through methods") );
+ QToolTip::add( bStep, i18n("Execute one line of code, stepping into methods if appropriate") );
+ QToolTip::add( bFinish, i18n("Execute to end of current stack frame") );
+ QToolTip::add( bRunTo, i18n("Continues execution until the cursor position is reached.") );
+ QToolTip::add( bKDevFocus_, i18n("Set focus on KDevelop") );
+ QToolTip::add( bPrevFocus_, i18n("Set focus on window that had focus when KDevelop got focus") );
+
+ QWhatsThis::add( bRun, i18n("Continue with application execution. May start the application.") );
+ QWhatsThis::add( bInterrupt, i18n("Interrupt the application execution.") );
+ QWhatsThis::add( bNext, i18n("Execute one line of code, but run through methods.") );
+
+ QWhatsThis::add( bStep, i18n("Execute one line of code, stepping into methods if appropriate.") );
+
+ QWhatsThis::add( bFinish, i18n("Execute to end of current stack frame.") );
+ QWhatsThis::add( bRunTo, i18n("Continues execution until the cursor position is reached.") );
+ QWhatsThis::add( bKDevFocus_, i18n("Set focus on KDevelop.") );
+ QWhatsThis::add( bPrevFocus_, i18n("Set focus on window that had focus when KDevelop got focus.") );
+
+ topLayout->addWidget(moveHandle);
+ topLayout->addWidget(bRun);
+ topLayout->addLayout(nextLayout);
+ topLayout->addLayout(stepLayout);
+ topLayout->addWidget(bFinish);
+ topLayout->addWidget(bRunTo);
+ topLayout->addWidget(bInterrupt);
+ topLayout->addLayout(focusLayout);
+
+ focusLayout->addWidget(bKDevFocus_);
+ focusLayout->addWidget(bPrevFocus_);
+
+ stepLayout->addWidget(bStep);
+
+ nextLayout->addWidget(bNext);
+
+// int w = QMAX(bRun->sizeHint().width(), bFinish->sizeHint().width());
+// w = QMAX(w, bInterrupt->sizeHint().width());
+// w = QMAX(w, bView->sizeHint().width());
+
+ // they should have the same height, so don't be too fussy
+// int h = bFinish->sizeHint().height();
+//
+// bNext->setMinimumHeight(h);
+// bNexti->setMinimumHeight(h);
+// bStep->setMinimumHeight(h);
+// bStepi->setMinimumHeight(h);
+// bKDevFocus_->setMinimumHeight(h);
+// bPrevFocus_->setMinimumHeight(h);
+
+// setMinimumSize(w+10, h*7);
+// setMaximumSize(w+10, h*7);
+
+ setAppIndicator(appIsActive_);
+ topLayout->activate();
+}
+
+// **************************************************************************
+
+DbgToolBar::~DbgToolBar()
+{
+ slotUndock();
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotKdevFocus()
+{
+ // I really want to be able to set the focus on the _application_ being debugged
+ // but this is the best compromise I can come up with. All we do is save the
+ // window that had focus when they switch to the kdevelop window. To do this
+ // the toolbar _cannot_ accept focus.
+ // If anyone has a way of determining what window the app is _actually_ running on
+ // then please fix and send a patch.
+
+ if (winModule_->activeWindow() != topLevelWidget()->winId())
+ activeWindow_ = winModule_->activeWindow();
+
+ KWin::activateWindow(topLevelWidget()->winId());
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotPrevFocus()
+{
+ KWin::activateWindow(activeWindow_);
+}
+
+// **************************************************************************
+
+// If the app is active then the app button is highlighted, otherwise
+// kdev button is highlighted.
+void DbgToolBar::slotDbgStatus(const QString&, int state)
+{
+ bool appIndicator = state & s_appBusy;
+ if (appIndicator != appIsActive_) {
+ setAppIndicator(appIndicator);
+ appIsActive_ = appIndicator;
+ }
+}
+
+// **************************************************************************
+
+void DbgToolBar::setAppIndicator(bool appIndicator)
+{
+ if (appIndicator) {
+ bPrevFocus_->setPalette(QPalette(colorGroup().mid()));
+ bKDevFocus_->setPalette(QPalette(colorGroup().background()));
+ } else {
+ bPrevFocus_->setPalette(QPalette(colorGroup().background()));
+ bKDevFocus_->setPalette(QPalette(colorGroup().mid()));
+ }
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotDock()
+{
+ if (docked_)
+ return;
+
+ // Q_ASSERT(!docker_);
+ hide();
+
+ docker_->show();
+ docked_ = true;
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotIconifyAndDock()
+{
+ if (docked_)
+ return;
+
+ // KWin::iconifyWindow(ckDevelop_->winId(), true);
+ slotDock();
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotUndock()
+{
+ if (!docked_)
+ return;
+
+ show();
+ docker_->hide();
+ docked_ = false;
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotActivateAndUndock()
+{
+ if (!docked_)
+ return;
+
+ KWin::activateWindow(topLevelWidget()->winId());
+ slotUndock();
+}
+
+}
+
+// **************************************************************************
+#include "dbgtoolbar.moc"
diff --git a/languages/ruby/debugger/dbgtoolbar.h b/languages/ruby/debugger/dbgtoolbar.h
new file mode 100644
index 00000000..a19b2eae
--- /dev/null
+++ b/languages/ruby/debugger/dbgtoolbar.h
@@ -0,0 +1,90 @@
+/***************************************************************************
+ begin : Thu Dec 23 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 *q
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DBGTOOLBAR_H_
+#define _DBGTOOLBAR_H_
+
+class KWinModule;
+
+#include <ksystemtray.h>
+#include <kwin.h> // needed for WId :(
+
+#include <qframe.h>
+
+namespace RDBDebugger
+{
+
+class DbgButton;
+class DbgToolBar;
+class RubyDebuggerPart;
+
+class DbgDocker : public KSystemTray
+{
+ Q_OBJECT
+
+public:
+ DbgDocker(QWidget *parent, DbgToolBar *toolBar, const QPixmap &pixmap);
+ virtual ~DbgDocker() {};
+ virtual void mousePressEvent(QMouseEvent *e);
+
+signals:
+ void clicked();
+
+private:
+ DbgToolBar* toolBar_;
+};
+
+
+class DbgToolBar : public QFrame
+{
+ Q_OBJECT
+
+public:
+ DbgToolBar(RubyDebuggerPart *part, QWidget* parent, const char* name=0);
+ virtual ~DbgToolBar();
+
+private slots:
+ void slotDbgStatus(const QString&, int);
+ void slotDock();
+ void slotUndock();
+ void slotIconifyAndDock();
+ void slotActivateAndUndock();
+
+ void slotKdevFocus();
+ void slotPrevFocus();
+
+private:
+ void setAppIndicator(bool appIndicator);
+
+ RubyDebuggerPart* part_;
+ WId activeWindow_;
+ KWinModule* winModule_;
+ DbgButton* bKDevFocus_;
+ DbgButton* bPrevFocus_;
+ bool appIsActive_;
+ bool docked_;
+ DbgDocker* docker_;
+ KSystemTray* dockWindow_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/debuggee.rb b/languages/ruby/debugger/debuggee.rb
new file mode 100644
index 00000000..38e2dea7
--- /dev/null
+++ b/languages/ruby/debugger/debuggee.rb
@@ -0,0 +1,1214 @@
+# Copyright (C) 2000 Network Applied Communication Laboratory, Inc.
+# Copyright (C) 2000 Information-technology Promotion Agency, Japan
+# Copyright (C) 2000-2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>
+
+# Changes for the FreeRIDE IDE by Laurent JULLIARD. FreeRIDE uses
+# Distributed ruby (DRuby) to communicate with the debugger back
+# end. However, this can't interoperate with C++ in KDevelop and so
+# a Unix domain socket connection is used instead.
+
+# Adapted for KDevelop debugging
+# ------------------------------
+# begin : Mon Nov 1 2004
+# copyright : (C) 2004 by Richard Dale
+# email : Richard_Dale@tipitina.demon.co.uk
+
+if $SAFE > 0
+ STDERR.print "-r debug.rb is not available in safe mode\n"
+ exit 1
+end
+
+require 'tracer'
+require 'pp'
+require 'rbconfig'
+
+class Tracer
+ def Tracer.trace_func(*vars)
+ Single.trace_func(*vars)
+ end
+end
+
+# FreeRIDE/KDevelop must always intercept exits hence the exit! redefinition
+# at_exit calls the quit method to cleanly disconnect from the
+# FreeRIDE/KDevelop debugger client
+module Kernel
+ alias_method :exit!, :exit
+end
+
+BEGIN {
+ at_exit do
+ set_trace_func nil
+ DEBUGGER__.quit
+ end
+}
+
+SCRIPT_LINES__ = {} unless defined? SCRIPT_LINES__
+
+class DEBUGGER__
+class Mutex
+ def initialize
+ @locker = nil
+ @waiting = []
+ @locked = false;
+ end
+
+ def locked?
+ @locked
+ end
+
+ def lock
+ return if Thread.critical
+ return if @locker == Thread.current
+ while (Thread.critical = true; @locked)
+ @waiting.push Thread.current
+ Thread.stop
+ end
+ @locked = true
+ @locker = Thread.current
+ Thread.critical = false
+ self
+ end
+
+ def unlock
+ return if Thread.critical
+ return unless @locked
+ unless @locker == Thread.current
+ raise RuntimeError, "unlocked by other"
+ end
+ Thread.critical = true
+ t = @waiting.shift
+ @locked = false
+ @locker = nil
+ Thread.critical = false
+ t.run if t
+ self
+ end
+end
+MUTEX = Mutex.new
+
+class Context
+ DEBUG_LAST_CMD = []
+
+ def readline(prompt_cmd, hist)
+ DEBUGGER__.client.readline(prompt_cmd)
+ end
+
+ def initialize
+ if Thread.current == Thread.main
+ @stop_next = 1
+ else
+ @stop_next = 0
+ end
+ @last_file = nil
+ @file = nil
+ @line = nil
+ @no_step = nil
+ @frames = []
+ @finish_pos = 0
+ @trace = false
+ @trace_ruby = false
+ @catch = "StandardError"
+ @suspend_next = false
+ end
+
+ def stop_next(n=1)
+ @stop_next = n
+ end
+
+ def set_suspend
+ @suspend_next = true
+ end
+
+ def clear_suspend
+ @suspend_next = false
+ end
+
+ def suspend_all
+ DEBUGGER__.suspend
+ end
+
+ def resume_all
+ DEBUGGER__.resume
+ end
+
+ def check_suspend
+ return if Thread.critical
+ while (Thread.critical = true; @suspend_next)
+ DEBUGGER__.waiting.push Thread.current
+ @suspend_next = false
+ Thread.stop
+ end
+ Thread.critical = false
+ end
+
+ def trace?
+ @trace
+ end
+
+ def set_trace(arg)
+ @trace = arg
+ end
+
+ def trace_ruby?
+ @trace_ruby
+ end
+
+ def set_trace_ruby(arg)
+ @trace_ruby = arg
+ end
+
+ def stdout
+ DEBUGGER__.stdout
+ end
+
+ def break_points
+ DEBUGGER__.break_points
+ end
+
+ def display
+ DEBUGGER__.display
+ end
+
+ def context(th)
+ DEBUGGER__.context(th)
+ end
+
+ def set_trace_all(arg)
+ DEBUGGER__.set_trace(arg)
+ end
+
+ def set_last_thread(th)
+ DEBUGGER__.set_last_thread(th)
+ end
+
+ def debug_eval(str, binding)
+ begin
+ val = eval(str, binding)
+ rescue StandardError, ScriptError => e
+ at = eval("caller(1)", binding)
+ stdout.printf "%s:%s\n", at.shift, e.to_s.sub(/\(eval\):1:(in `.*?':)?/, '')
+ for i in at
+ stdout.printf "\tfrom %s\n", i
+ end
+ throw :debug_error
+ end
+ end
+
+ def debug_silent_eval(str, binding)
+ begin
+ eval(str, binding)
+ rescue StandardError, ScriptError
+ nil
+ end
+ end
+
+ # Temporarily change the pretty_print methods to not expand arrays
+ # and hashes, just give the length
+ def customize_debug_pp
+ Array.module_eval %q{
+ def pretty_print(pp)
+ pp.pp "Array (%d element(s))" % length
+ end
+ }
+
+ Hash.module_eval %q{
+ def pretty_print(pp)
+ pp.pp "Hash (%d element(s))" % length
+ end
+ }
+ end
+
+ # Restore the original pretty_print methods for arrays and hashes
+ def restore_debug_pp
+ Array.module_eval %q{
+ def pretty_print(q)
+ q.group(1, '[', ']') {
+ self.each {|v|
+ q.comma_breakable unless q.first?
+ q.pp v
+ }
+ }
+ end
+ }
+ Hash.module_eval %q{
+ def pretty_print(q)
+ q.pp_hash self
+ end
+ }
+ end
+
+ # Prevent the 'var *' commands from expanding Arrays and Hashes
+ # This could be done by redefining inspect, but that would affect
+ # everywhere not just here and in the pp command.
+ def debug_inspect(obj)
+ if obj.kind_of? Array
+ "Array (%d element(s))" % obj.length
+ elsif obj.kind_of? Hash
+ "Hash (%d element(s))" % obj.length
+ elsif obj.kind_of? String
+ str = obj.inspect
+ if str.length > 255
+ "String (length %d)" % obj.length
+ else
+ str
+ end
+ else
+ obj.inspect
+ end
+ end
+
+ def var_list(ary, binding)
+ ary.sort!
+ for v in ary
+ stdout.printf " %s => %s\n", v, debug_inspect(eval(v, binding))
+ end
+ end
+
+ def const_list(ary, obj)
+ ary.sort!
+ for c in ary
+ str = debug_inspect(obj.module_eval(c))
+ if c.to_s != str &&
+ str !~ /^Qt::|^KDE::/ && c.to_s !~ /@@classes$|@@cpp_names$|@@idclass$|@@debug_level$/ &&
+ c.to_s !~ /^DCOPMeta$|^Meta$|SCRIPT_LINES__|TRUE|FALSE|NIL|MatchingData/ &&
+ c.to_s !~ /^PLATFORM$|^RELEASE_DATE$|^VERSION$|SilentClient|SilentObject/ &&
+ c.to_s !~ /^Client$|^Context$|^DEBUG_LAST_CMD$|^MUTEX$|^Mutex$|^SimpleDelegater$|^Delegater$/ &&
+ c.to_s !~ /IPsocket|IPserver|UDPsocket|UDPserver|TCPserver|TCPsocket|UNIXserver|UNIXsocket/
+ if c.to_s == "ENV"
+ stdout.printf " %s => Hash (%d element(s))\n", c, obj.module_eval(c).length
+ else
+ stdout.printf " %s => %s\n", c, str
+ end
+ end
+ end
+ end
+
+ def debug_variable_info(input, binding)
+ case input
+ when /^\s*g(?:lobal)?$/
+ var_list(global_variables, binding)
+
+ when /^\s*l(?:ocal)?$/
+ var_list(eval("local_variables", binding) << "self", binding)
+
+ when /^\s*i(?:nstance)?\s+/
+ obj = debug_eval($', binding)
+ var_list(obj.instance_variables, obj.instance_eval{binding()})
+
+ when /^\s*cl(?:ass)?\s+/
+ obj = debug_eval($', binding)
+ unless obj.kind_of? Module
+ stdout.print "Should be Class/Module: ", $', "\n"
+ else
+ const_list(obj.class_variables, obj)
+ end
+
+ when /^\s*c(?:onst(?:ant)?)?\s+/
+ obj = debug_eval($', binding)
+ unless obj.kind_of? Module
+ stdout.print "Should be Class/Module: ", $', "\n"
+ else
+ const_list(obj.constants, obj)
+ end
+ end
+ end
+
+ def debug_method_info(input, binding)
+ case input
+ when /^i(:?nstance)?\s+/
+ obj = debug_eval($', binding)
+
+ len = 0
+ for v in obj.methods.sort
+ len += v.size + 1
+ if len > 70
+ len = v.size + 1
+ stdout.print "\n"
+ end
+ stdout.print v, " "
+ end
+ stdout.print "\n"
+
+ else
+ obj = debug_eval(input, binding)
+ unless obj.kind_of? Module
+ stdout.print "Should be Class/Module: ", input, "\n"
+ else
+ len = 0
+ for v in obj.instance_methods(false).sort
+ len += v.size + 1
+ if len > 70
+ len = v.size + 1
+ stdout.print "\n"
+ end
+ stdout.print v, " "
+ end
+ stdout.print "\n"
+ end
+ end
+ end
+
+ def thnum
+ num = DEBUGGER__.instance_eval{@thread_list[Thread.current]}
+ unless num
+ DEBUGGER__.make_thread_list
+ num = DEBUGGER__.instance_eval{@thread_list[Thread.current]}
+ end
+ num
+ end
+
+ def debug_command(file, line, id, binding)
+ MUTEX.lock
+ set_last_thread(Thread.current)
+ frame_pos = 0
+ binding_file = file
+ binding_line = line
+ previous_line = nil
+ if ENV['EMACS']
+ stdout.printf "\032\032%s:%d:\n", binding_file, binding_line
+ else
+ stdout.printf "%s:%d:%s", binding_file, binding_line,
+ line_at(binding_file, binding_line)
+ end
+ @frames[0] = [binding, file, line, id]
+ display_expressions(binding)
+ prompt = true
+ while prompt and input = readline("(rdb:%d) "%thnum(), true)
+ catch(:debug_error) do
+ if input == ""
+ next unless DEBUG_LAST_CMD[0]
+ input = DEBUG_LAST_CMD[0]
+ stdout.print input, "\n"
+ else
+ DEBUG_LAST_CMD[0] = input
+ end
+
+ case input
+ when /^\s*trace_ruby(?:\s+(on|off))?$/
+ if defined?( $1 )
+ if $1 == 'on'
+ set_trace_ruby true
+ else
+ set_trace_ruby false
+ end
+ end
+
+ when /^\s*tr(?:ace)?(?:\s+(on|off))?(?:\s+(all))?$/
+ if defined?( $2 )
+ if $1 == 'on'
+ set_trace_all true
+ else
+ set_trace_all false
+ end
+ elsif defined?( $1 )
+ if $1 == 'on'
+ set_trace true
+ else
+ set_trace false
+ end
+ end
+ if trace?
+ stdout.print "Trace on.\n"
+ else
+ stdout.print "Trace off.\n"
+ end
+
+ when /^\s*b(?:reak)?\s+(?:(.+):)?([^.:]+)$/
+ pos = $2
+ if $1
+ klass = debug_silent_eval($1, binding)
+# file = $1
+ file = File.expand_path($1)
+ end
+ if pos =~ /^\d+$/
+ pname = pos
+ pos = pos.to_i
+ else
+ pname = pos = pos.intern.id2name
+ end
+ break_points.push [true, 0, klass || file, pos]
+ stdout.printf "Set breakpoint %d at %s:%s\n", break_points.size, klass || file, pname
+
+ when /^\s*b(?:reak)?\s+(.+)[#.]([^.:]+)$/
+ pos = $2.intern.id2name
+ klass = debug_eval($1, binding)
+ break_points.push [true, 0, klass, pos]
+ stdout.printf "Set breakpoint %d at %s.%s\n", break_points.size, klass, pos
+
+ when /^\s*wat(?:ch)?\s+(.+)$/
+ exp = $1
+ break_points.push [true, 1, exp]
+ stdout.printf "Set watchpoint %d\n", break_points.size, exp
+
+ when /^\s*b(?:reak)?$/
+ if break_points.find{|b| b[1] == 0}
+ n = 1
+ stdout.print "Breakpoints:\n"
+ for b in break_points
+ if b[0] and b[1] == 0
+ stdout.printf " %d %s:%s\n", n, b[2], b[3]
+ end
+ n += 1
+ end
+ end
+ if break_points.find{|b| b[1] == 1}
+ n = 1
+ stdout.print "\n"
+ stdout.print "Watchpoints:\n"
+ for b in break_points
+ if b[0] and b[1] == 1
+ stdout.printf " %d %s\n", n, b[2]
+ end
+ n += 1
+ end
+ end
+ if break_points.size == 0
+ stdout.print "No breakpoints\n"
+ else
+ stdout.print "\n"
+ end
+
+ when /^\s*del(?:ete)?(?:\s+(\d+))?$/
+ pos = $1
+ unless pos
+# input = readline("Clear all breakpoints? (y/n) ", false)
+# if input == "y"
+ for b in break_points
+ b[0] = false
+ end
+# end
+ else
+ pos = pos.to_i
+ if break_points[pos-1]
+ break_points[pos-1][0] = false
+ else
+ stdout.printf "Breakpoint %d is not defined\n", pos
+ end
+ end
+
+ when /^\s*disp(?:lay)?\s+(.+)$/
+ exp = $1
+ display.push [true, exp]
+ stdout.printf "%d: ", display.size
+ display_expression(exp, binding)
+
+ when /^\s*disp(?:lay)?$/
+ display_expressions(binding)
+
+ when /^\s*undisp(?:lay)?(?:\s+(\d+))?$/
+ pos = $1
+ unless pos
+# input = readline("Clear all expressions? (y/n) ", false)
+# if input == "y"
+ for d in display
+ d[0] = false
+ end
+# end
+ else
+ pos = pos.to_i
+ if display[pos-1]
+ display[pos-1][0] = false
+ else
+ stdout.printf "Display expression %d is not defined\n", pos
+ end
+ end
+
+ when /^\s*c(?:ont)?$/
+ prompt = false
+
+ when /^\s*s(?:tep)?(?:\s+(\d+))?$/
+ if $1
+ lev = $1.to_i
+ else
+ lev = 1
+ end
+ @stop_next = lev
+ prompt = false
+
+ when /^\s*n(?:ext)?(?:\s+(\d+))?$/
+ if $1
+ lev = $1.to_i
+ else
+ lev = 1
+ end
+ @stop_next = lev
+ @no_step = @frames.size - frame_pos
+ prompt = false
+
+ when /^\s*w(?:here)?$/, /^\s*f(?:rame)?$/
+ display_frames(frame_pos)
+
+ when /^\s*l(?:ist)?(?:\s+(.+))?$/
+ if not $1
+ b = previous_line ? previous_line + 10 : binding_line - 5
+ e = b + 9
+ elsif $1 == '-'
+ b = previous_line ? previous_line - 10 : binding_line - 5
+ e = b + 9
+ else
+ b, e = $1.split(/[-,]/)
+ if e
+ b = b.to_i
+ e = e.to_i
+ else
+ b = b.to_i - 5
+ e = b + 9
+ end
+ end
+ previous_line = b
+ display_list(b, e, binding_file, binding_line)
+
+ when /^\s*up(?:\s+(\d+))?$/
+ previous_line = nil
+ if $1
+ lev = $1.to_i
+ else
+ lev = 1
+ end
+ frame_pos += lev
+ if frame_pos >= @frames.size
+ frame_pos = @frames.size - 1
+ stdout.print "At toplevel\n"
+ end
+ binding, binding_file, binding_line = @frames[frame_pos]
+ stdout.print format_frame(frame_pos)
+
+ when /^\s*down(?:\s+(\d+))?$/
+ previous_line = nil
+ if $1
+ lev = $1.to_i
+ else
+ lev = 1
+ end
+ frame_pos -= lev
+ if frame_pos < 0
+ frame_pos = 0
+ stdout.print "At stack bottom\n"
+ end
+ binding, binding_file, binding_line = @frames[frame_pos]
+ stdout.print format_frame(frame_pos)
+
+ when /^\s*fin(?:ish)?$/
+ if frame_pos == @frames.size
+ stdout.print "\"finish\" not meaningful in the outermost frame.\n"
+ else
+ @finish_pos = @frames.size - frame_pos
+ frame_pos = 0
+ prompt = false
+ end
+
+ when /^\s*cat(?:ch)?(?:\s+(.+))?$/
+ if $1
+ excn = $1
+ if excn == 'off'
+ @catch = nil
+ stdout.print "Clear catchpoint.\n"
+ else
+ @catch = excn
+ stdout.printf "Set catchpoint %s.\n", @catch
+ end
+ else
+ if @catch
+ stdout.printf "Catchpoint %s.\n", @catch
+ else
+ stdout.print "No catchpoint.\n"
+ end
+ end
+
+ when /^\s*q(?:uit)?$/
+# input = readline("Really quit? (y/n) ", false)
+# if input == "y"
+ exit! # exit -> exit!: No graceful way to stop threads...
+# end
+
+
+ when /^\s*v(?:ar)?\s+/
+ debug_variable_info($', binding)
+
+ when /^\s*m(?:ethod)?\s+/
+ debug_method_info($', binding)
+
+ when /^\s*th(?:read)?\s+/
+ if DEBUGGER__.debug_thread_info($', binding) == :cont
+ prompt = false
+ end
+
+ when /^\s*pp\s+/
+ obj_name = $'
+ obj = debug_eval($', binding)
+ customize_debug_pp
+ if obj.kind_of? Array
+ obj.each_index { |i| stdout.printf "[%d]=%s\n", i.to_s, debug_inspect(obj[i]) }
+ elsif obj.kind_of? Hash or obj_name =~ /^ENV$/
+ # Special case ENV to print like a hash
+ obj.each { |key, value| stdout.printf "[%s]=%s\n", key.inspect, debug_inspect(value) }
+ elsif obj.kind_of?(String) && obj.inspect.length > 255
+ # Assume long strings contain packed data and show them as a
+ # sequence of 12 byte slices in hex
+ i = 0
+ while i < obj.length
+ j = (i + 12 < obj.length ? i + 12 : obj.length) - 1
+ stdout.printf "[%d..%d]=0x", i, j
+ for k in i..j
+ stdout.printf "%2.2x", obj[k]
+ end
+ stdout.printf " %s\n", obj[i..j].dump
+
+ i += 12
+ end
+ else
+ PP.pp(obj, stdout)
+ end
+ restore_debug_pp
+
+ when /^\s*p\s+/
+ stdout.printf "%s\n", debug_eval($', binding).inspect
+
+ when /^\s*h(?:elp)?$/
+ debug_print_help()
+
+ else
+ v = debug_eval(input, binding)
+ stdout.printf "%s\n", v.inspect
+ end
+ end
+ end
+ MUTEX.unlock
+ resume_all
+ end
+
+ def debug_print_help
+ stdout.print <<EOHELP
+Debugger help v.-0.002b
+Commands
+ b[reak] [file|class:]<line|method>
+ b[reak] [class.]<line|method>
+ set breakpoint to some position
+ wat[ch] <expression> set watchpoint to some expression
+ cat[ch] <an Exception> set catchpoint to an exception
+ b[reak] list breakpoints
+ cat[ch] show catchpoint
+ del[ete][ nnn] delete some or all breakpoints
+ disp[lay] <expression> add expression into display expression list
+ undisp[lay][ nnn] delete one particular or all display expressions
+ c[ont] run until program ends or hit breakpoint
+ s[tep][ nnn] step (into methods) one line or till line nnn
+ n[ext][ nnn] go over one line or till line nnn
+ w[here] display frames
+ f[rame] alias for where
+ l[ist][ (-|nn-mm)] list program, - lists backwards
+ nn-mm lists given lines
+ up[ nn] move to higher frame
+ down[ nn] move to lower frame
+ fin[ish] return to outer frame
+ tr[ace] (on|off) set trace mode of current thread
+ tr[ace] (on|off) all set trace mode of all threads
+ q[uit] exit from debugger
+ v[ar] g[lobal] show global variables
+ v[ar] l[ocal] show local variables
+ v[ar] i[nstance] <object> show instance variables of object
+ v[ar] cl[ass] <object> show class variables of object
+ v[ar] c[onst] <object> show constants of object
+ m[ethod] i[nstance] <obj> show methods of object
+ m[ethod] <class|module> show instance methods of class or module
+ th[read] l[ist] list all threads
+ th[read] c[ur[rent]] show current thread
+ th[read] [sw[itch]] <nnn> switch thread context to nnn
+ th[read] stop <nnn> stop thread nnn
+ th[read] resume <nnn> resume thread nnn
+ p expression evaluate expression and print its value
+ h[elp] print this help
+ <everything else> evaluate
+EOHELP
+ end
+
+ def display_expressions(binding)
+ n = 1
+ for d in display
+ if d[0]
+ stdout.printf "%d: ", n
+ display_expression(d[1], binding)
+ end
+ n += 1
+ end
+ end
+
+ def display_expression(exp, binding)
+ stdout.printf "%s = %s\n", exp, debug_silent_eval(exp, binding).to_s
+ end
+
+ def frame_set_pos(file, line)
+ if @frames[0]
+ @frames[0][1] = file
+ @frames[0][2] = line
+ end
+ end
+
+ def display_frames(pos)
+ 0.upto(@frames.size - 1) do |n|
+ if n == pos
+ stdout.print "--> "
+ else
+ stdout.print " "
+ end
+ stdout.print format_frame(n)
+ end
+ end
+
+ def format_frame(pos)
+ bind, file, line, id = @frames[pos]
+ sprintf "#%d %s:%s%s\n", pos + 1, file, line,
+ (id ? ":in `#{id.id2name}'" : "")
+ end
+
+ def display_list(b, e, file, line)
+ stdout.printf "[%d, %d] in %s\n", b, e, file
+ if lines = SCRIPT_LINES__[file] and lines != true
+ n = 0
+ b.upto(e) do |n|
+ if n > 0 && lines[n-1]
+ if n == line
+ stdout.printf "=> %d %s\n", n, lines[n-1].chomp
+ else
+ stdout.printf " %d %s\n", n, lines[n-1].chomp
+ end
+ end
+ end
+ else
+ stdout.printf "No sourcefile available for %s\n", file
+ end
+ end
+
+ def line_at(file, line)
+ lines = SCRIPT_LINES__[file]
+ if lines
+ return "\n" if lines == true
+ line = lines[line-1]
+ return "\n" unless line
+ return line
+ end
+ return "\n"
+ end
+
+ def debug_funcname(id)
+ if id.nil?
+ "toplevel"
+ else
+ id.id2name
+ end
+ end
+
+ def check_break_points(file, klass, pos, binding, id)
+ return false if break_points.empty?
+ n = 1
+ for b in break_points
+ if b[0] # valid
+ if b[1] == 0 # breakpoint
+ if (b[2] == file and b[3] == pos) or
+ (klass and b[2] == klass and b[3] == pos)
+ stdout.printf "Breakpoint %d, %s at %s:%s\n", n, debug_funcname(id), file, pos
+ return true
+ end
+ elsif b[1] == 1 # watchpoint
+ if debug_silent_eval(b[2], binding)
+ stdout.printf "Watchpoint %d, %s at %s:%s\n", n, debug_funcname(id), file, pos
+ return true
+ end
+ end
+ end
+ n += 1
+ end
+ return false
+ end
+
+ def excn_handle(file, line, id, binding)
+ if $!.class <= SystemExit
+ set_trace_func nil
+ exit
+ end
+
+ if @catch and ($!.class.ancestors.find { |e| e.to_s == @catch })
+ stdout.printf "%s:%d: `%s' (%s)\n", file, line, $!, $!.class
+ fs = @frames.size
+ tb = caller(0)[-fs..-1]
+ if tb
+ for i in tb
+ stdout.printf "\tfrom %s\n", i
+ end
+ end
+ suspend_all
+ debug_command(file, line, id, binding)
+ end
+ end
+
+ def trace_func(event, file, line, id, binding, klass)
+ Tracer.trace_func(event, file, line, id, binding, klass) if trace?
+ context(Thread.current).check_suspend
+
+ if not trace_ruby? and
+ ( file =~ /#{Config::CONFIG['sitelibdir']}/ or
+ file =~ /#{Config::CONFIG['rubylibdir']}/ or
+ file =~ %r{/debuggee.rb} )
+ case event
+ when 'line'
+ frame_set_pos(file, line)
+
+ when 'call'
+ @frames.unshift [binding, file, line, id]
+
+ when 'c-call'
+ frame_set_pos(file, line)
+
+ when 'class'
+ @frames.unshift [binding, file, line, id]
+
+ when 'return', 'end'
+ @frames.shift
+
+ when 'end'
+ @frames.shift
+
+ when 'raise'
+ excn_handle(file, line, id, binding)
+
+ end
+ return
+ end
+
+ @file = file
+ @line = line
+ case event
+ when 'line'
+ frame_set_pos(file, line)
+ if !@no_step or @frames.size == @no_step
+ @stop_next -= 1
+ @stop_next = -1 if @stop_next < 0
+ elsif @frames.size < @no_step
+ @stop_next = 0 # break here before leaving...
+ else
+ # nothing to do. skipped.
+ end
+ #LJ reverse the test here because we always want the breakpoint reached
+ # message to be display. if stop_next is null *AND* there is also a break point
+ # the message will never display.
+ if check_break_points(file, nil, line, binding, id) or @stop_next == 0
+ # LJ this test doesn't make sense and cause troubles when
+ # on a line with a recursive call and a breakpoint on it (e.g factorial)
+ # or when in a while loop with one line only inside the loop
+ #
+ # RJD: reinstated the test with a check on whether '@frames.size'
+ # has changed to catch the recursive factorial case LJ describes
+ # above. The while loop problem still exists though
+ if [file, line, @frames.size] == @last
+ @stop_next = 1
+ else
+ @no_step = nil
+ suspend_all
+ debug_command(file, line, id, binding)
+ @last = [file, line, @frames.size]
+ end
+ end
+
+ when 'call'
+ @frames.unshift [binding, file, line, id]
+ if check_break_points(file, klass, id.id2name, binding, id)
+ suspend_all
+ debug_command(file, line, id, binding)
+ end
+
+ when 'c-call'
+ frame_set_pos(file, line)
+
+ when 'class'
+ @frames.unshift [binding, file, line, id]
+
+ when 'return', 'end'
+ if @frames.size == @finish_pos
+ @stop_next = 1
+ @finish_pos = 0
+ end
+ @frames.shift
+
+ when 'end'
+ @frames.shift
+
+ when 'raise'
+ excn_handle(file, line, id, binding)
+
+ end
+ @last_file = file
+ end
+end
+
+trap("INT") { DEBUGGER__.interrupt }
+@last_thread = Thread::main
+@max_thread = 1
+@thread_list = {Thread::main => 1}
+@break_points = []
+@display = []
+@waiting = []
+@stdout = STDOUT
+
+ class SilentObject
+ def method_missing( msg_id, *a, &b ); end
+ end
+ SilentClient = SilentObject.new()
+ @client = SilentClient
+ @attached = false
+
+class << DEBUGGER__
+ def stdout
+ @stdout
+ end
+
+ def stdout=(s)
+ @stdout = s
+ end
+
+ def display
+ @display
+ end
+
+ def break_points
+ @break_points
+ end
+
+ def client
+ @client
+ end
+
+ def set_client( client )
+ @client = client
+ DEBUGGER__.stdout = Tracer.stdout = @client
+ end
+
+ def quit
+ #LJ flush STDOUT and ERR
+# @stdout.print "Quitting debugger"
+ STDERR.flush; STDOUT.flush
+ $stderr.flush; $stdout.flush
+# STDERR.close; STDOUT.close
+ detach
+ #DebugSvr.stop_service
+ end
+
+ def detach
+ @attached = false
+ @client.detach
+ set_client( SilentClient )
+ end
+
+ def waiting
+ @waiting
+ end
+
+ def set_trace( arg )
+ saved_crit = Thread.critical
+ Thread.critical = true
+ make_thread_list
+ for th, in @thread_list
+ context(th).set_trace arg
+ end
+ Thread.critical = saved_crit
+ arg
+ end
+
+ def set_last_thread(th)
+ @last_thread = th
+ end
+
+ def suspend
+ saved_crit = Thread.critical
+ Thread.critical = true
+ make_thread_list
+ for th, in @thread_list
+ next if th == Thread.current
+ context(th).set_suspend
+ end
+ Thread.critical = saved_crit
+ # Schedule other threads to suspend as soon as possible.
+ Thread.pass unless Thread.critical
+ end
+
+ def resume
+ saved_crit = Thread.critical
+ Thread.critical = true
+ make_thread_list
+ for th, in @thread_list
+ next if th == Thread.current
+ context(th).clear_suspend
+ end
+ waiting.each do |th|
+ th.run
+ end
+ waiting.clear
+ Thread.critical = saved_crit
+ # Schedule other threads to restart as soon as possible.
+ Thread.pass
+ end
+
+ def context(thread=Thread.current)
+ c = thread[:__debugger_data__]
+ unless c
+ thread[:__debugger_data__] = c = Context.new
+ end
+ c
+ end
+
+ def interrupt
+ context(@last_thread).stop_next
+ end
+
+ def get_thread(num)
+ th = @thread_list.index(num)
+ unless th
+ @stdout.print "No thread ##{num}\n"
+ throw :debug_error
+ end
+ th
+ end
+
+ def thread_list(num)
+ th = get_thread(num)
+ if th == Thread.current
+ @stdout.print "+"
+ else
+ @stdout.print " "
+ end
+ @stdout.printf "%d ", num
+ @stdout.print th.inspect, "\t"
+ file = context(th).instance_eval{@file}
+ if file
+ @stdout.print file,":",context(th).instance_eval{@line}
+ end
+ @stdout.print "\n"
+ end
+
+ def thread_list_all
+ for th in @thread_list.values.sort
+ thread_list(th)
+ end
+ end
+
+ def make_thread_list
+ hash = {}
+ for th in Thread::list
+ if @thread_list.key? th
+ hash[th] = @thread_list[th]
+ else
+ @max_thread += 1
+ hash[th] = @max_thread
+ end
+ end
+ @thread_list = hash
+ end
+
+ def debug_thread_info(input, binding)
+ case input
+ when /^l(?:ist)?/
+ make_thread_list
+ thread_list_all
+
+ when /^c(?:ur(?:rent)?)?$/
+ make_thread_list
+ thread_list(@thread_list[Thread.current])
+
+ when /^(?:sw(?:itch)?\s+)?(\d+)/
+ make_thread_list
+ th = get_thread($1.to_i)
+ if th == Thread.current
+ @stdout.print "It's the current thread.\n"
+ else
+ thread_list(@thread_list[th])
+ context(th).stop_next
+ th.run
+ return :cont
+ end
+
+ when /^stop\s+(\d+)/
+ make_thread_list
+ th = get_thread($1.to_i)
+ if th == Thread.current
+ @stdout.print "It's the current thread.\n"
+ elsif th.stop?
+ @stdout.print "Already stopped.\n"
+ else
+ thread_list(@thread_list[th])
+ context(th).suspend
+ end
+
+ when /^resume\s+(\d+)/
+ make_thread_list
+ th = get_thread($1.to_i)
+ if th == Thread.current
+ @stdout.print "It's the current thread.\n"
+ elsif !th.stop?
+ @stdout.print "Already running."
+ else
+ thread_list(@thread_list[th])
+ th.run
+ end
+ end
+ end
+end
+
+require 'socket'
+
+ ##
+ # DEBUGGEE -> socket -> KDevelop
+ # The Client class holds all the methods invoked from the debuggee that send and
+ # receive data from KDevelop via the Unix domain socket.
+ #
+ class Client
+ def initialize(path)
+ @debugger = UNIXSocket.open(path)
+ @debugger.sync=true
+ end
+
+ def detach
+# @debugger.close
+ end
+
+ def printf( *args )
+ str = sprintf(*args)
+ @debugger.send(str, 0)
+ end
+
+ def print( *args )
+ str = args.to_s
+ @debugger.send(str, 0)
+ end
+
+ def <<( arg )
+ @debugger.send(arg, 0)
+ end
+
+ # Return next command
+ def readline(prompt_cmd)
+ @debugger.send(prompt_cmd, 0)
+ msg = @debugger.recvfrom(2048)
+ return msg[0]
+ end
+ end
+
+#stdout.printf "Debug.rb\n"
+#stdout.printf "Emacs support available.\n\n"
+
+STDERR.sync=true
+STDOUT.sync=true
+
+path = $stdin.gets.chomp
+
+DEBUGGER__.set_client( Client.new(path) )
+
+set_trace_func proc { |event, file, line, id, binding, klass, *rest|
+
+ # LJ make sure the file path is always absolute. It is needed by
+ # the Debugger plugin in KDevelop and can only be determined here
+ # in the context of the debugged process
+ file = File.expand_path(file)
+
+ DEBUGGER__.context.trace_func event, file, line, id, binding, klass
+}
+
+end
diff --git a/languages/ruby/debugger/debuggerpart.cpp b/languages/ruby/debugger/debuggerpart.cpp
new file mode 100644
index 00000000..95b4dd09
--- /dev/null
+++ b/languages/ruby/debugger/debuggerpart.cpp
@@ -0,0 +1,785 @@
+/***************************************************************************
+ * Copyright (C) 1999-2001 by John Birch *
+ * jbb@kdevelop.org *
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * Adapted for ruby debugging *
+ * -------------------------- *
+ * begin : Mon Nov 1 2004 *
+ * copyright : (C) 2004 by Richard Dale *
+ * email : Richard_Dale@tipitina.demon.co.uk *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include "debuggerpart.h"
+
+#include <qdir.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+#include <qpopupmenu.h>
+
+#include <kaction.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kdevgenericfactory.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kstatusbar.h>
+#include <kparts/part.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <kmessagebox.h>
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <qtimer.h>
+#include <kstringhandler.h>
+#include <kstandarddirs.h>
+
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevmainwindow.h"
+#include "kdevappfrontend.h"
+#include "kdevpartcontroller.h"
+#include "kdevdebugger.h"
+#include "domutil.h"
+#include "variablewidget.h"
+#include "rdbbreakpointwidget.h"
+#include "framestackwidget.h"
+#include "processwidget.h"
+#include "rdbcontroller.h"
+#include "breakpoint.h"
+#include "dbgpsdlg.h"
+#include "dbgtoolbar.h"
+#include "rdbparser.h"
+#include "rdboutputwidget.h"
+#include "processlinemaker.h"
+
+#include <iostream>
+
+#include <kdevplugininfo.h>
+#include <debugger.h>
+
+
+namespace RDBDebugger
+{
+static const KDevPluginInfo data("kdevrbdebugger");
+
+typedef KDevGenericFactory<RubyDebuggerPart> RubyDebuggerFactory;
+K_EXPORT_COMPONENT_FACTORY( libkdevrbdebugger, RubyDebuggerFactory( data ) )
+
+RubyDebuggerPart::RubyDebuggerPart( QObject *parent, const char *name, const QStringList & ) :
+ KDevPlugin( &data, parent, name ? name : "RubyDebuggerPart" ),
+ controller(0)
+{
+// setObjId("RubyDebuggerInterface");
+ setInstance(RubyDebuggerFactory::instance());
+
+ setXMLFile("kdevrbdebugger.rc");
+
+ m_debugger = new Debugger( partController() );
+
+ statusBarIndicator = new QLabel(" ", mainWindow()->statusBar());
+ statusBarIndicator->setFixedWidth(15);
+ mainWindow()->statusBar()->addWidget(statusBarIndicator, 0, true);
+ statusBarIndicator->show();
+
+ // Setup widgets and dbgcontroller
+ variableWidget = new VariableWidget( 0, "rdbVariablewidget");
+// /*variableWidget*/->setEnabled(false);
+ variableWidget->setIcon(SmallIcon("math_brace"));
+ variableWidget->setCaption(i18n("Variable Tree"));
+ QWhatsThis::add
+ (variableWidget, i18n("<b>Variable tree</b><p>"
+ "The variable tree allows you to see "
+ "the variable values as you step "
+ "through your program using the internal "
+ "debugger. Click the right mouse button on items in "
+ "this view to get a popup menu.\n"
+ "To speed up stepping through your code "
+ "leave the tree items closed.\n"));
+ mainWindow()->embedSelectView(variableWidget, i18n("Variables"), i18n("Debugger variable-view"));
+
+// mainWindow()->setViewAvailable(variableWidget, false);
+
+ rdbBreakpointWidget = new RDBBreakpointWidget( 0, "rdbBreakpointWidget" );
+ rdbBreakpointWidget->setCaption(i18n("Breakpoint List"));
+ QWhatsThis::add
+ (rdbBreakpointWidget, i18n("<b>Breakpoint list</b><p>"
+ "Displays a list of breakpoints with "
+ "their current status. Clicking on a "
+ "breakpoint item allows you to change "
+ "the breakpoint and will take you "
+ "to the source in the editor window."));
+ rdbBreakpointWidget->setIcon( SmallIcon("stop") );
+ mainWindow()->embedOutputView(rdbBreakpointWidget, i18n("Breakpoints"), i18n("Debugger breakpoints"));
+
+ framestackWidget = new FramestackWidget( 0, "rdbFramestackWidget" );
+ framestackWidget->setEnabled(false);
+ framestackWidget->setCaption(i18n("Frame Stack"));
+ QWhatsThis::add
+ (framestackWidget, i18n("<b>Frame stack</b><p>"
+ "Often referred to as the \"call stack\", "
+ "this is a list showing what method is "
+ "currently active and who called each "
+ "method to get to this point in your "
+ "program. By clicking on an item you "
+ "can see the values in any of the "
+ "previous calling methods."));
+ framestackWidget->setIcon( SmallIcon("table") );
+ mainWindow()->embedOutputView(framestackWidget, i18n("Frame Stack"), i18n("Debugger method call stack"));
+ mainWindow()->setViewAvailable(framestackWidget, false);
+
+
+ rdbOutputWidget = new RDBOutputWidget( 0, "rdbOutputWidget" );
+ rdbOutputWidget->setEnabled(false);
+ rdbOutputWidget->setIcon( SmallIcon("inline_image") );
+ rdbOutputWidget->setCaption(i18n("RDB Output"));
+ QWhatsThis::add
+ (rdbOutputWidget, i18n("<b>RDB output</b><p>"
+ "Shows all rdb commands being executed. "
+ "You can also issue any other rdb command while debugging."));
+ mainWindow()->embedOutputView(rdbOutputWidget, i18n("RDB"),
+ i18n("RDB output"));
+ mainWindow()->setViewAvailable(rdbOutputWidget, false);
+
+ // rdbBreakpointWidget -> this
+ connect( rdbBreakpointWidget, SIGNAL(refreshBPState(const Breakpoint&)),
+ this, SLOT(slotRefreshBPState(const Breakpoint&)));
+ connect( rdbBreakpointWidget, SIGNAL(publishBPState(const Breakpoint&)),
+ this, SLOT(slotRefreshBPState(const Breakpoint&)));
+ connect( rdbBreakpointWidget, SIGNAL(gotoSourcePosition(const QString&, int)),
+ this, SLOT(slotGotoSource(const QString&, int)) );
+
+ // Now setup the actions
+ KAction *action;
+
+// action = new KAction(i18n("&Start"), "1rightarrow", CTRL+SHIFT+Key_F9,
+ action = new KAction(i18n("&Start"), "dbgrun", CTRL+SHIFT+Key_F9,
+ this, SLOT(slotRun()),
+ actionCollection(), "debug_run");
+ action->setToolTip( i18n("Start in debugger") );
+ action->setWhatsThis( i18n("<b>Start in debugger</b><p>"
+ "Starts the debugger with the project's main "
+ "executable. You may set some breakpoints "
+ "before this, or you can interrupt the program "
+ "while it is running, in order to get information "
+ "about variables, frame stack, and so on.") );
+
+ action = new KAction(i18n("Sto&p"), "stop", 0,
+ this, SLOT(slotStop()),
+ actionCollection(), "debug_stop");
+ action->setToolTip( i18n("Stop debugger") );
+ action->setWhatsThis(i18n("<b>Stop debugger</b><p>Kills the executable and exits the debugger."));
+
+ action = new KAction(i18n("Interrupt"), "player_pause", 0,
+ this, SLOT(slotPause()),
+ actionCollection(), "debug_pause");
+ action->setToolTip( i18n("Interrupt application") );
+ action->setWhatsThis(i18n("<b>Interrupt application</b><p>Interrupts the debugged process or current RDB command."));
+
+ action = new KAction(i18n("Run to &Cursor"), "dbgrunto", 0,
+ this, SLOT(slotRunToCursor()),
+ actionCollection(), "debug_runtocursor");
+ action->setToolTip( i18n("Run to cursor") );
+ action->setWhatsThis(i18n("<b>Run to cursor</b><p>Continues execution until the cursor position is reached."));
+
+
+ action = new KAction(i18n("Step &Over"), "dbgnext", 0,
+ this, SLOT(slotStepOver()),
+ actionCollection(), "debug_stepover");
+ action->setToolTip( i18n("Step over the next line") );
+ action->setWhatsThis( i18n("<b>Step over</b><p>"
+ "Executes one line of source in the current source file. "
+ "If the source line is a call to a method the whole "
+ "method is executed and the app will stop at the line "
+ "following the method call.") );
+
+
+ action = new KAction(i18n("Step &Into"), "dbgstep", 0,
+ this, SLOT(slotStepInto()),
+ actionCollection(), "debug_stepinto");
+ action->setToolTip( i18n("Step into the next statement") );
+ action->setWhatsThis( i18n("<b>Step into</b><p>"
+ "Executes exactly one line of source. If the source line "
+ "is a call to a method then execution will stop after "
+ "the method has been entered.") );
+
+
+
+ action = new KAction(i18n("Step O&ut"), "dbgstepout", 0,
+ this, SLOT(slotStepOut()),
+ actionCollection(), "debug_stepout");
+ action->setToolTip( i18n("Steps out of the current method") );
+ action->setWhatsThis( i18n("<b>Step out</b><p>"
+ "Executes the application until the currently executing "
+ "method is completed. The debugger will then display "
+ "the line after the original call to that method. If "
+ "program execution is in the outermost frame (i.e. in "
+ "the topleveltoggleWatchpoint) then this operation has no effect.") );
+
+
+ action = new KAction(i18n("Toggle Breakpoint"), 0, 0,
+ this, SLOT(toggleBreakpoint()),
+ actionCollection(), "debug_toggle_breakpoint");
+ action->setToolTip(i18n("Toggle breakpoint"));
+ action->setWhatsThis(i18n("<b>Toggle breakpoint</b><p>Toggles the breakpoint at the current line in editor."));
+
+ connect( mainWindow()->main()->guiFactory(), SIGNAL(clientAdded(KXMLGUIClient*)),
+ this, SLOT(guiClientAdded(KXMLGUIClient*)) );
+
+
+ connect( partController(), SIGNAL(loadedFile(const KURL &)),
+ rdbBreakpointWidget, SLOT(slotRefreshBP(const KURL &)) );
+ connect( debugger(), SIGNAL(toggledBreakpoint(const QString &, int)),
+ rdbBreakpointWidget, SLOT(slotToggleBreakpoint(const QString &, int)) );
+ connect( debugger(), SIGNAL(editedBreakpoint(const QString &, int)),
+ rdbBreakpointWidget, SLOT(slotEditBreakpoint(const QString &, int)) );
+ connect( debugger(), SIGNAL(toggledBreakpointEnabled(const QString &, int)),
+ rdbBreakpointWidget, SLOT(slotToggleBreakpointEnabled(const QString &, int)) );
+
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+
+ connect( core(), SIGNAL(stopButtonClicked(KDevPlugin*)),
+ this, SLOT(slotStop(KDevPlugin*)) );
+ connect( core(), SIGNAL(projectClosed()),
+ this, SLOT(projectClosed()) );
+
+ connect( partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part*)) );
+
+ procLineMaker = new ProcessLineMaker();
+
+ connect( procLineMaker, SIGNAL(receivedStdoutLine(const QCString&)),
+ appFrontend(), SLOT(insertStdoutLine(const QCString&)) );
+ connect( procLineMaker, SIGNAL(receivedStderrLine(const QCString&)),
+ appFrontend(), SLOT(insertStderrLine(const QCString&)) );
+ connect( procLineMaker, SIGNAL(receivedPartialStdoutLine(const QCString&)),
+ appFrontend(), SLOT(addPartialStdoutLine(const QCString&)) );
+ connect( procLineMaker, SIGNAL(receivedPartialStderrLine(const QCString&)),
+ appFrontend(), SLOT(addPartialStderrLine(const QCString&)) );
+
+ setupController();
+ QTimer::singleShot(0, this, SLOT(setupDcop()));
+}
+
+RubyDebuggerPart::~RubyDebuggerPart()
+{
+ kapp->dcopClient()->setNotifications(false);
+
+ if (variableWidget)
+ mainWindow()->removeView(variableWidget);
+ if (rdbBreakpointWidget)
+ mainWindow()->removeView(rdbBreakpointWidget);
+ if (framestackWidget)
+ mainWindow()->removeView(framestackWidget);
+ if(rdbOutputWidget)
+ mainWindow()->removeView(rdbOutputWidget);
+
+ delete variableWidget;
+ delete rdbBreakpointWidget;
+ delete framestackWidget;
+ delete rdbOutputWidget;
+ delete controller;
+ delete floatingToolBar;
+ delete statusBarIndicator;
+ delete procLineMaker;
+}
+
+
+void RubyDebuggerPart::guiClientAdded( KXMLGUIClient* client )
+{
+ // Can't change state until after XMLGUI has been loaded...
+ // Anyone know of a better way of doing this?
+ if( client == this )
+ stateChanged( QString("stopped") );
+}
+
+void RubyDebuggerPart::contextMenu(QPopupMenu *popup, const Context *context)
+{
+ if (!context->hasType( Context::EditorContext ))
+ return;
+
+ const EditorContext *econtext = static_cast<const EditorContext*>(context);
+ m_contextIdent = econtext->currentWord();
+
+ popup->insertSeparator();
+ if (econtext->url().isLocalFile())
+ {
+ int id = popup->insertItem( i18n("Toggle Breakpoint"), this, SLOT(toggleBreakpoint()) );
+ popup->setWhatsThis(id, i18n("<b>Toggle breakpoint</b><p>Toggles breakpoint at the current line."));
+ }
+ if (!m_contextIdent.isEmpty())
+ {
+ QString squeezed = KStringHandler::csqueeze(m_contextIdent, 30);
+ int id = popup->insertItem( i18n("Watch: %1").arg(squeezed), this, SLOT(contextWatch()) );
+ popup->setWhatsThis(id, i18n("<b>Watch</b><p>Adds an expression under the cursor to the Variables/Watch list."));
+
+ id = popup->insertItem( i18n("Inspect: %1").arg(squeezed), this, SLOT(contextRubyInspect()) );
+ popup->setWhatsThis(id, i18n("<b>Inspect</b><p>Evaluates an expression under the cursor."));
+ }
+}
+
+
+void RubyDebuggerPart::toggleBreakpoint()
+{
+ KParts::ReadWritePart *rwpart
+ = dynamic_cast<KParts::ReadWritePart*>(partController()->activePart());
+ KTextEditor::ViewCursorInterface *cursorIface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(partController()->activeWidget());
+
+ if (!rwpart || !cursorIface)
+ return;
+
+ uint line, col;
+ cursorIface->cursorPositionReal(&line, &col);
+
+ rdbBreakpointWidget->slotToggleBreakpoint(rwpart->url().path(), line);
+}
+
+
+void RubyDebuggerPart::contextWatch()
+{
+ variableWidget->slotAddWatchExpression(m_contextIdent);
+}
+
+// Evaluates the selected text
+void RubyDebuggerPart::contextRubyInspect()
+{
+ emit rubyInspect(m_contextIdent);
+}
+
+
+void RubyDebuggerPart::setupController()
+{
+ VariableTree *variableTree = variableWidget->varTree();
+
+ controller = new RDBController(variableTree, framestackWidget, *projectDom());
+
+ // this -> controller
+ connect( this, SIGNAL(rubyInspect(const QString&)),
+ controller, SLOT(slotRubyInspect(const QString&)));
+
+ // variableTree -> framestackWidget
+ connect( variableTree, SIGNAL(selectFrame(int, int)),
+ framestackWidget, SLOT(slotSelectFrame(int, int)));
+
+ // framestackWidget -> variableTree
+ connect( framestackWidget, SIGNAL(frameActive(int, int, const QString&)),
+ variableTree, SLOT(slotFrameActive(int, int, const QString&)));
+
+ // variableTree -> controller
+ connect( variableTree, SIGNAL(expandItem(VarItem*, const QCString&)),
+ controller, SLOT(slotExpandItem(VarItem*, const QCString&)));
+ connect( variableTree, SIGNAL(fetchGlobals(bool)),
+ controller, SLOT(slotFetchGlobals(bool)));
+ connect( variableTree, SIGNAL(addWatchExpression(const QString&, bool)),
+ controller, SLOT(slotAddWatchExpression(const QString&, bool)));
+ connect( variableTree, SIGNAL(removeWatchExpression(int)),
+ controller, SLOT(slotRemoveWatchExpression(int)));
+
+ // framestackWidget -> controller
+ connect( framestackWidget, SIGNAL(selectFrame(int,int,const QString&)),
+ controller, SLOT(slotSelectFrame(int,int,const QString&)));
+
+ // rdbBreakpointWidget -> controller
+ connect( rdbBreakpointWidget, SIGNAL(clearAllBreakpoints()),
+ controller, SLOT(slotClearAllBreakpoints()));
+ connect( rdbBreakpointWidget, SIGNAL(publishBPState(const Breakpoint&)),
+ controller, SLOT(slotBPState(const Breakpoint &)));
+
+
+ // rdbOutputWidget -> controller
+ connect( rdbOutputWidget, SIGNAL(userRDBCmd(const QString &)),
+ controller, SLOT(slotUserRDBCmd(const QString&)));
+ connect( rdbOutputWidget, SIGNAL(breakInto()),
+ controller, SLOT(slotBreakInto()));
+
+ // controller -> rdbBreakpointWidget
+ connect( controller, SIGNAL(acceptPendingBPs()),
+ rdbBreakpointWidget, SLOT(slotSetPendingBPs()));
+ connect( controller, SIGNAL(unableToSetBPNow(int)),
+ rdbBreakpointWidget, SLOT(slotUnableToSetBPNow(int)));
+ connect( controller, SIGNAL(rawRDBBreakpointList (char*)),
+ rdbBreakpointWidget, SLOT(slotParseRDBBrkptList(char*)));
+ connect( controller, SIGNAL(rawRDBBreakpointSet(char*, int)),
+ rdbBreakpointWidget, SLOT(slotParseRDBBreakpointSet(char*, int)));
+
+
+ // controller -> this
+ connect( controller, SIGNAL(dbgStatus(const QString&, int)),
+ this, SLOT(slotStatus(const QString&, int)));
+ connect( controller, SIGNAL(showStepInSource(const QString&, int, const QString&)),
+ this, SLOT(slotShowStep(const QString&, int)));
+
+ // controller -> procLineMaker
+ connect( controller, SIGNAL(ttyStdout(const char*)),
+ procLineMaker, SLOT(slotReceivedStdout(const char*)));
+ connect( controller, SIGNAL(ttyStderr(const char*)),
+ procLineMaker, SLOT(slotReceivedStderr(const char*)));
+
+ // controller -> rdbOutputWidget
+ connect( controller, SIGNAL(rdbStdout(const char*)),
+ rdbOutputWidget, SLOT(slotReceivedStdout(const char*)) );
+ connect( controller, SIGNAL(rdbStderr(const char*)),
+ rdbOutputWidget, SLOT(slotReceivedStderr(const char*)) );
+ connect( controller, SIGNAL(dbgStatus(const QString&, int)),
+ rdbOutputWidget, SLOT(slotDbgStatus(const QString&, int)));
+
+}
+
+
+bool RubyDebuggerPart::startDebugger()
+{
+ QString build_dir; // Currently selected build directory
+ QString run_directory; // Directory from where the program should be run
+ QString program; // Absolute path to application
+ QString run_arguments; // Command line arguments to be passed to the application
+ QString ruby_interpreter; // Absolute path to the ruby interpreter
+ QString debuggee_path; // Absolute path to debuggee.rb debugger script
+ bool show_constants; // Show constants in the debugger
+ bool trace_into_ruby; // Trace into the ruby code installed under sitedir
+
+ if (project()) {
+ build_dir = project()->buildDirectory();
+ run_directory = DomUtil::readEntry(*projectDom(), "/kdevscriptproject/run/globalcwd");
+ if (run_directory.isEmpty())
+ run_directory = project()->buildDirectory();
+ }
+
+ int runMainProgram = DomUtil::readIntEntry(*projectDom(), "/kdevrubysupport/run/runmainprogram");
+
+ if (runMainProgram == 0) {
+ program = project()->projectDirectory() + "/" + DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/mainprogram");
+ } else {
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ if (ro_part != 0) {
+ program = ro_part->url().path();
+ }
+ }
+
+ run_arguments = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/programargs");
+
+ QString shell = DomUtil::readEntry(*projectDom(), "/kdevrbdebugger/general/dbgshell");
+ if( !shell.isEmpty() )
+ {
+ QFileInfo info( shell );
+ if( info.isRelative() )
+ {
+ shell = build_dir + "/" + shell;
+ info.setFile( shell );
+ }
+ if( !info.exists() )
+ {
+ KMessageBox::error(
+ mainWindow()->main(),
+ i18n("Could not locate the debugging shell '%1'.").arg( shell ),
+ i18n("Debugging Shell Not Found") );
+ return false;
+ }
+ }
+
+ core()->running(this, true);
+
+ stateChanged( QString("active") );
+
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("&Continue") );
+// ac->action("debug_run")->setIcon( "dbgrun" );
+ ac->action("debug_run")->setToolTip( i18n("Continues the application execution") );
+ ac->action("debug_run")->setWhatsThis( i18n("Continue application execution\n\n"
+ "Continues the execution of your application in the "
+ "debugger. This only takes effect when the application "
+ "has been halted by the debugger (i.e. a breakpoint has "
+ "been activated or the interrupt was pressed).") );
+
+
+// mainWindow()->setViewAvailable(variableWidget, true);
+ mainWindow()->setViewAvailable(framestackWidget, true);
+ mainWindow()->setViewAvailable(rdbOutputWidget, true);
+
+// variableWidget->setEnabled(true);
+ framestackWidget->setEnabled(true);
+
+ rdbOutputWidget->clear();
+ rdbOutputWidget->setEnabled(true);
+
+ if (DomUtil::readBoolEntry(*projectDom(), "/kdevrbdebugger/general/floatingtoolbar", false))
+ {
+ floatingToolBar = new DbgToolBar(this, mainWindow()->main());
+ floatingToolBar->show();
+ }
+
+ ruby_interpreter = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/interpreter");
+
+ int coding = DomUtil::readIntEntry(*projectDom(), "/kdevrubysupport/run/charactercoding");
+ QString character_coding("-K");
+
+ switch (coding) {
+ case 0:
+ character_coding.append("A");
+ break;
+ case 1:
+ character_coding.append("E");
+ break;
+ case 2:
+ character_coding.append("S");
+ break;
+ case 3:
+ character_coding.append("U");
+ break;
+ }
+
+// ruby_interpreter.append(QString(" -K") + code);
+
+ debuggee_path = ::locate("data", "kdevrbdebugger/debuggee.rb", instance());
+
+ show_constants = DomUtil::readBoolEntry(*projectDom(), "/kdevrbdebugger/general/showconstants");
+ trace_into_ruby = DomUtil::readBoolEntry(*projectDom(), "/kdevrbdebugger/general/traceintoruby");
+
+ controller->slotStart(ruby_interpreter, character_coding, run_directory, debuggee_path, program, run_arguments, show_constants, trace_into_ruby);
+ return true;
+}
+
+void RubyDebuggerPart::slotStopDebugger()
+{
+ controller->slotStopDebugger();
+ debugger()->clearExecutionPoint();
+
+ delete floatingToolBar;
+ floatingToolBar = 0;
+
+ rdbBreakpointWidget->reset();
+ framestackWidget->clear();
+ variableWidget->varTree()->clear();
+
+// variableWidget->setEnabled(false);
+ framestackWidget->setEnabled(false);
+ rdbOutputWidget->setEnabled(false);
+
+// mainWindow()->setViewAvailable(variableWidget, false);
+ mainWindow()->setViewAvailable(framestackWidget, false);
+ mainWindow()->setViewAvailable(rdbOutputWidget, false);
+
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("&Start") );
+// ac->action("debug_run")->setIcon( "1rightarrow" );
+ ac->action("debug_run")->setToolTip( i18n("Runs the program in the debugger") );
+ ac->action("debug_run")->setWhatsThis( i18n("Start in debugger\n\n"
+ "Starts the debugger with the project's main "
+ "executable. You may set some breakpoints "
+ "before this, or you can interrupt the program "
+ "while it is running, in order to get information "
+ "about variables, frame stack, and so on.") );
+
+ stateChanged( QString("stopped") );
+
+ core()->running(this, false);
+}
+
+void RubyDebuggerPart::projectClosed()
+{
+ slotStopDebugger();
+}
+
+void RubyDebuggerPart::slotRun()
+{
+ if (controller->stateIsOn(s_programExited)) {
+ rdbBreakpointWidget->reset();
+ }
+
+ if ( controller->stateIsOn( s_dbgNotStarted ) ) {
+ mainWindow()->statusBar()->message(i18n("Debugging program"), 1000);
+ mainWindow()->raiseView(rdbOutputWidget);
+ appFrontend()->clearView();
+ startDebugger();
+ } else {
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("&Continue") );
+ ac->action("debug_run")->setToolTip( i18n("Continues the application execution") );
+ ac->action("debug_run")->setWhatsThis( i18n("Continue application execution\n\n"
+ "Continues the execution of your application in the "
+ "debugger. This only takes effect when the application "
+ "has been halted by the debugger (i.e. a breakpoint has "
+ "been activated or the interrupt was pressed).") );
+
+ mainWindow()->statusBar()->message(i18n("Continuing program"), 1000);
+ }
+
+ controller->slotRun();
+}
+
+
+
+void RubyDebuggerPart::slotStop(KDevPlugin* which)
+{
+ if( which != 0 && which != this )
+ return;
+
+// if( !controller->stateIsOn( s_dbgNotStarted ) && !controller->stateIsOn( s_shuttingDown ) )
+ slotStopDebugger();
+}
+
+
+void RubyDebuggerPart::slotPause()
+{
+ controller->slotBreakInto();
+}
+
+
+void RubyDebuggerPart::slotRunToCursor()
+{
+ KParts::ReadWritePart *rwpart
+ = dynamic_cast<KParts::ReadWritePart*>(partController()->activePart());
+ KTextEditor::ViewCursorInterface *cursorIface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(partController()->activeWidget());
+
+ if (!rwpart || !rwpart->url().isLocalFile() || !cursorIface)
+ return;
+
+ uint line, col;
+ cursorIface->cursorPosition(&line, &col);
+
+ controller->slotRunUntil(rwpart->url().path(), line);
+}
+
+void RubyDebuggerPart::slotStepOver()
+{
+ controller->slotStepOver();
+}
+
+
+
+void RubyDebuggerPart::slotStepInto()
+{
+ controller->slotStepInto();
+}
+
+
+void RubyDebuggerPart::slotStepOut()
+{
+ controller->slotStepOutOff();
+}
+
+
+
+
+void RubyDebuggerPart::slotRefreshBPState( const Breakpoint& BP)
+{
+ if (BP.type() == BP_TYPE_FilePos)
+ {
+ const FilePosBreakpoint& bp = dynamic_cast<const FilePosBreakpoint&>(BP);
+ if (bp.isActionDie())
+ debugger()->setBreakpoint(bp.fileName(), bp.lineNum()-1, -1, true, false);
+ else
+ debugger()->setBreakpoint(bp.fileName(), bp.lineNum()-1,
+ 1/*bp->id()*/, bp.isEnabled(), bp.isPending() );
+ }
+}
+
+
+void RubyDebuggerPart::slotStatus(const QString &msg, int state)
+{
+ QString stateIndicator;
+
+ if (state & s_dbgNotStarted)
+ {
+ stateIndicator = " ";
+ }
+ else if (state & s_appBusy)
+ {
+ stateIndicator = "A";
+ debugger()->clearExecutionPoint();
+ stateChanged( QString("active") );
+ }
+ else if (state & s_programExited)
+ {
+ stateIndicator = "E";
+ stateChanged( QString("stopped") );
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("Restart") );
+// ac->action("debug_run")->setIcon( "1rightarrow" );
+ ac->action("debug_run")->setToolTip( i18n("Restart the program in the debugger") );
+ ac->action("debug_run")->setWhatsThis( i18n("Restart in debugger\n\n"
+ "Restarts the program in the debugger") );
+// slotStop();
+ }
+ else
+ {
+ stateIndicator = "P";
+ stateChanged( QString("paused") );
+ }
+
+ // And now? :-)
+ kdDebug(9012) << "Debugger state: " << stateIndicator << ": " << endl;
+ kdDebug(9012) << " " << msg << endl;
+
+ statusBarIndicator->setText(stateIndicator);
+ if (!msg.isEmpty())
+ mainWindow()->statusBar()->message(msg, 3000);
+}
+
+
+void RubyDebuggerPart::slotShowStep(const QString &fileName, int lineNum)
+{
+ if ( ! fileName.isEmpty() )
+ {
+ // Debugger counts lines from 1
+ debugger()->gotoExecutionPoint(KURL( fileName ), lineNum-1);
+ }
+}
+
+
+void RubyDebuggerPart::slotGotoSource(const QString &fileName, int lineNum)
+{
+ if ( ! fileName.isEmpty() )
+ partController()->editDocument(KURL( fileName ), lineNum);
+}
+
+
+void RubyDebuggerPart::slotActivePartChanged( KParts::Part* part )
+{
+ KAction* action = actionCollection()->action("debug_toggle_breakpoint");
+ if(!action)
+ return;
+
+ if(!part)
+ {
+ action->setEnabled(false);
+ return;
+ }
+ KTextEditor::ViewCursorInterface *iface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget());
+ action->setEnabled( iface != 0 );
+}
+
+void RubyDebuggerPart::restorePartialProjectSession(const QDomElement* el)
+{
+ rdbBreakpointWidget->restorePartialProjectSession(el);
+ variableWidget->restorePartialProjectSession(el);
+}
+
+void RubyDebuggerPart::savePartialProjectSession(QDomElement* el)
+{
+ rdbBreakpointWidget->savePartialProjectSession(el);
+ variableWidget->savePartialProjectSession(el);
+}
+
+}
+
+KDevAppFrontend * RDBDebugger::RubyDebuggerPart::appFrontend( )
+{
+ return extension<KDevAppFrontend>("KDevelop/AppFrontend");
+}
+
+KDevDebugger * RDBDebugger::RubyDebuggerPart::debugger()
+{
+ return m_debugger;
+}
+
+#include "debuggerpart.moc"
diff --git a/languages/ruby/debugger/debuggerpart.h b/languages/ruby/debugger/debuggerpart.h
new file mode 100644
index 00000000..2f35df9a
--- /dev/null
+++ b/languages/ruby/debugger/debuggerpart.h
@@ -0,0 +1,110 @@
+/***************************************************************************
+ * Copyright (C) 1999-2001 by John Birch *
+ * jbb@kdevelop.org *
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * Adapted for ruby debugging *
+ * -------------------------- *
+ * begin : Mon Nov 1 2004 *
+ * copyright : (C) 2004 by Richard Dale *
+ * email : Richard_Dale@tipitina.demon.co.uk *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DEBUGGERPART_H_
+#define _DEBUGGERPART_H_
+
+#include <qguardedptr.h>
+#include "kdevplugin.h"
+#include "kdevcore.h"
+
+namespace KParts { class Part; }
+
+class QLabel;
+class QPopupMenu;
+class KDialogBase;
+class ProcessWidget;
+class ProcessLineMaker;
+class KDevAppFrontend;
+class KDevDebugger;
+
+namespace RDBDebugger
+{
+
+class RDBBreakpointWidget;
+class FramestackWidget;
+class Breakpoint;
+class DbgController;
+class DbgToolBar;
+class VariableWidget;
+class RDBOutputWidget;
+
+class RubyDebuggerPart : public KDevPlugin
+{
+ Q_OBJECT
+
+public:
+ RubyDebuggerPart( QObject *parent, const char *name, const QStringList & );
+ ~RubyDebuggerPart();
+ virtual void restorePartialProjectSession(const QDomElement* el);
+ virtual void savePartialProjectSession(QDomElement* el);
+
+private slots:
+ void guiClientAdded(KXMLGUIClient*);
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void toggleBreakpoint();
+ void contextWatch();
+ void contextRubyInspect();
+// void projectOpened();
+ void projectClosed();
+ void slotActivePartChanged(KParts::Part*);
+
+ void slotRun();
+ void slotStopDebugger();
+ void slotStop(KDevPlugin* which = 0);
+ void slotPause();
+ void slotRunToCursor();
+ void slotStepOver();
+ void slotStepInto();
+ void slotStepOut();
+
+ void slotRefreshBPState(const Breakpoint&);
+ void slotStatus(const QString &msg, int state);
+ void slotShowStep(const QString &fileName, int lineNum);
+ void slotGotoSource(const QString &fileName, int lineNum);
+
+signals:
+ void rubyInspect(const QString&);
+
+private:
+ KDevAppFrontend *appFrontend();
+ KDevDebugger *debugger();
+
+ bool startDebugger();
+ void setupController();
+
+ QGuardedPtr<VariableWidget> variableWidget;
+ QGuardedPtr<RDBBreakpointWidget> rdbBreakpointWidget;
+ QGuardedPtr<FramestackWidget> framestackWidget;
+ QGuardedPtr<RDBOutputWidget> rdbOutputWidget;
+ DbgController *controller;
+ QGuardedPtr<QLabel> statusBarIndicator;
+ QGuardedPtr<DbgToolBar> floatingToolBar;
+ ProcessLineMaker* procLineMaker;
+ ProcessLineMaker* rdbLineMaker;
+
+ QString m_contextIdent;
+ QCString m_drkonqi;
+
+ KDevDebugger *m_debugger;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/framestackwidget.cpp b/languages/ruby/debugger/framestackwidget.cpp
new file mode 100644
index 00000000..836350b2
--- /dev/null
+++ b/languages/ruby/debugger/framestackwidget.cpp
@@ -0,0 +1,272 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "framestackwidget.h"
+#include "rdbparser.h"
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <qheader.h>
+#include <qlistbox.h>
+#include <qregexp.h>
+#include <qstrlist.h>
+#include <qfileinfo.h>
+
+#include <ctype.h>
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+FramestackWidget::FramestackWidget(QWidget *parent, const char *name, WFlags f)
+ : QListView(parent, name, f),
+ viewedThread_(0)
+{
+ setRootIsDecorated(true);
+ setSelectionMode(Single);
+ addColumn(QString());
+ setSorting(0);
+ header()->hide();
+
+ connect( this, SIGNAL(clicked(QListViewItem*)),
+ this, SLOT(slotSelectionChanged(QListViewItem*)) );
+}
+
+
+/***************************************************************************/
+
+FramestackWidget::~FramestackWidget()
+{
+}
+
+
+// **************************************************************************
+
+void FramestackWidget::clear()
+{
+ viewedThread_ = 0;
+ QListView::clear();
+}
+
+/***************************************************************************/
+
+void FramestackWidget::slotSelectionChanged(QListViewItem * item)
+{
+ if (item == 0) {
+ return;
+ }
+
+ if (item->rtti() == RTTI_THREAD_STACK_ITEM) {
+ ThreadStackItem * thread = (ThreadStackItem*) item;
+ slotSelectFrame(1, thread->threadNo());
+ } else if (item->rtti() == RTTI_FRAME_STACK_ITEM) {
+ FrameStackItem * frame = (FrameStackItem*) item;
+ slotSelectFrame(frame->frameNo(), frame->threadNo());
+ }
+
+ return;
+}
+
+/***************************************************************************/
+
+void FramestackWidget::slotSelectFrame(int frameNo, int threadNo)
+{
+ FrameStackItem * frame = findFrame(frameNo, threadNo);
+
+ if (frame != 0) {
+ setSelected(frame, true);
+ emit selectFrame(frameNo, threadNo, frame->frameName());
+ } else {
+ emit selectFrame(frameNo, threadNo, QString());
+ }
+}
+
+/***************************************************************************/
+
+void FramestackWidget::parseRDBThreadList(char *str)
+{
+ // on receipt of a thread list we must always clear the list.
+ clear();
+
+ QRegExp thread_re("(\\+)?\\s*(\\d+)\\s*(#<[^>]+>\\s*[^:]+:\\d+)");
+ int pos = thread_re.search(str);
+ viewedThread_ = 0;
+
+ while (pos != -1) {
+ ThreadStackItem* thread;
+ thread = new ThreadStackItem( this,
+ thread_re.cap(2).toInt(),
+ QString("%1 %2").arg(thread_re.cap(2)).arg(thread_re.cap(3)) );
+ // The thread with a '+' is always the viewedthread
+ if (thread_re.cap(1) == "+") {
+ viewedThread_ = thread;
+ }
+
+ pos += thread_re.matchedLength();
+ pos = thread_re.search(str, pos);
+ }
+
+ return;
+}
+
+/***************************************************************************/
+
+void FramestackWidget::parseRDBBacktraceList(char *str)
+{
+ QRegExp frame_re("#(\\d+) ([^:]+):(\\d+)(:in `([^\\n]+)')?");
+ int pos = frame_re.search(str);
+
+ while (pos != -1) {
+ QString method(frame_re.cap(5));
+ if (method == "") {
+ method = "toplevel";
+ } else {
+ method.append("(...)");
+ }
+
+ int frameNo = frame_re.cap(1).toInt();
+ QString frameName = QString("T%1#%2 %3").arg(viewedThread_->threadNo()).arg(frame_re.cap(1)).arg(method);
+ new FrameStackItem(viewedThread_, frameNo, QString(frame_re.cap(0)), frameName);
+
+ // Tell the Variable Tree that this frame is active
+ emit frameActive(frameNo, viewedThread_->threadNo(), frameName);
+
+ pos += frame_re.matchedLength();
+ pos = frame_re.search(str, pos);
+ }
+
+ if (viewedThread_ != 0) {
+ viewedThread_->setOpen(true);
+ }
+
+ return;
+}
+
+// **************************************************************************
+
+ThreadStackItem *FramestackWidget::findThread(int threadNo)
+{
+ QListViewItem *sibling = firstChild();
+ while (sibling != 0) {
+ ThreadStackItem *thread = (ThreadStackItem*) sibling;
+ if (thread->threadNo() == threadNo) {
+ return thread;
+ }
+ sibling = sibling->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+
+FrameStackItem *FramestackWidget::findFrame(int frameNo, int threadNo)
+{
+ ThreadStackItem * thread = findThread(threadNo);
+ if (thread == 0) {
+ kdDebug(9012) << "FramestackWidget::findFrame: no matching thread " <<
+ frameNo << " thread: " << threadNo << endl;
+ return 0; // no matching thread?
+ }
+
+ QListViewItem * frameItem = thread->firstChild();
+
+ while (frameItem != 0) {
+ if (((FrameStackItem *) frameItem)->frameNo() == frameNo) {
+ return (FrameStackItem *) frameItem;
+ }
+
+ frameItem = frameItem->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// **************************************************************************
+
+FrameStackItem::FrameStackItem(ThreadStackItem *parent, int frameNo, const QString &frameDesc, const QString& frameName)
+ : QListViewItem(parent),
+ frameNo_(frameNo),
+ threadNo_(parent->threadNo()),
+ frameName_(frameName)
+{
+ setText(0, frameDesc);
+ key_.sprintf("%.6d", frameNo_);
+}
+
+// **************************************************************************
+
+FrameStackItem::~FrameStackItem()
+{
+}
+
+// **************************************************************************
+
+QString FrameStackItem::key(int /*column*/, bool /*ascending*/) const
+{
+
+ return key_;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+ThreadStackItem::ThreadStackItem(FramestackWidget *parent, int threadNo, const QString &threadDesc)
+ : QListViewItem(parent),
+ threadNo_(threadNo)
+{
+ setText(0, threadDesc);
+ setExpandable(true);
+}
+
+// **************************************************************************
+
+ThreadStackItem::~ThreadStackItem()
+{
+}
+
+// **************************************************************************
+
+void ThreadStackItem::setOpen(bool open)
+{
+ if (open)
+ ((FramestackWidget*)listView())->slotSelectFrame(1, threadNo());
+
+ QListViewItem::setOpen(open);
+}
+
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+#include "framestackwidget.moc"
diff --git a/languages/ruby/debugger/framestackwidget.h b/languages/ruby/debugger/framestackwidget.h
new file mode 100644
index 00000000..373d0690
--- /dev/null
+++ b/languages/ruby/debugger/framestackwidget.h
@@ -0,0 +1,115 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _FRAMESTACKWIDGET_H_
+#define _FRAMESTACKWIDGET_H_
+
+#include <qlistview.h>
+#include <qstringlist.h>
+
+#include "rdbcontroller.h"
+
+namespace RDBDebugger
+{
+
+class FramestackWidget;
+
+
+class ThreadStackItem : public QListViewItem
+{
+public:
+ ThreadStackItem(FramestackWidget *parent, int threadNo, const QString &threadDesc);
+ virtual ~ThreadStackItem();
+
+ virtual int rtti() const { return RTTI_THREAD_STACK_ITEM; }
+
+ void setOpen(bool open);
+ int threadNo() { return threadNo_; }
+
+private:
+ int threadNo_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class FrameStackItem : public QListViewItem
+{
+public:
+ FrameStackItem(ThreadStackItem * parent, int frameNo, const QString & frameDesc, const QString & frameName);
+ virtual ~FrameStackItem();
+
+ virtual int rtti() const { return RTTI_FRAME_STACK_ITEM; }
+ virtual QString key(int column, bool ascending) const;
+
+ int frameNo() { return frameNo_; }
+ int threadNo() { return threadNo_; }
+ QString frameName() { return frameName_; }
+
+private:
+ int frameNo_;
+ int threadNo_;
+ QString frameName_;
+ QString key_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+/**
+ * @author John Birch
+ */
+class FramestackWidget : public QListView
+{
+ Q_OBJECT
+
+public:
+ FramestackWidget( QWidget *parent=0, const char *name=0, WFlags f=0 );
+ virtual ~FramestackWidget();
+
+ void clear();
+
+ void parseRDBThreadList(char *str);
+ void parseRDBBacktraceList(char *str);
+
+ ThreadStackItem *findThread(int threadNo);
+ FrameStackItem *findFrame(int frameNo, int threadNo);
+
+ int viewedThread()
+ { return viewedThread_ ? viewedThread_->threadNo() : -1; }
+
+public slots:
+ void slotSelectFrame(int frameNo, int threadNo);
+ void slotSelectionChanged(QListViewItem *thisItem);
+
+signals:
+ void selectFrame(int frameNo, int threadNo, const QString& frameName);
+ void frameActive(int frameNo, int threadNo, const QString& frameName);
+
+private:
+ ThreadStackItem *viewedThread_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/hi16-action-breakpoint_add.png b/languages/ruby/debugger/hi16-action-breakpoint_add.png
new file mode 100644
index 00000000..1b41040c
--- /dev/null
+++ b/languages/ruby/debugger/hi16-action-breakpoint_add.png
Binary files differ
diff --git a/languages/ruby/debugger/hi16-action-breakpoint_delete.png b/languages/ruby/debugger/hi16-action-breakpoint_delete.png
new file mode 100644
index 00000000..c35e039f
--- /dev/null
+++ b/languages/ruby/debugger/hi16-action-breakpoint_delete.png
Binary files differ
diff --git a/languages/ruby/debugger/hi16-action-breakpoint_delete_all.png b/languages/ruby/debugger/hi16-action-breakpoint_delete_all.png
new file mode 100644
index 00000000..c35e039f
--- /dev/null
+++ b/languages/ruby/debugger/hi16-action-breakpoint_delete_all.png
Binary files differ
diff --git a/languages/ruby/debugger/hi16-action-breakpoint_edit.png b/languages/ruby/debugger/hi16-action-breakpoint_edit.png
new file mode 100644
index 00000000..ec92ced2
--- /dev/null
+++ b/languages/ruby/debugger/hi16-action-breakpoint_edit.png
Binary files differ
diff --git a/languages/ruby/debugger/kdevrbdebugger.desktop b/languages/ruby/debugger/kdevrbdebugger.desktop
new file mode 100644
index 00000000..47e59474
--- /dev/null
+++ b/languages/ruby/debugger/kdevrbdebugger.desktop
@@ -0,0 +1,73 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=This plugin provides a frontend for the source-level debugger for Ruby.
+Comment[ca]=Aquest connector proveeix una interfície per a la depuració a nivell de codi per a Ruby.
+Comment[da]=Dette plugin sørger for en grænseflade til Ruby kildekode-fejlretteren.
+Comment[de]=Dieses Modul stellt eine Oberfläche für den Quelltext-Debugger für Ruby bereit.
+Comment[el]=Αυτό το Ï€Ïόσθετο Ï€ÏοσφέÏει ένα Ï€ÏόγÏαμμα για τον αποσφαλματωτή πηγαίου κώδικα της γλώσσας Ruby.
+Comment[es]=Este complemento proporciona un entorno para depurar código de Ruby.
+Comment[et]=See plugin pakub Ruby lähtekoodi siluri kasutajaliidest.
+Comment[eu]=Plugin honek Ruby-ren iturburu-mailako araztailearen interfaze bat bat eskeintzen du.
+Comment[fa]=این وصله، یک پایانه برای اشکال‌زدای سطح منبع رابی Ùراهم می‌کند.
+Comment[fr]=Ce module externe fournit une interface pour le débogueur au niveau source pour Ruby.
+Comment[gl]=Esta extensión proporciona un frontal para o depurador a nivel de código de Ruby.
+Comment[hu]=Ez a bővítőmodul grafikus felületet biztosít a Ruby forrásszintű nyomkövetőjének használatához.
+Comment[it]=Questo plugin fornisce un'interfaccia per il debugger a livello sorgente di Ruby.
+Comment[ja]=ã“ã®ãƒ—ラグインã¯ã€Ruby ã®ã‚½ãƒ¼ã‚¹ãƒ¬ãƒ™ãƒ«ãƒ‡ãƒãƒƒã‚¬ã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã‚’æä¾›ã—ã¾ã™ã€‚
+Comment[nds]=Dit Moduul stellt en Böversiet för den Ruby-Borntextfehlersöker praat.
+Comment[ne]=यो पà¥à¤²à¤—इनले रूबिका लागि सà¥à¤°à¥‹à¤¤-तह डिबगरका लागि फà¥à¤°à¥‡à¤¨à¥à¤Ÿà¤‡à¤¨à¥à¤¡ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¦à¤› ।
+Comment[nl]=Deze plugin biedt een grafische schil voor de broncode-debugger voor Ruby.
+Comment[pl]=Ta wtyczka udostępnia interfejs do debugera poziomu źródłowego dla języka Ruby.
+Comment[pt]=Este 'plugin' oferece uma interface o depurador ao nível do código para Ruby.
+Comment[pt_BR]=Este plug-in fornece uma interface para o depurador a nível de código para Ruby.
+Comment[ru]=Этот модуль предоÑтавлÑет Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ðº отладчику иÑходного кода Ð´Ð»Ñ Ruby.
+Comment[sk]=Modul pre rozhranie debugera pre Ruby.
+Comment[sr]=Овај прикључак обезбеђује Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð·Ð° иÑправљач на нивоу изворног кода за Ruby.
+Comment[sr@Latn]=Ovaj prikljuÄak obezbeÄ‘uje interfejs za ispravljaÄ na nivou izvornog koda za Ruby.
+Comment[sv]=Insticksprogrammet tillhandahåller ett gränssnitt till källkodsavlusaren för Ruby.
+Comment[tr]=Bu eklenti, Ruby için kaynak-düzeyi hata ayıklayıcıya bir önuç sağlar.
+Comment[zh_CN]=æ­¤æ’件æ供了一个 Ruby çš„æºä»£ç çº§è°ƒè¯•å™¨çš„å‰ç«¯ã€‚
+Comment[zh_TW]=此外掛程å¼æä¾› Ruby 除錯器的å‰ç«¯ä»‹é¢ã€‚
+Name=KDevRbDebugger
+Name[da]=KDevelop Ruby fejlretter
+Name[nds]=Ruby-Fehlersöök för KDevelop
+Name[pl]=KDevDebugerRb
+Name[sk]=KDev Ruby debuger
+Name[sv]=KDevelop Ruby-avlusare
+Name[zh_TW]=KDevelop Ruby 除錯器
+GenericName=Ruby Debugger Frontend
+GenericName[ca]=Interfície per al depurador Ruby
+GenericName[da]=Ruby fejlretningsgrænseflade
+GenericName[de]=Debugger-Oberfläche für Ruby
+GenericName[el]=ΠÏόγÏαμμα αποσφαλματωτή Ruby
+GenericName[es]=Interfaz para el depurador de Ruby
+GenericName[et]=Ruby siluri kasutajaliides
+GenericName[eu]=Ruby araztailearen interfazea
+GenericName[fa]=پایانۀ اشکال‌زدای رابی
+GenericName[fr]=Interface du débogueur pour Ruby
+GenericName[gl]=Frontal do depurador Ruby
+GenericName[hu]=Grafikus felület a Ruby nyomkövetőjéhez
+GenericName[it]=Interfaccia di debug per Ruby
+GenericName[ja]=Ruby デãƒãƒƒã‚¬ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰
+GenericName[nds]=Böversiet för den Ruby-Fehlersöker
+GenericName[ne]=रूबि डिबगर फà¥à¤°à¥‡à¤¨à¥à¤Ÿà¤‡à¤¨à¥à¤¡
+GenericName[nl]=Grafische schil voor de Ruby-debugger
+GenericName[pl]=Interfejs do debugera dla języka Ruby
+GenericName[pt]=Interface de Depuração Ruby
+GenericName[pt_BR]=Interface para o Depurador Ruby
+GenericName[ru]=Интегрированный отладчик Ruby
+GenericName[sk]=Ruby debuger rozhranie
+GenericName[sr]=Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð¸Ñправљача за Ruby
+GenericName[sr@Latn]=Interfejs ispravljaÄa za Ruby
+GenericName[sv]=Gränssnitt för Ruby-avlusare
+GenericName[tr]=Ruby Hata Ayıklayıcı Önucu
+GenericName[zh_CN]=Ruby 调试器å‰ç«¯
+GenericName[zh_TW]=Ruby 除錯器å‰ç«¯ä»‹é¢
+Icon=
+ServiceTypes=KDevelop/Plugin
+X-KDE-Library=libkdevrbdebugger
+X-KDevelop-Version=5
+X-KDevelop-Scope=Project
+X-KDevelop-ProgrammingLanguages=Ruby
+X-KDevelop-Properties=RubyDebugger
diff --git a/languages/ruby/debugger/kdevrbdebugger.rc b/languages/ruby/debugger/kdevrbdebugger.rc
new file mode 100644
index 00000000..c7e3b336
--- /dev/null
+++ b/languages/ruby/debugger/kdevrbdebugger.rc
@@ -0,0 +1,68 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevRbDebugger" version="10">
+<MenuBar>
+ <Menu name="debug">
+ <text>&amp;Debug</text>
+ <Action name="debug_run" group="debug"/>
+ <Action name="debug_stop" group="debug"/>
+ <Action name="debug_pause" group="debug"/>
+ <Action name="debug_runtocursor" group="debug"/>
+ <Separator group="debug"/>
+ <Action name="debug_stepover" group="debug"/>
+ <Action name="debug_stepinto" group="debug"/>
+ <Action name="debug_stepout" group="debug"/>
+ <Separator group="debug"/>
+ <Action name="debug_toggle_breakpoint" group="debug"/>
+ <Action name="debug_disable_breakpoint" group="debug"/>
+ <Separator group="debug"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="debugToolBar">
+ <text>Debugger Toolbar</text>
+ <Action name="debug_run"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepout"/>
+ <WeakSeparator/>
+</ToolBar>
+<State name="stopped">
+ <enable>
+ <Action name="debug_run"/>
+ </enable>
+ <disable>
+ <Action name="debug_stop"/>
+ <Action name="debug_pause"/>
+ <Action name="debug_runtocursor"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepout"/>
+ </disable>
+</State>
+<State name="paused">
+ <enable>
+ <Action name="debug_run"/>
+ <Action name="debug_stop"/>
+ <Action name="debug_runtocursor"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepout"/>
+ </enable>
+ <disable>
+ <Action name="debug_pause"/>
+ </disable>
+</State>
+<State name="active">
+ <enable>
+ <Action name="debug_pause"/>
+ <Action name="debug_stop"/>
+ </enable>
+ <disable>
+ <Action name="debug_run"/>
+ <Action name="debug_runtocursor"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepout"/>
+ </disable>
+</State>
+</kpartgui>
+
diff --git a/languages/ruby/debugger/rdbbreakpointwidget.cpp b/languages/ruby/debugger/rdbbreakpointwidget.cpp
new file mode 100644
index 00000000..e31831de
--- /dev/null
+++ b/languages/ruby/debugger/rdbbreakpointwidget.cpp
@@ -0,0 +1,921 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "rdbbreakpointwidget.h"
+#include "rdbtable.h"
+
+#include "breakpoint.h"
+#include "domutil.h"
+
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kurl.h>
+
+#include <qvbuttongroup.h>
+#include <qfileinfo.h>
+#include <qheader.h>
+#include <qtable.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qregexp.h>
+
+#include <stdlib.h>
+#include <ctype.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+enum Column {
+ Control = 0,
+ Enable = 1,
+ Type = 2,
+ Status = 3,
+ Location = 4
+};
+
+
+#define numCols 5
+
+static int m_activeFlag = 0;
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class BreakpointTableRow : public QTableItem
+{
+public:
+
+ BreakpointTableRow(QTable* table, EditType editType, Breakpoint* bp);
+ ~BreakpointTableRow();
+
+ bool match (Breakpoint* bp) const;
+ void reset ();
+ void setRow();
+
+ Breakpoint* breakpoint() { return m_breakpoint; }
+
+private:
+ void appendEmptyRow();
+
+private:
+ Breakpoint* m_breakpoint;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+BreakpointTableRow::BreakpointTableRow(QTable* parent, EditType editType,
+ Breakpoint* bp) :
+ QTableItem(parent, editType, ""),
+ m_breakpoint(bp)
+{
+ appendEmptyRow();
+ setRow();
+}
+
+/***************************************************************************/
+
+BreakpointTableRow::~BreakpointTableRow()
+{
+ delete m_breakpoint;
+}
+
+/***************************************************************************/
+
+bool BreakpointTableRow::match(Breakpoint* breakpoint) const
+{
+ return m_breakpoint->match(breakpoint);
+}
+
+/***************************************************************************/
+
+void BreakpointTableRow::reset()
+{
+ m_breakpoint->reset();
+ setRow();
+}
+
+/***************************************************************************/
+
+void BreakpointTableRow::appendEmptyRow()
+{
+ int row = table()->numRows();
+ table()->setNumRows(row+1);
+
+ table()->setItem(row, Control, this);
+
+ QCheckTableItem* cti = new QCheckTableItem( table(), "");
+ table()->setItem(row, Enable, cti);
+}
+
+/***************************************************************************/
+
+void BreakpointTableRow::setRow()
+{
+ if ( m_breakpoint )
+ {
+ QTableItem *item = table()->item ( row(), Enable );
+ Q_ASSERT(item->rtti() == 2);
+ ((QCheckTableItem*)item)->setChecked(m_breakpoint->isEnabled());
+
+ QString status=m_breakpoint->statusDisplay(m_activeFlag);
+
+ table()->setText(row(), Status, status);
+
+ QString displayType = m_breakpoint->displayType();
+ table()->setText(row(), Location, m_breakpoint->location());
+
+ if (m_breakpoint->isTemporary())
+ displayType = i18n(" temporary");
+
+ table()->setText(row(), Type, displayType);
+ table()->adjustColumn(Type);
+ table()->adjustColumn(Status);
+ table()->adjustColumn(Location);
+ }
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+RDBBreakpointWidget::RDBBreakpointWidget(QWidget *parent, const char *name) :
+ QHBox(parent, name)
+{
+ QFrame* toolbar = new QFrame( this );
+ QVBoxLayout *l = new QVBoxLayout(toolbar, 0, 0);
+
+ toolbar->setFrameStyle( QFrame::ToolBarPanel | QFrame::Plain );
+ toolbar->setLineWidth( 0 );
+
+ m_add = new QToolButton( toolbar, "add breakpoint" );
+ m_add->setPixmap ( SmallIcon ( "breakpoint_add" ) );
+ QToolTip::add ( m_add, i18n ( "Add empty breakpoint" ) + I18N_NOOP(" <Alt+A>"));
+ QWhatsThis::add( m_add, i18n("<b>Add empty breakpoint</b><p>Shows a popup menu that allows you to choose "
+ "the type of breakpoint, then adds a breakpoint of the selected type to the breakpoints list."));
+
+ m_delete = new QToolButton( toolbar, "delete breakpoint" );
+ m_delete->setPixmap ( SmallIcon ( "breakpoint_delete" ) );
+ QToolTip::add ( m_delete, i18n ( "Delete selected breakpoint" ) + I18N_NOOP(" <Delete>") );
+ QWhatsThis::add( m_delete, i18n("<b>Delete selected breakpoint</b><p>Deletes the selected breakpoint in the breakpoints list."));
+
+ m_edit = new QToolButton( toolbar, "edit breakpoint" );
+ m_edit->setPixmap ( SmallIcon ( "breakpoint_edit" ) );
+ QToolTip::add ( m_edit, i18n ( "Edit selected breakpoint" ) + I18N_NOOP(" <Return>") );
+ QWhatsThis::add( m_edit, i18n("<b>Edit selected breakpoint</b><p>Allows to edit location, condition and ignore count properties of the selected breakpoint in the breakpoints list."));
+
+ m_removeAll = new QToolButton( toolbar, "Delete all breakppoints" );
+ m_removeAll->setPixmap ( SmallIcon ( "breakpoint_delete_all" ) );
+ QToolTip::add ( m_removeAll, i18n ( "Remove all breakpoints" ) );
+ QWhatsThis::add( m_removeAll, i18n("<b>Remove all breakpoints</b><p>Removes all breakpoints in the project."));
+
+ l->addWidget(m_add);
+ l->addWidget(m_edit);
+ l->addWidget(m_delete);
+ l->addWidget(m_removeAll);
+ QSpacerItem* spacer = new QSpacerItem( 5, 5, QSizePolicy::Minimum, QSizePolicy::Expanding );
+ l->addItem(spacer);
+
+ QPopupMenu *addMenu = new QPopupMenu( this );
+ addMenu->insertItem( i18n( "File:line" ), BP_TYPE_FilePos );
+ addMenu->insertItem( i18n( "Watchpoint" ), BP_TYPE_Watchpoint );
+ addMenu->insertItem( i18n( "Catchpoint" ), BP_TYPE_Catchpoint );
+ addMenu->insertItem( i18n( "Method()" ), BP_TYPE_Function );
+ m_add->setPopup( addMenu );
+ m_add->setPopupDelay(1);
+
+ m_table = new RDBTable(0, numCols, this, name);
+ m_table->setSelectionMode(QTable::SingleRow);
+ m_table->setShowGrid (false);
+ m_table->setLeftMargin(0);
+ m_table->setFocusStyle(QTable::FollowStyle);
+
+ m_table->hideColumn(Control);
+ m_table->setColumnReadOnly(Type, true);
+ m_table->setColumnReadOnly(Status, true);
+ m_table->setColumnWidth( Enable, 20);
+
+ QHeader *header = m_table->horizontalHeader();
+
+ header->setLabel( Enable, "" );
+ header->setLabel( Type, i18n("Type") );
+ header->setLabel( Status, i18n("Status") );
+ header->setLabel( Location, i18n("Location") );
+
+ m_table->show();
+
+ m_ctxMenu = new QPopupMenu( this );
+ m_ctxMenu->insertItem( i18n( "Show" ), BW_ITEM_Show );
+ m_ctxMenu->insertItem( i18n( "Edit" ), BW_ITEM_Edit );
+ m_ctxMenu->insertItem( i18n( "Disable" ), BW_ITEM_Disable );
+ m_ctxMenu->insertItem( i18n( "Delete" ), BW_ITEM_Delete );
+
+ connect( addMenu, SIGNAL(activated(int)),
+ this, SLOT(slotAddBlankBreakpoint(int)) );
+ connect( m_delete, SIGNAL(clicked()),
+ this, SLOT(slotRemoveBreakpoint()) );
+ connect( m_edit, SIGNAL(clicked()),
+ this, SLOT(slotEditBreakpoint()) );
+ connect( m_removeAll, SIGNAL(clicked()),
+ this, SLOT(slotRemoveAllBreakpoints()) );
+
+ connect( m_table, SIGNAL(contextMenuRequested(int, int, const QPoint &)),
+ this, SLOT(slotContextMenuShow(int, int, const QPoint & )) );
+ connect( m_ctxMenu, SIGNAL(activated(int)),
+ this, SLOT(slotContextMenuSelect(int)) );
+
+ connect( m_table, SIGNAL(doubleClicked(int, int, int, const QPoint &)),
+ this, SLOT(slotRowDoubleClicked(int, int, int, const QPoint &)));
+
+ connect( m_table, SIGNAL(valueChanged(int, int)),
+ this, SLOT(slotNewValue(int, int)));
+
+ connect( m_table, SIGNAL(returnPressed()),
+ this, SLOT(slotEditBreakpoint()));
+// connect( m_table, SIGNAL(f2Pressed()),
+// this, SLOT(slotEditBreakpoint()));
+ connect( m_table, SIGNAL(deletePressed()),
+ this, SLOT(slotRemoveBreakpoint()));
+ connect( m_table, SIGNAL(insertPressed()),
+ this, SLOT(slotAddBreakpoint()));
+}
+
+/***************************************************************************/
+
+RDBBreakpointWidget::~RDBBreakpointWidget()
+{
+ delete m_table;
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::reset()
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ btr->reset();
+ emit publishBPState(*(btr->breakpoint()));
+ }
+ }
+}
+
+/***************************************************************************/
+
+// When a file is loaded then we need to tell the editor (display window)
+// which lines contain a breakpoint.
+void RDBBreakpointWidget::slotRefreshBP(const KURL &filename)
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ FilePosBreakpoint* bp = dynamic_cast<FilePosBreakpoint*>(btr->breakpoint());
+ if (bp && (bp->fileName() == filename.path()))
+ emit refreshBPState(*bp);
+ }
+ }
+}
+
+/***************************************************************************/
+
+BreakpointTableRow* RDBBreakpointWidget::find(Breakpoint *breakpoint)
+{
+ // NOTE:- The match doesn't have to be equal. Each type of bp
+ // must decide on the match criteria.
+ Q_ASSERT (breakpoint);
+
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr && btr->match(breakpoint))
+ return btr;
+ }
+
+ return 0;
+}
+
+/***************************************************************************/
+
+// The Id is supplied by the debugger
+BreakpointTableRow* RDBBreakpointWidget::findId(int dbgId)
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr && btr->breakpoint()->dbgId() == dbgId)
+ return btr;
+ }
+
+ return 0;
+}
+
+/***************************************************************************/
+
+// The key is a unique number supplied by us
+BreakpointTableRow* RDBBreakpointWidget::findKey(int BPKey)
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr && btr->breakpoint()->key() == BPKey)
+ return btr;
+ }
+
+ return 0;
+}
+
+/***************************************************************************/
+
+BreakpointTableRow* RDBBreakpointWidget::addBreakpoint(Breakpoint *bp)
+{
+ BreakpointTableRow* btr =
+ new BreakpointTableRow( m_table, QTableItem::WhenCurrent, bp );
+ emit publishBPState(*bp);
+ return btr;
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::removeBreakpoint(BreakpointTableRow* btr)
+{
+ if (!btr)
+ return;
+
+ // Pending but the debugger hasn't started processing this bp so
+ // we can just remove it.
+ Breakpoint* bp = btr->breakpoint();
+ if (bp->isPending() && !bp->isDbgProcessing())
+ {
+ bp->setActionDie();
+ emit publishBPState(*bp);
+ m_table->removeRow(btr->row());
+ }
+ else
+ {
+ bp->setPending(true);
+ bp->setActionClear(true);
+ emit publishBPState(*bp);
+ btr->setRow();
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotToggleBreakpoint(const QString &fileName, int lineNum)
+{
+ FilePosBreakpoint *fpBP = new FilePosBreakpoint(fileName, lineNum+1);
+
+ BreakpointTableRow* btr = find(fpBP);
+ if (btr)
+ {
+ delete fpBP;
+ removeBreakpoint(btr);
+ }
+ else
+ addBreakpoint(fpBP);
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotToggleBreakpointEnabled(const QString &fileName, int lineNum)
+{
+ FilePosBreakpoint *fpBP = new FilePosBreakpoint(fileName, lineNum+1);
+
+ BreakpointTableRow* btr = find(fpBP);
+ delete fpBP;
+ if (btr)
+ {
+ Breakpoint* bp=btr->breakpoint();
+ bp->setEnabled(!bp->isEnabled());
+ emit publishBPState(*bp);
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotToggleWatchpoint(const QString &varName)
+{
+ Watchpoint *watchpoint = new Watchpoint(varName, false, true);
+ BreakpointTableRow* btr = find(watchpoint);
+ if (btr)
+ {
+ removeBreakpoint(btr);
+ delete watchpoint;
+ }
+ else
+ addBreakpoint(watchpoint);
+}
+
+/***************************************************************************/
+
+// The debugger allows us to set pending breakpoints => do it
+void RDBBreakpointWidget::slotSetPendingBPs()
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+
+ if (btr)
+ {
+ Breakpoint* bp = btr->breakpoint();
+ if (bp->isPending() && !bp->isDbgProcessing() && bp->isValid())
+ emit publishBPState(*bp);
+ }
+ }
+}
+
+/***************************************************************************/
+
+// The debugger is having trouble with this bp - probably because a library
+// was unloaded and invalidated a bp that was previously set in the library
+// code. Reset the bp so that we can try again later.
+void RDBBreakpointWidget::slotUnableToSetBPNow(int BPid)
+{
+ if (BPid == -1)
+ reset();
+ else
+ if (BreakpointTableRow *btr = findId(BPid))
+ btr->reset();
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotParseRDBBrkptList(char *str)
+{
+ // Another example of a not too uncommon occurance
+ // No breakpoints.
+
+ // Set the new active flag so that after we have read the
+ // breakpoint list we can trim the breakpoints that have been
+ // removed (temporary breakpoints do this)
+ m_activeFlag++;
+ QRegExp breakpoint_re("(\\d+) [^:]+:\\d+");
+ int pos = 0;
+
+ pos = breakpoint_re.search(str, pos);
+ while (pos >= 0) {
+ int id = breakpoint_re.cap(1).toInt();
+
+ BreakpointTableRow* btr = findId(id);
+ if (btr)
+ {
+ Breakpoint *bp = btr->breakpoint();
+ bp->setActive(m_activeFlag, id);
+ btr->setRow();
+ emit publishBPState(*bp);
+ }
+
+ pos += breakpoint_re.matchedLength();
+ pos = breakpoint_re.search(str, pos);
+ }
+
+ str = strstr(str, "Watchpoints:");
+ if (str != 0) {
+ QRegExp watchpoint_re("(\\d+) [^\n]+\n");
+ int pos = 0;
+
+ pos = watchpoint_re.search(str, pos);
+ while (pos >= 0) {
+ int id = watchpoint_re.cap(1).toInt();
+
+ BreakpointTableRow* btr = findId(id);
+ if (btr)
+ {
+ Breakpoint *bp = btr->breakpoint();
+ bp->setActive(m_activeFlag, id);
+ btr->setRow();
+ emit publishBPState(*bp);
+ }
+
+ pos += watchpoint_re.matchedLength();
+ pos = watchpoint_re.search(str, pos);
+ }
+ }
+
+ // Remove any inactive breakpoints.
+ for ( int row = m_table->numRows()-1; row >= 0 ; row-- )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ Breakpoint* bp = btr->breakpoint();
+ if (!(bp->isActive(m_activeFlag)))
+ removeBreakpoint(btr);
+ }
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotParseRDBBreakpointSet(char *str, int BPKey)
+{
+ BreakpointTableRow* btr = findKey(BPKey);
+ if (!btr)
+ return;
+
+ Breakpoint *bp = btr->breakpoint();
+ bp->setDbgProcessing(false);
+
+ QRegExp breakpoint_re("Set breakpoint (\\d+) at [^:]+:\\d+");
+ QRegExp watchpoint_re("Set watchpoint (\\d+)");
+
+ int id = 0;
+ if (breakpoint_re.search(str, 0) != -1) {
+ id = breakpoint_re.cap(1).toInt();
+ } else if (watchpoint_re.search(str, 0) != -1) {
+ id = watchpoint_re.cap(1).toInt();
+ }
+
+ if (id > 0)
+ {
+ bp->setActive(m_activeFlag, id);
+ emit publishBPState(*bp);
+ btr->setRow();
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotAddBlankBreakpoint(int idx)
+{
+ BreakpointTableRow* btr = 0;
+ switch (idx)
+ {
+ case BP_TYPE_FilePos:
+ btr = addBreakpoint(new FilePosBreakpoint("", 0));
+ break;
+
+ case BP_TYPE_Watchpoint:
+ btr = addBreakpoint(new Watchpoint(""));
+ break;
+
+ case BP_TYPE_Catchpoint:
+ btr = addBreakpoint(new Catchpoint(""));
+ break;
+
+ case BP_TYPE_Function:
+ btr = addBreakpoint(new FunctionBreakpoint(""));
+ break;
+
+ default:
+ break;
+ }
+
+ if (btr)
+ {
+ QTableSelection ts;
+ ts.init(btr->row(), 0);
+ ts.expandTo(btr->row(), numCols );
+ m_table->addSelection(ts);
+ m_table->editCell(btr->row(), Location, false);
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotRemoveBreakpoint()
+{
+ int row = m_table->currentRow();
+ if ( row != -1)
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ removeBreakpoint(btr);
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotRemoveAllBreakpoints()
+{
+ while (m_table->numRows() > 0)
+ {
+ for ( int row = m_table->numRows()-1; row>=0; row-- )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ removeBreakpoint(btr);
+ }
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotRowDoubleClicked(int row, int col, int btn, const QPoint &)
+{
+ if ( btn == Qt::LeftButton )
+ {
+// kdDebug(9012) << "in slotRowSelected row=" << row << endl;
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ FilePosBreakpoint* bp = dynamic_cast<FilePosBreakpoint*>(btr->breakpoint());
+ if (bp)
+ emit gotoSourcePosition(bp->fileName(), bp->lineNum()-1);
+
+ // put the focus back on the clicked item if appropriate
+ if (col == Location)
+ m_table->editCell(row, col, false);
+ }
+ }
+}
+
+void RDBBreakpointWidget::slotContextMenuShow( int row, int /*col*/, const QPoint &mousePos )
+{
+ BreakpointTableRow *btr = (BreakpointTableRow *)m_table->item( row, Control );
+
+ if (btr != NULL)
+ {
+ m_ctxMenu->setItemEnabled( BW_ITEM_Show, (btr->breakpoint( )->type( ) == BP_TYPE_FilePos) );
+ if (btr->breakpoint( )->isEnabled( ))
+ {
+ m_ctxMenu->changeItem( BW_ITEM_Disable, i18n("Disable") );
+ }
+ else
+ {
+ m_ctxMenu->changeItem( BW_ITEM_Disable, i18n("Enable") );
+ }
+
+ //m_ctxMenu->popup( mapToGlobal( mousePos ) );
+ m_ctxMenu->popup( mousePos );
+ }
+}
+
+void RDBBreakpointWidget::slotContextMenuSelect( int item )
+{
+ int row, col;
+ BreakpointTableRow *btr;
+ Breakpoint *bp;
+ FilePosBreakpoint *fbp;
+
+ row= m_table->currentRow( );
+ if (row == -1)
+ return;
+ btr = (BreakpointTableRow *)m_table->item( row, Control );
+ if (btr == NULL)
+ return;
+ bp = btr->breakpoint( );
+ if (bp == NULL)
+ return;
+ fbp = dynamic_cast<FilePosBreakpoint*>(bp);
+
+ switch( item )
+ {
+ case BW_ITEM_Show:
+ if (fbp)
+ emit gotoSourcePosition(fbp->fileName(), fbp->lineNum()-1);
+ break;
+ case BW_ITEM_Edit:
+ col = m_table->currentColumn( );
+ if (col == Location)
+ m_table->editCell(row, col, false);
+ break;
+ case BW_ITEM_Disable:
+ bp->setEnabled( !bp->isEnabled( ) );
+ btr->setRow( );
+ emit publishBPState( *bp );
+ break;
+ case BW_ITEM_Delete:
+ slotRemoveBreakpoint( );
+ break;
+ default:
+ // oops, check it out! this case is not in sync with the
+ // m_ctxMenu. Check the enum in the header file.
+ return;
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotEditRow(int row, int col, const QPoint &)
+{
+// kdDebug(9012) << "in slotEditRow row=" << row << endl;
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ if (col == Location)
+ m_table->editCell(row, col, false);
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotNewValue(int row, int col)
+{
+// kdDebug(9012) << "in slotNewValue row=" << row << endl;
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+
+ if (btr)
+ {
+ bool changed=false;
+ Breakpoint* bp = btr->breakpoint();
+ switch (col)
+ {
+
+ case Enable:
+ {
+ QCheckTableItem *item = (QCheckTableItem*)m_table->item ( row, Enable );
+ if ( item->isChecked() != bp->isEnabled() )
+ {
+ bp->setEnabled(item->isChecked());
+ bp->setPending(true);
+ bp->setActionModify(true);
+ changed = true;
+ }
+ break;
+ }
+
+ case Location:
+ {
+ if (bp->location() != m_table->text(btr->row(), Location))
+ {
+// kdDebug(9012) << "Old location [" << bp->location() << "]" << endl;
+// kdDebug(9012) << "New location [" << m_table->text(btr->row(), Location) << "]" << endl;
+ bp->setActionDie();
+ emit publishBPState(*bp);
+ bp->setPending(true);
+ bp->setActionAdd(true);
+ bp->setLocation(m_table->text(btr->row(), Location));
+ changed = true;
+ }
+ break;
+ }
+
+ case Type:
+ case Status:
+ default:
+ break;
+ }
+
+ if (changed)
+ {
+ btr->setRow();
+ emit publishBPState(*bp);
+ }
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotEditBreakpoint(const QString &fileName, int lineNum)
+{
+ FilePosBreakpoint *fpBP = new FilePosBreakpoint(fileName, lineNum+1);
+
+ BreakpointTableRow* btr = find(fpBP);
+ delete fpBP;
+
+ if (btr)
+ {
+ QTableSelection ts;
+ ts.init(btr->row(), 0);
+ ts.expandTo(btr->row(), numCols);
+ m_table->addSelection(ts);
+ m_table->editCell(btr->row(), Location, false);
+ }
+
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotEditBreakpoint()
+{
+ m_table->editCell(m_table->currentRow(), Location, false);
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::savePartialProjectSession(QDomElement* el)
+{
+ QDomDocument domDoc = el->ownerDocument();
+ if (domDoc.isNull())
+ return;
+
+ QDomElement breakpointListEl = domDoc.createElement("breakpointList");
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr =
+ (BreakpointTableRow *) m_table->item(row, Control);
+ Breakpoint* bp = btr->breakpoint();
+
+ QDomElement breakpointEl =
+ domDoc.createElement("breakpoint"+QString::number(row));
+
+ breakpointEl.setAttribute("type", bp->type());
+ breakpointEl.setAttribute("location", bp->location(false));
+ breakpointEl.setAttribute("enabled", bp->isEnabled());
+
+ breakpointListEl.appendChild(breakpointEl);
+ }
+
+ if (!breakpointListEl.isNull())
+ el->appendChild(breakpointListEl);
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::restorePartialProjectSession(const QDomElement* el)
+{
+ QDomElement breakpointListEl = el->namedItem("breakpointList").toElement();
+ if (!breakpointListEl.isNull())
+ {
+ QDomElement breakpointEl;
+ for (breakpointEl = breakpointListEl.firstChild().toElement();
+ !breakpointEl.isNull();
+ breakpointEl = breakpointEl.nextSibling().toElement())
+ {
+ Breakpoint* bp=0;
+ BP_TYPES type = (BP_TYPES) breakpointEl.attribute( "type", "0").toInt();
+ switch (type)
+ {
+ case BP_TYPE_FilePos:
+ {
+ bp = new FilePosBreakpoint("", 0);
+ break;
+ }
+ case BP_TYPE_Watchpoint:
+ {
+ bp = new Watchpoint("");
+ break;
+ }
+ case BP_TYPE_Catchpoint:
+ {
+ bp = new Catchpoint("");
+ break;
+ }
+ case BP_TYPE_Function:
+ {
+ bp = new FunctionBreakpoint("");
+ break;
+ }
+ default:
+ break;
+ }
+
+ // Common settings for any type of breakpoint
+ if (bp)
+ {
+ bp->setLocation(breakpointEl.attribute( "location", ""));
+ bp->setEnabled(breakpointEl.attribute( "enabled", "1").toInt());
+
+ // Add the bp if we don't already have it.
+ if (!find(bp))
+ addBreakpoint(bp);
+ else
+ delete bp;
+ }
+ }
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotAddBreakpoint( )
+{
+ if (m_add->popup())
+ {
+ m_add->popup()->popup(mapToGlobal(this->geometry().topLeft()));
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::focusInEvent( QFocusEvent */* e*/ )
+{
+ m_table->setFocus();
+}
+
+}
+
+
+#include "rdbbreakpointwidget.moc"
diff --git a/languages/ruby/debugger/rdbbreakpointwidget.h b/languages/ruby/debugger/rdbbreakpointwidget.h
new file mode 100644
index 00000000..65e6e15b
--- /dev/null
+++ b/languages/ruby/debugger/rdbbreakpointwidget.h
@@ -0,0 +1,120 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _RDBBreakpointWidget_H_
+#define _RDBBreakpointWidget_H_
+
+#include <qhbox.h>
+#include <qpopupmenu.h>
+
+class QDomElement;
+class QToolButton;
+class KURL;
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+class Breakpoint;
+class BreakpointTableRow;
+class RDBTable;
+
+class RDBBreakpointWidget : public QHBox
+{
+ Q_OBJECT
+
+public:
+ RDBBreakpointWidget( QWidget* parent=0, const char* name=0 );
+ virtual ~RDBBreakpointWidget();
+
+ void reset();
+
+ void savePartialProjectSession(QDomElement* el);
+ void restorePartialProjectSession(const QDomElement* el);
+
+
+public slots:
+ // Connected to from the editor widget:
+ void slotToggleBreakpoint(const QString &filename, int lineNum);
+ void slotToggleBreakpointEnabled(const QString &fileName, int lineNum);
+
+ // Connected to from the variable widget:
+ void slotToggleWatchpoint(const QString &varName);
+
+ // Connected to from the dbgcontroller:
+ void slotSetPendingBPs();
+ void slotUnableToSetBPNow(int BPNo);
+ void slotParseRDBBrkptList(char *str);
+ void slotParseRDBBreakpointSet(char *str, int BPKey);
+
+ void slotRefreshBP(const KURL &filename);
+
+protected:
+ enum BW_ITEMS { BW_ITEM_Show, BW_ITEM_Edit, BW_ITEM_Disable, BW_ITEM_Delete };
+ virtual void focusInEvent(QFocusEvent *e);
+
+private slots:
+ void slotRemoveBreakpoint();
+ void slotRemoveAllBreakpoints();
+ void slotEditBreakpoint(const QString &fileName, int lineNum);
+ void slotEditBreakpoint();
+ void slotAddBreakpoint();
+ void slotAddBlankBreakpoint(int idx);
+ void slotRowDoubleClicked(int row, int col, int button, const QPoint & mousePos);
+ void slotContextMenuShow( int row, int col, const QPoint &mousePos );
+ void slotContextMenuSelect( int item );
+ void slotEditRow(int row, int col, const QPoint & mousePos);
+ void slotNewValue(int row, int col);
+
+signals:
+ void publishBPState(const Breakpoint& brkpt);
+ void refreshBPState(const Breakpoint& brkpt);
+ void gotoSourcePosition(const QString &fileName, int lineNum);
+ void clearAllBreakpoints();
+
+private:
+ BreakpointTableRow* find(Breakpoint *bp);
+ BreakpointTableRow* findId(int id);
+ BreakpointTableRow* findKey(int BPKey);
+
+ void setActive();
+ BreakpointTableRow* addBreakpoint(Breakpoint *bp);
+ void removeBreakpoint(BreakpointTableRow* btr);
+
+private:
+ RDBTable* m_table;
+
+ QToolButton* m_add;
+ QToolButton* m_delete;
+ QToolButton* m_edit;
+ QToolButton* m_removeAll;
+ QPopupMenu* m_ctxMenu;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdbcommand.cpp b/languages/ruby/debugger/rdbcommand.cpp
new file mode 100644
index 00000000..98dc3a80
--- /dev/null
+++ b/languages/ruby/debugger/rdbcommand.cpp
@@ -0,0 +1,81 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "rdbcommand.h"
+#include "breakpoint.h"
+#include "variablewidget.h"
+
+namespace RDBDebugger
+{
+
+
+RDBCommand::RDBCommand(const QCString &setCommand, bool isRunCmd, bool isInfoCmd)
+ : DbgCommand(setCommand, isRunCmd, isInfoCmd)
+{
+// if (prompt_) {
+// cmdBuffer_ = QCString().sprintf("set prompt %c%c\n", BLOCK_START, prompt_) +
+// command_ +
+// idlePrompt_;
+// }
+}
+
+/***************************************************************************/
+
+RDBCommand::~RDBCommand()
+{
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+RDBItemCommand::RDBItemCommand( VarItem *item,
+ const QCString &command,
+ bool isRunCmd)
+ : RDBCommand(command, isRunCmd, true),
+ item_(item)
+{
+}
+
+/***************************************************************************/
+
+RDBItemCommand::~RDBItemCommand()
+{
+}
+
+
+RDBSetBreakpointCommand::RDBSetBreakpointCommand(const QCString &command, int key)
+ : RDBCommand(command, false, false),
+ key_(key)
+{
+}
+
+/***************************************************************************/
+
+RDBSetBreakpointCommand::~RDBSetBreakpointCommand()
+{
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
diff --git a/languages/ruby/debugger/rdbcommand.h b/languages/ruby/debugger/rdbcommand.h
new file mode 100644
index 00000000..663c8119
--- /dev/null
+++ b/languages/ruby/debugger/rdbcommand.h
@@ -0,0 +1,99 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _RDBCOMMAND_H_
+#define _RDBCOMMAND_H_
+
+#include "dbgcommand.h"
+
+namespace RDBDebugger
+{
+
+class Breakpoint;
+class VarItem;
+
+// sigh - namespace's don't work on some of the older compilers
+enum RDBCmd
+{
+ CONSTANTS = 'C',
+ CVARS = 'V',
+ IVARS = 'I',
+ LOCALS = 'L'
+};
+
+#define RUNCMD (true)
+#define NOTRUNCMD (false)
+#define INFOCMD (true)
+#define NOTINFOCMD (false)
+
+/**
+ * @author John Birch
+ */
+
+class RDBCommand : public DbgCommand
+{
+public:
+ RDBCommand(const QCString& command, bool isRunCmd=false, bool isInfoCmd=true);
+ virtual ~RDBCommand();
+
+private:
+ static QCString idlePrompt_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class RDBItemCommand : public RDBCommand
+{
+public:
+ RDBItemCommand(VarItem *item, const QCString &command,
+ bool isRunCmd=false);
+ virtual ~RDBItemCommand();
+
+ VarItem *getItem() { return item_; }
+
+private:
+ VarItem *item_;
+};
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class RDBSetBreakpointCommand : public RDBCommand
+{
+public:
+ RDBSetBreakpointCommand(const QCString& setCommand, int key);
+ virtual ~RDBSetBreakpointCommand();
+
+ int getKey() const { return key_; }
+
+private:
+ int key_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdbcontroller.cpp b/languages/ruby/debugger/rdbcontroller.cpp
new file mode 100644
index 00000000..160754a0
--- /dev/null
+++ b/languages/ruby/debugger/rdbcontroller.cpp
@@ -0,0 +1,1414 @@
+// *************************************************************************
+// rdbcontroller.cpp - description
+// -------------------
+// begin : Sun Aug 8 1999
+// copyright : (C) 1999 by John Birch
+// email : jbb@kdevelop.org
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : Richard_Dale@tipitina.demon.co.uk
+// **************************************************************************
+//
+// **************************************************************************
+// * *
+// * 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. *
+// * *
+// **************************************************************************
+
+#include "rdbcontroller.h"
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <errno.h>
+
+#include "breakpoint.h"
+#include "framestackwidget.h"
+#include "rdbcommand.h"
+#include "stty.h"
+#include "variablewidget.h"
+#include "domutil.h"
+#include "settings.h"
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+
+#include <qdatetime.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtextstream.h>
+
+#include <iostream>
+#include <ctype.h>
+#include <stdlib.h>
+using namespace std;
+
+// **************************************************************************
+//
+// Does all the communication between rdb and the kdevelop's debugger code.
+// Significatant classes being used here are
+//
+// RDBParser - parses the "variable" data using the vartree and varitems
+// VarTree - where the variable data will end up
+// FrameStack - tracks the program frames and allows the user to switch between
+// and therefore view the calling funtions and their data
+// Breakpoint - Where and what to do with breakpoints.
+// STTY - the tty that the _application_ will run on.
+//
+// Significant variables
+// state_ - be very careful setting this. The controller is totally
+// dependent on this reflecting the correct state. For instance,
+// if the app is busy but we don't think so, then we lose control
+// of the app. The only way to get out of these situations is to
+// delete (stop) the controller.
+// currentFrame_
+// - Holds the frame number where and locals/variable information will
+// go to
+//
+//
+// **************************************************************************
+
+namespace RDBDebugger
+{
+
+// This is here so we can check for startup /shutdown problems
+int debug_controllerExists = false;
+
+// At the moment a Unix domain socket is used. It might be better to
+// change to tcp/ip and listen on a port instead
+QCString RDBController::unixSocketPath_;
+
+
+RDBController::RDBController(VariableTree *varTree, FramestackWidget *frameStack, QDomDocument &projectDom)
+ : DbgController(),
+ frameStack_(frameStack),
+ varTree_(varTree),
+ currentFrame_(1),
+ viewedThread_(-1),
+ stdoutOutputLen_(0),
+ stdoutOutput_(new char[4096]),
+ holdingZone_(),
+ rdbOutputLen_(0),
+ rdbOutput_(new char[49152]),
+ socketNotifier_(0),
+ currentCmd_(0),
+ currentPrompt_("(rdb:1) "),
+ tty_(0),
+ state_(s_dbgNotStarted|s_appNotStarted|s_silent),
+ programHasExited_(false),
+ dom(projectDom),
+ config_forceBPSet_(true),
+ config_dbgTerminal_(false)
+{
+ struct sockaddr_un sockaddr;
+ unixSocketPath_.sprintf("/tmp/.rubydebugger%d", getpid());
+ QFileInfo unixSocket(unixSocketPath_);
+
+ stdoutSizeofBuf_ = sizeof(stdoutOutput_);
+ rdbSizeofBuf_ = sizeof(rdbOutput_);
+
+ if (unixSocket.exists()) {
+ unlink(unixSocketPath_);
+ }
+
+ masterSocket_ = socket(AF_UNIX, SOCK_STREAM, 0);
+ sockaddr.sun_family = AF_UNIX;
+ strcpy(sockaddr.sun_path, unixSocketPath_);
+ bind(masterSocket_, (const struct sockaddr*) &sockaddr, sizeof(sockaddr));
+ listen(masterSocket_, 1);
+ acceptNotifier_ = new QSocketNotifier(masterSocket_, QSocketNotifier::Read, this);
+ QObject::connect( acceptNotifier_, SIGNAL(activated(int)),
+ this, SLOT(slotAcceptConnection(int)) );
+
+ configure();
+ cmdList_.setAutoDelete(true);
+
+ Q_ASSERT(! debug_controllerExists);
+ debug_controllerExists = true;
+}
+
+// **************************************************************************
+
+// Deleting the controller involves shutting down rdb nicely.
+// When were attached to a process, we must first detach so that the process
+// can continue running as it was before being attached. rdb is quite slow to
+// detach from a process, so we must process events within here to get a "clean"
+// shutdown.
+RDBController::~RDBController()
+{
+ delete[] stdoutOutput_;
+ delete[] rdbOutput_;
+ debug_controllerExists = false;
+
+ QFileInfo unixSocket(unixSocketPath_);
+ if (unixSocket.exists()) {
+ unlink(unixSocketPath_);
+ }
+}
+
+// **************************************************************************
+
+void RDBController::configure()
+{
+}
+
+// **************************************************************************
+
+// Fairly obvious that we'll add whatever command you give me to a queue
+// If you tell me to, I'll put it at the head of the queue so it'll run ASAP
+// Not quite so obvious though is that if we are going to run again. then any
+// information requests become redundent and must be removed.
+// We also try and run whatever command happens to be at the head of
+// the queue.
+void RDBController::queueCmd(DbgCommand *cmd, bool executeNext)
+{
+ // We remove any info command or _run_ command if we are about to
+ // add a run command.
+ if (cmd->isARunCmd())
+ removeInfoRequests();
+
+ if (executeNext)
+ cmdList_.insert(0, cmd);
+ else
+ cmdList_.append (cmd);
+}
+
+// **************************************************************************
+
+// If the appliction can accept a command and we've got one waiting
+// then send it.
+// Commands can be just request for data (or change rdbs state in someway)
+// or they can be "run" commands. If a command is sent to rdb our internal
+// state will get updated.
+void RDBController::executeCmd()
+{
+ if (stateIsOn(s_dbgNotStarted|s_waitForWrite|s_appBusy|s_shuttingDown) || !dbgProcess_)
+ return;
+
+ if (currentCmd_ == 0) {
+ if (cmdList_.isEmpty())
+ return;
+
+ currentCmd_ = cmdList_.take(0);
+ }
+
+ if (!currentCmd_->moreToSend()) {
+ delete currentCmd_;
+ if (cmdList_.isEmpty()) {
+ currentCmd_ = 0;
+ return;
+ }
+
+ currentCmd_ = cmdList_.take(0);
+ }
+
+ char * ptr = currentCmd_->cmdToSend().data();
+ int bytesToWrite = currentCmd_->cmdLength();
+ int bytesWritten = 0;
+
+ while (bytesToWrite > 0) {
+ bytesWritten = write(socket_, ptr, bytesToWrite);
+ bytesToWrite -= bytesWritten;
+ ptr += bytesWritten;
+ }
+
+ if (currentCmd_->isARunCmd()) {
+ setStateOn(s_appBusy);
+ kdDebug(9012) << "App is busy" << endl;
+ setStateOff(s_appNotStarted|s_programExited|s_silent);
+ }
+
+ QString prettyCmd = currentCmd_->cmdToSend();
+ prettyCmd = currentPrompt_ + prettyCmd;
+ emit rdbStdout( prettyCmd.latin1() );
+
+ if (!stateIsOn(s_silent))
+ emit dbgStatus("", state_);
+}
+
+// **************************************************************************
+
+void RDBController::destroyCmds()
+{
+ if (currentCmd_)
+ {
+ delete currentCmd_;
+ currentCmd_ = 0;
+ }
+
+ while (!cmdList_.isEmpty())
+ delete cmdList_.take(0);
+}
+
+// **********************************************************************
+
+void RDBController::removeInfoRequests()
+{
+ int i = cmdList_.count();
+ while (i)
+ {
+ i--;
+ DbgCommand *cmd = cmdList_.at(i);
+ if (cmd->isAnInfoCmd() || cmd->isARunCmd())
+ delete cmdList_.take(i);
+ }
+}
+
+// **********************************************************************
+
+// Pausing an app removes any pending run commands so that the app doesn't
+// start again. If we want to be silent then we remove any pending info
+// commands as well.
+void RDBController::pauseApp()
+{
+ int i = cmdList_.count();
+ while (i)
+ {
+ i--;
+ DbgCommand *cmd = cmdList_.at(i);
+ if ((stateIsOn(s_silent) && cmd->isAnInfoCmd()) || cmd->isARunCmd())
+ delete cmdList_.take(i);
+ }
+
+ if (dbgProcess_ && stateIsOn(s_appBusy))
+ dbgProcess_->kill(SIGINT);
+}
+
+// **********************************************************************
+
+// Whenever the program pauses we need to refresh the data visible to
+// the user. The reason we've stopped may be passed in to be emitted.
+void RDBController::actOnProgramPause(const QString &msg)
+{
+ // We're only stopping if we were running, of course.
+ if (stateIsOn(s_appBusy))
+ {
+ kdDebug(9012) << "App is paused" << endl;
+ setStateOff(s_appBusy);
+ if (stateIsOn(s_silent))
+ return;
+
+ emit dbgStatus (msg, state_);
+
+ // We're always at frame one when the program stops
+ // and we must reset the active flag
+ currentFrame_ = 1;
+ varTree_->nextActivationId();
+ setStateOn(s_fetchLocals);
+
+ queueCmd(new RDBCommand("where", NOTRUNCMD, INFOCMD), true);
+ queueCmd(new RDBCommand("thread list", NOTRUNCMD, INFOCMD), true);
+
+ if (stateIsOn(s_fetchGlobals)) {
+ queueCmd(new RDBCommand("var global", NOTRUNCMD, INFOCMD));
+ }
+
+ emit acceptPendingBPs();
+ }
+}
+
+// **************************************************************************
+
+// There is no app anymore. This can be caused by program exiting
+// an invalid program specified or ...
+// rdb is still running though, but only the run command (may) make sense
+// all other commands are disabled.
+void RDBController::programNoApp(const QString &msg, bool msgBox)
+{
+ state_ = (s_appNotStarted|s_programExited|(state_&(s_shuttingDown)));
+ destroyCmds();
+
+ // We're always at frame one when the program stops
+ // and we must reset the active flag
+ viewedThread_ = -1;
+ currentFrame_ = 1;
+ varTree_->nextActivationId();
+
+ // Now wipe the tree out
+ varTree_->viewport()->setUpdatesEnabled(false);
+ varTree_->prune();
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+
+ frameStack_->clear();
+
+ if (msgBox)
+ KMessageBox::error(0, i18n("rdb message:\n")+msg);
+
+ emit dbgStatus (msg, state_);
+}
+
+// **************************************************************************
+
+// The program location falls out of rdb. We treat
+// it as a wrapped command.
+// The data gets parsed here and emitted in its component parts.
+void RDBController::parseProgramLocation(char *buf)
+{
+ QString buffer(buf);
+ QString line;
+ QTextStream input(&buffer, IO_ReadOnly);
+ QString sourceFile;
+ int sourceLine = 0;
+
+ // "1: a = 1"
+ QRegExp display_re("^(\\d+):\\s(.*)$");
+
+ // "/opt/qt/src/widgets/qlistview.rb:1558:puts 'hello world'"
+ QRegExp sourcepos_re("^([^:]+):(\\d+):");
+
+ line = input.readLine();
+ while (! line.isNull()) {
+ if (sourcepos_re.search(line, 0) >= 0) {
+ sourceFile = sourcepos_re.cap(1);
+ sourceLine = sourcepos_re.cap(2).toInt();
+ } else if (display_re.search(line, 0) >= 0) {
+ varTree_->watchRoot()->updateWatchExpression(display_re.cap(1).toInt(), display_re.cap(2));
+ }
+
+ line = input.readLine();
+ }
+
+ if ( !sourceFile.isNull()
+ && ( traceIntoRuby_
+ || ( !sourceFile.endsWith("/qtruby.rb")
+ && !sourceFile.endsWith("/korundum.rb") ) )
+ && !sourceFile.endsWith("/debuggee.rb") )
+ {
+ actOnProgramPause(QString());
+ emit showStepInSource(sourceFile, sourceLine, "");
+ return;
+ }
+
+ if (stateIsOn(s_appBusy))
+ actOnProgramPause(i18n("No source: %1").arg(sourceFile));
+ else
+ emit dbgStatus (i18n("No source: %1").arg(sourceFile), state_);
+}
+
+// **************************************************************************
+
+// parsing the backtrace list will cause the vartree to be refreshed
+void RDBController::parseBacktraceList(char *buf)
+{
+ frameStack_->parseRDBBacktraceList(buf);
+}
+
+// **************************************************************************
+
+void RDBController::parseThreadList(char *buf)
+{
+ frameStack_->parseRDBThreadList(buf);
+ viewedThread_ = frameStack_->viewedThread();
+ varTree_->setCurrentThread(viewedThread_);
+}
+
+// **************************************************************************
+
+void RDBController::parseSwitchThread(char *buf)
+{
+ // Look for the thread number
+ // 2 #<Thread:0x30091998 sleep> /home/duke/play/testit/trykorundum/src/bar.rb:13
+ QRegExp thread_re("(\\d+)");
+ if (thread_re.search(buf) != -1) {
+ viewedThread_ = thread_re.cap(1).toInt();
+ currentFrame_ = 1;
+ }
+}
+
+// **************************************************************************
+
+// After an 'up nnn' or 'down nnn' command, get the new source file and line no.
+void RDBController::parseFrameMove(char *buf)
+{
+ QString sourceFile;
+ int sourceLine = 0;
+
+ if (stateIsOn(s_fetchLocals)) {
+ return;
+ }
+
+ // "#2 /home/duke/play/testit/trykorundum/src/main.rb:11"
+ QRegExp sourcepos_re("#\\d+\\s([^:]+):(\\d+)");
+ if (sourcepos_re.search(buf) != -1) {
+ sourceFile = sourcepos_re.cap(1);
+ sourceLine = sourcepos_re.cap(2).toInt();
+
+ if ( !sourceFile.isNull()
+ && ( traceIntoRuby_
+ || ( !sourceFile.endsWith("/qtruby.rb")
+ && !sourceFile.endsWith("/korundum.rb") ) )
+ && !sourceFile.endsWith("/debuggee.rb") )
+ {
+ emit showStepInSource(sourceFile, sourceLine, "");
+ return;
+ }
+ }
+
+ emit dbgStatus(i18n("No source: %1").arg(sourceFile), state_);
+}
+
+// **************************************************************************
+
+// When a breakpoint has been set, rdb responds with some data about the
+// new breakpoint. We just inform the breakpoint system about this.
+void RDBController::parseBreakpointSet(char *buf)
+{
+ if (RDBSetBreakpointCommand *BPCmd = dynamic_cast<RDBSetBreakpointCommand*>(currentCmd_))
+ {
+ // ... except in this case :-) A -1 key tells us that this is
+ // a special internal breakpoint, and we shouldn't do anything
+ // with it. Currently there are _no_ internal breakpoints.
+ if (BPCmd->getKey() != -1) {
+ emit rawRDBBreakpointSet(buf, BPCmd->getKey());
+ }
+ }
+}
+
+// **************************************************************************
+
+// Extra data needed by an item was requested. Here's the result.
+// If it's an ordinary 'p ' command then just echo the result on
+// the RDB console and don't bother parsing.
+void RDBController::parseRequestedData(char *buf)
+{
+ if (RDBItemCommand *rdbItemCommand = dynamic_cast<RDBItemCommand*> (currentCmd_))
+ {
+ // Fish out the item from the command and let it deal with the data
+ VarItem *item = rdbItemCommand->getItem();
+ varTree_->viewport()->setUpdatesEnabled(false);
+ item->expandValue(buf);
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+ }
+}
+
+
+// **************************************************************************
+
+// Select a different frame to view. We need to get and (maybe) display
+// where we are in the program source.
+void RDBController::parseFrameSelected(char *buf)
+{
+ if (!stateIsOn(s_silent)) {
+ emit showStepInSource("", -1, "");
+ emit dbgStatus (i18n("No source: %1").arg(QString(buf)), state_);
+ }
+}
+
+// **************************************************************************
+
+// Sets the id of the display in the VarTree and a current value.
+void RDBController::parseDisplay(char *buf, char * expr)
+{
+ varTree_->viewport()->setUpdatesEnabled(false);
+ varTree_->watchRoot()->setWatchExpression(buf, expr);
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+}
+
+// **************************************************************************
+
+// Updates the watch expressions with current values
+void RDBController::parseUpdateDisplay(char *buf)
+{
+ varTree_->viewport()->setUpdatesEnabled(false);
+
+ QRegExp display_re("(\\d+):\\s([^\n]*)\n");
+
+ int pos = display_re.search(buf);
+ while (pos != -1) {
+ varTree_->watchRoot()->updateWatchExpression(display_re.cap(1).toInt(), display_re.cap(2));
+
+ pos += display_re.matchedLength();
+ pos = display_re.search(buf, pos);
+ }
+
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+}
+
+// **************************************************************************
+
+// This is called on program stop to process the globals.
+void RDBController::parseGlobals(char *buf)
+{
+ varTree_->viewport()->setUpdatesEnabled(false);
+ varTree_->globalRoot()->setGlobals(buf);
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+}
+
+// **************************************************************************
+
+// This is called on program stop to process the locals.
+// Once the locals have been processed we prune the tree of items that are
+// inactive.
+void RDBController::parseLocals(char type, char *buf)
+{
+ varTree_->viewport()->setUpdatesEnabled(false);
+
+ // The locals are always attached to the currentFrame
+ VarFrameRoot *frame = varTree_->findFrame(currentFrame_, viewedThread_);
+ if (!frame)
+ {
+ frame = new VarFrameRoot(varTree_, currentFrame_, viewedThread_);
+ frame->setFrameName(
+ frameStack_->findFrame(currentFrame_, viewedThread_)->frameName());
+ }
+
+ Q_ASSERT(frame);
+
+ if (type == (char) CONSTANTS) {
+ frame->addLocals(buf);
+ } else if (type == (char) CVARS) {
+ frame->addLocals(buf);
+ } else if (type == (char) IVARS) {
+ frame->addLocals(buf);
+ } else {
+ frame->addLocals(buf);
+ frame->setLocals();
+ }
+
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+}
+
+
+
+// **************************************************************************
+
+void RDBController::parse(char *buf)
+{
+ if (currentCmd_ == 0) {
+ return;
+ }
+
+ if (currentCmd_->isARunCmd()) {
+ parseProgramLocation(buf);
+ } else if (currentCmd_->rawDbgCommand() == "break") {
+ emit rawRDBBreakpointList(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "break ", strlen("break ")) == 0) {
+ parseBreakpointSet(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "watch ", strlen("watch ")) == 0) {
+ parseBreakpointSet(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "display ", strlen("display ")) == 0) {
+ parseDisplay(buf, currentCmd_->rawDbgCommand().data() + strlen("display "));
+ } else if (currentCmd_->rawDbgCommand() == "display") {
+ parseUpdateDisplay(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "undisplay ", strlen("undisplay ")) == 0) {
+ ;
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "method instance ", strlen("method instance ")) == 0) {
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "method ", strlen("method ")) == 0) {
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "pp ", strlen("pp ")) == 0) {
+ parseRequestedData(buf);
+ } else if (currentCmd_->rawDbgCommand() == "thread list") {
+ parseThreadList(buf);
+ } else if ( qstrncmp(currentCmd_->rawDbgCommand(), "up ", strlen("up ")) == 0
+ || qstrncmp(currentCmd_->rawDbgCommand(), "down ", strlen("down ")) == 0 )
+ {
+ parseFrameMove(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "thread switch ", strlen("thread switch ")) == 0) {
+ parseSwitchThread(buf);
+ } else if (currentCmd_->rawDbgCommand() == "thread current") {
+ parseThreadList(buf);
+ } else if (currentCmd_->rawDbgCommand() == "where") {
+ parseBacktraceList(buf);
+ } else if (currentCmd_->rawDbgCommand() == "var global") {
+ parseGlobals(buf);
+ } else if (currentCmd_->rawDbgCommand() == "var local") {
+ parseLocals(LOCALS, buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "var instance ", strlen("var instance ")) == 0) {
+ parseLocals(IVARS, buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "var class ", strlen("var class ")) == 0) {
+ parseLocals(CVARS, buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "var const ", strlen("var const ")) == 0) {
+ parseLocals(CONSTANTS, buf);
+ }
+
+ return;
+}
+
+// **************************************************************************
+
+void RDBController::setBreakpoint(const QCString &BPSetCmd, int key)
+{
+ queueCmd(new RDBSetBreakpointCommand(BPSetCmd, key));
+}
+
+// **************************************************************************
+
+void RDBController::clearBreakpoint(const QCString &BPClearCmd)
+{
+ queueCmd(new RDBCommand(BPClearCmd, NOTRUNCMD, NOTINFOCMD));
+ // Note: this is NOT an info command, because rdb doesn't explictly tell
+ // us that the breakpoint has been deleted, so if we don't have it the
+ // BP list doesn't get updated.
+ queueCmd(new RDBCommand("break", NOTRUNCMD, NOTINFOCMD));
+}
+
+// **************************************************************************
+
+void RDBController::modifyBreakpoint( const Breakpoint& BP )
+{
+ Q_ASSERT(BP.isActionModify());
+ if (BP.dbgId() > 0)
+ {
+ if (BP.changedEnable())
+ queueCmd(new RDBCommand(QCString().sprintf("%s %d",
+ BP.isEnabled() ? "enable" : "disable",
+ BP.dbgId()), NOTRUNCMD, NOTINFOCMD));
+
+ // BP.setDbgProcessing(true);
+ // Note: this is NOT an info command, because rdb doesn't explictly tell
+ // us that the breakpoint has been deleted, so if we don't have it the
+ // BP list doesn't get updated.
+ queueCmd(new RDBCommand("break", NOTRUNCMD, NOTINFOCMD));
+ }
+}
+
+// **************************************************************************
+// SLOTS
+// *****
+// For most of these slots data can only be sent to rdb when it
+// isn't busy and it is running.
+
+// **************************************************************************
+
+void RDBController::slotStart(const QString& ruby_interpreter, const QString& character_coding, const QString& run_directory, const QString& debuggee_path, const QString &application, const QString& run_arguments, bool show_constants, bool trace_into_ruby)
+{
+ Q_ASSERT (!dbgProcess_ && !tty_);
+
+// tty_ = new STTY(config_dbgTerminal_, "konsole");
+ tty_ = new STTY(config_dbgTerminal_, Settings::terminalEmulatorName( *kapp->config() ));
+ if (!config_dbgTerminal_)
+ {
+ connect( tty_, SIGNAL(OutOutput(const char*)), SIGNAL(ttyStdout(const char*)) );
+ connect( tty_, SIGNAL(ErrOutput(const char*)), SIGNAL(ttyStderr(const char*)) );
+ }
+
+ QString tty(tty_->getSlave());
+ if (tty.isEmpty())
+ {
+ KMessageBox::error(0, i18n("The ruby debugger cannot use the tty* or pty* devices.\n"
+ "Check the settings on /dev/tty* and /dev/pty*\n"
+ "As root you may need to \"chmod ug+rw\" tty* and pty* devices "
+ "and/or add the user to the tty group using "
+ "\"usermod -G tty username\"."));
+
+ delete tty_;
+ tty_ = 0;
+ return;
+ }
+
+ dbgProcess_ = new KProcess;
+
+ connect( dbgProcess_, SIGNAL(receivedStdout(KProcess *, char *, int)),
+ this, SLOT(slotDbgStdout(KProcess *, char *, int)) );
+
+ connect( dbgProcess_, SIGNAL(receivedStderr(KProcess *, char *, int)),
+ this, SLOT(slotDbgStderr(KProcess *, char *, int)) );
+
+ connect( dbgProcess_, SIGNAL(wroteStdin(KProcess *)),
+ this, SLOT(slotDbgWroteStdin(KProcess *)) );
+
+ connect( dbgProcess_, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotDbgProcessExited(KProcess*)) );
+
+ rubyInterpreter_ = ruby_interpreter;
+ characterCoding_ = character_coding;
+ runDirectory_ = run_directory;
+ debuggeePath_ = debuggee_path;
+ application_ = application;
+ runArguments_ = run_arguments;
+ showConstants_ = show_constants;
+ traceIntoRuby_ = trace_into_ruby;
+
+ *dbgProcess_ << ruby_interpreter;
+ *dbgProcess_ << character_coding;
+ *dbgProcess_ << "-C" << QString(QFile::encodeName( run_directory ));
+ *dbgProcess_ << "-r" << debuggee_path;
+ *dbgProcess_ << application;
+
+ if (!run_arguments.isNull() && !run_arguments.isEmpty()) {
+ *dbgProcess_ << run_arguments;
+ }
+
+ emit rdbStdout(QString( ruby_interpreter + " " + character_coding
+ + " -C " + QString(QFile::encodeName( run_directory ))
+ + " -r " + debuggee_path + " "
+ + application + " " + run_arguments ).latin1() );
+
+ if (!dbgProcess_->start( KProcess::NotifyOnExit,
+ KProcess::Communication(KProcess::All)) )
+ {
+ kdDebug(9012) << "Couldn't start ruby debugger" << endl;
+ }
+
+ // Initialise rdb. At this stage rdb is sitting wondering what to do,
+ // and to whom. Organise a few things, then set up the tty for the application,
+ // and the application itself
+
+ // Now the ruby debugger has been started and the application has been loaded,
+ // BUT the app hasn't been started yet! A run command is about to be issued
+ // by whoever is controlling us.
+
+ if (!dbgProcess_->writeStdin(QString("%1\n").arg(unixSocketPath_).latin1(), strlen(unixSocketPath_) + 1)) {
+ kdDebug(9012) << "failed to write Unix domain socket path to rdb "
+ << QString("%1\n").arg(unixSocketPath_).latin1() << endl;
+ }
+
+ setStateOff(s_programExited);
+ setStateOn(s_dbgNotStarted|s_appNotStarted|s_silent);
+}
+
+// **************************************************************************
+
+void RDBController::slotStopDebugger()
+{
+ if (stateIsOn(s_shuttingDown) || !dbgProcess_)
+ return;
+
+ setStateOn(s_shuttingDown|s_silent);
+ destroyCmds();
+
+ QTime start;
+ QTime now;
+
+ // Get rdb's attention if it's busy. We need rdb to be at the
+ // command line so we can stop it.
+ if (stateIsOn(s_appBusy))
+ {
+ kdDebug(9012) << "ruby debugger busy on shutdown - stopping rdb (SIGINT)" << endl;
+ dbgProcess_->kill(SIGINT);
+ start = QTime::currentTime();
+ while (-1)
+ {
+ kapp->processEvents(20);
+ now = QTime::currentTime();
+ if (!stateIsOn(s_appBusy) || start.msecsTo( now ) > 2000)
+ break;
+ }
+ }
+
+
+ // Now try to stop the ruby debugger running.
+ kdDebug(9012) << "App is busy" << endl;
+ setStateOn(s_appBusy);
+ const char *quit="quit\n";
+ if (!dbgProcess_->writeStdin(quit, strlen(quit)))
+ kdDebug(9012) << "failed to write 'quit' to ruby debugger" << endl;
+
+ emit rdbStdout("(rdb:1) quit");
+ start = QTime::currentTime();
+ while (-1)
+ {
+ kapp->processEvents(20);
+ now = QTime::currentTime();
+ if (stateIsOn(s_programExited) || start.msecsTo( now ) > 2000)
+ break;
+ }
+
+ // We cannot wait forever.
+ if (!stateIsOn(s_programExited))
+ {
+ kdDebug(9012) << "rdb not shutdown - killing" << endl;
+ dbgProcess_->kill(SIGKILL);
+ }
+
+ delete dbgProcess_; dbgProcess_ = 0;
+ delete tty_; tty_ = 0;
+
+ state_ = s_dbgNotStarted | s_appNotStarted | s_silent;
+ emit dbgStatus (i18n("Debugger stopped"), state_);
+}
+
+
+
+// **************************************************************************
+
+void RDBController::slotRun()
+{
+ if (stateIsOn(s_appBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ if (stateIsOn(s_programExited)) {
+ slotStart(rubyInterpreter_, characterCoding_, runDirectory_, debuggeePath_, application_, runArguments_, showConstants_, traceIntoRuby_);
+ return;
+ }
+
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+void RDBController::slotRunUntil(const QString &fileName, int lineNum)
+{
+ if (stateIsOn(s_appBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ if (fileName.isEmpty())
+ queueCmd(new RDBCommand( QCString().sprintf("break %d", lineNum),
+ RUNCMD, NOTINFOCMD));
+ else
+ queueCmd(new RDBCommand(
+ QCString().sprintf("break %s:%d", fileName.latin1(), lineNum),
+ RUNCMD, NOTINFOCMD));
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+void RDBController::slotStepInto()
+{
+ if (stateIsOn(s_appBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ queueCmd(new RDBCommand("step", RUNCMD, NOTINFOCMD));
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+
+// **************************************************************************
+
+void RDBController::slotStepOver()
+{
+ if (stateIsOn(s_appBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ queueCmd(new RDBCommand("next", RUNCMD, NOTINFOCMD));
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+
+// **************************************************************************
+
+void RDBController::slotStepOutOff()
+{
+ if (stateIsOn(s_appBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ queueCmd(new RDBCommand("finish", RUNCMD, NOTINFOCMD));
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+// Only interrupt a running program.
+void RDBController::slotBreakInto()
+{
+ pauseApp();
+}
+
+// **************************************************************************
+
+// See what, if anything needs doing to this breakpoint.
+void RDBController::slotBPState( const Breakpoint& BP )
+{
+ // Are we in a position to do anything to this breakpoint?
+ if (stateIsOn(s_dbgNotStarted|s_shuttingDown) || !BP.isPending() ||
+ BP.isActionDie())
+ return;
+
+ // We need this flag so that we can continue execution. I did use
+ // the s_silent state flag but it can be set prior to this method being
+ // called, hence is invalid.
+ bool restart = false;
+ if (stateIsOn(s_appBusy))
+ {
+ if (!config_forceBPSet_)
+ return;
+
+ // When forcing breakpoints to be set/unset, interrupt a running app
+ // and change the state.
+ setStateOn(s_silent);
+ pauseApp();
+ restart = true;
+ }
+
+ if (BP.isActionAdd())
+ {
+ setBreakpoint(BP.dbgSetCommand().latin1(), BP.key());
+ // BP.setDbgProcessing(true);
+ }
+ else
+ {
+ if (BP.isActionClear())
+ {
+ clearBreakpoint(BP.dbgRemoveCommand().latin1());
+ // BP.setDbgProcessing(true);
+ }
+ else
+ {
+ if (BP.isActionModify())
+ {
+ modifyBreakpoint(BP); // Note: DbgProcessing gets set in modify fn
+ }
+ }
+ }
+
+ if (restart)
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+}
+
+// **************************************************************************
+
+void RDBController::slotClearAllBreakpoints()
+{
+ // Are we in a position to do anything to this breakpoint?
+ if (stateIsOn(s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ bool restart = false;
+ if (stateIsOn(s_appBusy))
+ {
+ if (!config_forceBPSet_)
+ return;
+
+ // When forcing breakpoints to be set/unset, interrupt a running app
+ // and change the state.
+ setStateOn(s_silent);
+ pauseApp();
+ restart = true;
+ }
+
+ queueCmd(new RDBCommand("delete", NOTRUNCMD, NOTINFOCMD));
+ // Note: this is NOT an info command, because rdb doesn't explictly tell
+ // us that the breakpoint has been deleted, so if we don't have it the
+ // BP list doesn't get updated.
+ queueCmd(new RDBCommand("break", NOTRUNCMD, NOTINFOCMD));
+
+ if (restart)
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+
+ executeCmd();
+}
+
+
+
+// **************************************************************************
+
+void RDBController::slotSelectFrame(int frameNo, int threadNo, const QString& frameName)
+{
+ if (stateIsOn(s_appBusy|s_dbgNotStarted|s_shuttingDown)) {
+ kdDebug(9012) << "RDBController::slotSelectFrame wrong state" << endl;
+ return;
+ }
+
+ if (viewedThread_ != threadNo) {
+ // Note that 'thread switch nnn' is a run command
+ queueCmd(new RDBCommand(QCString().sprintf("thread switch %d",
+ threadNo), RUNCMD, INFOCMD));
+ executeCmd();
+ return;
+ }
+
+ if (frameNo > currentFrame_) {
+ queueCmd(new RDBCommand(QCString().sprintf("up %d", frameNo - currentFrame_), NOTRUNCMD, INFOCMD));
+ if (!stateIsOn(s_fetchLocals)) {
+ queueCmd(new RDBCommand("display", NOTRUNCMD, INFOCMD));
+ }
+ } else if (frameNo < currentFrame_) {
+ queueCmd(new RDBCommand(QCString().sprintf("down %d", currentFrame_ - frameNo), NOTRUNCMD, INFOCMD));
+ if (!stateIsOn(s_fetchLocals)) {
+ queueCmd(new RDBCommand("display", NOTRUNCMD, INFOCMD));
+ }
+ }
+
+ // Hold on to this thread/frame so that we know where to put the local
+ // variables if generated.
+ viewedThread_ = threadNo;
+ currentFrame_ = frameNo;
+
+ VarFrameRoot *frame = varTree_->findFrame(frameNo, viewedThread_);
+ if (frame == 0) {
+ frame = new VarFrameRoot(varTree_, currentFrame_, viewedThread_);
+ }
+
+ frame->setFrameName(frameName);
+ varTree_->setSelected(frame, true);
+
+ // Have we already got these details?
+ if (frame->needsVariables()) {
+ // Ask for the locals
+
+ if (showConstants_) {
+ queueCmd(new RDBCommand("var const self.class", NOTRUNCMD, INFOCMD));
+ }
+
+ queueCmd(new RDBCommand("var instance self", NOTRUNCMD, INFOCMD));
+ queueCmd(new RDBCommand("var class self.class", NOTRUNCMD, INFOCMD));
+ queueCmd(new RDBCommand("var local", NOTRUNCMD, INFOCMD));
+ frame->startWaitingForData();
+ }
+
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+
+ return;
+}
+
+
+
+// **************************************************************************
+
+// This is called when an item needs special processing to show a value.
+void RDBController::slotExpandItem(VarItem *item, const QCString &userRequest)
+{
+ if (stateIsOn(s_appBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ Q_ASSERT(item != 0);
+
+ // Bad user data!!
+ if (userRequest.isEmpty())
+ return;
+
+ queueCmd(new RDBItemCommand(item, QCString("pp ") + userRequest.data(), false));
+
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+// This method evaluates text selected with the 'Inspect:' context menu
+void RDBController::slotRubyInspect(const QString &inspectText)
+{
+ queueCmd(new RDBCommand( QCString().sprintf("p %s", inspectText.latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ executeCmd();
+}
+
+
+// **************************************************************************
+
+// Add a new expression to be displayed in the Watch variable tree
+void RDBController::slotAddWatchExpression(const QString& expr, bool execute)
+{
+ queueCmd(new RDBCommand( QCString().sprintf("display %s", expr.latin1()),
+ NOTRUNCMD,
+ NOTINFOCMD ) );
+ if (execute) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+// Add a new expression to be displayed in the Watch variable tree
+void RDBController::slotRemoveWatchExpression(int displayId)
+{
+ queueCmd(new RDBCommand( QCString().sprintf("undisplay %d", displayId),
+ NOTRUNCMD,
+ INFOCMD ) );
+ executeCmd();
+}
+
+
+// **************************************************************************
+
+// The user will only get globals if the Global frame is open
+void RDBController::slotFetchGlobals(bool fetch)
+{
+ if (fetch) {
+ setStateOn(s_fetchGlobals);
+ queueCmd(new RDBCommand("var global", NOTRUNCMD, INFOCMD));
+ executeCmd();
+ } else {
+ setStateOff(s_fetchGlobals);
+ }
+
+ kdDebug(9012) << (fetch ? "<Globals ON>": "<Globals OFF>") << endl;
+}
+
+// **************************************************************************
+
+// Data from the ruby program's stdout gets processed here.
+void RDBController::slotDbgStdout(KProcess *, char *buf, int buflen)
+{
+ QCString msg(buf, buflen+1);
+ emit ttyStdout(msg);
+}
+
+// **************************************************************************
+
+// Data from the ruby program's stderr gets processed here.
+void RDBController::slotDbgStderr(KProcess *, char *buf, int buflen)
+{
+ QCString msg(buf, buflen+1);
+ emit ttyStderr(msg);
+}
+
+// **************************************************************************
+
+void RDBController::slotDbgWroteStdin(KProcess *)
+{
+// setStateOff(s_waitForWrite);
+ // if (!stateIsOn(s_silent))
+ // emit dbgStatus ("", state_);
+// executeCmd();
+}
+
+// **************************************************************************
+
+void RDBController::slotAcceptConnection(int masterSocket)
+{
+ Q_ASSERT(masterSocket == masterSocket_);
+
+ struct sockaddr sockaddr;
+ socklen_t fromlen;
+
+ if (socketNotifier_ != 0) {
+ close(socket_);
+ delete socketNotifier_;
+ }
+
+ socket_ = accept(masterSocket, &sockaddr, &fromlen);
+ if (fcntl(socket_, F_SETFL, O_NONBLOCK) == -1) {
+ kdDebug(9012) << "RDBController::slotAcceptConnection can't set nonblocking socket " << errno << endl;
+ }
+
+ socketNotifier_ = new QSocketNotifier(socket_, QSocketNotifier::Read, 0);
+ QObject::connect( socketNotifier_, SIGNAL(activated(int)),
+ this, SLOT(slotReadFromSocket(int)) );
+
+ setStateOff(s_dbgNotStarted);
+ emit dbgStatus ("", state_);
+
+ cmdList_.clear();
+ rdbOutputLen_ = 0;
+
+ // Organise any breakpoints.
+ emit acceptPendingBPs();
+
+ if (traceIntoRuby_) {
+ queueCmd(new RDBCommand("trace_ruby on", NOTRUNCMD, NOTINFOCMD));
+ }
+
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+
+ // Reset the display id for any watch expressions already in the variable tree
+ varTree_->resetWatchVars();
+}
+
+// **************************************************************************
+
+// Output from rdb via the Unix socket gets processed here.
+void RDBController::slotReadFromSocket(int socket)
+{
+ Q_ASSERT(socket == socket_);
+
+ static bool parsing = false;
+
+ int bytesRead = read(socket, rdbOutput_ + rdbOutputLen_, rdbSizeofBuf_);
+
+ rdbOutputLen_ += bytesRead;
+ *(rdbOutput_ + rdbOutputLen_) = 0;
+
+
+ // Already parsing? then get out quick.
+ if (parsing)
+ {
+ kdDebug(9012) << "Already parsing" << endl;
+ return;
+ }
+
+// kdDebug(9012) << "RDBController::slotReadFromSocket length: " << rdbOutputLen_ << " input: " << rdbOutput_ << endl;
+
+ QRegExp prompt_re("(\\(rdb:(\\d+)\\) )$");
+ int promptPos = prompt_re.search(rdbOutput_, 0);
+
+ // Keep appending output to the rbdOutput_ buffer until the
+ // ruby debugger writes the next prompt
+ if (promptPos == -1) {
+ return;
+ }
+
+// kdDebug(9012) << "RDBController::slotReadFromSocket length: " << rdbOutputLen_ << " input: " << rdbOutput_ << endl;
+
+ // Save the prompt, and remove it from the buffer
+ currentPrompt_ = prompt_re.cap(1).latin1();
+ rdbOutputLen_ -= prompt_re.matchedLength();
+ *(rdbOutput_ + rdbOutputLen_) = 0;
+
+ emit rdbStdout(rdbOutput_);
+
+ parsing = true;
+ parse(rdbOutput_);
+ parsing = false;
+ rdbOutputLen_ = 0;
+
+ executeCmd();
+
+ if (currentCmd_ == 0 && stateIsOn(s_fetchLocals)) {
+ if (!varTree_->schedule()) {
+ setStateOff(s_fetchLocals);
+ }
+ }
+}
+
+// **************************************************************************
+
+void RDBController::slotDbgProcessExited(KProcess*)
+{
+ destroyCmds();
+ state_ = s_appNotStarted|s_programExited|(state_&(s_shuttingDown));
+ emit dbgStatus (i18n("Process exited"), state_);
+ emit rdbStdout("(rdb:1) Process exited\n");
+ frameStack_->clear();
+ varTree_->clear();
+
+ if (socketNotifier_ != 0) {
+ delete socketNotifier_;
+ socketNotifier_ = 0;
+ close(socket_);
+ }
+
+ delete dbgProcess_; dbgProcess_ = 0;
+ delete tty_; tty_ = 0;
+}
+
+
+// **************************************************************************
+
+// Takes abbreviated commands and expands them, before passing them on to rdb
+//
+void RDBController::slotUserRDBCmd(const QString& cmd)
+{
+ kdDebug(9012) << "Requested user cmd: " << cmd << endl;
+ QRegExp break_re("^b(reak)?(\\s.*)?");
+ QRegExp watch_re("^wat(ch)?\\s+(.*)");
+ QRegExp delete_re("^del(ete)?(\\s.*)?");
+ QRegExp display_re("^disp(lay)?(\\s.*)?");
+ QRegExp undisplay_re("^undisp(lay)?(\\s.*)?");
+ QRegExp step_re("^s(tep)?(\\s[\\d]+)?$");
+ QRegExp next_re("^n(ext)?(\\s[\\d]+)?$");
+ QRegExp varlocal_re("^v(ar)?\\s+l(ocal)?");
+ QRegExp varglobal_re("^v(ar)?\\s+g(lobal)?");
+ QRegExp varinstance_re("^v(ar)?\\s+i(nstance)?\\s(.*)");
+ QRegExp varconst_re("^v(ar)?\\s+c(onst)?\\s(.*)");
+ QRegExp threadlist_re("^th(read)?\\s+l(ist)?");
+ QRegExp threadcurrent_re("^th(read)?(\\sc(ur(rent)?)?)?$");
+ QRegExp threadswitch_re("^th(read)?(\\ssw(itch)?)?(\\s.*)");
+ QRegExp thread_re("^th(read)?(\\s+.*)?");
+ QRegExp methodinstance_re("^m(ethod)?\\s+i(nstance)?\\s+(.*)");
+ QRegExp method_re("^m(ethod)?\\s+(.*)");
+ QRegExp list_re("^l(ist)?(\\s+\\d+-\\d+)?$");
+
+ if ( break_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("break%s", break_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( watch_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("watch %s", watch_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( delete_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("delete%s", delete_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( display_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("display%s", display_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( undisplay_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("undisplay%s", undisplay_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( step_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("step%s", step_re.cap(2).latin1()),
+ RUNCMD,
+ INFOCMD ), true );
+ } else if ( next_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("next%s", next_re.cap(2).latin1()),
+ RUNCMD,
+ INFOCMD ), true );
+ } else if ( varlocal_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand("var local", NOTRUNCMD, INFOCMD));
+ } else if ( varglobal_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand("var global", NOTRUNCMD, INFOCMD));
+ } else if ( varinstance_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("var instance %s", varinstance_re.cap(3).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( varconst_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("var const %s", varconst_re.cap(3).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( methodinstance_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("method instance %s", methodinstance_re.cap(3).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( method_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("method %s", method_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( list_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("list%s", list_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if (cmd == "c" || cmd == "cont") {
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+ } else if (cmd == "fi" || cmd == "finish") {
+ queueCmd(new RDBCommand("finish", RUNCMD, NOTINFOCMD));
+ } else if ( threadlist_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand("thread list", NOTRUNCMD, INFOCMD), true);
+ } else if ( threadcurrent_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand("thread current", NOTRUNCMD, INFOCMD), true );
+ } else if ( threadswitch_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("thread switch%s", threadswitch_re.cap(4).latin1()),
+ RUNCMD,
+ INFOCMD ), true );
+ } else if ( thread_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("thread%s", thread_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if (cmd == "frame" || cmd == "f" || cmd == "where" || cmd == "w") {
+ queueCmd(new RDBCommand("where", NOTRUNCMD, INFOCMD), true);
+ } else if (cmd == "q" || cmd == "quit") {
+ slotStopDebugger();
+ return;
+ } else {
+ kdDebug(9012) << "Passing directly to rdb: " << cmd << endl;
+ queueCmd(new RDBCommand(cmd.latin1(), NOTRUNCMD, INFOCMD));
+ }
+
+ executeCmd();
+}
+
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+#include "rdbcontroller.moc"
diff --git a/languages/ruby/debugger/rdbcontroller.h b/languages/ruby/debugger/rdbcontroller.h
new file mode 100644
index 00000000..2d303218
--- /dev/null
+++ b/languages/ruby/debugger/rdbcontroller.h
@@ -0,0 +1,192 @@
+/***************************************************************************
+ rdbcontroller.h - description
+ -------------------
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _RDBCONTROLLER_H_
+#define _RDBCONTROLLER_H_
+
+#include "dbgcontroller.h"
+
+#include <qcstring.h>
+#include <qdom.h>
+#include <qobject.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qsocketnotifier.h>
+
+class KProcess;
+
+namespace RDBDebugger
+{
+
+class Breakpoint;
+class DbgCommand;
+class FramestackWidget;
+class VarItem;
+class VariableTree;
+class STTY;
+
+/**
+ * A front end implementation to the ruby command line debugger
+ * @author jbb
+ */
+
+class RDBController : public DbgController
+{
+ Q_OBJECT
+
+public:
+ RDBController(VariableTree *varTree, FramestackWidget *frameStack, QDomDocument &projectDom);
+ ~RDBController();
+
+protected:
+ void queueCmd(DbgCommand *cmd, bool executeNext=false);
+
+private:
+ void parseProgramLocation (char *buf);
+ void parseBacktraceList (char *buf);
+ void parseThreadList (char* buf);
+ void parseSwitchThread (char* buf);
+ void parseFrameMove (char *buf);
+ void parseBreakpointSet (char *buf);
+ void parseDisplay (char *buf, char * expr);
+ void parseUpdateDisplay (char *buf);
+ void parseGlobals (char *buf);
+ void parseLocals (char type, char *buf);
+ void parseRequestedData (char *buf);
+ void parseFrameSelected (char *buf);
+
+ void parse (char *buf);
+
+ void pauseApp();
+ void executeCmd ();
+ void destroyCmds();
+ void removeInfoRequests();
+ void actOnProgramPause(const QString &msg);
+ void programNoApp(const QString &msg, bool msgBox);
+
+ void setBreakpoint(const QCString &BPSetCmd, int key);
+ void clearBreakpoint(const QCString &BPClearCmd);
+ void modifyBreakpoint(const Breakpoint&);
+
+ void setStateOn(int stateOn) { state_ |= stateOn; }
+ void setStateOff(int stateOff) { state_ &= ~stateOff; }
+ bool stateIsOn(int state) { return state_ &state; }
+
+public slots:
+ void configure();
+
+ void slotStart( const QString& shell, const QString& characterCoding,
+ const QString& run_directory, const QString& debuggee_path,
+ const QString &application, const QString& run_arguments,
+ bool show_constants, bool trace_into_ruby );
+ //void slotStart(const QString& shell, const QString &application);
+
+ void slotStopDebugger();
+
+ void slotRun();
+ void slotRunUntil(const QString &filename, int lineNum);
+ void slotStepInto();
+ void slotStepOver();
+ void slotStepOutOff();
+
+ void slotBreakInto();
+ void slotBPState( const Breakpoint& );
+ void slotClearAllBreakpoints();
+
+ void slotExpandItem(VarItem *parent, const QCString &userRequest);
+ void slotRubyInspect(const QString &inspectText);
+ void slotSelectFrame(int frameNo, int threadNo, const QString& frameName);
+ void slotFetchGlobals(bool fetch);
+ void slotAddWatchExpression(const QString& expr, bool execute);
+ void slotRemoveWatchExpression(int displayId);
+
+ void slotUserRDBCmd(const QString&);
+
+protected slots:
+ void slotDbgStdout(KProcess *proc, char *buf, int buflen);
+ void slotDbgStderr(KProcess *proc, char *buf, int buflen);
+ void slotDbgWroteStdin(KProcess *proc);
+ void slotDbgProcessExited(KProcess *proc);
+
+ void slotAcceptConnection(int masterSocket);
+ void slotReadFromSocket(int socket);
+
+signals:
+ void acceptPendingBPs ();
+ void unableToSetBPNow (int BPNo);
+ void addWatchExpression (const QString&);
+
+private:
+ FramestackWidget* frameStack_;
+ VariableTree* varTree_;
+ int currentFrame_;
+ int viewedThread_;
+
+ int stdoutSizeofBuf_; // size of the buffer for holding stdout piped
+ // from the ruby program
+ int stdoutOutputLen_; // amount of data in the output buffer
+ char* stdoutOutput_; // buffer for the output from kprocess
+ QCString holdingZone_;
+
+ int rdbSizeofBuf_; // size of the output buffer from rdb
+ int rdbOutputLen_; // amount of data in the rdb buffer
+ char* rdbOutput_; // buffer for the output from rdb via the Unix socket
+
+ int masterSocket_; // The socket to accept connections
+ QSocketNotifier* acceptNotifier_;
+ static QCString unixSocketPath_; // The name of the Unix Domain socket
+ int socket_; // The socket to read and write to the debuggee
+ QSocketNotifier* socketNotifier_;
+
+ QPtrList<DbgCommand> cmdList_;
+ DbgCommand* currentCmd_;
+ QString currentPrompt_;
+
+ STTY* tty_;
+
+ // Details for starting the ruby debugger process
+ QString rubyInterpreter_;
+ QString characterCoding_;
+ QString runDirectory_;
+ QString debuggeePath_;
+ QString application_;
+ QString runArguments_;
+ bool showConstants_;
+ bool traceIntoRuby_;
+
+ // Some state variables
+ int state_;
+ bool programHasExited_;
+
+ // Configuration values
+ QDomDocument &dom;
+ bool config_forceBPSet_;
+ bool config_dbgTerminal_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdboutputwidget.cpp b/languages/ruby/debugger/rdboutputwidget.cpp
new file mode 100644
index 00000000..5e08e116
--- /dev/null
+++ b/languages/ruby/debugger/rdboutputwidget.cpp
@@ -0,0 +1,171 @@
+// *************************************************************************
+// rdboutputwidget.cpp - description
+// -------------------
+// begin : 10th April 2003
+// copyright : (C) 2003 by John Birch
+// email : jbb@kdevelop.org
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : Richard_Dale@tipitina.demon.co.uk
+// **************************************************************************
+//
+// **************************************************************************
+// * *
+// * 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. *
+// * *
+// **************************************************************************
+
+#include "rdboutputwidget.h"
+#include "dbgcontroller.h"
+
+#include <kcombobox.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtextedit.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+/***************************************************************************/
+
+RDBOutputWidget::RDBOutputWidget( QWidget *parent, const char *name) :
+ QWidget(parent, name),
+ m_userRDBCmdEditor(0),
+ m_Interrupt(0),
+ m_rdbView(0)
+{
+
+ m_rdbView = new QTextEdit (this, name);
+ m_rdbView->setReadOnly(true);
+
+ QBoxLayout *userRDBCmdEntry = new QHBoxLayout();
+ m_userRDBCmdEditor = new KHistoryCombo (this, "rdb-user-cmd-editor");
+
+ QLabel *label = new QLabel(i18n("&RDB cmd:"), this);
+ label->setBuddy(m_userRDBCmdEditor);
+ userRDBCmdEntry->addWidget(label);
+
+ userRDBCmdEntry->addWidget(m_userRDBCmdEditor);
+ userRDBCmdEntry->setStretchFactor(m_userRDBCmdEditor, 1);
+
+ m_Interrupt = new QToolButton( this, "add breakpoint" );
+ m_Interrupt->setSizePolicy ( QSizePolicy ( (QSizePolicy::SizeType)0,
+ ( QSizePolicy::SizeType)0,
+ 0,
+ 0,
+ m_Interrupt->sizePolicy().hasHeightForWidth())
+ );
+ m_Interrupt->setPixmap ( SmallIcon ( "player_pause" ) );
+ userRDBCmdEntry->addWidget(m_Interrupt);
+ QToolTip::add ( m_Interrupt, i18n ( "Pause execution of the app to enter rdb commands" ) );
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this, 2);
+ topLayout->addWidget(m_rdbView, 10);
+ topLayout->addLayout(userRDBCmdEntry);
+
+ slotDbgStatus( "", s_dbgNotStarted);
+
+ connect( m_userRDBCmdEditor, SIGNAL(returnPressed()), SLOT(slotRDBCmd()) );
+ connect( m_Interrupt, SIGNAL(clicked()), SIGNAL(breakInto()));
+}
+
+/***************************************************************************/
+
+RDBOutputWidget::~RDBOutputWidget()
+{
+ delete m_rdbView;
+ delete m_userRDBCmdEditor;
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::clear()
+{
+ if (m_rdbView)
+ m_rdbView->clear();
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::slotReceivedStdout(const char* line)
+{
+ if (strncmp(line, "(rdb:", 5) == 0)
+ m_rdbView->append(QString("<font color=\"blue\">").append( line ).append("</font>") );
+ else
+ m_rdbView->append(line);
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::slotReceivedStderr(const char* line)
+{
+ m_rdbView->append(QString("<font color=\"red\">").append( line ).append("</font>") );
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::slotRDBCmd()
+{
+ QString RDBCmd(m_userRDBCmdEditor->currentText());
+ if (!RDBCmd.isEmpty())
+ {
+ m_userRDBCmdEditor->addToHistory(RDBCmd);
+ m_userRDBCmdEditor->clearEdit();
+ emit userRDBCmd(RDBCmd);
+ }
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::slotDbgStatus(const QString &, int statusFlag)
+{
+ if (statusFlag & s_dbgNotStarted)
+ {
+ m_Interrupt->setEnabled(false);
+ m_userRDBCmdEditor->setEnabled(false);
+ return;
+ }
+
+ if (statusFlag & s_appBusy)
+ {
+ m_Interrupt->setEnabled(true);
+ m_userRDBCmdEditor->setEnabled(false);
+ }
+ else
+ {
+ m_Interrupt->setEnabled(false);
+ m_userRDBCmdEditor->setEnabled(true);
+ }
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::focusInEvent(QFocusEvent */*e*/)
+{
+ m_userRDBCmdEditor->setFocus();
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+}
+
+
+#include "rdboutputwidget.moc"
+
diff --git a/languages/ruby/debugger/rdboutputwidget.h b/languages/ruby/debugger/rdboutputwidget.h
new file mode 100644
index 00000000..ef466757
--- /dev/null
+++ b/languages/ruby/debugger/rdboutputwidget.h
@@ -0,0 +1,69 @@
+// *************************************************************************
+// gdboutputwidget.cpp - description
+// -------------------
+// begin : 10th April 2003
+// copyright : (C) 2003 by John Birch
+// email : jbb@kdevelop.org
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : Richard_Dale@tipitina.demon.co.uk
+// **************************************************************************
+//
+// **************************************************************************
+// * *
+// * 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. *
+// * *
+// **************************************************************************
+
+#ifndef _RDBOUTPUTWIDGET_H_
+#define _RDBOUTPUTWIDGET_H_
+
+#include <qwidget.h>
+
+class KHistoryCombo;
+
+class QTextEdit;
+class QToolButton;
+
+namespace RDBDebugger
+{
+
+class RDBOutputWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ RDBOutputWidget( QWidget *parent=0, const char *name=0 );
+ ~RDBOutputWidget();
+
+ void clear();
+
+public slots:
+ void slotReceivedStdout(const char* line);
+ void slotReceivedStderr(const char* line);
+ void slotDbgStatus (const QString &status, int statusFlag);
+
+ void slotRDBCmd();
+
+protected:
+ virtual void focusInEvent(QFocusEvent *e);
+
+signals:
+ void userRDBCmd(const QString &cmd);
+ void breakInto();
+
+private:
+ KHistoryCombo* m_userRDBCmdEditor;
+ QToolButton* m_Interrupt;
+ QTextEdit* m_rdbView;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdbparser.cpp b/languages/ruby/debugger/rdbparser.cpp
new file mode 100644
index 00000000..7792acc5
--- /dev/null
+++ b/languages/ruby/debugger/rdbparser.cpp
@@ -0,0 +1,350 @@
+// **************************************************************************
+// begin : Tue Aug 17 1999
+// copyright : (C) 1999 by John Birch
+// email : jbb@kdevelop.org
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : Richard_Dale@tipitina.demon.co.uk
+// **************************************************************************
+
+// **************************************************************************
+// *
+// 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. *
+// *
+// **************************************************************************
+
+#include "rdbparser.h"
+#include "variablewidget.h"
+
+#include <qregexp.h>
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <kdebug.h>
+
+namespace RDBDebugger
+{
+
+
+// **************************************************************************
+
+void RDBParser::parseVariables(LazyFetchItem *parent, char *buf)
+{
+ static const char *unknown = "?";
+
+ QString varName;
+ QCString value;
+ int pos;
+
+ Q_ASSERT(parent);
+ if (buf == 0 || strlen(buf) == 0) {
+ return;
+ }
+
+ if (buf[0] == 0) {
+ buf = (char*)unknown;
+ }
+
+ QRegExp var_re("\\s*([^\\n\\s]+) => ([^\\n]+)");
+ QRegExp ref_re("(#<([^:]|::)+:0x[\\da-f]+)\\s*([^=]*)>?");
+ QRegExp struct_re("#<struct Struct::(\\w+)");
+
+ // Look for 'dataitem => value' pairs. For example:
+ // a => 1
+ // m => #<MyClass:0x30093540 @temp={"z"=>"zed", "p"=>"pee"}, @foobar="hello">
+ //
+ pos = var_re.search(buf);
+ if (pos != -1) {
+ while (pos != -1) {
+ varName = var_re.cap(1);
+ if (ref_re.search(var_re.cap(2)) != -1) {
+ if (var_re.cap(2).contains("=") > 0) {
+ value = (ref_re.cap(1) + ">").latin1();
+ } else {
+ // There are no 'name=value' pairs, as in #<Qt::Color:0x0 #ff0000>
+ value = var_re.cap(2).latin1();
+ }
+ } else if (struct_re.search(var_re.cap(2)) != -1) {
+ value = (QString("#<Struct::") + struct_re.cap(1) + ">").latin1();
+ } else {
+ value = var_re.cap(2).latin1();
+ }
+
+ DataType dataType = determineType((char *) var_re.cap(2).latin1());
+
+ // 'self' variables don't need to be expandable, as their details are
+ // already shown in the current frame. So always make them VALUE_TYPE's.
+ if (varName == "self") {
+ dataType = VALUE_TYPE;
+ }
+
+ setItem(parent, varName, dataType, value);
+
+ pos += var_re.matchedLength();
+ pos = var_re.search(buf, pos);
+ }
+
+ return;
+ }
+}
+
+void RDBParser::parseExpandedVariable(VarItem *parent, char *buf)
+{
+ DataType dataType;
+ int pos;
+ QString varName;
+ QCString value;
+ QRegExp ppref_re("(#<([^:]|::)+:0x[\\da-f]+)([^\\n>]*)(>?)");
+
+ switch (parent->dataType()) {
+ case REFERENCE_TYPE:
+ {
+ // Look for a reference type which has been printed via a 'pp' command, to
+ // expand its sub items on multiple lines. For example:
+ // #<MyClass:0x30093540
+ // @foobar="hello",
+ // @sleeper=#<Thread:0x3008fd18 sleep>,
+ // @temp={"z"=>"zed", "p"=>"pee"}>
+ //
+ QRegExp ppvalue_re("\\s*([^\\n\\s=]+)=([^\\n]+)[,>]");
+
+ pos = ppref_re.search(buf);
+ if (pos != -1) {
+ if (ppref_re.cap(4) != "") {
+ // The value is all on one line, so match against name=value
+ // pairs which can't have commas in their values
+ ppvalue_re = QRegExp("\\s*([^\\s=]+)=([^,>]+)([,>])");
+ }
+
+ pos = ppvalue_re.search(buf, pos);
+
+ while (pos != -1) {
+ varName = ppvalue_re.cap(1);
+
+ if (ppref_re.search(ppvalue_re.cap(2)) != -1) {
+ if (ppvalue_re.cap(2).contains("=") > 0) {
+ value = (ppref_re.cap(1) + ">").latin1();
+ } else {
+ // There are no 'name=value' pairs, as in #<Qt::Color:0x0 #ff0000>
+ value = ppvalue_re.cap(2).latin1();
+ }
+ } else {
+ value = ppvalue_re.cap(2).latin1();
+ }
+
+ dataType = determineType((char *) ppvalue_re.cap(2).latin1());
+ setItem(parent, varName, dataType, value);
+
+ pos += ppvalue_re.matchedLength();
+ pos = ppvalue_re.search(buf, pos);
+ }
+
+ }
+ return;
+ }
+
+ case ARRAY_TYPE:
+ {
+ // Look for a array type which has been printed via a 'pp' command, to
+ // expand its sub items. For example:
+ // [0]="hello"
+ // [1]=#"goodbye"
+ //
+ QRegExp pparray_re("\\s*([^=]+)=([^\\n]+)\\n");
+
+ pos = pparray_re.search(buf);
+
+ while (pos != -1) {
+ varName = pparray_re.cap(1);
+
+ if (ppref_re.search(pparray_re.cap(2)) != -1) {
+ value = (ppref_re.cap(1) + ">").latin1();
+ } else {
+ value = pparray_re.cap(2).latin1();
+ }
+
+ DataType dataType = determineType((char *) pparray_re.cap(2).latin1());
+ setItem(parent, varName, dataType, value);
+
+ pos += pparray_re.matchedLength();
+ pos = pparray_re.search(buf, pos);
+ }
+
+ return;
+ }
+
+ case HASH_TYPE:
+ {
+ // Look for a hash type which has been printed via a 'pp' command, to
+ // expand its sub items. For example:
+ // ["greeting"]="hello"
+ // ["farewell"]="goodbye"
+ //
+ QRegExp pphash_re("\\s*(\\[[^\\]]+\\])=([^\\n]+)\\n");
+ pos = pphash_re.search(buf);
+
+ while (pos != -1) {
+ varName = pphash_re.cap(1);
+ value = pphash_re.cap(2).latin1();
+ DataType dataType = determineType(value.data());
+ setItem(parent, varName, dataType, value);
+
+ pos += pphash_re.matchedLength();
+ pos = pphash_re.search(buf, pos);
+ }
+
+ return;
+ }
+
+ case STRUCT_TYPE:
+ {
+ // Look for a reference type which has been printed via a 'pp' command, to
+ // expand its sub items. For example:
+ // #<Struct::Customer
+ // @foobar="hello",
+ // @sleeper=#<Thread:0x3008fd18 sleep>,
+ // @temp={"z"=>"zed", "p"=>"pee"}>
+ //
+ QRegExp ppstruct_re("(#<Struct::\\w+)\\s([^\\n>]*)(>?)");
+ QRegExp ppvalue_re("\\s*([^\\n\\s=]+)=([^\\n]+)[,>]");
+
+ pos = ppstruct_re.search(buf);
+ if (pos != -1) {
+ if (ppstruct_re.cap(3) != "" && ppvalue_re.search(ppstruct_re.cap(0)) != -1) {
+ // The line ends with a '>', but we have this case now..
+ // If there is only one instance variable, pp puts everything
+ // on a single line:
+ // #<Struct::Customer @foobar="hello">
+ // So search for '@foobar="hello"', to use as the
+ // first name=value pair
+ pos = 0;
+ } else {
+ // Mltiple lines with name=value pairs:
+ // #<Struct::Customer
+ // @foobar="hello",
+ pos = ppvalue_re.search(buf, pos);
+ }
+
+ while (pos != -1) {
+ varName = ppvalue_re.cap(1);
+ value = ppvalue_re.cap(2).latin1();
+ dataType = determineType(value.data());
+ setItem(parent, varName, dataType, value);
+
+ pos += ppvalue_re.matchedLength();
+ pos = ppvalue_re.search(buf, pos);
+ }
+
+ }
+ return;
+ }
+
+ case STRING_TYPE:
+ {
+ // Look for a long String which has been printed via a 'pp' command, to
+ // show it as a sequence of 12 bytes slices in hex. For example:
+ // [0..11]=0x89504e470d0a1a0a0000000d
+ // [12..23]=0x494844520000001600000016
+ //
+ QRegExp ppstring_re("\\s*(\\[[^\\]]+\\])=([^\\n]+)\\n");
+ pos = ppstring_re.search(buf);
+
+ while (pos != -1) {
+ varName = ppstring_re.cap(1);
+ value = ppstring_re.cap(2).latin1();
+ DataType dataType = determineType(value.data());
+ setItem(parent, varName, dataType, value);
+
+ pos += ppstring_re.matchedLength();
+ pos = ppstring_re.search(buf, pos);
+ }
+
+ return;
+ }
+
+ default:
+ Q_ASSERT(false);
+ }
+
+ return;
+}
+
+
+// **************************************************************************
+
+void RDBParser::setItem(LazyFetchItem *parent, const QString &varName,
+ DataType dataType, const QCString &value)
+{
+ VarItem *item = parent->findItem(varName);
+ if (item == 0) {
+ item = new VarItem(parent, varName, dataType);
+ } else {
+ // The dataType of an item can change, so update it
+ item->setDataType(dataType);
+ }
+
+ switch (dataType) {
+ case HASH_TYPE:
+ case ARRAY_TYPE:
+ case REFERENCE_TYPE:
+ case STRUCT_TYPE:
+ case STRING_TYPE:
+ item->setText(VALUE_COLUMN, value);
+ item->setExpandable(true);
+ item->update();
+ break;
+
+ case COLOR_TYPE:
+ case VALUE_TYPE:
+ item->setText(VALUE_COLUMN, value);
+ item->setExpandable(false);
+ break;
+
+ default:
+ break;
+ }
+}
+
+// **************************************************************************
+
+DataType RDBParser::determineType(char *buf)
+{
+ QRegExp array_re("(Array \\(\\d+ element\\(s\\)\\))");
+ QRegExp hash_re("(Hash \\(\\d+ element\\(s\\)\\))");
+ QRegExp string_re("(String \\(length \\d+\\))");
+
+ if (qstrncmp(buf, "#<struct", strlen("#<struct")) == 0) {
+ return STRUCT_TYPE;
+ } else if (qstrncmp(buf, "#<Qt::Color:0x", strlen("#<Qt::Color:0x")) == 0) {
+ return COLOR_TYPE;
+ } else if (qstrncmp(buf, "#<", strlen("#<")) == 0 && strstr(buf, "=") != 0) {
+ // An object instance reference is only expandable and a 'REFERENCE_TYPE'
+ // if it contains an '=' (ie it has at least one '@instance_variable=value').
+ // Otherwise, treat it as a 'VALUE_TYPE'.
+ return REFERENCE_TYPE;
+ } else if (array_re.search(buf) != -1) {
+ return ARRAY_TYPE;
+ } else if (hash_re.search(buf) != -1) {
+ return HASH_TYPE;
+ } else if (string_re.search(buf) != -1) {
+ return STRING_TYPE;
+ } else if (qstrncmp(buf, "nil", strlen("nil")) == 0) {
+// return UNKNOWN_TYPE;
+ return VALUE_TYPE;
+ } else {
+ return VALUE_TYPE;
+ }
+}
+
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+}
diff --git a/languages/ruby/debugger/rdbparser.h b/languages/ruby/debugger/rdbparser.h
new file mode 100644
index 00000000..12bc937e
--- /dev/null
+++ b/languages/ruby/debugger/rdbparser.h
@@ -0,0 +1,41 @@
+/***************************************************************************
+ begin : Tue Aug 17 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _RDBPARSER_H_
+#define _RDBPARSER_H_
+
+#include "variablewidget.h"
+
+namespace RDBDebugger
+{
+
+namespace RDBParser
+{
+ void parseVariables(LazyFetchItem *parent, char *buf);
+ void parseExpandedVariable(VarItem *parent, char *buf);
+ DataType determineType(char *buf);
+ void setItem( LazyFetchItem *parent, const QString &varName,
+ DataType dataType, const QCString &value );
+}
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdbtable.cpp b/languages/ruby/debugger/rdbtable.cpp
new file mode 100644
index 00000000..2f470b2d
--- /dev/null
+++ b/languages/ruby/debugger/rdbtable.cpp
@@ -0,0 +1,62 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* cloudtemple@mksat.net *
+* *
+* *
+* Adapted for ruby debugging *
+* -------------------------- *
+* begin : Mon Nov 1 2004 *
+* copyright : (C) 2004 by Richard Dale *
+* email : Richard_Dale@tipitina.demon.co.uk *
+* *
+* 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. *
+***************************************************************************/
+#include "rdbtable.h"
+
+namespace RDBDebugger {
+
+RDBTable::RDBTable(QWidget *parent, const char *name)
+ : QTable(parent, name)
+{
+}
+
+RDBTable::RDBTable(int nr, int nc, QWidget * parent, const char * name)
+ : QTable(nr, nc, parent, name)
+{
+}
+
+RDBTable::~RDBTable()
+{
+}
+
+void RDBTable::keyPressEvent( QKeyEvent * e )
+{
+ emit keyPressed(e->key());
+
+ if (e->key() == Key_Return)
+ emit returnPressed();
+ else if (e->key() == Key_F2)
+ emit f2Pressed();
+ else if ((e->text() == QString("a")) && (e->state() == AltButton))
+ {
+ emit insertPressed();
+ return;
+ }
+ else if ((e->text() == QString("A")) && (e->state() == AltButton))
+ {
+ emit insertPressed();
+ return;
+ }
+ else if (e->key() == Key_Delete)
+ emit deletePressed();
+
+ QTable::keyPressEvent(e);
+}
+
+}
+
+#include "rdbtable.moc"
+
diff --git a/languages/ruby/debugger/rdbtable.h b/languages/ruby/debugger/rdbtable.h
new file mode 100644
index 00000000..04f47c2b
--- /dev/null
+++ b/languages/ruby/debugger/rdbtable.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* cloudtemple@mksat.net *
+* *
+* Adapted for ruby debugging *
+* -------------------------- *
+* begin : Mon Nov 1 2004 *
+* copyright : (C) 2004 by Richard Dale *
+* email : Richard_Dale@tipitina.demon.co.uk *
+* *
+* 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. *
+***************************************************************************/
+#ifndef RDBDEBUGGERRDBTABLE_H
+#define RDBDEBUGGERRDBTABLE_H
+
+#include <qtable.h>
+
+namespace RDBDebugger {
+
+class RDBTable : public QTable
+{
+Q_OBJECT
+public:
+ RDBTable(QWidget *parent = 0, const char *name = 0);
+ RDBTable( int numRows, int numCols, QWidget * parent = 0, const char * name = 0 );
+ ~RDBTable();
+
+ virtual void keyPressEvent ( QKeyEvent * e );
+
+signals:
+ void keyPressed(int key);
+
+ void returnPressed();
+ void f2Pressed();
+ void insertPressed();
+ void deletePressed();
+};
+
+}
+
+#endif
+
diff --git a/languages/ruby/debugger/stty.cpp b/languages/ruby/debugger/stty.cpp
new file mode 100644
index 00000000..44cb3795
--- /dev/null
+++ b/languages/ruby/debugger/stty.cpp
@@ -0,0 +1,370 @@
+/***************************************************************************
+ begin : Mon Sep 13 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ This code was originally written by Judin Maxim, from the
+ KDEStudio project.
+
+ It was then updated with later code from konsole (KDE).
+
+ It has also been enhanced with an idea from the code in kdbg
+ written by Johannes Sixt<Johannes.Sixt@telecom.at>
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef __osf__
+#define _XOPEN_SOURCE_EXTENDED
+#define O_NDELAY O_NONBLOCK
+#endif
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#ifdef HAVE_SYS_STROPTS_H
+#include <sys/stropts.h>
+#define _NEW_TTY_CTRL
+#endif
+
+#include <assert.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <termios.h>
+#include <time.h>
+#include <unistd.h>
+
+#if defined (_HPUX_SOURCE)
+#define _TERMIOS_INCLUDED
+#include <bsdtty.h>
+#endif
+
+#include <qintdict.h>
+#include <qsocketnotifier.h>
+#include <qstring.h>
+#include <qfile.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kapplication.h>
+
+#include "stty.h"
+
+#define PTY_FILENO 3
+#define BASE_CHOWN "konsole_grantpty"
+
+namespace RDBDebugger
+{
+
+static int chownpty(int fd, int grant)
+// param fd: the fd of a master pty.
+// param grant: 1 to grant, 0 to revoke
+// returns 1 on success 0 on fail
+{
+ void(*tmp)(int) = signal(SIGCHLD,SIG_DFL);
+ pid_t pid = fork();
+ if (pid < 0) {
+ signal(SIGCHLD,tmp);
+ return 0;
+ }
+ if (pid == 0) {
+ /* We pass the master pseudo terminal as file descriptor PTY_FILENO. */
+ if (fd != PTY_FILENO && dup2(fd, PTY_FILENO) < 0)
+ ::exit(1);
+
+ QString path = locate("exe", BASE_CHOWN);
+ execle(QFile::encodeName(path), BASE_CHOWN, grant?"--grant":"--revoke", (void *)0, NULL);
+ ::exit(1); // should not be reached
+ }
+ if (pid > 0) {
+ int w;
+ // retry:
+ int rc = waitpid (pid, &w, 0);
+ if (rc != pid)
+ ::exit(1);
+
+ // { // signal from other child, behave like catchChild.
+ // // guess this gives quite some control chaos...
+ // Shell* sh = shells.find(rc);
+ // if (sh) { shells.remove(rc); sh->doneShell(w); }
+ // goto retry;
+ // }
+ signal(SIGCHLD,tmp);
+ return (rc != -1 && WIFEXITED(w) && WEXITSTATUS(w) == 0);
+ }
+ signal(SIGCHLD,tmp);
+ return 0; //dummy.
+}
+
+// **************************************************************************
+
+STTY::STTY(bool ext, const QString &termAppName)
+ : QObject(),
+ out(0),
+ err(0),
+ ttySlave(""),
+ pid_(0)
+{
+ if (ext) {
+ findExternalTTY(termAppName);
+ } else {
+ fout = findTTY();
+ if (fout >= 0) {
+ ttySlave = QString(tty_slave);
+ out = new QSocketNotifier(fout, QSocketNotifier::Read, this);
+ connect( out, SIGNAL(activated(int)), this, SLOT(OutReceived(int)) );
+ }
+ }
+}
+
+// **************************************************************************
+
+STTY::~STTY()
+{
+ if (pid_)
+ ::kill(pid_, SIGTERM);
+
+ if (out) {
+ ::close(fout);
+ delete out;
+ }
+
+ // if ( err )
+ // {
+ // ::close( ferr );
+ // delete err;
+ // }
+}
+
+// **************************************************************************
+
+int STTY::findTTY()
+{
+ int ptyfd = -1;
+ bool needGrantPty = TRUE;
+
+ // Find a master pty that we can open ////////////////////////////////
+
+#ifdef __sgi__
+ ptyfd = open("/dev/ptmx",O_RDWR);
+ if (ptyfd < 0) {
+ perror("Can't open a pseudo teletype");
+ return(-1);
+ }
+ strncpy(tty_slave, ptsname(ptyfd), 50);
+ grantpt(ptyfd);
+ unlockpt(ptyfd);
+ needGrantPty = FALSE;
+#endif
+
+ // first we try UNIX PTY's
+#ifdef TIOCGPTN
+ strcpy(pty_master,"/dev/ptmx");
+ strcpy(tty_slave,"/dev/pts/");
+ ptyfd = open(pty_master,O_RDWR);
+ if (ptyfd >= 0) { // got the master pty
+ int ptyno;
+ if (ioctl(ptyfd, TIOCGPTN, &ptyno) == 0) {
+ struct stat sbuf;
+ sprintf(tty_slave,"/dev/pts/%d",ptyno);
+ if (stat(tty_slave,&sbuf) == 0 && S_ISCHR(sbuf.st_mode))
+ needGrantPty = FALSE;
+ else {
+ close(ptyfd);
+ ptyfd = -1;
+ }
+ } else {
+ close(ptyfd);
+ ptyfd = -1;
+ }
+ }
+#endif
+
+#if defined(_SCO_DS) || defined(__USLC__) /* SCO OSr5 and UnixWare */
+ if (ptyfd < 0) {
+ for (int idx = 0; idx < 256; idx++)
+ { sprintf(pty_master, "/dev/ptyp%d", idx);
+ sprintf(tty_slave, "/dev/ttyp%d", idx);
+ if (access(tty_slave, F_OK) < 0) { idx = 256; break; }
+ if ((ptyfd = open (pty_master, O_RDWR)) >= 0)
+ { if (access (tty_slave, R_OK|W_OK) == 0) break;
+ close(ptyfd); ptyfd = -1;
+ }
+ }
+ }
+#endif
+ if (ptyfd < 0) { /// \FIXME Linux, Trouble on other systems?
+ for (const char* s3 = "pqrstuvwxyzabcde"; *s3 != 0; s3++) {
+ for (const char* s4 = "0123456789abcdef"; *s4 != 0; s4++) {
+ sprintf(pty_master,"/dev/pty%c%c",*s3,*s4);
+ sprintf(tty_slave,"/dev/tty%c%c",*s3,*s4);
+ if ((ptyfd = open(pty_master, O_RDWR)) >= 0) {
+ if (geteuid() == 0 || access(tty_slave, R_OK|W_OK) == 0)
+ break;
+
+ close(ptyfd);
+ ptyfd = -1;
+ }
+ }
+
+ if (ptyfd >= 0)
+ break;
+ }
+ }
+
+ if (ptyfd >= 0) {
+ if (needGrantPty && !chownpty(ptyfd, TRUE)) {
+ fprintf(stderr,"kdevelop: chownpty failed for device %s::%s.\n",pty_master,tty_slave);
+ fprintf(stderr," : This means the session can be eavesdroped.\n");
+ fprintf(stderr," : Make sure konsole_grantpty is installed and setuid root.\n");
+ }
+
+ ::fcntl(ptyfd, F_SETFL, O_NDELAY);
+#ifdef TIOCSPTLCK
+ int flag = 0;
+ ioctl(ptyfd, TIOCSPTLCK, &flag); // unlock pty
+#endif
+ }
+
+ return ptyfd;
+}
+
+// **************************************************************************
+
+void STTY::OutReceived(int f)
+{
+ char buf[1024];
+ int n;
+
+ // read until socket is empty. We shouldn't be receiving a continuous
+ // stream of data, so the loop is unlikely to cause problems.
+ while ((n = ::read(f, buf, sizeof(buf)-1)) > 0) {
+ *(buf+n) = 0; // a standard string
+ if ( f == fout )
+ emit OutOutput(buf);
+ else
+ emit ErrOutput(buf);
+ }
+}
+
+// **************************************************************************
+
+#define FIFO_FILE "/tmp/debug_tty.XXXXXX"
+
+bool STTY::findExternalTTY(const QString &termApp)
+{
+ QString appName(termApp.isEmpty() ? QString("xterm") : termApp);
+
+ char fifo[] = FIFO_FILE;
+ int fifo_fd;
+ if ((fifo_fd = mkstemp(fifo)) == -1)
+ return false;
+
+ ::close(fifo_fd);
+ ::unlink(fifo);
+
+ // create a fifo that will pass in the tty name
+#ifdef HAVE_MKFIFO
+ if (::mkfifo(fifo, S_IRUSR|S_IWUSR) < 0)
+#else
+ if (::mknod(fifo, S_IFIFO | S_IRUSR|S_IWUSR, 0) < 0)
+#endif
+ return false;
+
+ int pid = ::fork();
+ if (pid < 0) { // No process
+ ::unlink(fifo);
+ return false;
+ }
+
+ if (pid == 0) { // child process
+ /*
+ * Spawn a console that in turn runs a shell script that passes us
+ * back the terminal name and then only sits and waits.
+ */
+
+ const char* prog = appName.latin1();
+ QString script = QString("tty>") + QString(fifo) +
+ QString(";" // fifo name
+ "trap \"\" INT QUIT TSTP;" // ignore various signals
+ "exec<&-;exec>&-;" // close stdin and stdout
+ "while :;do sleep 3600;done");
+ const char* scriptStr = script.latin1();
+ const char* end = 0;
+
+ if ( termApp == "konsole" )
+ {
+ ::execlp( prog, prog,
+ "-caption", i18n("kdevelop: Debug application console").local8Bit().data(),
+ "-e", "sh",
+ "-c", scriptStr,
+ end);
+ }
+ else
+ {
+ ::execlp( prog, prog,
+ "-e", "sh",
+ "-c", scriptStr,
+ end);
+ }
+
+ // Should not get here, as above should always work
+ ::exit(1);
+ }
+
+ // parent process
+ if (pid <= 0)
+ ::exit(1);
+
+ // Open the communication between us (the parent) and the
+ // child (the process running on a tty console)
+ fifo_fd = ::open(fifo, O_RDONLY);
+ if (fifo_fd < 0)
+ return false;
+
+ // Get the ttyname from the fifo buffer that the child process
+ // has sent.
+ char ttyname[50];
+ int n = ::read(fifo_fd, ttyname, sizeof(ttyname)-sizeof(char));
+
+ ::close(fifo_fd);
+ ::unlink(fifo);
+
+ // No name??
+ if (n <= 0)
+ return false;
+
+ // remove whitespace
+ ttyname[n] = 0;
+ if (char* newline = strchr(ttyname, '\n'))
+ *newline = 0; // clobber the new line
+
+ ttySlave = ttyname;
+ pid_ = pid;
+
+ return true;
+}
+
+}
+
+// **************************************************************************
+#include "stty.moc"
diff --git a/languages/ruby/debugger/stty.h b/languages/ruby/debugger/stty.h
new file mode 100644
index 00000000..31c8fbfe
--- /dev/null
+++ b/languages/ruby/debugger/stty.h
@@ -0,0 +1,71 @@
+/***************************************************************************
+ begin : Mon Sep 13 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ This code was originally written by Judin Maxim, from the
+ KDEStudio project.
+
+ It was then updated with later code from konsole (KDE).
+
+ It has also been enhanced with an idea from the code in kdbg
+ written by Johannes Sixt<Johannes.Sixt@telecom.at>
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _STTY_H_
+#define _STTY_H_
+
+class QSocketNotifier;
+
+#include <qobject.h>
+#include <qstring.h>
+
+namespace RDBDebugger
+{
+
+class STTY : public QObject
+{
+ Q_OBJECT
+
+public:
+ STTY(bool ext=false, const QString &termAppName=QString());
+ ~STTY();
+
+ QString getSlave() { return ttySlave; };
+
+private slots:
+ void OutReceived(int);
+
+signals:
+ void OutOutput(const char *);
+ void ErrOutput(const char*);
+
+private:
+ int findTTY();
+ bool findExternalTTY(const QString &termApp);
+
+private:
+ int fout;
+ int ferr;
+ QSocketNotifier *out;
+ QSocketNotifier *err;
+ QString ttySlave;
+ int pid_;
+
+ char pty_master[50]; // "/dev/ptyxx" | "/dev/ptmx"
+ char tty_slave[50]; // "/dev/ttyxx" | "/dev/pts/########..."
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/variablewidget.cpp b/languages/ruby/debugger/variablewidget.cpp
new file mode 100644
index 00000000..0dbdce9a
--- /dev/null
+++ b/languages/ruby/debugger/variablewidget.cpp
@@ -0,0 +1,1018 @@
+// **************************************************************************
+// begin : Sun Aug 8 1999
+// copyright : (C) 1999 by John Birch
+// email : jbb@kdevelop.org
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : Richard_Dale@tipitina.demon.co.uk
+// **************************************************************************
+
+// **************************************************************************
+// * *
+// * 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. *
+// * *
+// **************************************************************************
+
+#include "variablewidget.h"
+#include "rdbparser.h"
+#include "rdbcommand.h"
+
+#include <kdebug.h>
+#include <kpopupmenu.h>
+#include <klineedit.h>
+#include <kdeversion.h>
+
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qpainter.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qcursor.h>
+#include <klocale.h>
+
+#include <qpoint.h>
+#include <qclipboard.h>
+#include <kapplication.h>
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+namespace RDBDebugger
+{
+
+VariableWidget::VariableWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ varTree_ = new VariableTree(this);
+ QLabel *label = new QLabel(i18n("E&xpression to watch:"), this);
+
+ QHBox *watchEntry = new QHBox( this );
+ watchVarEditor_ = new KHistoryCombo( watchEntry, "var-to-watch editor");
+ label->setBuddy(watchVarEditor_);
+
+ QPushButton *addButton = new QPushButton(i18n("&Add"), watchEntry );
+ addButton->adjustSize();
+ addButton->setFixedWidth(addButton->width());
+
+ QBoxLayout * vbox = new QVBoxLayout();
+ vbox->addWidget( label );
+ vbox->addWidget( watchEntry );
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this, 2);
+ topLayout->addWidget(varTree_, 10);
+ topLayout->addLayout( vbox );
+
+ connect( addButton, SIGNAL(clicked()), SLOT(slotAddWatchExpression()) );
+ connect( watchVarEditor_, SIGNAL(returnPressed()), SLOT(slotAddWatchExpression()) );
+}
+
+
+// **************************************************************************
+
+void VariableWidget::setEnabled(bool bEnabled)
+{
+ QWidget::setEnabled(bEnabled);
+ if (bEnabled && parentWidget() != 0) {
+ varTree_->setColumnWidth(0, parentWidget()->width()/2);
+ }
+}
+// **************************************************************************
+
+void VariableWidget::slotAddWatchExpression()
+{
+ QString watchVar(watchVarEditor_->currentText());
+ if (!watchVar.isEmpty()) {
+ slotAddWatchExpression(watchVar);
+ }
+}
+
+// **************************************************************************
+
+void VariableWidget::slotAddWatchExpression(const QString &ident)
+{
+ if (!ident.isEmpty()) {
+ watchVarEditor_->addToHistory(ident);
+ varTree_->slotAddWatchExpression(ident);
+ watchVarEditor_->clearEdit();
+ }
+}
+
+// **************************************************************************
+
+void VariableWidget::focusInEvent(QFocusEvent */*e*/)
+{
+ varTree_->setFocus();
+}
+
+void VariableWidget::restorePartialProjectSession(const QDomElement* el)
+{
+ varTree_->watchRoot()->restorePartialProjectSession(el);
+}
+
+void VariableWidget::savePartialProjectSession(QDomElement* el)
+{
+ varTree_->watchRoot()->savePartialProjectSession(el);
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+VariableTree::VariableTree(VariableWidget *parent, const char *name)
+ : KListView(parent, name),
+ QToolTip( viewport() ),
+ activationId_(0),
+ currentThread_(-1),
+ selectedFrame_(0),
+ watchRoot_(0),
+ globalRoot_(0)
+{
+ setRootIsDecorated(true);
+ setAllColumnsShowFocus(true);
+ setColumnWidthMode(0, Manual);
+ setSorting(VAR_NAME_COLUMN);
+ QListView::setSelectionMode(QListView::Single);
+
+ addColumn(i18n("Variable"), 100 );
+ addColumn(i18n("Value"), 100 );
+
+ connect( this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)),
+ SLOT(slotContextMenu(KListView*, QListViewItem*)) );
+
+ connect( this, SIGNAL(pressed(QListViewItem*)),
+ this, SLOT(slotPressed(QListViewItem*)) );
+
+ watchRoot_ = new WatchRoot(this);
+}
+
+// **************************************************************************
+
+VariableTree::~VariableTree()
+{
+}
+
+// **************************************************************************
+
+void VariableTree::clear()
+{
+ QListViewItem *sibling = firstChild();
+ while (sibling != 0) {
+ QListViewItem * current = sibling;
+ sibling = sibling->nextSibling();
+ if (current->rtti() != RTTI_WATCH_ROOT) {
+ delete current;
+ }
+ }
+
+ globalRoot_ = 0;
+ selectedFrame_ = 0;
+ return;
+}
+
+// **************************************************************************
+
+void VariableTree::slotContextMenu(KListView *, QListViewItem *item)
+{
+ if (item == 0)
+ return;
+
+ setSelected(item, true); // Need to select this item.
+
+ if (item->parent() != 0) {
+ KPopupMenu popup(this);
+ popup.insertTitle(item->text(VAR_NAME_COLUMN));
+ int idRemoveWatch = -2;
+ if (item->rtti() == RTTI_WATCH_VAR_ITEM) {
+ idRemoveWatch = popup.insertItem( i18n("Remove Watch Expression") );
+ }
+
+ int idCopyToClipboard = popup.insertItem( i18n("Copy to Clipboard") );
+ int res = popup.exec(QCursor::pos());
+
+ if (res == idRemoveWatch) {
+ emit removeWatchExpression(((WatchVarItem*)item)->displayId());
+ delete item;
+ } else if (res == idCopyToClipboard) {
+ QClipboard *qb = KApplication::clipboard();
+ QString text = "{ \"" + item->text( VAR_NAME_COLUMN ) + "\", " +
+ "\"" + item->text( VALUE_COLUMN ) + "\" }";
+
+ qb->setText( text, QClipboard::Clipboard );
+ }
+ }
+}
+
+/***************************************************************************/
+
+void VariableTree::setSelected(QListViewItem * item, bool selected)
+{
+ // Save the last selected VarFrameRoot for slotPressed() to restore
+ if (item->rtti() == RTTI_VAR_FRAME_ROOT && selected) {
+ selectedFrame_ = (VarFrameRoot *) item;
+ }
+
+ QListView::setSelected(item, selected);
+}
+
+/***************************************************************************/
+
+// Makes sure that only VarFrameRoot items can be selected
+void VariableTree::slotPressed(QListViewItem * item)
+{
+ if (item == 0) {
+ return;
+ }
+
+ while (item->rtti() == RTTI_VAR_ITEM) {
+ item = item->parent();
+ }
+
+ if ( item->rtti() == RTTI_GLOBAL_ROOT
+ || item->rtti() == RTTI_WATCH_ROOT
+ || item->rtti() == RTTI_WATCH_VAR_ITEM )
+ {
+ if (selectedFrame_ != 0) {
+ setSelected(selectedFrame_, true);
+ }
+ return;
+ }
+
+ if (item->rtti() == RTTI_VAR_FRAME_ROOT) {
+ VarFrameRoot * frame = (VarFrameRoot*) item;
+ emit selectFrame(frame->frameNo(), frame->threadNo());
+ }
+
+ return;
+}
+
+// **************************************************************************
+
+void VariableTree::prune()
+{
+ QListViewItem *child = firstChild();
+
+ while (child != 0) {
+ QListViewItem *nextChild = child->nextSibling();
+
+ // Only prune var frames, not the watch or global root
+ if (child->rtti() == RTTI_VAR_FRAME_ROOT) {
+ if (((VarFrameRoot*) child)->isActive()) {
+ if (child->isOpen()) {
+ ((VarFrameRoot*) child)->prune();
+ }
+ } else {
+ delete child;
+ }
+ }
+
+ child = nextChild;
+ }
+}
+
+// **************************************************************************
+
+// The debugger has moved onto the next program pause, so invalidate
+// everything in the Variable Tree
+void VariableTree::nextActivationId()
+{
+ activationId_++;
+ globalRoot()->setActivationId();
+ watchRoot()->setActivationId();
+ // ..but that's only the Watch and Global roots
+}
+
+// **************************************************************************
+
+// VarFrameRoot frames in the Variable Tree from the previous program pause,
+// are set active here. Notified by the Frame Stack widget when it parses the
+// backtrace from the 'where' command after a pause.
+//
+// After that, any frames which aren't marked as active must have gone
+// out of scope and will end up pruned.
+void VariableTree::slotFrameActive(int frameNo, int threadNo, const QString& frameName)
+{
+ VarFrameRoot * frame = findFrame(frameNo, threadNo);
+ if (frameNo == 1) {
+ // If the current frame 1 doesn't exist, create it
+ if (frame == 0) {
+ frame = new VarFrameRoot(this, frameNo, threadNo);
+ }
+
+ frame->setFrameName(frameName);
+ }
+
+ if (frame != 0 && frame->text(VAR_NAME_COLUMN) == frameName) {
+ frame->setActivationId();
+ }
+}
+
+// **************************************************************************
+
+bool VariableTree::schedule()
+{
+ QListViewItem * child = firstChild();
+ VarFrameRoot * frame = 0;
+
+ while (child != 0) {
+ if (child->rtti() == RTTI_VAR_FRAME_ROOT) {
+ frame = (VarFrameRoot *) child;
+ Q_ASSERT( !frame->isWaitingForData() );
+
+ if (frame->needsVariables()) {
+ if (QApplication::overrideCursor() == 0) {
+ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ }
+
+ // Tell the controller to fetch the variable values
+ emit selectFrame(frame->frameNo(), frame->threadNo());
+ return true;
+ }
+ }
+
+ child = child->nextSibling();
+ }
+
+ frame = findFrame(1, currentThread_);
+ Q_ASSERT( frame != 0 );
+ Q_ASSERT( !frame->needsVariables() );
+
+ // All over, nothing left to fetch.
+ // Return to frame 1, and prune the inactive items
+ // from the variable tree..
+ QApplication::restoreOverrideCursor();
+ emit selectFrame(1, currentThread_);
+ prune();
+
+ return false;
+}
+
+// **************************************************************************
+
+void VariableTree::slotAddWatchExpression(const QString &watchVar)
+{
+ new WatchVarItem(watchRoot(), watchVar, UNKNOWN_TYPE);
+ emit addWatchExpression(watchVar, true);
+}
+
+
+// **************************************************************************
+
+void VariableTree::setFetchGlobals(bool fetch)
+{
+ emit fetchGlobals(fetch);
+}
+
+// **************************************************************************
+
+VarFrameRoot *VariableTree::findFrame(int frameNo, int threadNo) const
+{
+ // frames only exist on the top level so we only need to
+ // check the siblings
+ QListViewItem *sibling = firstChild();
+ while (sibling != 0) {
+ if ( sibling->rtti() == RTTI_VAR_FRAME_ROOT
+ && ((VarFrameRoot*) sibling)->frameNo() == frameNo
+ && ((VarFrameRoot*) sibling)->threadNo() == threadNo )
+ {
+ return (VarFrameRoot*) sibling;
+ }
+
+ sibling = sibling->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+
+WatchRoot *VariableTree::watchRoot()
+{
+ return watchRoot_;
+}
+
+// **************************************************************************
+
+GlobalRoot *VariableTree::globalRoot()
+{
+ if (globalRoot_ == 0) {
+ globalRoot_ = new GlobalRoot(this);
+ }
+
+ return globalRoot_;
+}
+
+// **************************************************************************
+
+// Watch variables can be added before the start of a debugging session,
+// so tell the controller about any already in the tree at start.
+void VariableTree::resetWatchVars()
+{
+ for (QListViewItem *child = watchRoot()->firstChild(); child != 0; child = child->nextSibling()) {
+ ((WatchVarItem*) child)->setDisplayId(-1);
+ emit addWatchExpression(child->text(VAR_NAME_COLUMN), false);
+ }
+}
+
+// **************************************************************************
+
+void VariableTree::maybeTip(const QPoint &p)
+{
+ VarItem * item = dynamic_cast<VarItem*>( itemAt(p) );
+ if (item != 0) {
+ QRect r = itemRect(item);
+ if (r.isValid()) {
+ tip(r, item->tipText());
+ }
+ }
+}
+
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+LazyFetchItem::LazyFetchItem(VariableTree *parent)
+ : KListViewItem(parent),
+ activationId_(0),
+ waitingForData_(false)
+{
+ setActivationId();
+}
+
+// **************************************************************************
+
+LazyFetchItem::LazyFetchItem(LazyFetchItem *parent)
+ : KListViewItem(parent),
+ activationId_(0),
+ waitingForData_(false)
+{
+ setActivationId();
+}
+
+// **************************************************************************
+
+LazyFetchItem::~LazyFetchItem()
+{
+}
+
+// **************************************************************************
+
+void LazyFetchItem::paintCell(QPainter *p, const QColorGroup &cg,
+ int column, int width, int align)
+{
+ if (p == 0) {
+ return;
+ }
+
+ // make toplevel item (watch and frame items) names bold
+ if (column == VAR_NAME_COLUMN && parent() == 0) {
+ QFont f = p->font();
+ f.setBold(true);
+ p->setFont(f);
+ }
+
+ QListViewItem::paintCell( p, cg, column, width, align );
+}
+
+// **************************************************************************
+
+VarItem *LazyFetchItem::findItem(const QString &name) const
+{
+ QListViewItem *child = firstChild();
+
+ // Check the siblings on this branch
+ while (child != 0) {
+ if (child->text(VAR_NAME_COLUMN) == name) {
+ return (VarItem*) child;
+ }
+
+ child = child->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+
+void LazyFetchItem::prune()
+{
+ QListViewItem *child = firstChild();
+
+ while (child != 0) {
+ LazyFetchItem *item = (LazyFetchItem*) child;
+ child = child->nextSibling();
+ // Never prune a branch if we are waiting on data to arrive.
+ if (!waitingForData_) {
+ if (item->isActive()) {
+ item->prune();
+ } else {
+ delete item;
+ }
+ }
+ }
+}
+
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+VarItem::VarItem(LazyFetchItem *parent, const QString &varName, DataType dataType)
+ : LazyFetchItem (parent),
+ cache_(QCString()),
+ dataType_(dataType),
+ highlight_(false)
+{
+ setText(VAR_NAME_COLUMN, varName);
+ setSelectable(false);
+
+ // Order the VarItems so that globals are first, then
+ // constants, class variables, instance variables and
+ // finally local variables
+
+ // Matches either an array element or a string slice,
+ // Order on the array index or the first number in the
+ // range specifying the slice.
+ QRegExp arrayelement_re("\\[(\\d+)(\\.\\.\\d+)?\\]");
+ key_ = varName;
+
+ if (arrayelement_re.search(varName) != -1) {
+ key_.sprintf("%.6d", arrayelement_re.cap(1).toInt());
+ } else if (key_.startsWith("$")) {
+ key_.prepend("1001"); // Global variable
+ } else if (QRegExp("^[A-Z]").search(varName) != -1) {
+ key_.prepend("1002"); // Constant
+ } else if (key_.startsWith("@@")) {
+ key_.prepend("1003"); // Class variable
+ } else if (key_.startsWith("@")) {
+ key_.prepend("1004"); // Instance variable
+ } else {
+ key_.prepend("1005"); // Local variable or parameter
+ }
+
+// kdDebug(9012) << " ### VarItem::VarItem *CONSTR* " << varName << endl;
+}
+
+// **************************************************************************
+
+VarItem::~VarItem()
+{
+}
+
+QString VarItem::key(int /*column*/, bool /*ascending*/) const
+{
+ return key_;
+}
+
+// **************************************************************************
+
+// Returns the path of a ruby item. If it is an instance variable, assume
+// that there is an attr_accessor method for it.
+// For example, @foobar within instance obj is accessed as obj.foobar.
+// But don't strip off the @ for an instance variable with no path,
+// and leave a plain '@foobar' as it is.
+QString VarItem::fullName() const
+{
+ QString itemName = text(VAR_NAME_COLUMN);
+ QString vPath("");
+ const VarItem *item = this;
+
+ if (item->parent()->rtti() != RTTI_VAR_ITEM) {
+ return itemName;
+ }
+
+ // This stops at the root item (FrameRoot or GlobalRoot)
+ while (item->rtti() == RTTI_VAR_ITEM) {
+ QString itemName = item->text(VAR_NAME_COLUMN);
+
+ if (vPath.startsWith("[")) {
+ // If it's a Hash or an Array, then just insert the value. As
+ // in adding '[0]' to foo.bar to give foo.bar[0]
+ vPath.prepend(itemName);
+ } else {
+ if (vPath.isEmpty()) {
+ vPath = itemName;
+ } else {
+ vPath.prepend(itemName + ".");
+ }
+ }
+ item = (VarItem*) item->parent();
+ }
+
+ // Change 'self.@foobar' to '@foobar'
+ vPath.replace(QRegExp("^self\\.@"), "@");
+
+ // Use instance_variable_get() to access any '@var's in the middle of a path
+ QRegExp re_instance_var("\\.(@[^\\[.]+)");
+ int pos = re_instance_var.search(vPath);
+ while (pos != -1) {
+ vPath.replace( pos,
+ re_instance_var.matchedLength(),
+ QString(".instance_variable_get(:") + re_instance_var.cap(1) + ")" );
+ pos = re_instance_var.search(vPath, pos);
+ }
+
+ return vPath;
+}
+
+// **************************************************************************
+
+void VarItem::setText(int column, const QString &data)
+{
+ setActivationId();
+
+ if (column == VALUE_COLUMN) {
+ highlight_ = (!text(VALUE_COLUMN).isEmpty() && text(VALUE_COLUMN) != data);
+ }
+
+ QListViewItem::setText(column, data);
+ repaint();
+}
+
+// **************************************************************************
+
+void VarItem::expandValue(char *buf)
+{
+ LazyFetchItem::stopWaitingForData();
+ RDBParser::parseExpandedVariable(this, buf);
+}
+
+// **************************************************************************
+
+void VarItem::setOpen(bool open)
+{
+ QListViewItem::setOpen(open);
+
+ Q_ASSERT( dataType_ == REFERENCE_TYPE
+ || dataType_ == ARRAY_TYPE
+ || dataType_ == HASH_TYPE
+ || dataType_ == STRING_TYPE
+ || dataType_ == STRUCT_TYPE );
+
+ update();
+ return;
+}
+
+// **************************************************************************
+
+void VarItem::update()
+{
+ if (isOpen()) {
+ startWaitingForData();
+// emit ((VariableTree*)listView())->expandItem(this, fullName().latin1());
+ ((VariableTree*)listView())->expandItem(this, fullName().latin1());
+ }
+
+ return;
+}
+
+// **************************************************************************
+
+DataType VarItem::dataType() const
+{
+ return dataType_;
+}
+
+// **************************************************************************
+
+void VarItem::setDataType(DataType dataType)
+{
+ dataType_ = dataType;
+}
+
+// **************************************************************************
+
+// Overridden to highlight the changed items
+void VarItem::paintCell(QPainter *p, const QColorGroup &cg,
+ int column, int width, int align)
+{
+ if (p == 0) {
+ return;
+ }
+
+ if (column == VALUE_COLUMN) {
+ // Show color values as colors, and make the text color the same
+ // as the base color
+ if (dataType_ == COLOR_TYPE) {
+ QRegExp color_re("\\s(#.*)>");
+
+ if (color_re.search(text(column)) != -1) {
+ QColorGroup color_cg( cg.foreground(), cg.background(),
+ cg.light(), cg.dark(), cg.mid(),
+ QColor(color_re.cap(1)), QColor(color_re.cap(1)) );
+ QListViewItem::paintCell(p, color_cg, column, width, align);
+ return;
+ }
+ }
+
+ // Highlight recently changed items in red
+ if (highlight_) {
+ QColorGroup hl_cg( cg.foreground(), cg.background(),
+ cg.light(), cg.dark(), cg.mid(),
+ red, cg.base() );
+ QListViewItem::paintCell(p, hl_cg, column, width, align);
+ return;
+ }
+ }
+
+ QListViewItem::paintCell(p, cg, column, width, align);
+ return;
+}
+
+// **************************************************************************
+
+QString VarItem::tipText() const
+{
+ const unsigned int MAX_TOOLTIP_SIZE = 70;
+ QString tip = text(VALUE_COLUMN);
+
+ if (tip.length() < MAX_TOOLTIP_SIZE) {
+ return tip;
+ } else {
+ return tip.mid(0, MAX_TOOLTIP_SIZE - 1) + " [...]";
+ }
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+VarFrameRoot::VarFrameRoot(VariableTree *parent, int frameNo, int threadNo)
+ : LazyFetchItem(parent),
+ needsVariables_(true),
+ frameNo_(frameNo),
+ threadNo_(threadNo),
+ cache_("")
+{
+ setExpandable(true);
+}
+
+// **************************************************************************
+
+VarFrameRoot::~VarFrameRoot()
+{
+}
+
+// **************************************************************************
+
+void VarFrameRoot::addLocals(char *variables)
+{
+ cache_.append(variables);
+}
+
+// **************************************************************************
+
+void VarFrameRoot::setLocals()
+{
+ RDBParser::parseVariables(this, cache_.data());
+ cache_ = "";
+ needsVariables_ = false;
+ stopWaitingForData();
+ prune();
+
+ return;
+}
+
+// **************************************************************************
+
+// Override setOpen so that we can decide what to do when we do change
+// state.
+void VarFrameRoot::setOpen(bool open)
+{
+ bool localsViewChanged = (isOpen() != open);
+ QListViewItem::setOpen(open);
+
+ if (localsViewChanged) {
+ ((VariableTree*)listView())->selectFrame(frameNo_, threadNo_);
+ }
+
+ return;
+}
+
+void VarFrameRoot::setFrameName(const QString &frameName)
+{
+ setText(VAR_NAME_COLUMN, frameName);
+ setText(VALUE_COLUMN, "");
+
+ return;
+}
+
+void VarFrameRoot::setActivationId()
+{
+ LazyFetchItem::setActivationId();
+ stopWaitingForData();
+ needsVariables_ = true;
+ cache_ = "";
+}
+
+bool VarFrameRoot::needsVariables() const
+{
+ return ( text(VAR_NAME_COLUMN).contains("try_initialize") == 0
+ && isOpen()
+ && !isWaitingForData()
+ && needsVariables_ );
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+
+GlobalRoot::GlobalRoot(VariableTree *parent)
+ : LazyFetchItem(parent)
+{
+ setText(0, i18n("Global"));
+ setExpandable(true);
+ setOpen(false);
+ setSelectable(false);
+}
+
+// **************************************************************************
+
+GlobalRoot::~GlobalRoot()
+{
+}
+
+// **************************************************************************
+
+void GlobalRoot::setGlobals(char * globals)
+{
+ setActivationId();
+ RDBParser::parseVariables(this, globals);
+
+ return;
+}
+
+// **************************************************************************
+
+void GlobalRoot::setOpen(bool open)
+{
+ bool globalsViewChanged = (isOpen() != open);
+ QListViewItem::setOpen(open);
+
+ if (globalsViewChanged) {
+ ((VariableTree*)listView())->setFetchGlobals(isOpen());
+ }
+
+ return;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+WatchVarItem::WatchVarItem( LazyFetchItem *parent, const QString &varName, DataType dataType, int displayId )
+ : VarItem(parent, varName, dataType),
+ displayId_(displayId)
+{
+}
+
+// **************************************************************************
+
+WatchVarItem::~WatchVarItem()
+{
+}
+
+// **************************************************************************
+
+void WatchVarItem::setDisplayId(int id)
+{
+ displayId_ = id;
+}
+
+// **************************************************************************
+
+int WatchVarItem::displayId()
+{
+ return displayId_;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+WatchRoot::WatchRoot(VariableTree *parent)
+ : LazyFetchItem(parent)
+{
+ setText(VAR_NAME_COLUMN, i18n("Watch"));
+ setOpen(true);
+ setSelectable(false);
+}
+
+// **************************************************************************
+
+WatchRoot::~WatchRoot()
+{
+}
+
+// **************************************************************************
+
+// Sets the initial value of a new Watch item, along with the
+// display id
+void WatchRoot::setWatchExpression(char * buf, char * expression)
+{
+ QString expr(expression);
+ QRegExp display_re("^(\\d+):\\s([^\n]+)\n");
+
+ for ( QListViewItem *child = firstChild();
+ child != 0;
+ child = child->nextSibling() )
+ {
+ WatchVarItem *varItem = (WatchVarItem*) child;
+ if ( varItem->text(VAR_NAME_COLUMN) == expr
+ && varItem->displayId() == -1
+ && display_re.search(buf) >= 0 )
+ {
+ varItem->setDisplayId(display_re.cap(1).toInt());
+ // Skip over the 'thing = ' part of expr to get the value
+ varItem->setText( VALUE_COLUMN,
+ display_re.cap(2).mid(varItem->text(VAR_NAME_COLUMN).length() + strlen(" = ")) );
+ return;
+ }
+ }
+}
+
+// After a program pause, this updates the new value of a Watch item
+// expr is the thing = value part of "1: a = 1", id is the display number
+void WatchRoot::updateWatchExpression(int id, const QString& expr)
+{
+ for ( QListViewItem *child = firstChild();
+ child != 0;
+ child = child->nextSibling() )
+ {
+ WatchVarItem *varItem = (WatchVarItem*) child;
+ if (varItem->displayId() == id) {
+ Q_ASSERT( expr.startsWith(varItem->text(VAR_NAME_COLUMN)) );
+ // Skip over the 'thing = ' part of expr to get the value
+ varItem->setText( VALUE_COLUMN,
+ expr.mid(varItem->text(VAR_NAME_COLUMN).length() + strlen(" = ")) );
+ return;
+ }
+ }
+}
+
+void WatchRoot::savePartialProjectSession(QDomElement* el)
+{
+ QDomDocument domDoc = el->ownerDocument();
+ if (domDoc.isNull()) {
+ return;
+ }
+
+ QDomElement watchEl = domDoc.createElement("watchExpressions");
+
+ for ( QListViewItem *child = firstChild();
+ child != 0;
+ child = child->nextSibling() )
+ {
+ QDomElement subEl = domDoc.createElement("el");
+ subEl.appendChild(domDoc.createTextNode(child->text(VAR_NAME_COLUMN)));
+ watchEl.appendChild(subEl);
+ }
+
+ if (!watchEl.isNull()) {
+ el->appendChild(watchEl);
+ }
+
+ return;
+}
+
+void WatchRoot::restorePartialProjectSession(const QDomElement* el)
+{
+ QDomDocument domDoc = el->ownerDocument();
+ if (domDoc.isNull()) {
+ return;
+ }
+
+ QDomElement watchEl = el->namedItem("watchExpressions").toElement();
+ QDomElement subEl = watchEl.firstChild().toElement();
+
+ while (!subEl.isNull()) {
+ new WatchVarItem(this, subEl.firstChild().toText().data(), UNKNOWN_TYPE);
+
+ subEl = subEl.nextSibling().toElement();
+ }
+
+ return;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+}
+
+
+#include "variablewidget.moc"
+
diff --git a/languages/ruby/debugger/variablewidget.h b/languages/ruby/debugger/variablewidget.h
new file mode 100644
index 00000000..c608ec45
--- /dev/null
+++ b/languages/ruby/debugger/variablewidget.h
@@ -0,0 +1,348 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _VARIABLEWIDGET_H_
+#define _VARIABLEWIDGET_H_
+
+#include "rdbcontroller.h"
+
+#include <klistview.h>
+#include <kcombobox.h>
+#include <qwidget.h>
+#include <qtooltip.h>
+#include <kdebug.h>
+
+class KLineEdit;
+
+namespace RDBDebugger
+{
+
+class LazyFetchItem;
+class VarFrameRoot;
+class GlobalRoot;
+class WatchRoot;
+class VarItem;
+class VariableTree;
+class DbgController;
+class Breakpoint;
+
+enum {
+ VAR_NAME_COLUMN = 0,
+ VALUE_COLUMN = 1
+};
+
+enum DataType {
+ UNKNOWN_TYPE,
+ VALUE_TYPE,
+ REFERENCE_TYPE,
+ ARRAY_TYPE,
+ HASH_TYPE,
+ STRUCT_TYPE,
+ COLOR_TYPE,
+ STRING_TYPE
+};
+
+class VariableWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ VariableWidget( QWidget *parent=0, const char *name=0 );
+
+ VariableTree *varTree() const
+ { return varTree_; }
+
+ virtual void setEnabled(bool b);
+
+ void restorePartialProjectSession(const QDomElement* el);
+ void savePartialProjectSession(QDomElement* el);
+
+protected:
+ virtual void focusInEvent(QFocusEvent *e);
+
+public slots:
+ void slotAddWatchExpression();
+ void slotAddWatchExpression(const QString &expr);
+
+private:
+ VariableTree *varTree_;
+ KHistoryCombo *watchVarEditor_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VariableTree : public KListView, public QToolTip
+{
+ Q_OBJECT
+//we need this to be able to emit expandItem() from within LazyFetchItem
+friend class LazyFetchItem;
+
+public:
+ VariableTree( VariableWidget *parent, const char *name=0 );
+ virtual ~VariableTree();
+
+ // Clear everything but the Watch frame
+ void clear();
+
+ int activationId() const { return activationId_; }
+ void nextActivationId();
+
+ VarFrameRoot *findFrame(int frameNo, int threadNo) const;
+
+ GlobalRoot *globalRoot();
+ WatchRoot *watchRoot();
+
+ void resetWatchVars();
+ void setCurrentThread(int currentThread) { currentThread_ = currentThread; }
+
+ // Remove items that are not active
+ void prune();
+
+ // Look for a frame where 'needsVariables()' is true.
+ // If found, send commands to the debugger to fetch
+ // the variable values.
+ // Return true if a fetch has been scheduled, otherwise
+ // false.
+ bool schedule();
+
+ // Tell the controller whether or not to fetch the
+ // values of the global variables
+ void setFetchGlobals(bool fetch);
+
+ // (from QToolTip) Display a tooltip when the cursor is over an item
+ virtual void maybeTip(const QPoint &);
+
+ virtual void setSelected(QListViewItem * item, bool selected);
+
+signals:
+ void toggleWatchpoint(const QString &varName);
+ void selectFrame(int frame, int thread);
+ void expandItem(VarItem *item, const QCString &request);
+ void fetchGlobals(bool fetch);
+ void addWatchExpression(const QString& expr, bool execute);
+ void removeWatchExpression(int displayId);
+
+public slots:
+ void slotAddWatchExpression(const QString& watchVar);
+ void slotFrameActive(int frameNo, int threadNo, const QString& frameName);
+ void slotPressed(QListViewItem * item);
+
+private slots:
+ void slotContextMenu(KListView *, QListViewItem *item);
+
+private:
+ int activationId_;
+ int currentThread_;
+ VarFrameRoot * selectedFrame_;
+
+ WatchRoot * watchRoot_;
+ GlobalRoot * globalRoot_;
+
+ friend class VarFrameRoot;
+ friend class VarItem;
+ friend class WatchRoot;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class LazyFetchItem : public KListViewItem
+{
+public:
+ LazyFetchItem(VariableTree *parent);
+ LazyFetchItem(LazyFetchItem *parent);
+
+ virtual ~LazyFetchItem();
+
+ virtual int rtti() const { return RTTI_LAZY_FETCH_ITEM; }
+
+ virtual void prune();
+ virtual VarItem *findItem(const QString& name) const;
+
+ int currentActivationId() const { return ((VariableTree*) listView())->activationId(); }
+ virtual void setActivationId() { activationId_ = currentActivationId(); }
+ bool isActive() const { return activationId_ == currentActivationId(); }
+
+ void startWaitingForData() { waitingForData_ = true; }
+ void stopWaitingForData() { waitingForData_ = false; }
+ bool isWaitingForData() const { return waitingForData_; }
+
+protected:
+ void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int align );
+
+private:
+ int activationId_;
+ bool waitingForData_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VarItem : public LazyFetchItem
+{
+public:
+ VarItem( LazyFetchItem *parent, const QString &varName, DataType dataType );
+
+ virtual ~VarItem();
+
+ virtual int rtti() const { return RTTI_VAR_ITEM; }
+ virtual QString key(int column, bool ascending) const;
+
+ QString fullName() const;
+
+ DataType dataType() const;
+ void setDataType(DataType dataType);
+
+ void setOpen(bool open);
+ void setText (int column, const QString& text);
+
+ // Returns the text to be displayed as tooltip (the value)
+ QString tipText() const;
+
+ // If the item is open, fetch details via a pp command
+ void update();
+
+ // The details from the pp command have arrived, parse them
+ // and update the UI
+ void expandValue(char *data);
+
+private:
+ void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int align );
+
+private:
+ QString key_;
+ QCString cache_;
+ DataType dataType_;
+ bool highlight_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class WatchVarItem : public VarItem
+{
+public:
+ WatchVarItem( LazyFetchItem *parent, const QString &varName, DataType dataType, int displayId = -1);
+
+ virtual ~WatchVarItem();
+
+ virtual int rtti() const { return RTTI_WATCH_VAR_ITEM; }
+
+ // The id returned by rdb after a display expression is added
+ void setDisplayId(int id);
+ int displayId();
+
+private:
+ int displayId_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VarFrameRoot : public LazyFetchItem
+{
+public:
+ VarFrameRoot(VariableTree *parent, int frame, int thread);
+ virtual ~VarFrameRoot();
+
+ virtual int rtti() const { return RTTI_VAR_FRAME_ROOT; }
+
+ virtual QString key(int column, bool /*ascending*/) const {
+ return QString("%1%2").arg(RTTI_VAR_FRAME_ROOT).arg(text(column));
+ }
+
+ void addLocals(char *variables);
+ void setLocals();
+ void setOpen(bool open);
+
+ void setFrameName(const QString &frameName);
+
+ virtual void setActivationId();
+ bool needsVariables() const;
+
+ int frameNo() { return frameNo_; }
+ int threadNo() { return threadNo_; }
+
+private:
+ bool needsVariables_;
+ int frameNo_;
+ int threadNo_;
+ QCString cache_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class WatchRoot : public LazyFetchItem
+{
+public:
+ WatchRoot(VariableTree * parent);
+ virtual ~WatchRoot();
+
+ virtual int rtti() const { return RTTI_WATCH_ROOT; }
+
+ virtual QString key(int column, bool /*ascending*/) const {
+ return QString("%1%2").arg(RTTI_WATCH_ROOT).arg(text(column));
+ }
+
+ void setWatchExpression(char * buf, char * expr);
+ void updateWatchExpression(int id, const QString& expr);
+
+ void restorePartialProjectSession(const QDomElement* el);
+ void savePartialProjectSession(QDomElement* el);
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class GlobalRoot : public LazyFetchItem
+{
+public:
+ GlobalRoot(VariableTree * parent);
+ virtual ~GlobalRoot();
+
+ virtual int rtti() const { return RTTI_GLOBAL_ROOT; }
+
+ virtual QString key(int column, bool /*ascending*/) const {
+ return QString("%1%2").arg(RTTI_GLOBAL_ROOT).arg(text(column));
+ }
+
+ void setOpen(bool open);
+ void setGlobals(char * globals);
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#endif
diff --git a/languages/ruby/doc/Makefile.am b/languages/ruby/doc/Makefile.am
new file mode 100644
index 00000000..245b8fe5
--- /dev/null
+++ b/languages/ruby/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = ruby.toc ruby_bugs.toc qtruby.toc rails.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA = ruby.index
+
diff --git a/languages/ruby/doc/qtruby.toc b/languages/ruby/doc/qtruby.toc
new file mode 100644
index 00000000..85fc3836
--- /dev/null
+++ b/languages/ruby/doc/qtruby.toc
@@ -0,0 +1,9 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>QtRuby and Korundum</title>
+<base href="http://developer.kde.org/language-bindings/ruby/"/>
+<tocsect1 name="Qt Tutorial #1" url="tutorial/tutorial.html"></tocsect1>
+<tocsect1 name="Qt Tutorial #2" url="tutorial2/tutorial2.html"></tocsect1>
+<tocsect1 name="Qt Designer Tutorial" url="colortooltutorial/designer-manual-3.html"></tocsect1>
+<tocsect1 name="KDE 3.0 Tutorial" url="kde3tutorial/index.html"></tocsect1>
+</kdeveloptoc>
diff --git a/languages/ruby/doc/rails.toc b/languages/ruby/doc/rails.toc
new file mode 100644
index 00000000..6f92fcd6
--- /dev/null
+++ b/languages/ruby/doc/rails.toc
@@ -0,0 +1,9 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Rails</title>
+<base href="http://"/>
+<tocsect1 name="Rails Site" url="rubyonrails.org/"></tocsect1>
+<tocsect1 name="Rails API Reference" url="api.rubyonrails.com/"></tocsect1>
+<tocsect1 name="Wiki" url="wiki.rubyonrails.org/"></tocsect1>
+<tocsect1 name="Bug tracker" url="dev.rubyonrails.org/"></tocsect1>
+</kdeveloptoc>
diff --git a/languages/ruby/doc/ruby.toc b/languages/ruby/doc/ruby.toc
new file mode 100644
index 00000000..bce60158
--- /dev/null
+++ b/languages/ruby/doc/ruby.toc
@@ -0,0 +1,1399 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Ruby</title>
+<base href="http://www.ruby-doc.org/docs/ProgrammingRuby/"/>
+<tocsect1 name="Pickaxe Book" url="">
+<tocsect2 name="Contents" url="html/index.html"></tocsect2>
+<tocsect2 name="Foreword" url="html/foreword.html"></tocsect2>
+<tocsect2 name="Preface" url="html/preface.html"></tocsect2>
+<tocsect2 name="Roadmap" url="html/roadmap.html"></tocsect2>
+<tocsect2 name="Ruby.new" url="html/intro.html"></tocsect2>
+<tocsect2 name="Classes, Objects, and Variables" url="html/tut_classes.html"></tocsect2>
+<tocsect2 name="Containers, Blocks, and Iterators" url="html/tut_containers.html"></tocsect2>
+<tocsect2 name="Standard Types" url="html/tut_stdtypes.html"></tocsect2>
+<tocsect2 name="More About Methods" url="html/tut_methods.html"></tocsect2>
+<tocsect2 name="Expressions" url="html/tut_expressions.html"></tocsect2>
+<tocsect2 name="Exceptions, Catch, and Throw" url="html/tut_exceptions.html"></tocsect2>
+<tocsect2 name="Modules" url="html/tut_modules.html"></tocsect2>
+<tocsect2 name="Basic Input and Output" url="html/tut_io.html"></tocsect2>
+<tocsect2 name="Threads and Processes" url="html/tut_threads.html"></tocsect2>
+<tocsect2 name="When Trouble Strikes" url="html/trouble.html"></tocsect2>
+<tocsect2 name="Ruby and Its World" url="html/rubyworld.html"></tocsect2>
+<tocsect2 name="Ruby and the Web" url="html/web.html"></tocsect2>
+<tocsect2 name="Ruby Tk" url="html/ext_tk.html"></tocsect2>
+<tocsect2 name="Ruby and Microsoft Windows" url="html/win32.html"></tocsect2>
+<tocsect2 name="Extending Ruby" url="html/ext_ruby.html"></tocsect2>
+<tocsect2 name="The Ruby Language" url="html/language.html"></tocsect2>
+<tocsect2 name="Classes and Objects" url="html/classes.html"></tocsect2>
+<tocsect2 name="Locking Ruby in the Safe" url="html/taint.html"></tocsect2>
+<tocsect2 name="Reflection, ObjectSpace, and Distributed Ruby" url="html/ospace.html"></tocsect2>
+<tocsect2 name="Built-in Classes and Methods" url="html/builtins.html"></tocsect2>
+<tocsect2 name="Standard Library" url="html/lib_standard.html"></tocsect2>
+<tocsect2 name="Object-Oriented Design Libraries" url="html/lib_patterns.html"></tocsect2>
+<tocsect2 name="Network and Web Libraries" url="html/lib_network.html"></tocsect2>
+<tocsect2 name="Microsoft Windows Support" url="html/lib_windows.html"></tocsect2>
+<tocsect2 name="Embedded Documentation" url="html/rdtool.html"></tocsect2>
+<tocsect2 name="Interactive Ruby Shell" url="html/irb.html"></tocsect2>
+<tocsect2 name="Support" url="html/support.html"></tocsect2>
+</tocsect1>
+<index>
+<entry name="$CFLAGS (mkmf)" url="html/lib_standard.html#mkmf.$CFLAGS"/>
+<entry name="$LDFLAGS (mkmf)" url="html/lib_standard.html#mkmf.$LDFLAGS"/>
+<entry name="% (String)" url="html/ref_c_string.html#String._pc"/>
+<entry name="&amp; (Array)" url="html/ref_c_array.html#Array._et"/>
+<entry name="&amp; (FalseClass)" url="html/ref_c_falseclass.html#FalseClass._et"/>
+<entry name="&amp; (NilClass)" url="html/ref_c_nilclass.html#NilClass._et"/>
+<entry name="&amp; (TrueClass)" url="html/ref_c_trueclass.html#TrueClass._et"/>
+<entry name="* (Array)" url="html/ref_c_array.html#Array._st"/>
+<entry name="* (String)" url="html/ref_c_string.html#String._st"/>
+<entry name="+ (Array)" url="html/ref_c_array.html#Array._pl"/>
+<entry name="+ (Date)" url="html/lib_standard.html#Date._pl"/>
+<entry name="+ (String)" url="html/ref_c_string.html#String._pl"/>
+<entry name="+ (Time)" url="html/ref_c_time.html#Time._pl"/>
+<entry name="+@ (Numeric)" url="html/ref_c_numeric.html#Numeric._pl_at"/>
+<entry name="- (Array)" url="html/ref_c_array.html#Array._mi"/>
+<entry name="- (Time)" url="html/ref_c_time.html#Time._mi"/>
+<entry name="-- (Array)" url="html/ref_c_array.html#Array._mi_mi"/>
+<entry name="-- (Date)" url="html/lib_standard.html#Date._mi_mi"/>
+<entry name="-- (Time)" url="html/ref_c_time.html#Time._mi_mi"/>
+<entry name="--@ (Numeric)" url="html/ref_c_numeric.html#Numeric._mi_mi_at"/>
+<entry name="-@ (Numeric)" url="html/ref_c_numeric.html#Numeric._mi_at"/>
+<entry name="&lt;, &lt;=, &gt;, &gt;= (Module)" url="html/ref_c_module.html#Module._lt_cm_lt_eq_cm_lt_cm_lt_eq"/>
+<entry name="&lt;&lt; (Array)" url="html/ref_c_array.html#Array._lt_lt"/>
+<entry name="&lt;&lt; (Date)" url="html/lib_standard.html#Date._lt_lt"/>
+<entry name="&lt;&lt; (IO)" url="html/ref_c_io.html#IO._lt_lt"/>
+<entry name="&lt;&lt; (String)" url="html/ref_c_string.html#String._lt_lt"/>
+<entry name="&lt;=&gt; (Array)" url="html/ref_c_array.html#Array._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Bignum)" url="html/ref_c_bignum.html#Bignum._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Complex)" url="html/lib_standard.html#Complex._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Date)" url="html/lib_standard.html#Date._lt_eq_lt"/>
+<entry name="&lt;=&gt; (File::Stat)" url="html/ref_c_file__stat.html#File::Stat._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Fixnum)" url="html/ref_c_fixnum.html#Fixnum._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Float)" url="html/ref_c_float.html#Float._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Module)" url="html/ref_c_module.html#Module._lt_eq_lt"/>
+<entry name="&lt;=&gt; (String)" url="html/ref_c_string.html#String._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Time)" url="html/ref_c_time.html#Time._lt_eq_lt"/>
+<entry name="== (Array)" url="html/ref_c_array.html#Array._eq_eq"/>
+<entry name="== (Comparable)" url="html/ref_m_comparable.html#Comparable._eq_eq"/>
+<entry name="== (Complex)" url="html/lib_standard.html#Complex._eq_eq"/>
+<entry name="== (Hash)" url="html/ref_c_hash.html#Hash._eq_eq"/>
+<entry name="== (Object)" url="html/ref_c_object.html#Object._eq_eq"/>
+<entry name="== (Regexp)" url="html/ref_c_regexp.html#Regexp._eq_eq"/>
+<entry name="== (String)" url="html/ref_c_string.html#String._eq_eq"/>
+<entry name="== (Struct)" url="html/ref_c_struct.html#Struct._eq_eq"/>
+<entry name="=== (Array)" url="html/ref_c_array.html#Array._eq_eq_eq"/>
+<entry name="=== (Date)" url="html/lib_standard.html#Date._eq_eq_eq"/>
+<entry name="=== (Module)" url="html/ref_c_module.html#Module._eq_eq_eq"/>
+<entry name="=== (Object)" url="html/ref_c_object.html#Object._eq_eq_eq"/>
+<entry name="=== (Range)" url="html/ref_c_range.html#Range._eq_eq_eq"/>
+<entry name="=== (Regexp)" url="html/ref_c_regexp.html#Regexp._eq_eq_eq"/>
+<entry name="=== (String)" url="html/ref_c_string.html#String._eq_eq_eq"/>
+<entry name="=~ (Object)" url="html/ref_c_object.html#Object._eq_sd"/>
+<entry name="=~ (Regexp)" url="html/ref_c_regexp.html#Regexp._eq_sd"/>
+<entry name="=~ (String)" url="html/ref_c_string.html#String._eq_sd"/>
+<entry name="&gt;&gt; (Date)" url="html/lib_standard.html#Date._lt_lt"/>
+<entry name="abort (Kernel)" url="html/ref_m_kernel.html#Kernel.abort"/>
+<entry name="abort (PStore)" url="html/lib_standard.html#PStore.abort"/>
+<entry name="abort_on_exception (Thread)" url="html/ref_c_thread.html#Thread.abort_on_exception"/>
+<entry name="abort_on_exception= (Thread)" url="html/ref_c_thread.html#Thread.abort_on_exception_eq"/>
+<entry name="abs (Complex)" url="html/lib_standard.html#Complex.abs"/>
+<entry name="abs (Numeric)" url="html/ref_c_numeric.html#Numeric.abs"/>
+<entry name="abs2 (Complex)" url="html/lib_standard.html#Complex.abs2"/>
+<entry name="accept (Socket)" url="html/lib_network.html#Socket.accept"/>
+<entry name="accept (TCPServer)" url="html/lib_network.html#TCPServer.accept"/>
+<entry name="accept (UNIXServer)" url="html/lib_network.html#UNIXServer.accept"/>
+<entry name="Access Control (classes)" url="html/tut_classes.html#S4"/>
+<entry name="Accessors (Date)" url="html/lib_standard.html#Date.Accessors"/>
+<entry name="Acknowledgments (preface)" url="html/preface.html#S9"/>
+<entry name="add (ThreadGroup)" url="html/ref_c_threadgroup.html#ThreadGroup.add"/>
+<entry name="Adding Information to Exceptions (exceptions)" url="html/tut_exceptions.html#UC"/>
+<entry name="addr (IPSocket)" url="html/lib_network.html#IPSocket.addr"/>
+<entry name="addr (UNIXSocket)" url="html/lib_network.html#UNIXSocket.addr"/>
+<entry name="alias_method (Module)" url="html/ref_c_module.html#Module.alias_method"/>
+<entry name="alive? (Thread)" url="html/ref_c_thread.html#Thread.alive_qm"/>
+<entry name="all (Net::POPMail)" url="html/lib_network.html#Net::POPMail.all"/>
+<entry name="Alternation (stdtypes)" url="html/tut_stdtypes.html#UI"/>
+<entry name="An Example (ruby)" url="html/ext_ruby.html#UF"/>
+<entry name="An Example (win32)" url="html/win32.html#UD"/>
+<entry name="ancestors (Module)" url="html/ref_c_module.html#Module.ancestors"/>
+<entry name="Anchors (stdtypes)" url="html/tut_stdtypes.html#UF"/>
+<entry name="append_features (Module)" url="html/ref_c_module.html#Module.append_features"/>
+<entry name="arg (Complex)" url="html/lib_standard.html#Complex.arg"/>
+<entry name="ARGV (rubyworld)" url="html/rubyworld.html#UB"/>
+<entry name="Arithmetic operations (Bignum)" url="html/ref_c_bignum.html#Bignum.Arithmeticoperations"/>
+<entry name="Arithmetic operations (Complex)" url="html/lib_standard.html#Complex.Arithmeticoperations"/>
+<entry name="Arithmetic operations (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.Arithmeticoperations"/>
+<entry name="Arithmetic operations (Float)" url="html/ref_c_float.html#Float.Arithmeticoperations"/>
+<entry name="arity (Method)" url="html/ref_c_method.html#Method.arity"/>
+<entry name="arity (Proc)" url="html/ref_c_proc.html#Proc.arity"/>
+<entry name="Array" url="html/ref_c_array.html"/>
+<entry name="Array (Kernel)" url="html/ref_m_kernel.html#Kernel.Array"/>
+<entry name="Arrays (containers)" url="html/tut_containers.html#UA"/>
+<entry name="Arrays (language)" url="html/language.html#UF"/>
+<entry name="Arrays and Hashes (intro)" url="html/intro.html#S3"/>
+<entry name="asctime (Time)" url="html/ref_c_time.html#Time.asctime"/>
+<entry name="Assignment (expressions)" url="html/tut_expressions.html#S3"/>
+<entry name="assoc (Array)" url="html/ref_c_array.html#Array.assoc"/>
+<entry name="at (Array)" url="html/ref_c_array.html#Array.at"/>
+<entry name="at (Time)" url="html/ref_c_time.html#Time.at"/>
+<entry name="atan2 (Math)" url="html/ref_m_math.html#Math.atan2"/>
+<entry name="atime (File)" url="html/ref_c_file.html#File.atime"/>
+<entry name="atime (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.atime"/>
+<entry name="attr (Module)" url="html/ref_c_module.html#Module.attr"/>
+<entry name="attr_accessor (Module)" url="html/ref_c_module.html#Module.attr_accessor"/>
+<entry name="attr_reader (Module)" url="html/ref_c_module.html#Module.attr_reader"/>
+<entry name="attr_writer (Module)" url="html/ref_c_module.html#Module.attr_writer"/>
+<entry name="at_exit (Kernel)" url="html/ref_m_kernel.html#Kernel.at_exit"/>
+<entry name="autoload (Kernel)" url="html/ref_m_kernel.html#Kernel.autoload"/>
+<entry name="Backquotes Are Soft (expressions)" url="html/tut_expressions.html#UB"/>
+<entry name="Backslash Sequences in the Substitution (stdtypes)" url="html/tut_stdtypes.html#UL"/>
+<entry name="backtrace (Exception)" url="html/ref_c_exception.html#Exception.backtrace"/>
+<entry name="basename (File)" url="html/ref_c_file.html#File.basename"/>
+<entry name="Basic Input and Output (io)" url="html/tut_io.html"/>
+<entry name="begin (MatchData)" url="html/ref_c_matchdata.html#MatchData.begin"/>
+<entry name="begin (Range)" url="html/ref_c_range.html#Range.begin"/>
+<entry name="BEGIN and END Blocks (language)" url="html/language.html#UA"/>
+<entry name="between? (Comparable)" url="html/ref_m_comparable.html#Comparable.between_qm"/>
+<entry name="Bignum" url="html/ref_c_bignum.html"/>
+<entry name="bind (Socket)" url="html/lib_network.html#Socket.bind"/>
+<entry name="bind (UDPSocket)" url="html/lib_network.html#UDPSocket.bind"/>
+<entry name="Binding" url="html/ref_c_binding.html"/>
+<entry name="binding (Kernel)" url="html/ref_m_kernel.html#Kernel.binding"/>
+<entry name="Binding Events (tk)" url="html/ext_tk.html#S3"/>
+<entry name="binmode (IO)" url="html/ref_c_io.html#IO.binmode"/>
+<entry name="binmode (Net::Telnet)" url="html/lib_network.html#Net::Telnet.binmode"/>
+<entry name="binmode= (Net::Telnet)" url="html/lib_network.html#Net::Telnet.binmode_eq"/>
+<entry name="Bit operations (Bignum)" url="html/ref_c_bignum.html#Bignum.Bitoperations"/>
+<entry name="Bit operations (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.Bitoperations"/>
+<entry name="blksize (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.blksize"/>
+<entry name="blockdev? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.blockdev_qm"/>
+<entry name="blockdev? (FileTest)" url="html/ref_m_filetest.html#FileTest.blockdev_qm"/>
+<entry name="blocks (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.blocks"/>
+<entry name="Blocks and Iterators (containers)" url="html/tut_containers.html#S2"/>
+<entry name="Blocks and Iterators (intro)" url="html/intro.html#S6"/>
+<entry name="Blocks and Subprocesses (threads)" url="html/tut_threads.html#UI"/>
+<entry name="Blocks Can Be Closures (containers)" url="html/tut_containers.html#UG"/>
+<entry name="Blocks for Transactions (containers)" url="html/tut_containers.html#UF"/>
+<entry name="block_given? (Kernel)" url="html/ref_m_kernel.html#Kernel.block_given_qm"/>
+<entry name="Boolean Expressions (expressions)" url="html/tut_expressions.html#UF"/>
+<entry name="Break, Redo, and Next (expressions)" url="html/tut_expressions.html#UL"/>
+<entry name="Bridging Ruby to Other Languages (ruby)" url="html/ext_ruby.html#S7"/>
+<entry name="broadcast (ConditionVariable)" url="html/lib_standard.html#ConditionVariable.broadcast"/>
+<entry name="Bug Reporting (support)" url="html/support.html#S5"/>
+<entry name="Build Environment (rubyworld)" url="html/rubyworld.html#S5"/>
+<entry name="Building Ruby (preface)" url="html/preface.html#UA"/>
+<entry name="Built-in Classes and Methods (builtins)" url="html/builtins.html"/>
+<entry name="But I Miss My C++ Iostream (io)" url="html/tut_io.html#UC"/>
+<entry name="But It Doesn't Work! (trouble)" url="html/trouble.html#S3"/>
+<entry name="But It's Too Slow! (trouble)" url="html/trouble.html#S4"/>
+<entry name="call (Continuation)" url="html/ref_c_continuation.html#Continuation.call"/>
+<entry name="call (Method)" url="html/ref_c_method.html#Method.call"/>
+<entry name="call (Proc)" url="html/ref_c_proc.html#Proc.call"/>
+<entry name="Call (Win32API)" url="html/lib_windows.html#Win32API.Call"/>
+<entry name="call (Win32API)" url="html/lib_windows.html#Win32API.call"/>
+<entry name="callcc (Kernel)" url="html/ref_m_kernel.html#Kernel.callcc"/>
+<entry name="caller (Kernel)" url="html/ref_m_kernel.html#Kernel.caller"/>
+<entry name="Calling a Method (methods)" url="html/tut_methods.html#S2"/>
+<entry name="Calling Methods Dynamically (ospace)" url="html/ospace.html#S3"/>
+<entry name="Canvas (tk)" url="html/ext_tk.html#S4"/>
+<entry name="capitalize (String)" url="html/ref_c_string.html#String.capitalize"/>
+<entry name="capitalize! (String)" url="html/ref_c_string.html#String.capitalize_oh"/>
+<entry name="Case Expressions (expressions)" url="html/tut_expressions.html#S5"/>
+<entry name="casefold? (Regexp)" url="html/ref_c_regexp.html#Regexp.casefold_qm"/>
+<entry name="catch (Kernel)" url="html/ref_m_kernel.html#Kernel.catch"/>
+<entry name="Catch and Throw (exceptions)" url="html/tut_exceptions.html#S4"/>
+<entry name="ceil (Float)" url="html/ref_c_float.html#Float.ceil"/>
+<entry name="center (String)" url="html/ref_c_string.html#String.center"/>
+<entry name="CGI Development (network)" url="html/lib_network.html#S3"/>
+<entry name="Character Classes (stdtypes)" url="html/tut_stdtypes.html#UG"/>
+<entry name="chardev? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.chardev_qm"/>
+<entry name="chardev? (FileTest)" url="html/ref_m_filetest.html#FileTest.chardev_qm"/>
+<entry name="chdir (Dir)" url="html/ref_c_dir.html#Dir.chdir"/>
+<entry name="chmod (File)" url="html/ref_c_file.html#File.chmod"/>
+<entry name="chomp (Kernel)" url="html/ref_m_kernel.html#Kernel.chomp"/>
+<entry name="chomp (String)" url="html/ref_c_string.html#String.chomp"/>
+<entry name="chomp! (Kernel)" url="html/ref_m_kernel.html#Kernel.chomp_oh"/>
+<entry name="chomp! (String)" url="html/ref_c_string.html#String.chomp_oh"/>
+<entry name="chop (Kernel)" url="html/ref_m_kernel.html#Kernel.chop"/>
+<entry name="chop (String)" url="html/ref_c_string.html#String.chop"/>
+<entry name="chop! (Kernel)" url="html/ref_m_kernel.html#Kernel.chop_oh"/>
+<entry name="chop! (String)" url="html/ref_c_string.html#String.chop_oh"/>
+<entry name="chown (File)" url="html/ref_c_file.html#File.chown"/>
+<entry name="chr (Integer)" url="html/ref_c_integer.html#Integer.chr"/>
+<entry name="chroot (Dir)" url="html/ref_c_dir.html#Dir.chroot"/>
+<entry name="Class" url="html/ref_c_class.html"/>
+<entry name="class (Object)" url="html/ref_c_object.html#Object.class"/>
+<entry name="Class and Module Definitions (classes)" url="html/classes.html#S2"/>
+<entry name="Class Methods (classes)" url="html/tut_classes.html#UE"/>
+<entry name="Class Names Are Constants (classes)" url="html/classes.html#UE"/>
+<entry name="Class Variables (classes)" url="html/tut_classes.html#UD"/>
+<entry name="Class Variables and Class Methods (classes)" url="html/tut_classes.html#S3"/>
+<entry name="Classes and Objects (classes)" url="html/classes.html"/>
+<entry name="Classes, Objects, and Variables (classes)" url="html/tut_classes.html"/>
+<entry name="class_eval (Module)" url="html/ref_c_module.html#Module.class_eval"/>
+<entry name="class_variables (Module)" url="html/ref_c_module.html#Module.class_variables"/>
+<entry name="clear (Array)" url="html/ref_c_array.html#Array.clear"/>
+<entry name="clear (Hash)" url="html/ref_c_hash.html#Hash.clear"/>
+<entry name="clone (IO)" url="html/ref_c_io.html#IO.clone"/>
+<entry name="clone (Module)" url="html/ref_c_module.html#Module.clone"/>
+<entry name="clone (Object)" url="html/ref_c_object.html#Object.clone"/>
+<entry name="close (Dir)" url="html/ref_c_dir.html#Dir.close"/>
+<entry name="close (IO)" url="html/ref_c_io.html#IO.close"/>
+<entry name="close (Net::FTP)" url="html/lib_network.html#Net::FTP.close"/>
+<entry name="close (SOCKSSocket)" url="html/lib_network.html#SOCKSSocket.close"/>
+<entry name="close (Tempfile)" url="html/lib_standard.html#Tempfile.close"/>
+<entry name="closed? (IO)" url="html/ref_c_io.html#IO.closed_qm"/>
+<entry name="closed? (Net::FTP)" url="html/lib_network.html#Net::FTP.closed_qm"/>
+<entry name="close_read (BasicSocket)" url="html/lib_network.html#BasicSocket.close_read"/>
+<entry name="close_read (IO)" url="html/ref_c_io.html#IO.close_read"/>
+<entry name="close_write (BasicSocket)" url="html/lib_network.html#BasicSocket.close_write"/>
+<entry name="close_write (IO)" url="html/ref_c_io.html#IO.close_write"/>
+<entry name="cmd (Net::Telnet)" url="html/lib_network.html#Net::Telnet.cmd"/>
+<entry name="cmp (File)" url="html/lib_standard.html#File.cmp"/>
+<entry name="code (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse.code"/>
+<entry name="coerce (Numeric)" url="html/ref_c_numeric.html#Numeric.coerce"/>
+<entry name="collect (Array)" url="html/ref_c_array.html#Array.collect"/>
+<entry name="collect (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.collect"/>
+<entry name="collect! (Array)" url="html/ref_c_array.html#Array.collect_oh"/>
+<entry name="Collecting Hash Arguments (methods)" url="html/tut_methods.html#UE"/>
+<entry name="Command Expansion (expressions)" url="html/tut_expressions.html#UA"/>
+<entry name="Command Line (irb)" url="html/irb.html#S1"/>
+<entry name="Command-Line Arguments (rubyworld)" url="html/rubyworld.html#S1"/>
+<entry name="Command-Line Options (rubyworld)" url="html/rubyworld.html#UA"/>
+<entry name="Commands (irb)" url="html/irb.html#S3"/>
+<entry name="commit (PStore)" url="html/lib_standard.html#PStore.commit"/>
+<entry name="compact (Array)" url="html/ref_c_array.html#Array.compact"/>
+<entry name="compact! (Array)" url="html/ref_c_array.html#Array.compact_oh"/>
+<entry name="Comparable" url="html/ref_m_comparable.html"/>
+<entry name="compare (File)" url="html/ref_c_file.html#File.compare"/>
+<entry name="Comparisons (Comparable)" url="html/ref_m_comparable.html#Comparable.Comparisons"/>
+<entry name="compile (Regexp)" url="html/ref_c_regexp.html#Regexp.compile"/>
+<entry name="Compile Time? Runtime? Anytime! (ospace)" url="html/ospace.html#S7"/>
+<entry name="concat (Array)" url="html/ref_c_array.html#Array.concat"/>
+<entry name="concat (String)" url="html/ref_c_string.html#String.concat"/>
+<entry name="Condition Variables (threads)" url="html/tut_threads.html#UF"/>
+<entry name="Conditional Execution (expressions)" url="html/tut_expressions.html#S4"/>
+<entry name="Configuring the Prompt (irb)" url="html/irb.html#UA"/>
+<entry name="conjugate (Complex)" url="html/lib_standard.html#Complex.conjugate"/>
+<entry name="connect (Net::FTP)" url="html/lib_network.html#Net::FTP.connect"/>
+<entry name="connect (Socket)" url="html/lib_network.html#Socket.connect"/>
+<entry name="connect (UDPSocket)" url="html/lib_network.html#UDPSocket.connect"/>
+<entry name="connect (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.connect"/>
+<entry name="constants (Module)" url="html/ref_c_module.html#Module.constants"/>
+<entry name="const_defined? (Module)" url="html/ref_c_module.html#Module.const_defined_qm"/>
+<entry name="const_get (Module)" url="html/ref_c_module.html#Module.const_get"/>
+<entry name="const_load (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.const_load"/>
+<entry name="const_set (Module)" url="html/ref_c_module.html#Module.const_set"/>
+<entry name="Containers" url="html/tut_containers.html#S1"/>
+<entry name="Containers, Blocks, and Iterators (containers)" url="html/tut_containers.html"/>
+<entry name="Continuation" url="html/ref_c_continuation.html"/>
+<entry name="Control Structures (intro)" url="html/intro.html#S4"/>
+<entry name="Controlling the Thread Scheduler (threads)" url="html/tut_threads.html#S2"/>
+<entry name="cookies (CGI)" url="html/lib_network.html#CGI.cookies"/>
+<entry name="Cookies (web)" url="html/web.html#UE"/>
+<entry name="copy (File)" url="html/ref_c_file.html#File.copy"/>
+<entry name="cos (Math)" url="html/ref_m_math.html#Math.cos"/>
+<entry name="count (String)" url="html/ref_c_string.html#String.count"/>
+<entry name="cp (File)" url="html/lib_standard.html#File.cp"/>
+<entry name="Create Locals Outside Blocks (trouble)" url="html/trouble.html#UB"/>
+<entry name="create_makefile (mkmf)" url="html/lib_standard.html#mkmf.create_makefile"/>
+<entry name="Creating a Makefile with extconf.rb (ruby)" url="html/ext_ruby.html#UG"/>
+<entry name="Creating an Extension (ruby)" url="html/ext_ruby.html#S5"/>
+<entry name="Creating Forms and HTML (web)" url="html/web.html#UD"/>
+<entry name="Creating Ruby Threads (threads)" url="html/tut_threads.html#UA"/>
+<entry name="critical (Thread)" url="html/ref_c_thread.html#Thread.critical"/>
+<entry name="critical= (Thread)" url="html/ref_c_thread.html#Thread.critical_eq"/>
+<entry name="Cross References (rdtool)" url="html/rdtool.html#S2"/>
+<entry name="crypt (String)" url="html/ref_c_string.html#String.crypt"/>
+<entry name="ctime (File)" url="html/ref_c_file.html#File.ctime"/>
+<entry name="ctime (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.ctime"/>
+<entry name="ctime (Time)" url="html/ref_c_time.html#Time.ctime"/>
+<entry name="current (Thread)" url="html/ref_c_thread.html#Thread.current"/>
+<entry name="Custom Serialization Strategy (ospace)" url="html/ospace.html#UF"/>
+<entry name="day (Time)" url="html/ref_c_time.html#Time.day"/>
+<entry name="debug_mode (Net::FTP)" url="html/lib_network.html#Net::FTP.debug_mode"/>
+<entry name="debug_mode= (Net::FTP)" url="html/lib_network.html#Net::FTP.debug_mode_eq"/>
+<entry name="default (Hash)" url="html/ref_c_hash.html#Hash.default"/>
+<entry name="Default (ThreadGroup)" url="html/ref_c_threadgroup.html#ThreadGroup.Default"/>
+<entry name="default= (Hash)" url="html/ref_c_hash.html#Hash.default_eq"/>
+<entry name="Defined?, And, Or, and Not (expressions)" url="html/tut_expressions.html#UG"/>
+<entry name="define_finalizer (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace.define_finalizer"/>
+<entry name="Defining a Method (methods)" url="html/tut_methods.html#S1"/>
+<entry name="delete (Array)" url="html/ref_c_array.html#Array.delete"/>
+<entry name="delete (CGI::Session)" url="html/lib_network.html#CGI::Session.delete"/>
+<entry name="delete (Dir)" url="html/ref_c_dir.html#Dir.delete"/>
+<entry name="delete (File)" url="html/ref_c_file.html#File.delete"/>
+<entry name="delete (Hash)" url="html/ref_c_hash.html#Hash.delete"/>
+<entry name="delete (Net::POPMail)" url="html/lib_network.html#Net::POPMail.delete"/>
+<entry name="delete (String)" url="html/ref_c_string.html#String.delete"/>
+<entry name="delete! (Net::POPMail)" url="html/lib_network.html#Net::POPMail.delete_oh"/>
+<entry name="delete! (String)" url="html/ref_c_string.html#String.delete_oh"/>
+<entry name="delete_at (Array)" url="html/ref_c_array.html#Array.delete_at"/>
+<entry name="delete_if (Array)" url="html/ref_c_array.html#Array.delete_if"/>
+<entry name="delete_if (Hash)" url="html/ref_c_hash.html#Hash.delete_if"/>
+<entry name="detect (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.detect"/>
+<entry name="dev (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.dev"/>
+<entry name="Dir" url="html/ref_c_dir.html"/>
+<entry name="dir (Net::FTP)" url="html/lib_network.html#Net::FTP.dir"/>
+<entry name="Directly Sharing Variables (ruby)" url="html/ext_ruby.html#UD"/>
+<entry name="directory? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.directory_qm"/>
+<entry name="directory? (FileTest)" url="html/ref_m_filetest.html#FileTest.directory_qm"/>
+<entry name="dirname (File)" url="html/ref_c_file.html#File.dirname"/>
+<entry name="dir_config (mkmf)" url="html/lib_standard.html#mkmf.dir_config"/>
+<entry name="disable (GC)" url="html/ref_m_gc.html#GC.disable"/>
+<entry name="display (Object)" url="html/ref_c_object.html#Object.display"/>
+<entry name="Distributed Ruby (ospace)" url="html/ospace.html#UG"/>
+<entry name="divmod (Numeric)" url="html/ref_c_numeric.html#Numeric.divmod"/>
+<entry name="downcase (String)" url="html/ref_c_string.html#String.downcase"/>
+<entry name="downcase! (String)" url="html/ref_c_string.html#String.downcase_oh"/>
+<entry name="Download Sites (support)" url="html/support.html#S2"/>
+<entry name="downto (Date)" url="html/lib_standard.html#Date.downto"/>
+<entry name="downto (Integer)" url="html/ref_c_integer.html#Integer.downto"/>
+<entry name="do_not_reverse_lookup (BasicSocket)" url="html/lib_network.html#BasicSocket.do_not_reverse_lookup"/>
+<entry name="do_not_reverse_lookup= (BasicSocket)" url="html/lib_network.html#BasicSocket.do_not_reverse_lookup_eq"/>
+<entry name="dump (Marshal)" url="html/ref_m_marshal.html#Marshal.dump"/>
+<entry name="dump (String)" url="html/ref_c_string.html#String.dump"/>
+<entry name="dup (Object)" url="html/ref_c_object.html#Object.dup"/>
+<entry name="E (Math)" url="html/ref_m_math.html#Math.E"/>
+<entry name="each (Array)" url="html/ref_c_array.html#Array.each"/>
+<entry name="each (Dir)" url="html/ref_c_dir.html#Dir.each"/>
+<entry name="each (GetoptLong)" url="html/lib_standard.html#GetoptLong.each"/>
+<entry name="each (Hash)" url="html/ref_c_hash.html#Hash.each"/>
+<entry name="each (IO)" url="html/ref_c_io.html#IO.each"/>
+<entry name="each (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse.each"/>
+<entry name="each (Net::POP)" url="html/lib_network.html#Net::POP.each"/>
+<entry name="each (Range)" url="html/ref_c_range.html#Range.each"/>
+<entry name="each (String)" url="html/ref_c_string.html#String.each"/>
+<entry name="each (Struct)" url="html/ref_c_struct.html#Struct.each"/>
+<entry name="each (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.each"/>
+<entry name="each_byte (IO)" url="html/ref_c_io.html#IO.each_byte"/>
+<entry name="each_byte (String)" url="html/ref_c_string.html#String.each_byte"/>
+<entry name="each_index (Array)" url="html/ref_c_array.html#Array.each_index"/>
+<entry name="each_key (Hash)" url="html/ref_c_hash.html#Hash.each_key"/>
+<entry name="each_line (IO)" url="html/ref_c_io.html#IO.each_line"/>
+<entry name="each_line (String)" url="html/ref_c_string.html#String.each_line"/>
+<entry name="each_object (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace.each_object"/>
+<entry name="each_pair (Hash)" url="html/ref_c_hash.html#Hash.each_pair"/>
+<entry name="each_value (Hash)" url="html/ref_c_hash.html#Hash.each_value"/>
+<entry name="each_with_index (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.each_with_index"/>
+<entry name="Editor Support (trouble)" url="html/trouble.html#UA"/>
+<entry name="egid (Process)" url="html/ref_m_process.html#Process.egid"/>
+<entry name="egid= (Process)" url="html/ref_m_process.html#Process.egid_eq"/>
+<entry name="Embedded Documentation (rdtool)" url="html/rdtool.html"/>
+<entry name="Embedding a Ruby Interpreter (ruby)" url="html/ext_ruby.html#S6"/>
+<entry name="Embedding Ruby in HTML (web)" url="html/web.html#S2"/>
+<entry name="empty? (Array)" url="html/ref_c_array.html#Array.empty_qm"/>
+<entry name="empty? (Hash)" url="html/ref_c_hash.html#Hash.empty_qm"/>
+<entry name="empty? (String)" url="html/ref_c_string.html#String.empty_qm"/>
+<entry name="enable (GC)" url="html/ref_m_gc.html#GC.enable"/>
+<entry name="end (MatchData)" url="html/ref_c_matchdata.html#MatchData.end"/>
+<entry name="end (Range)" url="html/ref_c_range.html#Range.end"/>
+<entry name="england (Date)" url="html/lib_standard.html#Date.england"/>
+<entry name="entries (Dir)" url="html/ref_c_dir.html#Dir.entries"/>
+<entry name="entries (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.entries"/>
+<entry name="Enumerable" url="html/ref_m_enumerable.html"/>
+<entry name="Environment Variables (rubyworld)" url="html/rubyworld.html#S3"/>
+<entry name="eof (IO)" url="html/ref_c_io.html#IO.eof"/>
+<entry name="eof? (IO)" url="html/ref_c_io.html#IO.eof_qm"/>
+<entry name="eql? (Array)" url="html/ref_c_array.html#Array.eql_qm"/>
+<entry name="eql? (Numeric)" url="html/ref_c_numeric.html#Numeric.eql_qm"/>
+<entry name="eql? (Object)" url="html/ref_c_object.html#Object.eql_qm"/>
+<entry name="equal? (Object)" url="html/ref_c_object.html#Object.equal_qm"/>
+<entry name="Errno" url="html/ref_m_errno.html"/>
+<entry name="error? (GetoptLong)" url="html/lib_standard.html#GetoptLong.error_qm"/>
+<entry name="error_message (GetoptLong)" url="html/lib_standard.html#GetoptLong.error_message"/>
+<entry name="escape (CGI)" url="html/lib_network.html#CGI.escape"/>
+<entry name="escape (Regexp)" url="html/ref_c_regexp.html#Regexp.escape"/>
+<entry name="escapeElement (CGI)" url="html/lib_network.html#CGI.escapeElement"/>
+<entry name="escapeHTML (CGI)" url="html/lib_network.html#CGI.escapeHTML"/>
+<entry name="euid (Process)" url="html/ref_m_process.html#Process.euid"/>
+<entry name="euid= (Process)" url="html/ref_m_process.html#Process.euid_eq"/>
+<entry name="eval (Kernel)" url="html/ref_m_kernel.html#Kernel.eval"/>
+<entry name="Evaluating Ruby Expressions in C (ruby)" url="html/ext_ruby.html#UC"/>
+<entry name="Exception" url="html/ref_c_exception.html"/>
+<entry name="exception" url="html/ref_c_exception.html#Exception.exception"/>
+<entry name="Exceptions, Catch, and Throw (exceptions)" url="html/tut_exceptions.html"/>
+<entry name="exclude_end? (Range)" url="html/ref_c_range.html#Range.exclude_end_qm"/>
+<entry name="exec (Kernel)" url="html/ref_m_kernel.html#Kernel.exec"/>
+<entry name="executable? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.executable_qm"/>
+<entry name="executable? (FileTest)" url="html/ref_m_filetest.html#FileTest.executable_qm"/>
+<entry name="executable_real? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.executable_real_qm"/>
+<entry name="executable_real? (FileTest)" url="html/ref_m_filetest.html#FileTest.executable_real_qm"/>
+<entry name="exist2? (Date)" url="html/lib_standard.html#Date.exist2_qm"/>
+<entry name="exist? (Date)" url="html/lib_standard.html#Date.exist_qm"/>
+<entry name="exist? (FileTest)" url="html/ref_m_filetest.html#FileTest.exist_qm"/>
+<entry name="exists? (FileTest)" url="html/ref_m_filetest.html#FileTest.exists_qm"/>
+<entry name="existw? (Date)" url="html/lib_standard.html#Date.existw_qm"/>
+<entry name="exit (Kernel)" url="html/ref_m_kernel.html#Kernel.exit"/>
+<entry name="exit (Thread)" url="html/ref_c_thread.html#Thread.exit"/>
+<entry name="exit! (Kernel)" url="html/ref_m_kernel.html#Kernel.exit_oh"/>
+<entry name="exit! (Process)" url="html/ref_m_process.html#Process.exit_oh"/>
+<entry name="exp (Math)" url="html/ref_m_math.html#Math.exp"/>
+<entry name="Expanding Arrays in Method Calls (methods)" url="html/tut_methods.html#UC"/>
+<entry name="expand_path (File)" url="html/ref_c_file.html#File.expand_path"/>
+<entry name="Expressions" url="html/tut_expressions.html"/>
+<entry name="extend (Object)" url="html/ref_c_object.html#Object.extend"/>
+<entry name="EXTENDED (Regexp)" url="html/ref_c_regexp.html#Regexp.EXTENDED"/>
+<entry name="Extending Objects (classes)" url="html/classes.html#UD"/>
+<entry name="Extending Ruby (ruby)" url="html/ext_ruby.html"/>
+<entry name="extend_object (Module)" url="html/ref_c_module.html#Module.extend_object"/>
+<entry name="Extensions (language)" url="html/language.html#UN"/>
+<entry name="fail (Kernel)" url="html/ref_m_kernel.html#Kernel.fail"/>
+<entry name="FalseClass" url="html/ref_c_falseclass.html"/>
+<entry name="fcntl (IO)" url="html/ref_c_io.html#IO.fcntl"/>
+<entry name="fetch (Hash)" url="html/ref_c_hash.html#Hash.fetch"/>
+<entry name="File" url="html/ref_c_file.html"/>
+<entry name="file? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.file_qm"/>
+<entry name="file? (FileTest)" url="html/ref_m_filetest.html#FileTest.file_qm"/>
+<entry name="fileno (IO)" url="html/ref_c_io.html#IO.fileno"/>
+<entry name="FileTest" url="html/ref_m_filetest.html"/>
+<entry name="fill (Array)" url="html/ref_c_array.html#Array.fill"/>
+<entry name="find" url="html/lib_standard.html#Find.find"/>
+<entry name="find (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.find"/>
+<entry name="find_all (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.find_all"/>
+<entry name="find_library (mkmf)" url="html/lib_standard.html#mkmf.find_library"/>
+<entry name="finish (Net::POP)" url="html/lib_network.html#Net::POP.finish"/>
+<entry name="finite? (Float)" url="html/ref_c_float.html#Float.finite_qm"/>
+<entry name="first (Array)" url="html/ref_c_array.html#Array.first"/>
+<entry name="first (Range)" url="html/ref_c_range.html#Range.first"/>
+<entry name="Fixnum" url="html/ref_c_fixnum.html"/>
+<entry name="flatten (Array)" url="html/ref_c_array.html#Array.flatten"/>
+<entry name="flatten! (Array)" url="html/ref_c_array.html#Array.flatten_oh"/>
+<entry name="Float" url="html/ref_c_float.html"/>
+<entry name="Float (Kernel)" url="html/ref_m_kernel.html#Kernel.Float"/>
+<entry name="flock (File)" url="html/ref_c_file.html#File.flock"/>
+<entry name="floor (Float)" url="html/ref_c_float.html#Float.floor"/>
+<entry name="flush (IO)" url="html/ref_c_io.html#IO.flush"/>
+<entry name="For ... In (expressions)" url="html/tut_expressions.html#UK"/>
+<entry name="for each (win32)" url="html/win32.html#UC"/>
+<entry name="foreach (Dir)" url="html/ref_c_dir.html#Dir.foreach"/>
+<entry name="foreach (IO)" url="html/ref_c_io.html#IO.foreach"/>
+<entry name="Foreword" url="html/foreword.html"/>
+<entry name="fork (Kernel)" url="html/ref_m_kernel.html#Kernel.fork"/>
+<entry name="fork (Process)" url="html/ref_m_process.html#Process.fork"/>
+<entry name="fork (Thread)" url="html/ref_c_thread.html#Thread.fork"/>
+<entry name="format (Kernel)" url="html/ref_m_kernel.html#Kernel.format"/>
+<entry name="Forms (web)" url="html/web.html#UC"/>
+<entry name="for_fd (Socket)" url="html/lib_network.html#Socket.for_fd"/>
+<entry name="freeze (Object)" url="html/ref_c_object.html#Object.freeze"/>
+<entry name="Freezing Objects (classes)" url="html/classes.html#S5"/>
+<entry name="frexp (Math)" url="html/ref_m_math.html#Math.frexp"/>
+<entry name="frozen? (Object)" url="html/ref_c_object.html#Object.frozen_qm"/>
+<entry name="FTP_PORT (Net::FTP)" url="html/lib_network.html#Net::FTP.FTP_PORT"/>
+<entry name="ftype (File)" url="html/ref_c_file.html#File.ftype"/>
+<entry name="ftype (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.ftype"/>
+<entry name="garbage_collect (GC)" url="html/ref_m_gc.html#GC.garbage_collect"/>
+<entry name="garbage_collect (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace.garbage_collect"/>
+<entry name="GC" url="html/ref_m_gc.html"/>
+<entry name="General Delimited Input (language)" url="html/language.html#UB"/>
+<entry name="get (GetoptLong)" url="html/lib_standard.html#GetoptLong.get"/>
+<entry name="get (Net::HTTP)" url="html/lib_network.html#Net::HTTP.get"/>
+<entry name="getaddress (IPSocket)" url="html/lib_network.html#IPSocket.getaddress"/>
+<entry name="getaddrinfo (Socket)" url="html/lib_network.html#Socket.getaddrinfo"/>
+<entry name="getbinaryfile (Net::FTP)" url="html/lib_network.html#Net::FTP.getbinaryfile"/>
+<entry name="getc (IO)" url="html/ref_c_io.html#IO.getc"/>
+<entry name="gethostbyaddr (Socket)" url="html/lib_network.html#Socket.gethostbyaddr"/>
+<entry name="gethostbyname (Socket)" url="html/lib_network.html#Socket.gethostbyname"/>
+<entry name="gethostbyname (TCPSocket)" url="html/lib_network.html#TCPSocket.gethostbyname"/>
+<entry name="gethostname (Socket)" url="html/lib_network.html#Socket.gethostname"/>
+<entry name="getnameinfo (Socket)" url="html/lib_network.html#Socket.getnameinfo"/>
+<entry name="getpeername (BasicSocket)" url="html/lib_network.html#BasicSocket.getpeername"/>
+<entry name="getpgid (Process)" url="html/ref_m_process.html#Process.getpgid"/>
+<entry name="getpgrp (Process)" url="html/ref_m_process.html#Process.getpgrp"/>
+<entry name="getpriority (Process)" url="html/ref_m_process.html#Process.getpriority"/>
+<entry name="gets (IO)" url="html/ref_c_io.html#IO.gets"/>
+<entry name="gets (Kernel)" url="html/ref_m_kernel.html#Kernel.gets"/>
+<entry name="getservbyname (Socket)" url="html/lib_network.html#Socket.getservbyname"/>
+<entry name="getsockname (BasicSocket)" url="html/lib_network.html#BasicSocket.getsockname"/>
+<entry name="getsockopt (BasicSocket)" url="html/lib_network.html#BasicSocket.getsockopt"/>
+<entry name="gettextfile (Net::FTP)" url="html/lib_network.html#Net::FTP.gettextfile"/>
+<entry name="Getting and Setting Properties (win32)" url="html/win32.html#UA"/>
+<entry name="Getting Widget Data (tk)" url="html/ext_tk.html#UB"/>
+<entry name="getwd (Dir)" url="html/ref_c_dir.html#Dir.getwd"/>
+<entry name="get_option (GetoptLong)" url="html/lib_standard.html#GetoptLong.get_option"/>
+<entry name="gid (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.gid"/>
+<entry name="gid (Process)" url="html/ref_m_process.html#Process.gid"/>
+<entry name="gid= (Process)" url="html/ref_m_process.html#Process.gid_eq"/>
+<entry name="glob (Dir)" url="html/ref_c_dir.html#Dir.glob"/>
+<entry name="global_variables (Kernel)" url="html/ref_m_kernel.html#Kernel.global_variables"/>
+<entry name="gm (Time)" url="html/ref_c_time.html#Time.gm"/>
+<entry name="gmt? (Time)" url="html/ref_c_time.html#Time.gmt_qm"/>
+<entry name="gmtime (Time)" url="html/ref_c_time.html#Time.gmtime"/>
+<entry name="gregorian (Date)" url="html/lib_standard.html#Date.gregorian"/>
+<entry name="gregorian_leap? (Date)" url="html/lib_standard.html#Date.gregorian_leap_qm"/>
+<entry name="grep (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.grep"/>
+<entry name="Grouping (stdtypes)" url="html/tut_stdtypes.html#UJ"/>
+<entry name="grpowned? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.grpowned_qm"/>
+<entry name="grpowned? (FileTest)" url="html/ref_m_filetest.html#FileTest.grpowned_qm"/>
+<entry name="gsub (Kernel)" url="html/ref_m_kernel.html#Kernel.gsub"/>
+<entry name="gsub (String)" url="html/ref_c_string.html#String.gsub"/>
+<entry name="gsub! (Kernel)" url="html/ref_m_kernel.html#Kernel.gsub_oh"/>
+<entry name="gsub! (String)" url="html/ref_c_string.html#String.gsub_oh"/>
+<entry name="Handling Exceptions (exceptions)" url="html/tut_exceptions.html#S2"/>
+<entry name="Hash" url="html/ref_c_hash.html"/>
+<entry name="hash (Object)" url="html/ref_c_object.html#Object.hash"/>
+<entry name="hash (String)" url="html/ref_c_string.html#String.hash"/>
+<entry name="Hashes (containers)" url="html/tut_containers.html#UB"/>
+<entry name="Hashes (language)" url="html/language.html#UG"/>
+<entry name="has_key? (CGI)" url="html/lib_network.html#CGI.has_key_qm"/>
+<entry name="has_key? (Hash)" url="html/ref_c_hash.html#Hash.has_key_qm"/>
+<entry name="has_value? (Hash)" url="html/ref_c_hash.html#Hash.has_value_qm"/>
+<entry name="have_func (mkmf)" url="html/lib_standard.html#mkmf.have_func"/>
+<entry name="have_header (mkmf)" url="html/lib_standard.html#mkmf.have_header"/>
+<entry name="have_library (mkmf)" url="html/lib_standard.html#mkmf.have_library"/>
+<entry name="head (Net::HTTP)" url="html/lib_network.html#Net::HTTP.head"/>
+<entry name="header (CGI)" url="html/lib_network.html#CGI.header"/>
+<entry name="header (Net::POPMail)" url="html/lib_network.html#Net::POPMail.header"/>
+<entry name="hex (String)" url="html/ref_c_string.html#String.hex"/>
+<entry name="Higher-Level Access (network)" url="html/lib_network.html#S2"/>
+<entry name="hour (Time)" url="html/ref_c_time.html#Time.hour"/>
+<entry name="How Classes and Objects Interact (classes)" url="html/classes.html#S1"/>
+<entry name="How Did We Get Here? (ospace)" url="html/ospace.html#UE"/>
+<entry name="HTML Output Methods (network)" url="html/lib_network.html#UA"/>
+<entry name="I (Complex)" url="html/lib_standard.html#Complex.Complex::I"/>
+<entry name="id (Object)" url="html/ref_c_object.html#Object.id"/>
+<entry name="id2name (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.id2name"/>
+<entry name="id2name (Symbol)" url="html/ref_c_symbol.html#Symbol.id2name"/>
+<entry name="If and Unless Expressions (expressions)" url="html/tut_expressions.html#UH"/>
+<entry name="If and Unless Modifiers (expressions)" url="html/tut_expressions.html#UI"/>
+<entry name="IGNORECASE (Regexp)" url="html/ref_c_regexp.html#Regexp.IGNORECASE"/>
+<entry name="im (Numeric)" url="html/ref_c_numeric.html#Numeric.im"/>
+<entry name="image (Complex)" url="html/lib_standard.html#Complex.image"/>
+<entry name="Implementing a SongList Container (containers)" url="html/tut_containers.html#UC"/>
+<entry name="Implementing Iterators (containers)" url="html/tut_containers.html#UD"/>
+<entry name="Improving Performance (web)" url="html/web.html#S3"/>
+<entry name="include (Module)" url="html/ref_c_module.html#Module.include"/>
+<entry name="include? (Array)" url="html/ref_c_array.html#Array.include_qm"/>
+<entry name="include? (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.include_qm"/>
+<entry name="include? (Hash)" url="html/ref_c_hash.html#Hash.include_qm"/>
+<entry name="include? (String)" url="html/ref_c_string.html#String.include_qm"/>
+<entry name="included_modules (Module)" url="html/ref_c_module.html#Module.included_modules"/>
+<entry name="Including Other Files (modules)" url="html/tut_modules.html#S4"/>
+<entry name="Including Other Files (rdtool)" url="html/rdtool.html#S4"/>
+<entry name="Independent Children (threads)" url="html/tut_threads.html#UH"/>
+<entry name="index (Array)" url="html/ref_c_array.html#Array.index"/>
+<entry name="index (Hash)" url="html/ref_c_hash.html#Hash.index"/>
+<entry name="index (String)" url="html/ref_c_string.html#String.index"/>
+<entry name="indexes (Array)" url="html/ref_c_array.html#Array.indexes"/>
+<entry name="indexes (Hash)" url="html/ref_c_hash.html#Hash.indexes"/>
+<entry name="indices (Array)" url="html/ref_c_array.html#Array.indices"/>
+<entry name="indices (Hash)" url="html/ref_c_hash.html#Hash.indices"/>
+<entry name="infinite? (Float)" url="html/ref_c_float.html#Float.infinite_qm"/>
+<entry name="Inheritance and Messages (classes)" url="html/tut_classes.html#S1"/>
+<entry name="Inheritance and Mixins (classes)" url="html/tut_classes.html#UA"/>
+<entry name="Inheritance and Visibility (classes)" url="html/classes.html#S4"/>
+<entry name="inherited (Class)" url="html/ref_c_class.html#Class.inherited"/>
+<entry name="Initialization File (irb)" url="html/irb.html#S2"/>
+<entry name="Inline Formatting (rdtool)" url="html/rdtool.html#S1"/>
+<entry name="ino (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.ino"/>
+<entry name="inspect (Object)" url="html/ref_c_object.html#Object.inspect"/>
+<entry name="inspect (Symbol)" url="html/ref_c_symbol.html#Symbol.inspect"/>
+<entry name="install (File)" url="html/lib_standard.html#File.install"/>
+<entry name="Installing eruby in Apache (web)" url="html/web.html#UH"/>
+<entry name="Installing Ruby (preface)" url="html/preface.html#S6"/>
+<entry name="Instance Variables in Mixins (modules)" url="html/tut_modules.html#UA"/>
+<entry name="instance_eval (Object)" url="html/ref_c_object.html#Object.instance_eval"/>
+<entry name="instance_methods (Module)" url="html/ref_c_module.html#Module.instance_methods"/>
+<entry name="instance_of? (Object)" url="html/ref_c_object.html#Object.instance_of_qm"/>
+<entry name="instance_variables (Object)" url="html/ref_c_object.html#Object.instance_variables"/>
+<entry name="Integer" url="html/ref_c_integer.html"/>
+<entry name="Integer (Kernel)" url="html/ref_m_kernel.html#Kernel.Integer"/>
+<entry name="Integer and Floating Point Numbers (language)" url="html/language.html#UC"/>
+<entry name="integer? (Integer)" url="html/ref_c_integer.html#Integer.integer_qm"/>
+<entry name="integer? (Numeric)" url="html/ref_c_numeric.html#Numeric.integer_qm"/>
+<entry name="Interactive Ruby (preface)" url="html/preface.html#UB"/>
+<entry name="Interactive Ruby (trouble)" url="html/trouble.html#S2"/>
+<entry name="Interactive Ruby Shell (irb)" url="html/irb.html"/>
+<entry name="intern (String)" url="html/ref_c_string.html#String.intern"/>
+<entry name="invert (Hash)" url="html/ref_c_hash.html#Hash.invert"/>
+<entry name="invoke (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.invoke"/>
+<entry name="IO" url="html/ref_c_io.html"/>
+<entry name="ioctl (IO)" url="html/ref_c_io.html#IO.ioctl"/>
+<entry name="Is Ruby for Me? (preface)" url="html/preface.html#S3"/>
+<entry name="isatty (IO)" url="html/ref_c_io.html#IO.isatty"/>
+<entry name="isdst (Time)" url="html/ref_c_time.html#Time.isdst"/>
+<entry name="is_a? (Object)" url="html/ref_c_object.html#Object.is_a_qm"/>
+<entry name="italy (Date)" url="html/lib_standard.html#Date.italy"/>
+<entry name="iterator? (Kernel)" url="html/ref_m_kernel.html#Kernel.iterator_qm"/>
+<entry name="Iterators (expressions)" url="html/tut_expressions.html#UJ"/>
+<entry name="Iterators and the Enumerable Module (modules)" url="html/tut_modules.html#S3"/>
+<entry name="Iterators for Reading (io)" url="html/tut_io.html#UA"/>
+<entry name="jd (Date)" url="html/lib_standard.html#Date.jd"/>
+<entry name="join (Array)" url="html/ref_c_array.html#Array.join"/>
+<entry name="join (File)" url="html/ref_c_file.html#File.join"/>
+<entry name="join (Thread)" url="html/ref_c_thread.html#Thread.join"/>
+<entry name="julian (Date)" url="html/lib_standard.html#Date.julian"/>
+<entry name="julian_leap? (Date)" url="html/lib_standard.html#Date.julian_leap_qm"/>
+<entry name="Just One More Thing (tk)" url="html/ext_tk.html#UE"/>
+<entry name="kcode (Regexp)" url="html/ref_c_regexp.html#Regexp.kcode"/>
+<entry name="Kernel" url="html/ref_m_kernel.html"/>
+<entry name="key? (Hash)" url="html/ref_c_hash.html#Hash.key_qm"/>
+<entry name="key? (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse.key_qm"/>
+<entry name="key? (Thread)" url="html/ref_c_thread.html#Thread.key_qm"/>
+<entry name="keys (CGI)" url="html/lib_network.html#CGI.keys"/>
+<entry name="keys (Hash)" url="html/ref_c_hash.html#Hash.keys"/>
+<entry name="kill (Process)" url="html/ref_m_process.html#Process.kill"/>
+<entry name="kill (Thread)" url="html/ref_c_thread.html#Thread.kill"/>
+<entry name="kind_of? (Object)" url="html/ref_c_object.html#Object.kind_of_qm"/>
+<entry name="lambda (Kernel)" url="html/ref_m_kernel.html#Kernel.lambda"/>
+<entry name="last (Array)" url="html/ref_c_array.html#Array.last"/>
+<entry name="last (Range)" url="html/ref_c_range.html#Range.last"/>
+<entry name="lastresp (Net::FTP)" url="html/lib_network.html#Net::FTP.lastresp"/>
+<entry name="last_match (Regexp)" url="html/ref_c_regexp.html#Regexp.last_match"/>
+<entry name="ldexp (Math)" url="html/ref_m_math.html#Math.ldexp"/>
+<entry name="leap? (Date)" url="html/lib_standard.html#Date.leap_qm"/>
+<entry name="length (Array)" url="html/ref_c_array.html#Array.length"/>
+<entry name="length (Hash)" url="html/ref_c_hash.html#Hash.length"/>
+<entry name="length (MatchData)" url="html/ref_c_matchdata.html#MatchData.length"/>
+<entry name="length (Range)" url="html/ref_c_range.html#Range.length"/>
+<entry name="length (String)" url="html/ref_c_string.html#String.length"/>
+<entry name="length (Struct)" url="html/ref_c_struct.html#Struct.length"/>
+<entry name="lineno (IO)" url="html/ref_c_io.html#IO.lineno"/>
+<entry name="lineno= (IO)" url="html/ref_c_io.html#IO.lineno_eq"/>
+<entry name="link (File)" url="html/ref_c_file.html#File.link"/>
+<entry name="list (Net::FTP)" url="html/lib_network.html#Net::FTP.list"/>
+<entry name="list (Thread)" url="html/ref_c_thread.html#Thread.list"/>
+<entry name="list (ThreadGroup)" url="html/ref_c_threadgroup.html#ThreadGroup.list"/>
+<entry name="listen (Socket)" url="html/lib_network.html#Socket.listen"/>
+<entry name="ljust (String)" url="html/ref_c_string.html#String.ljust"/>
+<entry name="load (Kernel)" url="html/ref_m_kernel.html#Kernel.load"/>
+<entry name="load (Marshal)" url="html/ref_m_marshal.html#Marshal.load"/>
+<entry name="local (Time)" url="html/ref_c_time.html#Time.local"/>
+<entry name="localtime (Time)" url="html/ref_c_time.html#Time.localtime"/>
+<entry name="local_variables (Kernel)" url="html/ref_m_kernel.html#Kernel.local_variables"/>
+<entry name="lock (Mutex)" url="html/lib_standard.html#Mutex.lock"/>
+<entry name="locked? (Mutex)" url="html/lib_standard.html#Mutex.locked_qm"/>
+<entry name="Locking Ruby in the Safe (taint)" url="html/taint.html"/>
+<entry name="log (Math)" url="html/ref_m_math.html#Math.log"/>
+<entry name="log10 (Math)" url="html/ref_m_math.html#Math.log10"/>
+<entry name="login (Net::FTP)" url="html/lib_network.html#Net::FTP.login"/>
+<entry name="login (Net::Telnet)" url="html/lib_network.html#Net::Telnet.login"/>
+<entry name="Looking at Classes (ospace)" url="html/ospace.html#S2"/>
+<entry name="Looking at Objects (ospace)" url="html/ospace.html#S1"/>
+<entry name="Looking Inside Classes (ospace)" url="html/ospace.html#UB"/>
+<entry name="Looking Inside Objects (ospace)" url="html/ospace.html#UA"/>
+<entry name="lookup_order (BasicSocket)" url="html/lib_network.html#BasicSocket.lookup_order"/>
+<entry name="lookup_order= (BasicSocket)" url="html/lib_network.html#BasicSocket.lookup_order_eq"/>
+<entry name="loop (Kernel)" url="html/ref_m_kernel.html#Kernel.loop"/>
+<entry name="Loops (expressions)" url="html/tut_expressions.html#S6"/>
+<entry name="ls (Net::FTP)" url="html/lib_network.html#Net::FTP.ls"/>
+<entry name="lstat (File)" url="html/ref_c_file.html#File.lstat"/>
+<entry name="Mailing Lists (support)" url="html/support.html#S4"/>
+<entry name="mails (Net::POP)" url="html/lib_network.html#Net::POP.mails"/>
+<entry name="main (Thread)" url="html/ref_c_thread.html#Thread.main"/>
+<entry name="makedirs (File)" url="html/ref_c_file.html#File.makedirs"/>
+<entry name="Making Blocks More Dynamic (methods)" url="html/tut_methods.html#UD"/>
+<entry name="Mandatory Disclaimer (rdtool)" url="html/rdtool.html#S6"/>
+<entry name="Manipulating Threads (threads)" url="html/tut_threads.html#UB"/>
+<entry name="map (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.map"/>
+<entry name="map! (Array)" url="html/ref_c_array.html#Array.map_oh"/>
+<entry name="Marshal" url="html/ref_m_marshal.html"/>
+<entry name="Marshaling and Distributed Ruby (ospace)" url="html/ospace.html#S6"/>
+<entry name="match (Regexp)" url="html/ref_c_regexp.html#Regexp.match"/>
+<entry name="MatchData" url="html/ref_c_matchdata.html"/>
+<entry name="Math" url="html/ref_m_math.html"/>
+<entry name="max (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.max"/>
+<entry name="mday (Time)" url="html/ref_c_time.html#Time.mday"/>
+<entry name="member? (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.member_qm"/>
+<entry name="member? (Hash)" url="html/ref_c_hash.html#Hash.member_qm"/>
+<entry name="members (Struct)" url="html/ref_c_struct.html#Struct.members"/>
+<entry name="Memory Allocation (ruby)" url="html/ext_ruby.html#S4"/>
+<entry name="message (Exception)" url="html/ref_c_exception.html#Exception.message"/>
+<entry name="message (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse.message"/>
+<entry name="message_loop (WIN32OLE_EVENT)" url="html/lib_windows.html#WIN32OLE_EVENT.message_loop"/>
+<entry name="Method" url="html/ref_c_method.html"/>
+<entry name="method (Object)" url="html/ref_c_object.html#Object.method"/>
+<entry name="Method Names (rdtool)" url="html/rdtool.html#S3"/>
+<entry name="methods (Object)" url="html/ref_c_object.html#Object.methods"/>
+<entry name="Methods and Blocks (methods)" url="html/tut_methods.html#UB"/>
+<entry name="method_added (Module)" url="html/ref_c_module.html#Module.method_added"/>
+<entry name="method_defined? (Module)" url="html/ref_c_module.html#Module.method_defined_qm"/>
+<entry name="method_missing (Object)" url="html/ref_c_object.html#Object.method_missing"/>
+<entry name="Microsoft Windows Support (windows)" url="html/lib_windows.html"/>
+<entry name="min (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.min"/>
+<entry name="min (Time)" url="html/ref_c_time.html#Time.min"/>
+<entry name="Miscellaneous Expressions (expressions)" url="html/tut_expressions.html#S2"/>
+<entry name="Mixin Modules (classes)" url="html/classes.html#UC"/>
+<entry name="Mixins (modules)" url="html/tut_modules.html#S2"/>
+<entry name="mjd (Date)" url="html/lib_standard.html#Date.mjd"/>
+<entry name="mkdir (Dir)" url="html/ref_c_dir.html#Dir.mkdir"/>
+<entry name="mkpath (File)" url="html/lib_standard.html#File.mkpath"/>
+<entry name="mktime (Time)" url="html/ref_c_time.html#Time.mktime"/>
+<entry name="mode (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.mode"/>
+<entry name="Module" url="html/ref_c_module.html"/>
+<entry name="Modules" url="html/tut_modules.html"/>
+<entry name="module_eval (Module)" url="html/ref_c_module.html#Module.module_eval"/>
+<entry name="module_function (Module)" url="html/ref_c_module.html#Module.module_function"/>
+<entry name="modulo (Numeric)" url="html/ref_c_numeric.html#Numeric.modulo"/>
+<entry name="mon (Time)" url="html/ref_c_time.html#Time.mon"/>
+<entry name="month (Time)" url="html/ref_c_time.html#Time.month"/>
+<entry name="More About Methods (methods)" url="html/tut_methods.html"/>
+<entry name="move (File)" url="html/ref_c_file.html#File.move"/>
+<entry name="mtime (File)" url="html/ref_c_file.html#File.mtime"/>
+<entry name="mtime (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.mtime"/>
+<entry name="mtime (Net::FTP)" url="html/lib_network.html#Net::FTP.mtime"/>
+<entry name="MULTILINE (Regexp)" url="html/ref_c_regexp.html#Regexp.MULTILINE"/>
+<entry name="Multipart Form Values (network)" url="html/lib_network.html#UB"/>
+<entry name="Multithreading (threads)" url="html/tut_threads.html#S1"/>
+<entry name="Mutual Exclusion (threads)" url="html/tut_threads.html#S3"/>
+<entry name="mv (File)" url="html/lib_standard.html#File.mv"/>
+<entry name="name (Module)" url="html/ref_c_module.html#Module.name"/>
+<entry name="Named Arguments (win32)" url="html/win32.html#UB"/>
+<entry name="Names (language)" url="html/language.html#S3"/>
+<entry name="Namespaces (modules)" url="html/tut_modules.html#S1"/>
+<entry name="nan? (Float)" url="html/ref_c_float.html#Float.nan_qm"/>
+<entry name="Nested Assignments (expressions)" url="html/tut_expressions.html#UD"/>
+<entry name="nesting (Module)" url="html/ref_c_module.html#Module.nesting"/>
+<entry name="Network and Web Libraries (network)" url="html/lib_network.html"/>
+<entry name="new (Array)" url="html/ref_c_array.html#Array.new"/>
+<entry name="new (CGI)" url="html/lib_network.html#CGI.new"/>
+<entry name="new (CGI::Session)" url="html/lib_network.html#CGI::Session.new"/>
+<entry name="new (Class)" url="html/ref_c_class.html#Class.new"/>
+<entry name="new (Complex)" url="html/lib_standard.html#Complex.new"/>
+<entry name="new (Date)" url="html/lib_standard.html#Date.new"/>
+<entry name="new (Dir)" url="html/ref_c_dir.html#Dir.new"/>
+<entry name="new (File)" url="html/ref_c_file.html#File.new"/>
+<entry name="new (GetoptLong)" url="html/lib_standard.html#GetoptLong.new"/>
+<entry name="new (Hash)" url="html/ref_c_hash.html#Hash.new"/>
+<entry name="new (intro)" url="html/intro.html"/>
+<entry name="new (IO)" url="html/ref_c_io.html#IO.new"/>
+<entry name="new (Module)" url="html/ref_c_module.html#Module.new"/>
+<entry name="new (Net::FTP)" url="html/lib_network.html#Net::FTP.new"/>
+<entry name="new (Net::HTTP)" url="html/lib_network.html#Net::HTTP.new"/>
+<entry name="new (Net::POP)" url="html/lib_network.html#Net::POP.new"/>
+<entry name="new (Net::SMTP)" url="html/lib_network.html#Net::SMTP.new"/>
+<entry name="new (Net::Telnet)" url="html/lib_network.html#Net::Telnet.new"/>
+<entry name="new (Proc)" url="html/ref_c_proc.html#Proc.new"/>
+<entry name="new (PStore)" url="html/lib_standard.html#PStore.new"/>
+<entry name="new (Range)" url="html/ref_c_range.html#Range.new"/>
+<entry name="new (Regexp)" url="html/ref_c_regexp.html#Regexp.new"/>
+<entry name="new (Socket)" url="html/lib_network.html#Socket.new"/>
+<entry name="new (SOCKSSocket)" url="html/lib_network.html#SOCKSSocket.new"/>
+<entry name="new (String)" url="html/ref_c_string.html#String.new"/>
+<entry name="new (Struct)" url="html/ref_c_struct.html#Struct.new"/>
+<entry name="new (TCPServer)" url="html/lib_network.html#TCPServer.new"/>
+<entry name="new (TCPSocket)" url="html/lib_network.html#TCPSocket.new"/>
+<entry name="new (Tempfile)" url="html/lib_standard.html#Tempfile.new"/>
+<entry name="new (Thread)" url="html/ref_c_thread.html#Thread.new"/>
+<entry name="new (ThreadGroup)" url="html/ref_c_threadgroup.html#ThreadGroup.new"/>
+<entry name="new (Time)" url="html/ref_c_time.html#Time.new"/>
+<entry name="new (UDPSocket)" url="html/lib_network.html#UDPSocket.new"/>
+<entry name="new (UNIXServer)" url="html/lib_network.html#UNIXServer.new"/>
+<entry name="new (UNIXSocket)" url="html/lib_network.html#UNIXSocket.new"/>
+<entry name="new (WeakRef)" url="html/lib_standard.html#WeakRef.new"/>
+<entry name="new (Win32API)" url="html/lib_windows.html#Win32API.new"/>
+<entry name="new (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.new"/>
+<entry name="new (WIN32OLE_EVENT)" url="html/lib_windows.html#WIN32OLE_EVENT.new"/>
+<entry name="new1 (Date)" url="html/lib_standard.html#Date.new1"/>
+<entry name="new2 (Date)" url="html/lib_standard.html#Date.new2"/>
+<entry name="new3 (Date)" url="html/lib_standard.html#Date.new3"/>
+<entry name="newsg (Date)" url="html/lib_standard.html#Date.newsg"/>
+<entry name="neww (Date)" url="html/lib_standard.html#Date.neww"/>
+<entry name="next (Date)" url="html/lib_standard.html#Date.next"/>
+<entry name="next (Integer)" url="html/ref_c_integer.html#Integer.next"/>
+<entry name="next (String)" url="html/ref_c_string.html#String.next"/>
+<entry name="next! (String)" url="html/ref_c_string.html#String.next_oh"/>
+<entry name="nil? (NilClass)" url="html/ref_c_nilclass.html#NilClass.nil_qm"/>
+<entry name="nil? (Object)" url="html/ref_c_object.html#Object.nil_qm"/>
+<entry name="NilClass" url="html/ref_c_nilclass.html"/>
+<entry name="nitems (Array)" url="html/ref_c_array.html#Array.nitems"/>
+<entry name="nlink (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.nlink"/>
+<entry name="nonzero? (Numeric)" url="html/ref_c_numeric.html#Numeric.nonzero_qm"/>
+<entry name="Notation Conventions (preface)" url="html/preface.html#S10"/>
+<entry name="now (Time)" url="html/ref_c_time.html#Time.now"/>
+<entry name="NO_ARGUMENT (GetoptLong)" url="html/lib_standard.html#GetoptLong.NO_ARGUMENT"/>
+<entry name="ns? (Date)" url="html/lib_standard.html#Date.ns_qm"/>
+<entry name="Numbers (stdtypes)" url="html/tut_stdtypes.html#S1"/>
+<entry name="Numeric" url="html/ref_c_numeric.html"/>
+<entry name="Object" url="html/ref_c_object.html"/>
+<entry name="Object Creation (tk)" url="html/ext_tk.html#UF"/>
+<entry name="Object-Oriented Design Libraries (patterns)" url="html/lib_patterns.html"/>
+<entry name="Object-Oriented Regular Expressions (stdtypes)" url="html/tut_stdtypes.html#UM"/>
+<entry name="Object-Specific Classes (classes)" url="html/classes.html#UB"/>
+<entry name="Objects and Attributes (classes)" url="html/tut_classes.html#S2"/>
+<entry name="ObjectSpace" url="html/ref_m_objectspace.html"/>
+<entry name="oct (String)" url="html/ref_c_string.html#String.oct"/>
+<entry name="offset (MatchData)" url="html/ref_c_matchdata.html#MatchData.offset"/>
+<entry name="Onward and Upward (intro)" url="html/intro.html#S8"/>
+<entry name="on_event (WIN32OLE_EVENT)" url="html/lib_windows.html#WIN32OLE_EVENT.on_event"/>
+<entry name="open (Dir)" url="html/ref_c_dir.html#Dir.open"/>
+<entry name="open (File)" url="html/ref_c_file.html#File.open"/>
+<entry name="open (Kernel)" url="html/ref_m_kernel.html#Kernel.open"/>
+<entry name="open (Net::FTP)" url="html/lib_network.html#Net::FTP.open"/>
+<entry name="open (Socket)" url="html/lib_network.html#Socket.open"/>
+<entry name="open (SOCKSSocket)" url="html/lib_network.html#SOCKSSocket.open"/>
+<entry name="open (TCPServer)" url="html/lib_network.html#TCPServer.open"/>
+<entry name="open (TCPSocket)" url="html/lib_network.html#TCPSocket.open"/>
+<entry name="open (Tempfile)" url="html/lib_standard.html#Tempfile.open"/>
+<entry name="open (UDPSocket)" url="html/lib_network.html#UDPSocket.open"/>
+<entry name="open (UNIXServer)" url="html/lib_network.html#UNIXServer.open"/>
+<entry name="open (UNIXSocket)" url="html/lib_network.html#UNIXSocket.open"/>
+<entry name="Opening and Closing Files (io)" url="html/tut_io.html#S2"/>
+<entry name="Operator Expressions (expressions)" url="html/tut_expressions.html#S1"/>
+<entry name="Optimizing (win32)" url="html/win32.html#UE"/>
+<entry name="OPTIONAL_ARGUMENT (GetoptLong)" url="html/lib_standard.html#GetoptLong.OPTIONAL_ARGUMENT"/>
+<entry name="Options (tk)" url="html/ext_tk.html#UG"/>
+<entry name="ordering (GetoptLong)" url="html/lib_standard.html#GetoptLong.ordering"/>
+<entry name="ordering= (GetoptLong)" url="html/lib_standard.html#GetoptLong.ordering_eq"/>
+<entry name="os? (Date)" url="html/lib_standard.html#Date.os_qm"/>
+<entry name="Other Forms of Assignment (expressions)" url="html/tut_expressions.html#UE"/>
+<entry name="out (CGI)" url="html/lib_network.html#CGI.out"/>
+<entry name="owned? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.owned_qm"/>
+<entry name="owned? (FileTest)" url="html/ref_m_filetest.html#FileTest.owned_qm"/>
+<entry name="p (Kernel)" url="html/ref_m_kernel.html#Kernel.p"/>
+<entry name="pack (Array)" url="html/ref_c_array.html#Array.pack"/>
+<entry name="pair (Socket)" url="html/lib_network.html#Socket.pair"/>
+<entry name="Parallel Assignment (expressions)" url="html/tut_expressions.html#UC"/>
+<entry name="params (CGI)" url="html/lib_network.html#CGI.params"/>
+<entry name="parse (CGI)" url="html/lib_network.html#CGI.parse"/>
+<entry name="parsedate" url="html/lib_standard.html#ParseDate.parsedate"/>
+<entry name="pass (Thread)" url="html/ref_c_thread.html#Thread.pass"/>
+<entry name="passive (Net::FTP)" url="html/lib_network.html#Net::FTP.passive"/>
+<entry name="passive= (Net::FTP)" url="html/lib_network.html#Net::FTP.passive_eq"/>
+<entry name="path (File)" url="html/ref_c_file.html#File.path"/>
+<entry name="path (PStore)" url="html/lib_standard.html#PStore.path"/>
+<entry name="path (Tempfile)" url="html/lib_standard.html#Tempfile.path"/>
+<entry name="path (UNIXSocket)" url="html/lib_network.html#UNIXSocket.path"/>
+<entry name="Pattern-Based Substitution (stdtypes)" url="html/tut_stdtypes.html#UK"/>
+<entry name="Patterns (stdtypes)" url="html/tut_stdtypes.html#UE"/>
+<entry name="peeraddr (IPSocket)" url="html/lib_network.html#IPSocket.peeraddr"/>
+<entry name="peeraddr (UNIXSocket)" url="html/lib_network.html#UNIXSocket.peeraddr"/>
+<entry name="Performance Considerations (ospace)" url="html/ospace.html#UC"/>
+<entry name="PERMUTE (GetoptLong)" url="html/lib_standard.html#GetoptLong.PERMUTE"/>
+<entry name="PI (Math)" url="html/ref_m_math.html#Math.PI"/>
+<entry name="pid (IO)" url="html/ref_c_io.html#IO.pid"/>
+<entry name="pid (Process)" url="html/ref_m_process.html#Process.pid"/>
+<entry name="pipe (IO)" url="html/ref_c_io.html#IO.pipe"/>
+<entry name="pipe? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.pipe_qm"/>
+<entry name="pipe? (FileTest)" url="html/ref_m_filetest.html#FileTest.pipe_qm"/>
+<entry name="PLATFORM (mkmf)" url="html/lib_standard.html#mkmf.PLATFORM"/>
+<entry name="Play It Again (exceptions)" url="html/tut_exceptions.html#UB"/>
+<entry name="polar (Complex)" url="html/lib_standard.html#Complex.polar"/>
+<entry name="pop (Array)" url="html/ref_c_array.html#Array.pop"/>
+<entry name="popen (IO)" url="html/ref_c_io.html#IO.popen"/>
+<entry name="port (Net::HTTP)" url="html/lib_network.html#Net::HTTP.port"/>
+<entry name="pos (IO)" url="html/ref_c_io.html#IO.pos"/>
+<entry name="pos= (IO)" url="html/ref_c_io.html#IO.pos_eq"/>
+<entry name="post (Net::HTTP)" url="html/lib_network.html#Net::HTTP.post"/>
+<entry name="post_match (MatchData)" url="html/ref_c_matchdata.html#MatchData.post_match"/>
+<entry name="ppid (Process)" url="html/ref_m_process.html#Process.ppid"/>
+<entry name="Preface" url="html/preface.html"/>
+<entry name="pretty (CGI)" url="html/lib_network.html#CGI.pretty"/>
+<entry name="pre_match (MatchData)" url="html/ref_c_matchdata.html#MatchData.pre_match"/>
+<entry name="print (IO)" url="html/ref_c_io.html#IO.print"/>
+<entry name="print (Kernel)" url="html/ref_m_kernel.html#Kernel.print"/>
+<entry name="print (Net::Telnet)" url="html/lib_network.html#Net::Telnet.print"/>
+<entry name="printf (IO)" url="html/ref_c_io.html#IO.printf"/>
+<entry name="printf (Kernel)" url="html/ref_m_kernel.html#Kernel.printf"/>
+<entry name="priority (Thread)" url="html/ref_c_thread.html#Thread.priority"/>
+<entry name="priority= (Thread)" url="html/ref_c_thread.html#Thread.priority_eq"/>
+<entry name="PRIO_PGRP (Process)" url="html/ref_m_process.html#Process.PRIO_PGRP"/>
+<entry name="PRIO_PROCESS (Process)" url="html/ref_m_process.html#Process.PRIO_PROCESS"/>
+<entry name="PRIO_USER (Process)" url="html/ref_m_process.html#Process.PRIO_USER"/>
+<entry name="private (Module)" url="html/ref_c_module.html#Module.private"/>
+<entry name="private_class_method (Module)" url="html/ref_c_module.html#Module.private_class_method"/>
+<entry name="private_instance_methods (Module)" url="html/ref_c_module.html#Module.private_instance_methods"/>
+<entry name="private_methods (Object)" url="html/ref_c_object.html#Object.private_methods"/>
+<entry name="Proc" url="html/ref_c_proc.html"/>
+<entry name="proc (Kernel)" url="html/ref_m_kernel.html#Kernel.proc"/>
+<entry name="Process" url="html/ref_m_process.html"/>
+<entry name="Program Termination (rubyworld)" url="html/rubyworld.html#S2"/>
+<entry name="protected (Module)" url="html/ref_c_module.html#Module.protected"/>
+<entry name="protected_instance_methods (Module)" url="html/ref_c_module.html#Module.protected_instance_methods"/>
+<entry name="protected_methods (Object)" url="html/ref_c_object.html#Object.protected_methods"/>
+<entry name="prune (Find)" url="html/lib_standard.html#Find.prune"/>
+<entry name="public (Module)" url="html/ref_c_module.html#Module.public"/>
+<entry name="public_class_method (Module)" url="html/ref_c_module.html#Module.public_class_method"/>
+<entry name="public_instance_methods (Module)" url="html/ref_c_module.html#Module.public_instance_methods"/>
+<entry name="public_methods (Object)" url="html/ref_c_object.html#Object.public_methods"/>
+<entry name="push (Array)" url="html/ref_c_array.html#Array.push"/>
+<entry name="putbinaryfile (Net::FTP)" url="html/lib_network.html#Net::FTP.putbinaryfile"/>
+<entry name="putc (IO)" url="html/ref_c_io.html#IO.putc"/>
+<entry name="putc (Kernel)" url="html/ref_m_kernel.html#Kernel.putc"/>
+<entry name="puts (IO)" url="html/ref_c_io.html#IO.puts"/>
+<entry name="puts (Kernel)" url="html/ref_m_kernel.html#Kernel.puts"/>
+<entry name="puttextfile (Net::FTP)" url="html/lib_network.html#Net::FTP.puttextfile"/>
+<entry name="pwd (Dir)" url="html/ref_c_dir.html#Dir.pwd"/>
+<entry name="quiet (GetoptLong)" url="html/lib_standard.html#GetoptLong.quiet"/>
+<entry name="quiet= (GetoptLong)" url="html/lib_standard.html#GetoptLong.quiet_eq"/>
+<entry name="quiet? (GetoptLong)" url="html/lib_standard.html#GetoptLong.quiet_qm"/>
+<entry name="quote (Regexp)" url="html/ref_c_regexp.html#Regexp.quote"/>
+<entry name="Quoting (web)" url="html/web.html#UB"/>
+<entry name="raise (Kernel)" url="html/ref_m_kernel.html#Kernel.raise"/>
+<entry name="raise (Thread)" url="html/ref_c_thread.html#Thread.raise"/>
+<entry name="Raising Exceptions (exceptions)" url="html/tut_exceptions.html#S3"/>
+<entry name="rand (Kernel)" url="html/ref_m_kernel.html#Kernel.rand"/>
+<entry name="Range" url="html/ref_c_range.html"/>
+<entry name="Ranges (language)" url="html/language.html#UE"/>
+<entry name="Ranges (stdtypes)" url="html/tut_stdtypes.html#S3"/>
+<entry name="Ranges as Conditions (stdtypes)" url="html/tut_stdtypes.html#UC"/>
+<entry name="Ranges as Intervals (stdtypes)" url="html/tut_stdtypes.html#UD"/>
+<entry name="Ranges as Sequences (stdtypes)" url="html/tut_stdtypes.html#UB"/>
+<entry name="rassoc (Array)" url="html/ref_c_array.html#Array.rassoc"/>
+<entry name="rdev (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.rdev"/>
+<entry name="read (Dir)" url="html/ref_c_dir.html#Dir.read"/>
+<entry name="read (IO)" url="html/ref_c_io.html#IO.read"/>
+<entry name="readable? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.readable_qm"/>
+<entry name="readable? (FileTest)" url="html/ref_m_filetest.html#FileTest.readable_qm"/>
+<entry name="readable_real? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.readable_real_qm"/>
+<entry name="readable_real? (FileTest)" url="html/ref_m_filetest.html#FileTest.readable_real_qm"/>
+<entry name="readchar (IO)" url="html/ref_c_io.html#IO.readchar"/>
+<entry name="Reading and 'Riting (intro)" url="html/intro.html#S7"/>
+<entry name="Reading and Writing Files (io)" url="html/tut_io.html#S3"/>
+<entry name="readline (IO)" url="html/ref_c_io.html#IO.readline"/>
+<entry name="readline (Kernel)" url="html/ref_m_kernel.html#Kernel.readline"/>
+<entry name="readlines (IO)" url="html/ref_c_io.html#IO.readlines"/>
+<entry name="readlines (Kernel)" url="html/ref_m_kernel.html#Kernel.readlines"/>
+<entry name="readlink (File)" url="html/ref_c_file.html#File.readlink"/>
+<entry name="ready (Net::SMTP)" url="html/lib_network.html#Net::SMTP.ready"/>
+<entry name="real (Complex)" url="html/lib_standard.html#Complex.real"/>
+<entry name="recv (BasicSocket)" url="html/lib_network.html#BasicSocket.recv"/>
+<entry name="recvfrom (Socket)" url="html/lib_network.html#Socket.recvfrom"/>
+<entry name="recvfrom (TCPSocket)" url="html/lib_network.html#TCPSocket.recvfrom"/>
+<entry name="recvfrom (UDPSocket)" url="html/lib_network.html#UDPSocket.recvfrom"/>
+<entry name="recvfrom (UNIXSocket)" url="html/lib_network.html#UNIXSocket.recvfrom"/>
+<entry name="Reflection, ObjectSpace, and Distributed Ruby (ospace)" url="html/ospace.html"/>
+<entry name="Regexp" url="html/ref_c_regexp.html"/>
+<entry name="Regular Expression Options (language)" url="html/language.html#UK"/>
+<entry name="Regular Expression Patterns (language)" url="html/language.html#UL"/>
+<entry name="Regular Expressions (intro)" url="html/intro.html#S5"/>
+<entry name="Regular Expressions (language)" url="html/language.html#UJ"/>
+<entry name="Regular Expressions (stdtypes)" url="html/tut_stdtypes.html#S4"/>
+<entry name="rehash (Hash)" url="html/ref_c_hash.html#Hash.rehash"/>
+<entry name="reject (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.reject"/>
+<entry name="reject (Hash)" url="html/ref_c_hash.html#Hash.reject"/>
+<entry name="reject! (Array)" url="html/ref_c_array.html#Array.reject_oh"/>
+<entry name="reject! (Hash)" url="html/ref_c_hash.html#Hash.reject_oh"/>
+<entry name="remainder (Numeric)" url="html/ref_c_numeric.html#Numeric.remainder"/>
+<entry name="remove_const (Module)" url="html/ref_c_module.html#Module.remove_const"/>
+<entry name="remove_method (Module)" url="html/ref_c_module.html#Module.remove_method"/>
+<entry name="rename (File)" url="html/ref_c_file.html#File.rename"/>
+<entry name="reopen (IO)" url="html/ref_c_io.html#IO.reopen"/>
+<entry name="Repetition (stdtypes)" url="html/tut_stdtypes.html#UH"/>
+<entry name="replace (Array)" url="html/ref_c_array.html#Array.replace"/>
+<entry name="replace (Hash)" url="html/ref_c_hash.html#Hash.replace"/>
+<entry name="replace (String)" url="html/ref_c_string.html#String.replace"/>
+<entry name="require (Kernel)" url="html/ref_m_kernel.html#Kernel.require"/>
+<entry name="REQUIRED_ARGUMENT (GetoptLong)" url="html/lib_standard.html#GetoptLong.REQUIRED_ARGUMENT"/>
+<entry name="Requirements for a Hash Key (language)" url="html/language.html#UH"/>
+<entry name="REQUIRE_ORDER (GetoptLong)" url="html/lib_standard.html#GetoptLong.REQUIRE_ORDER"/>
+<entry name="Resources (preface)" url="html/preface.html#S8"/>
+<entry name="respond_to? (Object)" url="html/ref_c_object.html#Object.respond_to_qm"/>
+<entry name="restore (Marshal)" url="html/ref_m_marshal.html#Marshal.restore"/>
+<entry name="Restrictions (irb)" url="html/irb.html#S4"/>
+<entry name="resume (Net::FTP)" url="html/lib_network.html#Net::FTP.resume"/>
+<entry name="resume= (Net::FTP)" url="html/lib_network.html#Net::FTP.resume_eq"/>
+<entry name="retrbinary (Net::FTP)" url="html/lib_network.html#Net::FTP.retrbinary"/>
+<entry name="retrlines (Net::FTP)" url="html/lib_network.html#Net::FTP.retrlines"/>
+<entry name="Retry (expressions)" url="html/tut_expressions.html#UM"/>
+<entry name="return_code (Net::FTP)" url="html/lib_network.html#Net::FTP.return_code"/>
+<entry name="RETURN_IN_ORDER (GetoptLong)" url="html/lib_standard.html#GetoptLong.RETURN_IN_ORDER"/>
+<entry name="reverse (Array)" url="html/ref_c_array.html#Array.reverse"/>
+<entry name="reverse (String)" url="html/ref_c_string.html#String.reverse"/>
+<entry name="reverse! (Array)" url="html/ref_c_array.html#Array.reverse_oh"/>
+<entry name="reverse! (String)" url="html/ref_c_string.html#String.reverse_oh"/>
+<entry name="reverse_each (Array)" url="html/ref_c_array.html#Array.reverse_each"/>
+<entry name="rewind (Dir)" url="html/ref_c_dir.html#Dir.rewind"/>
+<entry name="rewind (IO)" url="html/ref_c_io.html#IO.rewind"/>
+<entry name="rfc1123_date (CGI)" url="html/lib_network.html#CGI.rfc1123_date"/>
+<entry name="rindex (Array)" url="html/ref_c_array.html#Array.rindex"/>
+<entry name="rindex (String)" url="html/ref_c_string.html#String.rindex"/>
+<entry name="rjust (String)" url="html/ref_c_string.html#String.rjust"/>
+<entry name="rmdir (Dir)" url="html/ref_c_dir.html#Dir.rmdir"/>
+<entry name="rm_f (File)" url="html/lib_standard.html#File.rm_f"/>
+<entry name="Roadmap" url="html/roadmap.html"/>
+<entry name="root? (PStore)" url="html/lib_standard.html#PStore.root_qm"/>
+<entry name="roots (PStore)" url="html/lib_standard.html#PStore.roots"/>
+<entry name="round (Float)" url="html/ref_c_float.html#Float.round"/>
+<entry name="rtags (irb)" url="html/irb.html#UB"/>
+<entry name="rtags, xmp, and the Frame Class (irb)" url="html/irb.html#S5"/>
+<entry name="Ruby and Its World (rubyworld)" url="html/rubyworld.html"/>
+<entry name="Ruby and Microsoft Windows (win32)" url="html/win32.html"/>
+<entry name="Ruby and the Web (web)" url="html/web.html"/>
+<entry name="Ruby C Language API (ruby)" url="html/ext_ruby.html#S8"/>
+<entry name="Ruby Compared with C++ and Java (containers)" url="html/tut_containers.html#UE"/>
+<entry name="Ruby Debugger (trouble)" url="html/trouble.html#S1"/>
+<entry name="Ruby Is an Object-Oriented Language (intro)" url="html/intro.html#S1"/>
+<entry name="Ruby Objects in C (ruby)" url="html/ext_ruby.html#S1"/>
+<entry name="Ruby Ports (win32)" url="html/win32.html#S1"/>
+<entry name="Ruby Programs (preface)" url="html/preface.html#UC"/>
+<entry name="Ruby Sparkles (preface)" url="html/preface.html#S1"/>
+<entry name="Ruby Tk (tk)" url="html/ext_tk.html"/>
+<entry name="Ruby Versions (preface)" url="html/preface.html#S5"/>
+<entry name="run (Thread)" url="html/ref_c_thread.html#Thread.run"/>
+<entry name="Running Multiple Processes (threads)" url="html/tut_threads.html#S4"/>
+<entry name="Running Ruby (preface)" url="html/preface.html#S7"/>
+<entry name="Running Ruby Under Windows (win32)" url="html/win32.html#S2"/>
+<entry name="Runtime Callbacks (ospace)" url="html/ospace.html#UD"/>
+<entry name="Safe Levels (taint)" url="html/taint.html#S1"/>
+<entry name="safe_level (Thread)" url="html/ref_c_thread.html#Thread.safe_level"/>
+<entry name="safe_unlink (File)" url="html/ref_c_file.html#File.safe_unlink"/>
+<entry name="Sample Application (tk)" url="html/ext_tk.html#UD"/>
+<entry name="scan (Kernel)" url="html/ref_m_kernel.html#Kernel.scan"/>
+<entry name="scan (String)" url="html/ref_c_string.html#String.scan"/>
+<entry name="Scope of Constants and Variables (language)" url="html/language.html#UP"/>
+<entry name="Scrolling (tk)" url="html/ext_tk.html#S5"/>
+<entry name="sec (Time)" url="html/ref_c_time.html#Time.sec"/>
+<entry name="seek (Dir)" url="html/ref_c_dir.html#Dir.seek"/>
+<entry name="seek (IO)" url="html/ref_c_io.html#IO.seek"/>
+<entry name="SEEK_CUR (IO)" url="html/ref_c_io.html#IO.SEEK_CUR"/>
+<entry name="SEEK_END (IO)" url="html/ref_c_io.html#IO.SEEK_END"/>
+<entry name="SEEK_SET (IO)" url="html/ref_c_io.html#IO.SEEK_SET"/>
+<entry name="select (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.select"/>
+<entry name="select (IO)" url="html/ref_c_io.html#IO.select"/>
+<entry name="select (Kernel)" url="html/ref_m_kernel.html#Kernel.select"/>
+<entry name="send (BasicSocket)" url="html/lib_network.html#BasicSocket.send"/>
+<entry name="send (Object)" url="html/ref_c_object.html#Object.send"/>
+<entry name="send (UDPSocket)" url="html/lib_network.html#UDPSocket.send"/>
+<entry name="sendmail (Net::SMTP)" url="html/lib_network.html#Net::SMTP.sendmail"/>
+<entry name="SEPARATOR (File)" url="html/ref_c_file.html#File.SEPARATOR"/>
+<entry name="Server commands (Net::FTP)" url="html/lib_network.html#Net::FTP.Servercommands"/>
+<entry name="Sessions (web)" url="html/web.html#UF"/>
+<entry name="setgid? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.setgid_qm"/>
+<entry name="setgid? (FileTest)" url="html/ref_m_filetest.html#FileTest.setgid_qm"/>
+<entry name="setpgid (Process)" url="html/ref_m_process.html#Process.setpgid"/>
+<entry name="setpgrp (Process)" url="html/ref_m_process.html#Process.setpgrp"/>
+<entry name="setpriority (Process)" url="html/ref_m_process.html#Process.setpriority"/>
+<entry name="setsid (Process)" url="html/ref_m_process.html#Process.setsid"/>
+<entry name="setsockopt (BasicSocket)" url="html/lib_network.html#BasicSocket.setsockopt"/>
+<entry name="Setting Widget Options (tk)" url="html/ext_tk.html#UA"/>
+<entry name="Setting/Getting Options Dynamically (tk)" url="html/ext_tk.html#UC"/>
+<entry name="setuid? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.setuid_qm"/>
+<entry name="setuid? (FileTest)" url="html/ref_m_filetest.html#FileTest.setuid_qm"/>
+<entry name="set_backtrace (Exception)" url="html/ref_c_exception.html#Exception.set_backtrace"/>
+<entry name="set_options (GetoptLong)" url="html/lib_standard.html#GetoptLong.set_options"/>
+<entry name="set_trace_func (Kernel)" url="html/ref_m_kernel.html#Kernel.set_trace_func"/>
+<entry name="sg (Date)" url="html/lib_standard.html#Date.sg"/>
+<entry name="Sharing Data Between Ruby and C (ruby)" url="html/ext_ruby.html#S3"/>
+<entry name="shift (Array)" url="html/ref_c_array.html#Array.shift"/>
+<entry name="shift (Hash)" url="html/ref_c_hash.html#Hash.shift"/>
+<entry name="shutdown (BasicSocket)" url="html/lib_network.html#BasicSocket.shutdown"/>
+<entry name="signal (ConditionVariable)" url="html/lib_standard.html#ConditionVariable.signal"/>
+<entry name="Simple Tk Application (tk)" url="html/ext_tk.html#S1"/>
+<entry name="sin (Math)" url="html/ref_m_math.html#Math.sin"/>
+<entry name="Singletons and Other Constructors (classes)" url="html/tut_classes.html#UF"/>
+<entry name="singleton_methods (Object)" url="html/ref_c_object.html#Object.singleton_methods"/>
+<entry name="singleton_method_added (Kernel)" url="html/ref_m_kernel.html#Kernel.singleton_method_added"/>
+<entry name="size (Array)" url="html/ref_c_array.html#Array.size"/>
+<entry name="size (Bignum)" url="html/ref_c_bignum.html#Bignum.size"/>
+<entry name="size (File)" url="html/ref_c_file.html#File.size"/>
+<entry name="size (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.size"/>
+<entry name="size (FileTest)" url="html/ref_m_filetest.html#FileTest.size"/>
+<entry name="size (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.size"/>
+<entry name="size (Hash)" url="html/ref_c_hash.html#Hash.size"/>
+<entry name="size (MatchData)" url="html/ref_c_matchdata.html#MatchData.size"/>
+<entry name="size (Net::POPMail)" url="html/lib_network.html#Net::POPMail.size"/>
+<entry name="size (Range)" url="html/ref_c_range.html#Range.size"/>
+<entry name="size (String)" url="html/ref_c_string.html#String.size"/>
+<entry name="size (Struct)" url="html/ref_c_struct.html#Struct.size"/>
+<entry name="size? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.size_qm"/>
+<entry name="size? (FileTest)" url="html/ref_m_filetest.html#FileTest.size_qm"/>
+<entry name="sleep (Kernel)" url="html/ref_m_kernel.html#Kernel.sleep"/>
+<entry name="slice (Array)" url="html/ref_c_array.html#Array.slice"/>
+<entry name="slice (String)" url="html/ref_c_string.html#String.slice"/>
+<entry name="slice! (Array)" url="html/ref_c_array.html#Array.slice_oh"/>
+<entry name="slice! (String)" url="html/ref_c_string.html#String.slice_oh"/>
+<entry name="Socket-Level Access (network)" url="html/lib_network.html#S1"/>
+<entry name="socket? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.socket_qm"/>
+<entry name="socket? (FileTest)" url="html/ref_m_filetest.html#FileTest.socket_qm"/>
+<entry name="socketpair (Socket)" url="html/lib_network.html#Socket.socketpair"/>
+<entry name="Some Basic Ruby (intro)" url="html/intro.html#S2"/>
+<entry name="sort (Array)" url="html/ref_c_array.html#Array.sort"/>
+<entry name="sort (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.sort"/>
+<entry name="sort (Hash)" url="html/ref_c_hash.html#Hash.sort"/>
+<entry name="sort! (Array)" url="html/ref_c_array.html#Array.sort_oh"/>
+<entry name="source (Regexp)" url="html/ref_c_regexp.html#Regexp.source"/>
+<entry name="Source Layout (language)" url="html/language.html#S1"/>
+<entry name="Spawning New Processes (threads)" url="html/tut_threads.html#UG"/>
+<entry name="Specifying Access Control (classes)" url="html/tut_classes.html#UG"/>
+<entry name="split (File)" url="html/ref_c_file.html#File.split"/>
+<entry name="split (Kernel)" url="html/ref_m_kernel.html#Kernel.split"/>
+<entry name="split (String)" url="html/ref_c_string.html#String.split"/>
+<entry name="sprintf (Kernel)" url="html/ref_m_kernel.html#Kernel.sprintf"/>
+<entry name="sqrt (Math)" url="html/ref_m_math.html#Math.sqrt"/>
+<entry name="squeeze (String)" url="html/ref_c_string.html#String.squeeze"/>
+<entry name="squeeze! (String)" url="html/ref_c_string.html#String.squeeze_oh"/>
+<entry name="srand (Kernel)" url="html/ref_m_kernel.html#Kernel.srand"/>
+<entry name="Standard Library (standard)" url="html/lib_standard.html"/>
+<entry name="Standard Types (stdtypes)" url="html/tut_stdtypes.html"/>
+<entry name="start (GC)" url="html/ref_m_gc.html#GC.start"/>
+<entry name="start (Net::APOP)" url="html/lib_network.html#Net::APOP.start"/>
+<entry name="start (Net::HTTP)" url="html/lib_network.html#Net::HTTP.start"/>
+<entry name="start (Net::POP)" url="html/lib_network.html#Net::POP.start"/>
+<entry name="start (Net::SMTP)" url="html/lib_network.html#Net::SMTP.start"/>
+<entry name="start (Thread)" url="html/ref_c_thread.html#Thread.start"/>
+<entry name="Stat" url="html/ref_c_file__stat.html"/>
+<entry name="stat (File)" url="html/ref_c_file.html#File.stat"/>
+<entry name="stat (IO)" url="html/ref_c_io.html#IO.stat"/>
+<entry name="Static Linking (ruby)" url="html/ext_ruby.html#UH"/>
+<entry name="status (Thread)" url="html/ref_c_thread.html#Thread.status"/>
+<entry name="step (Date)" url="html/lib_standard.html#Date.step"/>
+<entry name="step (Integer)" url="html/ref_c_integer.html#Integer.step"/>
+<entry name="sticky? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.sticky_qm"/>
+<entry name="sticky? (FileTest)" url="html/ref_m_filetest.html#FileTest.sticky_qm"/>
+<entry name="stop (Thread)" url="html/ref_c_thread.html#Thread.stop"/>
+<entry name="stop? (Thread)" url="html/ref_c_thread.html#Thread.stop_qm"/>
+<entry name="storbinary (Net::FTP)" url="html/lib_network.html#Net::FTP.storbinary"/>
+<entry name="store (Hash)" url="html/ref_c_hash.html#Hash.store"/>
+<entry name="storlines (Net::FTP)" url="html/lib_network.html#Net::FTP.storlines"/>
+<entry name="strftime (Time)" url="html/ref_c_time.html#Time.strftime"/>
+<entry name="String" url="html/ref_c_string.html"/>
+<entry name="String (Kernel)" url="html/ref_m_kernel.html#Kernel.String"/>
+<entry name="string (MatchData)" url="html/ref_c_matchdata.html#MatchData.string"/>
+<entry name="Strings (language)" url="html/language.html#UD"/>
+<entry name="Strings (stdtypes)" url="html/tut_stdtypes.html#S2"/>
+<entry name="strip (String)" url="html/ref_c_string.html#String.strip"/>
+<entry name="strip! (String)" url="html/ref_c_string.html#String.strip_oh"/>
+<entry name="Struct" url="html/ref_c_struct.html"/>
+<entry name="sub (Kernel)" url="html/ref_m_kernel.html#Kernel.sub"/>
+<entry name="sub (String)" url="html/ref_c_string.html#String.sub"/>
+<entry name="sub! (Kernel)" url="html/ref_m_kernel.html#Kernel.sub_oh"/>
+<entry name="sub! (String)" url="html/ref_c_string.html#String.sub_oh"/>
+<entry name="Substitutions (language)" url="html/language.html#UM"/>
+<entry name="succ (Date)" url="html/lib_standard.html#Date.succ"/>
+<entry name="succ (Integer)" url="html/ref_c_integer.html#Integer.succ"/>
+<entry name="succ (String)" url="html/ref_c_string.html#String.succ"/>
+<entry name="succ! (String)" url="html/ref_c_string.html#String.succ_oh"/>
+<entry name="sum (String)" url="html/ref_c_string.html#String.sum"/>
+<entry name="superclass (Class)" url="html/ref_c_class.html#Class.superclass"/>
+<entry name="Support" url="html/support.html"/>
+<entry name="swapcase (String)" url="html/ref_c_string.html#String.swapcase"/>
+<entry name="swapcase! (String)" url="html/ref_c_string.html#String.swapcase_oh"/>
+<entry name="Symbol" url="html/ref_c_symbol.html"/>
+<entry name="Symbols (language)" url="html/language.html#UI"/>
+<entry name="symlink (File)" url="html/ref_c_file.html#File.symlink"/>
+<entry name="symlink? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.symlink_qm"/>
+<entry name="symlink? (FileTest)" url="html/ref_m_filetest.html#FileTest.symlink_qm"/>
+<entry name="sync (IO)" url="html/ref_c_io.html#IO.sync"/>
+<entry name="sync= (IO)" url="html/ref_c_io.html#IO.sync_eq"/>
+<entry name="synchronize (Mutex)" url="html/lib_standard.html#Mutex.synchronize"/>
+<entry name="syscall (Kernel)" url="html/ref_m_kernel.html#Kernel.syscall"/>
+<entry name="syscopy (File)" url="html/ref_c_file.html#File.syscopy"/>
+<entry name="sysread (IO)" url="html/ref_c_io.html#IO.sysread"/>
+<entry name="system (Kernel)" url="html/ref_m_kernel.html#Kernel.system"/>
+<entry name="System Hooks (ospace)" url="html/ospace.html#S4"/>
+<entry name="syswrite (IO)" url="html/ref_c_io.html#IO.syswrite"/>
+<entry name="taint (Object)" url="html/ref_c_object.html#Object.taint"/>
+<entry name="Tainted Objects (taint)" url="html/taint.html#S2"/>
+<entry name="tainted? (Object)" url="html/ref_c_object.html#Object.tainted_qm"/>
+<entry name="Talking to Networks (io)" url="html/tut_io.html#S4"/>
+<entry name="tan (Math)" url="html/ref_m_math.html#Math.tan"/>
+<entry name="tell (Dir)" url="html/ref_c_dir.html#Dir.tell"/>
+<entry name="tell (IO)" url="html/ref_c_io.html#IO.tell"/>
+<entry name="telnetmode (Net::Telnet)" url="html/lib_network.html#Net::Telnet.telnetmode"/>
+<entry name="telnetmode= (Net::Telnet)" url="html/lib_network.html#Net::Telnet.telnetmode_eq"/>
+<entry name="terminate (GetoptLong)" url="html/lib_standard.html#GetoptLong.terminate"/>
+<entry name="terminated? (GetoptLong)" url="html/lib_standard.html#GetoptLong.terminated_qm"/>
+<entry name="test (Kernel)" url="html/ref_m_kernel.html#Kernel.test"/>
+<entry name="thaw (Object)" url="html/ref_c_object.html#Object.thaw"/>
+<entry name="The Basic Types (language)" url="html/language.html#S2"/>
+<entry name="The Exception Class (exceptions)" url="html/tut_exceptions.html#S1"/>
+<entry name="The Frame Class (irb)" url="html/irb.html#UD"/>
+<entry name="The Mutex Class (threads)" url="html/tut_threads.html#UE"/>
+<entry name="The Ruby Language (language)" url="html/language.html"/>
+<entry name="The Visitor Pattern (patterns)" url="html/lib_patterns.html#S1"/>
+<entry name="Thread" url="html/ref_c_thread.html"/>
+<entry name="Thread Variables (threads)" url="html/tut_threads.html#UC"/>
+<entry name="ThreadGroup" url="html/ref_c_threadgroup.html"/>
+<entry name="Threads and Exceptions (threads)" url="html/tut_threads.html#UD"/>
+<entry name="Threads and Processes (threads)" url="html/tut_threads.html"/>
+<entry name="throw (Kernel)" url="html/ref_m_kernel.html#Kernel.throw"/>
+<entry name="Tidying Up (exceptions)" url="html/tut_exceptions.html#UA"/>
+<entry name="Time" url="html/ref_c_time.html"/>
+<entry name="times (Integer)" url="html/ref_c_integer.html#Integer.times"/>
+<entry name="times (Time)" url="html/ref_c_time.html#Time.times"/>
+<entry name="Tms" url="html/ref_c_struct__tms.html"/>
+<entry name="today (Date)" url="html/lib_standard.html#Date.today"/>
+<entry name="top (Net::POPMail)" url="html/lib_network.html#Net::POPMail.top"/>
+<entry name="Top-Level Execution Environment (classes)" url="html/classes.html#S3"/>
+<entry name="to_a (Array)" url="html/ref_c_array.html#Array.to_a"/>
+<entry name="to_a (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.to_a"/>
+<entry name="to_a (Hash)" url="html/ref_c_hash.html#Hash.to_a"/>
+<entry name="to_a (MatchData)" url="html/ref_c_matchdata.html#MatchData.to_a"/>
+<entry name="to_a (NilClass)" url="html/ref_c_nilclass.html#NilClass.to_a"/>
+<entry name="to_a (Object)" url="html/ref_c_object.html#Object.to_a"/>
+<entry name="to_a (Struct)" url="html/ref_c_struct.html#Struct.to_a"/>
+<entry name="to_a (Time)" url="html/ref_c_time.html#Time.to_a"/>
+<entry name="to_ary (Array)" url="html/ref_c_array.html#Array.to_ary"/>
+<entry name="to_f (Bignum)" url="html/ref_c_bignum.html#Bignum.to_f"/>
+<entry name="to_f (Complex)" url="html/lib_standard.html#Complex.to_f"/>
+<entry name="to_f (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.to_f"/>
+<entry name="to_f (Float)" url="html/ref_c_float.html#Float.to_f"/>
+<entry name="to_f (String)" url="html/ref_c_string.html#String.to_f"/>
+<entry name="to_f (Time)" url="html/ref_c_time.html#Time.to_f"/>
+<entry name="to_i (Bignum)" url="html/ref_c_bignum.html#Bignum.to_i"/>
+<entry name="to_i (Complex)" url="html/lib_standard.html#Complex.to_i"/>
+<entry name="to_i (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.to_i"/>
+<entry name="to_i (Float)" url="html/ref_c_float.html#Float.to_i"/>
+<entry name="to_i (IO)" url="html/ref_c_io.html#IO.to_i"/>
+<entry name="to_i (NilClass)" url="html/ref_c_nilclass.html#NilClass.to_i"/>
+<entry name="to_i (String)" url="html/ref_c_string.html#String.to_i"/>
+<entry name="to_i (Symbol)" url="html/ref_c_symbol.html#Symbol.to_i"/>
+<entry name="to_i (Time)" url="html/ref_c_time.html#Time.to_i"/>
+<entry name="to_io (IO)" url="html/ref_c_io.html#IO.to_io"/>
+<entry name="to_proc (Method)" url="html/ref_c_method.html#Method.to_proc"/>
+<entry name="to_r (Complex)" url="html/lib_standard.html#Complex.to_r"/>
+<entry name="to_s (Array)" url="html/ref_c_array.html#Array.to_s"/>
+<entry name="to_s (Bignum)" url="html/ref_c_bignum.html#Bignum.to_s"/>
+<entry name="to_s (Complex)" url="html/lib_standard.html#Complex.to_s"/>
+<entry name="to_s (Date)" url="html/lib_standard.html#Date.to_s"/>
+<entry name="to_s (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.to_s"/>
+<entry name="to_s (Float)" url="html/ref_c_float.html#Float.to_s"/>
+<entry name="to_s (Hash)" url="html/ref_c_hash.html#Hash.to_s"/>
+<entry name="to_s (MatchData)" url="html/ref_c_matchdata.html#MatchData.to_s"/>
+<entry name="to_s (NilClass)" url="html/ref_c_nilclass.html#NilClass.to_s"/>
+<entry name="to_s (Object)" url="html/ref_c_object.html#Object.to_s"/>
+<entry name="to_s (String)" url="html/ref_c_string.html#String.to_s"/>
+<entry name="to_s (Symbol)" url="html/ref_c_symbol.html#Symbol.to_s"/>
+<entry name="to_s (Time)" url="html/ref_c_time.html#Time.to_s"/>
+<entry name="to_str (String)" url="html/ref_c_string.html#String.to_str"/>
+<entry name="tr (String)" url="html/ref_c_string.html#String.tr"/>
+<entry name="tr! (String)" url="html/ref_c_string.html#String.tr_oh"/>
+<entry name="trace_var (Kernel)" url="html/ref_m_kernel.html#Kernel.trace_var"/>
+<entry name="Tracing Your Program's Execution (ospace)" url="html/ospace.html#S5"/>
+<entry name="transaction (PStore)" url="html/lib_standard.html#PStore.transaction"/>
+<entry name="Translating from Perl/Tk Documentation (tk)" url="html/ext_tk.html#S6"/>
+<entry name="trap (Kernel)" url="html/ref_m_kernel.html#Kernel.trap"/>
+<entry name="TrueClass" url="html/ref_c_trueclass.html"/>
+<entry name="truncate (File)" url="html/ref_c_file.html#File.truncate"/>
+<entry name="try_lock (Mutex)" url="html/lib_standard.html#Mutex.try_lock"/>
+<entry name="tr_s (String)" url="html/ref_c_string.html#String.tr_s"/>
+<entry name="tr_s! (String)" url="html/ref_c_string.html#String.tr_s_oh"/>
+<entry name="tty? (IO)" url="html/ref_c_io.html#IO.tty_qm"/>
+<entry name="tv_sec (Time)" url="html/ref_c_time.html#Time.tv_sec"/>
+<entry name="tv_usec (Time)" url="html/ref_c_time.html#Time.tv_usec"/>
+<entry name="type (Object)" url="html/ref_c_object.html#Object.type"/>
+<entry name="uid (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.uid"/>
+<entry name="uid (Process)" url="html/ref_m_process.html#Process.uid"/>
+<entry name="uid= (Process)" url="html/ref_m_process.html#Process.uid_eq"/>
+<entry name="uidl (Net::POPMail)" url="html/lib_network.html#Net::POPMail.uidl"/>
+<entry name="umask (File)" url="html/ref_c_file.html#File.umask"/>
+<entry name="undefine_finalizer (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace.undefine_finalizer"/>
+<entry name="undef_method (Module)" url="html/ref_c_module.html#Module.undef_method"/>
+<entry name="unescape (CGI)" url="html/lib_network.html#CGI.unescape"/>
+<entry name="unescapeElement (CGI)" url="html/lib_network.html#CGI.unescapeElement"/>
+<entry name="unescapeHTML (CGI)" url="html/lib_network.html#CGI.unescapeHTML"/>
+<entry name="ungetc (IO)" url="html/ref_c_io.html#IO.ungetc"/>
+<entry name="uniq (Array)" url="html/ref_c_array.html#Array.uniq"/>
+<entry name="uniq! (Array)" url="html/ref_c_array.html#Array.uniq_oh"/>
+<entry name="unlink (Dir)" url="html/ref_c_dir.html#Dir.unlink"/>
+<entry name="unlink (File)" url="html/ref_c_file.html#File.unlink"/>
+<entry name="unlock (Mutex)" url="html/lib_standard.html#Mutex.unlock"/>
+<entry name="unpack (String)" url="html/ref_c_string.html#String.unpack"/>
+<entry name="unshift (Array)" url="html/ref_c_array.html#Array.unshift"/>
+<entry name="untaint (Object)" url="html/ref_c_object.html#Object.untaint"/>
+<entry name="untrace_var (Kernel)" url="html/ref_m_kernel.html#Kernel.untrace_var"/>
+<entry name="upcase (String)" url="html/ref_c_string.html#String.upcase"/>
+<entry name="upcase! (String)" url="html/ref_c_string.html#String.upcase_oh"/>
+<entry name="update (CGI::Session)" url="html/lib_network.html#CGI::Session.update"/>
+<entry name="update (Hash)" url="html/ref_c_hash.html#Hash.update"/>
+<entry name="upto (Date)" url="html/lib_standard.html#Date.upto"/>
+<entry name="upto (Integer)" url="html/ref_c_integer.html#Integer.upto"/>
+<entry name="upto (String)" url="html/ref_c_string.html#String.upto"/>
+<entry name="Use the Profiler (trouble)" url="html/trouble.html#UC"/>
+<entry name="usec (Time)" url="html/ref_c_time.html#Time.usec"/>
+<entry name="Usenet Newsgroup (support)" url="html/support.html#S3"/>
+<entry name="Using cgi.rb (web)" url="html/web.html#UA"/>
+<entry name="Using eruby (web)" url="html/web.html#UG"/>
+<entry name="Using rdtool (rdtool)" url="html/rdtool.html#S5"/>
+<entry name="utc (Time)" url="html/ref_c_time.html#Time.utc"/>
+<entry name="utc? (Time)" url="html/ref_c_time.html#Time.utc_qm"/>
+<entry name="utime (File)" url="html/ref_c_file.html#File.utime"/>
+<entry name="value (Thread)" url="html/ref_c_thread.html#Thread.value"/>
+<entry name="VALUE as a Pointer (ruby)" url="html/ext_ruby.html#UA"/>
+<entry name="VALUE as an Immediate Object (ruby)" url="html/ext_ruby.html#UB"/>
+<entry name="value? (Hash)" url="html/ref_c_hash.html#Hash.value_qm"/>
+<entry name="values (Hash)" url="html/ref_c_hash.html#Hash.values"/>
+<entry name="values (Struct)" url="html/ref_c_struct.html#Struct.values"/>
+<entry name="Variable References (tk)" url="html/ext_tk.html#UH"/>
+<entry name="Variable Scope and Loops (expressions)" url="html/tut_expressions.html#S7"/>
+<entry name="Variable-Length Argument Lists (methods)" url="html/tut_methods.html#UA"/>
+<entry name="Variable/Method Ambiguity (language)" url="html/language.html#UO"/>
+<entry name="Variables (classes)" url="html/tut_classes.html#S5"/>
+<entry name="Variables and Constants (language)" url="html/language.html#S4"/>
+<entry name="VERSION (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.WIN32OLE::VERSION"/>
+<entry name="Virtual Attributes (classes)" url="html/tut_classes.html#UC"/>
+<entry name="wait (ConditionVariable)" url="html/lib_standard.html#ConditionVariable.wait"/>
+<entry name="wait (Process)" url="html/ref_m_process.html#Process.wait"/>
+<entry name="wait2 (Process)" url="html/ref_m_process.html#Process.wait2"/>
+<entry name="waitfor (Net::Telnet)" url="html/lib_network.html#Net::Telnet.waitfor"/>
+<entry name="waitpid (Process)" url="html/ref_m_process.html#Process.waitpid"/>
+<entry name="waitpid2 (Process)" url="html/ref_m_process.html#Process.waitpid2"/>
+<entry name="wakeup (Thread)" url="html/ref_c_thread.html#Thread.wakeup"/>
+<entry name="wday (Time)" url="html/ref_c_time.html#Time.wday"/>
+<entry name="weakref_alive? (WeakRef)" url="html/lib_standard.html#WeakRef.weakref_alive_qm"/>
+<entry name="Web Sites (support)" url="html/support.html#S1"/>
+<entry name="welcome (Net::FTP)" url="html/lib_network.html#Net::FTP.welcome"/>
+<entry name="What Is an IO Object? (io)" url="html/tut_io.html#S1"/>
+<entry name="What Kind of Language Is Ruby? (preface)" url="html/preface.html#S2"/>
+<entry name="When Trouble Strikes (trouble)" url="html/trouble.html"/>
+<entry name="Where Ruby Finds Its Modules (rubyworld)" url="html/rubyworld.html#S4"/>
+<entry name="Why Did We Write This Book? (preface)" url="html/preface.html#S4"/>
+<entry name="Widgets (tk)" url="html/ext_tk.html#S2"/>
+<entry name="Win32API (win32)" url="html/win32.html#S3"/>
+<entry name="Windows Automation (win32)" url="html/win32.html#S4"/>
+<entry name="WNOHANG (Process)" url="html/ref_m_process.html#Process.WNOHANG"/>
+<entry name="Working with Strings (stdtypes)" url="html/tut_stdtypes.html#UA"/>
+<entry name="Wrapping C Structures (ruby)" url="html/ext_ruby.html#UE"/>
+<entry name="Writable Attributes (classes)" url="html/tut_classes.html#UB"/>
+<entry name="writable? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.writable_qm"/>
+<entry name="writable? (FileTest)" url="html/ref_m_filetest.html#FileTest.writable_qm"/>
+<entry name="writable_real? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.writable_real_qm"/>
+<entry name="writable_real? (FileTest)" url="html/ref_m_filetest.html#FileTest.writable_real_qm"/>
+<entry name="write (IO)" url="html/ref_c_io.html#IO.write"/>
+<entry name="write (Net::Telnet)" url="html/lib_network.html#Net::Telnet.write"/>
+<entry name="Writing CGI Scripts (web)" url="html/web.html#S1"/>
+<entry name="Writing Ruby in C (ruby)" url="html/ext_ruby.html#S2"/>
+<entry name="Writing to Environment Variables (rubyworld)" url="html/rubyworld.html#UC"/>
+<entry name="Writing to Files (io)" url="html/tut_io.html#UB"/>
+<entry name="WUNTRACED (Process)" url="html/ref_m_process.html#Process.WUNTRACED"/>
+<entry name="xmp (irb)" url="html/irb.html#UC"/>
+<entry name="yday (Time)" url="html/ref_c_time.html#Time.yday"/>
+<entry name="year (Time)" url="html/ref_c_time.html#Time.year"/>
+<entry name="Your Basic, Everyday Object (classes)" url="html/classes.html#UA"/>
+<entry name="zero? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.zero_qm"/>
+<entry name="zero? (FileTest)" url="html/ref_m_filetest.html#FileTest.zero_qm"/>
+<entry name="zero? (Numeric)" url="html/ref_c_numeric.html#Numeric.zero_qm"/>
+<entry name="zone (Time)" url="html/ref_c_time.html#Time.zone"/>
+<entry name="[] (Array)" url="html/ref_c_array.html#Array._ob_cb"/>
+<entry name="[] (Bignum)" url="html/ref_c_bignum.html#Bignum._ob_cb"/>
+<entry name="[] (CGI)" url="html/lib_network.html#CGI._ob_cb"/>
+<entry name="[] (CGI::Session)" url="html/lib_network.html#CGI::Session._ob_cb"/>
+<entry name="[] (Dir)" url="html/ref_c_dir.html#Dir._ob_cb"/>
+<entry name="[] (Fixnum)" url="html/ref_c_fixnum.html#Fixnum._ob_cb"/>
+<entry name="[] (Hash)" url="html/ref_c_hash.html#Hash._ob_cb"/>
+<entry name="[] (MatchData)" url="html/ref_c_matchdata.html#MatchData._ob_cb"/>
+<entry name="[] (Method)" url="html/ref_c_method.html#Method._ob_cb"/>
+<entry name="[] (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse._ob_cb"/>
+<entry name="[] (Proc)" url="html/ref_c_proc.html#Proc._ob_cb"/>
+<entry name="[] (PStore)" url="html/lib_standard.html#PStore._ob_cb"/>
+<entry name="[] (String)" url="html/ref_c_string.html#String._ob_cb"/>
+<entry name="[] (Struct)" url="html/ref_c_struct.html#Struct._ob_cb"/>
+<entry name="[] (Thread)" url="html/ref_c_thread.html#Thread._ob_cb"/>
+<entry name="[] (WIN32OLE)" url="html/lib_windows.html#WIN32OLE._ob_cb"/>
+<entry name="[]= (Array)" url="html/ref_c_array.html#Array._ob_cb_eq"/>
+<entry name="[]= (CGI::Session)" url="html/lib_network.html#CGI::Session._ob_cb_eq"/>
+<entry name="[]= (Hash)" url="html/ref_c_hash.html#Hash._ob_cb_eq"/>
+<entry name="[]= (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse._ob_cb_eq"/>
+<entry name="[]= (PStore)" url="html/lib_standard.html#PStore._ob_cb_eq"/>
+<entry name="[]= (String)" url="html/ref_c_string.html#String._ob_cb_eq"/>
+<entry name="[]= (Struct)" url="html/ref_c_struct.html#Struct._ob_cb_eq"/>
+<entry name="[]= (Thread)" url="html/ref_c_thread.html#Thread._ob_cb_eq"/>
+<entry name="[]= (WIN32OLE)" url="html/lib_windows.html#WIN32OLE._ob_cb_eq"/>
+<entry name="^ (FalseClass)" url="html/ref_c_falseclass.html#FalseClass._up"/>
+<entry name="^ (NilClass)" url="html/ref_c_nilclass.html#NilClass._up"/>
+<entry name="^ (TrueClass)" url="html/ref_c_trueclass.html#TrueClass._up"/>
+<entry name="_id2ref (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace._id2ref"/>
+<entry name="__id__ (Object)" url="html/ref_c_object.html#Object.__id__"/>
+<entry name="__send__ (Object)" url="html/ref_c_object.html#Object.__send__"/>
+<entry name="` (backquote) (Kernel)" url="html/ref_m_kernel.html#Kernel._bq"/>
+<entry name="` (Kernel)" url="html/ref_m_kernel.html#Kernel._bq"/>
+<entry name="| (Array)" url="html/ref_c_array.html#Array._ba"/>
+<entry name="| (FalseClass)" url="html/ref_c_falseclass.html#FalseClass._ba"/>
+<entry name="| (NilClass)" url="html/ref_c_nilclass.html#NilClass._ba"/>
+<entry name="| (TrueClass)" url="html/ref_c_trueclass.html#TrueClass._ba"/>
+<entry name="~ (Regexp)" url="html/ref_c_regexp.html#Regexp._sd"/>
+<entry name="~ (String)" url="html/ref_c_string.html#String._sd"/>
+</index>
+</kdeveloptoc>
+
diff --git a/languages/ruby/doc/ruby_bugs.toc b/languages/ruby/doc/ruby_bugs.toc
new file mode 100644
index 00000000..8e70566d
--- /dev/null
+++ b/languages/ruby/doc/ruby_bugs.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Ruby bugs</title>
+<base href="http://www.rubyforge.org/"/>
+<tocsect1 name="Query" url="tracker/?atid=1698&amp;group_id=426&amp;func=browse">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/ruby/file_templates/Makefile.am b/languages/ruby/file_templates/Makefile.am
new file mode 100644
index 00000000..7b449085
--- /dev/null
+++ b/languages/ruby/file_templates/Makefile.am
@@ -0,0 +1,5 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = rb rhtml rxml rjs js css html.erb xml.builder js.rjs
+
+
+
diff --git a/languages/ruby/file_templates/css b/languages/ruby/file_templates/css
new file mode 100644
index 00000000..23b3f500
--- /dev/null
+++ b/languages/ruby/file_templates/css
@@ -0,0 +1,11 @@
+//
+// C++ Implementation: $MODULE$
+//
+// Description:
+//
+//
+// Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
diff --git a/languages/ruby/file_templates/html.erb b/languages/ruby/file_templates/html.erb
new file mode 100644
index 00000000..43b3830e
--- /dev/null
+++ b/languages/ruby/file_templates/html.erb
@@ -0,0 +1,4 @@
+<!-- Copyright (C) $YEAR$ by $AUTHOR$ -->
+<!-- <$EMAIL$> -->
+
+<!-- Copyright: See COPYING file that comes with this distribution -->
diff --git a/languages/ruby/file_templates/js b/languages/ruby/file_templates/js
new file mode 100644
index 00000000..23b3f500
--- /dev/null
+++ b/languages/ruby/file_templates/js
@@ -0,0 +1,11 @@
+//
+// C++ Implementation: $MODULE$
+//
+// Description:
+//
+//
+// Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
diff --git a/languages/ruby/file_templates/js.rjs b/languages/ruby/file_templates/js.rjs
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/js.rjs
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/file_templates/rb b/languages/ruby/file_templates/rb
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/rb
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/file_templates/rhtml b/languages/ruby/file_templates/rhtml
new file mode 100644
index 00000000..43b3830e
--- /dev/null
+++ b/languages/ruby/file_templates/rhtml
@@ -0,0 +1,4 @@
+<!-- Copyright (C) $YEAR$ by $AUTHOR$ -->
+<!-- <$EMAIL$> -->
+
+<!-- Copyright: See COPYING file that comes with this distribution -->
diff --git a/languages/ruby/file_templates/rjs b/languages/ruby/file_templates/rjs
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/rjs
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/file_templates/rxml b/languages/ruby/file_templates/rxml
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/rxml
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/file_templates/xml.builder b/languages/ruby/file_templates/xml.builder
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/xml.builder
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/kdevrubysupport.desktop b/languages/ruby/kdevrubysupport.desktop
new file mode 100644
index 00000000..f3e8f67d
--- /dev/null
+++ b/languages/ruby/kdevrubysupport.desktop
@@ -0,0 +1,84 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Ruby Support
+Comment[ca]=Suport per a Ruby
+Comment[da]=Ruby-understøttelse
+Comment[de]=Ruby-Unterstützung für KDevelop
+Comment[el]=ΥποστήÏιξη Ruby
+Comment[es]=Soporte para Ruby
+Comment[et]=Ruby toetus
+Comment[eu]=Ruby euskarria
+Comment[fa]=پشتیبانی رابی
+Comment[fr]=Prise en charge du langage Ruby
+Comment[ga]=Tacaíocht Ruby
+Comment[gl]=Soporte para Ruby
+Comment[hi]=रूबी समरà¥à¤¥à¤¨
+Comment[hu]=Ruby-támogatás
+Comment[is]=Ruby stuðningur
+Comment[it]=Supporto per Ruby
+Comment[ja]=Ruby サãƒãƒ¼ãƒˆ
+Comment[nds]=Ünnerstütten för Ruby
+Comment[ne]=रूबि समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor Ruby
+Comment[pl]=Obsługa: Ruby
+Comment[pt]=Suporte a Ruby
+Comment[pt_BR]=Suporte ao Ruby
+Comment[ru]=Поддержка Ñзыка Ruby
+Comment[sk]=Ruby podpora
+Comment[sl]=Podpora za Ruby
+Comment[sr]=Подршка за Ruby
+Comment[sr@Latn]=Podrška za Ruby
+Comment[sv]=Ruby-stöd
+Comment[ta]=à®°à¯à®ªà®¿ ஆதரவà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони Ruby
+Comment[tr]=Ruby DesteÄŸi
+Comment[zh_CN]=Ruby 支æŒ
+Comment[zh_TW]=Ruby 支æ´
+Name=KDevRubySupport
+Name[da]=KDevelop Ruby-understøttelse
+Name[de]=Unterstützung für Ruby (KDevelop)
+Name[hi]=के-डेव-रूबी-समरà¥à¤¥à¤¨
+Name[nds]=Ünnerstütten för Ruby (KDevelop)
+Name[pl]=KDevObsługaRuby
+Name[sk]=KDev Ruby podpora
+Name[sv]=KDevelop Ruby-stöd
+Name[ta]=கெடெவ௠ரà¯à®ªà®¿ ஆதரவà¯
+Name[zh_TW]=KDevelop Ruby 支æ´
+GenericName=Ruby Support
+GenericName[ca]=Suport per a Ruby
+GenericName[da]=Ruby-understøttelse
+GenericName[de]=Unterstützung für Ruby
+GenericName[el]=ΥποστήÏιξη Ruby
+GenericName[es]=Soporte para Ruby
+GenericName[et]=Ruby toetus
+GenericName[eu]=Ruby euskarria
+GenericName[fa]=پشتیبانی رابی
+GenericName[fr]=Prise en charge du langage Ruby
+GenericName[ga]=Tacaíocht Ruby
+GenericName[gl]=Soporte para Ruby
+GenericName[hi]=रूबी समरà¥à¤¥à¤¨
+GenericName[hu]=Ruby-támogatás
+GenericName[it]=Supporto a Ruby
+GenericName[ja]=Ruby サãƒãƒ¼ãƒˆ
+GenericName[nds]=Ünnerstütten för Ruby
+GenericName[ne]=रूबि समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor Ruby
+GenericName[pl]=Obsługa: Ruby
+GenericName[pt]=Suporte a Ruby
+GenericName[pt_BR]=Suporte ao Ruby
+GenericName[ru]=Поддержка Ñзыка Ruby
+GenericName[sk]=Ruby podpora
+GenericName[sl]=Podpora za Ruby
+GenericName[sr]=Подршка за Ruby
+GenericName[sr@Latn]=Podrška za Ruby
+GenericName[sv]=Ruby-stöd
+GenericName[ta]=à®°à¯à®ªà®¿ ஆதரவà¯
+GenericName[tg]=ÐÑ€Ó£ намудани забони Ruby
+GenericName[tr]=Ruby DesteÄŸi
+GenericName[zh_CN]=Ruby 支æŒ
+GenericName[zh_TW]=Ruby 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevrubysupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Ruby
diff --git a/languages/ruby/kdevrubysupport.rc b/languages/ruby/kdevrubysupport.rc
new file mode 100644
index 00000000..b9269aa2
--- /dev/null
+++ b/languages/ruby/kdevrubysupport.rc
@@ -0,0 +1,20 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevRubySupport" version="4">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_execute" />
+ <Action name="build_execute_test_function" />
+ <Action name="build_launch_browser" />
+ </Menu>
+ <Menu name="tools" >
+ <Action name="switch_to_controller" group="tools_language_operations" />
+ <Action name="switch_to_model" group="tools_language_operations" />
+ <Action name="switch_to_view" group="tools_language_operations" />
+ <Action name="switch_to_test" group="tools_language_operations" />
+ </Menu>
+</MenuBar>
+<ToolBar name="buildToolBar">
+ <Action name="build_execute" group="build_operations" />
+ <Action name="build_launch_browser" group="build_operations" />
+</ToolBar>
+</kpartgui>
diff --git a/languages/ruby/play_run.psd b/languages/ruby/play_run.psd
new file mode 100644
index 00000000..f5a8e301
--- /dev/null
+++ b/languages/ruby/play_run.psd
Binary files differ
diff --git a/languages/ruby/qtdesignerrubyintegration.cpp b/languages/ruby/qtdesignerrubyintegration.cpp
new file mode 100644
index 00000000..8a89d0d4
--- /dev/null
+++ b/languages/ruby/qtdesignerrubyintegration.cpp
@@ -0,0 +1,93 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@mksat.net *
+ * Portions Copyright (C) 2003 Roberto Raggi (roberto@kdevelop.org) *
+ * *
+ * 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. *
+ ***************************************************************************/
+#include "qtdesignerrubyintegration.h"
+
+#include <qpair.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/viewcursorinterface.h>
+
+#include <domutil.h>
+#include <kdevpartcontroller.h>
+#include <kdevcreatefile.h>
+#include <kdevlanguagesupport.h>
+
+#include "codemodel_utils.h"
+#include "implementationwidget.h"
+
+QtDesignerRubyIntegration::QtDesignerRubyIntegration(KDevLanguageSupport *part,
+ ImplementationWidget *impl)
+ :QtDesignerIntegration(part, impl, false, 0)
+{
+}
+
+void QtDesignerRubyIntegration::addFunctionToClass(KInterfaceDesigner::Function function, ClassDom klass)
+{
+ m_part->partController()->editDocument( KURL( klass->fileName() ) );
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( m_part->partController()->activePart() );
+ if( !editIface ){
+ /// @todo show messagebox
+// QDialog::accept();
+ return;
+ }
+
+ kdDebug() << "===============" << endl;
+
+ int line, column;
+ klass->getStartPosition( &line, &column );
+
+ // compute the insertion point
+ QPair<int,int> point;
+ point.first = line + 1;
+ point.second = column;
+
+ const FunctionList functionList = klass->functionList();
+ if (functionList.count() > 0)
+ {
+ int funEndLine, funEndColumn;
+ functionList.first()->getEndPosition(&funEndLine, &funEndColumn);
+ point.second = funEndColumn;
+ }
+
+ QString str = function.function;
+ str += "\n \n end\n\n";
+ str = " def " + str;
+
+ kdDebug() << "insert " << str << " into " << point.first << endl;
+
+ editIface->insertText(point.first, 0 /*pt.second*/, str );
+
+ KTextEditor::View *activeView = dynamic_cast<KTextEditor::View*>( m_part->partController()->activePart()->widget() );
+ if (activeView)
+ {
+ KTextEditor::ViewCursorInterface* cursor = dynamic_cast<KTextEditor::ViewCursorInterface*>(activeView );
+ if (cursor)
+ cursor->setCursorPositionReal(point.first, 4);
+ }
+}
+
+#include "qtdesignerrubyintegration.moc"
diff --git a/languages/ruby/qtdesignerrubyintegration.h b/languages/ruby/qtdesignerrubyintegration.h
new file mode 100644
index 00000000..3f539286
--- /dev/null
+++ b/languages/ruby/qtdesignerrubyintegration.h
@@ -0,0 +1,35 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@mksat.net *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifndef QTDESIGNERRUBYINTEGRATION_H
+#define QTDESIGNERRUBYINTEGRATION_H
+
+#include <qtdesignerintegration.h>
+
+class QtDesignerRubyIntegration : public QtDesignerIntegration
+{
+Q_OBJECT
+public:
+ QtDesignerRubyIntegration(KDevLanguageSupport *part, ImplementationWidget *impl);
+
+protected:
+ void addFunctionToClass(KInterfaceDesigner::Function function, ClassDom klass);
+};
+
+#endif
diff --git a/languages/ruby/ruby_config.png b/languages/ruby/ruby_config.png
new file mode 100644
index 00000000..bf8ac762
--- /dev/null
+++ b/languages/ruby/ruby_config.png
Binary files differ
diff --git a/languages/ruby/ruby_config.psd b/languages/ruby/ruby_config.psd
new file mode 100644
index 00000000..ebeff7dd
--- /dev/null
+++ b/languages/ruby/ruby_config.psd
Binary files differ
diff --git a/languages/ruby/ruby_run.png b/languages/ruby/ruby_run.png
new file mode 100644
index 00000000..fc4aa983
--- /dev/null
+++ b/languages/ruby/ruby_run.png
Binary files differ
diff --git a/languages/ruby/rubyconfigwidget.cpp b/languages/ruby/rubyconfigwidget.cpp
new file mode 100644
index 00000000..d0ffc5b4
--- /dev/null
+++ b/languages/ruby/rubyconfigwidget.cpp
@@ -0,0 +1,53 @@
+
+#include "rubyconfigwidget.h"
+#include "domutil.h"
+
+#include <stdlib.h>
+
+#include <klineedit.h>
+#include <qcheckbox.h>
+#include <qbuttongroup.h>
+#include <kurlrequester.h>
+#include <kurlcompletion.h>
+#include <kdebug.h>
+
+RubyConfigWidget::RubyConfigWidget(QDomDocument &projectDom, QWidget* parent, const char* name)
+: RubyConfigWidgetBase(parent,name), dom (projectDom) {
+ kdDebug (9019) << "Creating RubyConfigWidget" << endl;
+ interpreterEdit->setText(DomUtil::readEntry(dom, "/kdevrubysupport/run/interpreter"));
+ if (interpreterEdit->text().isEmpty()) {
+ interpreterEdit->setText("ruby");
+ }
+ shellEdit->setText(DomUtil::readEntry(dom, "/kdevrubysupport/run/shell"));
+ if (shellEdit->text().isEmpty()) {
+ shellEdit->setText("irb");
+ }
+ mainProgramEdit->setText(DomUtil::readEntry(dom, "/kdevrubysupport/run/mainprogram"));
+ programArgsEdit->setText(DomUtil::readEntry(dom, "/kdevrubysupport/run/programargs"));
+ runRadioBox->setButton(DomUtil::readIntEntry(dom, "/kdevrubysupport/run/runmainprogram"));
+ terminalCheckbox->setChecked(DomUtil::readBoolEntry(dom, "/kdevrubysupport/run/terminal"));
+ characterCodingRadioBox->setButton(DomUtil::readIntEntry(dom, "/kdevrubysupport/run/charactercoding"));
+ enableFloatingToolBarBox->setChecked( DomUtil::readBoolEntry(dom, "/kdevrbdebugger/general/floatingtoolbar", false));
+ showConstants->setChecked( DomUtil::readBoolEntry(dom, "/kdevrbdebugger/general/showconstants", false));
+ traceIntoRuby->setChecked( DomUtil::readBoolEntry(dom, "/kdevrbdebugger/general/traceintoruby", false));
+ workingDir->completionObject()->setMode(KURLCompletion::DirCompletion);
+ workingDir->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
+ workingDir->setURL(DomUtil::readEntry(dom, "/kdevscriptproject/run/globalcwd", "") );
+}
+
+void RubyConfigWidget::accept() {
+ DomUtil::writeEntry(dom, "/kdevrubysupport/run/interpreter", interpreterEdit->text());
+ DomUtil::writeEntry(dom, "/kdevrubysupport/run/shell", shellEdit->text());
+ DomUtil::writeEntry(dom, "/kdevrubysupport/run/mainprogram", mainProgramEdit->text());
+ DomUtil::writeEntry(dom, "/kdevrubysupport/run/programargs", programArgsEdit->text());
+ DomUtil::writeIntEntry(dom, "/kdevrubysupport/run/runmainprogram", runRadioBox->selectedId());
+ DomUtil::writeBoolEntry(dom, "/kdevrubysupport/run/terminal", terminalCheckbox->isChecked());
+ DomUtil::writeIntEntry(dom, "/kdevrubysupport/run/charactercoding", characterCodingRadioBox->selectedId());
+ DomUtil::writeBoolEntry(dom, "/kdevrbdebugger/general/floatingtoolbar", enableFloatingToolBarBox->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevrbdebugger/general/showconstants", showConstants->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevrbdebugger/general/traceintoruby", traceIntoRuby->isChecked());
+ DomUtil::writeEntry(dom, "/kdevscriptproject/run/globalcwd", workingDir->url() );
+}
+
+#include "rubyconfigwidget.moc"
+
diff --git a/languages/ruby/rubyconfigwidget.h b/languages/ruby/rubyconfigwidget.h
new file mode 100644
index 00000000..a4efa6f9
--- /dev/null
+++ b/languages/ruby/rubyconfigwidget.h
@@ -0,0 +1,27 @@
+
+#ifndef RUBYCONFIGWIDGET_H
+#define RUBYCONFIGWIDGET_H
+
+#include "rubyconfigwidgetbase.h"
+
+class QDomDocument;
+
+class RubyConfigWidget : public RubyConfigWidgetBase
+{
+ Q_OBJECT
+public:
+ RubyConfigWidget(QDomDocument &projectDom, QWidget* parent = 0, const char* name = 0);
+
+public slots:
+ void accept();
+
+protected:
+
+protected slots:
+
+private:
+ QDomDocument &dom;
+};
+
+#endif
+
diff --git a/languages/ruby/rubyconfigwidgetbase.ui b/languages/ruby/rubyconfigwidgetbase.ui
new file mode 100644
index 00000000..64ae3e1c
--- /dev/null
+++ b/languages/ruby/rubyconfigwidgetbase.ui
@@ -0,0 +1,363 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>RubyConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>RubyConfigWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>485</width>
+ <height>582</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>programArgsEdit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>mainProgramEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Ru&amp;by shell:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mainProgramEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the path (or just name, if in $PATH) to the Ruby shell. Defaults to "irb". Add this line to your .irbrc file:
+def cd(dir) Dir.chdir dir end</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>interpreterEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1_2_3_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Program &amp;arguments:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>programArgsEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>These are the arguments passed to the Ruby interpreter</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Ruby interpreter:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>interpreterEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the path (or just name, if in $PATH) to the Ruby interpreter. Defaults to "ruby"</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1_2_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Main program:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>programArgsEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the name of the main program source file</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>shellEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Working Directory:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="4" column="1">
+ <property name="name">
+ <cstring>workingDir</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>runRadioBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Run</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>mainProgramRadio</cstring>
+ </property>
+ <property name="text">
+ <string>Main pr&amp;ogram</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>selectedWindowRadio</cstring>
+ </property>
+ <property name="text">
+ <string>Selected wi&amp;ndow</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>terminalCheckbox</cstring>
+ </property>
+ <property name="text">
+ <string>R&amp;un applications in terminal</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this if you want your applications to be opened in terminal window.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>enableFloatingToolBarBox</cstring>
+ </property>
+ <property name="text">
+ <string>Enable &amp;debugger floating toolbar</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this if you want to control the debugger via a floating toolbar.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>showConstants</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;constants in the debugger</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this if you want the debugger to show constants (with many constants this may be slow).</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>traceIntoRuby</cstring>
+ </property>
+ <property name="text">
+ <string>Trace &amp;into Ruby libraries</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Trace through the Ruby code installed under sitedir in the debugger</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>characterCodingRadioBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Character Coding</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>asciiOption</cstring>
+ </property>
+ <property name="text">
+ <string>ASCII</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>eucOption</cstring>
+ </property>
+ <property name="text">
+ <string>EUC</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>sjisOption</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;JIS</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>utf8Option</cstring>
+ </property>
+ <property name="text">
+ <string>UTF-&amp;8</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>3</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>interpreterEdit</tabstop>
+ <tabstop>shellEdit</tabstop>
+ <tabstop>mainProgramEdit</tabstop>
+ <tabstop>programArgsEdit</tabstop>
+ <tabstop>mainProgramRadio</tabstop>
+ <tabstop>selectedWindowRadio</tabstop>
+ <tabstop>terminalCheckbox</tabstop>
+ <tabstop>enableFloatingToolBarBox</tabstop>
+ <tabstop>showConstants</tabstop>
+ <tabstop>traceIntoRuby</tabstop>
+ <tabstop>asciiOption</tabstop>
+ <tabstop>eucOption</tabstop>
+ <tabstop>sjisOption</tabstop>
+ <tabstop>utf8Option</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/ruby/rubyimplementationwidget.cpp b/languages/ruby/rubyimplementationwidget.cpp
new file mode 100644
index 00000000..b035a283
--- /dev/null
+++ b/languages/ruby/rubyimplementationwidget.cpp
@@ -0,0 +1,70 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * 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. *
+ ***************************************************************************/
+#include "rubyimplementationwidget.h"
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include <filetemplate.h>
+#include <kdevlanguagesupport.h>
+#include <kdevproject.h>
+
+RubyImplementationWidget::RubyImplementationWidget(KDevLanguageSupport* part,
+ QWidget* parent, const char* name, bool modal)
+ :ImplementationWidget(part, parent, name, modal)
+{
+}
+
+QStringList RubyImplementationWidget::createClassFiles()
+{
+ QString template_rb = "require '$BASEFILENAME$'\n\nclass $CLASSNAME$ < $BASECLASSNAME$\n\n def initialize(*k)\n super(*k)\n end\n\nend\n";
+
+ QFileInfo formInfo(m_formName);
+ template_rb.replace(QRegExp("\\$BASEFILENAME\\$"), formInfo.baseName()+".rb");
+ template_rb.replace(QRegExp("\\$CLASSNAME\\$"), classNameEdit->text());
+ template_rb.replace(QRegExp("\\$BASECLASSNAME\\$"), m_baseClassName);
+
+ template_rb = FileTemplate::read(m_part, "rb") + template_rb;
+
+ QString file_rb = fileNameEdit->text() + ".rb";
+ if (!m_part->project()->activeDirectory().isEmpty())
+ file_rb = m_part->project()->activeDirectory() + "/" + file_rb;
+ QFile file(QDir::cleanDirPath(m_part->project()->projectDirectory() + "/" + file_rb));
+ if (!file.open(IO_WriteOnly)) {
+ KMessageBox::error(0, i18n("Cannot write to file"));
+ return QStringList();
+ }
+ QTextStream stream(&file);
+ stream << template_rb;
+ file.close();
+
+ QStringList files;
+ files.append(file_rb);
+ return files;
+}
+
+#include "rubyimplementationwidget.moc"
diff --git a/languages/ruby/rubyimplementationwidget.h b/languages/ruby/rubyimplementationwidget.h
new file mode 100644
index 00000000..5f79741e
--- /dev/null
+++ b/languages/ruby/rubyimplementationwidget.h
@@ -0,0 +1,35 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifndef RUBYIMPLEMENTATIONWIDGET_H
+#define RUBYIMPLEMENTATIONWIDGET_H
+
+#include <implementationwidget.h>
+
+class RubyImplementationWidget : public ImplementationWidget {
+Q_OBJECT
+public:
+ RubyImplementationWidget(KDevLanguageSupport* part, QWidget* parent = 0,
+ const char* name = 0, bool modal = true);
+
+ virtual QStringList createClassFiles();
+
+};
+
+#endif
diff --git a/languages/ruby/rubysupport_part.cpp b/languages/ruby/rubysupport_part.cpp
new file mode 100644
index 00000000..c116c05d
--- /dev/null
+++ b/languages/ruby/rubysupport_part.cpp
@@ -0,0 +1,908 @@
+#include "rubysupport_part.h"
+#include "rubyconfigwidget.h"
+#include "domutil.h"
+
+#include "qtdesignerrubyintegration.h"
+#include "rubyimplementationwidget.h"
+
+#include "kdevcore.h"
+#include "kdevmainwindow.h"
+#include "kdevlanguagesupport.h"
+#include "kdevpartcontroller.h"
+#include "kdevproject.h"
+#include "kdevappfrontend.h"
+#include "kdevplugininfo.h"
+#include "kdevshellwidget.h"
+#include "kdevquickopen.h"
+
+#include <qdir.h>
+#include <qwhatsthis.h>
+#include <qtimer.h>
+#include <qfileinfo.h>
+#include <qpopupmenu.h>
+#include <qregexp.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kdevgenericfactory.h>
+#include <kprocess.h>
+#include <kdebug.h>
+#include <kaction.h>
+#include <kparts/part.h>
+#include <kdialogbase.h>
+#include <kapplication.h>
+#include <klibloader.h>
+
+#include <ktexteditor/viewcursorinterface.h>
+
+#include <codemodel_utils.h>
+
+typedef KDevGenericFactory<RubySupportPart> RubySupportFactory;
+static const KDevPluginInfo data("kdevrubysupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevrubysupport, RubySupportFactory( data ) )
+
+RubySupportPart::RubySupportPart(QObject *parent, const char *name, const QStringList& )
+ : KDevLanguageSupport (&data, parent, name ? name : "RubySupportPart" )
+{
+ setInstance(RubySupportFactory::instance());
+ setXMLFile("kdevrubysupport.rc");
+
+ KAction *action;
+ action = new KAction( i18n("&Run"), "exec", SHIFT + Key_F9,
+ this, SLOT(slotRun()),
+ actionCollection(), "build_execute" );
+ action->setToolTip(i18n("Run"));
+ action->setWhatsThis(i18n("<b>Run</b><p>Starts an application."));
+ action->setIcon("ruby_run.png");
+
+ action = new KAction( i18n("Run Test Under Cursor"), "exec", ALT + Key_F9,
+ this, SLOT(slotRunTestUnderCursor()),
+ actionCollection(), "build_execute_test_function" );
+ action->setToolTip(i18n("Run Test Under Cursor"));
+ action->setWhatsThis(i18n("<b>Run Test Under Cursor</b><p>Runs the function under the cursor as test."));
+
+ action = new KAction( i18n("Launch Browser"), "network", 0, this, SLOT(slotBrowse()), actionCollection(), "build_launch_browser" );
+ action->setToolTip(i18n("Launch Browser"));
+ action->setWhatsThis(i18n("<b>Launch Browser</b><p>Opens a web browser pointing to the Ruby Rails server") );
+
+ action = new KAction( i18n("Switch To Controller"), 0, CTRL+ALT+Key_1, this, SLOT(slotSwitchToController()), actionCollection(), "switch_to_controller" );
+ action = new KAction( i18n("Switch To Model"), 0, CTRL+ALT+Key_2, this, SLOT(slotSwitchToModel()), actionCollection(), "switch_to_model" );
+ action = new KAction( i18n("Switch To View"), 0, CTRL+ALT+Key_3, this, SLOT(slotSwitchToView()), actionCollection(), "switch_to_view" );
+ action = new KAction( i18n("Switch To Test"), 0, CTRL+ALT+Key_4, this, SLOT(slotSwitchToTest()), actionCollection(), "switch_to_test" );
+
+ kdDebug() << "Creating RubySupportPart" << endl;
+
+ m_shellWidget = new KDevShellWidget( 0, "irb console");
+ m_shellWidget->setIcon( SmallIcon("ruby_config.png", KIcon::SizeMedium, KIcon::DefaultState, RubySupportPart::instance()));
+ m_shellWidget->setCaption(i18n("Ruby Shell"));
+ mainWindow()->embedOutputView( m_shellWidget, i18n("Ruby Shell"), i18n("Ruby Shell"));
+ mainWindow()->raiseView( m_shellWidget );
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+ connect( core(), SIGNAL(projectConfigWidget(KDialogBase*)),
+ this, SLOT(projectConfigWidget(KDialogBase*)) );
+}
+
+
+RubySupportPart::~RubySupportPart()
+{
+ if ( m_shellWidget )
+ mainWindow()->removeView( m_shellWidget );
+ delete m_shellWidget;
+}
+
+
+void RubySupportPart::projectConfigWidget(KDialogBase *dlg)
+{
+ QVBox *vbox = dlg->addVBoxPage(i18n("Ruby"), i18n("Ruby"), BarIcon("ruby_config.png", KIcon::SizeMedium, KIcon::DefaultState, RubySupportPart::instance()));
+ RubyConfigWidget *w = new RubyConfigWidget(*projectDom(), (QWidget *)vbox, "ruby config widget");
+ connect( dlg, SIGNAL(okClicked()), w, SLOT(accept()) );
+}
+
+void RubySupportPart::projectOpened()
+{
+ kdDebug() << "projectOpened()" << endl;
+
+ QStrList l;
+ l.append( shell().latin1() ) ;
+ m_shellWidget->setShell( shell().latin1(), l );
+ m_shellWidget->activate();
+ m_shellWidget->setAutoReactivateOnClose( true );
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ QFileInfo program(mainProgram());
+
+ // If it's a Rails project, create the project files if they're missing
+ if (mainProgram().endsWith("script/server")) {
+ QString cmd;
+ QFileInfo server(project()->projectDirectory() + "/script/server");
+ if (! server.exists()) {
+ cmd += "rails " + project()->projectDirectory();
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(project()->projectDirectory(), cmd, false);
+ }
+ }
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(0, this, SLOT(initialParse()));
+}
+
+void RubySupportPart::maybeParse(const QString fileName)
+{
+ QFileInfo fi(fileName);
+
+ if (fi.extension() == "rb") {
+ if (codeModel()->hasFile(fileName)) {
+ emit aboutToRemoveSourceInfo(fileName);
+ codeModel()->removeFile(codeModel()->fileByName(fileName));
+ }
+
+ parse(fileName);
+ emit addedSourceInfo( fileName );
+ }
+}
+
+void RubySupportPart::initialParse()
+{
+ kdDebug() << "initialParse()" << endl;
+
+ if (project()) {
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it) {
+ kdDebug() << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+ maybeParse(project()->projectDirectory() + "/" + *it);
+ }
+
+ emit updatedSourceInfo();
+ kapp->restoreOverrideCursor();
+ } else {
+ kdDebug() << "No project" << endl;
+ }
+}
+
+void RubySupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug() << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ maybeParse( fileName );
+ }
+}
+
+void RubySupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug() << "removedFilesFromProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+
+ if( codeModel()->hasFile(fileName) ){
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+ }
+}
+
+void RubySupportPart::savedFile(const KURL &fileName)
+{
+ kdDebug() << "savedFile()" << endl;
+
+ if (project()->allFiles().contains(fileName.path().mid ( project()->projectDirectory().length() + 1 ))) {
+ maybeParse(fileName.path());
+ emit addedSourceInfo( fileName.path() );
+ }
+}
+
+KDevLanguageSupport::Features RubySupportPart::features()
+{
+ return Features(Classes | Functions | Variables | Declarations | Signals | Slots);
+}
+
+void RubySupportPart::parse(const QString &fileName)
+{
+ QFile f(QFile::encodeName(fileName));
+ if (!f.open(IO_ReadOnly))
+ return;
+ QTextStream stream(&f);
+
+ QRegExp classre("^\\s*(class|module)\\s+([A-Z][A-Za-z0-9_]+::)*([A-Z][A-Za-z0-9_]+)\\s*(<\\s*([A-Z][A-Za-z0-9_:]+))?$");
+ QRegExp methodre("^(\\s*)def\\s+(([A-Z][A-Za-z0-9_:]+|self)\\.)?([A-Za-z0-9_]+[!?=]?|\\[\\]=?|\\*\\*||\\-|[!~+*/%&|><^]|>>|<<||<=>|<=|>=|==|===|!=|=~|!~).*$");
+ QRegExp accessre("^\\s*(private|protected|public)\\s*((:([A-Za-z0-9_]+[!?=]?|\\[\\]=?|\\*\\*||\\-|[!~+*/%&|><^]|>>|<<||<=>|<=|>=|==|===|!=|=~|!~),?\\s*)*)$");
+ QRegExp attr_accessorre("^\\s*(attr_accessor|attr_reader|attr_writer)\\s*((:([A-Za-z0-9_]+),?\\s*)*)$");
+ QRegExp symbolre(":([^,]+),?");
+ QRegExp line_contre(",\\s*$");
+ QRegExp slot_signalre("^\\s*(slots|signals|k_dcop|k_dcop_signals)\\s*(('[^)]+\\)',?\\s*)*)$");
+ QRegExp memberre("'([A-Za-z0-9_ &*]+\\s)?([A-Za-z0-9_]+)\\([^)]*\\)',?");
+ QRegExp begin_commentre("^*=begin");
+ QRegExp end_commentre("^*=end");
+ QRegExp variablere("(@@?[A-Za-z0-9_]+)\\s*=\\s*((?:([A-Za-z0-9_:.]+)\\.new)|[\\[\"'%:/\\?\\{]|%r|<<|true|false|^\\?|0[0-7]+|[-+]?0b[01]+|[-+]?0x[1-9a-fA-F]+|[-+]?[0-9_\\.e]+|nil)?");
+ QRegExp endre("^(\\s*)end\\s*$");
+
+ FileDom m_file = codeModel()->create<FileModel>();
+ m_file->setName(fileName);
+
+ ClassDom lastClass;
+ FunctionDom lastMethod;
+ QString lastMethodIndentation;
+ int lastAccess = CodeModelItem::Public;
+ QString rawline;
+ QCString line;
+ int lineNo = 0;
+
+ while (!stream.atEnd()) {
+ rawline = stream.readLine();
+ line = rawline.stripWhiteSpace().local8Bit();
+ if (classre.search(line) != -1) {
+ if (m_file->hasClass(classre.cap(3))) {
+ lastClass = m_file->classByName( classre.cap(3) )[ 0 ];
+ } else {
+ lastClass = codeModel()->create<ClassModel>();
+ lastClass->setName(classre.cap(3));
+ lastClass->setFileName( fileName );
+ lastClass->setStartPosition( lineNo, 0 );
+ m_file->addClass( lastClass );
+ }
+
+ QString parent = classre.cap(5);
+ if (!parent.isEmpty())
+ {
+ kdDebug() << "Add parent " << parent << endl;
+ lastClass->addBaseClass( parent );
+ }
+
+ lastAccess = CodeModelItem::Public;
+ } else if (methodre.search(line) != -1) {
+ FunctionDom methodDecl;
+ if ( lastClass != 0 && lastClass->hasFunction( methodre.cap(4) ) ) {
+ FunctionList methods = lastClass->functionByName( methodre.cap(4) );
+ methodDecl = methods[0];
+ } else {
+ methodDecl = codeModel()->create<FunctionModel>();
+ methodDecl->setFileName( fileName );
+ methodDecl->setStartPosition( lineNo, 0 );
+ methodDecl->setName(methodre.cap(4));
+ }
+ FunctionDefinitionDom method = codeModel()->create<FunctionDefinitionModel>();
+ method->setName(methodre.cap(4));
+ kdDebug() << "Add method: " << method->name() << endl;
+ method->setFileName( fileName );
+ method->setStartPosition( lineNo, 0 );
+ if (methodDecl->name() == "initialize") {
+ // Ruby constructors are alway private
+ methodDecl->setAccess( CodeModelItem::Private );
+ } else {
+ methodDecl->setAccess( lastAccess );
+ }
+ if (methodre.cap(2) != "") {
+ // A ruby class/singleton method of the form <classname>.<methodname>
+ methodDecl->setStatic( true );
+ }
+
+ lastMethodIndentation = methodre.cap(1);
+
+ lastMethod = method;
+
+ if (lastClass != 0) {
+ QStringList scope( lastClass->name() );
+ method->setScope( scope );
+ methodDecl->setScope( scope );
+ if( !lastClass->hasFunction(methodDecl->name()) ) {
+ lastClass->addFunction( methodDecl );
+ }
+ if( !lastClass->hasFunctionDefinition(method->name()) ) {
+ lastClass->addFunctionDefinition( method );
+ }
+ } else if( !m_file->hasFunctionDefinition(method->name()) ){
+ m_file->addFunction( methodDecl );
+ m_file->addFunctionDefinition( method );
+ lastClass = 0;
+ }
+ } else if (endre.search(line) != -1 && lastMethod != 0 && endre.cap(1) == lastMethodIndentation ) {
+ int endCol, endLine;
+ lastMethod->getEndPosition(&endCol, &endLine);
+ if (endLine == 0) {
+ //hack to set end position of the previous method to the line
+ //where its corresponding "end" is found
+ //there's an assumption that method's "def" statement will have the same
+ //indentation level as method's "end"
+ lastMethod->setEndPosition(lineNo, 0);
+ }
+ }
+ else if (accessre.search(line) != -1 && lastClass != 0) {
+ int currentAccess = lastAccess;
+ if (accessre.cap(1) == "public") {
+ currentAccess = CodeModelItem::Public;
+ } else if (accessre.cap(1) == "protected") {
+ currentAccess = CodeModelItem::Protected;
+ } else if (accessre.cap(1) == "private") {
+ currentAccess = CodeModelItem::Private;
+ }
+
+ if (accessre.cap(2) == "") {
+ lastAccess = currentAccess;
+ } else {
+ QString symbolList( accessre.cap(2) );
+ int pos = 0;
+
+ while ( pos >= 0 ) {
+ pos = symbolre.search( symbolList, pos );
+ if (pos == -1) {
+ if (line_contre.search(line) != -1) {
+ rawline = stream.readLine();
+ if (!stream.atEnd()) {
+ line = rawline.stripWhiteSpace().local8Bit();
+ ++lineNo;
+ symbolList = line;
+ pos = 0;
+ }
+ }
+ } else {
+ if ( lastClass->hasFunction( symbolre.cap(1) ) ) {
+ FunctionList methods = lastClass->functionByName( symbolre.cap(1) );
+ methods[0]->setAccess( currentAccess );
+ }
+ pos += symbolre.matchedLength();
+ }
+ }
+ }
+ } else if (slot_signalre.search(line) != -1 && lastClass != 0) {
+ QString memberList( slot_signalre.cap(2) );
+ int pos = 0;
+
+ while ( pos >= 0 ) {
+ pos = memberre.search( memberList, pos );
+ if (pos == -1) {
+ if (line_contre.search(line) != -1) {
+ rawline = stream.readLine();
+ if (!stream.atEnd()) {
+ line = rawline.stripWhiteSpace().local8Bit();
+ ++lineNo;
+ memberList = line;
+ pos = 0;
+ }
+ }
+ } else {
+ FunctionDom method;
+ if ( lastClass->hasFunction( memberre.cap(2) ) ) {
+ FunctionList methods = lastClass->functionByName( memberre.cap(2) );
+ method = methods[0];
+ } else {
+ method = codeModel()->create<FunctionModel>();
+ }
+ QStringList scope( lastClass->name() );
+ method->setScope( scope );
+ method->setName(memberre.cap(2));
+ method->setFileName( fileName );
+ method->setStartPosition( lineNo, 0 );
+
+ if (slot_signalre.cap(1) == "slots" || slot_signalre.cap(1) == "k_dcop") {
+ method->setSlot( true );
+ } else {
+ method->setSignal( true );
+ }
+ if ( !lastClass->hasFunction(method->name()) ) {
+ lastClass->addFunction( method );
+ }
+ pos += memberre.matchedLength();
+ }
+ }
+ } else if (attr_accessorre.search(line) != -1 && lastClass != 0) {
+ QString attr( attr_accessorre.cap(1) );
+ QString symbolList( attr_accessorre.cap(2) );
+ int pos = 0;
+
+ while ( pos >= 0 ) {
+ pos = symbolre.search( symbolList, pos );
+ if (pos == -1) {
+ if (line_contre.search(line) != -1) {
+ rawline = stream.readLine();
+ if (!stream.atEnd()) {
+ line = rawline.stripWhiteSpace().local8Bit();
+ ++lineNo;
+ symbolList = line;
+ pos = 0;
+ }
+ }
+ } else {
+ QStringList scope( lastClass->name() );
+ if ( !lastClass->hasFunction(symbolre.cap(1))
+ && (attr == "attr_accessor" || attr == "attr_reader") )
+ {
+ FunctionDefinitionDom method = codeModel()->create<FunctionDefinitionModel>();
+ method->setName(symbolre.cap(1));
+ kdDebug() << "Add method: " << method->name() << endl;
+ method->setFileName( fileName );
+ method->setStartPosition( lineNo, 0 );
+ method->setScope(scope);
+ lastClass->addFunction( model_cast<FunctionDom>(method) );
+ lastClass->addFunctionDefinition( method );
+ }
+
+ if ( !lastClass->hasFunction(symbolre.cap(1) + "=")
+ && (attr == "attr_accessor" || attr == "attr_writer") )
+ {
+ FunctionDefinitionDom method = codeModel()->create<FunctionDefinitionModel>();
+ method->setName(symbolre.cap(1) + "=");
+ kdDebug() << "Add method: " << method->name() << endl;
+ method->setFileName( fileName );
+ method->setStartPosition( lineNo, 0 );
+ method->setScope(scope);
+ lastClass->addFunction( model_cast<FunctionDom>(method) );
+ lastClass->addFunctionDefinition( method );
+ }
+
+ pos += symbolre.matchedLength();
+ }
+ }
+ } else if (variablere.search(line) != -1 && lastClass != 0) {
+ VariableDom attr;
+ if ( lastClass->hasVariable( variablere.cap(1) ) ) {
+ attr = lastClass->variableByName( variablere.cap(1) );
+ } else {
+ attr = codeModel()->create<VariableModel>();
+ attr->setName( variablere.cap(1) );
+ attr->setFileName( fileName );
+ attr->setStartPosition( lineNo, 0 );
+ attr->setAccess( CodeModelItem::Private );
+ if (QRegExp("^@@").search(attr->name()) != -1) {
+ attr->setStatic( true );
+ }
+ lastClass->addVariable( attr );
+ }
+
+ // Give priority to any variable initialized in the constructor
+ // Otherwise, take the first one found in the source file
+ if (lastMethod != 0 && lastMethod->name() == "initialize") {
+ attr->setFileName( fileName );
+ attr->setStartPosition( lineNo, 0 );
+ }
+
+ if (QRegExp("^(/|%r)").search(variablere.cap(2)) != -1) {
+ attr->setType( "Regexp" );
+ } else if (QRegExp("^[\"'%<]").search(variablere.cap(2)) != -1) {
+ attr->setType( "String" );
+ } else if (QRegExp("^\\[").search(variablere.cap(2)) != -1) {
+ attr->setType( "Array" );
+ } else if (QRegExp("^\\{").search(variablere.cap(2)) != -1) {
+ attr->setType( "Hash" );
+ } else if (QRegExp("^:").search(variablere.cap(2)) != -1) {
+ attr->setType( "Symbol" );
+ } else if (QRegExp("\\.\\.").search(variablere.cap(2)) != -1) {
+ attr->setType( "Range" );
+ } else if (variablere.cap(2) == "true" || variablere.cap(2) == "false") {
+ attr->setType( "Boolean" );
+ } else if ( QRegExp("^[-+]?[0-9_]+").exactMatch(variablere.cap(2))
+ || QRegExp("^[-+]?(0x|0|0b|\\?)").search(variablere.cap(2)) != -1 )
+ {
+ attr->setType( "Integer" );
+ } else if (QRegExp("[0-9._]+(e[-+0-9]+)?").exactMatch(variablere.cap(2))) {
+ attr->setType( "Float" );
+ } else if (variablere.cap(2) != "nil" && variablere.cap(3) != "") {
+ attr->setType( variablere.cap(3) );
+ }
+ } else if (begin_commentre.search(line) != -1) {
+ while (!stream.atEnd() && end_commentre.search(line) == -1) {
+ rawline = stream.readLine();
+ line = rawline.stripWhiteSpace().local8Bit();
+ ++lineNo;
+ }
+ }
+
+ ++lineNo;
+ }
+
+ f.close();
+
+ codeModel()->addFile( m_file );
+}
+
+
+void RubySupportPart::slotRun ()
+{
+ // if we can't save all parts, then the user canceled
+ if ( partController()->saveAllFiles() == false )
+ return;
+ QFileInfo program(mainProgram());
+ if (mainProgram().endsWith("script/server")) {
+ QString cmd;
+ QFileInfo server(project()->projectDirectory() + "/script/server");
+
+ // Starting WEBrick for a Rails app. Translate a SIGTERM signal sent by KDevelop
+ // to a SIGINT expected by WEBrick (ie control&c) to terminate it.
+ cmd += "script/server& \n trap \"kill -s SIGINT $!\" TERM \n wait \n exit 0";
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(project()->projectDirectory(), cmd, false);
+ } else {
+ QString cmd = QString("%1 -K%2 -C\"%3\" -I\"%4\" \"%5\" %6")
+ .arg(interpreter())
+ .arg(characterCoding())
+ .arg(runDirectory())
+ .arg(program.dirPath())
+ .arg(program.fileName())
+ .arg(programArgs());
+ startApplication(cmd);
+ }
+}
+
+QString RubySupportPart::interpreter() {
+ QString prog = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/interpreter");
+ if (prog.isEmpty()) prog = "ruby";
+ return prog;
+}
+
+QString RubySupportPart::shell() {
+ QString shell = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/shell");
+ if (shell.isEmpty()) shell = "irb";
+ return shell;
+}
+
+QString RubySupportPart::mainProgram() {
+ QString prog;
+ int runMainProgram = DomUtil::readIntEntry(*projectDom(), "/kdevrubysupport/run/runmainprogram");
+
+ if (runMainProgram == 0) {
+ prog = project()->projectDirectory() + "/" + DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/mainprogram");
+ } else {
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ if (ro_part != 0) {
+ prog = ro_part->url().path();
+ }
+ }
+
+ return prog;
+}
+
+QString RubySupportPart::runDirectory() {
+ QString cwd = DomUtil::readEntry(*projectDom(), "/kdevscriptproject/run/globalcwd");
+ if (cwd.isEmpty())
+ {
+ QString mainProg = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/mainprogram");
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ if (mainProg.isEmpty() && ro_part)
+ cwd = ro_part->url().directory();
+ else
+ cwd = project()->buildDirectory();
+ }
+ return cwd;
+}
+
+QString RubySupportPart::programArgs() {
+ QString args = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/programargs");
+ return args;
+}
+
+QString RubySupportPart::characterCoding() {
+ int coding = DomUtil::readIntEntry(*projectDom(), "/kdevrubysupport/run/charactercoding");
+ QString code("A");
+
+ switch (coding) {
+ case 0:
+ code = "A";
+ break;
+ case 1:
+ code = "E";
+ break;
+ case 2:
+ code = "S";
+ break;
+ case 3:
+ code = "U";
+ break;
+ }
+ return code;
+}
+
+
+void RubySupportPart::startApplication(const QString &program) {
+ bool inTerminal = DomUtil::readBoolEntry(*projectDom(), "/kdevrubysupport/run/terminal");
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), program, inTerminal);
+}
+
+
+KMimeType::List RubySupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "text/x-ruby" );
+ if( mime )
+ list << mime;
+ return list;
+}
+
+KDevDesignerIntegration *RubySupportPart::designer(KInterfaceDesigner::DesignerType type)
+{
+ KDevDesignerIntegration *des = 0;
+ switch (type)
+ {
+ case KInterfaceDesigner::QtDesigner:
+ des = m_designers[type];
+ if (des == 0)
+ {
+ RubyImplementationWidget *impl = new RubyImplementationWidget(this);
+ des = new QtDesignerRubyIntegration(this, impl);
+ des->loadSettings(*project()->projectDom(),
+ "kdevrubysupport/designerintegration");
+ m_designers[type] = des;
+ }
+ break;
+ case KInterfaceDesigner::Glade:
+ break;
+ }
+ return des;
+}
+
+void RubySupportPart::projectClosed( )
+{
+ for (QMap<KInterfaceDesigner::DesignerType, KDevDesignerIntegration*>::const_iterator it = m_designers.begin();
+ it != m_designers.end(); ++it)
+ {
+ kdDebug() << "calling save settings fro designer integration" << endl;
+ it.data()->saveSettings(*project()->projectDom(), "kdevrubysupport/designerintegration");
+ }
+}
+
+void RubySupportPart::contextMenu( QPopupMenu * popup, const Context * context )
+{
+ if (context->hasType(Context::FileContext)){
+ const FileContext *fc = static_cast<const FileContext*>(context);
+ //this is a .ui file and only selection contains only one such file
+ KURL url = fc->urls().first();
+ if (url.fileName().endsWith(".ui"))
+ {
+ m_contextFileName = url.fileName();
+ int id = popup->insertItem(i18n("Create or Select Implementation..."), this, SLOT(slotCreateSubclass()));
+ popup->setWhatsThis(id, i18n("<b>Create or select implementation</b><p>Creates or selects a subclass of selected form for use with integrated KDevDesigner."));
+ }
+ }
+}
+
+void RubySupportPart::slotCreateSubclass()
+{
+ QFileInfo fi(m_contextFileName);
+ if (fi.extension(false) != "ui")
+ return;
+ QtDesignerRubyIntegration *des = dynamic_cast<QtDesignerRubyIntegration*>(designer(KInterfaceDesigner::QtDesigner));
+ if (des)
+ des->selectImplementation(m_contextFileName);
+}
+
+void RubySupportPart::slotBrowse()
+{
+ kapp->invokeBrowser("http://localhost:3000/");
+}
+
+void RubySupportPart::slotSwitchToController()
+{
+ KParts::Part *activePart = partController()->activePart();
+ if (!activePart)
+ return;
+ KParts::ReadOnlyPart *ropart = dynamic_cast<KParts::ReadOnlyPart*>(activePart);
+ if (!ropart)
+ return;
+ QFileInfo file(ropart->url().path());
+ if (!file.exists())
+ return;
+ QString ext = file.extension();
+ QString name = file.baseName();
+ QString switchTo = "";
+ if ((ext == "rb") && !name.endsWith("_controller"))
+ {
+ if (name.endsWith("_test"))
+ {
+ switchTo = name.remove(QRegExp("_test$")); //the file is the test
+ switchTo = name.remove(QRegExp("_controller$")); //remove functional test name parts
+ }
+ else
+ switchTo = name;
+ }
+ else if (ext == "rjs" || ext == "rxml" || ext == "rhtml" || ext == "js.rjs" || ext == "xml.builder" || ext == "html.erb")
+ {
+ //this is a view, we need to find the directory of this view and try to find
+ //the controller basing on the directory information
+ switchTo = file.dir().dirName();
+ }
+ QString controllersDir = project()->projectDirectory() + "/app/controllers/";
+ if (!switchTo.isEmpty())
+ {
+ if (switchTo.endsWith("s"))
+ switchTo = switchTo.mid(0, switchTo.length()-1);
+ QString singular = controllersDir + switchTo + "_controller.rb";
+ QString plural = controllersDir + switchTo + "s_controller.rb";
+ KURL url = KURL::fromPathOrURL(QFile::exists(singular) ? singular : plural);
+ partController()->editDocument(url);
+ }
+}
+
+void RubySupportPart::slotSwitchToTest()
+{
+ KParts::Part *activePart = partController()->activePart();
+ if (!activePart)
+ return;
+ KParts::ReadOnlyPart *ropart = dynamic_cast<KParts::ReadOnlyPart*>(activePart);
+ if (!ropart)
+ return;
+ QFileInfo file(ropart->url().path());
+ if (!file.exists())
+ return;
+ QString ext = file.extension();
+ QString name = file.baseName();
+ QString switchTo = "";
+
+ if (ext == "rjs" || ext == "rxml" || ext == "rhtml" || ext == "js.rjs" || ext == "xml.builder" || ext == "html.erb")
+ {
+ //this is a view already, let's show the list of all views for this model
+ switchTo = file.dir().dirName();
+ }
+ else if (ext == "rb")
+ switchTo = name.remove(QRegExp("_controller$")).remove(QRegExp("_controller_test$")).remove(QRegExp("_test$"));
+
+ if (switchTo.isEmpty())
+ return;
+
+ if (switchTo.endsWith("s"))
+ switchTo = switchTo.mid(0, switchTo.length() - 1);
+
+ KURL::List urls;
+ QString testDir = project()->projectDirectory() + "/test/";
+ QString functionalTestS = testDir + "functional/" + switchTo + "_controller_test.rb";
+ QString functionalTestP = testDir + "functional/" + switchTo + "s_controller_test.rb";
+ QString integrationTestS = testDir + "integration/" + switchTo + "_test.rb";
+ QString integrationTestP = testDir + "integration/" + switchTo + "s_test.rb";
+ QString unitTestS = testDir + "unit/" + switchTo + "_test.rb";
+ QString unitTestP = testDir + "unit/" + switchTo + "s_test.rb";
+ if (QFile::exists(functionalTestP)) urls << KURL::fromPathOrURL(functionalTestP);
+ if (QFile::exists(integrationTestP)) urls << KURL::fromPathOrURL(integrationTestP);
+ if (QFile::exists(unitTestP)) urls << KURL::fromPathOrURL(unitTestP);
+ if (QFile::exists(functionalTestS)) urls << KURL::fromPathOrURL(functionalTestS);
+ if (QFile::exists(integrationTestS)) urls << KURL::fromPathOrURL(integrationTestS);
+ if (QFile::exists(unitTestS)) urls << KURL::fromPathOrURL(unitTestS);
+
+ KDevQuickOpen *qo = extension<KDevQuickOpen>("KDevelop/QuickOpen");
+ if (qo && !urls.isEmpty())
+ qo->quickOpenFile(urls);
+}
+
+void RubySupportPart::slotSwitchToModel()
+{
+ KParts::Part *activePart = partController()->activePart();
+ if (!activePart)
+ return;
+ KParts::ReadOnlyPart *ropart = dynamic_cast<KParts::ReadOnlyPart*>(activePart);
+ if (!ropart)
+ return;
+ QFileInfo file(ropart->url().path());
+ if (!file.exists())
+ return;
+ QString ext = file.extension();
+ QString name = file.baseName();
+ QString switchTo = "";
+
+ if (ext == "rjs" || ext == "rxml" || ext == "rhtml" || ext == "js.rjs" || ext == "xml.builder" || ext == "html.erb")
+ {
+ //this is a view already, let's show the list of all views for this model
+ switchTo = file.dir().dirName();
+ }
+ else if (ext == "rb" && (name.endsWith("_controller") || name.endsWith("_test")))
+ {
+ switchTo = name.remove(QRegExp("_controller$")).remove(QRegExp("_controller_test$")).remove(QRegExp("_test$"));
+ }
+
+ if (switchTo.isEmpty())
+ return;
+
+ if (switchTo.endsWith("s"))
+ switchTo = switchTo.mid(0, switchTo.length() - 1);
+
+ QString modelsDir = project()->projectDirectory() + "/app/models/";
+ QString singular = modelsDir + switchTo + "_controller.rb";
+ QString plural = modelsDir + switchTo + "s_controller.rb";
+ KURL url = KURL::fromPathOrURL(QFile::exists(singular) ? singular : plural);
+
+ partController()->editDocument(KURL::fromPathOrURL(modelsDir + switchTo + ".rb"));
+}
+
+void RubySupportPart::slotSwitchToView()
+{
+ KParts::Part *activePart = partController()->activePart();
+ if (!activePart)
+ return;
+ KParts::ReadOnlyPart *ropart = dynamic_cast<KParts::ReadOnlyPart*>(activePart);
+ if (!ropart)
+ return;
+ QFileInfo file(ropart->url().path());
+ if (!file.exists())
+ return;
+ QString ext = file.extension();
+ QString name = file.baseName();
+ QString switchTo = "";
+
+ if (ext == "rjs" || ext == "rxml" || ext == "rhtml" || ext == "js.rjs" || ext == "xml.builder" || ext == "html.erb")
+ {
+ //this is a view already, let's show the list of all views for this model
+ switchTo = file.dir().dirName();
+ }
+ else if (ext == "rb")
+ switchTo = name.remove(QRegExp("_controller$")).remove(QRegExp("_controller_test$")).remove(QRegExp("_test$"));
+
+ if (switchTo.isEmpty())
+ return;
+
+ if (switchTo.endsWith("s"))
+ switchTo = switchTo.mid(0, switchTo.length() - 1);
+
+ KURL::List urls;
+ QDir viewsDir;
+ QDir viewsDirS = QDir(project()->projectDirectory() + "/app/views/" + switchTo);
+ QDir viewsDirP = QDir(project()->projectDirectory() + "/app/views/" + switchTo + "s");
+ if (viewsDirS.exists())
+ viewsDir = viewsDirS;
+ else if (viewsDirP.exists())
+ viewsDir = viewsDirP;
+ else
+ return;
+
+ QStringList views = viewsDir.entryList();
+
+ for (QStringList::const_iterator it = views.begin(); it != views.end(); ++it)
+ {
+ QString viewName = *it;
+ if ( !(viewName.endsWith("~") || viewName == "." || viewName == "..") )
+ urls << KURL::fromPathOrURL(viewsDir.absPath() + "/" + viewName);
+ }
+ KDevQuickOpen *qo = extension<KDevQuickOpen>("KDevelop/QuickOpen");
+ if (qo)
+ qo->quickOpenFile(urls);
+}
+
+void RubySupportPart::slotRunTestUnderCursor()
+{
+ // if we can't save all parts, then the user canceled
+ if ( partController()->saveAllFiles() == false )
+ return;
+
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ QString prog;
+ if (ro_part != 0) {
+ prog = ro_part->url().path();
+ } else
+ return;
+
+ KTextEditor::ViewCursorInterface* activeViewCursor = dynamic_cast<KTextEditor::ViewCursorInterface*>( ro_part->widget() );
+ if (!activeViewCursor) return;
+
+ unsigned int line, column;
+ activeViewCursor->cursorPositionReal(&line, &column);
+ CodeModelUtils::CodeModelHelper hlp(codeModel(), codeModel()->fileByName(prog));
+ FunctionDom fun = hlp.functionAt(line, column);
+ if (fun == 0) return;
+
+ QFileInfo program(prog);
+ QString cmd = QString("%1 -K%2 -C\"%3\" -I\"%4\" \"%5\" %6")
+ .arg(interpreter())
+ .arg(characterCoding())
+ .arg(runDirectory())
+ .arg(program.dirPath())
+ .arg(program.fileName())
+ .arg(" -n " + fun->name());
+ startApplication(cmd);
+}
+
+#include "rubysupport_part.moc"
diff --git a/languages/ruby/rubysupport_part.h b/languages/ruby/rubysupport_part.h
new file mode 100644
index 00000000..0d420cff
--- /dev/null
+++ b/languages/ruby/rubysupport_part.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2003 Marek Janukowicz <marek@janukowicz.net>
+ */
+
+
+#ifndef __KDEVPART_RUBYSUPPORT_H__
+#define __KDEVPART_RUBYSUPPORT_H__
+
+#include <qguardedptr.h>
+
+#include "kdevlanguagesupport.h"
+
+class KDialogBase;
+class QPopupMenu;
+class Context;
+class KDevShellWidget;
+
+class RubySupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+
+ RubySupportPart(QObject *parent, const char *name, const QStringList &);
+ virtual ~RubySupportPart();
+
+ virtual KDevDesignerIntegration *designer(KInterfaceDesigner::DesignerType type);
+
+protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+private slots:
+ void projectConfigWidget(KDialogBase *dlg);
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void slotRun();
+ void slotRunTestUnderCursor();
+ void slotCreateSubclass();
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void slotBrowse();
+
+ void initialParse();
+
+ void slotSwitchToController();
+ void slotSwitchToView();
+ void slotSwitchToModel();
+ void slotSwitchToTest();
+
+private:
+ void startApplication(const QString &program);
+ QString interpreter();
+ QString shell();
+ QString mainProgram();
+ QString runDirectory();
+ QString programArgs();
+ QString characterCoding();
+
+ void maybeParse(const QString fileName);
+ void parse(const QString &fileName);
+
+ QMap<KInterfaceDesigner::DesignerType, KDevDesignerIntegration*> m_designers;
+
+ QString m_contextFileName;
+ QCString m_shell;
+
+ QGuardedPtr<KDevShellWidget> m_shellWidget;
+};
+
+
+#endif
diff --git a/languages/ruby/rubytemplates b/languages/ruby/rubytemplates
new file mode 100644
index 00000000..00135842
--- /dev/null
+++ b/languages/ruby/rubytemplates
@@ -0,0 +1,101 @@
+<!DOCTYPE Templates>
+<Templates>
+ <Template code="if |
+else
+end" name="ife" description="if else" suffixes="Ruby (rb,rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)"/>
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;% | %>" name="e" description="embedded ruby code" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;% | -%>" name="en" description="embedded ruby code with newlines stripped" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;%- | -%>" name="enn" description="embedded ruby code with newlines stripped" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;%= | %>" name="pp" description="embedded ruby code that prints a result" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;%= | -%>" name="pn" description="embedded ruby code that prints a result with newlines stripped" />
+ <Template suffixes="Ruby (rb,rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="class |
+
+end" name="classd" description="class declaration" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;a&gt;|&lt;/a&gt;" name="a" description="a html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;abbr&gt;|&lt;/abbr&gt;" name="abbr" description="abbr html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;acronym&gt;|&lt;/acronym&gt;" name="acronym" description="acronym html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;address&gt;|&lt;/address&gt;" name="address" description="address html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;applet&gt;|&lt;/applet&gt;" name="applet" description="applet html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;area&gt;|&lt;/area&gt;" name="area" description="area html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;b&gt;|&lt;/b&gt;" name="b" description="b html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;base&gt;|&lt;/base&gt;" name="base" description="base html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;basefont&gt;|&lt;/basefont&gt;" name="basefont" description="basefont html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;bdo&gt;|&lt;/bdo&gt;" name="bdo" description="bdo html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;big&gt;|&lt;/big&gt;" name="big" description="big html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;blockquote&gt;|&lt;/blockquote&gt;" name="blockquote" description="blockquote html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;body&gt;|&lt;/body&gt;" name="body" description="body html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;br&gt;|&lt;/br&gt;" name="br" description="br html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;button&gt;|&lt;/button&gt;" name="button" description="button html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;caption&gt;|&lt;/caption&gt;" name="caption" description="caption html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;center&gt;|&lt;/center&gt;" name="center" description="center html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;cite&gt;|&lt;/cite&gt;" name="cite" description="cite html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;code&gt;|&lt;/code&gt;" name="code" description="code html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;col&gt;|&lt;/col&gt;" name="col" description="col html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;colgroup&gt;|&lt;/colgroup&gt;" name="colgroup" description="colgroup html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dd&gt;|&lt;/dd&gt;" name="dd" description="dd html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;del&gt;|&lt;/del&gt;" name="del" description="del html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dir&gt;|&lt;/dir&gt;" name="dir" description="dir html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;div&gt;|&lt;/div&gt;" name="div" description="div html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dfn&gt;|&lt;/dfn&gt;" name="dfn" description="dfn html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dl&gt;|&lt;/dl&gt;" name="dl" description="dl html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dt&gt;|&lt;/dt&gt;" name="dt" description="dt html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;em&gt;|&lt;/em&gt;" name="em" description="em html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;fieldset&gt;|&lt;/fieldset&gt;" name="fieldset" description="fieldset html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;font&gt;|&lt;/font&gt;" name="font" description="font html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;form&gt;|&lt;/form&gt;" name="form" description="form html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;frame&gt;|&lt;/frame&gt;" name="frame" description="frame html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;frameset&gt;|&lt;/frameset&gt;" name="frameset" description="frameset html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;h1&gt;|&lt;/h1&gt;" name="h1" description="h1 html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;head&gt;|&lt;/head&gt;" name="head" description="head html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;hr&gt;|&lt;/hr&gt;" name="hr" description="hr html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;html&gt;|&lt;/html&gt;" name="html" description="html html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;i&gt;|&lt;/i&gt;" name="i" description="i html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;iframe&gt;|&lt;/iframe&gt;" name="iframe" description="iframe html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;img&gt;|&lt;/img&gt;" name="img" description="img html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;input&gt;|&lt;/input&gt;" name="input" description="input html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;ins&gt;|&lt;/ins&gt;" name="ins" description="ins html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;isindex&gt;|&lt;/isindex&gt;" name="isindex" description="isindex html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;kbd&gt;|&lt;/kbd&gt;" name="kbd" description="kbd html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;label&gt;|&lt;/label&gt;" name="label" description="label html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;legend&gt;|&lt;/legend&gt;" name="legend" description="legend html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;li&gt;|&lt;/li&gt;" name="li" description="li html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;link&gt;|&lt;/link&gt;" name="link" description="link html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;map&gt;|&lt;/map&gt;" name="map" description="map html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;menu&gt;|&lt;/menu&gt;" name="menu" description="menu html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;meta&gt;|&lt;/meta&gt;" name="meta" description="meta html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;noframes&gt;|&lt;/noframes&gt;" name="noframes" description="noframes html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;noscript&gt;|&lt;/noscript&gt;" name="noscript" description="noscript html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;object&gt;|&lt;/object&gt;" name="object" description="object html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;ol&gt;|&lt;/ol&gt;" name="ol" description="ol html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;optgroup&gt;|&lt;/optgroup&gt;" name="optgroup" description="optgroup html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;option&gt;|&lt;/option&gt;" name="option" description="option html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;p&gt;|&lt;/p&gt;" name="p" description="p html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;param&gt;|&lt;/param&gt;" name="param" description="param html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;pre&gt;|&lt;/pre&gt;" name="pre" description="pre html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;q&gt;|&lt;/q&gt;" name="q" description="q html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;s&gt;|&lt;/s&gt;" name="s" description="s html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;samp&gt;|&lt;/samp&gt;" name="samp" description="samp html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;script&gt;|&lt;/script&gt;" name="script" description="script html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;select&gt;|&lt;/select&gt;" name="select" description="select html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;small&gt;|&lt;/small&gt;" name="small" description="small html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;span&gt;|&lt;/span&gt;" name="span" description="span html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;strike&gt;|&lt;/strike&gt;" name="strike" description="strike html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;strong&gt;|&lt;/strong&gt;" name="strong" description="strong html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;style&gt;|&lt;/style&gt;" name="style" description="style html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;sub&gt;|&lt;/sub&gt;" name="sub" description="sub html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;sup&gt;|&lt;/sup&gt;" name="sup" description="sup html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;table&gt;|&lt;/table&gt;" name="table" description="table html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;tbody&gt;|&lt;/tbody&gt;" name="tbody" description="tbody html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;td&gt;|&lt;/td&gt;" name="td" description="td html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;textarea&gt;|&lt;/textarea&gt;" name="textarea" description="textarea html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;tfoot&gt;|&lt;/tfoot&gt;" name="tfoot" description="tfoot html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;th&gt;|&lt;/th&gt;" name="th" description="th html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;thead&gt;|&lt;/thead&gt;" name="thead" description="thead html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;title&gt;|&lt;/title&gt;" name="title" description="title html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;tr&gt;|&lt;/tr&gt;" name="tr" description="tr html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;tt&gt;|&lt;/tt&gt;" name="tt" description="tt html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;u&gt;|&lt;/u&gt;" name="u" description="u html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;ul&gt;|&lt;/ul&gt;" name="ul" description="ul html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;var&gt;|&lt;/var&gt;" name="var" description="var html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;xmp&gt;|&lt;/xmp&gt;" name="xmp" description="xmp html tag" />
+</Templates>
diff --git a/languages/sql/Makefile.am b/languages/sql/Makefile.am
new file mode 100644
index 00000000..68cfbdea
--- /dev/null
+++ b/languages/sql/Makefile.am
@@ -0,0 +1,20 @@
+#Here resides the SQL support part.
+
+INCLUDES = -I$(top_srcdir)/lib/compat -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+SUBDIRS = app_templates doc
+
+kde_module_LTLIBRARIES = libkdevsqlsupport.la
+libkdevsqlsupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevsqlsupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la
+
+libkdevsqlsupport_la_SOURCES = sqlconfigwidget.ui sqlsupport_part.cpp sqlactions.cpp sqloutputwidget.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevsqlsupport.desktop
+
+rcdir = $(kde_datadir)/kdevsqlsupport
+rc_DATA = kdevsqlsupport.rc
diff --git a/languages/sql/README.dox b/languages/sql/README.dox
new file mode 100644
index 00000000..bfa52e2e
--- /dev/null
+++ b/languages/sql/README.dox
@@ -0,0 +1,40 @@
+/** \class SQLSupportPart
+This is a SQL support plugin
+
+\authors <a href="mailto:harry AT kdevelop.org">Harald Fernengel</a>
+
+\maintainer <a href="mailto:harry AT kdevelop.org">Harald Fernengel</a>
+
+\feature SQL language support
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/sql/app_templates/Makefile.am b/languages/sql/app_templates/Makefile.am
new file mode 100644
index 00000000..78c56300
--- /dev/null
+++ b/languages/sql/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = sqlsimple
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/DatabaseIDE
+profiles_DATA = sql.appwizard
diff --git a/languages/sql/app_templates/sql.appwizard b/languages/sql/app_templates/sql.appwizard
new file mode 100644
index 00000000..425f4998
--- /dev/null
+++ b/languages/sql/app_templates/sql.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=sqlsimple
diff --git a/languages/sql/app_templates/sqlsimple/.kdev_ignore b/languages/sql/app_templates/sqlsimple/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/sql/app_templates/sqlsimple/.kdev_ignore
diff --git a/languages/sql/app_templates/sqlsimple/Makefile.am b/languages/sql/app_templates/sqlsimple/Makefile.am
new file mode 100644
index 00000000..f7b5a012
--- /dev/null
+++ b/languages/sql/app_templates/sqlsimple/Makefile.am
@@ -0,0 +1,16 @@
+templateName = sqlsimple
+dataFiles = app.sql app.kdevelop
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/sql/app_templates/sqlsimple/app.kdevelop b/languages/sql/app_templates/sqlsimple/app.kdevelop
new file mode 100644
index 00000000..78f055cd
--- /dev/null
+++ b/languages/sql/app_templates/sqlsimple/app.kdevelop
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>SQL</primarylanguage>
+ <keywords>
+ <keyword>SQL</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevdistpart</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <activedir>src</activedir>
+ <includepatterns>*.sql</includepatterns>
+ <excludepatterns>*~</excludepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.sql" name="SQL" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="sql"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/sql/app_templates/sqlsimple/app.sql b/languages/sql/app_templates/sqlsimple/app.sql
new file mode 100644
index 00000000..72e73020
--- /dev/null
+++ b/languages/sql/app_templates/sqlsimple/app.sql
@@ -0,0 +1 @@
+select * from foo; \ No newline at end of file
diff --git a/languages/sql/app_templates/sqlsimple/sqlsimple b/languages/sql/app_templates/sqlsimple/sqlsimple
new file mode 100644
index 00000000..e4bee598
--- /dev/null
+++ b/languages/sql/app_templates/sqlsimple/sqlsimple
@@ -0,0 +1,7 @@
+# KDE Config File
+[General]
+Name=Simple SQL Project
+Category=Database
+Comment=Generates a simple SQL project.
+FileTemplates=sql,AdaStyle
+ShowFilesAfterGeneration=APPNAMELC.sql
diff --git a/languages/sql/app_templates/sqlsimple/sqlsimple.kdevtemplate b/languages/sql/app_templates/sqlsimple/sqlsimple.kdevtemplate
new file mode 100644
index 00000000..e3c100d8
--- /dev/null
+++ b/languages/sql/app_templates/sqlsimple/sqlsimple.kdevtemplate
@@ -0,0 +1,106 @@
+# KDE Config File
+[General]
+Name=Simple SQL Project
+Name[ca]=Simple projecte en SQL
+Name[da]=Simpelt SQL-projekt
+Name[de]=Einfaches SQL-Projekt
+Name[el]=Απλό έÏγο SQL
+Name[es]=Proyecto SQL sencillo
+Name[et]=Lihtne SQL projekt
+Name[eu]=SQL proiektu sinplea
+Name[fa]=پروژۀ سادۀ SQL
+Name[fr]=Projet SQL simple
+Name[ga]=Tionscadal Simplí SQL
+Name[gl]=Proxecto sinxelo en SQL
+Name[hu]=Egyszerű SQL-projekt
+Name[it]=Semplice progetto SQL
+Name[ja]=ç°¡å˜ãª SQL プロジェクト
+Name[nds]=Eenfach SQL-Projekt
+Name[ne]=साधारण SQL परियोजना
+Name[nl]=Eenvoudig SQL-project
+Name[pl]=Prosty projekt w SQL-u
+Name[pt]=Projecto Simples em SQL
+Name[pt_BR]=Projecto Simples em SQL
+Name[ru]=ПроÑтой проект SQL
+Name[sk]=Jednoduchý SQL projekt
+Name[sr]=ЈедноÑтаван SQL пројекат
+Name[sr@Latn]=Jednostavan SQL projekat
+Name[sv]=Enkelt SQL-projekt
+Name[tr]=Basit SQL Projesi
+Name[zh_CN]=简å•çš„ SQL 工程
+Name[zh_TW]=簡單的 SQL 專案
+Category=Database
+Comment=Generates a simple SQL project.
+Comment[ca]=Genera un simple projecte en SQL.
+Comment[da]=Genererer et simpelt SQL projekt.
+Comment[de]=Erstellt ein einfaches SQL-Projekt.
+Comment[el]=ΔημιουÏγεί ένα απλό έÏγο SQL.
+Comment[es]=Genera un sencillo proyecto SQL.
+Comment[et]=Lihtsa SQL projekti loomine.
+Comment[eu]=SQL proiektu sinple bat sortzen du.
+Comment[fa]=یک پروژۀ سادۀ SQL تولید می‌کند.
+Comment[fr]=Génère un projet SQL simple.
+Comment[gl]=Xera un proxecto sinxelo en SQL.
+Comment[hu]=Létrehoz egy egyszerű SQL-projektet.
+Comment[it]=Genera un semplice progetto SQL.
+Comment[ja]=ç°¡å˜ãª SQL プロジェクトを作æˆã—ã¾ã™
+Comment[nds]=Stellt en eenfach SQL-Projekt op.
+Comment[ne]=साधारण SQL परियोजना उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Genereert een eenvoudig SQL-project.
+Comment[pl]=Generuje prosty projekt w SQL-u.
+Comment[pt]=Gera um projecto simples em SQL.
+Comment[pt_BR]=Gera um projecto simples em SQL.
+Comment[ru]=ПроÑтой проект SQL
+Comment[sk]=Vygeneruje jednoduchý SQL projekt.
+Comment[sr]=Прави једноÑтаван SQL пројекат.
+Comment[sr@Latn]=Pravi jednostavan SQL projekat.
+Comment[sv]=Skapar ett enkelt SQL-projekt.
+Comment[tr]=Basit bir SQL Projesi yaratır
+Comment[zh_CN]=生æˆä¸€ä¸ªç®€å•çš„ SQL 工程。
+Comment[zh_TW]=產生一個簡單的 SQL 專案
+FileTemplates=sql,AdaStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.sql
+Archive=sqlsimple.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.sql
+Dest=%{dest}/%{APPNAMELC}.sql
+
+[MSG]
+Type=install
+Comment=A simple SQL project was created in %{dest}
+Comment[ca]=Un simple projecte en SQL ha estat creat en %{dest}
+Comment[da]=Et simpelt SQL projekt blev oprettet i %{dest}
+Comment[de]=Ein einfaches SQL-Projekt wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό έÏγο SQL δημιουÏγήθηκε στο %{dest}
+Comment[es]=Un sencillo proyecto SQL ha sido creado en %{dest}
+Comment[et]=Lihtne SQL projekt loodi asukohta %{dest}
+Comment[eu]=SQL proiektu sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک پروژۀ سادۀ SQL در %{dest} ایجاد شد
+Comment[fr]=Un projet SQL simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh tionscadal simplí SQL i %{dest}
+Comment[gl]=Creouse un proxecto sinxelo en SQL en %{dest}
+Comment[hu]=Létrejött egy egyszerű SQL-projekt itt: %{dest}
+Comment[it]=È stato creato un semplice progetto SQL in %{dest}
+Comment[ja]=ç°¡å˜ãª SQL プロジェクトを %{dest} ã«ä½œæˆã—ã¾ã—ãŸ
+Comment[nds]=In %{dest} wöör en eenfach SQL-Projekt opstellt.
+Comment[ne]=साधारण SQL परियोजना %{dest} मा सिरà¥à¤œà¤¨à¤¾ गरियो
+Comment[nl]=Een eenvoudig SQL-project is aangemaakt in %{dest}
+Comment[pl]=Prosty projekt w SQL-u został utworzony w %{dest}
+Comment[pt]=Foi criado um projecto simples de SQL em %{dest}
+Comment[pt_BR]=Foi criado um projecto simples de SQL em %{dest}
+Comment[ru]=ПроÑтой проект SQL Ñоздан в %{dest}
+Comment[sk]=Jednoduchý SQL projekt bol vytvorený v %{dest}
+Comment[sr]=ЈедноÑтаван SQL пројекат направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan SQL projekat napravljen je u %{dest}
+Comment[sv]=Ett enkelt SQL-projekt skapades i %{dest}
+Comment[tr]=Basit bir SQL projesi %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 中创建了简å•çš„ SQL 工程
+Comment[zh_TW]=一個簡單的 SQL 專案已建立於 %{dest}
diff --git a/languages/sql/app_templates/sqlsimple/sqlsimple.png b/languages/sql/app_templates/sqlsimple/sqlsimple.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/sql/app_templates/sqlsimple/sqlsimple.png
Binary files differ
diff --git a/languages/sql/doc/Makefile.am b/languages/sql/doc/Makefile.am
new file mode 100644
index 00000000..d42aec82
--- /dev/null
+++ b/languages/sql/doc/Makefile.am
@@ -0,0 +1,6 @@
+#tocdir = ${kde_datadir}/kdevdoctreeview/tocs
+#toc_DATA =
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA =
+
diff --git a/languages/sql/kdevsqlsupport.desktop b/languages/sql/kdevsqlsupport.desktop
new file mode 100644
index 00000000..2880affa
--- /dev/null
+++ b/languages/sql/kdevsqlsupport.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=SQL Support
+Comment[ca]=Suport per a SQL
+Comment[da]=SQL-understøttelse
+Comment[de]=Unterstützung für SQL
+Comment[el]=ΥποστήÏιξη SQL
+Comment[es]=Soporte para SQL
+Comment[et]=SQL toetus
+Comment[eu]=SQL euskarria
+Comment[fa]=پشتیبانی SQL
+Comment[fr]=Prise en charge du langage SQL
+Comment[ga]=Tacaíocht SQL
+Comment[gl]=Soporte para SQL
+Comment[hi]=à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² समरà¥à¤¥à¤¨
+Comment[hu]=SQL-támogatás
+Comment[is]=SQL stuðningur
+Comment[it]=Supporto SQL
+Comment[ja]=SQL サãƒãƒ¼ãƒˆ
+Comment[nds]=SQL-Ünnerstütten
+Comment[ne]=SQL समरà¥à¤¥à¤¨
+Comment[nl]=Ondersteuning voor SQL
+Comment[pl]=Obsługa SQL-a
+Comment[pt]=Suporte a SQL
+Comment[pt_BR]=Suporte ao SQL
+Comment[ru]=Поддержка Ñзыка SQL
+Comment[sk]=SQL podpora
+Comment[sl]=Podpora za SQL
+Comment[sr]=Подршка за SQL
+Comment[sr@Latn]=Podrška za SQL
+Comment[sv]=SQL-stöd
+Comment[ta]=SQL ஆதரவà¯
+Comment[tg]=ÐÑ€Ó£ намудани забони SQL
+Comment[tr]=SQL DesteÄŸi
+Comment[zh_CN]=SQL 语言支æŒ
+Comment[zh_TW]=SQL 支æ´
+Name=KDevSQLSupport
+Name[da]=KDevelop SQL-understøttelse
+Name[de]=Unterstützung für SQL (KDevelop)
+Name[hi]=के-डेव-à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤²-समरà¥à¤¥à¤¨
+Name[nds]=SQL-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaSQL
+Name[sk]=KDev SQL podpora
+Name[sv]=KDevelop SQL-stöd
+Name[ta]=கெடெவ௠எஸà¯à®•à®¿à®¯à¯‡à®²à¯ ஆதரவà¯
+Name[zh_TW]=KDevelop SQL 支æ´
+GenericName=SQL Support
+GenericName[ca]=Suport per a SQL
+GenericName[da]=SQL-understøttelse
+GenericName[de]=Unterstützung für SQL
+GenericName[el]=ΥποστήÏιξη SQL
+GenericName[es]=Soporte para SQL
+GenericName[et]=SQL toetus
+GenericName[eu]=SQL euskarria
+GenericName[fa]=پشتیبانی SQL
+GenericName[fr]=Langage SQL
+GenericName[ga]=Tacaíocht SQL
+GenericName[gl]=Soporte para SQL
+GenericName[hi]=à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² समरà¥à¤¥à¤¨
+GenericName[hu]=SQL-támogatás
+GenericName[it]=Supporto SQL
+GenericName[ja]=SQL サãƒãƒ¼ãƒˆ
+GenericName[nds]=SQL-Ünnerstütten
+GenericName[ne]=SQL समरà¥à¤¥à¤¨
+GenericName[nl]=Ondersteuning voor SQL
+GenericName[pl]=Obsługa SQL-a
+GenericName[pt]=Suporte a SQL
+GenericName[pt_BR]=Suporte ao SQL
+GenericName[ru]=Поддержка Ñзыка SQL
+GenericName[sk]=SQL podpora
+GenericName[sl]=Podpora za SQL
+GenericName[sr]=Подршка за SQL
+GenericName[sr@Latn]=Podrška za SQL
+GenericName[sv]=SQL-stöd
+GenericName[ta]=SQL ஆதரவà¯
+GenericName[tg]=ÐÑ€Ó£ намудани забони SQL
+GenericName[tr]=SQL DesteÄŸi
+GenericName[zh_CN]=SQL 支æŒ
+GenericName[zh_TW]=SQL 支æ´
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevsqlsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=SQL
+X-KDevelop-Args=SQL
diff --git a/languages/sql/kdevsqlsupport.rc b/languages/sql/kdevsqlsupport.rc
new file mode 100644
index 00000000..36b91d7a
--- /dev/null
+++ b/languages/sql/kdevsqlsupport.rc
@@ -0,0 +1,14 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevSQLSupport" version="2">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_execute" />
+ </Menu>
+</MenuBar>
+<ToolBar name="buildToolBar">
+ <Action name="build_execute" group="build_operations" />
+</ToolBar>
+<ToolBar name="browserToolBar">
+ <Action name="connection_combo" />
+</ToolBar>
+</kpartgui>
diff --git a/languages/sql/sqlactions.cpp b/languages/sql/sqlactions.cpp
new file mode 100644
index 00000000..8cfac095
--- /dev/null
+++ b/languages/sql/sqlactions.cpp
@@ -0,0 +1,103 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Harald Fernengel *
+ * harry@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "sqlactions.h"
+
+#include <qpopupmenu.h>
+#include <qstringlist.h>
+#include <qsqldatabase.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <ktoolbar.h>
+#include <kiconloader.h>
+#include <kcombobox.h>
+
+#include "kdevplugin.h"
+#include "kdevlanguagesupport.h"
+#include "sqlsupport_part.h"
+
+SqlListAction::SqlListAction(SQLSupportPart *part, const QString &text,
+ const KShortcut& cut,
+ const QObject *receiver, const char *slot,
+ KActionCollection *parent, const char *name)
+ : KWidgetAction( m_combo = new KComboBox(), text, cut, 0, 0, parent, name), m_part(part)
+{
+#if (QT_VERSION >= 0x030100)
+ m_combo->setEditable( false );
+ m_combo->setAutoCompletion( true );
+#endif
+
+ m_combo->setMinimumWidth( 200 );
+ m_combo->setMaximumWidth( 400 );
+
+ connect( m_combo, SIGNAL(activated(const QString&)), receiver, slot );
+ connect( m_combo, SIGNAL(activated(int)), this, SLOT(activated(int)) );
+
+ setShortcutConfigurable( false );
+ setAutoSized( true );
+
+ refresh();
+}
+
+
+void SqlListAction::setCurrentConnectionName(const QString &name)
+{
+ int idx = m_part->connections().findIndex( name );
+ if ( idx < 0 )
+ m_combo->setCurrentItem( 0 );
+ else
+ m_combo->setCurrentItem( idx + 1 );
+}
+
+
+QString SqlListAction::currentConnectionName() const
+{
+ if ( m_combo->currentItem() <= 0 )
+ return QString::null;
+ return m_part->connections()[ m_combo->currentItem() - 1 ];
+}
+
+void SqlListAction::activated(int idx)
+{
+ if (idx < 1 || (int)m_part->connections().count() <= idx)
+ return;
+ const QSqlDatabase *db = QSqlDatabase::database(m_part->connections()[idx], true);
+ m_combo->changeItem( db->isOpen() ? SmallIcon( "ok" ) : SmallIcon( "no" ),
+ m_combo->text(idx), idx );
+}
+
+void SqlListAction::refresh()
+{
+ const QStringList& dbc = m_part->connections();
+
+ m_combo->clear();
+ m_combo->insertItem( i18n("<no database server>") );
+
+ QString cName;
+ for ( QStringList::ConstIterator it = dbc.begin(); it != dbc.end(); ++it ) {
+
+ QSqlDatabase* db = QSqlDatabase::database( (*it), false );
+ if ( !db ) {
+ kdDebug( 9000 ) << "Could not find database connection " << (*it) << endl;
+ m_combo->insertItem( SmallIcon( "no" ), i18n("<error - no connection %1>").arg( *it ) );
+ continue;
+ }
+ cName = db->driverName();
+ cName.append( "://" ).append( db->userName() ).append( "@" ).append( db->hostName() );
+ cName.append( "/" ).append( db->databaseName() );
+
+ m_combo->insertItem( db->open() ? SmallIcon( "ok" ) : SmallIcon( "no" ), cName );
+ }
+}
+
+
+#include "sqlactions.moc"
diff --git a/languages/sql/sqlactions.h b/languages/sql/sqlactions.h
new file mode 100644
index 00000000..e49794e5
--- /dev/null
+++ b/languages/sql/sqlactions.h
@@ -0,0 +1,41 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Harald Fernengel *
+ * harry@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _SQLACTION_H_
+#define _SQLACTION_H_
+
+#include <kdeversion.h>
+#include <kxmlguiclient.h>
+#include <kaction.h>
+
+class SQLSupportPart;
+class KComboBox;
+
+class SqlListAction : public KWidgetAction
+{
+ Q_OBJECT
+public:
+ SqlListAction( SQLSupportPart *part, const QString &text, const KShortcut& cut,
+ const QObject *receiver, const char *slot,
+ KActionCollection *parent, const char *name );
+ void setCurrentConnectionName(const QString &name);
+ QString currentConnectionName() const;
+ void refresh();
+
+private slots:
+ void activated(int);
+
+private:
+ SQLSupportPart *m_part;
+ KComboBox* m_combo;
+};
+
+#endif
diff --git a/languages/sql/sqlconfigwidget.ui b/languages/sql/sqlconfigwidget.ui
new file mode 100644
index 00000000..e85b09d9
--- /dev/null
+++ b/languages/sql/sqlconfigwidget.ui
@@ -0,0 +1,189 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>SqlConfigWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SqlConfigWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>578</width>
+ <height>367</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTable">
+ <column>
+ <property name="text">
+ <string>Plugin</string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Database Name</string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Host</string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Port</string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Username</string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Password</string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>dbTable</cstring>
+ </property>
+ <property name="numRows">
+ <number>0</number>
+ </property>
+ <property name="numCols">
+ <number>6</number>
+ </property>
+ <property name="selectionMode">
+ <enum>SingleRow</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;i&gt;Warning:&lt;/i&gt; password will be saved with weak encryption.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>81</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>removeBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>testBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Test</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>dbTable</sender>
+ <signal>valueChanged(int,int)</signal>
+ <receiver>SqlConfigWidget</receiver>
+ <slot>valueChanged(int,int)</slot>
+ </connection>
+ <connection>
+ <sender>removeBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlConfigWidget</receiver>
+ <slot>removeDb()</slot>
+ </connection>
+ <connection>
+ <sender>testBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlConfigWidget</receiver>
+ <slot>testDb()</slot>
+ </connection>
+ <connection>
+ <sender>dbTable</sender>
+ <signal>currentChanged(int,int)</signal>
+ <receiver>SqlConfigWidget</receiver>
+ <slot>updateButtons()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">sqlconfigwidget.ui.h</include>
+</includes>
+<forwards>
+ <forward>class QDomDocument;</forward>
+</forwards>
+<variables>
+ <variable access="private">QDomDocument* doc;</variable>
+ <variable access="private">bool changed;</variable>
+</variables>
+<signals>
+ <signal>newConfigSaved()</signal>
+</signals>
+<slots>
+ <slot>init()</slot>
+ <slot>valueChanged( int, int )</slot>
+ <slot>removeDb()</slot>
+ <slot>updateButtons()</slot>
+ <slot>testDb()</slot>
+ <slot>accept()</slot>
+ <slot>setProjectDom( QDomDocument * doc )</slot>
+ <slot>loadConfig()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/sql/sqlconfigwidget.ui.h b/languages/sql/sqlconfigwidget.ui.h
new file mode 100644
index 00000000..c99d8722
--- /dev/null
+++ b/languages/sql/sqlconfigwidget.ui.h
@@ -0,0 +1,244 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+
+#include <qsqldatabase.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qdom.h>
+#include <qstringlist.h>
+
+#include <klocale.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+
+#include <domutil.h>
+
+#include "sqlsupport_part.h"
+
+// displays a ComboBox on edit to let the user choose the plugin
+class PluginTableItem: public QTableItem
+{
+public:
+ PluginTableItem( QTable* table, const QString& text = QString::null ): QTableItem( table, QTableItem::OnTyping, text ) {}
+
+ virtual QWidget* createEditor() const
+ {
+ QComboBox* combo = new QComboBox( true, table() );
+ combo->insertStringList( QSqlDatabase::drivers() );
+ if ( !text().isEmpty() )
+ combo->setCurrentText( text() );
+ return combo;
+ }
+
+ virtual void setContentFromEditor( QWidget* w )
+ {
+ if ( w->inherits( "QComboBox" ) )
+ setText( ( (QComboBox*)w )->currentText() );
+ else
+ QTableItem::setContentFromEditor( w );
+ }
+};
+
+// uses a spinbox to let the user choose the port
+class PortTableItem: public QTableItem
+{
+public:
+ PortTableItem( QTable* table, const QString& text = QString::null ): QTableItem( table, QTableItem::OnTyping, text ) {}
+
+ virtual QWidget* createEditor() const
+ {
+ QSpinBox* sb = new QSpinBox( -1, 65535, 1, table() );
+ sb->setSpecialValueText( i18n("Default") );
+ if ( !text().isEmpty() )
+ sb->setValue( text().toInt() );
+ return sb;
+ }
+
+ virtual void setContentFromEditor( QWidget* w )
+ {
+ if ( w->inherits( "QSpinBox" ) )
+ setText( ( (QSpinBox*)w )->text() );
+ else
+ QTableItem::setContentFromEditor( w );
+ }
+};
+
+// uses a spinbox to let the user choose the port
+class PasswordTableItem: public QTableItem
+{
+public:
+ PasswordTableItem( QTable* table, const QString& text = QString::null ): QTableItem( table, QTableItem::OnTyping, text ) {}
+
+ virtual QWidget* createEditor() const
+ {
+ KLineEdit* le = new KLineEdit( table() );
+ le->setEchoMode( QLineEdit::Password );
+ return le;
+ }
+
+ virtual void setContentFromEditor( QWidget* w )
+ {
+ if ( w->inherits( "KLineEdit" ) ) {
+ password = ( (KLineEdit*)w )->text();
+ setText( QString().fill( '*', password.length() ) );
+ } else {
+ QTableItem::setContentFromEditor( w );
+ }
+ }
+
+ virtual void setText(const QString& bogus)
+ {
+ QTableItem::setText(QString().fill('*', bogus.length()));
+ }
+ QString password;
+};
+
+static bool isEmptyRow( QTable* tbl, int row )
+{
+ for ( int i = 0; i < tbl->numCols(); i++ ) {
+ if ( !tbl->text( row, i ).isEmpty() )
+ return false;
+ }
+ return true;
+}
+
+void SqlConfigWidget::init()
+{
+ int w = dbTable->fontMetrics().width( "W" );
+ dbTable->verticalHeader()->hide();
+ dbTable->setLeftMargin( 0 );
+ dbTable->setColumnWidth( 3, w * 5 );
+ updateButtons();
+ valueChanged( 0, 0 );
+ changed = false;
+}
+
+static void addRow( QTable* dbTable )
+{
+ dbTable->insertRows( dbTable->numRows() );
+ dbTable->setItem( dbTable->numRows() - 1, 0,
+ new PluginTableItem( dbTable ) );
+ dbTable->setItem( dbTable->numRows() - 1, 3,
+ new PortTableItem( dbTable ) );
+ dbTable->setItem( dbTable->numRows() - 1, 5,
+ new PasswordTableItem( dbTable ) );
+}
+
+void SqlConfigWidget::valueChanged( int, int )
+{
+ int lrow = dbTable->numRows() - 1;
+ if ( lrow < 0 || !isEmptyRow( dbTable, lrow ) ) {
+ addRow( dbTable );
+ }
+ changed = true;
+}
+
+
+void SqlConfigWidget::removeDb()
+{
+ if ( dbTable->currentRow() >= 0 )
+ dbTable->removeRow( dbTable->currentRow() );
+ valueChanged( 0, 0 );
+ updateButtons();
+}
+
+
+void SqlConfigWidget::updateButtons()
+{
+ if ( dbTable->currentRow() < 0 ) {
+ testBtn->setEnabled( false );
+ removeBtn->setEnabled( false );
+ return;
+ }
+ testBtn->setEnabled( !isEmptyRow( dbTable, dbTable->currentRow() ) );
+ removeBtn->setEnabled( dbTable->currentRow() + 1 < dbTable->numRows() );
+}
+
+
+void SqlConfigWidget::testDb()
+{
+ static const QString cName( "SqlConfigWidgetTest" );
+ int cr = dbTable->currentRow();
+ if (cr < 0)
+ return;
+
+ QSqlDatabase* db = QSqlDatabase::addDatabase( dbTable->text( cr, 0 ), cName );
+ db->setDatabaseName( dbTable->text( cr, 1 ) );
+ db->setHostName( dbTable->text( cr, 2 ) );
+ bool ok;
+ int port = dbTable->text( cr, 3 ).toInt( &ok );
+ if (ok && port >= 0)
+ db->setPort( port );
+ QString pass = ((PasswordTableItem*)dbTable->item( cr, 5 ))->password;
+
+ if ( db->open( dbTable->text( cr, 4 ), pass ) ) {
+ KMessageBox::information( this, i18n("Connection successful") );
+ db->close();
+ } else {
+ KMessageBox::detailedSorry( this, i18n("Unable to connect to database server"),
+ db->lastError().driverText() + "\n" +
+ db->lastError().databaseText() );
+ }
+
+ db = 0;
+ QSqlDatabase::removeDatabase( cName );
+}
+
+
+void SqlConfigWidget::accept()
+{
+ Q_ASSERT( doc );
+
+ QDomElement dbElem = DomUtil::createElementByPath( *doc, "/kdevsqlsupport/servers" );
+ DomUtil::makeEmpty( dbElem );
+
+ for ( int i = 0; i < dbTable->numRows() - 1; i++ ) {
+ QStringList db;
+ db << dbTable->text( i, 0 ) << dbTable->text( i, 1 )
+ << dbTable->text( i, 2 ) << dbTable->text( i, 3 )
+ << dbTable->text( i, 4 )
+ << SQLSupportPart::cryptStr( ((PasswordTableItem*)dbTable->item( i, 5 ))->password );
+
+ DomUtil::writeListEntry( *doc,
+ "/kdevsqlsupport/servers/server" + QString::number( i ),
+ "el", db );
+ }
+ if ( changed )
+ emit newConfigSaved();
+}
+
+
+void SqlConfigWidget::setProjectDom( QDomDocument * doc )
+{
+ this->doc = doc;
+}
+
+
+void SqlConfigWidget::loadConfig()
+{
+ Q_ASSERT( doc );
+
+ QStringList db;
+ int i = 0;
+ while ( true ) {
+ QStringList db = DomUtil::readListEntry( *doc, "kdevsqlsupport/servers/server" + QString::number( i ), "el" );
+ if ( db.isEmpty() )
+ return;
+
+ addRow( dbTable );
+ int row = dbTable->numRows() - 2;
+ for ( int ii = 0; ii < 6; ii++ )
+ dbTable->setText( row, ii, db[ii] );
+ ((PasswordTableItem*)dbTable->item( row, 5 ))->password = SQLSupportPart::cryptStr( db[5] );
+
+ i++;
+ }
+ updateButtons();
+ changed = false;
+}
diff --git a/languages/sql/sqloutputwidget.cpp b/languages/sql/sqloutputwidget.cpp
new file mode 100644
index 00000000..a0d7368d
--- /dev/null
+++ b/languages/sql/sqloutputwidget.cpp
@@ -0,0 +1,127 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Harald Fernengel *
+ * harry@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include <qsqldatabase.h>
+#include <qsqlerror.h>
+#include <qsqlcursor.h>
+#include <qsqldriver.h>
+#include <qsqlrecord.h>
+#include <qwidgetstack.h>
+#include <qdatatable.h>
+#include <qtextedit.h>
+#include <qlayout.h>
+#include <qstylesheet.h>
+
+#include <klocale.h>
+
+#include "sqloutputwidget.h"
+
+class QCustomSqlCursor: public QSqlCursor
+{
+public:
+ QCustomSqlCursor( const QString & query = QString::null, bool autopopulate = TRUE, QSqlDatabase* db = 0 ) :
+ QSqlCursor( QString::null, autopopulate, db )
+ {
+ exec( query );
+ if ( isSelect() && autopopulate ) {
+ QSqlRecordInfo inf = ((QSqlQuery*)this)->driver()->recordInfo( *(QSqlQuery*)this );
+ for ( QSqlRecordInfo::iterator it = inf.begin(); it != inf.end(); ++it ) {
+ append( *it );
+ }
+ }
+ setMode( QSqlCursor::ReadOnly );
+ }
+ QCustomSqlCursor( const QCustomSqlCursor & other ): QSqlCursor( other ) {}
+ bool select( const QString & /*filter*/, const QSqlIndex & /*sort*/ = QSqlIndex() )
+ { return exec( lastQuery() ); }
+ QSqlIndex primaryIndex( bool /*prime*/ = TRUE ) const
+ { return QSqlIndex(); }
+ int insert( bool /*invalidate*/ = TRUE )
+ { return FALSE; }
+ int update( bool /*invalidate*/ = TRUE )
+ { return FALSE; }
+ int del( bool /*invalidate*/ = TRUE )
+ { return FALSE; }
+ void setName( const QString& /*name*/, bool /*autopopulate*/ = TRUE ) {}
+};
+
+
+SqlOutputWidget::SqlOutputWidget ( QWidget* parent, const char* name ) :
+ QWidget( parent, name )
+{
+ m_stack = new QWidgetStack( this );
+ m_table = new QDataTable( this );
+ m_textEdit = new QTextEdit( this );
+
+ m_textEdit->setTextFormat( QTextEdit::RichText );
+ m_textEdit->setReadOnly( true );
+
+ m_stack->addWidget( m_textEdit );
+ m_stack->addWidget( m_table );
+
+ QVBoxLayout* layout = new QVBoxLayout( this );
+ layout->addWidget( m_stack );
+}
+
+SqlOutputWidget::~SqlOutputWidget()
+{}
+
+void SqlOutputWidget::showQuery( const QString& connectionName, const QString& query )
+{
+ QSqlDatabase* db = QSqlDatabase::database( connectionName, true );
+ if ( !db ) {
+ showError( i18n("No such connection: %1").arg( connectionName ) );
+ return;
+ }
+ if ( !db->isOpen() ) {
+ showError( db->lastError() );
+ return;
+ }
+
+ QSqlCursor* cur = new QCustomSqlCursor( query, true, db );
+ if ( !cur->isActive() ) {
+ showError( cur->lastError() );
+ } else if ( cur->isSelect() ) {
+ m_table->setSqlCursor( cur, true, true );
+ m_table->refresh( QDataTable::RefreshAll );
+ m_stack->raiseWidget( m_table );
+ } else {
+ showSuccess( cur->numRowsAffected() );
+ }
+}
+
+void SqlOutputWidget::showSuccess( int rowsAffected )
+{
+ m_textEdit->clear();
+ m_textEdit->setText( i18n("Query successful, number of rows affected: %1").arg( rowsAffected ) );
+ m_stack->raiseWidget( m_textEdit );
+}
+
+void SqlOutputWidget::showError( const QString& message )
+{
+ m_textEdit->clear();
+ m_textEdit->setText( "<p><b>" + i18n("An error occurred:") + "</b></p>\n" + message );
+ m_stack->raiseWidget( m_textEdit );
+}
+
+void SqlOutputWidget::showError( const QSqlError& message )
+{
+ m_textEdit->clear();
+ m_textEdit->setText( "<p><b>" + i18n("An error occurred:") +
+ "</b></p>\n<p><i>" + i18n("Driver") + "</i>: " +
+ QStyleSheet::escape( message.driverText() ) +
+ "<br><i>" + i18n("Database") + ":</i>: " +
+ QStyleSheet::escape( message.databaseText() ) );
+ m_stack->raiseWidget( m_textEdit );
+}
+
+#include "sqloutputwidget.moc"
+
diff --git a/languages/sql/sqloutputwidget.h b/languages/sql/sqloutputwidget.h
new file mode 100644
index 00000000..40c8612a
--- /dev/null
+++ b/languages/sql/sqloutputwidget.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Harald Fernengel *
+ * harry@kdevelop.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _SQLOUTPUTWIDGET_H_
+#define _SQLOUTPUTWIDGET_H_
+
+#include <qwidget.h>
+
+class QWidgetStack;
+class QDataTable;
+class QTextEdit;
+class QSqlError;
+
+class SqlOutputWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ SqlOutputWidget( QWidget* parent = 0, const char* name = 0 );
+ virtual ~SqlOutputWidget();
+
+public:
+ void showQuery( const QString& connectionName, const QString& query );
+ void showError( const QSqlError& error );
+
+private:
+ void showError( const QString& msg );
+ void showSuccess( int rowsAffected );
+
+ QWidgetStack* m_stack;
+ QDataTable* m_table;
+ QTextEdit* m_textEdit;
+};
+
+#endif
diff --git a/languages/sql/sqlsupport_part.cpp b/languages/sql/sqlsupport_part.cpp
new file mode 100644
index 00000000..c1e13ac0
--- /dev/null
+++ b/languages/sql/sqlsupport_part.cpp
@@ -0,0 +1,284 @@
+#include "sqlsupport_part.h"
+#include <qwhatsthis.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+#include <qsqldatabase.h>
+#include <qsqlrecord.h>
+
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kdevgenericfactory.h>
+#include <kdebug.h>
+#include <kaction.h>
+#include <kparts/part.h>
+#include <kdialogbase.h>
+#include <ktexteditor/editinterface.h>
+#include <kmessagebox.h>
+
+#include "kdevcore.h"
+#include "kdevmainwindow.h"
+#include "kdevlanguagesupport.h"
+#include "kdevpartcontroller.h"
+#include "kdevproject.h"
+#include "codemodel.h"
+#include "kdevplugininfo.h"
+
+#include "sqlconfigwidget.h"
+#include "sqlactions.h"
+#include "sqloutputwidget.h"
+#include "domutil.h"
+
+typedef KDevGenericFactory<SQLSupportPart> SQLSupportFactory;
+static const KDevPluginInfo data("kdevsqlsupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevsqlsupport, SQLSupportFactory( data ) )
+
+SQLSupportPart::SQLSupportPart( QObject *parent, const char *name, const QStringList& )
+ : KDevLanguageSupport ( &data, parent, name ? name : "SQLSupportPart" )
+{
+ setInstance( SQLSupportFactory::instance() );
+ setXMLFile( "kdevsqlsupport.rc" );
+
+ KAction *action;
+ action = new KAction( i18n( "&Run" ), "exec", Key_F9, this, SLOT( slotRun() ), actionCollection(), "build_execute" );
+ action->setToolTip(i18n("Run"));
+ action->setWhatsThis(i18n("<b>Run</b><p>Executes a SQL script."));
+
+ dbAction = new SqlListAction( this, i18n( "&Database Connections" ), 0, this, SLOT(activeConnectionChanged()), actionCollection(), "connection_combo" );
+
+ kdDebug( 9000 ) << "Creating SQLSupportPart" << endl;
+
+ connect( core(), SIGNAL( projectConfigWidget( KDialogBase* ) ),
+ this, SLOT( projectConfigWidget( KDialogBase* ) ) );
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( core(), SIGNAL(languageChanged()), this, SLOT(projectOpened()) );
+ connect( partController(), SIGNAL( savedFile( const KURL& ) ), this, SLOT( savedFile( const KURL& ) ) );
+
+ m_widget = new SqlOutputWidget();
+ mainWindow()->embedOutputView( m_widget, i18n( "SQL" ), i18n( "Output of SQL commands" ) );
+ QWhatsThis::add(m_widget, i18n("<b>Output of SQL commands</b><p>This window shows the output of SQL commands being executed. It can display results of SQL \"select\" commands in a table."));
+}
+
+
+SQLSupportPart::~SQLSupportPart()
+{
+ mainWindow()->removeView(m_widget);
+ delete m_widget;
+}
+
+QString SQLSupportPart::cryptStr(const QString& aStr)
+{
+ QString result;
+ for (unsigned int i = 0; i < aStr.length(); i++)
+ result += (aStr[i].unicode() < 0x20) ? aStr[i] :
+ QChar(0x1001F - aStr[i].unicode());
+ return result;
+}
+
+void SQLSupportPart::activeConnectionChanged()
+{
+ updateCatalog();
+}
+
+void SQLSupportPart::clearConfig()
+{
+ for ( QStringList::Iterator it = conNames.begin(); it != conNames.end(); ++it ) {
+ if ( QSqlDatabase::contains( *it ) ) {
+ QSqlDatabase::database( *it, false )->close();
+ QSqlDatabase::removeDatabase( *it );
+ } else {
+ kdDebug( 9000 ) << "Could not find connection named " << (*it) << endl;
+ }
+ }
+ conNames.clear();
+
+ dbAction->refresh();
+}
+
+void SQLSupportPart::loadConfig()
+{
+ clearConfig();
+
+ QDomDocument* doc = projectDom();
+
+ QStringList db;
+ int i = 0;
+ QString conName;
+ while ( true ) {
+ QStringList sdb = DomUtil::readListEntry( *doc, "kdevsqlsupport/servers/server" + QString::number( i ), "el" );
+ if ( (int)sdb.size() < 6 )
+ break;
+
+ conName = "KDEVSQLSUPPORT_";
+ conName += QString::number( i );
+ conNames << conName;
+ QSqlDatabase* db = QSqlDatabase::addDatabase( sdb[0], QString( "KDEVSQLSUPPORT_%1" ).arg( i ) );
+ db->setDatabaseName( sdb[1] );
+ db->setHostName( sdb[2] );
+ bool ok;
+ int port = sdb[3].toInt( &ok );
+ if ( ok )
+ db->setPort( port );
+ db->setUserName( sdb[4] );
+ db->setPassword( cryptStr( sdb[5] ) );
+ db->open();
+
+ i++;
+ }
+
+ dbAction->refresh();
+}
+
+void SQLSupportPart::projectConfigWidget( KDialogBase *dlg )
+{
+ QVBox *vbox = dlg->addVBoxPage( QString( "SQL" ), i18n( "Specify Your Database Connections" ), BarIcon("source", KIcon::SizeMedium) );
+ SqlConfigWidget *w = new SqlConfigWidget( (QWidget*)vbox, "SQL config widget" );
+ w->setProjectDom( projectDom() );
+ w->loadConfig();
+ connect( dlg, SIGNAL(okClicked()), w, SLOT(accept()) );
+ connect( w, SIGNAL(newConfigSaved()), this, SLOT(loadConfig()) );
+}
+
+void SQLSupportPart::projectOpened()
+{
+ connect( project(), SIGNAL( addedFilesToProject( const QStringList & ) ),
+ this, SLOT( addedFilesToProject( const QStringList & ) ) );
+ connect( project(), SIGNAL( removedFilesFromProject( const QStringList & ) ),
+ this, SLOT( removedFilesFromProject( const QStringList & ) ) );
+
+ loadConfig();
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot( 0, this, SLOT( parse() ) );
+}
+
+
+void SQLSupportPart::projectClosed()
+{
+ clearConfig();
+}
+
+void SQLSupportPart::slotRun ()
+{
+ QString cName = dbAction->currentConnectionName();
+ if ( cName.isEmpty() ) {
+ KMessageBox::sorry( 0, i18n("Please select a valid database connection.") );
+ return;
+ }
+
+ KTextEditor::EditInterface* doc = dynamic_cast<KTextEditor::EditInterface*>(partController()->activePart());
+ if ( !doc )
+ return; // show error message?
+
+ mainWindow()->raiseView( m_widget );
+ m_widget->showQuery( cName, doc->text() );
+}
+
+#if 0
+static QString dbCaption(const QSqlDatabase* db)
+{
+ QString res;
+ if (!db)
+ return res;
+ res = db->driverName();
+ res += QString::fromLatin1("@");
+ res += db->hostName();
+ if (db->port() >= 0)
+ res += QString::fromLatin1(":") + QString::number(db->port());
+ return res;
+}
+#endif
+
+void SQLSupportPart::parse()
+{
+ // @todo
+}
+
+void SQLSupportPart::updateCatalog()
+{
+ if (!project() || !dbAction)
+ return;
+
+ codeModel()->wipeout();
+
+ QString curConnection = dbAction->currentConnectionName();
+ if (curConnection.isEmpty()) {
+ emit updatedSourceInfo();
+ return;
+ }
+
+ FileDom dbf = codeModel()->create<FileModel>();
+ dbf->setName(dbAction->currentConnectionName());
+ QSqlDatabase *db = QSqlDatabase::database(dbAction->currentConnectionName(), true);
+
+ // tables are classes and fields are methods
+ if (db->isOpen()) {
+ QSqlRecord inf;
+ QStringList tables = db->tables();
+ for (QStringList::Iterator it = tables.begin(); it != tables.end(); ++it) {
+ ClassDom dbc = codeModel()->create<ClassModel>();
+ dbc->setName(*it);
+ inf = db->record(*it);
+ for (int i = 0; i < (int)inf.count(); ++i) {
+ FunctionDom dbv = codeModel()->create<FunctionModel>();
+ dbv->setName(inf.fieldName(i));
+ dbv->setResultType(QVariant::typeToName(inf.field(i)->type()));
+ dbc->addFunction(dbv);
+ }
+ dbf->addClass(dbc);
+ }
+ }
+
+ codeModel()->addFile(dbf);
+
+ emit updatedSourceInfo();
+}
+
+void SQLSupportPart::addedFilesToProject( const QStringList &fileList )
+{
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it ) {
+// parse( project() ->projectDirectory() + "/" + ( *it ) );
+ }
+
+ emit updatedSourceInfo();
+}
+
+
+void SQLSupportPart::removedFilesFromProject( const QStringList &fileList )
+{
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it ) {
+// classStore() ->removeWithReferences( project() ->projectDirectory() + "/" + ( *it ) );
+ }
+
+ emit updatedSourceInfo();
+}
+
+void SQLSupportPart::savedFile( const KURL &fileName )
+{
+ if ( project() ->allFiles().contains( fileName.path().mid ( project() ->projectDirectory().length() + 1 ) ) ) {
+// parse( fileName );
+// emit updatedSourceInfo();
+ }
+}
+
+KDevLanguageSupport::Features SQLSupportPart::features()
+{
+ return Features( Classes | Functions );
+}
+
+KMimeType::List SQLSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "text/plain" );
+ if( mime )
+ list << mime;
+ return list;
+}
+
+#include "sqlsupport_part.moc"
diff --git a/languages/sql/sqlsupport_part.h b/languages/sql/sqlsupport_part.h
new file mode 100644
index 00000000..e9ad6dbd
--- /dev/null
+++ b/languages/sql/sqlsupport_part.h
@@ -0,0 +1,55 @@
+#ifndef __KDEVPART_SQLSUPPORT_H__
+#define __KDEVPART_SQLSUPPORT_H__
+
+#include <qguardedptr.h>
+#include <qstringlist.h>
+
+#include <kprocess.h>
+#include <kdialogbase.h>
+
+#include "kdevplugin.h"
+#include "kdevlanguagesupport.h"
+
+class SqlListAction;
+class SqlOutputWidget;
+class CodeModel;
+
+class SQLSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+
+ SQLSupportPart(QObject *parent, const char *name, const QStringList &);
+ virtual ~SQLSupportPart();
+
+ static QString cryptStr(const QString& aStr);
+ const QStringList& connections() const { return conNames; }
+
+
+protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+private slots:
+ void slotRun();
+ void projectConfigWidget(KDialogBase *dlg);
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void parse();
+ void loadConfig();
+ void activeConnectionChanged();
+
+private:
+ void clearConfig();
+ void updateCatalog();
+ SqlListAction* dbAction;
+ SqlOutputWidget* m_widget;
+ QStringList conNames;
+ CodeModel *m_store;
+};
+
+#endif